
#ifndef __DATAFILE_H__
#define	__DATAFILE_H__

#include "datadef.h"
#include "exram.h"

//-------------------------------------------------------------------------

#define	MAX_FILE_NUM			16					// 支持可保存文件的个数，16 个文件


#define	DATA_FILE_ADDR1		EXRAM1_DATA_ADDR_BEG
#define	DATA_FILE_ADDR2		EXRAM2_DATA_ADDR_BEG

#define DATA_FILE_SIZE1		MAX_DATA_EXRAM1_SIZE
#define DATA_FILE_SIZE2		MAX_DATA_EXRAM2_SIZE

#define DATA_FILE_SIZE		(DATA_FILE_SIZE1+DATA_FILE_SIZE2)

#ifndef DATA_FILE_SIZE3
#define DATA_FILE_SIZE3		(0)
#endif

#ifndef DATA3_BASE_ADDR
#define DATA3_BASE_ADDR		(EXRAM1_BASE_ADDR)
#endif

//-------------------------------------------------------------------------
/*
 * 文件交换区域块（缓冲区）的个数
 * 需为10的整倍数,最小为10
 * 以当前索引为基准,按照向后:向前 7:3的比例进行数据请求,当前索引所在数据块计入向后部分
 * 数据存储在SRAM中
 */
#ifndef FILE_EXBUF_NUM
#define	FILE_EXBUF_NUM		(50)
#endif


#define	DAT_BLOCK_SIZE		(1024)	// 每个缓冲区大小
#define	ITEM_NUM_PER_BLK	((DAT_BLOCK_SIZE)/sizeof(DataItem))		// 每个缓冲区可存储针数
#define REQUEST_GAP			200			// 请求时间间隔,单位ms

typedef struct
{
	int exbufFlag[FILE_EXBUF_NUM];					// 缓冲区有效标志	0,无效
	u32 datExBeg [FILE_EXBUF_NUM];					// 数据块偏移起始
	u8 datExBlock[FILE_EXBUF_NUM][DAT_BLOCK_SIZE];	// 数据块内容缓冲区

}DatExCtrl;


// 数据文件
typedef struct
{
	int enflag;					// 文件有效标志，
	int storage;				// 文件存储方式，0，存在外部SRAM中; 1, 存在外部NorFLASH中; 2, 存储在外部NandFlash中; 3, 存在上位机中(网络);
	int newFile;				// 新文件标志

	u32 fileIdxMap;
	s32 fileIdx;				// 当前文件

	DataFileHead * pFileHead;	// 数据文件描述

	u32 dataBuff1BegAddr;		// 数据文件存放区1地址
	u32 dataBuff1Len;			// 数据文件存放区1大小

	u32 dataBuff2BegAddr;		// 数据文件存放区2地址
	u32 dataBuff2Len;			// 数据文件存放区2大小

	u32 dataBuff3BegAddr;		// 数据文件存放区3地址,从EXRAM中独立一块区域出来,用于存放边框刺绣等类型的文件
	u32 dataBuff3Len;			// 数据文件存放区3大小

	// 网络文件
	DatExCtrl * pDatExCtrl;			// 文件交换缓冲区

}DatFileCtrl;

#define	STORAGE_EXSRAM			0		// 存储在SRAM中
#define	STORAGE_NORFLASH		1		// 存储在NORFlash中
#define	STORAGE_NANDFLASH		2		// 存储在NANDFlash中
#define	STORAGE_NETWORK			3		// 存储在网络服务器中
#define	STORAGE_SRAMANDNOR		4		// 存储在SRAM和NorFlash中
#define STORAGE_TRANS			5		// 数据转发,不做存储
#define STORAGE_SPAREARAM		6		// 存储在SRAM的特定区域内,用于存储边框刺绣等类型的文件
#define STORAGE_INFLASH			7		// 存储在内部FLASH中


//-------------------------------------------------------------------------

#define	MAX_SQRT	256

typedef struct 
{
	float begx;
	float begy;		// 起点

	float midx;
	float midy;		// 中间点
/*
	float midx2;
	float midy2;	// 中间点2
*/
	float endx;
	float endy;		// 终点

    u8 line_type;	// 类型  = 0  直线  = 1  圆  = 2 样条曲线
	u8 type;		// 类型

	u8 blockNum;	// 起始锁针针数
	u8 blockTimes;	// 起始锁针次数
	u8 elockNum;	// 结束锁针针数
	u8 elockTimes;	// 结束锁针次数
	u8 blockjumps;	// 起始跳过针数
	u8 elockjumps;	// 结束跳过针数

	u32 stepSize;	// 步长

}__attribute__ ((packed)) SqrtItem;

typedef struct 
{
	SqrtItem sqrtItem[MAX_SQRT];	// 图形列表
	int sqrtNum;					// 个数

	u32 stepSize;	// 步长
	u8 blockNum;	// 起始锁针针数
	u8 blockTimes;	// 起始锁针次数
	u8 elockNum;	// 结束锁针针数
	u8 elockTimes;	// 结束锁针次数
	u8 blockjumps;	// 起始跳过针数
	u8 elockjumps;	// 结束跳过针数

	s32 startx;
	s32 starty;

	s32 startx2;
	s32 starty2;

	u8 defofst;
} SqrtInfo;

int CreateCommFile(SqrtInfo * pSqrt);

int WriteTestFile(int sel, int cx, int cy, int sx, int sy, int dex, int dey, u16 type, int stepSize);

//-------------------------------------------------------------------------

#ifdef _IN_DATAFILE_C
DatFileCtrl g_datFile;
DataFileHead g_fileHead1;
DataFileHead g_fileHead2;
#else
extern DatFileCtrl g_datFile;
extern DataFileHead g_fileHead1;
extern DataFileHead g_fileHead2;
#endif

//-------------------------------------------------------------------------

// 得到一针缝纫数据
int GetADataItem(u8 fileBlk, u32 idx, DataItem * pDat);
int GetADataItemNoSqrt(u8 fileBlk, u32 idx, DataItem * pDat);
int GetADataItemBase(u8 fileBlk, u32 idx, DataItem * pDat, int sqrtflag);
int WriteADataItem(u8 fileBlk, u32 idx, DataItem * pDat);
int WriteFileData(u8 fileBlk, u32 begaddr, u8 * pBuf, u32 size);

u32 GetFileItemNums(void);
s32 GetFileWide(void);
s32 GetFileHigh(void);

int GetMinMaxFromFileDatWithAnchor(s32 * pminx, s32 * pmaxx, s32 * pminy, s32 * pmaxy);
int GetMinMaxFromFileDat(s32 * pminx, s32 * pmaxx, s32 * pminy, s32 * pmaxy);
int GetMinMaxFromFileDatBase(int point, s32 * pminx, s32 * pmaxx, s32 * pminy, s32 * pmaxy);

int InvalidDatFile(u32 idx);
int AvalidDatFile(u32 idx);
int IsDatFileAvailable(void);
int IsDatIndexAvailable(u32 idx);

void InvalidDatBlock(void);

void SetNewDatFlag(u32 idx, int en);
int IsNewDatFile(u32 idx);

void InitNorSectorManage(void);
void NorAllocAndSetUsingFlags(int allocBytes);
int ReleaseSpace(int sync);

//-------------------------------------------------------------------------

void InitDatFiles(void);

void OutFileInfo(void);

int IsDatIdxInBuf(int idx);
int GetBlockIdxNeedtoLoad(int datidx);


#ifndef TEMP_DATA1_SIZE
#define TEMP_DATA1_SIZE			(0)
#endif

#ifndef TEMP_DATA1_ADDR
#define TEMP_DATA1_ADDR			(EXRAM1_BASE_ADDR)
#endif

#ifndef TEMP_DATA2_SIZE
#define TEMP_DATA2_SIZE			(0)
#endif

#ifndef TEMP_DATA2_ADDR
#define TEMP_DATA2_ADDR			(TEMP_DATA1_ADDR+TEMP_DATA1_SIZE)
#endif

#ifndef TEMP_DATA3_SIZE
#define TEMP_DATA3_SIZE			(0)
#endif

#ifndef TEMP_DATA3_ADDR
#define TEMP_DATA3_ADDR			(TEMP_DATA2_ADDR+TEMP_DATA2_SIZE)
#endif

#ifndef TEMP_DATA4_SIZE
#define TEMP_DATA4_SIZE			(0)
#endif

#ifndef TEMP_DATA4_ADDR
#define TEMP_DATA4_ADDR			(TEMP_DATA3_ADDR+TEMP_DATA3_SIZE)
#endif

void InitTempData(int type);
u8 * GetTempData(int type);
int SetTempData(int type, int idx, u8 * pBuf);

//-------------------------------------------------------------------------

#endif




