main.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. void ListenCANMsg(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  33. {
  34. if(nSize<1)
  35. {
  36. std::cout<<"radar ListenCANMsg data empty."<<std::endl;
  37. return;
  38. }
  39. iv::can::canmsg xmsg;
  40. if(!xmsg.ParseFromArray(strdata,nSize))
  41. {
  42. givlog->error("radar Listencanmsg fail");
  43. gfault->SetFaultState(1, 0, "radar Listencanmsg error");
  44. std::cout<<"radar ListenCANMsg parse fail."<<std::endl;
  45. return;
  46. }
  47. CANRecv.Produce_Elements_From_CANMsg(xmsg);
  48. }
  49. void ExitFunc()
  50. {
  51. gApp->quit();
  52. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  53. }
  54. void signal_handler(int sig)
  55. {
  56. if(sig == SIGINT)
  57. {
  58. ExitFunc();
  59. }
  60. }
  61. int main(int argc, char *argv[])
  62. {
  63. RegisterIVBackTrace();
  64. showversion("driver_ultrasonic_dauxi_KS136A");
  65. QCoreApplication a(argc, argv);
  66. gApp = &a;
  67. givlog = new iv::Ivlog("driver_ultrasonic_dauxi_KS136A");
  68. gfault = new iv::Ivfault("driver_ultrasonic_dauxi_KS136A");
  69. signal(SIGINT,signal_handler);
  70. QString strpath = QCoreApplication::applicationDirPath();
  71. if(argc < 2)
  72. strpath = strpath + "/driver_ultrasonic_dauxi_KS136A.xml";
  73. else
  74. strpath = argv[1];
  75. DecodeSonarCfgFromXML(setupConfig,strpath.toStdString());
  76. strncpy(shmCANSend.mstrmsgname,setupConfig.strMemCANSend.data(),255);
  77. shmCANSend.mnBufferSize = 100000;
  78. shmCANSend.mnBufferCount = 3;
  79. shmCANSend.mpa = iv::modulecomm::RegisterSend(shmCANSend.mstrmsgname,shmCANSend.mnBufferSize,shmCANSend.mnBufferCount);
  80. strncpy(shmSonar.mstrmsgname,setupConfig.strMemSonar.data(),255);
  81. shmSonar.mnBufferSize = 100000;
  82. shmSonar.mnBufferCount = 1;
  83. shmSonar.mpa = iv::modulecomm::RegisterSend(shmSonar.mstrmsgname,shmSonar.mnBufferSize,shmSonar.mnBufferCount);
  84. strncpy(shmCANRecv.mstrmsgname,setupConfig.strMemCANRecv.data(),255);
  85. shmCANRecv.mnBufferSize = 100000;
  86. shmCANRecv.mnBufferCount = 3;
  87. shmCANRecv.mpa = iv::modulecomm::RegisterRecv(shmCANRecv.mstrmsgname,ListenCANMsg);
  88. std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  89. can_send_consumer = new CANSend_Consumer(&CANSend);
  90. can_send_consumer->start();
  91. can_send_producer = new CANSend_Producer(&CANSend);
  92. can_recv_consumer = new CANRecv_Consumer(&CANRecv);
  93. qRegisterMetaType<uint8_t>("uint8_t");
  94. QObject::connect(can_send_producer,&CANSend_Producer::Enable_DecodeResult,can_recv_consumer,&CANRecv_Consumer::Enable_DecodeResult_Slot);
  95. QObject::connect(can_recv_consumer,&CANRecv_Consumer::Enable_Ask,can_send_producer,&CANSend_Producer::Enable_Ask_Slot);
  96. can_send_producer->start();
  97. can_recv_consumer->start();
  98. int rtn = a.exec();
  99. can_send_producer->terminate(); //function "terminate" can not be used in other position. it is dangerous.
  100. can_send_consumer->terminate(); //function "terminate" can not be used in other position. it is dangerous.
  101. can_recv_consumer->terminate(); //function "terminate" can not be used in other position. it is dangerous.
  102. if(gfault != nullptr)delete gfault;
  103. if(givlog != nullptr)delete givlog;
  104. if(shmCANRecv.mpa != nullptr)iv::modulecomm::Unregister(shmCANRecv.mpa);
  105. if(shmCANSend.mpa != nullptr)iv::modulecomm::Unregister(shmCANSend.mpa);
  106. if(shmSonar.mpa != nullptr)iv::modulecomm::Unregister(shmSonar.mpa);
  107. return rtn;
  108. }