main.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <thread>
  4. #include "modulecomm.h"
  5. #include "ivversion.h"
  6. #include "ivbacktrace.h"
  7. #include "ivfault.h"
  8. #include "ivlog.h"
  9. #include "ivexit.h"
  10. #include "canmsg.pb.h"
  11. #ifndef NUM_OF_SENSOR_MAX
  12. #define NUM_OF_SENSOR_MAX 12
  13. #endif
  14. #include "decode_cfg.h"
  15. #include "iv_msgunit.h"
  16. #include "can_producer_consumer.h"
  17. #include "canrecv_consumer.h"
  18. #include "cansend_consumer.h"
  19. #include "cansend_producer.h"
  20. QCoreApplication * gApp;
  21. iv::Ivfault *gfault = nullptr;
  22. iv::Ivlog *givlog = nullptr;
  23. setupConfig_t setupConfig;
  24. iv::msgunit shmCANRecv;
  25. iv::msgunit shmCANSend;
  26. iv::msgunit shmSonar;
  27. CAN_Producer_Consumer CANRecv(4096);
  28. CAN_Producer_Consumer CANSend(4096);
  29. CANSend_Producer* can_send_producer;
  30. CANSend_Consumer* can_send_consumer;
  31. CANRecv_Consumer* can_recv_consumer;
  32. uint64_t gTime_ms = QDateTime::currentMSecsSinceEpoch();
  33. void ListenCANMsg(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  34. {
  35. if(nSize<1)
  36. {
  37. std::cout<<"radar ListenCANMsg data empty."<<std::endl;
  38. return;
  39. }
  40. iv::can::canmsg xmsg;
  41. if(!xmsg.ParseFromArray(strdata,nSize))
  42. {
  43. givlog->error("radar Listencanmsg fail");
  44. gfault->SetFaultState(1, 0, "radar Listencanmsg error");
  45. std::cout<<"radar ListenCANMsg parse fail."<<std::endl;
  46. return;
  47. }
  48. CANRecv.Produce_Elements_From_CANMsg(xmsg);
  49. }
  50. void ExitFunc()
  51. {
  52. gApp->quit();
  53. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  54. }
  55. void signal_handler(int sig)
  56. {
  57. if(sig == SIGINT)
  58. {
  59. ExitFunc();
  60. }
  61. }
  62. int main(int argc, char *argv[])
  63. {
  64. RegisterIVBackTrace();
  65. showversion("driver_ultrasonic_dauxi_KS136A");
  66. QCoreApplication a(argc, argv);
  67. gApp = &a;
  68. givlog = new iv::Ivlog("driver_ultrasonic_dauxi_KS136A");
  69. gfault = new iv::Ivfault("driver_ultrasonic_dauxi_KS136A");
  70. signal(SIGINT,signal_handler);
  71. QString strpath = QCoreApplication::applicationDirPath();
  72. if(argc < 2)
  73. strpath = strpath + "/driver_ultrasonic_dauxi_KS136A.xml";
  74. else
  75. strpath = argv[1];
  76. DecodeSonarCfgFromXML(setupConfig,strpath.toStdString());
  77. strncpy(shmCANSend.mstrmsgname,setupConfig.strMemCANSend.data(),255);
  78. shmCANSend.mnBufferSize = 100000;
  79. shmCANSend.mnBufferCount = 3;
  80. shmCANSend.mpa = iv::modulecomm::RegisterSend(shmCANSend.mstrmsgname,shmCANSend.mnBufferSize,shmCANSend.mnBufferCount);
  81. strncpy(shmSonar.mstrmsgname,setupConfig.strMemSonar.data(),255);
  82. shmSonar.mnBufferSize = 100000;
  83. shmSonar.mnBufferCount = 1;
  84. shmSonar.mpa = iv::modulecomm::RegisterSend(shmSonar.mstrmsgname,shmSonar.mnBufferSize,shmSonar.mnBufferCount);
  85. strncpy(shmCANRecv.mstrmsgname,setupConfig.strMemCANRecv.data(),255);
  86. shmCANRecv.mnBufferSize = 100000;
  87. shmCANRecv.mnBufferCount = 3;
  88. shmCANRecv.mpa = iv::modulecomm::RegisterRecv(shmCANRecv.mstrmsgname,ListenCANMsg);
  89. std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  90. can_send_consumer = new CANSend_Consumer(&CANSend);
  91. can_send_consumer->start();
  92. can_send_producer = new CANSend_Producer(&CANSend);
  93. can_recv_consumer = new CANRecv_Consumer(&CANRecv);
  94. qRegisterMetaType<uint8_t>("uint8_t");
  95. QObject::connect(can_send_producer,&CANSend_Producer::Enable_DecodeResult,can_recv_consumer,&CANRecv_Consumer::Enable_DecodeResult_Slot);
  96. QObject::connect(can_recv_consumer,&CANRecv_Consumer::Enable_Ask,can_send_producer,&CANSend_Producer::Enable_Ask_Slot);
  97. can_send_producer->start();
  98. can_recv_consumer->start();
  99. int rtn = a.exec();
  100. can_send_producer->terminate(); //function "terminate" can not be used in other position. it is dangerous.
  101. can_send_consumer->terminate(); //function "terminate" can not be used in other position. it is dangerous.
  102. can_recv_consumer->terminate(); //function "terminate" can not be used in other position. it is dangerous.
  103. if(gfault != nullptr)delete gfault;
  104. if(givlog != nullptr)delete givlog;
  105. if(shmCANRecv.mpa != nullptr)iv::modulecomm::Unregister(shmCANRecv.mpa);
  106. if(shmCANSend.mpa != nullptr)iv::modulecomm::Unregister(shmCANSend.mpa);
  107. if(shmSonar.mpa != nullptr)iv::modulecomm::Unregister(shmSonar.mpa);
  108. return rtn;
  109. }