#ifndef _TCP_TASK_H #define _TCP_TASK_H #include "config.h" #if USE_SPECT_DATA_TASK #include "type.h" #define SPECT_DEBUG_MODE 0 #define SPECT_TASK_UART_DEBUG 0 //串口调试信息开关 #if SPECT_TASK_UART_DEBUG #define spect_printf printf #else #define spect_printf(p,...) do{;}while(0) #endif #define FRAME_WITHOUT_DATA_LEN (10) //FRAME结构中,数据区为空时的最小数据长度 #define FRAME_HEADER (0X46) #define FRAME_TAIL (0X96) #define SPECT_CMD_ACK (1<<15) //高位置1表示ack enum SPECT_CMD_TYPE { FRAME_CMD_READ_1 = 0x0001, //读取复数信息 FRAME_CMD_READ_2 = 0X0002, //读取IMD和SNR信息 FRAME_CMD_RETURN_ERR_LICENCE = 0x0003, //licence 错误, FRAME_CMD_WRITE_1 = 0x0101, FRAME_CMD_OTHER_1 = 0x0201, }; enum SPECT_FRAME_ERR { FRAME_ERR_NONE = 0, FRAME_ERR_ID, FRAME_ERR_HEADER, FRAME_ERR_LEN, FRAME_ERR_INDEX, FRAME_ERR_DATA, FRAME_ERR_SUM, FRAME_ERR_TAIL, }; struct frame_index { uint8 index1; uint8 index2; }; //数据结构体,类似于串口通讯的,但进行了部分改动,如长度域由单字节扩充为双字节(数据比较长) //超过1字节的,按照小端序存放,低字节在前,高字节在后 //__packed #pragma pack(1) struct tcp_data_frame { uint8 id; //激励器ID uint8 header; //帧头,固定值 uint16 len; //帧长度 整帧,从id到tail uint16 cmd; //数据内容类型 uint16 index; //当应答数据存在多帧时,为应答序号 高字节为第n帧(从1开始),低字节为总帧号 //uint16 reserved; //保留字节 以待扩充(字节对齐) void *pdata; //数据区 也可定义为数组模式 实际长度为len-10 uint8 sum; //数据校验和 从帧头道sum前的字节累加和,不包含sum //利用指针直接访问sum和tail域不可 uint8 tail; //帧尾,固定值 }; #pragma pack() //字节对齐 struct snr_imd { uint8 rsnr; uint8 tsnr; uint8 limd; uint8 uimd; }; struct complex { uint16 real; uint16 imag; }; #define TCP_FRAME_DATA_LEN (1024) //应答数据时,包含的有效数据长度 #define TCP_DATA_COMPLEX_NUM (4096*2) //一总数据包含的复数个数 tx和rx共8k个复数 原先是只有tx #define TCP_DATA_BUF_LEN (TCP_DATA_COMPLEX_NUM*sizeof(struct complex)) #define TCP_FRAM_SNR_IMD_LEN (sizeof(struct snr_imd)) #define TCP_SPECT_REC_BUF_LEN (64) #define TCP_SPECT_SEND_BUF_LEN (1536+64) #define TCP_SPECT_COMM_PORT (5700) struct frame_struct { uint8 spect_data[TCP_FRAME_DATA_LEN]; struct snr_imd snr_imd_data; }; #ifndef htons #define htons(a) \ ((((a) >> 8) & 0x00ff) | \ (((a) << 8) & 0xff00)) #endif #endif #if 1 #define FPGA_UPGRADE_CTRL_ADDR (0xe0) #define FPGA_UP_CTRL_RESET_EN_MASK (1<<0) #define FPGA_UP_CTRL_CHECKID_MASK (1<<1) #define FPGA_UP_CTRL_VERIFY_MASK (1<<2) #define FPGA_UP_CTRL_HDRESET_EN_MASK (1<<7) #define FPGA_UPGRADE_STATUS_ERROR_MASK (1<<0) #define FPGA_UP_STATUS_DONE_MASK (1<<1) #define FPGA_UP_STATUS_BUSY_MASK (1<<2) #define FPGA_UP_STATUS_EARSE_OK_MASK (1<<3) #endif #define __tcp_fpgaUp_task__ 1 #if __tcp_fpgaUp_task__ //----------------------------------------------- #define FPGA1_UPGRADE_ADDRESS (0XFFFF) #define FPGA2_UPGRADE_ADDRESS (0X1FFF) #define MAX_PER_FRAME_LEN 100 #define MAX_DATA_LEN 544 #define TX_DATA_LEN 10 /* :10F14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF 10F14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF */ #define UPDATA_RAW_FRAME_MIN_LEN 11 #define UPDATA_RAW_FRAME_MAX_LEN 50 #define FRAME_NO_DATA_LEN 4 #define USE_FPGA_UP_WRITE (1) //----------------------------------------------- enum E_upgrade_step{ UPGRADE_START = 0x01, // 发起升级 POLL_ERASER = 0x02, // poll MCU 的 eraser 状态,是否完成 W_DATA_BLOCK = 0x03, // 取文件数据块发送给 MCU W_DATA_BLOCK_LAST = 0x04, // 最后一个文件数据块发送给MCU的 STEP_BUT }; enum E_ack{ START_OK = 0x01, // MCU 回复 可以开始升级 ERASER_ING, // MCU 回复 正在擦除 ERASER_END, // MCU 回复 擦除完成 READY, // MCU 回复 烧写当前数据块完成,可发送下一数据块 NOT_READY, // MCU 回复 当前数据块失败,PC等1ms再重复发送当前数据块 ABORT_SUCCESS, // MCU 回复 成功结束 ABORT_ERROR, // MCU 回复 失败结束 ACKP_BUT }; /* head | 帧头 0xAA cmd | datalen | 0x0000-0xffff 后面数据断的长度 data | datalen长度的字节数据 crc | 0xx 1个字节的校验码,从head到crc之前的数据字节sum,head、cmd、datalen、data tail | 帧尾 0xBB */ //__packed #pragma pack(1) typedef struct { uint8 head; uint8 cmd; uint16 datalen; uint8 *pdata; uint8 sum; uint8 tail; }S_FPGA_UP_FRAME_NEW ; #pragma pack() typedef struct { uint8 head; uint8 lenH; uint8 lenL; uint8 addr1; uint8 addr2; uint8 addr3; uint8 addr4; uint8 typeH; uint8 typeL; uint8 data[32]; uint8 crcH; uint8 crcL; }S_FGPA_UPDATA_FRAME; //----------------------------------------------- extern int fpga_up_thr(void * pvParameters); extern void * tcp_remote_thr(void *args); extern void * udp_remote_thr(void * args); #endif//#if __tcp_fpgaUp_task__ void check_fpga_up_finished_reboot_sys(void); void tcp_remote_task(void * pvParameters); void udp_remote_task(void * pvParameters); void fpga_upgrade_task(void * pvParameters); void check_ts_err_status(void); void check_fpga_gps_lock_status(void); extern void check_send_alarm_state(void); #endif