ShipCentralControl/Anjiehui7_DTU/User/ext_data.h

139 lines
3.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* Nano100
*
* Filename : ext_data.h
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
#ifndef USER_EXT_DATA_PRESENT
#define USER_EXT_DATA_PRESENT
#include "type.h"
extern loopbuff_t RF_DataM, RF_TranM;
extern SemaphoreHandle_t RF_TranLock;
// 初始化
void Data_Open();
// 允许匿名结构
#pragma anon_unions
#pragma pack(push, 1)
// 历史数据和上传队列
typedef struct // size = 64
{
uint16_t check; // 标志位必须为0x55AA
uint8_t oriPSN[6];
uint8_t payload_len;
uint8_t payload[RF_MAX_PAYLOAD_LEN];
int32_t prevData; // 同一个PSN的上一条记录 (-1表示无上一条记录)
unsigned warn : 1; // 是否报警记录
unsigned fault : 1; // 是否故障记录
unsigned : 14;
uint16_t volumePct; // 计算液位百分比
uint32_t volume; // 计算重量
uint32_t recvTime; // 射频收到的绝对时间戳
uint16_t crc; // 校验位
} ext_data_t;
// 储罐总数
typedef struct
{
uint16_t check; // 标志位必须为0x55AA
int16_t count; // 储罐总数为0表示无档案
uint16_t crc; // 校验位
} ext_count_t;
// 储罐档案
typedef struct // size = 16
{
uint8_t PSN[6];
int32_t lastData; // 最后一条数据记录的序号 (-1表示无记录)
uint8_t pn;
unsigned warn : 1; // 是否报警状态
unsigned fault : 1; // 是否故障状态
unsigned : 6;
uint32_t recvTime; // 射频收到的绝对时间戳
} ext_bottle_t;
// 储罐扩展档案
typedef struct // size = 24
{
uint8_t PSN[6];
char TGGU[12]; // 箱主序号
uint8_t FF[6];
} ext_box_t;
// 储罐档案按PSN索引
typedef struct
{
uint8_t PSN[6];
int16_t recNo;
} ext_bottle_idx_t;
// 储罐档案按箱主序号索引
typedef struct
{
char TGGU[12];
uint8_t PSN[6];
int16_t recNo;
} ext_box_idx_t;
// GPS定位信息
typedef struct // size = 22
{
uint16_t check; // 标志位必须为0x55AA
date_time_t sysTime; // 系统时间, size = 6
int32_t longitude; // 经度
int32_t latitude; // 维度
uint16_t speed; // 速度
uint8_t sateCount; // GPS卫星数量
uint8_t posState; // GPS定位状态
uint16_t crc; // 校验位
} ext_gps_t;
extern ext_gps_t Ext_GPS;
extern ext_data_t Ext_Data_Rec, Ext_Data_Rec1;
extern ext_count_t bottleCnt, boxCnt;
extern ext_bottle_idx_t bottlePSN[];
extern ext_box_idx_t boxTGGU[];
extern ext_box_idx_t boxPSN[];
#pragma pack(pop)
// 关联铁电和SFlash的一致性用相对时间和绝对时间作为标记
void CheckFramSFlashValid(uint32_t relative_time);
// TODO: 将精简数据转换成上传数据
void cacl_gprs_tran_data(ext_data_t *pGprs, data_sample_t *sample);
// 将一个数据加入队列
// RF_DataM和RF_TranM用一个存储区写指针始终相同读指针可能不同
void Data_PutToQueue(ext_data_t *pGprs);
// 快速排序法
void Ext_Sort_Bottle_PSN(ext_bottle_idx_t a[], int16_t lo, int16_t hi);
void Ext_Sort_Box_TGGU(ext_box_idx_t a[], int16_t lo, int16_t hi);
void Ext_Sort_Box_PSN(ext_box_idx_t a[], int16_t lo, int16_t hi);
// 根据PSN查找储罐档案序号没有则返回-1
int16_t Ext_Lookup_Bottle_PSN(uint8_t PSN[], int16_t cnt);
// 根据箱主序号查找PSN没有则返回-1
int16_t Ext_Lookup_Box_TGGU(char TGGU[], int16_t cnt);
// 根据PSN查找箱主序号没有则返回-1
int16_t Ext_Lookup_Box_PSN(uint8_t PSN[], int16_t cnt);
// 更新从服务器下载的罐箱档案
void Ext_Update_Boxes(char *buff);
#endif