

#ifndef _TRANSDATA_H_
#define _TRANSDATA_H_

#include "config.h"

#if (TRANS_APP_FILE == 1)
#include "stapp.h"
#endif


#if (TRANS_DATA_FILE == 1)
#include "datafile.h"
#endif

#define	LEN_RSV_BMP		1024		// 接收位图长度

#define FILE_HEAD_ID	0xFFFF		// 外围板启动文件传输数据包ID

#define	TRANS_NONE			0x00
#define	TRANS_ACTIVE		0x5A

#define TRANS_NOT_BEG		0x00	// 没有收到启动命令
#define	TRANS_READY			0x01	// 准备好
#define TRANS_DOING			0x02	// 正在接收
#define TRANS_DONE			0x03	// 接收完成
#define TRANS_REQUEST       0x04    // 请求传输模式

#define	FILE_TYPE_DAT		0x00	// 数据文件
#define	FILE_TYPE_PGM		0x02	// 升级文件
#define FILE_TYPE_BOARD		0x03	// 外围板文件
#define FILE_TYPE_FRAME		0x04	// 边框刺绣等类型的文件(需要在工作完成后自动切换到原文件,且不需要上位机重新发送文件内容)

// 外围板文件头
typedef struct
{
// 0x00
	char fileName[32];		// 文件名称
// 0x20
	u32 dataSize;			// 数据字节数
	u32	dataChecksum;		// 数据累加校验和

	u8 protocol;			// 文件要发给的协议类型
	u8 nodeid;				// 文件要发给的节点ID,0为广播
	u8 fileType;			// 文件类型
	u8 nodeType;			// 20220608 文件要发给的节点类型

// 0x2C
	u8	reserved1[0x30-0x2C];	// 保留区1

// 0x30
	u8	reserved2[0x64-0x30];	// 保留区2

// 0x64
	u8	reserved3[0x80-0x64];	// 保留区3

// 0x80
	u8	reserved4[0x100-0x80];	// 保留区4
}__attribute__ ((packed)) BoardFileHead;

// 外围板文件CAN数据帧控制结构
typedef union
{
	u8 data[8];

	struct
	{
		u8 sync[3];
		u16 pktId;			// 包ID
		u8 fnum;			// 帧个数
		u16 crc;
	} __attribute__ ((packed)) head;

	struct
	{
		u32 datasize;			// 数据字节数
		u32 dataChecksum;		// 数据累加校验和
	} __attribute__ ((packed)) check;

	struct
	{
		u8 protocol;			// 文件要发给的协议类型
		u8 nodeid;				// 文件要发给的节点ID,0为广播
		u8 fileType;			// 文件类型
		u8 nodeType;			// 文件要发给的节点类型

		u8 rev[4];
	} __attribute__ ((packed)) info;

}BoardFileCanCtrl;

// 外围板文件数据包控制结构
// 一个数据包129个CAN数据帧
typedef struct
{
	BoardFileCanCtrl pktHead;
	BoardFileCanCtrl pktData[128];

}BoardFilePacketCtrl;

// 外围板文件控制结构
typedef struct
{
	BoardFileHead fileHead;			// 文件头描述
	BoardFilePacketCtrl filepkt;	// 接收到的数据包

}BoardFileCtrl;

// 数据接收控制
typedef struct
{
	u8 transActive;		// 传输结构有效
	u8 transflag;		// 接收进度标志 = 0, 接收未开始; = 1, 正在接收; = 2，接收完成

	//---------------文件传输--------------------
	u8 fileType;		// 文件类型
	u8 fileIdx;			// 为文件编号，最多支持16个文件
	u16 fileId;			// 文件ID

#if (TRANS_DATA_FILE == 1)
	DatFileCtrl * pDatFile;
#endif

#if (TRANS_APP_FILE == 1)
	AppFileCtrl * pAppFile;
#endif
	//---------------文件传输--------------------

	//---------------外围板文件传输--------------------
	u16 rsvPktCount;	// 接收数据包计数
	u8 rsvFrameCount;	// 接收数据帧计数
	u32 dataChecksum;	// 数据累加校验和

	BoardFileCtrl * pBoardFile;
	//---------------外围板文件传输--------------------

	u32 packetNum;				// 包的个数

	u16 lenBmp;					// 位图有效长度
	u8 rsvBitmap[LEN_RSV_BMP];	// 文件接收进度标志位图

} __attribute__ ((packed)) FileTransCtrl;


#define CDPSYNC_LEN		3
#ifdef _IN_TRANSDATA_C
const u8 CDP_SYNC[CDPSYNC_LEN] =
{
	'C','D','P',
};
#else
extern const u8 CDP_SYNC[];
#endif

void InitFileTransCtrl(FileTransCtrl * pfileTransCtrl);

int WriteRsvBitmap(u32 idx, u8 sta, FileTransCtrl * pfileTransCtrl);
int IsResvFinish(FileTransCtrl * pfileTransCtrl);

int TransDataProc(BoardFileCanCtrl filecan, FileTransCtrl * pfileTransCtrl, u8 nodetype);		// 外围板文件接收处理

int GetLenBmp(FileTransCtrl * pfileTransCtrl);

#ifdef _IN_TRANSDATA_C
BoardFileCtrl g_boardFile;
#else
extern BoardFileCtrl g_boardFile;
#endif

#endif /* _TRANSDATA_H_ */
