1365 lines
28 KiB
C
1365 lines
28 KiB
C
|
||
#define _IN_WORKCTRL_C
|
||
|
||
#include "workctrl.h"
|
||
|
||
#include "movectrl.h"
|
||
#include "error.h"
|
||
#include "buttons.h"
|
||
#include "inout.h"
|
||
#include "shell.h"
|
||
#include "debug.h"
|
||
#include "trigger.h"
|
||
#include "delay.h"
|
||
#include "canctrl.h"
|
||
#include "extendboards.h"
|
||
#include "ethernet.h"
|
||
#include "filetrans.h"
|
||
#include "installment.h"
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
void OneMinTimerTask(void);
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
|
||
#if (AUTO_ELEC_CLIP == 1)
|
||
// 电子夹线器区间等级表.
|
||
// 0~239 存放120个区间等级
|
||
// 其中偶数index中存放的起始索引,奇数为终止索引.
|
||
// 起始索引中的level存放夹线力度.终止索引中的level始终为零.
|
||
|
||
// 240,241 存放结束符,默认为0
|
||
|
||
// 254,255存放默认等级和夹线力度
|
||
|
||
DataClip g_dataClipLvBuf[256];
|
||
#endif
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
#define EXEC_WORK_FUNC(func) \
|
||
do \
|
||
{ \
|
||
if (func != NULL) \
|
||
{ \
|
||
func(); \
|
||
} \
|
||
}while(0)
|
||
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
void InitWorkCtrl(void)
|
||
{
|
||
memset(&g_workCtrl, 0, sizeof(WorkCtrl));
|
||
|
||
g_workCtrl.embMendEndIdx = -1; // 20220303增加此初始化
|
||
|
||
#if (1) // 暂时允许工作......
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENTIME;
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENSTATE;
|
||
#endif
|
||
|
||
// 装载保存数据
|
||
#if (1)
|
||
printf("sizeof(SavedPara)=%d\r\n", sizeof(SavedPara));
|
||
ReadNVPara((NVPara*)(&g_workCtrl.savedpara), 1); // 装载保存数据
|
||
|
||
if (g_workCtrl.savedpara.mcType != MC_TYPE)
|
||
{
|
||
g_workCtrl.savedpara.enFlag = 0;
|
||
}
|
||
|
||
if (g_workCtrl.savedpara.enFlag != NVPARA_EN)
|
||
{
|
||
memset(&g_workCtrl.savedpara, 0, sizeof(g_workCtrl.savedpara));
|
||
|
||
g_workCtrl.savedpara.mcType = MC_TYPE;
|
||
g_workCtrl.savedpara.enFlag = NVPARA_EN;
|
||
SaveWorkNvPara();
|
||
|
||
printf("2. load save data failed\r\n");
|
||
g_workCtrl.posEnFlag = 0; // 电机位置失效
|
||
}
|
||
else
|
||
{
|
||
u32 address;
|
||
address = (u32)(&(g_workCtrl.savedpara.motospos[0]));
|
||
SetMotosCounter((s32 *)(address)); // 设置电机位置
|
||
ReadAndFreshMotosPos();
|
||
g_workCtrl.posEnFlag = ALL_MOTO_MOD; // 电机位置有效
|
||
|
||
g_workCtrl.cursta.dataIdx = g_workCtrl.savedpara.dataIdx; // 装载数据索引
|
||
printf("load fileID=0x%x, dataIdx=%d\r\n", g_workCtrl.savedpara.fileID, g_workCtrl.cursta.dataIdx);
|
||
|
||
g_workCtrl.cursta.runSteps = g_workCtrl.savedpara.runSteps; // 装载运行步骤
|
||
g_workCtrl.cursta.outCounter = g_workCtrl.savedpara.outCounter; // 装载产量计数
|
||
g_workCtrl.cursta.embNeedleNum = g_workCtrl.savedpara.embNeedleNum; // 装载刺绣针数
|
||
g_workCtrl.cursta.btrdPics = g_workCtrl.savedpara.btrdPics; // 装载底线片数计数
|
||
g_workCtrl.cursta.btrdLength = g_workCtrl.savedpara.btrdLength; // 装载底线长度计数
|
||
g_workCtrl.cursta.fileIdx = g_workCtrl.savedpara.fileIdx; // 装载文件序号
|
||
g_datFile.fileIdx = g_workCtrl.cursta.fileIdx; // 装载文件序号
|
||
g_datFile.fileIdxMap = g_workCtrl.savedpara.fileIdxMap; // 装载文件位图
|
||
|
||
printf("2. load save data success\r\n");
|
||
}
|
||
#endif
|
||
|
||
InitAppCallback();
|
||
|
||
InitDebug();
|
||
|
||
{
|
||
int rslt;
|
||
rslt = InitInstallment(); // 初始化加密
|
||
if (rslt != 0) // 已经减去了关机时间
|
||
{
|
||
g_workCtrl.cansetelapsed = 1; // 设置不再接收上位机关机时间命令
|
||
}
|
||
RefreshWorkTimeEn();
|
||
|
||
AddTriggerToList(60000, NULL, OneMinTimerTask); // 1分钟定时任务,工作时间计数
|
||
}
|
||
}
|
||
|
||
__WEAK void InitAppCallback(void)
|
||
{
|
||
}
|
||
|
||
void WorkCtrlTask(void)
|
||
{
|
||
EXEC_WORK_FUNC(g_workCtrl.WorkRunTask);
|
||
EXEC_WORK_FUNC(g_workCtrl.AsynchronousTask);
|
||
}
|
||
|
||
void TasksWhenDelay(void)
|
||
{
|
||
EXEC_WORK_FUNC(g_workCtrl.AsynchronousTask);
|
||
TriggerTask(); // 定时触发任务执行
|
||
ExtendBoardTask(); // 输入输出任务执行
|
||
}
|
||
|
||
void DelayRef(u32 ms)
|
||
{
|
||
do
|
||
{
|
||
TasksWhenDelay();
|
||
|
||
if (ms <= 0)
|
||
{
|
||
break;
|
||
}
|
||
DelayMs(1);
|
||
ms--;
|
||
}while(1);
|
||
}
|
||
|
||
void DelayRefFt(u32 ms)
|
||
{
|
||
u32 us = 0;
|
||
do
|
||
{
|
||
TasksWhenDelay();
|
||
if (ms <= 0)
|
||
{
|
||
break;
|
||
}
|
||
DelayUs(100);
|
||
us++;
|
||
if(us >= 10)
|
||
{
|
||
us = 0;
|
||
ms--;
|
||
}
|
||
}while(1);
|
||
}
|
||
|
||
// 延时同时执行异步任务
|
||
void DelayAndAsyncExe(u32 ms)
|
||
{
|
||
u32 timb = GetMsSoftTimer();
|
||
do
|
||
{
|
||
TasksWhenDelay();
|
||
|
||
u32 tim = GetMsSoftTimer();
|
||
if (tim - timb >= ms)
|
||
{
|
||
break;
|
||
}
|
||
|
||
}while(1);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
// 1分钟定时任务
|
||
void OneMinTimerTask(void)
|
||
{
|
||
RefWorkableTimer(-1); // 每分钟,计时减少
|
||
|
||
RefreshWorkTimeEn(); // 更新允许工作标志
|
||
}
|
||
|
||
void RefreshWorkTimeEn(void)
|
||
{
|
||
#if (USE_PASSWORD == 1) // 强制使用分期付款密码
|
||
if (GetWorkableTime() <= 0)
|
||
{
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_ENTIME); // 禁止工作(时间)
|
||
}
|
||
else
|
||
{
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENTIME; // 允许工作(时间)
|
||
}
|
||
#elif (USE_PASSWORD == 2) // 如果设置过分期付款密码,则按密码执行,否则认为没有密码
|
||
u8 paswd[24];
|
||
int i;
|
||
|
||
GetLastpswd(paswd);
|
||
for (i=0;i<24;i++)
|
||
{
|
||
if (paswd[i] != 0)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (i != 24)
|
||
{// 设置过分期密码
|
||
if (GetWorkableTime() <= 0)
|
||
{
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_ENTIME); // 禁止工作(时间)
|
||
}
|
||
else
|
||
{
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENTIME; // 允许工作(时间)
|
||
}
|
||
}
|
||
else
|
||
{// 没有设置过密码
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENTIME; // 允许工作(时间)
|
||
}
|
||
|
||
#elif (USE_PASSWORD == 0) // 不使用密码
|
||
{
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENTIME; // 允许工作(时间)
|
||
}
|
||
#endif
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
void SaveWorkNvPara(void)
|
||
{
|
||
SaveNVPara((NVPara*)(&g_workCtrl.savedpara), 1);
|
||
}
|
||
|
||
__WEAK void RefreshStatus(void)
|
||
{
|
||
}
|
||
|
||
__WEAK void RefreshParas(int flag)
|
||
{
|
||
}
|
||
|
||
// 设置参数有效标志
|
||
void SetNewParasFlag(int flag)
|
||
{
|
||
g_workCtrl.paraEnFlag |= flag;
|
||
|
||
// 参数接收标志
|
||
printf("set para ok flag\r\n");
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_PARAOK; // 参数接收标志
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
void RequestBoardVer(void)
|
||
{
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
RequestColorsVersion();
|
||
DelayRef(0);
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
RequestHeadsVersion();
|
||
DelayRef(0);
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
RequestExtIOsVersion();
|
||
DelayRef(0);
|
||
#endif
|
||
|
||
}
|
||
|
||
int CreateBoardVer(OperPacket * pPkt, u8 protocol, u8 nodeId, u8 nodeType, BoardRegVal * pRegVal)
|
||
{
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
int rslt;
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
|
||
pPkt->sendBoardVer.cmdCode = DCMD_SEND_BOARDVER;
|
||
pPkt->sendBoardVer.protocolType = protocol;
|
||
pPkt->sendBoardVer.nodeType = nodeType;
|
||
|
||
if (protocol == BN_PROTOCOL_HEAD)
|
||
{
|
||
pPkt->sendBoardVer.nodeId = nodeId - HEAD_NODEID_BASE + 1; // 从1开始,上位机不需要知道具体节点ID
|
||
}
|
||
else if (protocol == BN_PROTOCOL_COLOR)
|
||
{
|
||
pPkt->sendBoardVer.nodeId = nodeId - COLOR_NODEID_BASE + 1; // 从1开始,上位机不需要知道具体节点ID
|
||
}
|
||
|
||
memcpy(&pPkt->sendBoardVer.ver, &pRegVal->exbVer, BOARD_VER_LEN*sizeof(u32));
|
||
|
||
printf("board version: protocol=%d, nodeid=%d, nodeType=%d\r\n", pPkt->sendBoardVer.protocolType, pPkt->sendBoardVer.nodeId, pPkt->sendBoardVer.nodeType);
|
||
char ver[EX_VER_LEN+1];
|
||
memset(&ver, 0, EX_VER_LEN+1);
|
||
memcpy(&ver, &pPkt->sendBoardVer.ver, BOARD_VER_LEN*sizeof(u32));
|
||
printf("version=%s\r\n", ver); // 程序版本
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(pPkt->sendBoardVer.ver)), BOARD_VER_LEN*sizeof(u32));
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateBoardVer\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
int CreateHeadBoardPara(OperPacket * pPkt, u8 nodeId, u8 nodeType, u8* pData)
|
||
{
|
||
if (pPkt == NULL || pData == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
int rslt;
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
|
||
pPkt->boardPara.cmdCode = DCMD_SEND_HEADPARA;
|
||
|
||
pPkt->boardPara.nodeId = nodeId; // headList对应索引,上位机不需要知道具体节点ID,只负责存储在相应变量即可
|
||
pPkt->boardPara.nodeType = nodeType; // 对应节点类型(平绣,毛巾,缠绕)
|
||
|
||
memcpy(&pPkt->boardPara.exData, pData, BOARD_PARA_SIZE);
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(pPkt->boardPara.exData)), BOARD_PARA_SIZE);
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateHeadBoardPara\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
int CreateColorBoardPara(OperPacket * pPkt, u8 nodeId, u8* pData)
|
||
{
|
||
if (pPkt == NULL || pData == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
int rslt;
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
|
||
pPkt->boardPara.cmdCode = DCMD_SEND_COLORPARA;
|
||
|
||
pPkt->boardPara.nodeId = nodeId; // 对应索引,上位机不需要知道具体节点ID,只负责存储在相应变量即可
|
||
|
||
memcpy(&pPkt->boardPara.exData, pData, BOARD_PARA_SIZE);
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(pPkt->boardPara.exData)), BOARD_PARA_SIZE);
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateHeadBoardPara\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
int RequestHeadNvParas(int nodetype, int nodeid, int paraid, u32 * pBuf)
|
||
{
|
||
#if (CUR_MACHINE == MACH_EMB)
|
||
return RequestEmbCoilParasProc(nodeid, pBuf);
|
||
#elif (CUR_MACHINE == MACH_WIRE)
|
||
return RequestWireHeadAParaProc(nodeid, 1, paraid, pBuf);
|
||
#else
|
||
return 0;
|
||
#endif
|
||
}
|
||
|
||
void SetHeadNvPara(int nodetype, int nodeid, int paraid, u32 * pBuf)
|
||
{
|
||
#if (CUR_MACHINE == MACH_EMB)
|
||
SetEmbCoilParasProc(nodeid, pBuf);
|
||
#elif (CUR_MACHINE == MACH_WIRE)
|
||
SetWireHeadAPara(nodeid, paraid, pBuf);
|
||
#endif
|
||
}
|
||
|
||
int CreateHeadNvParas(OperPacket * pPkt, u8 nodetype, u8 nodeId, u8 paraid, u8* pData)
|
||
{
|
||
if (pPkt == NULL || pData == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
int rslt;
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
|
||
pPkt->boardPara.cmdCode = DCMD_SEND_HEAD_NVPARAS;
|
||
|
||
pPkt->boardPara.nodeId = nodeId; // 上位机不需要知道具体节点ID,只负责存储在相应变量即可
|
||
pPkt->boardPara.nodeType = nodetype;
|
||
pPkt->boardPara.paraid = paraid;
|
||
|
||
memcpy(&pPkt->boardPara.exData, pData, 128);
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(pPkt->boardPara.exData)), 128);
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateHeadNvParas\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
int CreateMcInfo(OperPacket * pPkt, int toggle)
|
||
{
|
||
int rslt;
|
||
MCInfo info;
|
||
u16 ver;
|
||
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
memset(&info, 0, sizeof(MCInfo));
|
||
|
||
pPkt->sendMcInfo.cmdCode = DCMD_SEND_MC_INFO;
|
||
pPkt->sendMcInfo.toggle = (u16)toggle;
|
||
|
||
ver = GetFpgaHardVersion(); // 读取硬件版本信息
|
||
sprintf(info.fpgaHardVerStr, "FPGA Hard: %x.%x", (ver&0xff00)>>8,(ver&0x00ff));
|
||
|
||
ver = GetFpgaSoftVersion(); // 读取软件版本信息
|
||
sprintf(info.fpgaSoftVerStr, "FPGA Soft: %x.%x", (ver&0xff00)>>8,(ver&0x00ff));
|
||
|
||
GetVersionStr(info.softwareVerStr); // 软件版本信息
|
||
|
||
GetBuildStr(info.buildInfoStr); // 编译时间信息
|
||
|
||
GetBoardIdInfo(info.boardId); // 板卡ID信息
|
||
|
||
GetLastInstallment(info.installment); // 加密字符串
|
||
|
||
printf("create system info len=%d, as follow:\r\n", sizeof(MCInfo));
|
||
|
||
printf("%s\r\n", info.fpgaHardVerStr); // FPGA硬件版本
|
||
printf("%s\r\n", info.fpgaSoftVerStr); // FPGA软件版本
|
||
printf("%s\r\n", info.softwareVerStr); // 软件版本
|
||
printf("%s\r\n", info.buildInfoStr); // 编译日期信息
|
||
printf("%s\r\n", info.boardId); // 板卡ID
|
||
printf("%s\r\n", info.installment); // 最后一次的分期密码字符串
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(info)), sizeof(MCInfo));
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateMcInfo\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
// 运行状态
|
||
int CreateMcStatus(OperPacket * pPkt, int toggle)
|
||
{
|
||
int rslt;
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
|
||
pPkt->sendMcStatus.cmdCode = DCMD_SEND_MC_STATUS;
|
||
pPkt->sendMcStatus.toggle = (u16)toggle;
|
||
|
||
// printf("create mc status len=%d\r\n", sizeof(MCStatus));
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(g_workCtrl.cursta)), sizeof(MCStatus));
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateMcStatus\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
// 运行文件位图
|
||
int CreateFileList(OperPacket * pPkt, int toggle)
|
||
{
|
||
int rslt;
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
|
||
pPkt->setFilesList.cmdCode= DCMD_SEND_FILE_LIST;
|
||
pPkt->setFilesList.fileIdxMap = (u16)toggle;
|
||
|
||
// printf("create mc status len=%d\r\n", sizeof(MCStatus));
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(g_workCtrl.cursta)), sizeof(MCStatus));
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateMcStatus\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
__WEAK void SensorsStatus(int mode, u8 * buf)
|
||
{
|
||
}
|
||
|
||
// 传感信号
|
||
int CreateSensorsStatus(OperPacket * pPkt)
|
||
{
|
||
int rslt;
|
||
u8 insta[MAX_EXDP_LEN];
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
memset(&insta, 0, MAX_EXDP_LEN);
|
||
|
||
pPkt->sendSensors.cmdCode = DCMD_SEND_SENSORS;
|
||
|
||
SensorsStatus(0, &insta[0]);
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(insta)), MAX_EXDP_LEN);
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateMcStatus\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
|
||
// 传感信号位图
|
||
int CreateSensorsBmp(OperPacket * pPkt)
|
||
{
|
||
int rslt;
|
||
u8 insta[MAX_EXDP_LEN];
|
||
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
memset(pPkt, 0, LEN_NORMAL_PACKET);
|
||
|
||
pPkt->sendSensors.cmdCode = DCMD_SEND_SENSORS_BMP;
|
||
|
||
SensorsStatus(1, &insta[0]);
|
||
|
||
rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(insta)),MAX_EXDP_LEN);
|
||
if (rslt != 0)
|
||
{
|
||
printf("error at call PacketAVLDP in CreateSensorsBmp\r\n");
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
// 遍历任务
|
||
void TraverseTask(u8 protocol, u8 nodeId, u8 nodeType, int traNum)
|
||
{
|
||
#if (CUR_MACHINE == MACH_EMB) // 绣花机
|
||
EmbTraverseTask(nodeId, nodeType, traNum);
|
||
#elif (CUR_MACHINE == MACH_WIRE)
|
||
WireTraverseTask(nodeId, traNum);
|
||
#else
|
||
#endif
|
||
}
|
||
|
||
void ResetCHB(u32 hdsel)
|
||
{
|
||
g_workCtrl.cursta.errorCode = ERR_NONE;
|
||
g_workCtrl.almflashGreen = ALM_LIT_FLASH;
|
||
g_workCtrl.almflashRed = ALM_LIT_OFF;
|
||
g_workCtrl.almflashYello = ALM_LIT_OFF;
|
||
g_workCtrl.almflashBee = ALM_LIT_OFF;
|
||
|
||
g_workCtrl.cursta.btrdLength = g_workCtrl.chBobbinLength;
|
||
g_workCtrl.savedpara.btrdLength = g_workCtrl.cursta.btrdLength;
|
||
g_workCtrl.cursta.btrdPics = g_workCtrl.chBobbinPics;
|
||
g_workCtrl.savedpara.btrdPics = g_workCtrl.cursta.btrdPics;
|
||
|
||
SaveWorkNvPara();
|
||
|
||
printf("get cmd MC_CLEAN_BOBBIN\r\n");
|
||
|
||
ReportError(0);
|
||
}
|
||
|
||
// 设置工作状态
|
||
void SetMcStatus(u32 sta, u32 para)
|
||
{
|
||
switch(sta)
|
||
{
|
||
case MC_STA_CLENA_ERR: // 清除错误
|
||
CleanError();
|
||
break;
|
||
case MC_STA_EN_WORK: // 允许工作(状态)
|
||
printf("set en work sta\r\n");
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENSTATE;
|
||
break;
|
||
case MC_STA_DIS_WORK: // 禁止工作(状态)
|
||
printf("set dis work sta\r\n");
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_ENSTATE);
|
||
break;
|
||
case MC_STA_EN_TIME: // 允许工作(时间)
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_ENTIME;
|
||
break;
|
||
case MC_STA_DIS_TIME: // 禁止工作(时间)
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_ENTIME);
|
||
break;
|
||
case MC_CLEAN_COUNT: // 产量计数清零
|
||
{
|
||
if (para == 0)
|
||
{
|
||
g_workCtrl.cursta.outCounter = 0;
|
||
g_workCtrl.cursta.embNeedleNum = 0; // 20211027,增加清空产量的同时清空刺绣针数
|
||
}
|
||
else
|
||
{
|
||
int decinc = (s16)para;
|
||
decinc += g_workCtrl.cursta.outCounter;
|
||
if (decinc < 0)
|
||
{
|
||
decinc = 0;
|
||
}
|
||
g_workCtrl.cursta.outCounter = decinc;
|
||
}
|
||
g_workCtrl.savedpara.outCounter = g_workCtrl.cursta.outCounter;
|
||
g_workCtrl.savedpara.embNeedleNum = g_workCtrl.cursta.embNeedleNum;
|
||
|
||
SaveWorkNvPara();
|
||
ReportError(0);
|
||
break;
|
||
}
|
||
case MC_STA_MANUAL: // 手动工作状态
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_WKAUTO);
|
||
break;
|
||
case MC_STA_AUTO: // 自动工作状态
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_WKAUTO;
|
||
break;
|
||
case MC_FILE_SWITCH: // 文件切换
|
||
g_workCtrl.cursta.fileIdx = para;
|
||
break;
|
||
case MC_INVALID_FILE: // 文件失效命令
|
||
InvalidDatFile(para);
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_EN_SCAN); // 禁止扫码
|
||
printf("get InvalidDatFile cmd, Reset work sta en scan1\r\n");
|
||
break;
|
||
case MC_CLEAN_PARA_REF: // 清除刷新参数标志
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_NEW_PARA);
|
||
break;
|
||
case MC_SET_TO_NORMAL: // 设置为正常工作状态
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_SIMULATE);
|
||
break;
|
||
case MC_SET_TO_SIMULATE: // 设置为模拟工作状态
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_SIMULATE;
|
||
break;
|
||
case MC_CLEAN_FIDX:
|
||
SetDatIdxToStart();
|
||
/*
|
||
g_workCtrl.cursta.dataIdx = 0; // 文件索引复位
|
||
g_workCtrl.savedpara.dataIdx = g_workCtrl.cursta.dataIdx;
|
||
SaveWorkNvPara();
|
||
GetWorkPosFromIndex();*/
|
||
break;
|
||
case MC_CLEAN_BOBBIN: // 底线计数复位
|
||
ResetCHB(para);
|
||
break;
|
||
case MC_SET_ENTER_SCAN_SENSOR: // 设置为 进入 扫描传感器状态
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_SENSOR;
|
||
printf("get MC_SET_ENTER_SCAN_SENSOR cmd\r\n");
|
||
break;
|
||
case MC_SET_EXIT_SCAN_SENSOR: // 设置为 退出 扫描传感器状态
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_SENSOR);
|
||
CleanButtonTask();
|
||
printf("get MC_SET_EXIT_SCAN_SENSOR cmd\r\n");
|
||
break;
|
||
case MC_SET_ENTER_TEST_OUTPUT: // 设置为 进入 测试输出状态
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_OUTPUT;
|
||
printf("get MC_SET_ENTER_TEST_OUTPUT cmd\r\n");
|
||
break;
|
||
case MC_SET_EXIT_TEST_OUTPUT: // 设置为 退出 测试输出状态
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_OUTPUT);
|
||
CleanButtonTask();
|
||
printf("get MC_SET_EXIT_TEST_OUTPUT cmd\r\n");
|
||
break;
|
||
|
||
case MC_STA_EXIT_TRA: // 退出遍历状态
|
||
{
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_TRAVERSE;
|
||
break;
|
||
}
|
||
|
||
case MC_STA_EXIT_THREADBK: // 退出断线检测状态
|
||
{
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_DETBK);
|
||
break;
|
||
}
|
||
|
||
case MC_INVALID_FILEBLOCK: // 文件数据块失效命令(网络服务器实时传输花样文件)
|
||
{
|
||
InvalidDatBlock();
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 手动控制
|
||
int ControlByHand(OperPacket * pPkt)
|
||
{
|
||
int err;
|
||
printf("receive ctrl by hand, actcode=0x%x, para1=0x%x, para2=0x%x, para3=0x%x\r\n",
|
||
pPkt->actByhand.actCode, pPkt->actByhand.para1, pPkt->actByhand.para2, pPkt->actByhand.para3);
|
||
|
||
err = ERR_NONE;
|
||
|
||
if (err != ERR_NONE)
|
||
{
|
||
ReportError(err);
|
||
return err;
|
||
}
|
||
|
||
switch (pPkt->actByhand.actCode)
|
||
{
|
||
case MOTO_TO_ZERO: // 电机归零
|
||
MotoToZero(pPkt->actByhand.para1);
|
||
break;
|
||
case MOVE_BY_HAND: // 电机手动移动
|
||
// printf("para1=%d, para2=%d, para3=%d\r\n", pPkt->actByhand.para1, pPkt->actByhand.para2, pPkt->actByhand.para3);
|
||
MoveMotoByHand(pPkt->actByhand.para1, pPkt->actByhand.para2, pPkt->actByhand.para3);
|
||
break;
|
||
case OUTPUT_CTRL: // 输出控制
|
||
OutputByHand(pPkt->actByhand.para1, pPkt->actByhand.para2, pPkt->actByhand.para3);
|
||
break;
|
||
case MOTO_EN_CTRL: // 伺服打开关闭
|
||
MotosServoCtrl(pPkt->actByhand.para1, pPkt->actByhand.para2);
|
||
break;
|
||
case MANUAL_ACTION: // 手动控制功能
|
||
ManualActionCtrl(pPkt->actByhand.para1, pPkt->actByhand.para2, pPkt->actByhand.para3);
|
||
break;
|
||
case TEST_THREADBK: // 测试断线检测
|
||
TestThreadBreak(pPkt->actByhand.para1, pPkt->actByhand.para2, pPkt->actByhand.para3);
|
||
break;
|
||
case SHAKE_FRAME_TEST: // 抖框测试
|
||
ShakeFrameTest(pPkt->actByhand.para1, pPkt->actByhand.para2, pPkt->actByhand.para3);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
__WEAK void MotoToZero(u16 obj)
|
||
{
|
||
}
|
||
|
||
__WEAK void MoveMotoByHand(u16 obj, u16 dir, u16 spd)
|
||
{
|
||
}
|
||
|
||
__WEAK void OutputByHand(u16 obj, u16 act, u16 para)
|
||
{
|
||
}
|
||
|
||
__WEAK void MotosServoCtrl(u16 obj, u16 onoff)
|
||
{
|
||
}
|
||
|
||
__WEAK void ManualActionCtrl(u16 obj, u16 para2, u16 para3)
|
||
{
|
||
}
|
||
|
||
__WEAK void TestThreadBreak(int type, int needle, int head)
|
||
{
|
||
}
|
||
|
||
void ShakeFrameTest(u16 ofstx, u16 ofsty, u16 runspd)
|
||
{
|
||
#if (CUR_MACHINE == MACH_WIRE)
|
||
WireShakeFrameTest(ofstx, ofsty, runspd);
|
||
#endif
|
||
}
|
||
|
||
int ControlWork(OperPacket * pPkt)
|
||
{
|
||
printf("work cmd, code=0x%x\r\n", pPkt->mcWork.workCode);
|
||
switch(pPkt->mcWork.workCode)
|
||
{
|
||
case WORK_START: // 启动工作
|
||
{
|
||
break;
|
||
}
|
||
case WORK_PAUSE: // 暂停工作
|
||
{
|
||
break;
|
||
}
|
||
case WORK_FINISH: // 流程复位
|
||
{
|
||
AllToReset();
|
||
break;
|
||
}
|
||
case WORK_FIND_ZERO: // 自动找零
|
||
{
|
||
AllToZero();
|
||
break;
|
||
}
|
||
case WORK_GOTO_START: // 回起点
|
||
{
|
||
GotoStartPos();
|
||
break;
|
||
}
|
||
case WORK_GOTO_ANCHOR: // 回定位点
|
||
{
|
||
GotoAnchorPos();
|
||
break;
|
||
}
|
||
case WORK_GOTO_OFFSET: // 回偏移点
|
||
{
|
||
GotoOffsetPos();
|
||
break;
|
||
}
|
||
case WORK_SET_OFFSET: // 定偏移点
|
||
{
|
||
SetOffsetPos();
|
||
break;
|
||
}
|
||
case WORK_CHECK_FRAME: // 边框检查
|
||
{
|
||
CheckFrame();
|
||
break;
|
||
}
|
||
|
||
case WORK_SIMULATION_FRAME: // 空走边框
|
||
{
|
||
SimulationFrame();
|
||
break;
|
||
}
|
||
|
||
case WORK_FAST_JUMP: // 快速进退
|
||
{
|
||
FastJump(pPkt->mcWork.para1);
|
||
break;
|
||
}
|
||
|
||
case WORK_GOTO_WKPOS: // 回工作点
|
||
{
|
||
GotoWorkPos();
|
||
break;
|
||
}
|
||
|
||
case WORK_GOTO_FINISH: // 回结束点
|
||
{
|
||
GotoFinishPos();
|
||
break;
|
||
}
|
||
case WORK_GOTO_ZERO: // 回零点位
|
||
{
|
||
GotoFrameZeroPos();
|
||
break;
|
||
}
|
||
|
||
case WORK_RPM_CHG: // 速度改变
|
||
{
|
||
ChangeRpm((int)(pPkt->mcWork.para1));
|
||
break;
|
||
}
|
||
|
||
case WORK_FILE_IDX_CHG: // 文件序号改变
|
||
{
|
||
g_workCtrl.cursta.fileIdx = (pPkt->mcWork.para1);
|
||
break;
|
||
}
|
||
|
||
case WORK_GOTO_FEED: // 回上料点
|
||
{
|
||
GotoFeedPos();
|
||
break;
|
||
}
|
||
case WORK_SET_FEED: // 定上料点
|
||
{
|
||
SetFeedPos();
|
||
break;
|
||
}
|
||
case WORK_ACT_OIL: // 手动加油
|
||
{
|
||
OilingInWorking(pPkt->mcWork.para1);
|
||
break;
|
||
}
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int ControlWorkWhenWorking(OperPacket * pPkt)
|
||
{
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
printf("work cmd when work, code=0x%x\r\n", pPkt->mcWork.workCode);
|
||
switch(pPkt->mcWork.workCode)
|
||
{
|
||
case WORK_PAUSE: // 暂停工作
|
||
{
|
||
g_workCtrl.stopFlag = 1;
|
||
break;
|
||
}
|
||
case WORK_RPM_CHG: // 速度改变
|
||
{
|
||
ChangeRpm((int)(pPkt->mcWork.para1));
|
||
break;
|
||
}
|
||
case WORK_ACT_OIL: // 工作中手动加油
|
||
{
|
||
OilingInWorking(pPkt->mcWork.para1);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
__WEAK void ChangeRpm(int rpmchg)
|
||
{
|
||
}
|
||
|
||
// 流程复位
|
||
__WEAK void AllToReset(void)
|
||
{
|
||
}
|
||
|
||
__WEAK void AllToZero(void)
|
||
{
|
||
}
|
||
|
||
__WEAK int GotoStartPos(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK int GotoAnchorPos(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK int GotoOffsetPos(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK void SetOffsetPos(void)
|
||
{
|
||
}
|
||
|
||
__WEAK int GotoWorkPos(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK int GotoFinishPos(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK int GotoFeedPos(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK void SetFeedPos(void)
|
||
{
|
||
}
|
||
|
||
__WEAK int GotoFrameZeroPos(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK int CheckFrame(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
// 空走边框
|
||
void SimulationFrame(void)
|
||
{
|
||
#if (CUR_MACHINE == MACH_EMB)
|
||
EmbSimulationFrame();
|
||
#endif
|
||
}
|
||
|
||
__WEAK int FastJump(u32 idx)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
__WEAK void OilingInWorking(u32 para1)
|
||
{
|
||
}
|
||
|
||
__WEAK int MoveFrameToPos(s32 posx, s32 posy)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
// 定量移框
|
||
__WEAK int FixMoveFrame(s32 xmvmnt, s32 yxmvmnt)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
void MoveFrameTo(OperPacket * pPkt)
|
||
{
|
||
s32 posx, posy;
|
||
|
||
posx = pPkt->moveFrameTo.posx;
|
||
posy = pPkt->moveFrameTo.posy;
|
||
|
||
printf("move to cmd, posx=%d, posy=%d\r\n", posx, posy);
|
||
|
||
MoveFrameToPos(posx, posy);
|
||
|
||
}
|
||
|
||
void MoveFrameAsOfst(OperPacket * pPkt)
|
||
{
|
||
s32 ofstx, ofsty;
|
||
|
||
ofstx = pPkt->moveFrameTo.posx;
|
||
ofsty = pPkt->moveFrameTo.posy;
|
||
|
||
printf("move as ofst cmd, ofstx=%d, ofsty=%d\r\n", ofstx, ofsty);
|
||
|
||
FixMoveFrame(ofstx, ofsty);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
int ReportError(int errCode)
|
||
{
|
||
if (errCode != g_workCtrl.cursta.errorCode)
|
||
{
|
||
printf("Error: code=0x%x\r\n", errCode);
|
||
//printf("cursta work status 0x%x\r\n",g_workCtrl.cursta.workStatus);
|
||
}
|
||
|
||
g_workCtrl.cursta.errorCode = errCode;
|
||
|
||
SendStatus(1);
|
||
return 0;
|
||
}
|
||
|
||
void CleanError(void)
|
||
{
|
||
ReportError(ERR_NONE);
|
||
}
|
||
|
||
__WEAK void SetLightStaByCode(int errCode)
|
||
{
|
||
if (errCode == 0 || (errCode >= 0x100 && errCode < 0x200)) // 状态
|
||
{
|
||
if (((g_workCtrl.cursta.workStatus & WORK_STA_WORKING) == WORK_STA_WORKING) ||
|
||
((g_workCtrl.cursta.workStatus & WORK_STA_SIMULATE) == WORK_STA_SIMULATE) ||
|
||
((g_workCtrl.cursta.workStatus & WORK_STA_BUSY) == WORK_STA_BUSY) ||
|
||
0 )
|
||
{
|
||
g_workCtrl.almflashRed = ALM_LIT_OFF; // 关红灯
|
||
g_workCtrl.almflashGreen = ALM_LIT_FLASH; // 开绿灯
|
||
g_workCtrl.almflashYello = ALM_LIT_OFF; // 关黄灯
|
||
g_workCtrl.almflashBee = ALM_LIT_OFF; // 闪蜂鸣器
|
||
}
|
||
else
|
||
{
|
||
g_workCtrl.almflashRed = ALM_LIT_OFF; // 关红灯
|
||
g_workCtrl.almflashGreen = ALM_LIT_OFF; // 关绿灯
|
||
g_workCtrl.almflashYello = ALM_LIT_ON; // 开黄灯
|
||
g_workCtrl.almflashBee = ALM_LIT_OFF; // 关蜂鸣器
|
||
}
|
||
}
|
||
else // 错误
|
||
{
|
||
g_workCtrl.almflashRed = ALM_LIT_FLASH; // 开红灯
|
||
g_workCtrl.almflashGreen = ALM_LIT_OFF; // 关绿灯
|
||
g_workCtrl.almflashYello = ALM_LIT_OFF; // 关黄灯
|
||
g_workCtrl.almflashBee = ALM_LIT_FLASH; // 闪蜂鸣器
|
||
}
|
||
}
|
||
|
||
// 状态改变判断
|
||
int IsStatusChanged(void)
|
||
{
|
||
int rslt;
|
||
|
||
RefreshStatus();
|
||
|
||
g_workCtrl.cursta.workableTimer = GetWorkableTime(); // 更新计数值
|
||
|
||
// 比较,不同则发送
|
||
rslt = memcmp(&(g_workCtrl.oldsta), &(g_workCtrl.cursta), sizeof(MCStatus));
|
||
if (rslt != 0)
|
||
{
|
||
memcpy(&(g_workCtrl.oldsta), &(g_workCtrl.cursta), sizeof(MCStatus));
|
||
}
|
||
return rslt;
|
||
}
|
||
|
||
void SendStatus(int force)
|
||
{
|
||
SendMcStatus(force);
|
||
}
|
||
|
||
__WEAK void CheckSensorAndPos(void)
|
||
{
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
// 查询当前数据执行进度,并从上位机请求数据
|
||
void CheckAndRequestData(void)
|
||
{
|
||
static int olddatblockIdx = -1; // 记录上一次请求的数据块ID
|
||
static u32 requesttimer = 0; // 请求时间记录
|
||
if (IsDatFileAvailable() == TRUE && // 20231017
|
||
g_datFile.storage == STORAGE_NETWORK && // 20240204
|
||
g_workCtrl.requestFlag == 0 && // 20240606
|
||
1)
|
||
{
|
||
u32 timer = GetMsSoftTimer();
|
||
|
||
int datblockIdx = GetBlockIdxNeedtoLoad(GetDatIndex());
|
||
if (datblockIdx >= 0)
|
||
{
|
||
if (olddatblockIdx != datblockIdx ||
|
||
((timer - requesttimer) > REQUEST_GAP) ||
|
||
0)
|
||
{
|
||
olddatblockIdx = datblockIdx;
|
||
requesttimer = timer;
|
||
RequestADataBlock(datblockIdx);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void SetFileOkFlag(int flag)
|
||
{
|
||
if (flag == 0)
|
||
{
|
||
printf("clean file ok flag\r\n");
|
||
g_workCtrl.cursta.workStatus &= ~(WORK_STA_FILEOK); // 文件接收标志
|
||
}
|
||
else
|
||
{
|
||
printf("set file ok flag\r\n");
|
||
g_workCtrl.cursta.workStatus |= WORK_STA_FILEOK; // 文件接收标志
|
||
}
|
||
|
||
SendStatus(0);
|
||
}
|
||
|
||
void SaveFileIdxFromDatafile(void)
|
||
{
|
||
g_workCtrl.cursta.fileIdx = g_datFile.fileIdx;
|
||
g_workCtrl.savedpara.fileIdxMap = g_datFile.fileIdxMap;
|
||
g_workCtrl.savedpara.fileIdx = g_workCtrl.cursta.fileIdx;
|
||
SaveWorkNvPara();
|
||
}
|
||
|
||
int GetDatIndex(void)
|
||
{
|
||
return g_workCtrl.cursta.dataIdx;
|
||
}
|
||
|
||
int DatIndexInc(void)
|
||
{
|
||
int rslt;
|
||
rslt = g_workCtrl.cursta.dataIdx + 1;
|
||
|
||
if (IsDatIndexAvailable(rslt) == TRUE)
|
||
{
|
||
g_workCtrl.cursta.dataIdx = rslt;
|
||
g_workCtrl.savedpara.dataIdx = g_workCtrl.cursta.dataIdx;
|
||
SaveWorkNvPara();
|
||
}
|
||
else
|
||
{
|
||
rslt = -1;
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
int DatIndexDec(void)
|
||
{
|
||
if (g_workCtrl.cursta.dataIdx != 0)
|
||
{
|
||
g_workCtrl.cursta.dataIdx--;
|
||
|
||
g_workCtrl.savedpara.dataIdx = g_workCtrl.cursta.dataIdx;
|
||
SaveWorkNvPara();
|
||
return g_workCtrl.cursta.dataIdx;
|
||
}
|
||
else
|
||
{
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
__WEAK int GetWorkPosFromIndex(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
int SetExecProgress(OperPacket * pPkt)
|
||
{
|
||
int rslt;
|
||
FileExecPara execPara;
|
||
|
||
if (pPkt == NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (pPkt->setExecProgress.exLen != sizeof(execPara))
|
||
{
|
||
printf("receive len not equ, receivelen=%d, FileExecPara = %d", pPkt->setExecProgress.exLen, sizeof(execPara));
|
||
rslt = -2;
|
||
}
|
||
else
|
||
{
|
||
memcpy((u8*)(&execPara), pPkt->setExecProgress.exData, sizeof(execPara));
|
||
rslt = 0;
|
||
}
|
||
|
||
if (rslt == 0)
|
||
{
|
||
#if (CUR_MACHINE == MACH_EMB)
|
||
rslt = EmbSetProgress(&execPara);
|
||
#elif (CUR_MACHINE == MACH_PES)
|
||
rslt = PESSetProgress(&execPara);
|
||
#endif
|
||
if (rslt == 0) // 20231017
|
||
{
|
||
g_workCtrl.savedpara.dataIdx = g_workCtrl.cursta.dataIdx;
|
||
SaveWorkNvPara();
|
||
}
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
// 数据从头开始
|
||
void SetDatIdxToStart(void)
|
||
{
|
||
g_workCtrl.cursta.dataIdx = 0; // 当前花样的针迹数据索引
|
||
|
||
g_workCtrl.cursta.colorIdx = 0; // 20220708 数据从头开始,色序也应该从头开始
|
||
|
||
g_workCtrl.savedpara.dataIdx = g_workCtrl.cursta.dataIdx;
|
||
SaveWorkNvPara();
|
||
|
||
// 机头补绣
|
||
g_workCtrl.embMendEndIdx = -1;
|
||
g_workCtrl.embMendTrdFlag = 0;
|
||
g_workCtrl.mendEndPatternIdx = 0;
|
||
|
||
GetWorkPosFromIndex();
|
||
|
||
#if (CUR_MACHINE == MACH_EMB)
|
||
EmbSetDatIdxToStart();
|
||
#endif
|
||
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
void SaveToNvArea(s32 * posilist)
|
||
{
|
||
if (posilist != NULL)
|
||
{
|
||
memcpy((s32 *)(&(g_workCtrl.savedpara.motospos[0])), posilist, sizeof(s32)*AXIS_NUM);
|
||
SaveWorkNvPara();
|
||
}
|
||
}
|
||
|
||
void ReadAndFreshMotosPos(void)
|
||
{
|
||
s32 pos[AXIS_NUM];
|
||
|
||
if (GetMotosCounter(pos) == 0)
|
||
{
|
||
RefreshMotosPos(pos);
|
||
SaveToNvArea(pos); // 保存到掉电保护区域
|
||
}
|
||
}
|
||
|
||
void ReadMotosPos(void)
|
||
{// 只刷新,不保存
|
||
s32 pos[AXIS_NUM];
|
||
|
||
if (GetMotosCounter(pos) == 0)
|
||
{
|
||
RefreshMotosPos(pos);
|
||
//SaveToNvArea(pos); // 保存到掉电保护区域
|
||
}
|
||
}
|
||
|
||
void NormalRefPosition(u32 para, s32 * posilist)
|
||
{
|
||
SaveToNvArea(posilist);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
|