You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
7.9 KiB

3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "main_control_service.hpp"
  2. #include "configs/project_setting.hpp"
  3. #include "iflytopcpp/core/components/stringutils.hpp"
  4. #include "version.hpp"
  5. using namespace iflytop;
  6. using namespace core;
  7. using namespace std;
  8. class Trace {
  9. logger_t m_logger;
  10. string m_name;
  11. public:
  12. Trace(logger_t log, const string& name) : m_logger(log), m_name(name) { m_logger->info("TRACE::ENTER {}", m_name); }
  13. ~Trace() { m_logger->info("TRACE::EXIT {}", m_name); }
  14. };
  15. /***********************************************************************************************************************
  16. * ============================================================================================================= *
  17. ***********************************************************************************************************************/
  18. /*********************************************************************************************************************
  19. * ============================================================================================================= *
  20. *********************************************************************************************************************/
  21. bool MainControlService::createIflytopHardwareWSPacket(shared_ptr<icps::Packet> packetin, json& jout) {
  22. if (!packetin) return false;
  23. #if 0
  24. {
  25. "channel":"can0",
  26. "protocol":"iflytopCanProtocolStackV1",
  27. "message": {
  28. "attribute": "normal/gbroadcast/subbroadcast",
  29. "priority": 4, //0->7,0最高
  30. "type": "w/r/receipt/report/set_auto_report/heart_packet",
  31. "targetId": 128, // 128->255
  32. "sourceId": 1, // 默认为1
  33. "seq": 0, //0-65535,
  34. "regAdd": 0, //0-65535
  35. "regValue": 100 // -2^31->2^31-1
  36. }
  37. }
  38. #endif
  39. if (packetin->getSourceId() == LINUX_HARDWARE_ID) {
  40. jout["channel"] = "local";
  41. } else {
  42. jout["channel"] = "can0";
  43. }
  44. jout["protocol"] = "iflytopCanProtocolStackV1";
  45. jout["message"]["attribute"] = packetin->getAttributeStr();
  46. jout["message"]["priority"] = packetin->getPriority();
  47. jout["message"]["type"] = packetin->getTypeStr();
  48. jout["message"]["targetId"] = packetin->getTargetId();
  49. jout["message"]["sourceId"] = packetin->getSourceId();
  50. jout["message"]["seq"] = packetin->getSeq();
  51. jout["message"]["regAdd"] = packetin->getRegAdd();
  52. jout["message"]["regValue"] = packetin->getRegValue();
  53. return true;
  54. }
  55. bool MainControlService::createICPSPacket(json jin, shared_ptr<icps::Packet>& packetout) { //
  56. shared_ptr<icps::Packet> _packetout(new icps::Packet());
  57. if (jin["protocol"] != "iflytopCanProtocolStackV1") {
  58. logger->error("create ICPSPacket failed, protocol not match,protocol:{}", jin["protocol"].get<string>());
  59. return false;
  60. }
  61. _packetout->setAttributeByStr(jin["message"]["attribute"]);
  62. _packetout->setPriority(jin["message"]["priority"]);
  63. _packetout->setTypeByStr(jin["message"]["type"]);
  64. _packetout->setTargetId(jin["message"]["targetId"]);
  65. _packetout->setSourceId(jin["message"]["sourceId"]);
  66. _packetout->setSeq(jin["message"]["seq"]);
  67. _packetout->setRegAdd(jin["message"]["regAdd"]);
  68. _packetout->setRegValue(jin["message"]["regValue"]);
  69. packetout = _packetout;
  70. return true;
  71. }
  72. void MainControlService::initialize() {
  73. GET_TO_SERVICE(m_zconfig);
  74. GET_TO_SERVICE(m_iflytopWSService);
  75. GET_TO_SERVICE(m_canService);
  76. localVirtualCanSlaveInitialize();
  77. websocketServerInitialize();
  78. /*******************************************************************************
  79. * CAN设备衔接 *
  80. *******************************************************************************/
  81. m_canService->onIflytopCanSubDevicePacket.connect([this](shared_ptr<icps::Packet> packet) { //
  82. processCanMessageFromCanService(packet);
  83. });
  84. };
  85. void MainControlService::websocketServerInitialize() {
  86. /**
  87. * @brief
  88. *
  89. */
  90. m_iflytopWSService->onMessage.connect([this](weak_ptr<WebSocket> webSocket, const ix::WebSocketMessagePtr& msg) {
  91. if (msg->binary) {
  92. logger->warn("receive binary message,ignore");
  93. return;
  94. }
  95. string msgtext = msg->str;
  96. try {
  97. json message = json::parse(msgtext);
  98. processIflytopWSMsg(message);
  99. } catch (const std::exception& e) {
  100. logger->error("m_iflytopWSService:onMessag,parse json failed,exception:{},{}", e.what(), msgtext);
  101. }
  102. });
  103. }
  104. void MainControlService::localVirtualCanSlaveInitialize() {
  105. m_localVirtualCanSlave.reset(new IflytopVirtualCanSlave());
  106. m_localVirtualCanSlave->initialize(LINUX_HARDWARE_ID);
  107. m_localVirtualCanSlave->activeReg(REG_REBOOT_FLAG, icps::kw | icps::kr, 0);
  108. m_localVirtualCanSlave->activeReg(REG_EXCEPTION_FLAG, icps::kw | icps::kr, 0);
  109. m_localVirtualCanSlave->setOnHostRegisterReadEvent( //
  110. [this](icps::Reg_t& reg, int32_t& value) { //
  111. return icps::kSuccess;
  112. });
  113. m_localVirtualCanSlave->setOnHostRegisterWriteEvent( //
  114. [this](icps::Reg_t& reg, int32_t oldvalue, int32_t& newvalue) { //
  115. return icps::kSuccess;
  116. });
  117. m_localVirtualCanSlave->setOnRegisterValueAutoReportEvent( //
  118. [this](icps::Reg_t& reg, int32_t& value) { //
  119. return;
  120. });
  121. m_localVirtualCanSlave->IflytopVirtualCanIF_setUpstream( //
  122. [this](shared_ptr<icps::Packet> packet) { //
  123. /**
  124. * @brief
  125. * can上报消息给Websocket
  126. */
  127. processCanMessageFromLocalCanService(packet);
  128. return;
  129. });
  130. }
  131. /*******************************************************************************
  132. * *
  133. *******************************************************************************/
  134. /**
  135. * @brief CanService接收到的上行消息
  136. *
  137. * @param packet
  138. */
  139. void MainControlService::processCanMessageFromCanService(shared_ptr<icps::Packet> packet) {
  140. /**
  141. * @brief can收到的消息
  142. */
  143. json uppacket;
  144. bool suc = createIflytopHardwareWSPacket(packet, uppacket);
  145. if (!suc) {
  146. logger->error("{}|createIflytopHardwareWSPacket failed,packet:{}", __LINE__, packet->toString());
  147. return;
  148. }
  149. m_iflytopWSService->sendMessage(uppacket.dump());
  150. }
  151. /**
  152. * @brief can的上行消息
  153. *
  154. * @param packet
  155. */
  156. void MainControlService::processCanMessageFromLocalCanService(shared_ptr<icps::Packet> packet) {
  157. json uppacket;
  158. bool suc = createIflytopHardwareWSPacket(packet, uppacket);
  159. if (!suc) {
  160. logger->error("{}|createIflytopHardwareWSPacket failed,packet:{}", __LINE__, packet->toString());
  161. return;
  162. }
  163. m_iflytopWSService->sendMessage(uppacket.dump());
  164. }
  165. /*******************************************************************************
  166. * *
  167. *******************************************************************************/
  168. void MainControlService::processIflytopWSMsg(const json& in) {
  169. /**
  170. * @brief
  171. * CANLocal
  172. *
  173. * 1. json转换成packet
  174. * 2. CANLocal
  175. */
  176. shared_ptr<icps::Packet> packet;
  177. createICPSPacket(in, packet);
  178. if (packet == nullptr) {
  179. logger->error("create ICPSPacket failed");
  180. return;
  181. }
  182. if (packet->getTargetId() == LINUX_HARDWARE_ID) {
  183. /**
  184. * @brief
  185. * can设备
  186. */
  187. m_localVirtualCanSlave->IflytopVirtualCanIF_feedPacket(packet);
  188. } else {
  189. /**
  190. * @brief
  191. * can设备
  192. */
  193. SocketCan::SocketCanError_t error = m_canService->sendPacketToIflytopCanSubDevice(packet, 10);
  194. if (error != SocketCan::SocketCanError_t::kSuccess) {
  195. logger->error("sendPacketToIflytopCanSubDevice failed, error:{},({})", //
  196. SocketCan::SocketCanError_t2Str(error), error);
  197. IflytopCanProtocolStack().createErrorPacket(packet, icps::kOvertime);
  198. }
  199. }
  200. }