190 lines
4.9 KiB
C
190 lines
4.9 KiB
C
/*
|
||
*********************************************************************************************************
|
||
* IAR Development Kits
|
||
* on the
|
||
*
|
||
* Nano100
|
||
*
|
||
* Filename : uart_RFModule.h
|
||
* Version : V1.00
|
||
* Programmer(s) : Qian Xianghong
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#ifndef USER_UART_RFMODULE_PRESENT
|
||
#define USER_UART_RFMODULE_PRESENT
|
||
|
||
#include "type.h"
|
||
|
||
// 初始化
|
||
void RF_Init();
|
||
void RF_Open();
|
||
|
||
// 反初始化
|
||
void RF_UnInit();
|
||
|
||
// 模块上电,设置硬件参数
|
||
void RF_PowerOn();
|
||
void RF_PowerOff();
|
||
// 终端模块搜寻网关:发送搜寻命令,等待回应。
|
||
// 搜寻5次,取回应次数最多的作为通信网关。
|
||
// 最多接收10个网关
|
||
uint8_t rf_check_gateway();
|
||
// 检查当前是否已经设置了网关
|
||
uint8_t rf_has_gateway();
|
||
// 清除网关
|
||
void rf_clear_gateway();
|
||
// 应用层发送:数据
|
||
uint8_t rf_app_send_data(uint8_t payload_len, uint8_t *payload);
|
||
|
||
// 储罐发送充装匹配命令,并等待应答
|
||
uint8_t rf_charge_match(uint8_t charging);
|
||
// 判断槽车是否离开原地
|
||
uint32_t rf_is_truck_leave();
|
||
|
||
#define RF_MIN_FRAME_LEN (24)
|
||
#define RF_MAX_FRAME_LEN (61)
|
||
#define RF_MIN_PAYLOAD_LEN (0)
|
||
#define RF_MAX_PAYLOAD_LEN (RF_MAX_FRAME_LEN - RF_MIN_FRAME_LEN)
|
||
|
||
#define RF_DIR_UP (0) // 上行
|
||
#define RF_DIR_DOWN (1) // 下行
|
||
#define RF_MAC_TYPE_DATA (0) // mac帧-数据
|
||
#define RF_MAC_TYPE_ACK (1) // mac帧-ACK
|
||
#define RF_NET_TYPE_DATA (0) // net帧-数据
|
||
#define RF_NET_TYPE_FIND_RELAY (1) // net帧-寻找中继器
|
||
#define RF_NET_TYPE_RESP_RELAY (2) // net帧-应答中继器
|
||
#define RF_NET_TYPE_CHARGE_MATCH (3) // net帧-充装匹配
|
||
#define RF_NET_TYPE_REMOTE_CTRL (4) // net帧-遥控命令
|
||
|
||
#define RF_FRAME_SOF (0x1B) // 标识一个帧的开始
|
||
#define RF_MARK_LS (('S' << 8) | 'L')
|
||
#define RF_APP_AJH ('A') // data.idatatank.com:8088
|
||
#define RF_APP_PRAX ('P') // tts.praxair.com.cn:7005
|
||
#define RF_APP_LANSHI ('L') // data.cd-ls.cn:8088
|
||
#define RF_PROTOCOL_VER_1 (1)
|
||
|
||
// 射频初始化状态
|
||
extern uint8_t RF_initStatus;
|
||
|
||
// 允许匿名结构
|
||
#pragma anon_unions
|
||
#pragma pack(push, 1)
|
||
|
||
typedef struct // size = RF_MAX_FRAME_LEN
|
||
{
|
||
uint8_t sof; // RF_FRMAE_SOF
|
||
uint8_t len; // bytes from sof to crc(RF_MIN_FRAME_LEN~RF_MAX_FRAME_LEN)
|
||
uint16_t vendor_id; // RF_MARK_LS
|
||
uint8_t app_id; // RF_APP_AJH or RF_APP_PRAX or RF_APP_LANSHI
|
||
uint8_t protocol_ver; // RF_PROTOCOL
|
||
unsigned dir : 1; // RF_DIR_UP or RF_DIR_DOWN
|
||
unsigned mac_type : 2; // RF_MAC_TYPE_DATA or RF_MAC_TYPE_ACK
|
||
unsigned mac_ack_req : 1; // is ack requested?
|
||
unsigned net_type : 3; // RF_NET_TYPE_DATA or RF_NET_TYPE_FIND_RELAY or RF_NET_TYPE_RESP_RELAY or RF_NET_TYPE_REMOTE_CTRL
|
||
unsigned : 1; // reserved
|
||
uint8_t mac_fn; // mac frame number
|
||
uint8_t destPSN[6];
|
||
uint8_t srcPSN[6];
|
||
uint8_t app_pn; // package number
|
||
unsigned app_idx : 7; // frame number in package
|
||
unsigned app_tbc : 1; // to be continue?
|
||
uint8_t app_payload[RF_MAX_PAYLOAD_LEN];
|
||
uint16_t crc; // 占位置,实际crc可能更靠前
|
||
} rf_frame_t;
|
||
|
||
// mac层ack信息
|
||
typedef struct
|
||
{
|
||
uint8_t srcPSN[6];
|
||
uint8_t mac_fn;
|
||
} rf_ack_t;
|
||
|
||
// 应用层应答信息
|
||
typedef struct
|
||
{
|
||
uint8_t srcPSN[6];
|
||
uint8_t app_pn;
|
||
uint8_t payload_len;
|
||
uint8_t payload[RF_MAX_PAYLOAD_LEN];
|
||
} rf_resp_t;
|
||
|
||
typedef struct
|
||
{
|
||
unsigned staDiff : 2;
|
||
unsigned staPress : 2;
|
||
unsigned staETempr1 : 2;
|
||
unsigned charging : 1;
|
||
unsigned bat_low : 1;
|
||
unsigned measure_type : 2;
|
||
unsigned bottle_type : 2;
|
||
unsigned L_source : 3;
|
||
unsigned location_type : 1; // 0-GPS,1-基站
|
||
} rf_sensor_t;
|
||
|
||
typedef struct // size = 37
|
||
{
|
||
uint16_t diff;
|
||
uint16_t press;
|
||
int16_t tempr;
|
||
rf_sensor_t Sensor;
|
||
uint16_t density;
|
||
uint32_t longitude;
|
||
uint32_t latitude;
|
||
uint16_t voltage;
|
||
uint8_t batPct;
|
||
int8_t batCurrent;
|
||
uint32_t relative_time;
|
||
uint8_t hardVer;
|
||
uint8_t softVer;
|
||
uint32_t L;
|
||
uint32_t d;
|
||
uint8_t chargePct;
|
||
} rf_app_data_t;
|
||
|
||
typedef struct // size = 11
|
||
{
|
||
uint8_t posState;
|
||
uint32_t longitude;
|
||
uint32_t latitude;
|
||
uint8_t source;
|
||
uint8_t charging;
|
||
} rf_charge_match_t;
|
||
|
||
typedef struct // size = 43
|
||
{
|
||
char frame_header[4]; // LNGC for master; TANK for slave.
|
||
char tank_psn[13];
|
||
uint8_t send_mod; // 0x00 for normal; 0x5A for quick.
|
||
unsigned level_conn : 1;// 0-连接,1-未连接
|
||
unsigned tempr_conn : 1;// 0-连接,1-未连接
|
||
unsigned press_conn : 1;// 0-连接,1-未连接
|
||
unsigned vacuu_conn : 1;// 0-连接,1-未连接
|
||
unsigned level_fault : 1;// 0-正常,1-故障
|
||
unsigned tempr_fault : 1;// 0-正常,1-故障
|
||
unsigned press_fault : 1;// 0-正常,1-故障
|
||
unsigned vacuu_fault : 1;// 0-正常,1-故障
|
||
|
||
float liquid_level; // mmWC
|
||
float temp; // ℃
|
||
float pressure; // MPa
|
||
float vacuum; // Pa
|
||
|
||
uint32_t volume; // L
|
||
uint16_t volumePct; // %
|
||
uint16_t crc; // Modbus-rtu crc
|
||
} rf_lng_lora_t;
|
||
|
||
#pragma pack(pop)
|
||
|
||
// 多项式为x16+x15+x2+1,LSB顺序
|
||
// 同ibutton的crc算法,不同于modbus的crc算法
|
||
uint16_t rf_crc_16(uint8_t *message, int16_t len);
|
||
|
||
// 计算自启动以来经过的秒数
|
||
uint32_t rf_get_seconds();
|
||
|
||
void LNG_LORA_Task(void *p_arg);
|
||
|
||
#endif
|