lora.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. tRadioDriver *Radio = 0;
  2. uint8_t cmpBuf[256] ;
  3. OS_Q lora_q;
  4. void lora_send(char *tx_data, uint32_t tx_len)
  5. {
  6. char *p_msg = NULL;
  7. uint32_t msg_len;
  8. OS_ERR err;
  9. /* 接受消息, 发往net_proc模块统一处理 */
  10. p_msg = (char *)net_queue_mem_calloc();
  11. if(p_msg) {
  12. memcpy(p_msg, tx_data, tx_len);
  13. OS_QPost(&lora_q, p_msg, msg_len, OS_OPT_POST_FIFO, 0, &err);
  14. }
  15. }
  16. uint32_t lora_recv(char *tx_data, uint32_t *tx_len)
  17. {
  18. int8_t snr = 0;
  19. double rssi=0;
  20. *tx_len = SX1276_Read_Data(tx_data ,100, &snr, &rssi);\
  21. if(*tx_len > 0) {
  22. if(memcmp(cmpBuf, tx_data, *tx_len)){//和上次数据不同,数据有效
  23. memcpy(cmpBuf, tx_data, *tx_len);
  24. } else {
  25. return 0;
  26. }
  27. }
  28. return *tx_len;
  29. }
  30. void lora_task(void)
  31. {
  32. inner_msg_format_t *p_msg = NULL;
  33. uint32_t msg_len;
  34. OS_ERR err;
  35. /* 接受消息, 发往net_proc模块统一处理 */
  36. p_msg = (inner_msg_format_t *)net_queue_mem_calloc();
  37. if(p_msg) {
  38. lora_recv(p_msg, &msg_len);
  39. if(msg_len) {
  40. net_queue_insert((char *)p_msg, msg_len);
  41. } else {
  42. net_queue_mem_free(p_msg);
  43. }
  44. }
  45. /* 发送消息 */
  46. while(p_msg = (inner_msg_format_t *)OSQPend(&lora_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err)) { /* none blocking. */
  47. if(p_msg&&msg_len) {
  48. SX1276_Send_Data_Listen_Ch((char *)p_msg, msg_len & 0xFF, 300, 2);
  49. //发送完成后重新开启接收
  50. Radio->StartRx();
  51. }
  52. }
  53. }
  54. void lora_init(char *device_id)
  55. {
  56. int i = 0, temp ;
  57. OS_ERR err;
  58. temp = 0;
  59. OSQCreate(&lora_q, "lora_queue", 32, &err);//创建网络消息处理队列
  60. Radio = RadioDriverInit();
  61. if(Radio == NULL) {
  62. printf("RADIO is not defined!!!! ");
  63. return -1;
  64. }
  65. Radio->Init();
  66. Radio->StartRx();
  67. return temp;
  68. }