lora.c 19 KB

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