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];
|
||||
|
||||
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;
|
||||
|
||||
static int recv_error_cnt = 0;
|
||||
|
@ -315,6 +318,8 @@ static int LoraGatewaySendCmd(struct Adapter *adapter, uint8_t client_id, uint16
|
|||
return -1;
|
||||
}
|
||||
|
||||
PrivSemaphoreAbandon(&gateway_send_cmd_sem);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -410,6 +415,7 @@ static int LoraClientSendData(struct Adapter *adapter, void *send_buf, int lengt
|
|||
return -1;
|
||||
}
|
||||
|
||||
PrivSemaphoreAbandon(&client_send_data_sem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -462,7 +468,7 @@ static int LoraClientDataAnalyze(struct Adapter *adapter, void *send_buf, int le
|
|||
struct timespec abstime;
|
||||
abstime.tv_sec = DEFAULT_SEM_TIMEOUT;
|
||||
|
||||
ret = PrivSemaphoreObtainWait(&adapter->sem, &abstime);
|
||||
ret = PrivSemaphoreObtainWait(&client_recv_cmd_sem, NULL);
|
||||
if (0 == ret) {
|
||||
//only handle this client_id information from gateway
|
||||
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)
|
||||
{
|
||||
int ret = 0;
|
||||
struct timespec abstime;
|
||||
abstime.tv_sec = DEFAULT_SEM_TIMEOUT;
|
||||
|
||||
struct Adapter *lora_adapter = (struct Adapter *)parameter;
|
||||
|
||||
while (1) {
|
||||
#ifdef AS_LORA_GATEWAY_ROLE
|
||||
PrivSemaphoreObtainWait(&gateway_send_cmd_sem, NULL);
|
||||
#endif
|
||||
memset(lora_recv_data, 0, 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) {
|
||||
continue;
|
||||
}
|
||||
|
||||
PrivSemaphoreAbandon(&lora_adapter->sem);
|
||||
#ifdef AS_LORA_CLIENT_ROLE
|
||||
PrivSemaphoreAbandon(&client_recv_cmd_sem);
|
||||
PrivSemaphoreObtainWait(&client_send_data_sem, &abstime);
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -702,7 +716,7 @@ void LoraGatewayProcess(struct Adapter *lora_adapter, struct LoraGatewayParam *g
|
|||
printf("LoraGatewaySendCmd client ID %d error\n", gateway->client_id[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
ret = PrivSemaphoreObtainWait(&gateway_recv_data_sem, &abstime);
|
||||
if (0 == ret) {
|
||||
printf("LoraGatewayProcess receive client %d data done\n", gateway->client_id[i]);
|
||||
|
@ -904,9 +918,13 @@ int AdapterLoraInit(void)
|
|||
adapter->done = product_info->model_done;
|
||||
#endif
|
||||
|
||||
PrivSemaphoreCreate(&adapter->sem, 0, 0);
|
||||
|
||||
#ifdef AS_LORA_GATEWAY_ROLE
|
||||
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);
|
||||
|
||||
|
@ -944,9 +962,9 @@ int AdapterLoraTest(void)
|
|||
PrivTaskStartup(&lora_recv_data_task);
|
||||
|
||||
#ifdef ADD_NUTTX_FEATURES
|
||||
lora_gateway_attr.priority = 19;
|
||||
lora_gateway_attr.priority = 20;
|
||||
#else
|
||||
lora_gateway_attr.schedparam.sched_priority = 19;
|
||||
lora_gateway_attr.schedparam.sched_priority = 20;
|
||||
#endif
|
||||
|
||||
PrivTaskCreate(&lora_gateway_task, &lora_gateway_attr, &LoraGatewayTask, (void *)adapter);
|
||||
|
@ -966,9 +984,9 @@ int AdapterLoraTest(void)
|
|||
PrivTaskStartup(&lora_recv_data_task);
|
||||
|
||||
#ifdef ADD_NUTTX_FEATURES
|
||||
lora_client_attr.priority = 19;
|
||||
lora_client_attr.priority = 20;
|
||||
#else
|
||||
lora_client_attr.schedparam.sched_priority = 19;
|
||||
lora_client_attr.schedparam.sched_priority = 20;
|
||||
#endif
|
||||
|
||||
//create lora client task
|
||||
|
|
|
@ -67,7 +67,7 @@ typedef enum
|
|||
|
||||
struct ControlDevice
|
||||
{
|
||||
char *dev_name;
|
||||
char dev_name[20];
|
||||
int status;
|
||||
|
||||
//to do
|
||||
|
|
|
@ -191,8 +191,8 @@ static uint32 SpiLoraWrite(void *dev, struct BusBlockWriteParam *write_param)
|
|||
KPrintf("SpiLoraWrite ERROR:The message is too long!\n");
|
||||
return ERROR;
|
||||
} else {
|
||||
SX1276SetTxPacket(write_param->buffer, write_param->size);
|
||||
while(SX1276Process() != RF_TX_DONE);
|
||||
SX1276SetTx(write_param->buffer, write_param->size);
|
||||
|
||||
KPrintf("SpiLoraWrite success!\n");
|
||||
}
|
||||
|
||||
|
@ -210,24 +210,12 @@ static uint32 SpiLoraRead(void *dev, struct BusBlockReadParam *read_param)
|
|||
NULL_PARAM_CHECK(dev);
|
||||
NULL_PARAM_CHECK(read_param);
|
||||
|
||||
int read_times = 100;
|
||||
|
||||
SX1276StartRx();
|
||||
KPrintf("SpiLoraRead Ready!\n");
|
||||
|
||||
while (read_times) {
|
||||
if (SX1276Process() != RF_RX_DONE) {
|
||||
read_times --;
|
||||
MdelayKTask(500);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
int ret = SX1276GetRx(read_param->buffer, (uint16 *)&read_param->read_length);
|
||||
|
||||
if (read_times > 0) {
|
||||
SX1276GetRxPacket(read_param->buffer, (uint16 *)&read_param->read_length);
|
||||
} else {
|
||||
read_param->read_length = 0;
|
||||
if (ret < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return read_param->read_length;
|
||||
|
|
|
@ -494,6 +494,7 @@ int HwSpiInit(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef TEST_SPI
|
||||
/*Just for lora test*/
|
||||
static struct Bus *bus;
|
||||
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),
|
||||
TestLoraOpen, TestLoraOpen, open lora device and read parameters);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -50,6 +50,9 @@ uint8_t SX1276Regs[0x70];
|
|||
static bool LoRaOn = true;
|
||||
static bool LoRaOnState = false;
|
||||
|
||||
static int sx1276_tx_sem, sx1276_rx_sem;
|
||||
static int sx1276_radio_task;
|
||||
|
||||
void SX1276Reset(void)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if(LoRaOn == false) {
|
||||
|
@ -277,6 +316,12 @@ void SX1276Init(void)
|
|||
SX1276_SetLoRaOn(LoRaOn);
|
||||
SX1276LoRaInit();
|
||||
#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
|
||||
|
|
|
@ -80,8 +80,12 @@ void SX1276StartRx( void ); //开始接收
|
|||
|
||||
void SX1276GetRxPacket( void *buffer, uint16_t *size ); //得到接收的数据
|
||||
|
||||
int SX1276GetRx(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状态
|
||||
|
||||
void SX1276SetRFState( uint8_t state ); //设置RFLRState状态,RFLRState的值决定了下面的函数处理哪一步的代码
|
||||
|
|
|
@ -16,7 +16,9 @@
|
|||
|
||||
time_t time(time_t *t)
|
||||
{
|
||||
NULL_PARAM_CHECK(t);
|
||||
if (NULL == t) {
|
||||
return 0;
|
||||
}
|
||||
time_t current = 0;
|
||||
|
||||
#ifdef RESOURCES_RTC
|
||||
|
|
Loading…
Reference in New Issue