lora.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. #include "../../../User/includes.h"
  2. #include "device.h"
  3. #include "net_proc.h"
  4. #include "radio.h"
  5. #include "project_config.h"
  6. #include "stdio.h"
  7. #include "stm32f10x_it.h"
  8. #include "delay.h"
  9. #include "string.h"
  10. #include "../../gateway_collect/gateway_collect.h"
  11. #include "../../globalDef.h"
  12. #include "lora.h"
  13. extern volatile uint32_t TickCounter;
  14. loraParam g_loraPa[4];
  15. #define RADIO_RX_TIMEOUT_VALUE 0
  16. //uint8_t cmpBuf[256] ;
  17. uint8_t lora_state = 0;
  18. OS_Q lora_q;
  19. system_lora_t sys_loraTX;
  20. system_lora_t sys_loraRx;
  21. uint8_t g_loraCadStatus = 0;
  22. uint8_t g_loraCadCount = 0;
  23. uint32_t g_cadTick = 0;
  24. uint32_t g_cadTickTime = 0;
  25. /*!
  26. * Radio events function pointer
  27. * 这个是传参进入其他函数中了,所以用全局变量(局部变量使用完了内存释放可能导致异常)
  28. */
  29. static RadioEvents_t RadioEventsObj;
  30. static void SX126xOnCadDone( bool channelActivityDetected );
  31. static void SX126xConfigureCad( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin , uint32_t cadTimeout);
  32. void * lora_queue_mem_calloc_must(void)
  33. {
  34. OS_ERR err;
  35. void * p_msg = NULL;
  36. OSSemPend(&sys_loraTX.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  37. p_msg = OSMemGet(&sys_loraTX.lora_m, &err);
  38. // printf("\r\n~~~~~~~~~~~~~~~err = %d\r\n",err);
  39. OSSemPost(&sys_loraTX.sem, OS_OPT_POST_ALL, &err);
  40. // printf("\r\n~~~~~~~~~~~~~~~err = %d end \r\n",err);
  41. return p_msg;
  42. }
  43. int lora_queue_mem_free(void * p_msg)
  44. {
  45. OS_ERR err;
  46. OSSemPend(&sys_loraTX.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  47. OSMemPut(&sys_loraTX.lora_m, p_msg, &err);
  48. OSSemPost(&sys_loraTX.sem, OS_OPT_POST_ALL, &err);
  49. return err;
  50. }
  51. void lora_queue_insert(char *p_msg, uint32_t msg_len)
  52. {
  53. OS_ERR err;
  54. OSSemPend(&sys_loraTX.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  55. OS_QPost(&sys_loraTX.lora_q, p_msg, msg_len, OS_OPT_POST_FIFO, 0, &err);
  56. OSSemPost(&sys_loraTX.sem, OS_OPT_POST_ALL, &err);
  57. //printf("net_queue_insert %p %d\r\n", p_msg, msg_len);
  58. }
  59. void * lora_queue_mem_calloc_mustRx(void)
  60. {
  61. OS_ERR err;
  62. void * p_msg = NULL;
  63. OSSemPend(&sys_loraRx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  64. p_msg = OSMemGet(&sys_loraRx.lora_m, &err);
  65. OSSemPost(&sys_loraRx.sem, OS_OPT_POST_ALL, &err);
  66. return p_msg;
  67. }
  68. int lora_queue_mem_freeRx(void * p_msg)
  69. {
  70. OS_ERR err;
  71. OSSemPend(&sys_loraRx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  72. OSMemPut(&sys_loraRx.lora_m, p_msg, &err);
  73. OSSemPost(&sys_loraRx.sem, OS_OPT_POST_ALL, &err);
  74. return err;
  75. }
  76. void lora_queue_insertRx(char *p_msg, uint32_t msg_len)
  77. {
  78. OS_ERR err;
  79. OSSemPend(&sys_loraRx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  80. OS_QPost(&sys_loraRx.lora_q, p_msg, msg_len, OS_OPT_POST_FIFO, 0, &err);
  81. OSSemPost(&sys_loraRx.sem, OS_OPT_POST_ALL, &err);
  82. //printf("net_queue_insert %p %d\r\n", p_msg, msg_len);
  83. }
  84. static void SX126xOnTxDone( void )
  85. {
  86. //printf("TxDone\r\n");
  87. Radio.Standby();
  88. lora_state = lora_state_idle;
  89. g_loraCadStatus = 0;
  90. //Radio.Rx( RADIO_RX_TIMEOUT_VALUE );
  91. }
  92. /*lora数据接收 2021.11.08*/
  93. static void SX126xOnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
  94. {
  95. OS_ERR err;
  96. // inner_msg_format_t *p_msg = NULL;
  97. char *p_msg = NULL;
  98. // rssi:信号强度
  99. // printf("RxDone size:%d <rssi:%d, snr:%d> \r\n",size, rssi, snr);
  100. Radio.Standby();
  101. // p_msg = (gateway_collect_com_t *)payload;
  102. g_runData.rssi_lora = rssi+1000;
  103. p_msg = lora_queue_mem_calloc_mustRx();
  104. if(p_msg)
  105. {
  106. if(size) //和上次数据不同,数据有效
  107. {
  108. // data_dump("LORA Rxtx", (uint8_t *)payload, size);
  109. memcpy(p_msg, payload, size);//&&memcmp(cmpBuf, payload, size)
  110. lora_queue_insertRx((char *)p_msg, size);
  111. } else {
  112. lora_queue_mem_freeRx(p_msg);
  113. }
  114. // printf("lora rcv\r\n");
  115. }
  116. g_loraCadStatus = 0;
  117. // OS_QPost(&lora_q, payload, size, OS_OPT_POST_FIFO, 0, &err);
  118. // data_dump("LORA Rx", payload, size);
  119. #if 0
  120. if(((p_msg->type <= net_msg_type_debug)||
  121. (p_msg->type == net_msg_type_bind_req)||
  122. (p_msg->type == net_msg_type_node_echo))&&
  123. (device_type_get() != DEV_TYPE_GATEWAY)) {/* 节点丢弃 */
  124. //drop packets;
  125. } else if(((p_msg->type == net_msg_type_bind_rsp)||
  126. (p_msg->type == net_msg_type_gw_echo))&&
  127. (device_type_get() == DEV_TYPE_GATEWAY)) {
  128. //drop packets;
  129. } else {
  130. data_dump("LORA Rx", payload, size);
  131. //Radio.Rx( RADIO_RX_TIMEOUT_VALUE );
  132. if(((p_msg->type&0x10) == 0x10)||
  133. ((p_msg->type&0x20) == 0x20)) {
  134. p_msg = (inner_msg_format_t *)net_queue_mem_calloc_must();
  135. } else {
  136. p_msg = (inner_msg_format_t *)net_queue_mem_calloc();
  137. }
  138. if(p_msg) {
  139. if(size) {//和上次数据不同,数据有效
  140. // data_dump("LORA Rxtx", (uint8_t *)p_msg, size);
  141. memcpy(p_msg, payload, size);//&&memcmp(cmpBuf, payload, size)
  142. net_queue_insert((char *)p_msg, size);
  143. } else {
  144. net_queue_mem_free(p_msg);
  145. }
  146. }
  147. }
  148. #endif
  149. lora_state = lora_state_idle;
  150. }
  151. static void SX126xOnCadDone( bool channelActivityDetected )
  152. {
  153. inner_msg_format_t *p_msg = NULL;
  154. OS_MSG_SIZE msg_len = 0;
  155. OS_ERR err;
  156. int a = 0;
  157. // __disable_irq();
  158. Radio.Standby();
  159. // printf("cadDone %d\r\n", channelActivityDetected);
  160. if(channelActivityDetected==true){
  161. // lora_state = lora_state_idle;
  162. g_loraCadStatus = 0;
  163. g_loraCadCount++;
  164. srand(TickCounter);
  165. a = rand() % 50;
  166. if(g_runData.bUpdateHost == 0)g_cadTickTime = 300+a;
  167. else {
  168. if(g_runData.bUpdate != 0) {
  169. g_cadTickTime = 700;
  170. }
  171. else g_cadTickTime = 300+a;
  172. }
  173. g_cadTick = TickCounter;
  174. lora_state = lora_state_sendRept;
  175. }
  176. else {
  177. lora_queue_proc_testTx();
  178. g_loraCadCount = 0;
  179. g_cadTick = TickCounter;
  180. }
  181. // __enable_irq();
  182. return ;
  183. }
  184. static void SX126xOnTxTimeout( void )
  185. {
  186. printf("TxTimeout\r\n");
  187. Radio.Standby();
  188. lora_state = lora_state_idle;
  189. }
  190. static void SX126xOnRxTimeout( void )
  191. {
  192. printf("RxTimeout retry recive\r\n");
  193. Radio.Standby();
  194. //Radio.Rx( LORA_RX_TIMEOUT_VALUE );
  195. lora_state = lora_state_idle;
  196. }
  197. static void SX126xOnRxError( void )
  198. {
  199. printf("RxError retry recive\r\n");
  200. Radio.Standby();
  201. //Radio.Rx(LORA_RX_TIMEOUT_VALUE);
  202. lora_state = lora_state_idle;
  203. }
  204. static void SX126xConfigureCad( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin , uint32_t cadTimeout)
  205. {
  206. SX126xSetDioIrqParams( IRQ_CAD_DONE | IRQ_CAD_ACTIVITY_DETECTED, IRQ_CAD_DONE | IRQ_CAD_ACTIVITY_DETECTED,
  207. IRQ_RADIO_NONE, IRQ_RADIO_NONE );
  208. SX126xSetCadParams( cadSymbolNum, cadDetPeak, cadDetMin, LORA_CAD_ONLY, ((cadTimeout * 1000) / 15.625 ));
  209. }
  210. void lora_send(char *tx_data, uint32_t tx_len)
  211. {
  212. char *p_msg = NULL;
  213. OS_ERR err;
  214. p_msg = (char *)lora_queue_mem_calloc_must();
  215. if(p_msg) {
  216. memcpy(p_msg, tx_data, tx_len);
  217. lora_queue_insert((char *)p_msg, tx_len);
  218. }
  219. else
  220. {
  221. lora_queue_mem_free(p_msg);
  222. }
  223. // char *p_msg = NULL;
  224. // OS_ERR err;
  225. // /* 接受消息, 发往net_proc模块统一处理 */
  226. // p_msg = (char *)net_queue_mem_calloc_must();
  227. // if(p_msg) {
  228. // memcpy(p_msg, tx_data, tx_len);
  229. // OS_QPost(&lora_q, p_msg, tx_len, OS_OPT_POST_FIFO, 0, &err);
  230. // }
  231. }
  232. void lora_net_send_test(uint8_t *tx_data, uint8_t tx_len)
  233. {
  234. if(tx_data[tx_len-2]==0x0d && tx_data[tx_len-1]==0x0a)
  235. {
  236. tx_data[tx_len-2]='\0';
  237. tx_data[tx_len-1]='\0';
  238. tx_len-=2;
  239. data_dump("lora tx:", tx_data, tx_len);
  240. }
  241. AIR_MQTT_PUB((char*)g_upLinkTopic,tx_data,0);
  242. }
  243. /*lora 发送消息 */
  244. void lora_send_test(uint8_t *buf, uint8_t size)
  245. {
  246. gateway_collect_com_t *msg = (gateway_collect_com_t*)msg;
  247. // if(msg->type==0x56){
  248. // downlink_config.collect_conf[msg->taxinfo.comdata.coll_no].coll_send_num++;
  249. // }
  250. // if(g_runData.bUpdate==0){
  251. // if(msg->type==0x57){
  252. // set_led_status(msg->taxinfo.data.coll_no,0);
  253. // }
  254. // else {
  255. // set_led_status(msg->taxinfo.info[4],0);
  256. // }
  257. // }
  258. Radio.Send(buf, size);
  259. }
  260. void lora_queue_proc_test(void)
  261. {
  262. OS_ERR err;
  263. gateway_collect_com_t *p_msg;
  264. OS_MSG_SIZE msg_len;
  265. uint32_t a = 0;
  266. uint16_t crc = 0, fcrc = 0;
  267. OSSemPend(&sys_loraRx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  268. p_msg = (gateway_collect_com_t *)OSQPend(&sys_loraRx.lora_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err); /* blocking. */
  269. OSSemPost(&sys_loraRx.sem, OS_OPT_POST_ALL, &err);
  270. if(p_msg&&msg_len)
  271. {
  272. if(p_msg->frame_header != 0xfefe){
  273. lora_queue_mem_freeRx(p_msg);
  274. return;
  275. }
  276. crc = _crc16_get((uint8_t*)p_msg,p_msg->len+GATE_COLL_HEAD_LEN-2);// len-2);
  277. fcrc = p_msg->taxinfo.info[p_msg->len-1];// data[p_tax_tx->len+GATE_COLL_HEAD_LEN-1];
  278. fcrc = (fcrc<<8)| p_msg->taxinfo.info[p_msg->len-2];//data[p_tax_tx->len+GATE_COLL_HEAD_LEN-2];
  279. if(fcrc != crc ){//校验位不对则返回
  280. printf("lora_queue_proc: crc error\r\n");
  281. //data_dump("rcv updata", (uint8_t *)p_msg, p_msg->len + 12);
  282. lora_queue_mem_freeRx(p_msg);
  283. return;
  284. }
  285. switch(p_msg->type){
  286. case COLL_GATE_TAX_QUERY: //0x67业务数据接收接收消息
  287. break;
  288. case COLL_GATE_HEART_QUERY: //0x66网关与采集器的上行心跳包
  289. break;
  290. case COLL_GATE_FIRMMSG_QUERY://0x68采集器上发固件信息
  291. break;
  292. case 0x22: // 升级重新传指令, 采集器上发的指令
  293. printf("\r\n 收到0x22指令\r\n");
  294. g_runData.repeatUpdateTime = TickCounter;
  295. g_runData.readUpdateStatusTime = 0;
  296. if(g_runData.bUpdateHost == 0) break;
  297. lora_gw_ota_proc(&sys_net, p_msg);
  298. break;
  299. case 0x23: // 升级成功,主设备接收从设备的上报指令
  300. printf("rcv 0x23 cmd ,delay = %d\r\n",a);
  301. if(g_runData.bResetUpdate == 2) { // 从设备时,
  302. srand(TickCounter);
  303. a = rand() % 233+200;
  304. timeout_setValue(&g_updateProg.upStatusOut,a);
  305. timeout_start(&g_updateProg.upStatusOut);
  306. }
  307. else if(g_runData.bResetUpdate == 0) // 主设备
  308. gateway_update_status_rcv(p_msg,msg_len);
  309. break;
  310. case 0x16: // 通知采集器升级
  311. break;
  312. case net_msg_type_update_start: // 网关升级网关指令开始0x13
  313. printf("\r\n 收到0x13指令\r\n");
  314. gateway_lora_ota_proc(p_msg);
  315. break;
  316. case net_msg_type_update_continues: // 0x14指令
  317. printf("\r\n 收到0x14指令\r\n");
  318. gateway_lora_ota_proc(p_msg);
  319. break;
  320. case net_msg_type_update_retransmit_rsp: // 0x15指令
  321. printf("\r\n 收到0x15指令\r\n");
  322. gateway_lora_ota_proc(p_msg);
  323. break;
  324. default:
  325. break;
  326. }
  327. lora_queue_mem_freeRx(p_msg);
  328. }
  329. }
  330. void lora_queue_proc_testTx(void)
  331. {
  332. OS_ERR err;
  333. gateway_collect_com_t *p_msg;
  334. OS_MSG_SIZE msg_len;
  335. uint8_t coll = 0;
  336. // printf("net_queue_proc 1111\r\n");
  337. OSSemPend(&sys_loraTX.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  338. p_msg = (gateway_collect_com_t *)OSQPend(&sys_loraTX.lora_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err); /* blocking. */
  339. OSSemPost(&sys_loraTX.sem, OS_OPT_POST_ALL, &err);
  340. if(p_msg&&msg_len)
  341. {
  342. if(p_msg->type == 0x57) coll = p_msg->taxinfo.data.coll_no;
  343. else coll = p_msg->taxinfo.info[4];
  344. printf("++++++++++ msg type = 0x%x coll = %d +++++\r\n",p_msg->type,coll);
  345. lora_send_test((uint8_t *)p_msg, msg_len);
  346. lora_queue_mem_free(p_msg);
  347. if(device_fixed_info.Work_State == DEV_WORK_STATE_OTA_RETRANSMIT)
  348. {
  349. ota_retransmit_delay.timeout = OTA_CAD_FREE_DELAYTIME;
  350. ota_retransmit_delay.counter = TickCounter;
  351. ota_continuous_end_flag = OTA_CONTINUOUS_DELAY;
  352. }
  353. // printf("发送loraSend = %d,采集器(%d):发送:%d\r\n",g_loraCollMsg.lora_sendCount,p_msg->taxinfo.info[4],g_loraCollMsg.info[p_msg->taxinfo.info[4]].sendNum);
  354. }
  355. else {
  356. lora_state = lora_state_idle;
  357. // printf("\r\n lora state idel 11111111 \r\n");
  358. }
  359. }
  360. void lora_task(void)
  361. {
  362. //inner_msg_format_t *p_msg = NULL;
  363. OS_MSG_SIZE msg_len = 0;
  364. OS_ERR err;
  365. uint32_t i = 0;
  366. /* 发送消息 */
  367. if(g_runData.bUpdate ==0 ) {
  368. if(g_runData.loraConnectTime == 0) return;
  369. if(g_runData.loraConnectTime >30) { // 半个小后,lora不再接收数据
  370. g_runData.loraConnectTime = 0;
  371. SX126xReset();
  372. printf("lora reset \r\n ");
  373. }
  374. }
  375. lora_queue_proc_test();
  376. switch(lora_state) {
  377. case lora_state_idle: //idle
  378. Radio.Standby();
  379. Radio.Rx( LORA_RX_TIMEOUT_VALUE );
  380. lora_state = lora_state_send;// lora_state_rcv;
  381. // printf("lora rx state\n");
  382. case lora_state_rcv:
  383. // lora_queue_proc_test();
  384. // lora_state = lora_state_send;
  385. break;
  386. case lora_state_send:
  387. if(sys_loraTX.lora_q.MsgQ.NbrEntries >0){ //除列不为空
  388. Radio.Standby();
  389. Radio.StartCad();
  390. lora_state = lora_state_max;
  391. break;
  392. }
  393. // lora_state = lora_state_rcv;
  394. break;
  395. case lora_state_sendRept:
  396. if(g_loraCadCount>0) {
  397. if(TickCounter - g_cadTick>=g_cadTickTime){
  398. Radio.Standby();
  399. Radio.StartCad();
  400. g_cadTick = TickCounter;
  401. printf("\r\n&&&&&&& timer out \r\n");
  402. }
  403. if(g_loraCadCount>1){
  404. lora_queue_proc_testTx();
  405. g_loraCadCount = 0;
  406. printf("\r\n ^^^^^^2 count \r\n");
  407. }
  408. }
  409. break;
  410. case lora_state_max:
  411. break;
  412. default:
  413. break;
  414. }
  415. Radio.IrqProcess( );
  416. }
  417. void lora_init(char *device_id)
  418. {
  419. OS_ERR err;
  420. OSSemCreate(&sys_loraTX.sem, "lora_sem", 1, &err);//创建信号量
  421. OSQCreate(&sys_loraTX.lora_q, "lora_queue", 8, &err);//创建网络消息处理队列
  422. OSMemCreate(&sys_loraTX.lora_m, "lora_memory", sys_loraTX.memory, 8, 256, &err);//创建内存管理池
  423. OSSemCreate(&sys_loraRx.sem, "lora_semRx", 1, &err);//创建信号量
  424. OSQCreate(&sys_loraRx.lora_q, "lora_queueRx", 8, &err);//创建网络消息处理队列
  425. OSMemCreate(&sys_loraRx.lora_m, "lora_memoryRx", sys_loraRx.memory, 8, 256, &err);//创建内存管理池
  426. RadioEventsObj.TxDone = SX126xOnTxDone;
  427. RadioEventsObj.RxDone = SX126xOnRxDone;
  428. RadioEventsObj.TxTimeout = SX126xOnTxTimeout;
  429. RadioEventsObj.RxTimeout = SX126xOnRxTimeout;
  430. RadioEventsObj.RxError = SX126xOnRxError;
  431. RadioEventsObj.CadDone = SX126xOnCadDone;
  432. Radio.Init( &RadioEventsObj );
  433. Radio.SetChannel(LORA_FRE);
  434. Radio.SetTxConfig( MODEM_LORA, LORA_TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
  435. LORA_SPREADING_FACTOR, LORA_CODINGRATE,
  436. LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
  437. true, 0, 0, LORA_IQ_INVERSION_ON, 5000 );//参数:lora模式,发射功率,fsk用的lora设置为0就可以,带宽,纠错编码率,前导码长度,固定长度数据包(一般是不固定的所以选false),crc校验,0表示关闭跳频,跳频之间的符号数(关闭跳频这个参数没有意义),这个应该是表示是否要翻转中断电平的,超时时间
  438. Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
  439. LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
  440. LORA_SX126X_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
  441. 0, true, 0, 0, LORA_IQ_INVERSION_ON, false );
  442. // Radio.Rx( LORA_RX_TIMEOUT_VALUE );
  443. // Radio.SetTxConfig( MODEM_LORA, LORA_TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
  444. // LORA_SPREADING_FACTOR, LORA_CODINGRATE,
  445. // LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
  446. // true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );
  447. // Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
  448. // LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
  449. // LORA_TX_OUTPUT_POWER, LORA_FIX_LENGTH_PAYLOAD_ON,
  450. // 0, true, 0, 0, LORA_IQ_INVERSION_ON, true );
  451. //
  452. SX126xConfigureCad( CAD_SYMBOL_NUM, CAD_DET_PEAK,CAD_DET_MIN, CAD_TIMEOUT_MS);
  453. Radio.StartCad();
  454. lora_state = lora_state_rcv;
  455. g_runData.loraConnectTime = 1;
  456. return;
  457. }