forked from xuos/xiuos
				
			fix adapter lora bug on edu-arm32 board
This commit is contained in:
		
							parent
							
								
									a5a809aa0a
								
							
						
					
					
						commit
						1c775d42f6
					
				|  | @ -129,6 +129,9 @@ uint8_t lora_recv_data[ADAPTER_LORA_TRANSFER_DATA_LENGTH]; | ||||||
| struct LoraDataFormat client_recv_data_format[ADAPTER_LORA_CLIENT_NUM]; | struct LoraDataFormat client_recv_data_format[ADAPTER_LORA_CLIENT_NUM]; | ||||||
| 
 | 
 | ||||||
| static sem_t gateway_recv_data_sem; | static sem_t gateway_recv_data_sem; | ||||||
|  | static sem_t gateway_send_cmd_sem; | ||||||
|  | static sem_t client_recv_cmd_sem; | ||||||
|  | static sem_t client_send_data_sem; | ||||||
| struct LoraDataFormat gateway_recv_data_format; | struct LoraDataFormat gateway_recv_data_format; | ||||||
| 
 | 
 | ||||||
| static int recv_error_cnt = 0; | static int recv_error_cnt = 0; | ||||||
|  | @ -315,6 +318,8 @@ static int LoraGatewaySendCmd(struct Adapter *adapter, uint8_t client_id, uint16 | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     PrivSemaphoreAbandon(&gateway_send_cmd_sem); | ||||||
|  | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -410,6 +415,7 @@ static int LoraClientSendData(struct Adapter *adapter, void *send_buf, int lengt | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     PrivSemaphoreAbandon(&client_send_data_sem); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -462,7 +468,7 @@ static int LoraClientDataAnalyze(struct Adapter *adapter, void *send_buf, int le | ||||||
|     struct timespec abstime; |     struct timespec abstime; | ||||||
|     abstime.tv_sec = DEFAULT_SEM_TIMEOUT; |     abstime.tv_sec = DEFAULT_SEM_TIMEOUT; | ||||||
| 
 | 
 | ||||||
|     ret = PrivSemaphoreObtainWait(&adapter->sem, &abstime); |     ret = PrivSemaphoreObtainWait(&client_recv_cmd_sem, NULL); | ||||||
|     if (0 == ret) { |     if (0 == ret) { | ||||||
|         //only handle this client_id information from gateway
 |         //only handle this client_id information from gateway
 | ||||||
|         if ((client_recv_data_format[client_id - 1].client_id == adapter->net_role_id) &&  |         if ((client_recv_data_format[client_id - 1].client_id == adapter->net_role_id) &&  | ||||||
|  | @ -653,9 +659,15 @@ static int LoraReceiveDataCheck(struct Adapter *adapter, uint8_t *recv_data, uin | ||||||
| static void *LoraReceiveTask(void *parameter) | static void *LoraReceiveTask(void *parameter) | ||||||
| { | { | ||||||
|     int ret = 0; |     int ret = 0; | ||||||
|  |     struct timespec abstime; | ||||||
|  |     abstime.tv_sec = DEFAULT_SEM_TIMEOUT; | ||||||
|  | 
 | ||||||
|     struct Adapter *lora_adapter = (struct Adapter *)parameter; |     struct Adapter *lora_adapter = (struct Adapter *)parameter; | ||||||
| 
 | 
 | ||||||
|     while (1) { |     while (1) { | ||||||
|  | #ifdef AS_LORA_GATEWAY_ROLE | ||||||
|  |         PrivSemaphoreObtainWait(&gateway_send_cmd_sem, NULL);   | ||||||
|  | #endif | ||||||
|         memset(lora_recv_data, 0, ADAPTER_LORA_TRANSFER_DATA_LENGTH); |         memset(lora_recv_data, 0, ADAPTER_LORA_TRANSFER_DATA_LENGTH); | ||||||
|          |          | ||||||
|         ret = AdapterDeviceRecv(lora_adapter, lora_recv_data, ADAPTER_LORA_TRANSFER_DATA_LENGTH); |         ret = AdapterDeviceRecv(lora_adapter, lora_recv_data, ADAPTER_LORA_TRANSFER_DATA_LENGTH); | ||||||
|  | @ -675,8 +687,10 @@ static void *LoraReceiveTask(void *parameter) | ||||||
|         if (ret < 0) { |         if (ret < 0) { | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
| 
 | #ifdef AS_LORA_CLIENT_ROLE | ||||||
|         PrivSemaphoreAbandon(&lora_adapter->sem); |         PrivSemaphoreAbandon(&client_recv_cmd_sem); | ||||||
|  |         PrivSemaphoreObtainWait(&client_send_data_sem, &abstime);   | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
|  | @ -904,9 +918,13 @@ int AdapterLoraInit(void) | ||||||
|     adapter->done = product_info->model_done; |     adapter->done = product_info->model_done; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     PrivSemaphoreCreate(&adapter->sem, 0, 0); | #ifdef AS_LORA_GATEWAY_ROLE | ||||||
| 
 |  | ||||||
|     PrivSemaphoreCreate(&gateway_recv_data_sem, 0, 0); |     PrivSemaphoreCreate(&gateway_recv_data_sem, 0, 0); | ||||||
|  |     PrivSemaphoreCreate(&gateway_send_cmd_sem, 0, 0); | ||||||
|  | #else//AS_LORA_CLIENT_ROLE
 | ||||||
|  |     PrivSemaphoreCreate(&client_recv_cmd_sem, 0, 0); | ||||||
|  |     PrivSemaphoreCreate(&client_send_data_sem, 0, 0); | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|     PrivMutexCreate(&adapter->lock, 0); |     PrivMutexCreate(&adapter->lock, 0); | ||||||
| 
 | 
 | ||||||
|  | @ -944,9 +962,9 @@ int AdapterLoraTest(void) | ||||||
|     PrivTaskStartup(&lora_recv_data_task); |     PrivTaskStartup(&lora_recv_data_task); | ||||||
| 
 | 
 | ||||||
| #ifdef ADD_NUTTX_FEATURES | #ifdef ADD_NUTTX_FEATURES | ||||||
|     lora_gateway_attr.priority = 19; |     lora_gateway_attr.priority = 20; | ||||||
| #else    | #else    | ||||||
|     lora_gateway_attr.schedparam.sched_priority = 19; |     lora_gateway_attr.schedparam.sched_priority = 20; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     PrivTaskCreate(&lora_gateway_task, &lora_gateway_attr, &LoraGatewayTask, (void *)adapter); |     PrivTaskCreate(&lora_gateway_task, &lora_gateway_attr, &LoraGatewayTask, (void *)adapter); | ||||||
|  | @ -966,9 +984,9 @@ int AdapterLoraTest(void) | ||||||
|     PrivTaskStartup(&lora_recv_data_task); |     PrivTaskStartup(&lora_recv_data_task); | ||||||
| 
 | 
 | ||||||
| #ifdef ADD_NUTTX_FEATURES | #ifdef ADD_NUTTX_FEATURES | ||||||
|     lora_client_attr.priority = 19; |     lora_client_attr.priority = 20; | ||||||
| #else    | #else    | ||||||
|     lora_client_attr.schedparam.sched_priority = 19; |     lora_client_attr.schedparam.sched_priority = 20; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     //create lora client task
 |     //create lora client task
 | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ typedef enum | ||||||
| 
 | 
 | ||||||
| struct ControlDevice | struct ControlDevice | ||||||
| { | { | ||||||
|     char *dev_name; |     char dev_name[20]; | ||||||
|     int status; |     int status; | ||||||
| 
 | 
 | ||||||
|     //to do
 |     //to do
 | ||||||
|  |  | ||||||
|  | @ -191,8 +191,8 @@ static uint32 SpiLoraWrite(void *dev, struct BusBlockWriteParam *write_param) | ||||||
|         KPrintf("SpiLoraWrite ERROR:The message is too long!\n"); |         KPrintf("SpiLoraWrite ERROR:The message is too long!\n"); | ||||||
|         return ERROR; |         return ERROR; | ||||||
|     } else { |     } else { | ||||||
|         SX1276SetTxPacket(write_param->buffer, write_param->size);     |         SX1276SetTx(write_param->buffer, write_param->size);     | ||||||
|         while(SX1276Process() != RF_TX_DONE); | 
 | ||||||
|         KPrintf("SpiLoraWrite success!\n"); |         KPrintf("SpiLoraWrite success!\n"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -210,24 +210,12 @@ static uint32 SpiLoraRead(void *dev, struct BusBlockReadParam *read_param) | ||||||
|     NULL_PARAM_CHECK(dev); |     NULL_PARAM_CHECK(dev); | ||||||
|     NULL_PARAM_CHECK(read_param); |     NULL_PARAM_CHECK(read_param); | ||||||
| 
 | 
 | ||||||
|     int read_times = 100; |  | ||||||
|      |  | ||||||
|     SX1276StartRx(); |  | ||||||
|     KPrintf("SpiLoraRead Ready!\n"); |     KPrintf("SpiLoraRead Ready!\n"); | ||||||
| 
 | 
 | ||||||
|     while (read_times) { |     int ret = SX1276GetRx(read_param->buffer, (uint16 *)&read_param->read_length); | ||||||
|         if (SX1276Process() != RF_RX_DONE) { |  | ||||||
|             read_times --; |  | ||||||
|             MdelayKTask(500); |  | ||||||
|         } else { |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     if (read_times > 0) { |     if (ret < 0) { | ||||||
|         SX1276GetRxPacket(read_param->buffer, (uint16 *)&read_param->read_length); |         return 0; | ||||||
|     } else { |  | ||||||
|         read_param->read_length = 0; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return read_param->read_length; |     return read_param->read_length; | ||||||
|  |  | ||||||
|  | @ -494,6 +494,7 @@ int HwSpiInit(void) | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef TEST_SPI | ||||||
| /*Just for lora test*/ | /*Just for lora test*/ | ||||||
| static struct Bus *bus; | static struct Bus *bus; | ||||||
| static struct HardwareDev *dev; | static struct HardwareDev *dev; | ||||||
|  | @ -578,4 +579,4 @@ void TestLoraOpen(void) | ||||||
| SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), | SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), | ||||||
|                                                 TestLoraOpen, TestLoraOpen, open lora device and read parameters); |                                                 TestLoraOpen, TestLoraOpen, open lora device and read parameters); | ||||||
| 
 | 
 | ||||||
| 
 | #endif | ||||||
|  |  | ||||||
|  | @ -50,6 +50,9 @@ uint8_t SX1276Regs[0x70]; | ||||||
| static bool LoRaOn = true;        | static bool LoRaOn = true;        | ||||||
| static bool LoRaOnState = false;  | static bool LoRaOnState = false;  | ||||||
| 
 | 
 | ||||||
|  | static int sx1276_tx_sem, sx1276_rx_sem; | ||||||
|  | static int sx1276_radio_task; | ||||||
|  | 
 | ||||||
| void SX1276Reset(void) | void SX1276Reset(void) | ||||||
| { | { | ||||||
| 	uint32_t startTick;   | 	uint32_t startTick;   | ||||||
|  | @ -200,6 +203,20 @@ void SX1276GetRxPacket(void *buffer, uint16_t *size) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | int SX1276GetRx(void *buffer, uint16_t *size) | ||||||
|  | { | ||||||
|  |     int ret = -1; | ||||||
|  |     SX1276StartRx(); | ||||||
|  | 
 | ||||||
|  |     //receive timeout 10s
 | ||||||
|  |     ret = KSemaphoreObtain(sx1276_rx_sem, 10000); | ||||||
|  |     if (0 == ret) { | ||||||
|  |         SX1276LoRaSetRFState(RFLR_STATE_IDLE); | ||||||
|  |         SX1276GetRxPacket(buffer, size); | ||||||
|  |     } | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void SX1276SetTxPacket(const void *buffer, uint16_t size) | void SX1276SetTxPacket(const void *buffer, uint16_t size) | ||||||
| { | { | ||||||
|     if(LoRaOn == false) { |     if(LoRaOn == false) { | ||||||
|  | @ -209,6 +226,14 @@ void SX1276SetTxPacket(const void *buffer, uint16_t size) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void SX1276SetTx(const void *buffer, uint16_t size) | ||||||
|  | { | ||||||
|  |     SX1276SetTxPacket(buffer, size); | ||||||
|  | 
 | ||||||
|  |     KSemaphoreObtain(sx1276_tx_sem, WAITING_FOREVER); | ||||||
|  |     SX1276StartRx(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| uint8_t SX1276GetRFState(void) | uint8_t SX1276GetRFState(void) | ||||||
| { | { | ||||||
|     if(LoRaOn == false) { |     if(LoRaOn == false) { | ||||||
|  | @ -236,6 +261,20 @@ uint32_t SX1276Process(void) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void Sx1276RadioEntry(void *parameter)   | ||||||
|  | { | ||||||
|  |     uint32_t result; | ||||||
|  |     while(1) { | ||||||
|  |         result = SX1276Process(); | ||||||
|  |         if (RF_RX_DONE == result) { | ||||||
|  |             KSemaphoreAbandon(sx1276_rx_sem); | ||||||
|  |         } | ||||||
|  |         if (RF_TX_DONE == result) { | ||||||
|  |             KSemaphoreAbandon(sx1276_tx_sem); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| uint32_t SX1276ChannelEmpty(void) | uint32_t SX1276ChannelEmpty(void) | ||||||
| { | { | ||||||
|     if(LoRaOn == false) { |     if(LoRaOn == false) { | ||||||
|  | @ -277,6 +316,12 @@ void SX1276Init(void) | ||||||
| 		SX1276_SetLoRaOn(LoRaOn); | 		SX1276_SetLoRaOn(LoRaOn); | ||||||
| 		SX1276LoRaInit();        | 		SX1276LoRaInit();        | ||||||
| 	#endif | 	#endif | ||||||
|  | 
 | ||||||
|  |     sx1276_rx_sem = KSemaphoreCreate(0); | ||||||
|  |     sx1276_tx_sem = KSemaphoreCreate(0); | ||||||
|  | 
 | ||||||
|  |     sx1276_radio_task = KTaskCreate("radio", Sx1276RadioEntry , NONE, 2048, 20); | ||||||
|  |     StartupKTask(sx1276_radio_task); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -80,8 +80,12 @@ void SX1276StartRx( void );                                   //开始接收 | ||||||
| 
 | 
 | ||||||
| void SX1276GetRxPacket( void *buffer, uint16_t *size );       //得到接收的数据
 | void SX1276GetRxPacket( void *buffer, uint16_t *size );       //得到接收的数据
 | ||||||
| 
 | 
 | ||||||
|  | int SX1276GetRx(void *buffer, uint16_t *size);                //应用接收数据,无数据时阻塞
 | ||||||
|  | 
 | ||||||
| void SX1276SetTxPacket( const void *buffer, uint16_t size );  //发送数据
 | void SX1276SetTxPacket( const void *buffer, uint16_t size );  //发送数据
 | ||||||
| 
 | 
 | ||||||
|  | void SX1276SetTx( const void *buffer, uint16_t size );        //应用发送数据
 | ||||||
|  | 
 | ||||||
| uint8_t SX1276GetRFState( void );       				      //得到RFLRState状态
 | uint8_t SX1276GetRFState( void );       				      //得到RFLRState状态
 | ||||||
| 
 | 
 | ||||||
| void SX1276SetRFState( uint8_t state );						  //设置RFLRState状态,RFLRState的值决定了下面的函数处理哪一步的代码
 | void SX1276SetRFState( uint8_t state );						  //设置RFLRState状态,RFLRState的值决定了下面的函数处理哪一步的代码
 | ||||||
|  |  | ||||||
|  | @ -16,7 +16,9 @@ | ||||||
| 
 | 
 | ||||||
| time_t time(time_t *t) | time_t time(time_t *t) | ||||||
| { | { | ||||||
|     NULL_PARAM_CHECK(t); |     if (NULL == t) { | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|     time_t current = 0; |     time_t current = 0; | ||||||
| 
 | 
 | ||||||
| #ifdef RESOURCES_RTC | #ifdef RESOURCES_RTC | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue