3945 lines
93 KiB
C
3945 lines
93 KiB
C
|
||
#define _IN_DATAFILE_C
|
||
#include "datafile.h"
|
||
|
||
#include "math.h"
|
||
#include "crc16.h"
|
||
#include "norflash.h"
|
||
#include "inout.h"
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
|
||
|
||
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
|
||
// 数据文件
|
||
#if (1)
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
// 用外部SRAM保存文件
|
||
// 文件内容
|
||
|
||
#define DS16ITEMSIZE (DATA_FILE_SIZE/sizeof(Ds16Item))
|
||
#define DS8ITEMSIZE (DATA_FILE_SIZE/sizeof(Ds8Item))
|
||
#define DS4ITEMSIZE (DATA_FILE_SIZE/sizeof(Ds4Item))
|
||
|
||
#define DS16ITEMSIZE_AT_BUF1 (DATA_FILE_SIZE1/sizeof(Ds16Item))
|
||
#define DS8ITEMSIZE_AT_BUF1 (DATA_FILE_SIZE1/sizeof(Ds8Item))
|
||
#define DS4ITEMSIZE_AT_BUF1 (DATA_FILE_SIZE1/sizeof(Ds4Item))
|
||
|
||
// 边框刺绣数据文件
|
||
#define DS16FRAMESIZE (DATA_FILE_SIZE3/sizeof(Ds16Item))
|
||
#define DS8FRAMESIZE (DATA_FILE_SIZE3/sizeof(Ds8Item))
|
||
#define DS4FRAMESIZE (DATA_FILE_SIZE3/sizeof(Ds4Item))
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
// 用外部串行 NOR Flash 保存文件
|
||
|
||
// FLASH 文件存放地址
|
||
#define NOR_FILE_BASE SNF_DAT_FILE_BEGIN // 存放文件区域 16M 字节
|
||
|
||
// 文件区域划分
|
||
// |-----------------|-----------------|-------------|
|
||
// | name | begin addr | size |
|
||
// |-----------------|-----------------|-------------|
|
||
// | file data area | 0x00 | 0x00FFE000 | 文件内容区域
|
||
// |-----------------|-----------------|-------------|
|
||
// | file manage | 0x00FFE000 | 0x00001000 | 文件管理区域,占用1个扇区
|
||
// |-----------------|-----------------|-------------|
|
||
|
||
|
||
#define NOR_FILE_DATA (NOR_FILE_BASE + 0x00000000)
|
||
#define MAX_NOR_FILE_SIZE (SNF_DAT_FILE_SIZE - SNF_BYTES_PER_SEC)
|
||
|
||
#define NOR_DAT_MANAGE (NOR_FILE_BASE + MAX_NOR_FILE_SIZE)
|
||
|
||
|
||
#define DS16SIZEINNOR (MAX_NOR_FILE_SIZE/sizeof(Ds16Item))
|
||
#define DS8SIZEINNOR (MAX_NOR_FILE_SIZE/sizeof(Ds8Item ))
|
||
#define DS4SIZEINNOR (MAX_NOR_FILE_SIZE/sizeof(Ds4Item ))
|
||
|
||
|
||
// FLASH 平均损耗算法(用循环利用法来减少针对扇区的擦除)
|
||
|
||
// 共16M的文件存储区域
|
||
// 以4K(扇区)为文件分配的基本单位,共4096个扇区。
|
||
// 用一个字节代表一个扇区,用于指示扇区的利用情况,共4096个字节。
|
||
// 因为数据是循环存储在扇区列表中的。
|
||
// 所以规定,字节数组中最大的值代表了扇区分配的开始(循环队列的开始)。
|
||
// 例如擦除后,全部为0xff,那么第0个扇区就是第一个开始利用的扇区。
|
||
// 如果第一次存储文件时占用了10个扇区,那么从第0个到第9个扇区对应的字节写为0x7F。
|
||
// 接下来存储文件时要占用5个扇区,那么从第10个到第14个对应的字节设置为0x7F。
|
||
// 以此类推,如果所有字节被写为0x7F,那么接下来的字节就要被写作0x3F。
|
||
// 循环队列每循环一次,写入的字节的数移动一个位,直到写入字节变为0x00。
|
||
// 如果所有字节都变成0x00,那么这个记录扇区就需要擦除。
|
||
|
||
// 这个记录扇区的作用是保证所有扇区的擦除次数尽量均匀,延长使用寿命。
|
||
|
||
#define NOR_DAT_SEC_BEG 0
|
||
#define NOR_DAT_SEC_NUM (MAX_NOR_FILE_SIZE / (SNF_BYTES_PER_SEC))
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
typedef struct
|
||
{
|
||
u8 wrflag; // 写入的记录字节
|
||
int begSecIdx; // 循环队列的起始索引
|
||
int queueSecNum; // 循环队列的长度,分配的扇区个数
|
||
int releaseFlag; // 释放标志
|
||
}NorSectorManager;
|
||
|
||
NorSectorManager g_norManager;
|
||
|
||
void InitNorSectorManage(void)
|
||
{
|
||
int i, idx;
|
||
u8 flag;
|
||
u8 rdata[SNF_BYTES_PER_SEC];
|
||
memset(&g_norManager, 0, sizeof(NorSectorManager));
|
||
|
||
DatFlashRdData(NOR_DAT_MANAGE, rdata, SNF_BYTES_PER_SEC); // 读取一个扇区
|
||
|
||
// 扫描管理扇区,得到最大的flag值
|
||
flag = 0;
|
||
for (i = 0, idx = 0; i < NOR_DAT_SEC_NUM; i++) // NOR_DAT_SEC_NUM 4095
|
||
{
|
||
if (flag < rdata[i])
|
||
{
|
||
flag = rdata[i]; // 取最大值,得到写入的最大记录字节
|
||
idx = i;
|
||
}
|
||
}
|
||
|
||
if (flag == 0)
|
||
{
|
||
// 擦除扇区
|
||
printf("Erase NOR_DAT_MANAGE\r\n");
|
||
DatFlash4kErase(NOR_DAT_MANAGE, 1);
|
||
flag = 0xff;
|
||
idx = 0;
|
||
}
|
||
|
||
flag >>= 1; //
|
||
|
||
g_norManager.wrflag = flag;
|
||
g_norManager.begSecIdx = idx;
|
||
g_norManager.queueSecNum = 0;
|
||
g_norManager.releaseFlag = 0;
|
||
|
||
// printf("InitNorSectorManage, wrflag=0x%x, begSecIdx=%d, queueSecNum=%d\r\n", g_norManager.wrflag, g_norManager.begSecIdx, g_norManager.queueSecNum);
|
||
}
|
||
|
||
// 通过扇区索引,得到扇区地址
|
||
u32 GetAddrFromSecIdx(int sidx)
|
||
{
|
||
sidx += g_norManager.begSecIdx;
|
||
while (sidx >= NOR_DAT_SEC_NUM)
|
||
{
|
||
sidx -= NOR_DAT_SEC_NUM;
|
||
}
|
||
return NOR_FILE_DATA + sidx * (SNF_BYTES_PER_SEC);
|
||
}
|
||
|
||
// 通过数据索引和数据大小,得到数据首地址
|
||
u32 GetAddrFromDatIdx(int didx, int size)
|
||
{
|
||
u32 addr;
|
||
u32 sidx, sofst;
|
||
|
||
sidx = didx * size / (SNF_BYTES_PER_SEC); // 扇区逻辑地址
|
||
sofst = (didx * size) % (SNF_BYTES_PER_SEC); // 扇区内偏移
|
||
|
||
addr = GetAddrFromSecIdx(sidx) + sofst;
|
||
|
||
return addr;
|
||
}
|
||
|
||
u32 GetAddrFromLAddr(int laddr, int size)
|
||
{
|
||
u32 addr;
|
||
u32 sidx, sofst;
|
||
|
||
sidx = laddr / (SNF_BYTES_PER_SEC); // 扇区逻辑地址
|
||
sofst = laddr % (SNF_BYTES_PER_SEC); // 扇区内偏移
|
||
|
||
addr = GetAddrFromSecIdx(sidx) + sofst;
|
||
|
||
return addr;
|
||
}
|
||
|
||
// 根据占据内存,分配占用空间,设置标志
|
||
// allocBytes:需要分配的字节数
|
||
void NorAllocAndSetUsingFlags(int allocBytes)
|
||
{
|
||
int i, idx;
|
||
int alcsecs; // 占用扇区数
|
||
u8 rdata[SNF_BYTES_PER_SEC];
|
||
|
||
// 计算占用扇区数
|
||
alcsecs = allocBytes + (SNF_BYTES_PER_SEC-1);
|
||
alcsecs /= (SNF_BYTES_PER_SEC); // 占用扇区数
|
||
|
||
printf("NorAllocAndSetUsingFlags, allocbyte=%d, alcsecs=%d\r\n", allocBytes, alcsecs);
|
||
|
||
g_norManager.begSecIdx += g_norManager.queueSecNum;
|
||
while (g_norManager.begSecIdx >= NOR_DAT_SEC_NUM)
|
||
{
|
||
g_norManager.begSecIdx -= NOR_DAT_SEC_NUM;
|
||
}
|
||
|
||
printf("before alloc, begsecidx=%d, queuenum=%d, wrflag=0x%x\r\n", g_norManager.begSecIdx, g_norManager.queueSecNum, g_norManager.wrflag);
|
||
|
||
if (alcsecs > NOR_DAT_SEC_NUM)
|
||
{
|
||
printf("alcsecs=%d > %d\r\n", alcsecs, NOR_DAT_SEC_NUM);
|
||
alcsecs = NOR_DAT_SEC_NUM;
|
||
}
|
||
|
||
DatFlashRdData(NOR_DAT_MANAGE, rdata, SNF_BYTES_PER_SEC); // 读取记录字节
|
||
|
||
g_norManager.queueSecNum = 0;
|
||
for (i = 0, idx = g_norManager.begSecIdx; i < alcsecs; i++)
|
||
{
|
||
g_norManager.queueSecNum++; // 计数增加
|
||
|
||
// 设置标志
|
||
rdata[idx] = g_norManager.wrflag;
|
||
|
||
// 索引增加
|
||
idx++;
|
||
if (idx >= NOR_DAT_SEC_NUM)
|
||
{
|
||
idx = 0;
|
||
if (g_norManager.wrflag == 0)
|
||
{
|
||
DatFlash4kErase(NOR_DAT_MANAGE, 1);
|
||
memset(rdata, 0xff, SNF_BYTES_PER_SEC);
|
||
g_norManager.wrflag = 0xff;
|
||
printf("re erase dat manage\r\n");
|
||
}
|
||
|
||
g_norManager.wrflag >>= 1;
|
||
printf("nor alloc queue return to 0, wrflag=0x%x\r\n", g_norManager.wrflag);
|
||
}
|
||
}
|
||
|
||
if (g_norManager.queueSecNum != alcsecs) // 验证分配个数
|
||
{
|
||
printf("Error: g_norManager.queueSecNum not euq alcsecs\r\n");
|
||
}
|
||
|
||
printf("after alloc, begsecidx=%d, queuenum=%d, wrflag=0x%x\r\n", g_norManager.begSecIdx, g_norManager.queueSecNum, g_norManager.wrflag);
|
||
|
||
g_norManager.releaseFlag = 0;
|
||
DatFlashWrData(NOR_DAT_MANAGE, rdata, SNF_BYTES_PER_SEC);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
// 擦除数据,释放空间
|
||
// sync:同步标志 0,同步擦除 1,异步擦除
|
||
int ReleaseSpace(int sync)
|
||
{
|
||
static int eraseidx = -1; // 擦除ID
|
||
if (sync != 0 && eraseidx == -1)
|
||
{
|
||
eraseidx = 0;
|
||
g_norManager.releaseFlag = 1;
|
||
}
|
||
|
||
if (g_norManager.releaseFlag == 0)
|
||
{
|
||
eraseidx = 0;
|
||
g_norManager.releaseFlag++;
|
||
}
|
||
else if (g_norManager.releaseFlag == 1)
|
||
{
|
||
if (g_norManager.queueSecNum != 0) // 分配的扇区不为0
|
||
{
|
||
u32 eaddr;
|
||
int idx, erflag;
|
||
printf("ReleaseSpace, secnum=%d, eraseidx=%d, sync=%d\r\n", g_norManager.queueSecNum, eraseidx, sync);
|
||
|
||
for (idx = eraseidx; idx < g_norManager.queueSecNum; idx++)
|
||
{
|
||
eaddr = GetAddrFromSecIdx(idx);
|
||
erflag = IsDatFlashEmpty(eaddr, SNF_BYTES_PER_SEC);
|
||
if (erflag != 0)
|
||
{
|
||
printf("DatFlash4kErase eaddr=0x%x\r\n", eaddr);
|
||
DatFlash4kErase(eaddr, 1);
|
||
}
|
||
if (sync == 0)
|
||
{
|
||
idx++;
|
||
break;
|
||
}
|
||
}
|
||
eraseidx = idx;
|
||
if (eraseidx >= g_norManager.queueSecNum)
|
||
{
|
||
eraseidx = -1;
|
||
g_norManager.releaseFlag = 2;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
g_norManager.releaseFlag = -1; // 小数据文件,不使用norflash,无需擦除
|
||
}
|
||
}
|
||
return g_norManager.releaseFlag;
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
// 数据存储在上位机(通过网络动态传输)
|
||
|
||
|
||
int GetADataItem(u8 fileBlk, u32 idx, DataItem * pDat)
|
||
{
|
||
return GetADataItemBase(fileBlk, idx, pDat, 1);
|
||
}
|
||
|
||
int GetADataItemNoSqrt(u8 fileBlk, u32 idx, DataItem * pDat)
|
||
{
|
||
return GetADataItemBase(fileBlk, idx, pDat, 0);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
/* return : 0:正常
|
||
* -1:参数错误或文件存储方式不支持或数据格式不支持
|
||
* -2:没有找到索引值idx
|
||
* para:fileBlk,暂时无用
|
||
* sqrtflag,是否平方根计算len,较耗时
|
||
*/
|
||
int GetADataItemBase(u8 fileBlk, u32 idx, DataItem * pDat, int sqrtflag)
|
||
{
|
||
u32 address;
|
||
|
||
// 20231115
|
||
if (idx >= g_datFile.pFileHead->fileHead.itemNums)
|
||
{
|
||
printf("GetADataItem error, idx=%d > %d\r\n", idx, g_datFile.pFileHead->fileHead.itemNums);
|
||
return -1;
|
||
}
|
||
|
||
if (pDat == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(Ds16Item)) // Ds16数据
|
||
{
|
||
if (g_datFile.storage == STORAGE_EXSRAM) // 文件存储在存储在SRAM中
|
||
{
|
||
if (idx >= DS16ITEMSIZE)
|
||
{
|
||
memset(pDat, 0, sizeof(DataItem));
|
||
return -1;
|
||
}
|
||
|
||
{
|
||
Ds16Item * pDs16Item;
|
||
|
||
if (idx < DS16ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs16Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs16Item += (idx - DS16ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDat, pDs16Item, sizeof(Ds16Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SPAREARAM) // 边框刺绣数据文件(也包括花样轮廓和开位线绣)
|
||
{
|
||
if (idx >= DS16FRAMESIZE)
|
||
{
|
||
memset(pDat, 0, sizeof(DataItem));
|
||
return -1;
|
||
}
|
||
|
||
{
|
||
Ds16Item * pDs16Item;
|
||
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff3BegAddr);
|
||
pDs16Item += idx;
|
||
}
|
||
memcpy(pDat, pDs16Item, sizeof(Ds16Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH) // 文件存储在NORFlash中
|
||
{
|
||
u32 daddr;
|
||
if (idx >= DS16SIZEINNOR)
|
||
{
|
||
memset(pDat, 0, sizeof(DataItem));
|
||
return -1;
|
||
}
|
||
daddr = NOR_FILE_DATA+idx*sizeof(Ds16Item);
|
||
address = (u32)pDat;
|
||
DatFlashRdData(daddr, (u8*)(address), sizeof(Ds16Item));
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
if (idx >= (DS16ITEMSIZE+DS16SIZEINNOR))
|
||
{
|
||
memset(pDat, 0, sizeof(DataItem));
|
||
return -1;
|
||
}
|
||
|
||
if (idx < DS16ITEMSIZE)
|
||
{
|
||
Ds16Item * pDs16Item;
|
||
|
||
if (idx < DS16ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs16Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs16Item += (idx - DS16ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDat, pDs16Item, sizeof(Ds16Item));
|
||
}
|
||
else
|
||
{
|
||
u32 daddr;
|
||
daddr = GetAddrFromDatIdx(idx-DS16ITEMSIZE, sizeof(Ds16Item));
|
||
address = (u32)pDat;
|
||
DatFlashRdData(daddr, (u8*)(address), sizeof(Ds16Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
int i;
|
||
u32 dataddr;
|
||
|
||
for (i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID)
|
||
{
|
||
dataddr = idx * sizeof(Ds16Item); // 数据在文件中的地址
|
||
|
||
if ((dataddr >= g_datFile.pDatExCtrl->datExBeg[i]) &&
|
||
(dataddr < g_datFile.pDatExCtrl->datExBeg[i]+DAT_BLOCK_SIZE) ) // 在范围内,命中
|
||
{
|
||
dataddr -= g_datFile.pDatExCtrl->datExBeg[i]; // 数据在块内的地址(相对地址)
|
||
dataddr += (s32)(&(g_datFile.pDatExCtrl->datExBlock[i])); // 数据在缓冲区的地址(实际地址)
|
||
|
||
memcpy(pDat, (u8*)dataddr, sizeof(DataItem));
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (i == FILE_EXBUF_NUM)
|
||
{
|
||
printf("not found the data of idx=%d\r\n", idx);
|
||
return -2;
|
||
}
|
||
}
|
||
else // 不支持的存储方式
|
||
{
|
||
printf("error2, not support storage\r\n");
|
||
return -1;
|
||
}
|
||
}
|
||
else if (g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(Ds8Item)) // Ds8数据
|
||
{
|
||
if (g_datFile.storage == STORAGE_EXSRAM)
|
||
{
|
||
if (idx >= DS8ITEMSIZE)
|
||
{
|
||
memset(pDat, 0, sizeof(Ds8Item));
|
||
return -1;
|
||
}
|
||
|
||
{
|
||
Ds8Item * pDs8Item;
|
||
|
||
if (idx < DS8ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs8Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs8Item += (idx - DS8ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDat, pDs8Item, sizeof(Ds8Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SPAREARAM)
|
||
{
|
||
if (idx >= DS8FRAMESIZE)
|
||
{
|
||
memset(pDat, 0, sizeof(Ds8Item));
|
||
return -1;
|
||
}
|
||
|
||
{
|
||
Ds8Item * pDs8Item;
|
||
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff3BegAddr);
|
||
pDs8Item += idx;
|
||
}
|
||
memcpy(pDat, pDs8Item, sizeof(Ds8Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH)
|
||
{
|
||
u32 daddr;
|
||
if (idx >= DS8SIZEINNOR)
|
||
{
|
||
memset(pDat, 0, sizeof(Ds8Item));
|
||
return -1;
|
||
}
|
||
daddr = NOR_FILE_DATA+idx*sizeof(Ds8Item);
|
||
address = (u32)pDat;
|
||
|
||
DatFlashRdData(daddr, (u8*)(address), sizeof(Ds8Item));
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
if (idx >= (DS8ITEMSIZE+DS8SIZEINNOR))
|
||
{
|
||
memset(pDat, 0, sizeof(Ds8Item));
|
||
return -1;
|
||
}
|
||
|
||
if (idx < DS8ITEMSIZE)
|
||
{
|
||
Ds8Item * pDs8Item;
|
||
|
||
if (idx < DS8ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs8Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs8Item += (idx - DS8ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDat, pDs8Item, sizeof(Ds8Item));
|
||
}
|
||
else
|
||
{
|
||
u32 daddr;
|
||
daddr = GetAddrFromDatIdx(idx-DS8ITEMSIZE, sizeof(Ds8Item));
|
||
address = (u32)pDat;
|
||
DatFlashRdData(daddr, (u8*)(address), sizeof(Ds8Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
int i;
|
||
u32 dataddr;
|
||
|
||
for (i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID)
|
||
{
|
||
dataddr = idx * sizeof(Ds8Item); // 数据在文件中的地址
|
||
|
||
if ((dataddr >= g_datFile.pDatExCtrl->datExBeg[i]) &&
|
||
(dataddr < g_datFile.pDatExCtrl->datExBeg[i]+DAT_BLOCK_SIZE) ) // 在范围内,命中
|
||
{
|
||
dataddr -= g_datFile.pDatExCtrl->datExBeg[i]; // 数据在块内的地址(相对地址)
|
||
dataddr += (s32)(&(g_datFile.pDatExCtrl->datExBlock[i])); // 数据在缓冲区的地址(实际地址)
|
||
|
||
memcpy(pDat, (u8*)dataddr, sizeof(Ds8Item));
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (i == FILE_EXBUF_NUM)
|
||
{
|
||
printf("not found the data of idx=%d\r\n", idx);
|
||
return -2;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
#if (1)
|
||
if (sqrtflag != 0)
|
||
{
|
||
pDat->len = sqrt(pDat->dx*pDat->dx + pDat->dy*pDat->dy);
|
||
}
|
||
#else
|
||
pDat->len = 0;
|
||
#endif
|
||
// memset(pDat->rev, 0, 6);
|
||
}
|
||
else if (g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(Ds4Item))
|
||
{
|
||
Ds4Item dsr;
|
||
if (g_datFile.storage == STORAGE_EXSRAM)
|
||
{
|
||
if (idx >= DS4ITEMSIZE)
|
||
{
|
||
memset(pDat, 0, sizeof(Ds4Item));
|
||
return -1;
|
||
}
|
||
|
||
Ds4Item * pDs4Item = &dsr;
|
||
|
||
if (idx < DS4ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs4Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs4Item += (idx - DS4ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDat, pDs4Item, sizeof(Ds4Item));
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SPAREARAM)
|
||
{
|
||
if (idx >= DS4FRAMESIZE)
|
||
{
|
||
memset(pDat, 0, sizeof(Ds4Item));
|
||
return -1;
|
||
}
|
||
|
||
Ds4Item * pDs4Item = &dsr;
|
||
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff3BegAddr);
|
||
pDs4Item += idx;
|
||
}
|
||
memcpy(pDat, pDs4Item, sizeof(Ds4Item));
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH)
|
||
{
|
||
u32 daddr;
|
||
if (idx >= DS4SIZEINNOR)
|
||
{
|
||
memset(pDat, 0, sizeof(Ds4Item));
|
||
return -1;
|
||
}
|
||
daddr = NOR_FILE_DATA+idx*sizeof(Ds4Item);
|
||
address = (u32)(&dsr);
|
||
DatFlashRdData(daddr, (u8*)(address), sizeof(Ds4Item));
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
if (idx >= (DS4ITEMSIZE+DS4SIZEINNOR))
|
||
{
|
||
memset(pDat, 0, sizeof(Ds4Item));
|
||
return -1;
|
||
}
|
||
|
||
if (idx < DS4ITEMSIZE)
|
||
{
|
||
Ds4Item * pDs4Item = &dsr;
|
||
|
||
if (idx < DS4ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs4Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs4Item += (idx - DS4ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDat, pDs4Item, sizeof(Ds4Item));
|
||
}
|
||
else
|
||
{
|
||
u32 daddr;
|
||
daddr = GetAddrFromDatIdx(idx-DS4ITEMSIZE, sizeof(Ds4Item));
|
||
address = (u32)(&dsr);
|
||
DatFlashRdData(daddr, (u8*)(address), sizeof(Ds4Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
int i;
|
||
u32 dataddr;
|
||
|
||
for (i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID)
|
||
{
|
||
dataddr = idx * sizeof(Ds4Item); // 数据在文件中的地址
|
||
|
||
if ((dataddr >= g_datFile.pDatExCtrl->datExBeg[i]) &&
|
||
(dataddr < g_datFile.pDatExCtrl->datExBeg[i]+DAT_BLOCK_SIZE) ) // 在范围内,命中
|
||
{
|
||
dataddr -= g_datFile.pDatExCtrl->datExBeg[i]; // 数据在块内的地址(相对地址)
|
||
dataddr += (s32)(&(g_datFile.pDatExCtrl->datExBlock[i])); // 数据在缓冲区的地址(实际地址)
|
||
|
||
memcpy(&dsr, (u8*)dataddr, sizeof(Ds4Item));
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (i == FILE_EXBUF_NUM)
|
||
{
|
||
printf("not found the data of idx=%d\r\n", idx);
|
||
return -2;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
pDat->ctrl = dsr.ctrl;
|
||
pDat->attr = 0;
|
||
pDat->dx = dsr.dx;
|
||
pDat->dy = dsr.dx;
|
||
pDat->dr = 0;
|
||
|
||
// 方向属性
|
||
if ((dsr.attr & 0x80) != 0)
|
||
{
|
||
pDat->dx *= -10;
|
||
}
|
||
else
|
||
{
|
||
pDat->dx *= 10;
|
||
}
|
||
|
||
if ((dsr.attr & 0x40) != 0)
|
||
{
|
||
pDat->dy *= -10;
|
||
}
|
||
else
|
||
{
|
||
pDat->dy *= 10;
|
||
}
|
||
|
||
// 其他属性...
|
||
|
||
#if (1)
|
||
if (sqrtflag != 0)
|
||
{
|
||
pDat->len = sqrt(pDat->dx*pDat->dx + pDat->dy*pDat->dy);
|
||
}
|
||
#else
|
||
pDat->len = 0;
|
||
#endif
|
||
// memset(pDat->rev, 0, 6);
|
||
}
|
||
else // 非Ds16,Ds8,Ds4
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int WriteADataItem(u8 fileBlk, u32 idx, DataItem * pDat)
|
||
{
|
||
if (g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(Ds16Item))
|
||
{
|
||
if (g_datFile.storage == STORAGE_EXSRAM)
|
||
{
|
||
if (idx > DS16ITEMSIZE ||
|
||
pDat == NULL ||
|
||
0 )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
{
|
||
Ds16Item * pDs16Item;
|
||
|
||
if (idx < DS16ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs16Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs16Item += (idx - DS16ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDs16Item, pDat, sizeof(Ds16Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH)
|
||
{
|
||
return -1;
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
if (idx >= (DS16ITEMSIZE+DS16SIZEINNOR) ||
|
||
pDat == NULL ||
|
||
0 )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (idx < DS16ITEMSIZE)
|
||
{
|
||
Ds16Item * pDs16Item;
|
||
|
||
if (idx < DS16ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs16Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs16Item = (Ds16Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs16Item += (idx - DS16ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDs16Item, pDat, sizeof(Ds16Item));
|
||
}
|
||
else
|
||
{
|
||
/* // 不支持写入单个针步......
|
||
|
||
u32 daddr;
|
||
daddr = GetAddrFromDatIdx(idx-DS16ITEMSIZE, sizeof(Ds16Item));
|
||
address = (u32)pDat;
|
||
|
||
NFlashWrData(daddr, (u16*)address, sizeof(Ds16Item)/2);
|
||
*/
|
||
return -1;
|
||
}
|
||
|
||
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
}
|
||
else if (g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(Ds8Item))
|
||
{
|
||
if (g_datFile.storage == STORAGE_EXSRAM)
|
||
{
|
||
if (idx > DS8ITEMSIZE ||
|
||
pDat == NULL ||
|
||
0 )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
{
|
||
Ds8Item * pDs8Item;
|
||
|
||
if (idx < DS8ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs8Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs8Item += (idx - DS8ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDs8Item, pDat, sizeof(Ds8Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH)
|
||
{
|
||
return -1;
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
if (idx >= (DS8ITEMSIZE+DS8SIZEINNOR) ||
|
||
pDat == NULL ||
|
||
0 )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (idx < DS8ITEMSIZE)
|
||
{
|
||
Ds8Item * pDs8Item;
|
||
|
||
if (idx < DS8ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs8Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs8Item = (Ds8Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs8Item += (idx - DS8ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDs8Item, pDat, sizeof(Ds8Item));
|
||
}
|
||
else
|
||
{
|
||
/* // 不支持单个针步写入
|
||
u32 daddr;
|
||
daddr = GetAddrFromDatIdx(idx-DS8ITEMSIZE, sizeof(Ds8Item));
|
||
address = (u32)pDat;
|
||
NFlashWrData(daddr, (u16*)address, sizeof(Ds8Item)/2);
|
||
*/
|
||
return -1;
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
}
|
||
else if (g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(Ds4Item))
|
||
{
|
||
Ds4Item dsr;
|
||
|
||
dsr.ctrl = pDat->ctrl;
|
||
dsr.attr = pDat->attr;
|
||
dsr.dx = pDat->dx / 10;
|
||
dsr.dx = pDat->dy / 10;
|
||
|
||
if (g_datFile.storage == STORAGE_EXSRAM)
|
||
{
|
||
if (idx >= (DS4ITEMSIZE) ||
|
||
pDat == NULL ||
|
||
0 )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
{
|
||
Ds4Item * pDs4Item = &dsr;
|
||
|
||
if (idx < DS4ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs4Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs4Item += (idx - DS4ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDs4Item, pDat, sizeof(Ds4Item));
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH)
|
||
{
|
||
return -1;
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
if (idx >= (DS4ITEMSIZE+DS4SIZEINNOR) ||
|
||
pDat == NULL ||
|
||
0 )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (idx < DS4ITEMSIZE)
|
||
{
|
||
Ds4Item * pDs4Item = &dsr;
|
||
|
||
if (idx < DS4ITEMSIZE_AT_BUF1)
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff1BegAddr);
|
||
pDs4Item += idx;
|
||
}
|
||
else
|
||
{
|
||
pDs4Item = (Ds4Item*)(g_datFile.dataBuff2BegAddr);
|
||
pDs4Item += (idx - DS4ITEMSIZE_AT_BUF1);
|
||
}
|
||
memcpy(pDat, pDs4Item, sizeof(Ds4Item));
|
||
}
|
||
else
|
||
{
|
||
/* // 不支持单个针步写入
|
||
u32 daddr;
|
||
daddr = GetAddrFromDatIdx(idx-DS4ITEMSIZE, sizeof(Ds4Item));
|
||
address = (u32)(&dsr);
|
||
NFlashWrData(daddr, (u16*)(address), sizeof(Ds4Item)/2);
|
||
*/
|
||
}
|
||
|
||
return -1;
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
// begaddr 逻辑存储地址
|
||
int WriteFileData(u8 fileBlk, u32 begaddr, u8 * pBuf, u32 size)
|
||
{
|
||
if (pBuf == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (g_datFile.storage == STORAGE_EXSRAM)
|
||
{
|
||
u8 * pData;
|
||
if (begaddr+size <= g_datFile.dataBuff1Len)
|
||
{
|
||
pData = (u8 *)(g_datFile.dataBuff1BegAddr + begaddr);
|
||
}
|
||
else if (begaddr+size <= g_datFile.dataBuff1Len+g_datFile.dataBuff2Len)
|
||
{
|
||
pData = (u8 *)(g_datFile.dataBuff2BegAddr + begaddr - g_datFile.dataBuff1Len);
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
// printf("WriteFileData from 0x%x to 0x%x, size=%d\r\n", (u32)pBuf, (u32)pData, size);
|
||
memcpy(pData, pBuf, size);
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SPAREARAM)
|
||
{
|
||
u8 * pData;
|
||
if (begaddr+size <= g_datFile.dataBuff3Len)
|
||
{
|
||
pData = (u8 *)(g_datFile.dataBuff3BegAddr + begaddr);
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
// printf("WriteFileData from 0x%x to 0x%x, size=%d\r\n", (u32)pBuf, (u32)pData, size);
|
||
memcpy(pData, pBuf, size);
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH)
|
||
{
|
||
if ((begaddr+size) > DS16SIZEINNOR*sizeof(Ds16Item) ||
|
||
0 )
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
DatFlashWrDataWithErase(NOR_FILE_DATA+begaddr, (u8*)pBuf, size);
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
u8 * pData;
|
||
|
||
if (begaddr+size <= g_datFile.dataBuff1Len)
|
||
{
|
||
pData = (u8 *)(g_datFile.dataBuff1BegAddr + begaddr);
|
||
memcpy(pData, pBuf, size);
|
||
// printf("WriteFileData from 0x%x to 0x%x, size=%d\r\n", (u32)pBuf, (u32)pData, size);
|
||
}
|
||
else if (begaddr+size <= g_datFile.dataBuff1Len+g_datFile.dataBuff2Len)
|
||
{
|
||
pData = (u8 *)(g_datFile.dataBuff2BegAddr + begaddr - g_datFile.dataBuff1Len);
|
||
memcpy(pData, pBuf, size);
|
||
// printf("WriteFileData from 0x%x to 0x%x, size=%d\r\n", (u32)pBuf, (u32)pData, size);
|
||
}
|
||
else if (begaddr+size <= g_datFile.dataBuff1Len+g_datFile.dataBuff2Len+MAX_NOR_FILE_SIZE)
|
||
{
|
||
u32 daddr;
|
||
|
||
// ReleaseSpace(1);
|
||
|
||
daddr = GetAddrFromLAddr(begaddr-(g_datFile.dataBuff1Len+g_datFile.dataBuff2Len), size);
|
||
DatFlashWrDataWithErase(daddr, (u8*)pBuf, size);
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
u32 blkidx, blkaddr;
|
||
int bufidx;
|
||
if ((size) != DAT_BLOCK_SIZE || // 只能存储1个数据包的大小
|
||
(begaddr) >= g_datFile.pFileHead->fileHead.dataSize ||
|
||
0 )
|
||
{
|
||
printf("(size=%d) != DAT_BLOCK_SIZE or (begaddr=%d) > (dataSize=%d)\r\n", size, begaddr, g_datFile.pFileHead->fileHead.dataSize);
|
||
return -1;
|
||
}
|
||
|
||
// 计算当前数据包在整个数据中的起始地址
|
||
blkidx = begaddr / DAT_BLOCK_SIZE; // 块号
|
||
blkaddr = blkidx * DAT_BLOCK_SIZE; // 块地址
|
||
if (blkaddr != begaddr)
|
||
{
|
||
printf("(blkaddr=%d) != (begaddr=%d)\r\n", blkaddr, begaddr);
|
||
return -1;
|
||
}
|
||
|
||
// 找到无效buf作为新数据存储区域
|
||
bufidx = -1;
|
||
for (int i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID && g_datFile.pDatExCtrl->datExBeg[i] == blkaddr) // 已存储区域有相同的存储地址
|
||
{
|
||
printf("save dat to same addr, blkidx=%d\r\n", blkidx);
|
||
// 数据存在时不再重复存储
|
||
break;
|
||
}
|
||
else if (g_datFile.pDatExCtrl->exbufFlag[i] == 0)
|
||
{
|
||
bufidx = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (bufidx >= 0 && bufidx < FILE_EXBUF_NUM)
|
||
{
|
||
u8 * pData;
|
||
g_datFile.pDatExCtrl->exbufFlag[bufidx] = DATA_VALID; // 增加标志计数
|
||
g_datFile.pDatExCtrl->datExBeg[bufidx] = blkaddr; // 记录起始地址
|
||
pData = (u8*)(&(g_datFile.pDatExCtrl->datExBlock[bufidx])); // 数据在buff中的实际地址
|
||
memcpy(pData, pBuf, size);
|
||
printf("save data bldidx=%d begaddr=0x%x to bufidx=%d\r\n", blkidx, begaddr, bufidx);
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
// 判断数据是否在缓冲区中
|
||
// return:0,索引不在当前存储范围内
|
||
int IsDatIdxInBuf(int idx)
|
||
{
|
||
int i;
|
||
u32 dataddr;
|
||
int rslt = 0;
|
||
|
||
if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
if ((g_datFile.enflag == DATA_VALID) &&
|
||
(g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(DataItem)) &&
|
||
1 )
|
||
{
|
||
// 当前索引的数据需要在缓冲区中
|
||
if (idx >= 0 || idx < (s32)g_datFile.pFileHead->fileHead.itemNums)
|
||
{
|
||
for (i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID)
|
||
{
|
||
dataddr = idx * sizeof(DataItem); // 数据在文件中的地址
|
||
|
||
if ((dataddr >= g_datFile.pDatExCtrl->datExBeg[i]) &&
|
||
(dataddr < g_datFile.pDatExCtrl->datExBeg[i]+DAT_BLOCK_SIZE) ) // 在范围内,命中
|
||
{
|
||
rslt = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
rslt = 1;
|
||
}
|
||
return rslt;
|
||
}
|
||
|
||
#define MAX_IDX_RANGE 7
|
||
#define MIN_IDX_RANGE 3 // 请求范围 向后:向前 7:3 当前索引所在数据块计入向后部分
|
||
|
||
// 根据索引来预先装载文件数据
|
||
int GetBlockIdxNeedtoLoad(int datidx)
|
||
{
|
||
int curidx, curaddr, minaddr, maxaddr, maxblkaddr, tempaddr;
|
||
int requestIdx = -1;
|
||
int rslt;
|
||
|
||
if (g_datFile.pFileHead->fileHead.bytesPerItem == sizeof(DataItem))
|
||
{
|
||
curidx = datidx;
|
||
if (curidx < 0)
|
||
{
|
||
curidx = 0;
|
||
}
|
||
else if (curidx >= g_datFile.pFileHead->fileHead.itemNums)
|
||
{
|
||
curidx = g_datFile.pFileHead->fileHead.itemNums - 1;
|
||
}
|
||
|
||
curaddr = curidx * sizeof(Ds16Item); // 当前索引在文件内的地址
|
||
curaddr /= DAT_BLOCK_SIZE;
|
||
curaddr *= DAT_BLOCK_SIZE; // 计算当前索引所在数据块起始地址
|
||
|
||
minaddr = curaddr - FILE_EXBUF_NUM * MIN_IDX_RANGE / 10 * DAT_BLOCK_SIZE;
|
||
if (minaddr < 0)
|
||
{
|
||
minaddr = 0;
|
||
}
|
||
|
||
maxblkaddr = (g_datFile.pFileHead->fileHead.itemNums - 1) * sizeof(Ds16Item);
|
||
maxblkaddr /= DAT_BLOCK_SIZE;
|
||
maxblkaddr *= DAT_BLOCK_SIZE;
|
||
|
||
maxaddr = curaddr + (FILE_EXBUF_NUM * MAX_IDX_RANGE / 10 - 1) * DAT_BLOCK_SIZE;
|
||
if (maxaddr > maxblkaddr)
|
||
{
|
||
maxaddr = maxblkaddr;
|
||
}
|
||
|
||
for (int i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID)
|
||
{
|
||
if (g_datFile.pDatExCtrl->datExBeg[i] < minaddr ||
|
||
g_datFile.pDatExCtrl->datExBeg[i] > maxaddr ||
|
||
0)
|
||
{
|
||
g_datFile.pDatExCtrl->exbufFlag[i] = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
tempaddr = curaddr;
|
||
while(tempaddr <= maxaddr)
|
||
{
|
||
rslt = 0;
|
||
for (int i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID)
|
||
{
|
||
if (tempaddr == g_datFile.pDatExCtrl->datExBeg[i])
|
||
{
|
||
rslt = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (rslt == 0)
|
||
{
|
||
requestIdx = tempaddr;
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
tempaddr += DAT_BLOCK_SIZE;
|
||
}
|
||
}
|
||
|
||
if (requestIdx < 0)
|
||
{
|
||
tempaddr = curaddr;
|
||
while(tempaddr >= minaddr)
|
||
{
|
||
rslt = 0;
|
||
for (int i = 0; i < FILE_EXBUF_NUM; i++)
|
||
{
|
||
if (g_datFile.pDatExCtrl->exbufFlag[i] == DATA_VALID)
|
||
{
|
||
if (tempaddr == g_datFile.pDatExCtrl->datExBeg[i])
|
||
{
|
||
rslt = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (rslt == 0)
|
||
{
|
||
requestIdx = tempaddr;
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
tempaddr -= DAT_BLOCK_SIZE;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (requestIdx >= 0)
|
||
{
|
||
requestIdx /= DAT_BLOCK_SIZE;
|
||
}
|
||
|
||
return requestIdx;
|
||
}
|
||
|
||
void OutFileInfo(void)
|
||
{
|
||
printf("\r\ndata file info:\r\n");
|
||
|
||
printf("\tenflag=0x%x, storage=0x%x, ", g_datFile.enflag, g_datFile.storage);
|
||
if (g_datFile.storage == STORAGE_EXSRAM)
|
||
{
|
||
printf("data store at exsram\r\n");
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NORFLASH)
|
||
{
|
||
printf("data store at norflash\r\n");
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NANDFLASH)
|
||
{
|
||
printf("data store at nandflash\r\n");
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SRAMANDNOR)
|
||
{
|
||
printf("data store at exsram and norflash\r\n");
|
||
}
|
||
else if (g_datFile.storage == STORAGE_NETWORK)
|
||
{
|
||
printf("data store at network\r\n");
|
||
}
|
||
else if (g_datFile.storage == STORAGE_SPAREARAM)
|
||
{
|
||
printf("data store at frame exram\r\n");
|
||
}
|
||
else
|
||
{
|
||
printf("not support storage type\r\n");
|
||
}
|
||
|
||
printf("\r\n\tfilehead:\r\n");
|
||
printf("\tfilename=%s\r\n", g_datFile.pFileHead->fileHead.fileName);
|
||
printf("\tfilelen=%d,itemnums=%d,bytesperitem=%d,bytesperblk=%d\r\n", \
|
||
g_datFile.pFileHead->fileHead.dataSize, g_datFile.pFileHead->fileHead.itemNums, g_datFile.pFileHead->fileHead.bytesPerItem, g_datFile.pFileHead->fileHead.bytesPerBlk);
|
||
printf("\tchecksum=0x%x,checkCrc=0x%x\r\n", g_datFile.pFileHead->fileHead.dataChecksum, g_datFile.pFileHead->fileHead.checkCrc);
|
||
|
||
printf("\tbegHead=%d\r\n", g_datFile.pFileHead->fileHead.begHead);
|
||
|
||
printf("\tfileID=0x%x\r\n", g_datFile.pFileHead->fileHead.fileid);
|
||
|
||
printf("\tanchorx=%d,anchory=%d,\r\n\tbeginx=%d,beginy=%d,beginr=%d\r\n\tminx=%d,maxx=%d,miny=%d,maxy=%d\r\n", \
|
||
g_datFile.pFileHead->fileHead.anchorX, g_datFile.pFileHead->fileHead.anchorY, \
|
||
g_datFile.pFileHead->fileHead.beginX, g_datFile.pFileHead->fileHead.beginY, g_datFile.pFileHead->fileHead.beginR,\
|
||
g_datFile.pFileHead->fileHead.minX,g_datFile.pFileHead->fileHead.maxX,g_datFile.pFileHead->fileHead.minY,g_datFile.pFileHead->fileHead.maxY);
|
||
|
||
printf("\tanchorx2=%d,anchory2=%d,\r\n\tbeginx2=%d,beginy2=%d,beginr2=%d\r\n", \
|
||
g_datFile.pFileHead->fileHead.anchorX2, g_datFile.pFileHead->fileHead.anchorY2, \
|
||
g_datFile.pFileHead->fileHead.beginX2, g_datFile.pFileHead->fileHead.beginY2, g_datFile.pFileHead->fileHead.beginR2);
|
||
|
||
printf("\tEnFlag=0x%x,offsetX=%d,offsetY=%d\r\n", g_datFile.pFileHead->fileHead.EnFlag,
|
||
g_datFile.pFileHead->fileHead.offsetX, g_datFile.pFileHead->fileHead.offsetY);
|
||
|
||
printf("\txRepeatNums=%d,yRepeatNums=%d,xRepeatDistance=%d,yRepeatDistance=%d\r\n", g_datFile.pFileHead->fileHead.xRepeatNums,
|
||
g_datFile.pFileHead->fileHead.yRepeatNums, g_datFile.pFileHead->fileHead.xRepeatDistance, g_datFile.pFileHead->fileHead.yRepeatDistance);
|
||
}
|
||
|
||
//---------------------------------------------------------------------------------------------------------
|
||
// 判断文件是否有效
|
||
int IsDatFileAvailable(void)
|
||
{
|
||
if (g_datFile.enflag == DATA_VALID)
|
||
{
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
// 判断文件索引值是否有效
|
||
int IsDatIndexAvailable(u32 idx)
|
||
{
|
||
if (IsDatFileAvailable() == TRUE)
|
||
{
|
||
if (idx < (s32)g_datFile.pFileHead->fileHead.itemNums)
|
||
{
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
u32 GetFileItemNums(void)
|
||
{
|
||
return g_datFile.pFileHead->fileHead.itemNums;
|
||
}
|
||
|
||
s32 GetFileWide(void)//文件宽度
|
||
{
|
||
return (g_datFile.pFileHead->fileHead.maxX-g_datFile.pFileHead->fileHead.minX);
|
||
}
|
||
|
||
s32 GetFileHigh(void)//文件高度
|
||
{
|
||
return (g_datFile.pFileHead->fileHead.maxY-g_datFile.pFileHead->fileHead.minY);
|
||
}
|
||
|
||
// 文件失效
|
||
int InvalidDatFile(u32 idx)
|
||
{
|
||
printf("InvalidDatFile\r\n");
|
||
|
||
g_datFile.enflag = 0;
|
||
return TRUE;
|
||
}
|
||
|
||
int AvalidDatFile(u32 idx)
|
||
{
|
||
printf("AvalidDatFile\r\n");
|
||
|
||
g_datFile.enflag = DATA_VALID;
|
||
return TRUE;
|
||
}
|
||
|
||
// 数据块失效
|
||
void InvalidDatBlock(void)
|
||
{
|
||
printf("InvalidDatBlock\r\n");
|
||
|
||
memset(&(g_datFile.pDatExCtrl->exbufFlag[0]), 0, sizeof(int)*FILE_EXBUF_NUM); // 数据交换区域清空
|
||
}
|
||
|
||
void SetNewDatFlag(u32 idx, int en)
|
||
{
|
||
g_datFile.newFile = en;
|
||
}
|
||
|
||
int IsNewDatFile(u32 idx)
|
||
{
|
||
if (g_datFile.newFile != 0)
|
||
{
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
void ReSetFileParaOld(DataFilePara * pNewPara)
|
||
{
|
||
s32 tbx, tby;
|
||
tbx = pNewPara->beginX - g_datFile.pFileHead->fileHead.beginX;
|
||
tby = pNewPara->beginY - g_datFile.pFileHead->fileHead.beginY;
|
||
|
||
g_datFile.pFileHead->fileHead.minX += tbx;
|
||
g_datFile.pFileHead->fileHead.maxX += tbx;
|
||
g_datFile.pFileHead->fileHead.minY += tby;
|
||
g_datFile.pFileHead->fileHead.maxY += tby; // 起始点发生变化, 轮廓会跟着改变
|
||
|
||
g_datFile.pFileHead->fileHead.anchorX = pNewPara->anchorX;
|
||
g_datFile.pFileHead->fileHead.anchorY = pNewPara->anchorY;
|
||
g_datFile.pFileHead->fileHead.beginX = pNewPara->beginX;
|
||
g_datFile.pFileHead->fileHead.beginY = pNewPara->beginY;
|
||
|
||
SetNewDatFlag(0, TRUE);
|
||
}
|
||
|
||
|
||
void ReSetFilePara(DataFileHead * pNewPara)
|
||
{
|
||
printf("set new file para:\r\n\r\n");
|
||
|
||
#if (0)
|
||
printf("before set, filepara:\r\n");
|
||
OutFileInfo();
|
||
#endif
|
||
|
||
// 比较前面字节
|
||
|
||
// 拷贝参数部分
|
||
|
||
// 20210902 适配边框刺绣
|
||
//memcpy(g_datFile.pFileHead->headparts.fileparas, pNewPara->headparts.fileparas, sizeof(pNewPara->headparts.fileparas));
|
||
memcpy(g_datFile.pFileHead, pNewPara, sizeof(DataFileHead));
|
||
|
||
SetNewDatFlag(0, TRUE);
|
||
|
||
#if (0)
|
||
printf("after set, filepara:\r\n");
|
||
OutFileInfo();
|
||
#endif
|
||
}
|
||
|
||
// 文件参数校验
|
||
u16 GetFileParaCheckCrc(void)
|
||
{
|
||
u16 crc;
|
||
crc = 0;
|
||
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.anchorX, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.anchorY, sizeof(u32));
|
||
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.beginX, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.beginY, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.beginR, sizeof(u32));
|
||
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.minX, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.maxX, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.minY, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.maxY, sizeof(u32));
|
||
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.sizeX, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.sizeY, sizeof(u32));
|
||
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.anchorX2, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.anchorY2, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.beginX2, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.beginY2, sizeof(u32));
|
||
crc += CalcCrc16((u8*)&g_datFile.pFileHead->fileHead.beginR2, sizeof(u32));
|
||
|
||
return crc;
|
||
}
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
void InitTempData(int type)
|
||
{
|
||
u8 * pData = NULL;
|
||
|
||
if (type == TEMP_DATA1)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA1_ADDR);
|
||
memset(pData, 0, TEMP_DATA1_SIZE);
|
||
}
|
||
else if (type == TEMP_DATA2)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA2_ADDR);
|
||
memset(pData, 0, TEMP_DATA2_SIZE);
|
||
}
|
||
else if (type == TEMP_DATA3)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA3_ADDR);
|
||
memset(pData, 0, TEMP_DATA3_SIZE);
|
||
}
|
||
else if (type == TEMP_DATA4)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA4_ADDR);
|
||
memset(pData, 0, TEMP_DATA4_SIZE);
|
||
}
|
||
}
|
||
|
||
u8 * GetTempData(int type)
|
||
{
|
||
u8 * pData = NULL;
|
||
|
||
if (type == TEMP_DATA1)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA1_ADDR);
|
||
}
|
||
else if (type == TEMP_DATA2)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA2_ADDR);
|
||
}
|
||
else if (type == TEMP_DATA3)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA3_ADDR);
|
||
}
|
||
else if (type == TEMP_DATA4)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA4_ADDR);
|
||
}
|
||
|
||
return pData;
|
||
}
|
||
|
||
int SetTempData(int type, int idx, u8 * pBuf)
|
||
{
|
||
if (pBuf == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
u8 * pData = NULL;
|
||
|
||
if (type == TEMP_DATA1)
|
||
{
|
||
if ((idx+1)*1024 <= TEMP_DATA1_SIZE)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA1_ADDR + idx*1024);
|
||
}
|
||
}
|
||
else if (type == TEMP_DATA2)
|
||
{
|
||
if ((idx+1)*1024 <= TEMP_DATA2_SIZE)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA2_ADDR + idx*1024);
|
||
}
|
||
}
|
||
else if (type == TEMP_DATA3)
|
||
{
|
||
if ((idx+1)*1024 <= TEMP_DATA3_SIZE)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA3_ADDR + idx*1024);
|
||
}
|
||
}
|
||
else if (type == TEMP_DATA4)
|
||
{
|
||
if ((idx+1)*1024 <= TEMP_DATA4_SIZE)
|
||
{
|
||
pData = (u8 *)(TEMP_DATA4_ADDR + idx*1024);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return -3;
|
||
}
|
||
|
||
if (pData != NULL)
|
||
{
|
||
memcpy(pData, pBuf, 1024);
|
||
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
return -2;
|
||
}
|
||
}
|
||
|
||
//-------------------------------------------------------------------------
|
||
int GetMinMaxFromFileDatWithAnchor(s32 * pminx, s32 * pmaxx, s32 * pminy, s32 * pmaxy)
|
||
{
|
||
return GetMinMaxFromFileDatBase(1, pminx, pmaxx, pminy, pmaxy);
|
||
}
|
||
|
||
int GetMinMaxFromFileDat(s32 * pminx, s32 * pmaxx, s32 * pminy, s32 * pmaxy)
|
||
{
|
||
return GetMinMaxFromFileDatBase(0, pminx, pmaxx, pminy, pmaxy);
|
||
}
|
||
|
||
int GetMinMaxFromFileDatBase(int point, s32 * pminx, s32 * pmaxx, s32 * pminy, s32 * pmaxy)
|
||
{
|
||
s32 minx, maxx, miny, maxy, actx, acty;
|
||
u32 idx, nums;
|
||
DataItem item;
|
||
int rslt;
|
||
|
||
if (IsDatFileAvailable() != TRUE)
|
||
{
|
||
minx = 0;
|
||
maxx = 0;
|
||
miny = 0;
|
||
maxy = 0;
|
||
}
|
||
else
|
||
{
|
||
nums = g_datFile.pFileHead->fileHead.itemNums;
|
||
|
||
if (point == 0)
|
||
{
|
||
actx = g_datFile.pFileHead->fileHead.beginX;
|
||
acty = g_datFile.pFileHead->fileHead.beginY;
|
||
}
|
||
else
|
||
{
|
||
actx = g_datFile.pFileHead->fileHead.anchorX;
|
||
acty = g_datFile.pFileHead->fileHead.anchorY;
|
||
}
|
||
|
||
minx = actx;
|
||
maxx = actx;
|
||
miny = acty;
|
||
maxy = acty;
|
||
|
||
if (point == 0)
|
||
{
|
||
printf("file info, begx=%d, begy=%d\r\n", actx, acty);
|
||
}
|
||
else
|
||
{
|
||
printf("file info, anchorX=%d, anchorY=%d\r\n", actx, acty);
|
||
}
|
||
|
||
for (idx = 0; idx < nums; idx++)
|
||
{
|
||
rslt = GetADataItemNoSqrt(0, idx, &item);
|
||
if (rslt != 0)
|
||
{
|
||
printf("get item error at GetMinMaxFromFileDatBase, rslt = %d\r\n", rslt);
|
||
break; // 结束
|
||
}
|
||
|
||
if (item.ctrl == DATA_END || // 结束码
|
||
item.ctrl == DATA_NULL || // 文件结束
|
||
item.ctrl == DATA_END_OLD || // 结束
|
||
0 )
|
||
{
|
||
idx++;
|
||
break;
|
||
}
|
||
|
||
if (item.ctrl == DATA_PAUSE || // 暂停功能码
|
||
item.ctrl == DATA_PAUSE_OLD || // 暂停功能码
|
||
item.ctrl == DATA_CHGND || // 换针功能码(换色)
|
||
item.ctrl == DATA_CUTTRD || // 剪线功能码
|
||
item.ctrl == DATA_CUT_OLD || // 剪线功能码
|
||
item.ctrl == DATA_ANGLE || // 拐点
|
||
item.ctrl == DATA_ANGLE_OLD || // 拐点
|
||
0 )
|
||
{
|
||
continue;
|
||
}
|
||
|
||
actx += item.dx;
|
||
acty += item.dy;
|
||
|
||
if (actx < minx)
|
||
{
|
||
minx = actx;
|
||
}
|
||
if (actx > maxx)
|
||
{
|
||
maxx = actx;
|
||
}
|
||
|
||
if (acty < miny)
|
||
{
|
||
miny = acty;
|
||
}
|
||
if (acty > maxy)
|
||
{
|
||
maxy = acty;
|
||
}
|
||
}
|
||
g_datFile.pFileHead->fileHead.itemNums = idx;
|
||
}
|
||
|
||
printf("GetMinMaxFromFileDatBase, num=%d minx=%d, maxx=%d, miny=%d, maxy=%d \r\n", g_datFile.pFileHead->fileHead.itemNums, minx, maxx, miny, maxy);
|
||
|
||
*pminx = minx;
|
||
*pmaxx = maxx;
|
||
*pminy = miny;
|
||
*pmaxy = maxy;
|
||
|
||
return 0;
|
||
}
|
||
|
||
void InitDatFiles(void)
|
||
{
|
||
memset(&g_datFile, 0, sizeof(DatFileCtrl));
|
||
|
||
g_datFile.pFileHead = &g_fileHead1;
|
||
|
||
g_datFile.dataBuff1BegAddr = DATA_FILE_ADDR1; // 存放区域1
|
||
g_datFile.dataBuff1Len = DATA_FILE_SIZE1;
|
||
|
||
g_datFile.dataBuff2BegAddr = DATA_FILE_ADDR2; // 存放区域2
|
||
g_datFile.dataBuff2Len = DATA_FILE_SIZE2;
|
||
|
||
g_datFile.dataBuff3BegAddr = DATA3_BASE_ADDR; // 存放区域3,用于存放边框刺绣等类型的数据文件
|
||
g_datFile.dataBuff3Len = DATA_FILE_SIZE3;
|
||
|
||
g_datFile.pDatExCtrl = (DatExCtrl*)g_datFile.dataBuff1BegAddr;
|
||
g_datFile.enflag = 0;
|
||
|
||
InitNorSpi(); // 初始化 nor flash 访问 SPI
|
||
DatFlashInit(SetNorSpiNssOn, SetNorSpiNssOff, NorSpiReadByte, NorSpiWriteByte);
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
//---------------------------------------------------------------------------------------------------------
|
||
// 生成数据文件的算法
|
||
|
||
#if (1)
|
||
|
||
// 支持ds8 和 ds16
|
||
#define DATA_ITEM Ds8Item // Ds16Item
|
||
#define SAVE_LEN 8 // 16
|
||
|
||
// 分割直线
|
||
int CalcLine(double x0, double y0, double x1, double y1, int * pactx, int * pacty, int stepSize, DATA_ITEM * pData, u8 type, s16 dr)
|
||
{
|
||
double length, tmp;
|
||
double stepx, stepy;
|
||
double sx, sy;
|
||
double xlk;
|
||
int i, count;
|
||
int actx, acty;
|
||
s32 sdx, sdy;
|
||
u8 attr;
|
||
|
||
attr = 0;
|
||
|
||
if (x0 == x1 && y0 == y1)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if (x0 > x1)
|
||
{
|
||
sx = -1.0; // x反向
|
||
}
|
||
else
|
||
{
|
||
sx = 1.0;
|
||
}
|
||
|
||
if (y0 > y1)
|
||
{
|
||
sy = -1.0; // y反向
|
||
}
|
||
else
|
||
{
|
||
sy = 1.0;
|
||
}
|
||
|
||
// 开始分割针步
|
||
length = sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
|
||
tmp = length/stepSize; // 实际针步数
|
||
count = (int)(tmp); // 最少整针步数
|
||
|
||
if (tmp - count >= 0.5)
|
||
{
|
||
count += 1;
|
||
// printf("count++=%d\r\n", count);
|
||
}
|
||
|
||
if (count == 0 && length > 0) // 短直线
|
||
{
|
||
count = 1;
|
||
}
|
||
|
||
if (pData == NULL)
|
||
{
|
||
return count;
|
||
}
|
||
|
||
actx = *pactx;
|
||
acty = *pacty;
|
||
|
||
if (x1 != x0 && y1 == y0) // 横直线
|
||
{
|
||
// printf("H Line: \r\n");
|
||
sdy = 0;
|
||
for (i = 0; i < count; i++)
|
||
{
|
||
tmp = ((i+1)*(length)/count)*sx + x0; // 实际坐标
|
||
|
||
stepx = (tmp - actx);
|
||
sdx = (s32)(stepx+0.5*sx);
|
||
|
||
pData[i].ctrl = type;
|
||
pData[i].attr = attr;
|
||
pData[i].dx = sdx;
|
||
pData[i].dy = sdy;
|
||
pData[i].dr = 0;
|
||
|
||
#if (SAVE_LEN == 16)
|
||
{
|
||
double len;
|
||
len = sqrt(1.0*sdx*sdx + 1.0*sdy*sdy);
|
||
pData[i].len = (u16)(len+0.9);
|
||
}
|
||
#endif
|
||
actx += sdx;
|
||
acty += sdy;
|
||
}
|
||
}
|
||
else if (x1 == x0 && y1 != y0) // 竖直线
|
||
{
|
||
// printf("v Line: \r\n");
|
||
|
||
sdx = 0;
|
||
for (i = 0; i < count; i++)
|
||
{
|
||
tmp = ((i+1)*(length)/count)*sy + y0; // 实际针步
|
||
|
||
stepy = (tmp - acty);
|
||
sdy = (s32)(stepy+0.5*sy);
|
||
|
||
pData[i].ctrl = type;
|
||
pData[i].attr = attr;
|
||
pData[i].dx = sdx;
|
||
pData[i].dy = sdy;
|
||
pData[i].dr = 0;
|
||
|
||
#if (SAVE_LEN == 16)
|
||
len = sqrt(1.0*sdx*sdx + 1.0*sdy*sdy);
|
||
pData[i].len = (u16)(len+0.9);
|
||
#endif
|
||
actx += sdx;
|
||
acty += sdy;
|
||
}
|
||
}
|
||
else if(x1 != x0 && y1 != y0) // 任意斜线
|
||
{
|
||
// 斜率
|
||
xlk = (y1-y0)/(x1-x0);
|
||
// printf("any Line: k=%f\r\n", xlk);
|
||
|
||
for (i = 0; i < count; i++)
|
||
{
|
||
tmp = ((i+1)*(length)/count); // 实际针步
|
||
|
||
stepx = fabs(tmp*cos(atan(xlk)))*sx + x0 - actx;
|
||
stepy = fabs(tmp*sin(atan(xlk)))*sy + y0 - acty;
|
||
|
||
sdx = (s32)(stepx+0.5*sx);
|
||
sdy = (s32)(stepy+0.5*sy);
|
||
|
||
pData[i].ctrl = type;
|
||
pData[i].attr = attr;
|
||
pData[i].dx = sdx;
|
||
pData[i].dy = sdy;
|
||
pData[i].dr = 0;
|
||
|
||
#if (SAVE_LEN == 16)
|
||
len = sqrt(1.0*sdx*sdx + 1.0*sdy*sdy);
|
||
pData[i].len = (u16)(len+0.9);
|
||
#endif
|
||
actx += sdx;
|
||
acty += sdy;
|
||
}
|
||
}
|
||
pData[0].dr = dr; // 第一段数据添加r变化量
|
||
|
||
*pactx = actx;
|
||
*pacty = acty;
|
||
|
||
return count;
|
||
}
|
||
|
||
//---------------------------------------------------------------------------------------------------------
|
||
// 圆弧
|
||
|
||
// 旋转坐标值
|
||
void Rotatec(double xin, double yin, double * px, double * py, double angle)
|
||
{
|
||
*px=xin*cos(angle)-yin*sin(angle);
|
||
*py=xin*sin(angle)+yin*cos(angle);
|
||
}
|
||
|
||
// 根据坐标确定增加方向
|
||
int ArcDir(const double x[], const double y[])
|
||
{
|
||
double k;
|
||
if(x[1] > x[0])
|
||
{
|
||
k = (y[1] - y[0]) / (x[1]-x[0]);
|
||
if (y[2] < (k*(x[2]-x[1]) + y[1]))
|
||
{
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
return 1;
|
||
}
|
||
}
|
||
else if (x[1] < x[0])
|
||
{
|
||
k = (y[1] - y[0]) / (x[1] - x[0]);
|
||
if (y[2] < (k * (x[2]-x[1]) + y[1]))
|
||
{
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
}
|
||
else if ( (x[2]>x[1] && y[1]<y[0]) || (x[2]<x[1] && y[0]<y[1]) )
|
||
{
|
||
return 1;
|
||
}
|
||
else if ( (x[2]>x[1] && y[1]>y[0]) || (x[2]<x[1] && y[0]>y[1]) )
|
||
{
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
printf("1. what's this case?\r\n");
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
// 三点共线
|
||
int IsThreePointOnALine(const double threex[], const double threey[])
|
||
{
|
||
double k0,k1,k2;
|
||
|
||
if ((fabs(threex[0]-threex[1]) < 1e-6) &&
|
||
(fabs(threex[0]-threex[2]) < 1e-6) &&
|
||
(fabs(threex[2]-threex[1]) < 1e-6) &&
|
||
(fabs(threey[0]-threey[1]) < 1e-6) &&
|
||
(fabs(threey[0]-threey[2]) < 1e-6) &&
|
||
(fabs(threey[2]-threey[1]) < 1e-6) &&
|
||
1 )
|
||
{
|
||
// printf("1.IsThreePointOnALine\r\n");
|
||
return 1;
|
||
}
|
||
else if ( ((fabs(threex[0]-threex[1]) < 1e-6) && (fabs(threey[0]-threey[1]) < 1e-6)) ||
|
||
((fabs(threex[0]-threex[2]) < 1e-6) && (fabs(threey[0]-threey[2]) < 1e-6)) ||
|
||
((fabs(threex[2]-threex[1]) < 1e-6) && (fabs(threey[2]-threey[1]) < 1e-6)) ||
|
||
0 )
|
||
{
|
||
// printf("2.IsThreePointOnALine\r\n");
|
||
return 1;
|
||
}
|
||
else if ( (fabs(threex[0]-threex[1]) < 1e-6) &&
|
||
(fabs(threex[0]-threex[2]) < 1e-6) &&
|
||
(fabs(threex[2]-threex[1]) < 1e-6) &&
|
||
1 )
|
||
{
|
||
// printf("3.IsThreePointOnALine\r\n");
|
||
return 1;
|
||
}
|
||
else if ( (fabs(threey[0]-threey[1]) < 1e-6) &&
|
||
(fabs(threey[0]-threey[2]) < 1e-6) &&
|
||
(fabs(threey[2]-threey[1]) < 1e-6) &&
|
||
1 )
|
||
{
|
||
// printf("4.IsThreePointOnALine\r\n");
|
||
return 1;
|
||
}
|
||
else if ( (fabs(threex[2]-threex[1]) >= 1e-6) &&
|
||
(fabs(threex[2]-threex[0]) >= 1e-6) &&
|
||
(fabs(threex[1]-threex[0]) >= 1e-6) &&
|
||
(fabs(threey[2]-threey[1]) >= 1e-6) &&
|
||
(fabs(threey[2]-threey[0]) >= 1e-6) &&
|
||
(fabs(threey[1]-threey[0]) >= 1e-6) &&
|
||
1 )
|
||
{
|
||
k0 = (threey[2]-threey[1])/(threex[2]-threex[1]);
|
||
k1 = (threey[2]-threey[0])/(threex[2]-threex[0]);
|
||
k2 = (threey[1]-threey[0])/(threex[1]-threex[0]);
|
||
|
||
if(fabs(k0-k1) < 1e-6 && fabs(k1-k2) < 1e-6)
|
||
{
|
||
// printf("5.IsThreePointOnALine\r\n");
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
// printf("6.IsThreePointOnALine\r\n");
|
||
return 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// printf("7.IsThreePointOnALine\r\n");
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
// 得到圆心和半径
|
||
int GetArcCenter(const double x[], const double y[], double * pxc, double * pyc, double * pr)
|
||
{
|
||
long double a, b, c, d, e, f;
|
||
double xc, yc, r;
|
||
|
||
if (IsThreePointOnALine(x, y) == 1)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
a = 2 * (x[1]-x[0]);
|
||
b = 2 * (y[1]-y[0]);
|
||
c = x[1]*x[1] + y[1]*y[1] - x[0]*x[0] - y[0]*y[0];
|
||
d = 2 * (x[2]-x[1]);
|
||
e = 2 * (y[2]-y[1]);
|
||
f = x[2]*x[2] + y[2]*y[2] - x[1]*x[1] - y[1]*y[1];
|
||
|
||
xc = (b*f-e*c)/(b*d-e*a);
|
||
yc = (d*c-a*f)/(b*d-e*a);
|
||
r = sqrt((xc-x[0])*(xc-x[0])+(yc-y[0])*(yc-y[0]));
|
||
|
||
*pxc = xc;
|
||
*pyc = yc;
|
||
*pr = r;
|
||
|
||
return 0;
|
||
}
|
||
|
||
// 得到直线角度和角度差
|
||
|
||
s16 GetAngle(const double bx, const double by, const double ex, const double ey, int * pActAng)
|
||
{
|
||
double cosf, angle, length;
|
||
s32 dr;
|
||
|
||
length = sqrt((ex-bx)*(ex-bx) + (ey-by)*(ey-by));
|
||
if (length != 0)
|
||
{
|
||
// 计算直线角度(和x正方向的夹角。弧度表示,范围为 0--2PI)
|
||
cosf = (ex-bx)/length;
|
||
angle = acos(cosf);
|
||
if (ey < by)
|
||
{
|
||
angle = 2*PI - angle;
|
||
}
|
||
|
||
// 角度差
|
||
if ((angle*RADIAN_ACCURACY - *pActAng) > PI*RADIAN_ACCURACY) // 角度差大于180度,
|
||
{
|
||
dr = (s32)(angle*RADIAN_ACCURACY - *pActAng - 2*PI* RADIAN_ACCURACY); // 反向到达目标角度
|
||
*pActAng += (int)(2*PI*RADIAN_ACCURACY)+dr; // 实际位置
|
||
}
|
||
else if ((angle*RADIAN_ACCURACY - *pActAng) < (-1)*PI*RADIAN_ACCURACY) // 角度差大于180度
|
||
{
|
||
dr = (s32)(angle*RADIAN_ACCURACY - *pActAng + 2*PI* RADIAN_ACCURACY);
|
||
*pActAng += (int)(-2*PI*RADIAN_ACCURACY)+dr; // 实际位置
|
||
}
|
||
else
|
||
{
|
||
dr = (s32)(angle*RADIAN_ACCURACY - *pActAng); // 正向
|
||
*pActAng += dr;
|
||
}
|
||
|
||
while (*pActAng > 2*PI*RADIAN_ACCURACY)
|
||
{
|
||
*pActAng -= 2*PI*RADIAN_ACCURACY;
|
||
}
|
||
while (*pActAng < 0)
|
||
{
|
||
*pActAng += 2*PI*RADIAN_ACCURACY;
|
||
}
|
||
|
||
return dr;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
// 分割圆弧线
|
||
int CalcCurve(double threex[], double threey[], int * pactx, int * pacty, int * pActAng, int stepSize, DATA_ITEM * pData, u8 type)
|
||
{
|
||
u8 attr;
|
||
s16 dx, dy, dr;
|
||
|
||
double k, alph, increment;
|
||
double xc, yc, r;
|
||
double distance2;
|
||
double curx, cury, lastx, lasty;
|
||
double xrot, yrot;
|
||
int actx, acty;
|
||
int ddx, ddy;
|
||
int count = 0;
|
||
int i;
|
||
|
||
dx = 0;
|
||
dy = 0;
|
||
dr = 0;
|
||
// printf("Calc Curve x0=%.2f,y0=%.2f,x1=%.2f,\r\n\t y1=%.2f,x2=%.2f,y2=%.2f\r\n", threex[0],threey[0],threex[1],threey[1],threex[2],threey[2]);
|
||
|
||
if(IsThreePointOnALine(threex, threey) == 1) // 3点共线
|
||
{
|
||
// 直线和X坐标轴正方向的夹角, 公式: cosφ=∣A1A2+B1B2∣/[√(A1^2+B1^2)√(A2^2+B2^2)]
|
||
if (pData != NULL)
|
||
{
|
||
dr = GetAngle(threex[0], threey[0], threex[2], threey[2], pActAng);
|
||
}
|
||
return CalcLine(threex[0], threey[0], threex[2], threey[2], pactx, pacty, stepSize, pData, type, dr); // 作为直线分割
|
||
}
|
||
|
||
// 计算圆心和半径
|
||
GetArcCenter(threex, threey, &xc, &yc, &r);
|
||
|
||
printf("center=%f,%f,r=%f\r\n", xc, yc, r);
|
||
|
||
// 计算弦长和圆心角
|
||
distance2 = ((threex[0]-threex[2])*(threex[0]-threex[2])+(threey[0]-threey[2])*(threey[0]-threey[2])); // 两点间距离就是弦长
|
||
k = ((r*r+r*r)-distance2)/(2*r*r); // cosc = (a*a + b*b - c*c)/2*a*b
|
||
if (k < -1)
|
||
{
|
||
k = -1;
|
||
}
|
||
else if (k > 1)
|
||
{
|
||
k = 1;
|
||
}
|
||
|
||
#if (0)
|
||
distance2 = sqrt(distance2);
|
||
printf("distance=%f, k=%f\r\n", distance2, k);
|
||
#endif
|
||
|
||
// 圆心角
|
||
alph = acos(k);
|
||
#if (0)
|
||
printf("calc alph=%f\r\n", alph);
|
||
printf("long double size=%d\r\n", sizeof(long double));
|
||
#endif
|
||
// 区分象限和旋转方向
|
||
k = (threex[0]-threex[1])*(threex[2]-threex[1]) + (threey[0]-threey[1])*(threey[2]-threey[1]); // 向量 01 和 向量 21 的夹角的余弦的符号-- > 0 小于90度. < 0 大于90度 = 0, 90 度
|
||
|
||
if (k > 0) // 夹角小于90度, 说明弧是大于半圆
|
||
{
|
||
alph = 2*PI-alph;
|
||
}
|
||
else // 夹角大于等于90度, 说明弧是小于等于半圆, 不需要处理
|
||
{
|
||
}
|
||
#if (0)
|
||
printf("act alph=%f, arclen=%d\r\n", alph, alph*r);
|
||
#endif
|
||
|
||
// 计算每个针步对应的弧心角大小
|
||
if (fabsl(2*r*r-1.0*stepSize*stepSize)/(2*r*r) > 1)
|
||
{
|
||
increment = alph;
|
||
}
|
||
else
|
||
{
|
||
increment = (acos((2*r*r-1.0*stepSize*stepSize)/(r*r+r*r)));
|
||
}
|
||
|
||
// 计算分割针步数
|
||
count = (int)(alph/increment+0.5);
|
||
if (count == 0)
|
||
{
|
||
count++;
|
||
}
|
||
// printf("1.count=%d, increment=%f\r\n", count, increment);
|
||
|
||
if (pData == NULL) // 返回个数
|
||
{
|
||
return count;
|
||
}
|
||
|
||
// 重新计算每个针步弧心角
|
||
increment = alph/count;
|
||
|
||
// 确定针步增加的角度和方向
|
||
increment *= ArcDir(threex, threey);
|
||
printf("2.count=%d, increment=%f\r\n", count, increment);
|
||
|
||
// 起点
|
||
lastx = threex[0];
|
||
lasty = threey[0];
|
||
|
||
actx = *pactx;
|
||
acty = *pacty;
|
||
|
||
i = 0;
|
||
do
|
||
{
|
||
if (i == count-1)
|
||
{
|
||
// 最后一个针步
|
||
// printf("the last step\r\n");
|
||
curx = threex[2];
|
||
cury = threey[2];
|
||
}
|
||
else
|
||
{
|
||
// 点 (lastx, lasty) 在圆上旋转
|
||
// printf("before Rotatec point(%f, %f)\r\n", lastx, lasty);
|
||
Rotatec(lastx-xc, lasty-yc, &xrot, &yrot, increment);
|
||
curx = xrot + xc;
|
||
cury = yrot + yc;
|
||
}
|
||
|
||
ddx = curx-actx;
|
||
ddy = cury-acty;
|
||
|
||
dx = (s16)(curx-actx+(0.5*(ddx>=0?1:-1)));
|
||
dy = (s16)(cury-acty+(0.5*(ddy>=0?1:-1)));
|
||
dr = GetAngle(lastx, lasty, curx, cury, pActAng); // 计算直线 (lastx, lasty) 到(curx, cury)和上条直线的角度差
|
||
|
||
attr = 0;
|
||
|
||
pData[i].ctrl = type;
|
||
pData[i].attr = attr;
|
||
pData[i].dx = dx;
|
||
pData[i].dy = dy;
|
||
pData[i].dr = dr;
|
||
|
||
#if (SAVE_LEN == 16)
|
||
{
|
||
double len;
|
||
len = sqrt(1.0*dx*dx + 1.0*dy*dy);
|
||
pData[i].len = (u16)(len+0.9);
|
||
}
|
||
#endif
|
||
|
||
// printf("after Rotatec point(%f, %f)\r\n", lastx, lasty);
|
||
|
||
lastx = curx;
|
||
lasty = cury;
|
||
actx += dx;
|
||
acty += dy;
|
||
i++;
|
||
|
||
} while(i < count);
|
||
|
||
*pactx = actx;
|
||
*pacty = acty;
|
||
|
||
return count;
|
||
}
|
||
|
||
int CreateCommFile(SqrtInfo * pSqrt)
|
||
{
|
||
double threex[3], threey[3];
|
||
|
||
int begx, begy, begr, begflag;
|
||
|
||
// int begx2, begy2, begr2, begflag2;
|
||
|
||
int paraBLockNum, paraBLockTimes, paraBLockJumps;
|
||
int paraELockNum, paraELockTimes, paraELockJumps;
|
||
int blockNum, blockTimes;
|
||
int elockNum, elockTimes;
|
||
int blockjumps, elockjumps;
|
||
int stepSize, sqrtNum;
|
||
int actx, acty, actr;
|
||
int i, j, k, idx;
|
||
int stepNumber, curtNumber, totalNumber;
|
||
int n, cutflag;
|
||
|
||
u8 ctrl, oldctrl, attr;
|
||
|
||
DATA_ITEM * pSteps, * pData, * pTemp;
|
||
|
||
InitDatFiles();
|
||
g_datFile.storage = STORAGE_EXSRAM; // 存储在外部RAM中
|
||
|
||
pSteps = (DATA_ITEM*)(g_datFile.dataBuff1BegAddr); // 数据存放地址
|
||
|
||
if (pSqrt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (pSqrt->sqrtNum <= 0)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
|
||
|
||
|
||
//------------------
|
||
#if (0)
|
||
printf("SqrtInfo para:\r\n");
|
||
|
||
printf("\t midy = %d\r\n", pSqrt->sqrtNum);
|
||
printf("\t stepSize = %d\r\n", pSqrt->stepSize);
|
||
printf("\t blockNum = %d\r\n", pSqrt->blockNum);
|
||
printf("\t blockTimes = %d\r\n", pSqrt->blockTimes);
|
||
printf("\t elockNum = %d\r\n", pSqrt->elockNum);
|
||
printf("\t elockTimes = %d\r\n", pSqrt->elockTimes);
|
||
printf("\t blockjumps = %d\r\n", pSqrt->blockjumps);
|
||
printf("\t elockjumps = %d\r\n", pSqrt->elockjumps);
|
||
#endif
|
||
|
||
sqrtNum = pSqrt->sqrtNum; // 图形个数
|
||
|
||
begx = pSqrt->sqrtItem[0].begx;
|
||
begy = pSqrt->sqrtItem[0].begy;
|
||
begr = 0;
|
||
|
||
actx = begx;
|
||
acty = begy;
|
||
actr = 0;
|
||
|
||
begflag = 0;
|
||
// begflag2 = 0;
|
||
totalNumber = 0;
|
||
oldctrl = 0;
|
||
ctrl = 0;
|
||
cutflag = 0;
|
||
|
||
//------------------
|
||
// 生成文件内容
|
||
|
||
for (idx = 0; idx < sqrtNum; idx++)
|
||
{
|
||
stepSize = pSqrt->sqrtItem[idx].stepSize; // 分割针步大小
|
||
|
||
if (stepSize == 0)
|
||
{
|
||
stepSize = pSqrt->stepSize; // 分割针步大小
|
||
}
|
||
|
||
paraBLockNum = pSqrt->sqrtItem[idx].blockNum;
|
||
paraBLockTimes = pSqrt->sqrtItem[idx].blockTimes;
|
||
paraBLockJumps = pSqrt->sqrtItem[idx].blockjumps;
|
||
paraELockNum = pSqrt->sqrtItem[idx].elockNum;
|
||
paraELockTimes = pSqrt->sqrtItem[idx].elockTimes;
|
||
paraELockJumps = pSqrt->sqrtItem[idx].elockjumps;
|
||
#if (0)
|
||
printf("SqrtInfo[%d] para:\r\n", idx);
|
||
|
||
printf("\t stepSize = %d\r\n", pSqrt->sqrtItem[idx].stepSize);
|
||
printf("\t blockNum = %d\r\n", pSqrt->sqrtItem[idx].blockNum);
|
||
printf("\t blockTimes = %d\r\n", pSqrt->sqrtItem[idx].blockTimes);
|
||
printf("\t blockjumps = %d\r\n", pSqrt->sqrtItem[idx].blockjumps);
|
||
printf("\t elockNum = %d\r\n", pSqrt->sqrtItem[idx].elockNum);
|
||
printf("\t elockTimes = %d\r\n", pSqrt->sqrtItem[idx].elockTimes);
|
||
printf("\t elockjumps = %d\r\n", pSqrt->sqrtItem[idx].elockjumps);
|
||
#endif
|
||
|
||
// 起始回针参数处理
|
||
if (paraBLockTimes > 0 && paraBLockNum > 0)
|
||
{
|
||
if (paraBLockJumps > paraBLockTimes*paraBLockNum)
|
||
{
|
||
paraBLockNum = 0;
|
||
paraBLockTimes = 0;
|
||
paraBLockJumps = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
paraBLockNum = 0;
|
||
paraBLockTimes = 0;
|
||
paraBLockJumps = 0;
|
||
}
|
||
while (paraBLockJumps >= paraBLockNum && paraBLockTimes > 1) // 保证jumps小于locknums
|
||
{
|
||
paraBLockJumps -= paraBLockNum;
|
||
paraBLockTimes--;
|
||
}
|
||
|
||
// 结束回针参数处理
|
||
if (paraELockTimes > 0 && paraELockNum > 0)
|
||
{
|
||
if (paraELockJumps > paraELockTimes*paraELockNum)
|
||
{
|
||
paraELockNum = 0;
|
||
paraELockTimes = 0;
|
||
paraELockJumps = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
paraELockNum = 0;
|
||
paraELockTimes = 0;
|
||
paraELockJumps = 0;
|
||
}
|
||
while (paraELockJumps >= paraELockNum && paraELockTimes > 1) // 保证jumps小于locknums
|
||
{
|
||
paraELockJumps -= paraELockNum;
|
||
paraELockTimes--;
|
||
}
|
||
//------------------
|
||
|
||
#if (0)
|
||
qDebug("calc para:\r\n");
|
||
|
||
qDebug("\t sqrtNum = %d\r\n", sqrtNum);
|
||
qDebug("\t stepSize = %d\r\n", stepSize);
|
||
qDebug("\t blockNum = %d\r\n", paraBLockNum);
|
||
qDebug("\t blockTimes = %d\r\n", paraBLockTimes);
|
||
qDebug("\t blockjumps = %d\r\n", paraBLockJumps);
|
||
qDebug("\t elockNum = %d\r\n", paraELockNum);
|
||
qDebug("\t elockTimes = %d\r\n", paraELockTimes);
|
||
qDebug("\t elockjumps = %d\r\n", paraELockJumps);
|
||
#endif
|
||
|
||
#if (0)
|
||
printf("\t begx = %f\r\n", pSqrt->sqrtItem[idx].begx);
|
||
printf("\t begy = %f\r\n", pSqrt->sqrtItem[idx].begy);
|
||
printf("\t endx = %f\r\n", pSqrt->sqrtItem[idx].endx);
|
||
printf("\t endy = %f\r\n", pSqrt->sqrtItem[idx].endy);
|
||
printf("\t midx = %f\r\n", pSqrt->sqrtItem[idx].midx);
|
||
printf("\t midy = %f\r\n", pSqrt->sqrtItem[idx].midy);
|
||
#endif
|
||
//------------------
|
||
if (begflag != 0) // 非起始,插入偏移数据
|
||
{
|
||
if (pSqrt->sqrtItem[idx].begx != pSqrt->sqrtItem[idx-1].endx ||
|
||
pSqrt->sqrtItem[idx].begy != pSqrt->sqrtItem[idx-1].endy ||
|
||
0 )
|
||
{
|
||
// 自动插入偏移数据
|
||
threex[0] = pSqrt->sqrtItem[idx-1].endx;
|
||
threey[0] = pSqrt->sqrtItem[idx-1].endy;
|
||
threex[1] = pSqrt->sqrtItem[idx].begx;
|
||
threey[1] = pSqrt->sqrtItem[idx].begy;
|
||
threex[2] = pSqrt->sqrtItem[idx].begx;
|
||
threey[2] = pSqrt->sqrtItem[idx].begy; // 三点共线,作为直线
|
||
|
||
stepNumber = CalcCurve(threex, threey, &actx, &acty, &actr, S16_MAX/2, pSteps, pSqrt->defofst);
|
||
pSteps += stepNumber;
|
||
totalNumber += stepNumber;
|
||
if (stepNumber != 0)
|
||
{
|
||
ctrl = pSqrt->defofst;
|
||
}
|
||
}
|
||
}
|
||
/*
|
||
if (begflag2 != 0) // 非起始,插入偏移数据
|
||
{
|
||
if (pSqrt->sqrtItem[idx].begx != pSqrt->sqrtItem[idx-1].endx ||
|
||
pSqrt->sqrtItem[idx].begy != pSqrt->sqrtItem[idx-1].endy ||
|
||
0 )
|
||
{
|
||
// 自动插入偏移数据
|
||
threex[0] = pSqrt->sqrtItem[idx-1].endx;
|
||
threey[0] = pSqrt->sqrtItem[idx-1].endy;
|
||
threex[1] = pSqrt->sqrtItem[idx].begx;
|
||
threey[1] = pSqrt->sqrtItem[idx].begy;
|
||
threex[2] = pSqrt->sqrtItem[idx].begx;
|
||
threey[2] = pSqrt->sqrtItem[idx].begy; // 三点共线,作为直线
|
||
|
||
stepNumber = CalcCurve(threex, threey, &actx, &acty, &actr, S16_MAX/2, pSteps, DATA_SECF_SEW);
|
||
pSteps += stepNumber;
|
||
totalNumber += stepNumber;
|
||
if (stepNumber != 0)
|
||
{
|
||
ctrl = DATA_SECF_SEW;
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
oldctrl = ctrl;
|
||
ctrl = pSqrt->sqrtItem[idx].type;
|
||
|
||
blockNum = 0;
|
||
blockTimes = 0;
|
||
blockjumps = 0;
|
||
|
||
elockNum = 0;
|
||
elockTimes = 0;
|
||
elockjumps = 0;
|
||
cutflag = 0;
|
||
|
||
if (ctrl == DATA_SEWING ||
|
||
ctrl == DATA_SEWING_R ||
|
||
ctrl == DATA_SECF_SEW ||
|
||
ctrl == DATA_SECF_SEW_R ||
|
||
ctrl == DATA_SYNCSEW ||
|
||
0 )
|
||
{
|
||
if (oldctrl != ctrl)
|
||
{
|
||
blockNum = paraBLockNum; // 起始锁针针数
|
||
blockTimes = paraBLockTimes; // 起始锁针次数
|
||
blockjumps = paraBLockJumps; // 起针跳过针数
|
||
|
||
if ((blockTimes%2) != 0) // 使回针成为偶数
|
||
{
|
||
blockTimes++;
|
||
blockjumps += blockNum;
|
||
}
|
||
}
|
||
|
||
if ( idx+1 >= sqrtNum ||
|
||
(pSqrt->sqrtItem[idx+1].type != ctrl &&
|
||
((pSqrt->sqrtItem[idx+1].type == DATA_SEWING && ctrl != DATA_SYNCSEW) ||
|
||
(pSqrt->sqrtItem[idx+1].type == DATA_SECF_SEW && ctrl != DATA_SYNCSEW) ||
|
||
(pSqrt->sqrtItem[idx+1].type == DATA_SYNCSEW && ctrl != DATA_SEWING) ||
|
||
(pSqrt->sqrtItem[idx+1].type == DATA_SYNCSEW && ctrl != DATA_SECF_SEW) ||
|
||
0 ) &&
|
||
|
||
1 ) ||
|
||
pSqrt->sqrtItem[idx+1].begx != pSqrt->sqrtItem[idx].endx ||
|
||
pSqrt->sqrtItem[idx+1].begy != pSqrt->sqrtItem[idx].endy ||
|
||
0 )
|
||
{
|
||
elockNum = paraELockNum; // 结束锁针针数
|
||
elockTimes = paraELockTimes; // 结束锁针次数
|
||
elockjumps = paraELockJumps; // 结束跳过针数
|
||
if ((elockTimes%2) != 0) // 使回针成为偶数
|
||
{
|
||
elockTimes++;
|
||
elockjumps += elockNum;
|
||
}
|
||
|
||
cutflag = 1;
|
||
}
|
||
}
|
||
|
||
threex[0] = pSqrt->sqrtItem[idx].begx;
|
||
threey[0] = pSqrt->sqrtItem[idx].begy;
|
||
threex[1] = pSqrt->sqrtItem[idx].midx;
|
||
threey[1] = pSqrt->sqrtItem[idx].midy;
|
||
threex[2] = pSqrt->sqrtItem[idx].endx;
|
||
threey[2] = pSqrt->sqrtItem[idx].endy;
|
||
|
||
stepNumber = CalcCurve(threex, threey, NULL, NULL, NULL, stepSize, NULL, ctrl);
|
||
curtNumber = stepNumber + blockNum*blockTimes - blockjumps + elockNum*elockTimes; // 直接跳过起始跳过针数
|
||
// printf("stepNumber = %d, cur totalNumber=%d:\r\n", stepNumber, curtNumber);
|
||
|
||
pData = pSteps + (blockNum*blockTimes) - blockjumps; // 直接跳过起始跳过针数,不给跳过针数预留位置
|
||
n = CalcCurve(threex, threey, &actx, &acty, &actr, stepSize, pData, ctrl);
|
||
if (n != stepNumber)
|
||
{
|
||
printf("create number =%d, is not equal to stepNumber=%d:\r\n", n, stepNumber);
|
||
}
|
||
|
||
#if (0)
|
||
// 起始锁针信息
|
||
printf("before add lock:\r\n");
|
||
for (i = 0; i < curtNumber; i++)
|
||
{
|
||
printf("DataItem %d:ctrl=0x%x, attr=0x%x, dx=%d, dy=%d\r\n", i, pSteps[i].ctrl, pSteps[i].attr, pSteps[i].dx, pSteps[i].dy);
|
||
}
|
||
#endif
|
||
|
||
// 倒序添加起针锁针
|
||
pTemp = pData - 1;
|
||
k = blockTimes*blockNum;
|
||
for (i = 0; i < blockTimes; i++)
|
||
{
|
||
if (i%2 == 0) // 奇数锁针
|
||
{
|
||
// printf("ji shu:\r\n");
|
||
for (j = 0; j < blockNum; j++)
|
||
{
|
||
// 拷贝针步
|
||
k--;
|
||
if (k < blockjumps) // 跳过计数器
|
||
{
|
||
// pTemp->ctrl = pSqrt->defofst; // 转换为offset
|
||
}
|
||
else
|
||
{
|
||
memcpy(pTemp, &(pData[j]), sizeof(DATA_ITEM));
|
||
pTemp->dx *= (-1);
|
||
pTemp->dy *= (-1); // 方向取反
|
||
pTemp->dr *= (-1); // 方向取反
|
||
attr = pTemp->attr;
|
||
attr |= ATTR_RESEW; // 回针标志
|
||
pTemp->attr = attr;
|
||
pTemp--;
|
||
|
||
if (begflag == 0) // 改变起点坐标
|
||
{
|
||
begx += pData[j].dx * 1;
|
||
begx += pData[j].dy * 1;
|
||
begx += pData[j].dr * 1;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
else // 偶数锁针
|
||
{
|
||
// printf("ou shu:\r\n");
|
||
for (j = blockNum-1; j >= 0; j--)
|
||
{
|
||
// 拷贝针步
|
||
k--;
|
||
if (k < blockjumps) // 跳过计数器
|
||
{
|
||
// pTemp->ctrl = pSqrt->defofst; // 转换为offset
|
||
}
|
||
else
|
||
{
|
||
memcpy(pTemp, &(pData[j]), sizeof(DATA_ITEM));
|
||
attr = pTemp->attr;
|
||
attr |= ATTR_RESEW; // 回针标志
|
||
pTemp->attr = attr;
|
||
pTemp--;
|
||
|
||
if (begflag == 0) // 改变起点坐标
|
||
{
|
||
begx += pData[j].dx * (-1);
|
||
begx += pData[j].dy * (-1);
|
||
begx += pData[j].dr * (-1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/**/
|
||
// 正向扫描,修正起针回针中的dr
|
||
k = blockTimes*blockNum;
|
||
pTemp = pData - k;
|
||
if(blockTimes != 0 )
|
||
{
|
||
for (i = 0; i <= blockTimes; i++) // 跳过第一次锁针(偶数),且
|
||
{
|
||
if (i%2 == 0) // 偶数锁针
|
||
{
|
||
if (i == 0) // 第一针, 这里不做处理,后面添加单独运动dr的offset
|
||
{
|
||
}
|
||
else
|
||
{
|
||
pTemp->dr = 0;
|
||
}
|
||
pTemp += blockNum;
|
||
}
|
||
else // 奇数锁针
|
||
{
|
||
pTemp += blockNum - 1 ;
|
||
pTemp->dr = 0;
|
||
pTemp++;
|
||
}
|
||
}
|
||
}
|
||
|
||
#if (0)
|
||
// 结束锁针信息
|
||
printf("after add begin lock:\r\n");
|
||
for (i = 0; i < curtNumber; i++)
|
||
{
|
||
printf("DataItem %d:ctrl=0x%x, attr=0x%x, dx=%d, dy=%d\r\n", i, pData[i].ctrl, pData[i].attr, pData[i].dx, pData[i].dy);
|
||
}
|
||
#endif
|
||
|
||
// 顺序添加末针锁针
|
||
pTemp = pData + stepNumber;
|
||
k = 0;
|
||
for (i = 0; i < elockTimes; i++)
|
||
{
|
||
if (i%2 == 0) // 奇数锁针
|
||
{
|
||
for (j = 0; j < elockNum; j++)
|
||
{
|
||
// 拷贝针步
|
||
memcpy(pTemp, &(pData[stepNumber-1-j]), sizeof(DATA_ITEM));
|
||
pTemp->dx *= -1;
|
||
pTemp->dy *= -1; // 方向取反
|
||
pTemp->dr *= -1; // 方向取反
|
||
|
||
k++;
|
||
if (k > elockTimes*elockNum - elockjumps) // 结束跳过计数器
|
||
{
|
||
pTemp->ctrl = pSqrt->defofst; // 转换为offset
|
||
}
|
||
else
|
||
{
|
||
attr = pTemp->attr;
|
||
attr |= ATTR_RESEW; // 回针标志
|
||
pTemp->attr = attr;
|
||
}
|
||
pTemp++;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (j = elockNum-1; j >= 0; j--)
|
||
{
|
||
// 拷贝针步
|
||
memcpy(pTemp, &(pData[stepNumber-1-j]), sizeof(DATA_ITEM));
|
||
k++;
|
||
if (k > elockTimes*elockNum - elockjumps) // 结束跳过计数器
|
||
{
|
||
pTemp->ctrl = pSqrt->defofst; // 转换为offset
|
||
}
|
||
else
|
||
{
|
||
attr = pTemp->attr;
|
||
attr |= ATTR_RESEW; // 回针标志
|
||
pTemp->attr = attr;
|
||
}
|
||
pTemp++;
|
||
}
|
||
}
|
||
}
|
||
|
||
#if (0)
|
||
printf("after add end lock:\r\n");
|
||
for (i = 0; i < curtNumber; i++)
|
||
{
|
||
printf("DataItem %d:ctrl=0x%x, attr=0x%x, dx=%d, dy=%d\r\n", i, pData[i].ctrl, pData[i].attr, pData[i].dx, pData[i].dy);
|
||
}
|
||
#endif
|
||
|
||
stepNumber = curtNumber;
|
||
|
||
if (cutflag != 0) // 缝纫针步添加剪线码
|
||
{
|
||
// 添加剪线码
|
||
pSteps[stepNumber].ctrl = DATA_CUTTRD;
|
||
pSteps[stepNumber].attr = 0;
|
||
pSteps[stepNumber].dx = 0;
|
||
pSteps[stepNumber].dy = 0;
|
||
pSteps[stepNumber].dr = 0;
|
||
stepNumber++;
|
||
}
|
||
|
||
#if (0)
|
||
printf("after jump lock:\r\n");
|
||
for (i = 0; i < curtNumber; i++)
|
||
{
|
||
printf("DataItem %d:ctrl=0x%x, attr=0x%x, dx=%d, dy=%d\r\n", i, pSteps[i].ctrl, pSteps[i].attr, pSteps[i].dx, pSteps[i].dy);
|
||
}
|
||
#endif
|
||
|
||
pSteps += stepNumber;
|
||
totalNumber += stepNumber;
|
||
begflag = 1;
|
||
|
||
} // end of for(idx......
|
||
|
||
// 最后一针添加结束码
|
||
pData = (DATA_ITEM*)(g_datFile.dataBuff1BegAddr); // 源
|
||
|
||
pData[totalNumber].ctrl = DATA_END;
|
||
pData[totalNumber].attr = 0;
|
||
pData[totalNumber].dx = 0;
|
||
pData[totalNumber].dy = 0;
|
||
pData[totalNumber].dr = 0;
|
||
totalNumber++;
|
||
|
||
#if (0)
|
||
printf("after calc, begx=%d, begy=%d, stepNumber=%d\r\n", begx, begy, totalNumber);
|
||
#endif
|
||
|
||
#if (1)
|
||
|
||
pData = (DATA_ITEM*)(g_datFile.dataBuff1BegAddr); // 源
|
||
begflag = 0;
|
||
|
||
// 剪线数据移到缝纫之后
|
||
for (i = 0; i < totalNumber; i++)
|
||
{
|
||
if ((pData->ctrl == DATA_SEWING || pData->ctrl == DATA_SYNCSEW))
|
||
{
|
||
begflag = 1;
|
||
}
|
||
else if (pData->ctrl == pSqrt->defofst)
|
||
{
|
||
if (begflag == 1)
|
||
{
|
||
pSteps = pData;
|
||
begflag = 2;
|
||
}
|
||
else if (begflag != 2)
|
||
{
|
||
begflag = 0;
|
||
}
|
||
}
|
||
else if (pData->ctrl == DATA_CUTTRD)
|
||
{
|
||
if (begflag == 2)
|
||
{
|
||
// 交换 pSteps 和 pData
|
||
DATA_ITEM tmpItem;
|
||
memcpy(&tmpItem, pData, sizeof(DATA_ITEM));
|
||
memcpy(pData, pSteps, sizeof(DATA_ITEM));
|
||
memcpy(pSteps, &tmpItem, sizeof(DATA_ITEM));
|
||
}
|
||
begflag = 0;
|
||
}
|
||
else
|
||
{
|
||
begflag = 0;
|
||
}
|
||
pData++;
|
||
}
|
||
#endif // 剪线移到缝纫之后
|
||
|
||
pData = (DATA_ITEM*)(g_datFile.dataBuff1BegAddr); // 源
|
||
pSteps = pData; // 目标
|
||
// 扫描生成数据,确定起点坐标,合并offset数据
|
||
// 起点坐标
|
||
|
||
begr = pData[0].dr; // 第一个针步,dr是从0开始的变化量
|
||
pData[0].dr = 0; // 设置第一个针步的变化量为0
|
||
|
||
i = 0;
|
||
#if (0)
|
||
for (i = 0; i < totalNumber; i++)
|
||
{
|
||
if (pData->ctrl != pSqrt->defofst) // 起始的offset合并到起点坐标
|
||
{
|
||
break;
|
||
}
|
||
|
||
begx += pData->dx;
|
||
begy += pData->dy;
|
||
begr += pData->dr; // 改变起针位置
|
||
pData++; // 源后移
|
||
}
|
||
#endif
|
||
|
||
#if (0)
|
||
{
|
||
int offsetdr = 0;
|
||
|
||
begflag = 0;
|
||
actr = begr;
|
||
// 继续扫描生成数据,合并offset数据
|
||
for (i = i, j = 0; i < totalNumber; i++)
|
||
{
|
||
if (pData->ctrl == pSqrt->defofst)
|
||
{
|
||
if (begflag == 0)
|
||
{
|
||
// 初始化offset计数
|
||
threex[0] = 0;
|
||
threey[0] = 0;
|
||
threex[1] = 0;
|
||
threey[1] = 0;
|
||
threex[2] = 0;
|
||
threey[2] = 0;
|
||
offsetdr = 0;
|
||
begflag = 1;
|
||
}
|
||
|
||
threex[2] += pData->dx;
|
||
threey[2] += pData->dy;
|
||
offsetdr += pData->dr;
|
||
|
||
}
|
||
else
|
||
{
|
||
if (begflag != 0 && pData->ctrl != DATA_END) // 可以删除结束前的offset
|
||
{
|
||
// 重新插入偏移数据
|
||
actx = 0;
|
||
acty = 0;
|
||
stepNumber = CalcCurve(threex, threey, &actx, &acty, &actr, S16_MAX/2, pSteps, pSqrt->defofst);
|
||
pSteps->dr = offsetdr ;
|
||
|
||
pSteps += stepNumber;
|
||
j += stepNumber;
|
||
begflag = 0;
|
||
}
|
||
if (pSteps != pData)
|
||
{
|
||
memcpy(pSteps, pData, sizeof(DATA_ITEM));
|
||
}
|
||
j++;
|
||
actr += pSteps->dr;
|
||
pSteps++;
|
||
}
|
||
|
||
pData++;
|
||
}
|
||
|
||
totalNumber = j;
|
||
}
|
||
#endif
|
||
|
||
#if (0)
|
||
// 删除结束前的offset
|
||
begflag = 0;
|
||
pData = (DATA_ITEM*)(g_datFile.dataBuff1BegAddr); // 源
|
||
pData += totalNumber;
|
||
|
||
// 继续扫描生成数据,合并offset数据
|
||
for (i = i, j = 0; i < totalNumber; i++)
|
||
{
|
||
if (pData->ctrl == pSqrt->defofst || pData->ctrl == DATA_END)
|
||
{
|
||
pData->ctrl = DATA_END;
|
||
totalNumber--;
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
|
||
pData--;
|
||
}
|
||
#endif
|
||
|
||
|
||
#if (1)
|
||
printf("before write begx=%d, begy=%d, stepNumber=%d\r\n", begx, begy, totalNumber);
|
||
#endif
|
||
|
||
|
||
#if (1)
|
||
// 写文件头
|
||
strcpy(g_datFile.pFileHead->fileHead.fileName, "test.dsr"); // 文件名称
|
||
g_datFile.pFileHead->fileHead.dataSize = totalNumber*sizeof(DATA_ITEM); // 文件长度
|
||
g_datFile.pFileHead->fileHead.itemNums = totalNumber; // 有效针数
|
||
g_datFile.pFileHead->fileHead.bytesPerItem = sizeof(DATA_ITEM); // 每针占的字节数
|
||
g_datFile.pFileHead->fileHead.bytesPerBlk = 1024; // 文件内容划分块大小
|
||
|
||
g_datFile.pFileHead->fileHead.dataChecksum = CalcCrc16((u8*)(g_datFile.dataBuff1BegAddr), g_datFile.pFileHead->fileHead.dataSize); // 花样数据累加校验和
|
||
g_datFile.pFileHead->fileHead.checkCrc = CalcCrc16((u8*)&(g_datFile.pFileHead), 48);
|
||
|
||
// 前6个字段CRC校验,文件名称,文件长度,有效针数,每针字节数,数据累加和的CRC校验值
|
||
g_datFile.pFileHead->fileHead.anchorX = begx; // pSqrt->startx;
|
||
g_datFile.pFileHead->fileHead.anchorY = begy; // pSqrt->starty; // 定位点
|
||
|
||
g_datFile.pFileHead->fileHead.beginX = begx; // pSqrt->startx;
|
||
g_datFile.pFileHead->fileHead.beginY = begy; // pSqrt->starty;
|
||
g_datFile.pFileHead->fileHead.beginR = begr; // 起始点坐标
|
||
|
||
g_datFile.pFileHead->fileHead.anchorX2 = pSqrt->startx2;
|
||
g_datFile.pFileHead->fileHead.anchorY2 = pSqrt->starty2; // 定位点
|
||
|
||
g_datFile.pFileHead->fileHead.beginX2 = pSqrt->startx2;
|
||
g_datFile.pFileHead->fileHead.beginY2 = pSqrt->starty2;
|
||
g_datFile.pFileHead->fileHead.beginR2 = 0; // 起始点坐标
|
||
|
||
g_datFile.enflag = DATA_VALID;
|
||
|
||
{
|
||
s32 minx, miny, maxx, maxy;
|
||
|
||
GetMinMaxFromFileDat(&minx, &maxx, &miny, &maxy);
|
||
|
||
g_datFile.pFileHead->fileHead.minX = minx;
|
||
g_datFile.pFileHead->fileHead.maxX = maxx;
|
||
g_datFile.pFileHead->fileHead.minY = miny;
|
||
g_datFile.pFileHead->fileHead.maxY = maxy;
|
||
}
|
||
|
||
#if (0)
|
||
printf("finial write:\r\n");
|
||
for (i = 0; i < stepNumber; i++)
|
||
{
|
||
printf("DataItem %d:ctrl=0x%x, attr=0x%x, dx=%d, dy=%d\r\n", i, pData[i].ctrl, pData[i].attr, pData[i].dx, pData[i].dy);
|
||
}
|
||
#endif
|
||
|
||
#endif // 写文件头
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
#if (1)
|
||
|
||
//#include "motos.h"
|
||
|
||
int WriteTestFile(int sel, int cx, int cy, int sx, int sy, int dex, int dey, u16 type, int stepSize)
|
||
{
|
||
SqrtInfo info;
|
||
|
||
memset(&info, 0, sizeof(SqrtInfo));
|
||
|
||
printf("sizeof(SqrtItem)=%d, sizeof(SqrtInfo)=%d\r\n", sizeof(SqrtItem), sizeof(SqrtInfo));
|
||
info.defofst = DATA_OFFSET;
|
||
|
||
if (sel == 0)
|
||
{
|
||
// 方框
|
||
info.sqrtItem[0].begx = cx-sx/2;
|
||
info.sqrtItem[0].begy = cy-sy/2;
|
||
info.sqrtItem[0].midx = cx-sx/2;
|
||
info.sqrtItem[0].midy = cy+sy/2;
|
||
info.sqrtItem[0].endx = cx-sx/2;
|
||
info.sqrtItem[0].endy = cy+sy/2;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx-sx/2;
|
||
info.sqrtItem[1].begy = cy+sy/2;
|
||
info.sqrtItem[1].midx = cx+sx/2;
|
||
info.sqrtItem[1].midy = cy+sy/2;
|
||
info.sqrtItem[1].endx = cx+sx/2;
|
||
info.sqrtItem[1].endy = cy+sy/2;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtItem[2].begx = cx+sx/2;
|
||
info.sqrtItem[2].begy = cy+sy/2;
|
||
info.sqrtItem[2].midx = cx+sx/2;
|
||
info.sqrtItem[2].midy = cy-sy/2;
|
||
info.sqrtItem[2].endx = cx+sx/2;
|
||
info.sqrtItem[2].endy = cy-sy/2;
|
||
info.sqrtItem[2].type = type;
|
||
|
||
info.sqrtItem[3].begx = cx+sx/2;
|
||
info.sqrtItem[3].begy = cy-sy/2;
|
||
info.sqrtItem[3].midx = cx-sx/2;
|
||
info.sqrtItem[3].midy = cy-sy/2;
|
||
info.sqrtItem[3].endx = cx-sx/2;
|
||
info.sqrtItem[3].endy = cy-sy/2;
|
||
info.sqrtItem[3].type = type;
|
||
|
||
/* info.sqrtItem[4].begx = cx-sx;
|
||
info.sqrtItem[4].begy = cy-sy;
|
||
info.sqrtItem[4].midx = cx;
|
||
info.sqrtItem[4].midy = cy;
|
||
info.sqrtItem[4].endx = cx;
|
||
info.sqrtItem[4].endy = cy;
|
||
info.sqrtItem[4].type = DATA_OFFSET;*/
|
||
|
||
info.sqrtNum = 4;
|
||
}
|
||
else if (sel == 1)
|
||
{
|
||
// 圆
|
||
info.sqrtItem[0].begx = cx;
|
||
info.sqrtItem[0].begy = cy-sy/2;
|
||
info.sqrtItem[0].midx = cx-sx/2;
|
||
info.sqrtItem[0].midy = cy;
|
||
info.sqrtItem[0].endx = cx;
|
||
info.sqrtItem[0].endy = cy+sy/2;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx;
|
||
info.sqrtItem[1].begy = cy+sy/2;
|
||
info.sqrtItem[1].midx = cx+sx/2;
|
||
info.sqrtItem[1].midy = cy;
|
||
info.sqrtItem[1].endx = cx;
|
||
info.sqrtItem[1].endy = cy-sy/2;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtNum = 2;
|
||
}
|
||
else if (sel == 2)
|
||
{
|
||
int idx;
|
||
idx = 0;
|
||
while(idx < MAX_SQRT-1)
|
||
{
|
||
sx -= dex;
|
||
sy -= dey;
|
||
idx += 2;
|
||
}
|
||
|
||
idx = 0;
|
||
while(idx < MAX_SQRT-1)
|
||
{
|
||
// 同心圆
|
||
info.sqrtItem[idx+0].begx = cx;
|
||
info.sqrtItem[idx+0].begy = cy-sy/2;
|
||
info.sqrtItem[idx+0].midx = cx-sx/2;
|
||
info.sqrtItem[idx+0].midy = cy;
|
||
info.sqrtItem[idx+0].endx = cx;
|
||
info.sqrtItem[idx+0].endy = cy+sy/2;
|
||
info.sqrtItem[idx+0].type = type;
|
||
|
||
info.sqrtItem[idx+1].begx = cx;
|
||
info.sqrtItem[idx+1].begy = cy+sy/2;
|
||
info.sqrtItem[idx+1].midx = cx+sx/2;
|
||
info.sqrtItem[idx+1].midy = cy;
|
||
info.sqrtItem[idx+1].endx = cx;
|
||
info.sqrtItem[idx+1].endy = cy-sy/2;
|
||
info.sqrtItem[idx+1].type = type;
|
||
|
||
sx += dex;
|
||
sy += dey;
|
||
idx += 2;
|
||
}
|
||
info.sqrtNum = idx;
|
||
}
|
||
else if (sel == 3)
|
||
{
|
||
int idx;
|
||
idx = 0;
|
||
while(idx < MAX_SQRT-1)
|
||
{
|
||
// 同心圆
|
||
info.sqrtItem[idx+0].begx = cx-sx/2;
|
||
info.sqrtItem[idx+0].begy = cy;
|
||
info.sqrtItem[idx+0].midx = cx;
|
||
info.sqrtItem[idx+0].midy = cy+sy/2;
|
||
info.sqrtItem[idx+0].endx = cx+sx/2;
|
||
info.sqrtItem[idx+0].endy = cy;
|
||
info.sqrtItem[idx+0].type = type;
|
||
|
||
info.sqrtItem[idx+1].begx = cx+sx/2;
|
||
info.sqrtItem[idx+1].begy = cy;
|
||
info.sqrtItem[idx+1].midx = cx;
|
||
info.sqrtItem[idx+1].midy = cy-sy/2;
|
||
info.sqrtItem[idx+1].endx = cx-sx/2;
|
||
info.sqrtItem[idx+1].endy = cy;
|
||
info.sqrtItem[idx+1].type = type;
|
||
|
||
sx -= dex;
|
||
sy -= dey;
|
||
idx += 2;
|
||
}
|
||
info.sqrtNum = idx;
|
||
}
|
||
else if (sel == 4)
|
||
{
|
||
// 遮阳帘裁片
|
||
info.sqrtItem[0].begx = cx-sx/2;
|
||
info.sqrtItem[0].begy = cy-sy/2;
|
||
info.sqrtItem[0].midx = cx-sx/2;
|
||
info.sqrtItem[0].midy = cy+sy/2;
|
||
info.sqrtItem[0].endx = cx-sx/2;
|
||
info.sqrtItem[0].endy = cy+sy/2;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx-sx/2;
|
||
info.sqrtItem[1].begy = cy+sy/2;
|
||
info.sqrtItem[1].midx = cx-sx/32;
|
||
info.sqrtItem[1].midy = cy+sy/2;
|
||
info.sqrtItem[1].endx = cx-sx/32;
|
||
info.sqrtItem[1].endy = cy+sy/2;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtItem[2].begx = cx-sx/32;
|
||
info.sqrtItem[2].begy = cy+sy/2;
|
||
info.sqrtItem[2].midx = cx;
|
||
info.sqrtItem[2].midy = cy+sy/2-sy/24;
|
||
info.sqrtItem[2].endx = cx;
|
||
info.sqrtItem[2].endy = cy+sy/2-sy/24;
|
||
info.sqrtItem[2].type = type;
|
||
|
||
info.sqrtItem[3].begx = cx;
|
||
info.sqrtItem[3].begy = cy+sy/2-sy/24;
|
||
info.sqrtItem[3].midx = cx+sx/32;
|
||
info.sqrtItem[3].midy = cy+sy/2;
|
||
info.sqrtItem[3].endx = cx+sx/32;
|
||
info.sqrtItem[3].endy = cy+sy/2;
|
||
info.sqrtItem[3].type = type;
|
||
|
||
info.sqrtItem[4].begx = cx+sx/32;
|
||
info.sqrtItem[4].begy = cy+sy/2;
|
||
info.sqrtItem[4].midx = cx+sx/2;
|
||
info.sqrtItem[4].midy = cy+sy/2;
|
||
info.sqrtItem[4].endx = cx+sx/2;
|
||
info.sqrtItem[4].endy = cy+sy/2;
|
||
info.sqrtItem[4].type = type;
|
||
|
||
info.sqrtItem[5].begx = cx+sx/2;
|
||
info.sqrtItem[5].begy = cy+sy/2;
|
||
info.sqrtItem[5].midx = cx+sx/2;
|
||
info.sqrtItem[5].midy = cy-sy/2;
|
||
info.sqrtItem[5].endx = cx+sx/2;
|
||
info.sqrtItem[5].endy = cy-sy/2;
|
||
info.sqrtItem[5].type = type;
|
||
|
||
info.sqrtItem[6].begx = cx+sx/2;
|
||
info.sqrtItem[6].begy = cy-sy/2;
|
||
info.sqrtItem[6].midx = cx+sx/2-sx*1/8+sx/24;
|
||
info.sqrtItem[6].midy = cy-sy/2-sy*1/8+sy/12;
|
||
info.sqrtItem[6].endx = cx+sx/2-sx*1/8;
|
||
info.sqrtItem[6].endy = cy-sy/2-sy*1/8;
|
||
info.sqrtItem[6].type = type;
|
||
|
||
info.sqrtItem[7].begx = cx+sx/2-sx*1/8;
|
||
info.sqrtItem[7].begy = cy-sy/2-sy*1/8;
|
||
info.sqrtItem[7].midx = cx-sx/2+sx*1/8;
|
||
info.sqrtItem[7].midy = cy-sy/2-sy*1/8;
|
||
info.sqrtItem[7].endx = cx-sx/2+sx*1/8;
|
||
info.sqrtItem[7].endy = cy-sy/2-sy*1/8;
|
||
info.sqrtItem[7].type = type;
|
||
|
||
info.sqrtItem[8].begx = cx-sx/2+sx*1/8;
|
||
info.sqrtItem[8].begy = cy-sy/2-sy*1/8;
|
||
info.sqrtItem[8].midx = cx-sx/2+sx*1/8-sx/24;
|
||
info.sqrtItem[8].midy = cy-sy/2-sy*1/8+sy/12;
|
||
info.sqrtItem[8].endx = cx-sx/2;
|
||
info.sqrtItem[8].endy = cy-sy/2;
|
||
info.sqrtItem[8].type = type;
|
||
|
||
info.sqrtItem[9].begx = cx-sx/2;
|
||
info.sqrtItem[9].begy = cy-sy/2;
|
||
info.sqrtItem[9].midx = cx;
|
||
info.sqrtItem[9].midy = cy;
|
||
info.sqrtItem[9].endx = cx;
|
||
info.sqrtItem[9].endy = cy;
|
||
info.sqrtItem[9].type = DATA_OFFSET;
|
||
|
||
info.sqrtNum = 10;
|
||
}
|
||
else if (sel == 5)
|
||
{
|
||
// Y向曲线
|
||
info.sqrtItem[0].begx = cx;
|
||
info.sqrtItem[0].begy = cy;
|
||
info.sqrtItem[0].midx = cx+sx/2;
|
||
info.sqrtItem[0].midy = cy+sy/4;
|
||
info.sqrtItem[0].endx = cx;
|
||
info.sqrtItem[0].endy = cy+sy/2;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx;
|
||
info.sqrtItem[1].begy = cy+sy/2;
|
||
info.sqrtItem[1].midx = cx-sx/2;
|
||
info.sqrtItem[1].midy = cy+sy*3/4;
|
||
info.sqrtItem[1].endx = cx;
|
||
info.sqrtItem[1].endy = cy+sy;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtNum = 2;
|
||
}
|
||
else if (sel == 6)
|
||
{
|
||
// Y向曲线
|
||
info.sqrtItem[0].begx = cx;
|
||
info.sqrtItem[0].begy = cy;
|
||
info.sqrtItem[0].midx = cx-sx/2;
|
||
info.sqrtItem[0].midy = cy+sy/4;
|
||
info.sqrtItem[0].endx = cx;
|
||
info.sqrtItem[0].endy = cy+sy/2;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx;
|
||
info.sqrtItem[1].begy = cy+sy/2;
|
||
info.sqrtItem[1].midx = cx+sx/2;
|
||
info.sqrtItem[1].midy = cy+sy*3/4;
|
||
info.sqrtItem[1].endx = cx;
|
||
info.sqrtItem[1].endy = cy+sy;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtNum = 2;
|
||
}
|
||
else if (sel == 7)
|
||
{
|
||
// Y向直线
|
||
info.sqrtItem[0].begx = cx;
|
||
info.sqrtItem[0].begy = cy;
|
||
info.sqrtItem[0].midx = cx;
|
||
info.sqrtItem[0].midy = cy;
|
||
info.sqrtItem[0].endx = cx;
|
||
info.sqrtItem[0].endy = cy+sy;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtNum = 1;
|
||
}
|
||
else if (sel == 8)
|
||
{// 格子图, dex 个x向格子 dey 个y向格子,格子大小是sx, sy
|
||
int i,j;
|
||
|
||
info.startx = cx;
|
||
info.starty = cy;
|
||
|
||
for (i = 0; i <= dey; i++) // x线条
|
||
{
|
||
if ((i%2) == 0)
|
||
{
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy+i*sy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy+i*sy;
|
||
info.sqrtItem[i].endx = cx+dex*sx;
|
||
info.sqrtItem[i].endy = cy+i*sy;
|
||
info.sqrtItem[i].type = type;
|
||
}
|
||
else
|
||
{
|
||
info.sqrtItem[i].begx = cx+dex*sx;
|
||
info.sqrtItem[i].begy = cy+i*sy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy+i*sy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+i*sy;
|
||
info.sqrtItem[i].type = type;
|
||
}
|
||
}
|
||
for (j = 0; j <= dex; j++,i++) // y线条
|
||
{
|
||
if ((i%2) == 0)
|
||
{
|
||
info.sqrtItem[i].begx = cx+(j)*sx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx+(j)*sx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx+(j)*sx;
|
||
info.sqrtItem[i].endy = cy+dey*sy;
|
||
info.sqrtItem[i].type = type;
|
||
}
|
||
else
|
||
{
|
||
info.sqrtItem[i].begx = cx+(j)*sx;
|
||
info.sqrtItem[i].begy = cy+dey*sy;
|
||
info.sqrtItem[i].midx = cx+(j)*sx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx+(j)*sx;
|
||
info.sqrtItem[i].endy = cy;
|
||
info.sqrtItem[i].type = type;
|
||
}
|
||
}
|
||
info.sqrtNum = i;
|
||
}
|
||
else if (sel == 10)
|
||
{
|
||
// 螺旋线
|
||
info.sqrtItem[0].begx = cx;
|
||
info.sqrtItem[0].begy = cy-sy*12/24;
|
||
info.sqrtItem[0].endx = cx;
|
||
info.sqrtItem[0].endy = cy+sy*10/24;
|
||
info.sqrtItem[0].midx = cx+sy*11/24;
|
||
info.sqrtItem[0].midy = cy-sy*1/24;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx;
|
||
info.sqrtItem[1].begy = cy+sy*10/24;
|
||
info.sqrtItem[1].endx = cx;
|
||
info.sqrtItem[1].endy = cy-sy*8/24;
|
||
info.sqrtItem[1].midx = cx-sy*9/24;
|
||
info.sqrtItem[1].midy = cy+sy*1/24;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtItem[2].begx = cx;
|
||
info.sqrtItem[2].begy = cy-sy*8/24;
|
||
info.sqrtItem[2].endx = cx;
|
||
info.sqrtItem[2].endy = cy+sy*6/24;
|
||
info.sqrtItem[2].midx = cx+sy*7/24;
|
||
info.sqrtItem[2].midy = cy-sy*1/24;
|
||
info.sqrtItem[2].type = type;
|
||
|
||
info.sqrtItem[3].begx = cx;
|
||
info.sqrtItem[3].begy = cy+sy*6/24;
|
||
info.sqrtItem[3].endx = cx;
|
||
info.sqrtItem[3].endy = cy-sy*4/24;
|
||
info.sqrtItem[3].midx = cx-sy*5/24;
|
||
info.sqrtItem[3].midy = cy+sy*1/24;
|
||
info.sqrtItem[3].type = type;
|
||
|
||
info.sqrtItem[4].begx = cx;
|
||
info.sqrtItem[4].begy = cy-sy*4/24;
|
||
info.sqrtItem[4].endx = cx;
|
||
info.sqrtItem[4].endy = cy;
|
||
info.sqrtItem[4].midx = cx+sy*2/24;
|
||
info.sqrtItem[4].midy = cy-sy*2/24;
|
||
info.sqrtItem[4].type = type;
|
||
|
||
info.sqrtItem[5].begx = cx;
|
||
info.sqrtItem[5].begy = cy;
|
||
info.sqrtItem[5].endx = cx;
|
||
info.sqrtItem[5].endy = cy+sy*4/24;
|
||
info.sqrtItem[5].midx = cx-sy*2/24;
|
||
info.sqrtItem[5].midy = cy+sy*2/24;
|
||
info.sqrtItem[5].type = type;
|
||
|
||
info.sqrtItem[6].begx = cx;
|
||
info.sqrtItem[6].begy = cy+sy*4/24;
|
||
info.sqrtItem[6].endx = cx;
|
||
info.sqrtItem[6].endy = cy-sy*6/24;
|
||
info.sqrtItem[6].midx = cx+sy*5/24;
|
||
info.sqrtItem[6].midy = cy-sy*1/24;
|
||
info.sqrtItem[6].type = type;
|
||
|
||
info.sqrtItem[7].begx = cx;
|
||
info.sqrtItem[7].begy = cy-sy*6/24;
|
||
info.sqrtItem[7].endx = cx;
|
||
info.sqrtItem[7].endy = cy+sy*8/24;
|
||
info.sqrtItem[7].midx = cx-sy*7/24;
|
||
info.sqrtItem[7].midy = cy+sy*1/24;
|
||
info.sqrtItem[7].type = type;
|
||
|
||
info.sqrtItem[8].begx = cx;
|
||
info.sqrtItem[8].begy = cy+sy*8/24;
|
||
info.sqrtItem[8].endx = cx;
|
||
info.sqrtItem[8].endy = cy-sy*10/24;
|
||
info.sqrtItem[8].midx = cx+sy*9/24;
|
||
info.sqrtItem[8].midy = cy-sy*1/24;
|
||
info.sqrtItem[8].type = type;
|
||
|
||
info.sqrtItem[9].begx = cx;
|
||
info.sqrtItem[9].begy = cy-sy*10/24;
|
||
info.sqrtItem[9].endx = cx;
|
||
info.sqrtItem[9].endy = cy+sy*12/24;
|
||
info.sqrtItem[9].midx = cx-sy*11/24;
|
||
info.sqrtItem[9].midy = cy+sy*1/24;
|
||
info.sqrtItem[9].type = type;
|
||
|
||
info.sqrtNum = 10;
|
||
}
|
||
else if (sel == 11)
|
||
{
|
||
// 逆时针圆
|
||
info.sqrtItem[0].begx = cx;
|
||
info.sqrtItem[0].begy = cy-sy/2;
|
||
info.sqrtItem[0].midx = cx+sx/2;
|
||
info.sqrtItem[0].midy = cy;
|
||
info.sqrtItem[0].endx = cx;
|
||
info.sqrtItem[0].endy = cy+sy/2;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx;
|
||
info.sqrtItem[1].begy = cy+sy/2;
|
||
info.sqrtItem[1].midx = cx-sx/2;
|
||
info.sqrtItem[1].midy = cy;
|
||
info.sqrtItem[1].endx = cx;
|
||
info.sqrtItem[1].endy = cy-sy/2;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtNum = 2;
|
||
}
|
||
else if (sel == 12)
|
||
{
|
||
// 方套圆
|
||
info.sqrtItem[0].begx = cx-sx/2;
|
||
info.sqrtItem[0].begy = cy-sy/2;
|
||
info.sqrtItem[0].midx = cx-sx/2;
|
||
info.sqrtItem[0].midy = cy+sy/2;
|
||
info.sqrtItem[0].endx = cx-sx/2;
|
||
info.sqrtItem[0].endy = cy+sy/2;
|
||
info.sqrtItem[0].type = type;
|
||
|
||
info.sqrtItem[1].begx = cx-sx/2;
|
||
info.sqrtItem[1].begy = cy+sy/2;
|
||
info.sqrtItem[1].midx = cx+sx/2;
|
||
info.sqrtItem[1].midy = cy+sy/2;
|
||
info.sqrtItem[1].endx = cx+sx/2;
|
||
info.sqrtItem[1].endy = cy+sy/2;
|
||
info.sqrtItem[1].type = type;
|
||
|
||
info.sqrtItem[2].begx = cx+sx/2;
|
||
info.sqrtItem[2].begy = cy+sy/2;
|
||
info.sqrtItem[2].midx = cx+sx/2;
|
||
info.sqrtItem[2].midy = cy-sy/2;
|
||
info.sqrtItem[2].endx = cx+sx/2;
|
||
info.sqrtItem[2].endy = cy-sy/2;
|
||
info.sqrtItem[2].type = type;
|
||
|
||
info.sqrtItem[3].begx = cx+sx/2;
|
||
info.sqrtItem[3].begy = cy-sy/2;
|
||
info.sqrtItem[3].midx = cx-sx/2;
|
||
info.sqrtItem[3].midy = cy-sy/2;
|
||
info.sqrtItem[3].endx = cx-sx/2;
|
||
info.sqrtItem[3].endy = cy-sy/2;
|
||
info.sqrtItem[3].type = type;
|
||
|
||
info.sqrtItem[4].begx = cx;
|
||
info.sqrtItem[4].begy = cy-sy/2;
|
||
info.sqrtItem[4].midx = cx+sx/2;
|
||
info.sqrtItem[4].midy = cy;
|
||
info.sqrtItem[4].endx = cx;
|
||
info.sqrtItem[4].endy = cy+sy/2;
|
||
info.sqrtItem[4].type = type;
|
||
|
||
info.sqrtItem[5].begx = cx;
|
||
info.sqrtItem[5].begy = cy+sy/2;
|
||
info.sqrtItem[5].midx = cx-sx/2;
|
||
info.sqrtItem[5].midy = cy;
|
||
info.sqrtItem[5].endx = cx;
|
||
info.sqrtItem[5].endy = cy-sy/2;
|
||
info.sqrtItem[5].type = type;
|
||
|
||
info.sqrtNum = 6;
|
||
}
|
||
else if (sel == 100) // 冲缝绣360测试
|
||
{
|
||
int idx, n, bx;
|
||
double temp;
|
||
idx = 0;
|
||
|
||
// 方套圆缝纫
|
||
info.sqrtItem[idx].begx = cx-sx/2;
|
||
info.sqrtItem[idx].begy = cy-sy/2;
|
||
info.sqrtItem[idx].midx = cx-sx/2;
|
||
info.sqrtItem[idx].midy = cy+sy/2;
|
||
info.sqrtItem[idx].endx = cx-sx/2;
|
||
info.sqrtItem[idx].endy = cy+sy/2;
|
||
info.sqrtItem[idx].type = DATA_SEWING;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx-sx/2;
|
||
info.sqrtItem[idx].begy = cy+sy/2;
|
||
info.sqrtItem[idx].midx = cx+sx/2;
|
||
info.sqrtItem[idx].midy = cy+sy/2;
|
||
info.sqrtItem[idx].endx = cx+sx/2;
|
||
info.sqrtItem[idx].endy = cy+sy/2;
|
||
info.sqrtItem[idx].type = DATA_SEWING;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx+sx/2;
|
||
info.sqrtItem[idx].begy = cy+sy/2;
|
||
info.sqrtItem[idx].midx = cx+sx/2;
|
||
info.sqrtItem[idx].midy = cy-sy/2;
|
||
info.sqrtItem[idx].endx = cx+sx/2;
|
||
info.sqrtItem[idx].endy = cy-sy/2;
|
||
info.sqrtItem[idx].type = DATA_SEWING;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx+sx/2;
|
||
info.sqrtItem[idx].begy = cy-sy/2;
|
||
info.sqrtItem[idx].midx = cx-sx/2;
|
||
info.sqrtItem[idx].midy = cy-sy/2;
|
||
info.sqrtItem[idx].endx = cx-sx/2;
|
||
info.sqrtItem[idx].endy = cy-sy/2;
|
||
info.sqrtItem[idx].type = DATA_SEWING;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx;
|
||
info.sqrtItem[idx].begy = cy-sy/2;
|
||
info.sqrtItem[idx].midx = cx+sx/2;
|
||
info.sqrtItem[idx].midy = cy;
|
||
info.sqrtItem[idx].endx = cx;
|
||
info.sqrtItem[idx].endy = cy+sy/2;
|
||
info.sqrtItem[idx].type = DATA_SEWING;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx;
|
||
info.sqrtItem[idx].begy = cy+sy/2;
|
||
info.sqrtItem[idx].midx = cx-sx/2;
|
||
info.sqrtItem[idx].midy = cy;
|
||
info.sqrtItem[idx].endx = cx;
|
||
info.sqrtItem[idx].endy = cy-sy/2;
|
||
info.sqrtItem[idx].type = DATA_SEWING;
|
||
idx++;
|
||
|
||
temp = sx;
|
||
temp /= sqrt(2);
|
||
sx = (int)(temp + 0.5);
|
||
|
||
temp = sy;
|
||
temp /= sqrt(2);
|
||
sy = (int)(temp + 0.5);
|
||
|
||
// 方套圆绣花
|
||
info.sqrtItem[idx].begx = cx-sx/2;
|
||
info.sqrtItem[idx].begy = cy-sy/2;
|
||
info.sqrtItem[idx].midx = cx-sx/2;
|
||
info.sqrtItem[idx].midy = cy+sy/2;
|
||
info.sqrtItem[idx].endx = cx-sx/2;
|
||
info.sqrtItem[idx].endy = cy+sy/2;
|
||
info.sqrtItem[idx].type = DATA_EMB;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx-sx/2;
|
||
info.sqrtItem[idx].begy = cy+sy/2;
|
||
info.sqrtItem[idx].midx = cx+sx/2;
|
||
info.sqrtItem[idx].midy = cy+sy/2;
|
||
info.sqrtItem[idx].endx = cx+sx/2;
|
||
info.sqrtItem[idx].endy = cy+sy/2;
|
||
info.sqrtItem[idx].type = DATA_EMB;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx+sx/2;
|
||
info.sqrtItem[idx].begy = cy+sy/2;
|
||
info.sqrtItem[idx].midx = cx+sx/2;
|
||
info.sqrtItem[idx].midy = cy-sy/2;
|
||
info.sqrtItem[idx].endx = cx+sx/2;
|
||
info.sqrtItem[idx].endy = cy-sy/2;
|
||
info.sqrtItem[idx].type = DATA_EMB;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx+sx/2;
|
||
info.sqrtItem[idx].begy = cy-sy/2;
|
||
info.sqrtItem[idx].midx = cx-sx/2;
|
||
info.sqrtItem[idx].midy = cy-sy/2;
|
||
info.sqrtItem[idx].endx = cx-sx/2;
|
||
info.sqrtItem[idx].endy = cy-sy/2;
|
||
info.sqrtItem[idx].type = DATA_EMB;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx;
|
||
info.sqrtItem[idx].begy = cy-sy/2;
|
||
info.sqrtItem[idx].midx = cx+sx/2;
|
||
info.sqrtItem[idx].midy = cy;
|
||
info.sqrtItem[idx].endx = cx;
|
||
info.sqrtItem[idx].endy = cy+sy/2;
|
||
info.sqrtItem[idx].type = DATA_EMB;
|
||
idx++;
|
||
info.sqrtItem[idx].begx = cx;
|
||
info.sqrtItem[idx].begy = cy+sy/2;
|
||
info.sqrtItem[idx].midx = cx-sx/2;
|
||
info.sqrtItem[idx].midy = cy;
|
||
info.sqrtItem[idx].endx = cx;
|
||
info.sqrtItem[idx].endy = cy-sy/2;
|
||
info.sqrtItem[idx].type = DATA_EMB;
|
||
idx++;
|
||
|
||
// 冲孔填充方框
|
||
temp = sx;
|
||
temp /= sqrt(2);
|
||
sx = (int)(temp + 0.5);
|
||
|
||
temp = sy;
|
||
temp /= sqrt(2);
|
||
sy = (int)(temp + 0.5);
|
||
|
||
n = sx / stepSize;
|
||
bx = cx - sx/2;
|
||
if (n > 0)
|
||
{
|
||
temp = sx;
|
||
temp /= n;
|
||
}
|
||
while (n > 0)
|
||
{
|
||
info.sqrtItem[idx].begx = bx;
|
||
info.sqrtItem[idx].begy = cy-sy/2;
|
||
info.sqrtItem[idx].midx = bx;
|
||
info.sqrtItem[idx].midy = cy+sy/2;
|
||
info.sqrtItem[idx].endx = bx;
|
||
info.sqrtItem[idx].endy = cy+sy/2;
|
||
info.sqrtItem[idx].type = DATA_PUNCH;
|
||
|
||
idx++;
|
||
n--;
|
||
bx += temp;
|
||
}
|
||
info.sqrtNum = idx;
|
||
}
|
||
else if (sel == 201 || sel == 202 || sel == 203) // 双头直线绗缝机测试花版
|
||
{
|
||
int i;
|
||
int curtype, curofst;
|
||
|
||
int mistep, normalstep;
|
||
|
||
s32 begx, begy, endy;
|
||
// s32 endx;
|
||
s32 temp1, temp2;
|
||
|
||
begx = cx;
|
||
begy = cy;
|
||
|
||
// endx = cx;
|
||
endy = sy;
|
||
|
||
if (sel == 201)
|
||
{
|
||
curtype = DATA_SEWING;
|
||
curofst = DATA_OFFSET;
|
||
|
||
info.startx = begx;
|
||
info.starty = begy;
|
||
info.startx2 = 0;
|
||
info.starty2 = begy;
|
||
}
|
||
else if (sel == 202)
|
||
{
|
||
curtype = DATA_SECF_SEW;
|
||
curofst = DATA_SECF_OFST;
|
||
|
||
info.startx = 266600;
|
||
info.starty = begy;
|
||
info.startx2 = begx;
|
||
info.starty2 = begy;
|
||
}
|
||
else if (sel == 203)
|
||
{
|
||
curtype = DATA_SECF_SEW;
|
||
curofst = DATA_SECF_OFST;
|
||
|
||
info.startx = begx;
|
||
info.starty = begy;
|
||
info.startx2 = begx + 20000;
|
||
info.starty2 = begy;
|
||
}
|
||
|
||
info.defofst = curofst;
|
||
|
||
mistep = 400;
|
||
normalstep = 1200;
|
||
|
||
temp1 = begy + 5000;
|
||
temp2 = endy - 5000;
|
||
|
||
i = 0;
|
||
// A机头或B机头缝纫数据 密针
|
||
info.sqrtItem[i].begx = begx;
|
||
info.sqrtItem[i].begy = begy;
|
||
info.sqrtItem[i].midx = begx;
|
||
info.sqrtItem[i].midy = begy;
|
||
info.sqrtItem[i].endx = begx;
|
||
info.sqrtItem[i].endy = temp1;
|
||
info.sqrtItem[i].stepSize = mistep;
|
||
info.sqrtItem[i].type = curtype;
|
||
i++;
|
||
|
||
// A机头或B机头缝纫数据 普通针步
|
||
info.sqrtItem[i].begx = begx;
|
||
info.sqrtItem[i].begy = temp1;
|
||
info.sqrtItem[i].midx = begx;
|
||
info.sqrtItem[i].midy = temp1;
|
||
info.sqrtItem[i].endx = begx;
|
||
info.sqrtItem[i].endy = temp2;
|
||
info.sqrtItem[i].stepSize = normalstep;
|
||
info.sqrtItem[i].type = curtype;
|
||
i++;
|
||
|
||
// A机头或B机头缝纫数据 密针
|
||
info.sqrtItem[i].begx = begx;
|
||
info.sqrtItem[i].begy = temp2;
|
||
info.sqrtItem[i].midx = begx;
|
||
info.sqrtItem[i].midy = temp2;
|
||
info.sqrtItem[i].endx = begx;
|
||
info.sqrtItem[i].endy = endy;
|
||
info.sqrtItem[i].stepSize = mistep;
|
||
info.sqrtItem[i].type = curtype;
|
||
i++;
|
||
|
||
// 越框
|
||
info.sqrtItem[i].begx = begx;
|
||
info.sqrtItem[i].begy = endy;
|
||
info.sqrtItem[i].midx = begx;
|
||
info.sqrtItem[i].midy = endy;
|
||
info.sqrtItem[i].endx = begx+10000;
|
||
info.sqrtItem[i].endy = endy;
|
||
info.sqrtItem[i].stepSize = S16_MAX/2;
|
||
info.sqrtItem[i].type = curofst;
|
||
|
||
begx += 10000;
|
||
|
||
// A机头或B机头缝纫数据 密针
|
||
info.sqrtItem[i].begx = begx;
|
||
info.sqrtItem[i].begy = endy;
|
||
info.sqrtItem[i].midx = begx;
|
||
info.sqrtItem[i].midy = endy;
|
||
info.sqrtItem[i].endx = begx;
|
||
info.sqrtItem[i].endy = temp2;
|
||
info.sqrtItem[i].stepSize = mistep;
|
||
info.sqrtItem[i].type = curtype;
|
||
i++;
|
||
|
||
// A机头或B机头缝纫数据 普通针步
|
||
info.sqrtItem[i].begx = begx;
|
||
info.sqrtItem[i].begy = temp2;
|
||
info.sqrtItem[i].midx = begx;
|
||
info.sqrtItem[i].midy = temp2;
|
||
info.sqrtItem[i].endx = begx;
|
||
info.sqrtItem[i].endy = temp1;
|
||
info.sqrtItem[i].stepSize = normalstep;
|
||
info.sqrtItem[i].type = curtype;
|
||
i++;
|
||
|
||
// A机头或B机头缝纫数据 密针
|
||
info.sqrtItem[i].begx = begx;
|
||
info.sqrtItem[i].begy = temp1;
|
||
info.sqrtItem[i].midx = begx;
|
||
info.sqrtItem[i].midy = temp1;
|
||
info.sqrtItem[i].endx = begx;
|
||
info.sqrtItem[i].endy = begy;
|
||
info.sqrtItem[i].stepSize = mistep;
|
||
info.sqrtItem[i].type = curtype;
|
||
i++;
|
||
|
||
info.sqrtNum = i;
|
||
}
|
||
else if (sel == 204)
|
||
{
|
||
int i;
|
||
|
||
#define MIZHEN_LEN 5000
|
||
#define NMZHEN1_LEN 10000
|
||
#define NMZHEN2_LEN 100000
|
||
|
||
i = 0;
|
||
|
||
// AB 机头移动数据
|
||
// A机头移动数据
|
||
// B机头移动数据
|
||
|
||
// A机头缝纫数据 密针 50mm
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+MIZHEN_LEN;
|
||
info.sqrtItem[i].stepSize = 400;
|
||
info.sqrtItem[i].type = DATA_SEWING;
|
||
i++;
|
||
|
||
cy += MIZHEN_LEN;
|
||
// A机头缝纫数据 普通针步100mm
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+NMZHEN1_LEN;
|
||
info.sqrtItem[i].stepSize = 1000;
|
||
info.sqrtItem[i].type = DATA_SEWING;
|
||
i++;
|
||
|
||
cy += NMZHEN1_LEN;
|
||
// AB机头缝纫数据 密针 50mm
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+5000;
|
||
info.sqrtItem[i].stepSize = 400;
|
||
info.sqrtItem[i].type = DATA_SYNCSEW;
|
||
i++;
|
||
|
||
// AB机头缝纫数据 普通针步 100000
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+NMZHEN2_LEN;
|
||
info.sqrtItem[i].stepSize = 1000;
|
||
info.sqrtItem[i].type = DATA_SYNCSEW;
|
||
i++;
|
||
|
||
cy += NMZHEN2_LEN;
|
||
|
||
// AB机头缝纫数据 密针
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+5000;
|
||
info.sqrtItem[i].stepSize = 400;
|
||
info.sqrtItem[i].type = DATA_SYNCSEW;
|
||
i++;
|
||
|
||
// A机头缝纫数据 普通针步 100mm
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+NMZHEN1_LEN;
|
||
info.sqrtItem[i].stepSize = 1000;
|
||
info.sqrtItem[i].type = DATA_SEWING;
|
||
i++;
|
||
|
||
// A机头缝纫数据 密针 50mm
|
||
info.sqrtItem[i].begx = cx;
|
||
info.sqrtItem[i].begy = cy;
|
||
info.sqrtItem[i].midx = cx;
|
||
info.sqrtItem[i].midy = cy;
|
||
info.sqrtItem[i].endx = cx;
|
||
info.sqrtItem[i].endy = cy+MIZHEN_LEN;
|
||
info.sqrtItem[i].stepSize = 400;
|
||
info.sqrtItem[i].type = DATA_SEWING;
|
||
i++;
|
||
|
||
// AB 机头移动数据
|
||
// A机头移动数据
|
||
// B机头移动数据
|
||
|
||
// B机头缝纫数据 密针
|
||
// B机头缝纫数据 普通针步
|
||
|
||
// AB机头缝纫数据 密针
|
||
// AB机头缝纫数据 普通针步
|
||
|
||
// AB机头缝纫数据 密针
|
||
// B机头缝纫数据 普通针步
|
||
// B机头缝纫数据 密针
|
||
|
||
// A机头移动数据
|
||
// B机头移动数据
|
||
|
||
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if (stepSize <= 0 || stepSize >= 65536)
|
||
{
|
||
stepSize = 100;
|
||
printf("stepsize is not support, use default\r\n");
|
||
}
|
||
|
||
info.stepSize = stepSize;
|
||
info.blockNum = 0;
|
||
info.blockTimes = 0;
|
||
info.elockNum = 0;
|
||
info.elockTimes = 0;
|
||
|
||
info.blockjumps = 0;
|
||
info.elockjumps = 0;
|
||
|
||
return CreateCommFile(&info);
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
|
||
#endif // 生成数据文件的算法
|
||
|
||
|
||
//---------------------------------------------------------------------------------------------------------
|
||
|
||
|
||
|
||
#endif
|
||
|
||
|
||
|
||
|