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.

269 lines
9.9 KiB

3 months ago
  1. #include "remote_controler.hpp"
  2. #include "app_protocols/ble_through/ble_proto_utils.h"
  3. using namespace iflytop;
  4. #define TAG "RemoteControler"
  5. #define MODULE_DEBUG 0
  6. #define UART_RX_OVERTIME 200
  7. #define CMD_OVERTIME 500
  8. static ZQueue<RemoteControlerReportPacket_t> ackQueue;
  9. static ZQueue<RemoteControlerReportPacket_t> eventQueue;
  10. static ZThread usartRxThread;
  11. static ZThread eventProcessThread;
  12. static bool m_isWaitingForAck;
  13. static UART_HandleTypeDef* m_uart;
  14. static const char* zhex2str(uint8_t* data, size_t len) {
  15. static char buf[256];
  16. memset(buf, 0, sizeof(buf));
  17. for (size_t i = 0; i < len; i++) {
  18. sprintf(buf + i * 2, "%02X", data[i]);
  19. }
  20. return buf;
  21. }
  22. void RemoteControlerUpper::initialize() {
  23. ackQueue.initialize(1, sizeof(RemoteControlerReportPacket_t));
  24. eventQueue.initialize(3, sizeof(RemoteControlerReportPacket_t));
  25. usartRxThread.init("usartRxThread", 1024);
  26. eventProcessThread.init("eventProcessThread", 1024);
  27. ZASSERT(AppHardware::ins()->remoteContolerUart);
  28. m_uart = AppHardware::ins()->remoteContolerUart;
  29. m_cmdlock.init();
  30. zble_proto_utils_init(kzble_master);
  31. // m_cmdlock
  32. }
  33. void RemoteControlerUpper::regOnReport(on_report_cb_t on_report) {
  34. m_cb[m_ncb] = on_report;
  35. m_ncb++;
  36. }
  37. bool RemoteControlerUpper::isConnected() { return AppHardware::ins()->BLE_CONNECTED_STATE.getState(); }
  38. void RemoteControlerUpper::callOnReport(uint8_t* rx, int32_t len) {
  39. for (int32_t i = 0; i < m_ncb; i++) {
  40. m_cb[i](rx, len);
  41. }
  42. }
  43. void RemoteControlerUpper::startSchedule() {
  44. usartRxThread.start([this]() {
  45. static uint8_t rxbuf[128];
  46. m_uart->USR_UartITRxing = 1;
  47. m_uart->USR_UartITRxBuf = rxbuf;
  48. m_uart->USR_UartITRxBufSize = 128;
  49. m_uart->USR_UartITRxOff = 0;
  50. HAL_UART_Receive_IT(m_uart, &m_uart->USR_UartITRxBufCache, 1);
  51. while (1) {
  52. // static uint8_t processbuf[128];
  53. static RemoteControlerReportPacket_t rxpacket;
  54. rxpacket.datalen = 0;
  55. zble_proto_packet_t* rxblepacket = (zble_proto_packet_t*)m_uart->USR_UartITRxBuf;
  56. uint8_t* rxblepacketu8 = (uint8_t*)m_uart->USR_UartITRxBuf;
  57. int curPacketlen = rxblepacket->packetlen;
  58. if (m_uart->USR_UartITRxOff != 0) {
  59. if ((m_uart->USR_UartITRxOff >= curPacketlen) && //
  60. rxblepacket->h1 == 0xAA && //
  61. rxblepacket->h2 == 0xBB && //
  62. rxblepacketu8[curPacketlen - 1] == 0xCC) {
  63. //ZLOGI(TAG, "uuuuuuuuuuuuuuuuuuuuuuuuuu");
  64. vPortEnterCritical();
  65. // copy data
  66. memcpy(rxpacket.data, rxblepacketu8, curPacketlen);
  67. rxpacket.datalen = curPacketlen;
  68. // move data
  69. memmove(m_uart->USR_UartITRxBuf, m_uart->USR_UartITRxBuf + curPacketlen, curPacketlen);
  70. m_uart->USR_UartITRxOff = m_uart->USR_UartITRxOff - curPacketlen;
  71. vPortExitCritical();
  72. } else {
  73. if (zos_haspassedms(m_uart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) {
  74. // drop data
  75. ZLOGI(TAG, "drop data %d %s", m_uart->USR_UartITRxOff, zhex2str(m_uart->USR_UartITRxBuf, m_uart->USR_UartITRxOff));
  76. vPortEnterCritical();
  77. m_uart->USR_UartITRxOff = 0;
  78. memset(rxbuf, 0, 128);
  79. vPortExitCritical();
  80. }
  81. }
  82. }
  83. if (rxpacket.datalen != 0) {
  84. preProcessrxpacket(&rxpacket);
  85. }
  86. // ZLOGI(TAG,".");
  87. osDelay(2);
  88. }
  89. });
  90. /**
  91. * @brief ϱϢ
  92. */
  93. eventProcessThread.start([this]() {
  94. while (1) {
  95. static RemoteControlerReportPacket_t packet;
  96. bool suc = eventQueue.receive(&packet, 10);
  97. if (suc) {
  98. processRxEventPacket(&packet);
  99. }
  100. osDelay(1);
  101. }
  102. });
  103. }
  104. void RemoteControlerUpper::preProcessrxpacket(RemoteControlerReportPacket_t* packet) {
  105. #if MODULE_DEBUG
  106. ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(packet->data, packet->datalen), packet->datalen);
  107. #endif
  108. zble_proto_packet_t* p_packet = (zble_proto_packet_t*)packet->data;
  109. if (!ble_through_proto_check_packet(p_packet)) {
  110. ZLOGI(TAG, "rx invalid packet %s", zhex2str(packet->data, packet->datalen));
  111. return;
  112. }
  113. bool suc = true;
  114. if (p_packet->frameType == kzble_proto_cmd) {
  115. // suc = ackQueue.send(packet, 10);
  116. } else if (p_packet->frameType == kzble_proto_report) {
  117. suc = eventQueue.send(packet, 10);
  118. } else if (p_packet->frameType == kzble_proto_error_receipt || p_packet->frameType == kzble_proto_cmd_receipt) {
  119. if (m_isWaitingForAck) {
  120. suc = ackQueue.send(packet, 10);
  121. m_isWaitingForAck = false;
  122. }
  123. }
  124. if (!suc) {
  125. ZLOGI(TAG, "eventQueue send failed");
  126. }
  127. }
  128. void RemoteControlerUpper::processRxEventPacket(RemoteControlerReportPacket_t* packet) {
  129. #if MODULE_DEBUG
  130. ZLOGI(TAG, "[process-thread] rx event : %s", zhex2str(packet->data, packet->datalen));
  131. #endif
  132. // if (m_on_report) {
  133. // m_on_report(packet->data, packet->datalen);
  134. // }
  135. callOnReport(packet->data, packet->datalen);
  136. }
  137. bool RemoteControlerUpper::txcmd(uint8_t* data, uint32_t len) {
  138. /**
  139. * @brief
  140. */
  141. zlock_guard lg(m_cmdlock);
  142. ackQueue.clear();
  143. m_isWaitingForAck = true;
  144. #if MODULE_DEBUG
  145. ZLOGI(TAG, "txcmd : %s(%d)", zhex2str(data, len), len);
  146. #endif
  147. // vPortEnterCritical();
  148. HAL_UART_Transmit(m_uart, data, len, 100);
  149. // vPortExitCritical();
  150. // HAL_UART_Transmit_DMA(m_uart, data, len);
  151. bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME);
  152. if (!suc) {
  153. ZLOGI(TAG, "txcmd : %s(%d) fail", zhex2str(data, len), len);
  154. // HAL_UART_DMAStop(m_uart);
  155. return false;
  156. }
  157. #if MODULE_DEBUG
  158. ZLOGI(TAG, "ack : %s", zhex2str(ackcache.data, ackcache.datalen));
  159. #endif
  160. // HAL_UART_DMAStop(m_uart);
  161. return true;
  162. }
  163. /***********************************************************************************************************************
  164. * CMD *
  165. ***********************************************************************************************************************/
  166. bool RemoteControlerUpper::resetMasterBoard() {
  167. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_reset, m_index++, NULL, 0);
  168. zble_proto_utils_set_packet_to(txpacket, kzble_master);
  169. bool suc = txcmd(txbuf, txpacket->packetlen);
  170. return suc;
  171. }
  172. bool RemoteControlerUpper::resetClientBoard() {
  173. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_reset, m_index++, NULL, 0);
  174. zble_proto_utils_set_packet_to(txpacket, kzble_slave);
  175. bool suc = txcmd(txbuf, txpacket->packetlen);
  176. return suc;
  177. }
  178. bool RemoteControlerUpper::readMasterBoardVersion(zble_read_version_t* version) {
  179. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_read_version, m_index++, NULL, 0);
  180. zble_proto_utils_set_packet_to(txpacket, kzble_master);
  181. bool suc = txcmd(txbuf, txpacket->packetlen);
  182. if (suc) *version = *(zble_read_version_t*)(rxpacket->data);
  183. return suc;
  184. }
  185. bool RemoteControlerUpper::readClientBoardVersion(zble_read_version_t* version) {
  186. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_read_version, m_index++, NULL, 0);
  187. zble_proto_utils_set_packet_to(txpacket, kzble_slave);
  188. bool suc = txcmd(txbuf, txpacket->packetlen);
  189. if (suc) *version = *(zble_read_version_t*)(rxpacket->data);
  190. return suc;
  191. }
  192. bool RemoteControlerUpper::clearMasterResetFlag() {
  193. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_clear_reset_flag, m_index++, NULL, 0);
  194. zble_proto_utils_set_packet_to(txpacket, kzble_master);
  195. bool suc = txcmd(txbuf, txpacket->packetlen);
  196. return suc;
  197. }
  198. bool RemoteControlerUpper::clearSlaveResetFlag() {
  199. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_clear_reset_flag, m_index++, NULL, 0);
  200. zble_proto_utils_set_packet_to(txpacket, kzble_slave);
  201. bool suc = txcmd(txbuf, txpacket->packetlen);
  202. return suc;
  203. }
  204. bool RemoteControlerUpper::setMasterInDfuMode() {
  205. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_set_in_dfu_mode, m_index++, NULL, 0);
  206. zble_proto_utils_set_packet_to(txpacket, kzble_master);
  207. bool suc = txcmd(txbuf, txpacket->packetlen);
  208. return suc;
  209. }
  210. bool RemoteControlerUpper::setSlaveInDfuMode() {
  211. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_set_in_dfu_mode, m_index++, NULL, 0);
  212. zble_proto_utils_set_packet_to(txpacket, kzble_slave);
  213. bool suc = txcmd(txbuf, txpacket->packetlen);
  214. return suc;
  215. }
  216. bool RemoteControlerUpper::startScan(const char* slaveName, bool autoConnect) {
  217. // typedef struct {
  218. // uint8_t slaveName[20];
  219. // uint8_t autoConnect;
  220. // } zble_start_scan_t;
  221. zble_start_scan_t scanparam = {0};
  222. if (slaveName) strncpy((char*)scanparam.slaveName, slaveName, 20);
  223. scanparam.autoConnect = autoConnect;
  224. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_start_scan, m_index++, (uint8_t*)&scanparam, sizeof(scanparam));
  225. zble_proto_utils_set_packet_to(txpacket, kzble_master);
  226. bool suc = txcmd(txbuf, txpacket->packetlen);
  227. return suc;
  228. }
  229. bool RemoteControlerUpper::stopScan() {
  230. zble_proto_utils_create_cmd_packet(txpacket, kzble_cmd_stop_scan, m_index++, NULL, 0);
  231. zble_proto_utils_set_packet_to(txpacket, kzble_master);
  232. bool suc = txcmd(txbuf, txpacket->packetlen);
  233. return suc;
  234. }
  235. /***********************************************************************************************************************
  236. * APP *
  237. ***********************************************************************************************************************/
  238. bool RemoteControlerUpper::setRemoterState(hand_acid_mode_t mode, bool state) {
  239. zble_proto_packet_t* packet = (zble_proto_packet_t*)txbuf;
  240. int32_t param[2] = {mode, state};
  241. zble_proto_utils_create_cmd_packet_int32(packet, kzble_app_cmd_set_state, m_index++, param, 2);
  242. bool suc = txcmd(txbuf, packet->packetlen);
  243. return suc;
  244. }