#ifndef _XSPDATAOPT_H_ #define _XSPDATAOPT_H_ #include "../CMSIS/gd32f10x.h" #include "xspOptFlash.h" #include #include "../Hardware/boardinit.h" #define XSP_SAVE_TIME (1000*60*30)// 30分钟 enum { U1_ID = 0x00, U4_ID = 0x01, U5_ID = 0x02, }; typedef struct _table_needle_{ uint8_t uId; uint8_t comIndex; // 在那个com端下 uint8_t csIndex; // 片选的索引 uint8_t pinIndex; // 管脚索引 }__attribute__((packed))NeedleTable; typedef struct _com_data_msg_{ uint8_t num; uint8_t lastvl; uint8_t tda[10][24]; uint8_t da[24]; }__attribute__((packed))comDaMsg; typedef struct _com_src_data_{ uint8_t flag; // 按位计算 3组com端 6组数据,共6个1,用3F表示 comDaMsg daMsg[3][2]; // 一共3组 每组中有两个小组 }__attribute__((packed))ComSrcDa; typedef struct _table_com_{ uint8_t comPort; uint8_t comPin; }__attribute__((packed))ComId; extern uint8_t g_7egDa[29]; typedef struct display_data_{ uint32_t price; // 单价 uint32_t amount; // 金额 uint32_t oil; // 油量 }__attribute__((packed)) dispData; typedef union _c_to_u_ { uint8_t da8[16]; uint16_t da16[8]; uint32_t da32[4]; uint64_t da64[2]; }__attribute__((packed)) UData; typedef struct _src_7seg_ { uint8_t amount[6]; uint8_t oil[6]; uint8_t price[4]; }__attribute__((packed)) Src7Seg; typedef union _data_src_7seg_ { Src7Seg da; UData uDa; uint8_t val[16]; }__attribute__((packed)) Usrc7SegDa; typedef struct _error_7seg_ { uint8_t berror; }__attribute__((packed))Error7Seg; #define START_ID 1 enum { STATUS_NULL = 0x00, // 未初始化状态 STATUS_START = 0x01, // 加油开始 STATUS_PROG = 0x02, // 加油中 STATUS_END = 0x03, // 加油结束 STATUS_STOP = 0x04, // 加油停止 STATUS_CHECK = 0x05, // 数据查询 }; enum{ GUN_NULL = 0x00, // 未知 GUN_UP = 0x01, // 抬枪 GUN_DOWN = 0x02, // 挂枪 }; typedef struct xsp_coll_data_ { Usrc7SegDa cur; // 原始的七段码记录 Usrc7SegDa last1; Usrc7SegDa last2; timeout_t sameTimer; // 相同数据的时间 uint8_t corrDa[16]; uint32_t startTime; // 加油开始的时间 uint32_t stopTime; // 加油结束时的时间 uint32_t gunUpTime; // 抬枪的时间 uint32_t gunDnTime; // 挂枪的时间 uint8_t gunStatus; uint8_t bcheckDa; // 当前显示屏显示的数据是否是查询数据 uint8_t curstatus; // 加油状态 dispData curDisp; // 解析好的数据记录 dispData lastDisp; // 上一个需要存储的数据 dispData lastDisp1; // 上上个数据,用于错误数据矫正 uint32_t lastTick1; // 上上个加油的时间,用于错误数据矫正 uint32_t lastTick; // 上一次记录的时间戳 uint32_t lastcomTick; // 只要变化不管数据的对错,就记录时间戳, uint8_t bSaveRecode; // 是否需要存储当次的交易记录 uint32_t errorNum; // 在加油开始的状态下,统计错误的次数 uint32_t startToprog; // 小额增长变化次数(从加油开始,到加油中的判断过程 uint64_t lastTamout; uint64_t lastToil; uint8_t bcorrect; // 是否纠正 uint8_t bstart00; // 加油是从00开始的 }__attribute__((packed)) XspCollDa; extern XspCollDa g_xspCollDa; typedef struct xsp_record_{ uint32_t recordId; // 记录ID uint16_t bsend; // 0xff:没有发送 0x00:已经发送 uint8_t recodeMode; // 记录产生方式 0:逻辑产生 1:抬枪信号产生,3:按键产生 uint8_t priceUseCount; // 单价屏的索引 uint32_t amount; uint32_t oil; uint32_t price; uint64_t tamount; uint64_t toil; uint32_t timer;// 记录时间 uint16_t bcorrect; // 用高8位表示是否是纠正数据 0:未纠正 1:纠正一位 2:计算纠正 }__attribute__((packed)) xspRecord; typedef union xsp_data_info_{ uint8_t data[64]; xspRecord reDa; }__attribute__((packed)) XspDataInfo; extern XspDataInfo g_xspReDa; typedef struct _up_7seg_src_data_{ uint8_t bOpen; // 是否开启 1:开启 uint8_t bAppointDev; // 是否指定的一个设备 0:否, 1:指令的设备为主 2:指定的设备为从 uint8_t bofflineTest; // 离线调试,主动上报 timeout_t upTime; // 上报的时长 uint8_t devMsg[17]; // 读取指令的从设备的8段数据,用于主设备问询从设备 }__attribute__((packed))Up7segData; extern Up7segData g_up7segData; typedef enum { LOW_LEVEL = 0x00, HIGHT_LEVEL = 0x01, LOW_HIGHT = 0x02, // 由低变高 HIGHT_LOW = 0x03, // 由高变低 }gunstatus; #define GUN_STATUS_TIMER 50000 // 10ms 10000 // 1S, typedef struct gun_status_{ gunstatus curst; // 当前的状态 gunstatus lastst; // 上一次的状态 uint32_t timer; // 时间 uint8_t count; // 检测次数 低电平的个数 uint8_t bsave; // 是否已经挂枪需要存储数据 }__attribute__((packed))GunStatus; /*-------探针板错误数据记录以及上传-------------*/ typedef struct _xsp_err_da_{ timeout_t timer; // 数据不变的时间 uint8_t bsend; // 本条数据是否已经发送 1:已经发送,2:未发送,0:默认不需要处理 uint8_t segDa[29]; // 错误的七段码数据 uint8_t lastsegDa[29]; }__attribute__((packed)) XspErrDa; extern XspErrDa g_xspErrDa; #define SAME_GROUP 3//1 #define TEST_COLL_DA_MAX_NUM 1000 #define TEST_COLL_GROUP 24 typedef struct _test_coll_data_{ // 测试采集数据 volatile uint8_t collDa[TEST_COLL_DA_MAX_NUM][TEST_COLL_GROUP]; // 需要采集的数据 uint8_t lastDa[8][TEST_COLL_GROUP]; uint8_t tcollNum[TEST_COLL_GROUP*8]; // 存储每一位采集比较的结果 uint8_t lastval[TEST_COLL_GROUP*8]; uint8_t sendCollNum[TEST_COLL_GROUP*8]; // 需要上传的数据 uint8_t bTestCollDa; // 是否是采集测试数据模式 1:是, 0:否 uint32_t collTime; // 采集的时间, 多长时间采集一次 volatile uint16_t collNum; // 记录采集的次数 uint16_t dealNum; // 处理的次数 uint8_t bdealDa; // 处理数据 }__attribute__((packed)) testCollDa; extern testCollDa g_testCollDa; extern void init_test_coll_data_info(uint8_t bstart); extern void deal_coll_data_com(void); extern void deal_coll_data_HY(void); extern void init_xsp_run_data(void); extern void init_gun_status(void); extern void deal_gun_status(uint32_t tick); extern void anay_7eg(void); extern void init_comMsg(void); #endif