optical/EMBOS/Users/App/workctrl/workctrl.c
2025-09-04 09:45:08 +08:00

1365 lines
28 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}
//-------------------------------------------------------------------------------