2025-04-03 15:59:48 +08:00
|
|
|
|
/*
|
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
|
* IAR Development Kits
|
|
|
|
|
|
* on the
|
|
|
|
|
|
*
|
|
|
|
|
|
* M451
|
|
|
|
|
|
*
|
|
|
|
|
|
* Filename : uart_RFGateway.h
|
|
|
|
|
|
* Version : V1.00
|
|
|
|
|
|
* Programmer(s) : Qian Xianghong
|
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
|
* INCLUDE FILES
|
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
|
*/
|
|
|
|
|
|
#include "includes.h"
|
|
|
|
|
|
|
|
|
|
|
|
extern IWDG_HandleTypeDef hiwdg;
|
|
|
|
|
|
|
|
|
|
|
|
const uint8_t RF_APP = RF_APP_AJH;
|
|
|
|
|
|
const uint8_t RF_PROTOCOL_VER = RF_PROTOCOL_VER_1;
|
|
|
|
|
|
|
2025-05-21 14:04:38 +08:00
|
|
|
|
uint8_t RF_UP_CHANNEL = 9; // <20><><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>: 498M
|
|
|
|
|
|
uint8_t RF_DOWN_CHANNEL = 8; // <20><><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>: 499M
|
2025-04-03 15:59:48 +08:00
|
|
|
|
const uint8_t RF_BROADCAST_PSN[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
|
|
|
|
|
const uint8_t RF_EMPTYPSN[6] = {0, 0, 0, 0, 0, 0};
|
|
|
|
|
|
uint8_t RF_GatewayPSN[6] = {0, 0, 0, 0, 0, 0};
|
|
|
|
|
|
#define RF_SelfPSN (dcBuff.configBottle.PSN)
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t RF_MAC_FN = 0;
|
|
|
|
|
|
uint8_t RF_APP_PN = 0;
|
|
|
|
|
|
uint8_t RF_APP_IDX = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD>ա<EFBFBD><D5A1><EFBFBD><EFBFBD><EFBFBD>֡
|
|
|
|
|
|
rf_frame_t RF_Send_Frame, RF_RecvFrame, RF_ProcFrame;
|
|
|
|
|
|
// <20><><EFBFBD>͡<EFBFBD><CDA1>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>м<EFBFBD>¼
|
|
|
|
|
|
rf_send_queue_t RF_Send_Rec, RF_Send_Rec1;
|
|
|
|
|
|
|
|
|
|
|
|
// RF<52><46><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>֡<EFBFBD><D6A1>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
#define RF_TASKM_DATA_COUNT 256
|
|
|
|
|
|
loopbuff_t RF_TaskM;
|
|
|
|
|
|
uint8_t RF_TaskM_Data[sizeof(rf_frame_t) * (RF_TASKM_DATA_COUNT + 1)] = {0};
|
|
|
|
|
|
// <20><>Ƶ<EFBFBD><C6B5>ʼ<EFBFBD><CABC>״̬
|
|
|
|
|
|
uint8_t RF_initStatus = 0;
|
|
|
|
|
|
uint32_t RF_seconds = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// RF<52><46><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD>Ϣ֪ͨ
|
|
|
|
|
|
SemaphoreHandle_t RF_TaskQ = NULL; // <20><>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
SemaphoreHandle_t RF_semAck = NULL; // <20><>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
SemaphoreHandle_t RF_semGateway = NULL; // <20><>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
SemaphoreHandle_t RF_semResp = NULL; // <20><>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// RF<52><46><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>֡<EFBFBD><D6A1>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
#define RF_SENDM_DATA_COUNT 512
|
|
|
|
|
|
loopbuff_t RF_SendM;
|
|
|
|
|
|
uint8_t RF_SendM_Data[sizeof(rf_send_queue_t) * (RF_SENDM_DATA_COUNT + 1)] = {0};
|
|
|
|
|
|
// RF<52><46><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD>Ϣ֪ͨ
|
|
|
|
|
|
SemaphoreHandle_t RF_SendQ = NULL; // <20><>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
loopbuff_t RF_GatewayBuff;
|
|
|
|
|
|
uint8_t RF_GatewayBuff_Data[6 * (4 + 1)] = {0};
|
|
|
|
|
|
loopbuff_t RF_AckBuff;
|
|
|
|
|
|
uint8_t RF_AckBuff_Data[sizeof(rf_ack_t) * (2 + 1)] = {0};
|
|
|
|
|
|
loopbuff_t RF_RespBuff;
|
|
|
|
|
|
uint8_t RF_RespBuff_Data[sizeof(rf_resp_t) * (2 + 1)] = {0};
|
|
|
|
|
|
|
|
|
|
|
|
#define RF_MOD_MD0_1() LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_5)
|
|
|
|
|
|
#define RF_MOD_MD0_0() LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_5)
|
|
|
|
|
|
#define RF_MOD_MD1_1() LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_6)
|
|
|
|
|
|
#define RF_MOD_MD1_0() LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_6)
|
|
|
|
|
|
|
|
|
|
|
|
volatile uint8_t RF_hasPowered = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʽΪx16+x15+x2+1<><31>LSB˳<42><CBB3>
|
|
|
|
|
|
// ͬibutton<6F><6E>crc<72>㷨<EFBFBD><E3B7A8><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>modbus<75><73>crc<72>㷨
|
|
|
|
|
|
uint16_t rf_crc_16(uint8_t *message, int16_t len)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
int16_t i, j;
|
|
|
|
|
|
uint16_t crc_reg = 0;
|
|
|
|
|
|
uint16_t current;
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
current = message[i];
|
|
|
|
|
|
for (j = 0; j < 8; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((crc_reg ^ current) & 0x0001)
|
|
|
|
|
|
crc_reg = (crc_reg >> 1) ^ 0xA001;
|
|
|
|
|
|
else
|
|
|
|
|
|
crc_reg >>= 1;
|
|
|
|
|
|
current >>= 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>˳<EFBFBD><CBB3>
|
|
|
|
|
|
return ((crc_reg & 0xFF) << 8) | ((crc_reg >> 8) & 0xFF);
|
|
|
|
|
|
#else
|
|
|
|
|
|
return MODBUS_RTU_CRC16(message, len);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint32_t rf_get_seconds()
|
|
|
|
|
|
{
|
|
|
|
|
|
S_RTC_TIME_DATA_T sRTC;
|
|
|
|
|
|
|
|
|
|
|
|
RTC_GetDateAndTime(&sRTC);
|
|
|
|
|
|
return Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
|
|
|
|
|
|
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void rf_set_gateway(uint8_t PSN[6])
|
|
|
|
|
|
{
|
|
|
|
|
|
memmove(RF_GatewayPSN, PSN, 6);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void rf_clear_gateway()
|
|
|
|
|
|
{
|
|
|
|
|
|
memmove(RF_GatewayPSN, RF_EMPTYPSN, 6);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6>㴫<EFBFBD><E3B4AB>
|
|
|
|
|
|
uint16_t rf_get_addr(uint8_t PSN[6])
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t addr = rf_crc_16(PSN, 6);
|
|
|
|
|
|
if(addr == 0xFFFF) // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>㲥<EFBFBD><E3B2A5>ַ
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
return addr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
|
|
|
|
|
|
uint8_t rf_phy_valid(rf_frame_t *frame)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(frame->vendor_id != RF_MARK_LS || frame->app_id != RF_APP || frame->protocol_ver != RF_PROTOCOL_VER)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// mac<61><63>У<EFBFBD><D0A3>
|
|
|
|
|
|
uint8_t rf_mac_valid(rf_frame_t *frame, uint8_t dir)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(frame->dir != dir
|
|
|
|
|
|
|| (memcmp(frame->destPSN, RF_SelfPSN, 6) != 0 && (dir == RF_DIR_DOWN || memcmp(frame->destPSN, RF_BROADCAST_PSN, 6) != 0))
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
// mac<61><63>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0>SOF
|
|
|
|
|
|
void RF_SearchSOF(uint8_t *buf, uint16_t fromPos, uint16_t *len)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t i;
|
|
|
|
|
|
|
|
|
|
|
|
for(i = fromPos; i < *len && buf[i] != RF_FRAME_SOF; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
*len -= i;
|
|
|
|
|
|
memmove(buf, buf + i, *len);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>֡
|
|
|
|
|
|
void RF_ParseFrame(uint8_t c)
|
|
|
|
|
|
{
|
|
|
|
|
|
BaseType_t xHigherPriorityTaskWoken;
|
|
|
|
|
|
static uint16_t RdIdx = 0;
|
|
|
|
|
|
uint8_t *RF_ModuleData = (uint8_t *) &RF_RecvFrame;
|
|
|
|
|
|
uint8_t frameOk, frameErr;
|
|
|
|
|
|
|
|
|
|
|
|
if(RdIdx == 0 && c != RF_FRAME_SOF)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
RF_ModuleData[RdIdx++] = c;
|
|
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
frameErr = (RdIdx >= 2 &&
|
|
|
|
|
|
(RF_ModuleData[1] < RF_MIN_FRAME_LEN || RF_ModuleData[1] > RF_MAX_FRAME_LEN));
|
|
|
|
|
|
if(frameErr)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
|
|
|
|
|
|
RF_SearchSOF(RF_ModuleData, 1, &RdIdx);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
frameOk = (RdIdx >= 2 && RF_ModuleData[1] >= RF_MIN_FRAME_LEN && RF_ModuleData[1] <= RF_MAX_FRAME_LEN
|
|
|
|
|
|
&& RdIdx >= RF_ModuleData[1]);
|
|
|
|
|
|
if(frameOk)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(rf_crc_16(RF_ModuleData, RF_ModuleData[1]) == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(rf_phy_valid(&RF_RecvFrame) && rf_mac_valid(&RF_RecvFrame, RF_DIR_UP))
|
|
|
|
|
|
{
|
|
|
|
|
|
LoopBuff_PutItem(&RF_TaskM, RF_ModuleData);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>һ֡
|
|
|
|
|
|
RdIdx -= RF_ModuleData[1];
|
|
|
|
|
|
memmove(RF_ModuleData, RF_ModuleData + RF_ModuleData[1], RdIdx);
|
|
|
|
|
|
// <20><>0<EFBFBD><30>ʼѰ<CABC><D1B0>SOF
|
|
|
|
|
|
RF_SearchSOF(RF_ModuleData, 0, &RdIdx);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
xSemaphoreGiveFromISR(RF_TaskQ, &xHigherPriorityTaskWoken);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
|
|
|
|
|
|
RF_SearchSOF(RF_ModuleData, 1, &RdIdx);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} while(frameOk || frameErr);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void RF_IRQHandler(USART_Handle *huart)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t c = (uint8_t) huart->Instance->DR;
|
|
|
|
|
|
|
|
|
|
|
|
// printf("%02X ", c);
|
|
|
|
|
|
// ֱ<>ӽ<EFBFBD><D3BD><EFBFBD>֡
|
|
|
|
|
|
RF_ParseFrame(c);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ʼ<EFBFBD><CABC>
|
|
|
|
|
|
|
|
|
|
|
|
void RF_Uart_Open(u32 baudrate)
|
|
|
|
|
|
{
|
|
|
|
|
|
LL_USART_InitTypeDef USART_InitStruct = {0};
|
|
|
|
|
|
|
|
|
|
|
|
USART_InitStruct.BaudRate = baudrate;
|
|
|
|
|
|
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
|
|
|
|
|
|
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
|
|
|
|
|
|
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
|
|
|
|
|
|
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
|
|
|
|
|
|
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
|
|
|
|
|
|
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
|
|
|
|
|
|
LL_USART_Init(UART8, &USART_InitStruct);
|
|
|
|
|
|
LL_USART_ConfigAsyncMode(UART8);
|
|
|
|
|
|
LL_USART_Enable(UART8);
|
|
|
|
|
|
|
|
|
|
|
|
huart8.RxISR = RF_IRQHandler;
|
|
|
|
|
|
SET_BIT(UART8->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
|
|
|
|
|
|
LL_USART_Enable(UART8);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void RF_Open()
|
|
|
|
|
|
{
|
|
|
|
|
|
// dcBuff.configBottle.PSN[0] = 0xFE;
|
|
|
|
|
|
// dcBuff.configBottle.PSN[1] = 0xFE;
|
|
|
|
|
|
// dcBuff.configBottle.PSN[2] = 0xFE;
|
|
|
|
|
|
// dcBuff.configBottle.PSN[3] = 0xFE;
|
|
|
|
|
|
// dcBuff.configBottle.PSN[4] = 0xFE;
|
|
|
|
|
|
// dcBuff.configBottle.PSN[5] = 0xFE;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>PSN<53><4E>CRCУ<43><D0A3>ֵ<EFBFBD><D6B5>Ϊα<CEAA><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
srand(rf_crc_16(dcBuff.configBottle.PSN, 6));
|
|
|
|
|
|
|
|
|
|
|
|
RF_MAC_FN = rand() % 256;
|
|
|
|
|
|
RF_APP_PN = rand() % 256;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|
|
|
|
|
LoopBuff_Create(&RF_GatewayBuff, 6, 4, 0, (uint32_t) RF_GatewayBuff_Data);
|
|
|
|
|
|
LoopBuff_Create(&RF_AckBuff, sizeof(rf_ack_t), 2, 0, (uint32_t) RF_AckBuff_Data);
|
|
|
|
|
|
LoopBuff_Create(&RF_RespBuff, sizeof(rf_resp_t), 2, 0, (uint32_t) RF_RespBuff_Data);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|
|
|
|
|
LoopBuff_Create(&RF_TaskM, sizeof(rf_frame_t), RF_TASKM_DATA_COUNT, 0, (uint32_t) RF_TaskM_Data);
|
|
|
|
|
|
LoopBuff_Create(&RF_SendM, sizeof(rf_send_queue_t), RF_SENDM_DATA_COUNT, 0, (uint32_t) RF_SendM_Data);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
|
|
|
|
|
|
RF_TaskQ = xSemaphoreCreateBinary();
|
|
|
|
|
|
RF_SendQ = xSemaphoreCreateBinary();
|
|
|
|
|
|
RF_semAck = xSemaphoreCreateBinary();
|
|
|
|
|
|
RF_semGateway = xSemaphoreCreateBinary();
|
|
|
|
|
|
RF_semResp = xSemaphoreCreateBinary();
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
/* Init UART */
|
|
|
|
|
|
/*---------------------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
// ģ<><C4A3><EFBFBD>ϵ磬<CFB5><E7A3AC><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
RF_PowerOn();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ʼ<EFBFBD><CABC>֡
|
|
|
|
|
|
void rf_initial_frame(rf_frame_t *frame)
|
|
|
|
|
|
{
|
|
|
|
|
|
memset((uint8_t *) frame, 0, sizeof(rf_frame_t));
|
|
|
|
|
|
frame->len = RF_MIN_FRAME_LEN;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint8_t rf_append_payload(rf_frame_t *frame, uint8_t payload_len, uint8_t *payload)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(frame->len < RF_MIN_FRAME_LEN || frame->len + payload_len > RF_MAX_FRAME_LEN)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
if(payload_len > 0)
|
|
|
|
|
|
memmove(frame->app_payload + (frame->len - RF_MIN_FRAME_LEN), payload, payload_len);
|
|
|
|
|
|
frame->len += payload_len;
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
uint8_t rf_uart_send(rf_frame_t *frame)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t phy_header[3];
|
|
|
|
|
|
uint16_t crc;
|
|
|
|
|
|
uint16_t dst;
|
|
|
|
|
|
uint8_t i;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
|
|
|
|
|
|
frame->sof = RF_FRAME_SOF;
|
|
|
|
|
|
frame->vendor_id = RF_MARK_LS;
|
|
|
|
|
|
frame->app_id = RF_APP;
|
|
|
|
|
|
frame->protocol_ver = RF_PROTOCOL_VER;
|
|
|
|
|
|
memmove(frame->srcPSN, RF_SelfPSN, 6);
|
|
|
|
|
|
crc = rf_crc_16((uint8_t *) frame, frame->len - 2);
|
|
|
|
|
|
((uint8_t *) frame)[frame->len - 2] = crc >> 8;
|
|
|
|
|
|
((uint8_t *) frame)[frame->len - 1] = crc & 0xFF;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD>ĵ<EFBFBD>ַ
|
|
|
|
|
|
if(frame->dir == RF_DIR_UP)
|
|
|
|
|
|
dst = rf_get_addr((uint8_t *) RF_BROADCAST_PSN);
|
|
|
|
|
|
else
|
|
|
|
|
|
dst = rf_get_addr(frame->destPSN);
|
|
|
|
|
|
#if 0
|
2025-05-21 14:04:38 +08:00
|
|
|
|
// phy_header[0] = dst >> 8;
|
|
|
|
|
|
// phy_header[1] = dst & 0xFF;
|
|
|
|
|
|
// // <20>ŵ<EFBFBD>
|
|
|
|
|
|
// if(frame->dir == RF_DIR_UP)
|
|
|
|
|
|
// phy_header[2] = RF_UP_CHANNEL;
|
|
|
|
|
|
// else
|
|
|
|
|
|
// phy_header[2] = RF_DOWN_CHANNEL;
|
|
|
|
|
|
|
|
|
|
|
|
//// while(!RF_READY());
|
|
|
|
|
|
|
|
|
|
|
|
//// delay_ms((rand() % 10) * (70 + rand() % 20)); // <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ
|
|
|
|
|
|
// delay_ms((rand() % 3) * (10 + rand() % 10)); // <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|
|
|
|
|
//
|
|
|
|
|
|
// printf("\nRF send to Module (%02X %02X %02X, %d bytes):\n",
|
|
|
|
|
|
// phy_header[0], phy_header[1], phy_header[2], frame->len);
|
|
|
|
|
|
// for(i = 0; i < frame->len; i++)
|
|
|
|
|
|
// printf(" %02X", ((uint8_t *) frame)[i]);
|
|
|
|
|
|
// printf("\n");
|
|
|
|
|
|
//
|
|
|
|
|
|
// // <20><><EFBFBD>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
// // <20><>Ϊ<EFBFBD><CEAA>Ƶģ<C6B5><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>жϳ<D0B6><CFB3><EFBFBD>3<EFBFBD><33><EFBFBD>ֽڵ<D6BD>ʱ<EFBFBD>䣬<EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>
|
|
|
|
|
|
// __disable_irq();
|
|
|
|
|
|
// UART_Transmit(&huart8, phy_header, 3);
|
|
|
|
|
|
// UART_Transmit(&huart8, (uint8_t *) frame, frame->len);
|
|
|
|
|
|
// __enable_irq();
|
2025-04-03 15:59:48 +08:00
|
|
|
|
#else
|
|
|
|
|
|
// <20>ŵ<EFBFBD>
|
2025-05-21 14:04:38 +08:00
|
|
|
|
// if(frame->dir == RF_DIR_UP)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// phy_header[0] = (dcBuff.configBottle.lora_freq%3)*2+7;//RF_UP_CHANNEL;
|
|
|
|
|
|
// phy_header[1] = (dcBuff.configBottle.lora_freq%3)*2+6;//RF_DOWN_CHANNEL;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {}
|
|
|
|
|
|
phy_header[0] = (dcBuff.configBottle.lora_freq%3)*2+7;//RF_DOWN_CHANNEL;
|
|
|
|
|
|
phy_header[1] = (dcBuff.configBottle.lora_freq%3)*2+6;//RF_UP_CHANNEL;
|
|
|
|
|
|
|
2025-04-03 15:59:48 +08:00
|
|
|
|
|
|
|
|
|
|
// while(!RF_READY());
|
|
|
|
|
|
|
|
|
|
|
|
// delay_ms((rand() % 10) * (70 + rand() % 20)); // <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ
|
|
|
|
|
|
delay_ms((rand() % 3) * (10 + rand() % 10)); // <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|
|
|
|
|
|
|
|
|
|
|
printf("\nRF send to Module (%02X, %d bytes):\n",
|
|
|
|
|
|
phy_header[0], frame->len);
|
|
|
|
|
|
for(i = 0; i < frame->len; i++)
|
|
|
|
|
|
printf(" %02X", ((uint8_t *) frame)[i]);
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
// <20><>Ϊ<EFBFBD><CEAA>Ƶģ<C6B5><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>жϳ<D0B6><CFB3><EFBFBD>3<EFBFBD><33><EFBFBD>ֽڵ<D6BD>ʱ<EFBFBD>䣬<EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>
|
|
|
|
|
|
__disable_irq();
|
2025-05-21 14:04:38 +08:00
|
|
|
|
UART_Transmit(&huart8, phy_header, 2);
|
2025-04-03 15:59:48 +08:00
|
|
|
|
UART_Transmit(&huart8, (uint8_t *) frame, frame->len);
|
|
|
|
|
|
__enable_irq();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// mac<61>㷢<EFBFBD><E3B7A2>: ACK
|
|
|
|
|
|
uint8_t rf_mac_send_ack(uint8_t oriDir, uint8_t oriMac_fn, uint8_t oriPSN[6])
|
|
|
|
|
|
{
|
|
|
|
|
|
rf_initial_frame(&RF_Send_Frame);
|
|
|
|
|
|
|
|
|
|
|
|
if(oriDir == RF_DIR_UP)
|
|
|
|
|
|
RF_Send_Frame.dir = RF_DIR_DOWN;
|
|
|
|
|
|
else
|
|
|
|
|
|
RF_Send_Frame.dir = RF_DIR_UP;
|
|
|
|
|
|
RF_Send_Frame.mac_type = RF_MAC_TYPE_ACK;
|
|
|
|
|
|
RF_Send_Frame.mac_ack_req = 0;
|
|
|
|
|
|
RF_Send_Frame.mac_fn = oriMac_fn;
|
|
|
|
|
|
memmove(RF_Send_Frame.destPSN, oriPSN, 6);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
return rf_uart_send(&RF_Send_Frame);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// mac<61>㷢<EFBFBD><E3B7A2>: <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint8_t rf_mac_send_data(rf_frame_t *frame, uint8_t dir, uint8_t fn, uint8_t destPSN[6])
|
|
|
|
|
|
{
|
|
|
|
|
|
rf_ack_t ack;
|
|
|
|
|
|
uint32_t stop_seconds;
|
|
|
|
|
|
uint8_t count;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
|
|
|
|
|
xSemaphoreTake(RF_semAck, 10);
|
|
|
|
|
|
LoopBuff_Clear(&RF_AckBuff);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>
|
|
|
|
|
|
frame->dir = dir;
|
|
|
|
|
|
frame->mac_type = RF_MAC_TYPE_DATA;
|
|
|
|
|
|
if(frame->dir == RF_DIR_UP && frame->net_type == RF_NET_TYPE_DATA)
|
|
|
|
|
|
frame->mac_ack_req = 1;
|
|
|
|
|
|
else
|
|
|
|
|
|
frame->mac_ack_req = 0;
|
|
|
|
|
|
frame->mac_fn = RF_MAC_FN;
|
|
|
|
|
|
memmove(frame->destPSN, destPSN, 6);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
if(!rf_uart_send(frame))
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ACKȷ<4B><C8B7>
|
|
|
|
|
|
if(!frame->mac_ack_req)
|
|
|
|
|
|
{
|
|
|
|
|
|
RF_MAC_FN++;
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ȴ<EFBFBD>ACKȷ<4B><C8B7>
|
|
|
|
|
|
stop_seconds = rf_get_seconds() + 3;
|
|
|
|
|
|
while(rf_get_seconds() < stop_seconds)
|
|
|
|
|
|
{
|
|
|
|
|
|
xSemaphoreTake(RF_semAck, 500);
|
|
|
|
|
|
count = LoopBuff_GetCount(&RF_AckBuff);
|
|
|
|
|
|
while(count--)
|
|
|
|
|
|
{
|
|
|
|
|
|
memmove(&ack, LoopBuff_GetDataPtr(&RF_AckBuff, RF_AckBuff.info.rdPtr), sizeof(ack));
|
|
|
|
|
|
LoopBuff_RemoveItems(&RF_AckBuff, 1);
|
|
|
|
|
|
if(ack.mac_fn == RF_MAC_FN && memcmp(ack.srcPSN, destPSN, 6) == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
RF_MAC_FN++;
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// net<65>㷢<EFBFBD>ͣ<EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD>м<EFBFBD><D0BC><EFBFBD>
|
|
|
|
|
|
uint8_t rf_net_send_find_relay()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
|
|
|
|
|
xSemaphoreTake(RF_semGateway, 10);
|
|
|
|
|
|
LoopBuff_Clear(&RF_GatewayBuff);
|
|
|
|
|
|
|
|
|
|
|
|
rf_initial_frame(&RF_Send_Frame);
|
|
|
|
|
|
|
|
|
|
|
|
RF_Send_Frame.net_type = RF_NET_TYPE_FIND_RELAY;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>mac<61>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
return rf_mac_send_data(&RF_Send_Frame, RF_DIR_UP, RF_MAC_TYPE_DATA, (uint8_t *) RF_BROADCAST_PSN);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// net<65>㷢<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>Ӧ<EFBFBD>м<EFBFBD><D0BC><EFBFBD>
|
|
|
|
|
|
uint8_t rf_net_send_resp_relay(uint8_t oriPSN[6])
|
|
|
|
|
|
{
|
|
|
|
|
|
rf_initial_frame(&RF_Send_Frame);
|
|
|
|
|
|
|
|
|
|
|
|
RF_Send_Frame.net_type = RF_NET_TYPE_RESP_RELAY;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>mac<61>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
return rf_mac_send_data(&RF_Send_Frame, RF_DIR_DOWN, RF_MAC_TYPE_DATA, oriPSN);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// net<65>㷢<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint8_t rf_net_send_data(rf_frame_t *frame, uint8_t dir, uint8_t destPSN[6])
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ò<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
frame->net_type = RF_NET_TYPE_DATA;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>mac<61>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
return rf_mac_send_data(frame, dir, RF_MAC_TYPE_DATA, destPSN);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Ӧ<>ò㷢<C3B2>ͣ<EFBFBD><CDA3><EFBFBD>Ӧ
|
|
|
|
|
|
uint8_t rf_app_send_resp(uint8_t oriPSN[6], uint8_t oriApp_pn, uint8_t payload_len, uint8_t *payload)
|
|
|
|
|
|
{
|
|
|
|
|
|
rf_initial_frame(&RF_Send_Frame);
|
|
|
|
|
|
rf_append_payload(&RF_Send_Frame, payload_len, payload);
|
|
|
|
|
|
|
|
|
|
|
|
RF_Send_Frame.app_pn = oriApp_pn;
|
|
|
|
|
|
RF_Send_Frame.app_idx = 0; // <20>ݲ<EFBFBD>ʵ<EFBFBD>ְַ<D6B7><D6B0><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
RF_Send_Frame.app_tbc = 0;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>net<65>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
return rf_net_send_data(&RF_Send_Frame, RF_DIR_DOWN, oriPSN);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Ӧ<>ò㷢<C3B2>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint8_t rf_app_send_data(uint8_t payload_len, uint8_t *payload)
|
|
|
|
|
|
{
|
|
|
|
|
|
rf_resp_t resp;
|
|
|
|
|
|
uint32_t stop_seconds;
|
|
|
|
|
|
uint8_t count;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
|
|
|
|
|
xSemaphoreTake(RF_semResp, 10);
|
|
|
|
|
|
LoopBuff_Clear(&RF_RespBuff);
|
|
|
|
|
|
|
|
|
|
|
|
rf_initial_frame(&RF_Send_Frame);
|
|
|
|
|
|
rf_append_payload(&RF_Send_Frame, payload_len, payload);
|
|
|
|
|
|
|
|
|
|
|
|
RF_Send_Frame.app_pn = RF_APP_PN;
|
|
|
|
|
|
RF_Send_Frame.app_idx = 0; // <20>ݲ<EFBFBD>ʵ<EFBFBD>ְַ<D6B7><D6B0><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
RF_Send_Frame.app_tbc = 0;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>net<65>㷢<EFBFBD><E3B7A2>
|
|
|
|
|
|
if(rf_net_send_data(&RF_Send_Frame, RF_DIR_UP, RF_GatewayPSN) == 0)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>15<31><35>
|
|
|
|
|
|
stop_seconds = rf_get_seconds() + 15;
|
|
|
|
|
|
while(rf_get_seconds() < stop_seconds)
|
|
|
|
|
|
{
|
|
|
|
|
|
xSemaphoreTake(RF_semResp, 500);
|
|
|
|
|
|
count = LoopBuff_GetCount(&RF_RespBuff);
|
|
|
|
|
|
while(count--)
|
|
|
|
|
|
{
|
|
|
|
|
|
memmove(&resp, LoopBuff_GetDataPtr(&RF_RespBuff, RF_RespBuff.info.rdPtr), sizeof(resp));
|
|
|
|
|
|
LoopBuff_RemoveItems(&RF_RespBuff, 1);
|
|
|
|
|
|
if(resp.app_pn == RF_APP_PN && memcmp(resp.srcPSN, RF_GatewayPSN, 6) == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
// print app_payload
|
|
|
|
|
|
RF_APP_PN++;
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ն<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ<EFBFBD><D3A6>
|
|
|
|
|
|
// <20><>Ѱ5<D1B0>Σ<EFBFBD>ȡ<EFBFBD><C8A1>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊͨ<CEAA><CDA8><EFBFBD><EFBFBD><EFBFBD>ء<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint8_t rf_check_gateway()
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t PSN_List[10][6]; // <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PSN<53>б<EFBFBD>
|
|
|
|
|
|
uint8_t CNT_List[10]; // <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|
|
|
|
|
uint8_t PSN[6];
|
|
|
|
|
|
uint32_t stop_seconds;
|
|
|
|
|
|
uint8_t i, j, k;
|
|
|
|
|
|
uint8_t count;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>
|
|
|
|
|
|
if(memcmp(RF_GatewayPSN, RF_EMPTYPSN, 6) != 0)
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
memset(PSN_List, 0, sizeof(PSN_List));
|
|
|
|
|
|
memset(CNT_List, 0, sizeof(CNT_List));
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>Ѱ5<D1B0><35>
|
|
|
|
|
|
for(i = 0; i < 5; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>
|
|
|
|
|
|
rf_net_send_find_relay();
|
|
|
|
|
|
// 5<><35><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ػ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ֹͣ<CDA3>ȴ<EFBFBD>
|
|
|
|
|
|
stop_seconds = rf_get_seconds() + 5;
|
|
|
|
|
|
while(rf_get_seconds() <= stop_seconds)
|
|
|
|
|
|
{
|
|
|
|
|
|
count = LoopBuff_GetCount(&RF_GatewayBuff);
|
|
|
|
|
|
while(count--)
|
|
|
|
|
|
{
|
|
|
|
|
|
memmove(PSN, LoopBuff_GetDataPtr(&RF_GatewayBuff, RF_GatewayBuff.info.rdPtr), 6);
|
|
|
|
|
|
LoopBuff_RemoveItems(&RF_GatewayBuff, 1);
|
|
|
|
|
|
|
|
|
|
|
|
for(j = 0; j < 10; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ҵ<EFBFBD><D2B5><EFBFBD>PSN<53><4E><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>ߵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
if(memcmp(PSN_List[j], PSN, 6) == 0 || CNT_List[j] == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
memmove(PSN_List[j], PSN, 6);
|
|
|
|
|
|
CNT_List[j]++;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
// û<><C3BB>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20>ӳٵȴ<D9B5>3<EFBFBD><33>
|
|
|
|
|
|
stop_seconds = rf_get_seconds() + 3;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ʹ<><CAB9><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
|
k = 0;
|
|
|
|
|
|
i = CNT_List[0];
|
|
|
|
|
|
for(j = 1; j < 10; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(CNT_List[j] > i)
|
|
|
|
|
|
{
|
|
|
|
|
|
k = j;
|
|
|
|
|
|
i = CNT_List[j];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(i == 0)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
rf_set_gateway(PSN_List[k]);
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ģ<><C4A3><EFBFBD>ϵ磬<CFB5><E7A3AC><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void RF_PowerOn()
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t recv_cnt = 0;
|
|
|
|
|
|
uint32_t stop_seconds;
|
|
|
|
|
|
char last_c = 0, c;
|
|
|
|
|
|
uint8_t cfg[6];
|
|
|
|
|
|
uint16_t addr = rf_get_addr((uint8_t *) RF_BROADCAST_PSN);
|
|
|
|
|
|
|
|
|
|
|
|
if(RF_hasPowered)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
printf("\nRF power on ...\n");
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>Ϊ9600bps
|
|
|
|
|
|
LL_USART_Disable(huart8.Instance);
|
|
|
|
|
|
RF_Uart_Open(9600);
|
|
|
|
|
|
NVIC_DisableIRQ(UART8_IRQn);
|
|
|
|
|
|
|
|
|
|
|
|
VCC_RF_ON();
|
|
|
|
|
|
delay_ms(500);
|
|
|
|
|
|
|
|
|
|
|
|
// while(!RF_READY());
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ģʽ3
|
|
|
|
|
|
RF_MOD_MD1_1();
|
|
|
|
|
|
RF_MOD_MD0_1();
|
|
|
|
|
|
delay_ms(50);
|
|
|
|
|
|
|
|
|
|
|
|
cfg[0] = 0xC2; // <20><><EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>粻<EFBFBD><E7B2BB><EFBFBD>棬ÿ<E6A3AC><C3BF><EFBFBD>ϵ綼<CFB5><E7B6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
cfg[1] = addr >> 8;
|
|
|
|
|
|
cfg[2] = addr & 0xFF;
|
|
|
|
|
|
cfg[3] = 6 | (7 << 3) | (0 << 6); // 115200bps
|
2025-05-21 14:04:38 +08:00
|
|
|
|
cfg[4] = (dcBuff.configBottle.lora_freq%3)*2+6;//RF_UP_CHANNEL;
|
2025-04-03 15:59:48 +08:00
|
|
|
|
cfg[5] = 1 | (1 << 2) | (9 << 3) | (0 << 7); // freqcast=1, bw=500kHz, unicast=0
|
|
|
|
|
|
|
|
|
|
|
|
printf("\nInitialize RF Module: %02X %02X %02X %02X %02X %02X\n",
|
|
|
|
|
|
cfg[0], cfg[1], cfg[2], cfg[3], cfg[4], cfg[5]);
|
|
|
|
|
|
|
|
|
|
|
|
UART_Transmit(&huart8, cfg, 6);
|
|
|
|
|
|
stop_seconds = rf_get_seconds() + 2;
|
|
|
|
|
|
while(rf_get_seconds() < stop_seconds)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(huart8.Instance->SR & USART_SR_RXNE)
|
|
|
|
|
|
{
|
|
|
|
|
|
c = huart8.Instance->DR;
|
|
|
|
|
|
printf("%c", c);
|
|
|
|
|
|
if(c == 'K' && last_c == 'O')
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
RF_initStatus = 1;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
last_c = c;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>빤<EFBFBD><EBB9A4>ģʽ<C4A3><CABD>ģʽ0
|
|
|
|
|
|
RF_MOD_MD1_0();
|
|
|
|
|
|
RF_MOD_MD0_0();
|
|
|
|
|
|
delay_ms(50);
|
|
|
|
|
|
|
|
|
|
|
|
// while(!RF_READY());
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>Ϊ115200bps
|
|
|
|
|
|
LL_USART_Disable(huart8.Instance);
|
|
|
|
|
|
RF_Uart_Open(115200ul);
|
|
|
|
|
|
NVIC_EnableIRQ(UART8_IRQn);
|
|
|
|
|
|
|
|
|
|
|
|
RF_hasPowered = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void RF_PowerOff()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!RF_hasPowered)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
RF_hasPowered = 0;
|
|
|
|
|
|
|
|
|
|
|
|
printf("\nRF power off ...\n");
|
|
|
|
|
|
VCC_RF_OFF();
|
|
|
|
|
|
delay_ms(200);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壺<EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
|
|
|
|
|
|
void RF_GatewayTask(void *p_arg)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t count;
|
|
|
|
|
|
uint16_t i;
|
|
|
|
|
|
uint32_t seconds;
|
|
|
|
|
|
uint8_t oldRequest, incCount, newPSN;
|
|
|
|
|
|
int16_t idx;
|
|
|
|
|
|
ext_bottle_t bottleRec;
|
|
|
|
|
|
|
|
|
|
|
|
while(TRUE)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>õ<EFBFBD>ִ<EFBFBD>У<EFBFBD>
|
|
|
|
|
|
xSemaphoreTake(RF_TaskQ, 0);
|
|
|
|
|
|
|
|
|
|
|
|
count = LoopBuff_GetCount(&RF_TaskM);
|
|
|
|
|
|
while(count--)
|
|
|
|
|
|
{
|
|
|
|
|
|
// ȡ<><C8A1>֡
|
|
|
|
|
|
RF_ProcFrame = *(rf_frame_t *) LoopBuff_GetDataPtr(&RF_TaskM, RF_TaskM.info.rdPtr);
|
|
|
|
|
|
LoopBuff_RemoveItems(&RF_TaskM, 1);
|
|
|
|
|
|
|
|
|
|
|
|
printf("\nRF recv from Module (%d bytes):\n", RF_ProcFrame.len);
|
|
|
|
|
|
for(i = 0; i < RF_ProcFrame.len; i++)
|
|
|
|
|
|
printf(" %02X", ((uint8_t *) &RF_ProcFrame)[i]);
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
|
|
seconds = rf_get_seconds();
|
|
|
|
|
|
RF_seconds = seconds;
|
|
|
|
|
|
|
|
|
|
|
|
// δ<><CEB4>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD>ܴ洢<DCB4><E6B4A2>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD>Ӧ<EFBFBD><D3A6>
|
|
|
|
|
|
if(RTC_offsetSeconds == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("\nRTC_offsetSeconds = 0, ignored ...\n");
|
2025-05-21 14:04:38 +08:00
|
|
|
|
//apex continue;
|
2025-04-03 15:59:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>֡
|
2025-05-21 14:04:38 +08:00
|
|
|
|
idx = Ext_Lookup_Bottle_PSN(RF_ProcFrame.srcPSN, bottleCnt.count);
|
|
|
|
|
|
if(idx == -1) continue;
|
2025-04-03 15:59:48 +08:00
|
|
|
|
// <20>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>Ӧack
|
|
|
|
|
|
if(RF_ProcFrame.mac_ack_req)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>֡
|
|
|
|
|
|
RF_Send_Rec.type = 0;
|
|
|
|
|
|
memmove(RF_Send_Rec.oriPSN, RF_ProcFrame.srcPSN, 6);
|
|
|
|
|
|
RF_Send_Rec.fn_pn = RF_ProcFrame.mac_fn;
|
|
|
|
|
|
// ͳһ<CDB3>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
|
|
|
|
|
LoopBuff_PutItem(&RF_SendM, (uint8_t *) &RF_Send_Rec);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
xSemaphoreGive(RF_SendQ);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(RF_ProcFrame.net_type == RF_NET_TYPE_FIND_RELAY)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>Ӧ<EFBFBD><D3A6>֡
|
|
|
|
|
|
RF_Send_Rec.type = 1;
|
|
|
|
|
|
memmove(RF_Send_Rec.oriPSN, RF_ProcFrame.srcPSN, 6);
|
|
|
|
|
|
RF_Send_Rec.fn_pn = RF_ProcFrame.app_pn;
|
|
|
|
|
|
// ͳһ<CDB3>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
|
|
|
|
|
LoopBuff_PutItem(&RF_SendM, (uint8_t *) &RF_Send_Rec);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
xSemaphoreGive(RF_SendQ);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(RF_ProcFrame.net_type == RF_NET_TYPE_DATA)
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("\n*** PSN: 20%02d%02d%02d%02d%03d ***, ",
|
|
|
|
|
|
RF_ProcFrame.srcPSN[0], RF_ProcFrame.srcPSN[1], RF_ProcFrame.srcPSN[2], RF_ProcFrame.srcPSN[3],
|
|
|
|
|
|
(RF_ProcFrame.srcPSN[4] << 8) | RF_ProcFrame.srcPSN[5]);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Ҳ<EFBFBD>ά<EFBFBD><CEAC><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>״̬
|
|
|
|
|
|
oldRequest = 0;
|
|
|
|
|
|
incCount = 0;
|
|
|
|
|
|
newPSN = 1;
|
|
|
|
|
|
|
2025-05-21 14:04:38 +08:00
|
|
|
|
// idx = Ext_Lookup_Bottle_PSN(RF_ProcFrame.srcPSN, bottleCnt.count);
|
2025-04-03 15:59:48 +08:00
|
|
|
|
if(idx >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
newPSN = 0; // <20><><EFBFBD><EFBFBD>PSN
|
|
|
|
|
|
FRAM_BufferRead(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * bottlePSN[idx].recNo, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
|
|
|
|
|
|
oldRequest = (bottleRec.pn == RF_ProcFrame.app_pn && RTC_offsetSeconds + seconds < bottleRec.recvTime + 72 * 3600);
|
|
|
|
|
|
}
|
|
|
|
|
|
if(idx == -1 && bottleCnt.count < FRAM_BOTTLE_COUNT)
|
|
|
|
|
|
{
|
|
|
|
|
|
incCount = 1; // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>PSN
|
|
|
|
|
|
idx = bottleCnt.count;
|
|
|
|
|
|
bottlePSN[idx].recNo = idx;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(idx == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
for(i = 0; i < FRAM_BOTTLE_COUNT; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
FRAM_BufferRead(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * bottlePSN[i].recNo, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
|
|
|
|
|
|
if(bottleRec.lastData == -1) // ȡ<><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD>ݵ<EFBFBD>PSN
|
|
|
|
|
|
{
|
|
|
|
|
|
idx = i;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(idx >= 0)
|
|
|
|
|
|
{
|
2025-05-21 14:04:38 +08:00
|
|
|
|
// <20>Ĵ<DEB8><C4B4><EFBFBD><DEB5><EFBFBD>
|
2025-04-03 15:59:48 +08:00
|
|
|
|
if(incCount || newPSN)
|
|
|
|
|
|
{
|
|
|
|
|
|
memset(&bottleRec, 0, sizeof(ext_bottle_t));
|
|
|
|
|
|
bottleRec.lastData = -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
memmove(bottleRec.PSN, RF_ProcFrame.srcPSN, 6);
|
|
|
|
|
|
bottleRec.pn = RF_ProcFrame.app_pn;
|
|
|
|
|
|
bottleRec.recvTime = RTC_offsetSeconds + seconds;
|
|
|
|
|
|
FRAM_BufferWrite(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * bottlePSN[idx].recNo, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
|
|
|
|
|
|
// <20><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(incCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
bottleCnt.count++;
|
|
|
|
|
|
FRAM_SaveInfo(FRAM_BOTTLE_INFO_BASE, (uint8_t *) &bottleCnt, sizeof(ext_count_t));
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(incCount || newPSN)
|
|
|
|
|
|
{
|
|
|
|
|
|
memmove(bottlePSN[idx].PSN, bottleRec.PSN, 6);
|
|
|
|
|
|
Ext_Sort_Bottle_PSN(bottlePSN, 0, bottleCnt.count - 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(!oldRequest) // <20>½ڵ<C2BD><DAB5><EFBFBD><EFBFBD>¼<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>Ҫת<D2AA><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("\nNew request, add to queue\n");
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ӵ<EFBFBD><D3B5>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
memmove(Ext_Data_Rec.oriPSN, RF_ProcFrame.srcPSN, 6);
|
|
|
|
|
|
Ext_Data_Rec.payload_len = RF_ProcFrame.len - RF_MIN_FRAME_LEN;
|
|
|
|
|
|
memmove(Ext_Data_Rec.payload, RF_ProcFrame.app_payload, Ext_Data_Rec.payload_len);
|
|
|
|
|
|
Ext_Data_Rec.recvTime = RTC_offsetSeconds + seconds;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ӵ<EFBFBD><D3B5>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Data_PutToQueue(&Ext_Data_Rec);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>¼<EFBFBD>浽flash<73>
|
|
|
|
|
|
RF_Send_Rec.type = 2;
|
|
|
|
|
|
memmove(RF_Send_Rec.oriPSN, RF_ProcFrame.srcPSN, 6);
|
|
|
|
|
|
RF_Send_Rec.fn_pn = RF_ProcFrame.app_pn;
|
|
|
|
|
|
RF_Send_Rec.payload_len = 2;
|
|
|
|
|
|
RF_Send_Rec.payload[0] = 0xFF;
|
|
|
|
|
|
RF_Send_Rec.payload[1] = 0xFF;
|
|
|
|
|
|
// ͳһ<CDB3>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
|
|
|
|
|
LoopBuff_PutItem(&RF_SendM, (uint8_t *) &RF_Send_Rec);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
xSemaphoreGive(RF_SendQ);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壺<EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>֡
|
|
|
|
|
|
void RF_TranTask(void *p_arg)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint32_t stop_seconds;
|
|
|
|
|
|
uint16_t i;
|
|
|
|
|
|
uint32_t checkTick = 30000;
|
|
|
|
|
|
static int Ethernet_fail_count = 0;
|
|
|
|
|
|
S_RTC_TIME_DATA_T sRTC;
|
|
|
|
|
|
|
|
|
|
|
|
while(TRUE)
|
|
|
|
|
|
{
|
|
|
|
|
|
// ÿ30<33><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(IsTickOut(checkTick))
|
|
|
|
|
|
{
|
|
|
|
|
|
checkTick = GetDelayTick(30000);
|
|
|
|
|
|
|
|
|
|
|
|
Ethernet_connected = IS_VCC_ETHERNET_ON() && Ethernet_IsConnected();
|
|
|
|
|
|
if(IS_VCC_ETHERNET_ON() && !Ethernet_connected)
|
|
|
|
|
|
Ethernet_fail_count++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>4G<34><47><EFBFBD>ȣ<EFBFBD>4G<34><47><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7>ͣ<EFBFBD>
|
|
|
|
|
|
if(xSemaphoreTake(RF_TranLock, 500) != pdTRUE)
|
|
|
|
|
|
{
|
|
|
|
|
|
VCC_ETHERNET_OFF();
|
|
|
|
|
|
Ethernet_connected = 0;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// // <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>飨<EFBFBD><E9A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ˴<CAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// if(Ethernet_fail_count >= 6)
|
|
|
|
|
|
// VCC_ETHERNET_OFF();
|
|
|
|
|
|
if(!IS_VCC_ETHERNET_ON())
|
|
|
|
|
|
{
|
|
|
|
|
|
Ethernet_fail_count = 0;
|
|
|
|
|
|
Ethernet_Config();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ȡ<EFBFBD><C8A1>UTCʱ<43>䣬<EFBFBD><E4A3AC>ת<EFBFBD><D7AA>
|
|
|
|
|
|
if(RTC_offsetSeconds > 0 && LoopBuff_GetCount(&RF_TranM) > 0 && Ethernet_connected)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!SFlash_LoadInfo(LoopBuff_GetDataPos(&RF_TranM, RF_TranM.info.rdPtr), (uint8_t *) &Ext_Data_Rec1, sizeof(ext_data_t)))
|
|
|
|
|
|
{
|
|
|
|
|
|
LoopBuff_RemoveItems(&RF_TranM, 1);
|
|
|
|
|
|
// <20><><EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD><EFBFBD>
|
|
|
|
|
|
FRAM_SaveInfo(RF_TranM.info_base, (uint8_t *) &RF_TranM.info, sizeof(RF_TranM.info));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
i = pack_gprs_tran_data(&Ext_Data_Rec1, 0);
|
|
|
|
|
|
|
|
|
|
|
|
delay_ms(20);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
LoopBuff_Clear(&Ethernet_Buff);
|
|
|
|
|
|
} while(xSemaphoreTake(Ethernet_semQ, 100) == pdTRUE || LoopBuff_GetCount(&Ethernet_Buff) > 0);
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
printf("\nEthernet send to server\n");
|
|
|
|
|
|
UART_Transmit(&huart3, Task_sendBuff, i);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>Ԥ<EFBFBD>跢<EFBFBD><E8B7A2>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>Է<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
Ethernet_fail_count++;
|
|
|
|
|
|
|
|
|
|
|
|
stop_seconds = rf_get_seconds() + 6;
|
|
|
|
|
|
while(rf_get_seconds() < stop_seconds)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>õ<EFBFBD>ִ<EFBFBD>У<EFBFBD>
|
|
|
|
|
|
xSemaphoreTake(Ethernet_semQ, 500);
|
|
|
|
|
|
if(LoopBuff_GetCount(&Ethernet_Buff) >= 2) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("\nResponse from server:");
|
|
|
|
|
|
while(LoopBuff_GetCount(&Ethernet_Buff) > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
printf(" %02X", *LoopBuff_GetDataPtr(&Ethernet_Buff, Ethernet_Buff.info.rdPtr));
|
|
|
|
|
|
LoopBuff_RemoveItems(&Ethernet_Buff, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ͳɹ<CDB3><C9B9><EFBFBD>ʧ<EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Ethernet_connected = IS_VCC_ETHERNET_ON();
|
|
|
|
|
|
Ethernet_fail_count = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>¼
|
|
|
|
|
|
LoopBuff_RemoveItems(&RF_TranM, 1);
|
|
|
|
|
|
// <20><><EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD><EFBFBD>
|
|
|
|
|
|
FRAM_SaveInfo(RF_TranM.info_base, (uint8_t *) &RF_TranM.info, sizeof(RF_TranM.info));
|
|
|
|
|
|
// <20><>¼<EFBFBD><C2BC><EFBFBD>ͳɹ<CDB3><C9B9><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
RTC_GetDateAndTime(&sRTC);
|
|
|
|
|
|
DTU_succTime = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
|
|
|
|
|
|
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD>4G<34><47><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>4G<34>л<EFBFBD><D0BB>ᷢ<EFBFBD>ͣ<EFBFBD>
|
|
|
|
|
|
xSemaphoreGive(RF_TranLock);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壺<EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
|
|
|
|
|
|
void RF_SendTask(void *p_arg)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t count;
|
|
|
|
|
|
|
|
|
|
|
|
while(TRUE)
|
|
|
|
|
|
{
|
|
|
|
|
|
// ι<><CEB9>
|
|
|
|
|
|
HAL_IWDG_Refresh(&hiwdg);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>Ͷ<EFBFBD><CDB6>еļ<D0B5>¼
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>õ<EFBFBD>ִ<EFBFBD>У<EFBFBD>
|
|
|
|
|
|
xSemaphoreTake(RF_SendQ, 1000);
|
|
|
|
|
|
|
|
|
|
|
|
count = LoopBuff_GetCount(&RF_SendM);
|
|
|
|
|
|
while(count--)
|
|
|
|
|
|
{
|
|
|
|
|
|
// ȡ<><C8A1><EFBFBD><EFBFBD>¼
|
|
|
|
|
|
RF_Send_Rec1 = *(rf_send_queue_t *) LoopBuff_GetDataPtr(&RF_SendM, RF_SendM.info.rdPtr);
|
|
|
|
|
|
LoopBuff_RemoveItems(&RF_SendM, 1);
|
|
|
|
|
|
|
|
|
|
|
|
if(RF_Send_Rec1.type == 0) // <20><><EFBFBD><EFBFBD>MAC_ACK
|
|
|
|
|
|
rf_mac_send_ack(RF_DIR_UP, RF_Send_Rec1.fn_pn, RF_Send_Rec1.oriPSN);
|
|
|
|
|
|
else if(RF_Send_Rec1.type == 1) // <20><><EFBFBD><EFBFBD>RESP_RELAY
|
|
|
|
|
|
rf_net_send_resp_relay(RF_Send_Rec1.oriPSN);
|
|
|
|
|
|
else if(RF_Send_Rec1.type == 2) // <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ò㷵<C3B2><E3B7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
rf_app_send_resp(RF_Send_Rec1.oriPSN, RF_Send_Rec1.fn_pn, RF_Send_Rec1.payload_len, RF_Send_Rec1.payload);
|
|
|
|
|
|
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>˴<EFBFBD><CBB4><EFBFBD>
|
|
|
|
|
|
osDelay(250);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|