MS-DTU/MS-DTU-V1/User/uart_RFModule.c

1251 lines
32 KiB
C
Raw Permalink Normal View History

2025-04-03 14:18:58 +08:00
/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* M451
*
* Filename : uart_RFModule.h
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include "includes.h"
const uint8_t RF_APP = RF_APP_AJH;
const uint8_t RF_PROTOCOL_VER = RF_PROTOCOL_VER_1;
const uint8_t RF_LNG_LORA_CHANNEL = 1; // ͨ<><CDA8><EFBFBD>ŵ<EFBFBD>: 471M
const uint8_t RF_UP_CHANNEL = 28; // <20><><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>: 438M
const uint8_t RF_DOWN_CHANNEL = 29; // <20><><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>: 439M
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};
const uint8_t RF_LNG_LORA_EMPTYPSN[13] = {0, 0, 0, 0, 0, 0, 0, 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>֡
rf_frame_t RF_Send_Frame, RF_RecvFrame;
rf_lng_lora_t RF_LNG_LORA_Send_Frame, RF_LNG_LORA_Recv_Frame;
// LNG-LORA<52><41><EFBFBD><EFBFBD>״̬
volatile uint8_t RF_LNG_LORA_State = 0; // 0-<2D><><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ15<31><35><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>һ<EFBFBD>Σ<EFBFBD>2-ÿ<><C3BF>5<EFBFBD><EFBFBD><EBB7A2>һ<EFBFBD><D2BB>
// RF<52><46><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD>Ϣ֪ͨ
volatile uint8_t RF_semAck = 0;
volatile uint8_t RF_semGateway = 0;
volatile uint8_t RF_semResp = 0;
volatile uint8_t RF_semMatch = 0;
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};
loopbuff_t RF_MatchBuff;
uint8_t RF_MatchBuff_Data[sizeof(rf_charge_match_t) * (2 + 1)] = {0};
#define RF_MOD_MD0_1() LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_13)
#define RF_MOD_MD0_0() LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_13)
#define RF_MOD_MD1_1() LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_12)
#define RF_MOD_MD1_0() LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_12)
#define RF_READY() (1)
// <20><>Ƶ<EFBFBD><C6B5>ʼ<EFBFBD><CABC>״̬
uint8_t RF_initStatus = 0;
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><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(dcBuff.configDisplay.op_BOX_VER) // <20><>ҫ
//// {
//// if(frame->dir == RF_DIR_UP)
//// dst = rf_get_addr((uint8_t *) RF_BROADCAST_PSN);
//// else
//// dst = rf_get_addr(frame->destPSN);
//// 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;
//// }
//// else // LORA
{
// <20>ŵ<EFBFBD>
if(frame->dir == RF_DIR_UP)
phy_header[0] = RF_UP_CHANNEL;
else
phy_header[0] = RF_DOWN_CHANNEL;
}
// while(!RF_READY());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
delay_ms((rand() % 10) * (70 + rand() % 20));
//// if(dcBuff.configDisplay.op_BOX_VER) // <20><>ҫ
//// {
//// printf("\nRF send to Gateway (%02X %02X %02X, %d bytes):\n",
//// phy_header[0], phy_header[1], phy_header[2], frame->len);
//// }
//// else // LORA
{
printf("\nRF send to Gateway (%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><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();
//// if(dcBuff.configDisplay.op_BOX_VER) // <20><>ҫ
//// UART_Transmit(&huart3, phy_header, 3);
//// else // LORA
UART_Transmit(&huart3, phy_header, 1);
UART_Transmit(&huart3, (uint8_t *) frame, frame->len);
__enable_irq();
return 1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7A2>
uint8_t rf_uart_send_lng_lora(rf_lng_lora_t *frame)
{
uint16_t crc;
uint8_t i;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
memmove(frame->frame_header, "TANK", 4);
crc = rf_crc_16((uint8_t *) frame, sizeof(rf_lng_lora_t) - 2);
((uint8_t *) frame)[sizeof(rf_lng_lora_t) - 2] = crc >> 8;
((uint8_t *) frame)[sizeof(rf_lng_lora_t) - 1] = crc & 0xFF;
// while(!RF_READY());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ0.8~1s
delay_ms(800 + (rand() % 11) * (10 + rand() % 11));
printf("\nRF send to Gateway:\n");
for(i = 0; i < sizeof(rf_lng_lora_t); i++)
printf(" %02X", ((uint8_t *) frame)[i]);
printf("\n");
// <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(&huart3, (uint8_t *) frame, sizeof(rf_lng_lora_t));
__enable_irq();
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])
{
uint32_t tick;
rf_ack_t ack;
uint32_t stop_seconds;
uint8_t count;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
RF_semAck = 0;
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)
{
tick = GetDelayTick(500);
while(!IsTickOut(tick))
{
if(RF_semAck)
break;
}
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>Ӧ
RF_semGateway = 0;
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>װƥ<D7B0><C6A5>
uint8_t rf_net_send_charge_match(uint8_t charging)
{
rf_charge_match_t *pMatch = (rf_charge_match_t *) RF_Send_Frame.app_payload;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
RF_semMatch = 0;
LoopBuff_Clear(&RF_MatchBuff);
rf_initial_frame(&RF_Send_Frame);
RF_Send_Frame.net_type = RF_NET_TYPE_CHARGE_MATCH;
pMatch->posState = dcBuff.dtuData.posState;
pMatch->longitude = dcBuff.dtuData.longitude;
pMatch->latitude = dcBuff.dtuData.latitude;
pMatch->source = dcBuff.configBottle.source;
pMatch->charging = charging;
rf_append_payload(&RF_Send_Frame, sizeof(rf_charge_match_t), (uint8_t *) pMatch);
// <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><D3A6>װƥ<D7B0><C6A5>
uint8_t rf_net_send_resp_charge_match(uint8_t oriPSN[6], uint8_t charging)
{
rf_charge_match_t *pMatch = (rf_charge_match_t *) RF_Send_Frame.app_payload;
rf_initial_frame(&RF_Send_Frame);
RF_Send_Frame.net_type = RF_NET_TYPE_CHARGE_MATCH;
pMatch->posState = dcBuff.dtuData.posState;
pMatch->longitude = dcBuff.dtuData.longitude;
pMatch->latitude = dcBuff.dtuData.latitude;
pMatch->source = dcBuff.configBottle.source;
pMatch->charging = charging;
rf_append_payload(&RF_Send_Frame, sizeof(rf_charge_match_t), (uint8_t *) pMatch);
// <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>Ӧң<D3A6><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t rf_net_send_resp_remote_ctrl(uint8_t oriPSN[6], uint8_t func)
{
rf_initial_frame(&RF_Send_Frame);
RF_Send_Frame.net_type = RF_NET_TYPE_REMOTE_CTRL;
rf_append_payload(&RF_Send_Frame, 1, &func);
// <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)
{
uint32_t tick;
rf_resp_t resp;
uint32_t stop_seconds;
uint8_t count;
S_RTC_TIME_DATA_T sRTC;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
RF_semResp = 0;
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)
{
tick = GetDelayTick(500);
while(!IsTickOut(tick))
{
if(RF_semResp)
break;
}
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++;
// <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);
return 1;
}
}
}
return 0;
}
// <20><><EFBFBD>鵱ǰ<E9B5B1>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t rf_has_gateway()
{
return (memcmp(RF_GatewayPSN, RF_EMPTYPSN, 6) != 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()
{
uint32_t tick;
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;
uint8_t done = 0;
// <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><>Ѱ3<D1B0>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>Ѱ1<D1B0>Σ<EFBFBD>
for(i = 0; i < 3 && !done; i++)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>
rf_net_send_find_relay();
// 4<><34><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ػ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ֹͣ<CDA3>ȴ<EFBFBD>
stop_seconds = rf_get_seconds() + 4;
while(rf_get_seconds() <= stop_seconds)
{
tick = GetDelayTick(500);
while(!IsTickOut(tick))
{
if(RF_semGateway)
break;
}
count = LoopBuff_GetCount(&RF_GatewayBuff);
while(count--)
{
memmove(PSN, LoopBuff_GetDataPtr(&RF_GatewayBuff, RF_GatewayBuff.info.rdPtr), 6);
LoopBuff_RemoveItems(&RF_GatewayBuff, 1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>Ѱ1<D1B0><31>
if(memcmp(RF_GatewayPSN, PSN, 6) == 0)
done = 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)
{
rf_clear_gateway();
return 0;
}
rf_set_gateway(PSN_List[k]);
printf("RF_GatewayPSN: 20%02d%02d%02d%02d%03d\n", RF_GatewayPSN[0], RF_GatewayPSN[1],
RF_GatewayPSN[2], RF_GatewayPSN[3], (RF_GatewayPSN[4] << 8) | RF_GatewayPSN[5]);
return 1;
}
// <20>жϴ<D0B6><CFB4>޺Ͳ۳<CDB2><DBB3>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
uint32_t rf_is_charge_match(rf_charge_match_t *pMatch)
{
// <20>жϽ<D0B6><CFBD><EFBFBD>
if(pMatch->source != dcBuff.configBottle.source)
return 0;
// <20>жϲ۳<CFB2><DBB3><EFBFBD><EFBFBD>ھ<EFBFBD>ֹ״̬
if(dcBuff.configDisplay.op_SEND_GPS_DATA && Motion_Status && dcBuff.dtuData.posState && dcBuff.dtuData.speed >= 5)
return 0;
// <20>޷<EFBFBD><DEB7>жϾ<D0B6><CFBE><EFBFBD>
if(pMatch->posState == 0 || dcBuff.dtuData.posState == 0)
return 1;
// <20>жϴ<D0B6><CFB4>޺Ͳ۳<CDB2>֮<EFBFBD><D6AE><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
if(GetDistance(pMatch->latitude, pMatch->longitude, dcBuff.dtuData.latitude, dcBuff.dtuData.longitude) > 500)
return 0;
return 1;
}
// <20>жϲ۳<CFB2><DBB3>Ƿ<EFBFBD><C7B7>뿪ԭ<EBBFAA><D4AD>
uint32_t rf_is_truck_leave()
{
// <20>޷<EFBFBD><DEB7>жϾ<D0B6><CFBE><EFBFBD>
if(Pump_Stop_posState == 0 || dcBuff.dtuData.posState == 0)
return 0;
// <20>жϲ۳<CFB2><DBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD>״̬
if(!Motion_Status || dcBuff.dtuData.speed < 5)
return 0;
// <20>жϲ۳<CFB2><DBB3><EFBFBD>ԭ<EFBFBD><D4AD>֮<EFBFBD><D6AE><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
if(GetDistance(Pump_Stop_Latitude, Pump_Stop_Longitude, dcBuff.dtuData.latitude, dcBuff.dtuData.longitude) < 2000)
return 0;
return 1;
}
// <20><><EFBFBD>޷<EFBFBD><DEB7>ͳ<EFBFBD>װƥ<D7B0><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3AC><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6>
uint8_t rf_charge_match(uint8_t charging)
{
uint32_t tick;
uint32_t stop_tick;
rf_charge_match_t match;
uint8_t count;
uint8_t try_count = 2;
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32>
while(try_count--)
{
// <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rf_net_send_charge_match(charging);
// <20>ȴ<EFBFBD>3<EFBFBD><33><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ЧӦ<D0A7><D3A6>
stop_tick = GetDelayTick(3000);
while(!IsTickOut(stop_tick))
{
tick = GetDelayTick(500);
while(!IsTickOut(tick))
{
if(RF_semMatch)
break;
}
count = LoopBuff_GetCount(&RF_MatchBuff);
while(count--)
{
memmove(&match, LoopBuff_GetDataPtr(&RF_MatchBuff, RF_MatchBuff.info.rdPtr), sizeof(match));
LoopBuff_RemoveItems(&RF_MatchBuff, 1);
// <20>ж<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
if(rf_is_charge_match(&match) && match.charging == charging)
return 1;
}
}
}
return 0;
}
// <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><D1B0>HEADER
void RF_SearchHeader(uint8_t *buf, uint16_t fromPos, uint16_t *len)
{
uint16_t i;
for(i = fromPos; i < *len && buf[i] != 'L'; i++)
{
}
*len -= i;
memmove(buf, buf + i, *len);
}
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void RF_ParseFrame(uint8_t c)
{
static uint16_t RdIdx = 0;
static uint32_t outTick = 0;
uint8_t *RF_ModuleData = (uint8_t *) &RF_RecvFrame;
rf_ack_t ack;
rf_resp_t resp;
rf_charge_match_t match;
uint16_t i;
uint8_t frameOk, frameErr;
if(IsTickOut(outTick))
RdIdx = 0;
outTick = GetDelayTick(50);
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_DOWN))
{
// <20>յ<EFBFBD>һ֡
printf("\nRF recv from Gateway (%d bytes):\n", RF_ModuleData[1]);
for(i = 0; i < RF_ModuleData[1]; i++)
printf(" %02X", RF_ModuleData[i]);
printf("\n");
// <20>ж<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
if(RF_RecvFrame.mac_type == RF_MAC_TYPE_ACK)
{
// Ackȷ<6B><C8B7>֡
memmove(ack.srcPSN, RF_RecvFrame.srcPSN, 6);
ack.mac_fn = RF_RecvFrame.mac_fn;
LoopBuff_PutItem(&RF_AckBuff, (uint8_t *) &ack);
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RF_semAck = 1;
}
else if(RF_RecvFrame.net_type == RF_NET_TYPE_RESP_RELAY)
{
// <20>м<EFBFBD>Ӧ<EFBFBD><D3A6>֡
LoopBuff_PutItem(&RF_GatewayBuff, RF_RecvFrame.srcPSN);
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RF_semGateway = 1;
}
else if(RF_RecvFrame.net_type == RF_NET_TYPE_DATA)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>֡
memmove(resp.srcPSN, RF_RecvFrame.srcPSN, 6);
resp.app_pn = RF_RecvFrame.app_pn;
resp.payload_len = RF_RecvFrame.len - RF_MIN_FRAME_LEN;
memmove(resp.payload, RF_RecvFrame.app_payload, resp.payload_len);
LoopBuff_PutItem(&RF_RespBuff, (uint8_t *) &resp);
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RF_semResp = 1;
}
else if(RF_RecvFrame.net_type == RF_NET_TYPE_CHARGE_MATCH)
{
if(!dcBuff.configDisplay.op_SEND_GPS_DATA)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>Բ۳<D4B2><DBB3><EFBFBD>ƥ<EFBFBD><C6A5>֡
memmove(&match, RF_RecvFrame.app_payload, sizeof(match));
LoopBuff_PutItem(&RF_MatchBuff, (uint8_t *) &match);
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RF_semMatch = 1;
}
}
}
else if(dcBuff.configDisplay.op_SEND_GPS_DATA
&& rf_phy_valid(&RF_RecvFrame) && rf_mac_valid(&RF_RecvFrame, RF_DIR_UP))
{
// <20>յ<EFBFBD>һ֡
printf("\nRF recv from remote (%d bytes):\n", RF_ModuleData[1]);
for(i = 0; i < RF_ModuleData[1]; i++)
printf(" %02X", RF_ModuleData[i]);
printf("\n");
// <20>ж<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
if(RF_RecvFrame.net_type == RF_NET_TYPE_CHARGE_MATCH)
{
// <20>۳<EFBFBD><DBB3>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>޵<EFBFBD>ƥ<EFBFBD><C6A5>֡
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ƥ<EFBFBD><EFBFBD><E4A3AC>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
memmove(&match, RF_RecvFrame.app_payload, sizeof(match));
if(rf_is_charge_match(&match))
{
if(!match.charging)
{
// <20><>¼<EFBFBD>رõ<D8B1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>GPS<50><53>ַ
Pump_Stop_Time = rf_get_seconds();
Pump_Stop_posState = dcBuff.dtuData.posState;
Pump_Stop_Longitude = dcBuff.dtuData.longitude;
Pump_Stop_Latitude = dcBuff.dtuData.latitude;
// <20>Ͽ<EFBFBD><CFBF><EFBFBD>Һ<EFBFBD><D2BA>
KZ_PUMP_OFF();
}
rf_net_send_resp_charge_match(RF_RecvFrame.srcPSN, match.charging);
}
}
else if(RF_RecvFrame.net_type == RF_NET_TYPE_REMOTE_CTRL)
{
// <20>۳<EFBFBD><DBB3>յ<EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(RF_RecvFrame.app_payload[0] == 3) // <20><><EFBFBD><EFBFBD>
{
if(MeterInSamplePage()) // <20>궨ҳ<EAB6A8><EFBFBD><E6A3BA><EFBFBD><EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rf_net_send_resp_remote_ctrl(RF_RecvFrame.srcPSN, 3);
}
else if(RF_RecvFrame.app_payload[0] == 1 || RF_RecvFrame.app_payload[0] == 2) // ң<>ر<EFBFBD>
{
if(memcmp(RF_RecvFrame.destPSN, dcBuff.configBottle.PSN, 6) == 0)
{
if(RF_RecvFrame.app_payload[0] == 1) // <20><><EFBFBD><EFBFBD>
{
KZ_VALUE_ENABLE();
rf_net_send_resp_remote_ctrl(RF_RecvFrame.srcPSN, 1);
}
else // <20>ر<EFBFBD>
{
KZ_VALUE_DISABLE();
rf_net_send_resp_remote_ctrl(RF_RecvFrame.srcPSN, 2);
}
}
}
}
}
// <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);
}
else
{
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
RF_SearchSOF(RF_ModuleData, 1, &RdIdx);
}
}
} while(frameOk || frameErr);
}
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void RF_ParseLNGLora(uint8_t c)
{
static uint16_t RdIdx = 0;
static uint32_t outTick = 0;
uint8_t *RF_ModuleData = (uint8_t *) &RF_LNG_LORA_Recv_Frame;
uint16_t i;
uint8_t frameOk, frameErr;
char psn[14];
if(IsTickOut(outTick))
RdIdx = 0;
outTick = GetDelayTick(50);
if(RdIdx == 0 && c != 'L')
return;
RF_ModuleData[RdIdx++] = c;
do
{
frameErr = ((RdIdx >= 2 && RF_ModuleData[1] != 'N')
|| (RdIdx >= 3 && RF_ModuleData[2] != 'G')
|| (RdIdx >= 4 && RF_ModuleData[3] != 'C'));
if(frameErr)
{
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
RF_SearchHeader(RF_ModuleData, 1, &RdIdx);
}
frameOk = (RdIdx >= sizeof(rf_lng_lora_t) && memcmp(RF_ModuleData, "LNGC", 4) == 0);
if(frameOk)
{
if(rf_crc_16(RF_ModuleData, sizeof(rf_lng_lora_t)) == 0)
{
// <20>յ<EFBFBD>һ֡
printf("\nRF recv from Gateway (%d bytes):\n", sizeof(rf_lng_lora_t));
for(i = 0; i < sizeof(rf_lng_lora_t); i++)
printf(" %02X", RF_ModuleData[i]);
printf("\n");
sprintf(psn, "20%02d%02d%02d%02d%03d",
dcBuff.configBottle.PSN[0], dcBuff.configBottle.PSN[1], dcBuff.configBottle.PSN[2],
dcBuff.configBottle.PSN[3], (dcBuff.configBottle.PSN[4] << 8) | dcBuff.configBottle.PSN[5]);
if(memcmp(RF_LNG_LORA_Recv_Frame.tank_psn, RF_LNG_LORA_EMPTYPSN, 13) == 0)
{
if(RF_LNG_LORA_State == 0)
RF_LNG_LORA_State = 1;
}
else if(memcmp(RF_LNG_LORA_Recv_Frame.tank_psn, psn, 13) == 0)
{
if(RF_LNG_LORA_Recv_Frame.send_mod == 0)
RF_LNG_LORA_State = 0;
else
RF_LNG_LORA_State = 2;
}
// <20><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>һ֡
RdIdx -= sizeof(rf_lng_lora_t);
memmove(RF_ModuleData, RF_ModuleData + sizeof(rf_lng_lora_t), RdIdx);
// <20><>0<EFBFBD><30>ʼѰ<CABC><D1B0>SOF
RF_SearchHeader(RF_ModuleData, 0, &RdIdx);
}
else
{
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
RF_SearchHeader(RF_ModuleData, 1, &RdIdx);
}
}
} while(frameOk || frameErr);
}
void RF_IRQHandler(USART_Handle *huart)
{
uint8_t c = (uint8_t) huart->Instance->RDR;
// printf("%02X ", c);
// ֱ<>ӽ<EFBFBD><D3BD><EFBFBD>֡
if(dcBuff.configDisplay.op_LNG_LORA)
RF_ParseLNGLora(c);
else
RF_ParseFrame(c);
}
void RF_Uart_Open(u32 baudrate)
{
LL_USART_InitTypeDef USART_InitStruct = {0};
huart3.RxISR = RF_IRQHandler;
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART3);
/* USART3 interrupt Init */
NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
NVIC_EnableIRQ(USART3_IRQn);
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(USART3, &USART_InitStruct);
LL_USART_ConfigAsyncMode(USART3);
SET_BIT(USART3->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
LL_USART_Enable(USART3);
}
// ģ<><C4A3><EFBFBD>ϵ磬<CFB5><E7A3AC><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void RF_PowerOn()
{
uint32_t stop_seconds;
char last_c = 0, c;
uint8_t cfg[6];
static uint8_t first = 1;
uint16_t addr = rf_get_addr(RF_SelfPSN);
// <20>۳<EFBFBD><DBB3><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD>Ľ<EFBFBD>ɫ
if(dcBuff.configDisplay.op_SEND_GPS_DATA)
addr = rf_get_addr((uint8_t *) RF_BROADCAST_PSN);
if(RF_hasPowered)
return;
printf("\nRF power on ...\n");
VCC_RF_ON();
delay_ms(500);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>Ϊ9600bps
LL_USART_Disable(huart3.Instance);
RF_Uart_Open(9600);
NVIC_DisableIRQ(USART3_IRQn);
// 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;
if(dcBuff.configDisplay.op_LNG_LORA)
cfg[3] = 2 | (7 << 3) | (3 << 6); // sf=8, 115200bps, cr=4/8
//// else if(dcBuff.configDisplay.op_BOX_VER)
//// cfg[3] = 0x3C; // <20><>ҫģ<D2AB><C4A3>:<3A><>00 111 100<30><30>: UART 8N1, 115200bps, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9.6k
else
cfg[3] = 6 | (7 << 3) | (0 << 6); // sf=12, 115200bps, cr=4/5
cfg[4] = RF_DOWN_CHANNEL;
// LNG-LORA<52>
if(dcBuff.configDisplay.op_LNG_LORA)
cfg[4] = RF_LNG_LORA_CHANNEL;
// <20>۳<EFBFBD><DBB3><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD>Ľ<EFBFBD>ɫ
else if(dcBuff.configDisplay.op_SEND_GPS_DATA)
cfg[4] = RF_UP_CHANNEL;
if(dcBuff.configDisplay.op_LNG_LORA)
cfg[5] = 1 | (0 << 2) | (9 << 3) | (0 << 7); // freqcast=0, bw=500kHz, unicast=0
//// else if(dcBuff.configDisplay.op_BOX_VER)
//// cfg[5] = 0xC0; // <20><>ҫģ<D2AB><C4A3>:<3A><>1 1 000 0 00<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-ON<4F><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD>FEC-OFF<46><46>20dbm<62><6D>100mW<6D><57>
else
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(&huart3, cfg, 6);
stop_seconds = rf_get_seconds() + 2;
while(rf_get_seconds() < stop_seconds)
{
if(huart3.Instance->ISR & USART_ISR_RXNE)
{
c = huart3.Instance->RDR;
printf("%c", c);
if(last_c == 'O' && c == 'K')
{
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>Ե<EFBFBD>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>Ϊ׼
if(first)
RF_initStatus = 1;
break;
}
last_c = c;
}
}
first = 0;
// <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(huart3.Instance);
RF_Uart_Open(115200ul);
NVIC_EnableIRQ(USART3_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><CABC>
void RF_Init()
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
// RF MD0, MD1
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Pin = LL_GPIO_PIN_12|LL_GPIO_PIN_13;
LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
/**USART3 GPIO Configuration
PD8 ------> USART3_TX
PD9 ------> USART3_RX
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_8|LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void RF_UnInit()
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
// <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LL_USART_DeInit(USART3);
// <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
GPIO_InitStruct.Pin = LL_GPIO_PIN_8|LL_GPIO_PIN_9|LL_GPIO_PIN_12|LL_GPIO_PIN_13;
LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void RF_Open()
{
// <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);
LoopBuff_Create(&RF_MatchBuff, sizeof(rf_charge_match_t), 2, 0, (uint32_t) RF_MatchBuff_Data);
RF_Uart_Open(9600);
}
void rf_pack_lng_lora_data()
{
memset(&RF_LNG_LORA_Send_Frame, 0, sizeof(RF_LNG_LORA_Send_Frame));
// psn
sprintf(RF_LNG_LORA_Send_Frame.tank_psn, "20%02d%02d%02d%02d%03d",
dcBuff.configBottle.PSN[0], dcBuff.configBottle.PSN[1], dcBuff.configBottle.PSN[2],
dcBuff.configBottle.PSN[3], (dcBuff.configBottle.PSN[4] << 8) | dcBuff.configBottle.PSN[5]);
// send_mod
RF_LNG_LORA_Send_Frame.send_mod = (RF_LNG_LORA_State == 2 ? 0x5A : 0);
// status
if(dcBuff.sampleData.staDPress.notConnect)
RF_LNG_LORA_Send_Frame.level_conn = 1;
if(dcBuff.sampleData.staExtTempr[0].notConnect)
RF_LNG_LORA_Send_Frame.tempr_conn = 1;
if(dcBuff.sampleData.staPress.notConnect)
RF_LNG_LORA_Send_Frame.press_conn = 1;
if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_COMM_FAULT)
RF_LNG_LORA_Send_Frame.vacuu_conn = 1;
if(dcBuff.sampleData.staDPress.underFlow || dcBuff.sampleData.staDPress.overFlow)
RF_LNG_LORA_Send_Frame.level_fault = 1;
if(dcBuff.sampleData.staExtTempr[0].underFlow || dcBuff.sampleData.staExtTempr[0].overFlow)
RF_LNG_LORA_Send_Frame.tempr_fault = 1;
if(dcBuff.sampleData.staPress.underFlow || dcBuff.sampleData.staPress.overFlow)
RF_LNG_LORA_Send_Frame.press_fault = 1;
if(dcBuff.sampleData.vacuum[0].staVacuum != VACUUM_STATUS_COMM_FAULT && (dcBuff.sampleData.vacuum[0].vacuum <= 0.00999999 || dcBuff.sampleData.vacuum[0].vacuum > 99.99999999))
RF_LNG_LORA_Send_Frame.vacuu_fault = 1;
// liquid_level<65><6C>volume<6D><65>volumePct
if(RF_LNG_LORA_Send_Frame.level_conn || RF_LNG_LORA_Send_Frame.level_fault)
{
RF_LNG_LORA_Send_Frame.liquid_level = 0;
RF_LNG_LORA_Send_Frame.volume = 0;
RF_LNG_LORA_Send_Frame.volumePct = 0;
}
else
{
RF_LNG_LORA_Send_Frame.liquid_level = KPa2mmH2O(dcBuff.sampleData.diff);
RF_LNG_LORA_Send_Frame.volume = dcBuff.sampleData.volume;
RF_LNG_LORA_Send_Frame.volumePct = dcBuff.sampleData.volumePct;
}
// temperature
if(RF_LNG_LORA_Send_Frame.tempr_conn || RF_LNG_LORA_Send_Frame.tempr_fault)
RF_LNG_LORA_Send_Frame.temp = 0;
else
RF_LNG_LORA_Send_Frame.temp = dcBuff.sampleData.extTempr[0];
// press
if(RF_LNG_LORA_Send_Frame.press_conn || RF_LNG_LORA_Send_Frame.press_fault)
RF_LNG_LORA_Send_Frame.pressure = 0;
else
RF_LNG_LORA_Send_Frame.pressure = dcBuff.sampleData.pressure * 0.001;
// vacuum
if(RF_LNG_LORA_Send_Frame.vacuu_conn || RF_LNG_LORA_Send_Frame.vacuu_fault)
RF_LNG_LORA_Send_Frame.vacuum = 0;
else
RF_LNG_LORA_Send_Frame.vacuum = dcBuff.sampleData.vacuum[0].vacuum;
}
void LNG_LORA_Task(void *p_arg)
{
uint32_t seconds = 0;
uint32_t sendSeconds = 0;
uint8_t last_state = 0;
uint32_t resetSeconds = rf_get_seconds() + 300;
while(1)
{
osDelay(500);
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
seconds = rf_get_seconds();
if(RF_LNG_LORA_State == 1)
{
// ֻӦ<D6BB><D3A6>һ<EFBFBD><D2BB>
RF_LNG_LORA_State = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ14<31><34><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ0.8~1s<31><73><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>15<31><35><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
osDelay((rand() % 29) * (250 + rand() % 251));
rf_pack_lng_lora_data();
rf_uart_send_lng_lora(&RF_LNG_LORA_Send_Frame);
}
else if(RF_LNG_LORA_State == 2)
{
if(RF_LNG_LORA_State != last_state)
sendSeconds = seconds;
if(seconds >= sendSeconds)
{
// <20>´η<C2B4><CEB7>͵<EFBFBD>ʱ<EFBFBD><CAB1>
sendSeconds = seconds + 5;
rf_pack_lng_lora_data();
rf_uart_send_lng_lora(&RF_LNG_LORA_Send_Frame);
}
}
else // <20><><EFBFBD><EFBFBD>LORA<52><41><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>5<EFBFBD><35><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LORAģ<41><C4A3>
{
if(RF_LNG_LORA_State != last_state)
resetSeconds = seconds + 300;
if(seconds >= resetSeconds)
{
// <20>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
resetSeconds = seconds + 300;
RF_PowerOff();
RF_PowerOn();
}
}
last_state = RF_LNG_LORA_State;
}
}