#define _IN_OPERATOR_C #include "operator.h" #include "serial.h" #include "delay.h" #include "tcpserver.h" #include "filetrans.h" #include "trigger.h" #include "stapp.h" #include "paras.h" #include "extendboards.h" #if (CUR_CORE_BOARD == CORE_BOARD_APP) #include "workctrl.h" #include "installment.h" #include "error.h" #else #include "cpuid.h" #endif //--------------------------------------------------------------- int ReceiveMcParas(OperPacket * pPkt); int CreateMcParas(OperPacket * pPkt, int type, int id); void CleanBuffAfterAction(void); //--------------------------------------------------------------- #if (OPERATOR_PORT == COMM_ETHERNET) SocketCtrl * g_pOperatorSocket = NULL; #define OPERATOR_SIDX TCP_SERVER_SN_BEG // udp socket // 发送数据 int OperatorSendData(u8 * pDatBuf, int len) { return EthernetSendData(g_pOperatorSocket, pDatBuf, len); } // 接收数据 int OperatorGetData(u8 * pDat, int expectLen) { return EthernetGetData(g_pOperatorSocket, pDat, expectLen); } // 已接收数据长度 int OperatorGetRsLen(void) { return EthernetGetRsLen(g_pOperatorSocket); } // 得到发送缓冲区空闲长度 int OperatorGetSdFreeLen(void) { return EthernetGetSdFreeLen(g_pOperatorSocket); } #endif DataExFuns g_operDataExFuns; //--------------------------------------------------------------- int SendOperCommData(const u8 * pDatBuf, int len) { printf("SendOperCommData is Empty\r\n"); return 0; } int GetOperCommData(u8 * pDat, int expectLen) { printf("GetOperCommData is Empty\r\n"); return 0; } int GetOperRsvLen(void) { printf("GetOperRsvLen is Empty\r\n"); return 0; } int GetOperTrsFreeLen(void) { printf("GetOperTrsFreeLen is Empty\r\n"); return 0; } void InitOperator(void) { #if (OPERATOR_PORT == COMM_ETHERNET) InitEthernet(); g_pOperatorSocket = GetCtrlFromSocketIdx(OPERATOR_SIDX); g_operDataExFuns.SendCommData = OperatorSendData; g_operDataExFuns.GetCommData = OperatorGetData; g_operDataExFuns.GetRsvLen = OperatorGetRsLen; g_operDataExFuns.GetTrsFreeLen = OperatorGetSdFreeLen; g_operDataExFuns.Delay = DelayMs; AddTriggerToList(1000, NULL, EthernetServiceRun); // 1000ms 添加以太网服务 #elif (OPERATOR_PORT == COMM_USART1) InitUsart1(B115200, '8', 'N', '1'); g_operDataExFuns.SendCommData = Usart1SendData; g_operDataExFuns.GetCommData = Usart1GetData; g_operDataExFuns.GetRsvLen = Usart1GetRsLen; g_operDataExFuns.GetTrsFreeLen = Usart1GetSdFreeLen; g_operDataExFuns.Delay = DelayMs; #else g_operDataExFuns.SendCommData = SendOperCommData; g_operDataExFuns.GetCommData = GetOperCommData; g_operDataExFuns.GetRsvLen = GetOperRsvLen; g_operDataExFuns.GetTrsFreeLen = GetOperTrsFreeLen; g_operDataExFuns.Delay = DelayMs; #endif } // 请求文件数据包 void RequestFileData(u8 fileType, u8 fileIdx, u16 fileId, int datblockIdx) { int rslt; OperPacket operpkt; DataPacket* pDatpkt = (DataPacket*)(&operpkt); memset(pDatpkt, 0, LEN_NORMAL_PACKET); operpkt.requestDatBlock.cmdCode = DCMD_REQUEST_DAT; operpkt.requestDatBlock.fileType = fileType; operpkt.requestDatBlock.fileIdx = fileIdx; operpkt.requestDatBlock.fileId = fileId; operpkt.requestDatBlock.datBlockIdx = datblockIdx; // 数据包索引(每个包1024字节) rslt = PacketAFLDP(&(operpkt.packet)); if (rslt != 0) { // printf("error at call PacketAFLDP in SendMcStatus\r\n"); } else { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { // printf("error at call SendAPacket in SendMcStatus\r\n"); } } } #if (CUR_CORE_BOARD != CORE_BOARD_BOOT) void OperatorTask(void) { int rslt; OperPacket operpkt; DataPacket* pDatpkt = (DataPacket*)(&operpkt); // 读取操作箱命令 rslt = GetANormalPacket(&g_operDataExFuns, pDatpkt); // 分析数据包,并执行 if (rslt > 0) // 收到数据包 { switch(operpkt.packet.fldp.cmd) // 先按固定长度解析 { case UCMD_GET_MC_INFO: // 读取机器信息 { printf("get mc info cmd, toggle=%d\r\n", operpkt.getMcInfo.toggle); rslt = CreateMcInfo(&operpkt, operpkt.getMcInfo.toggle); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_MC_INFO \r\n"); } } else { printf("error at call CreateMcInfo in OperatorTask UCMD_GET_MC_INFO \r\n"); } break; } case UCMD_GET_MC_STATUS: // 读取机器状态 { // printf("get mc status cmd, toggle=%d\r\n", operpkt.getMcStatus.toggle); rslt = CreateMcStatus(&operpkt, operpkt.getMcStatus.toggle); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_MC_STATUS \r\n"); } } else { printf("error at call CreateMcStatus in OperatorTask UCMD_GET_MC_STATUS \r\n"); } break; } case UCMD_GET_MC_PARAS: // 读取机器参数 { printf("get mc paras cmd\r\n"); rslt = CreateMcParas(&operpkt, operpkt.getMcParas.paraType, operpkt.getMcParas.paraId); if (rslt == 0) { // int temp = GetMsSoftTimer(); rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 10000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_MC_PARAS \r\n"); } } else { printf("error at call CreateMcParas in OperatorTask UCMD_GET_MC_PARAS \r\n"); } break; } case UCMD_GET_MEM_DATA: // 读取内存数据 break; case UCMD_GET_SENSORS: // 读取传感信号 { //printf("get mc sensors cmd\r\n"); rslt = CreateSensorsStatus(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_SENSORS \r\n"); } } else { printf("error at call CreateSensorsStatus in OperatorTask UCMD_GET_SENSORS \r\n"); } break; } case UCMD_GET_SENSORS_BMP: // 读取有效传感器位图 { printf("get mc sensors bmp cmd\r\n"); rslt = CreateSensorsBmp(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_SENSORS_BMP \r\n"); } } else { printf("error at call CreateSensorsBmp in OperatorTask UCMD_GET_SENSORS_BMP \r\n"); } break; } case UCMD_GET_FILE_INFO: // 读取文件信息 { rslt = CreateFileInfo(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_FILE_INFO \r\n"); } } else { printf("error at call CreateFileInfo in OperatorTask UCMD_GET_FILE_INFO \r\n"); } break; } case UCMD_GET_TRANS_RESULT: // 读取传输结果 { printf("1. get trans result cmd\r\n"); rslt = CreateTransResult(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_TRANS_RESULT \r\n"); } } else { printf("error at call CreateTransResult in OperatorTask UCMD_GET_TRANS_RESULT \r\n"); } break; } case UCMD_SET_MC_CONFIG: // 设置机器配置 { break; } case UCMD_SET_MC_STATUS: // 设置机器状态 { printf("SetMcStatus when stop\r\n"); SetMcStatus(operpkt.setMcStatus.staCode, operpkt.setMcStatus.para); break; } case UCMD_SET_MC_PARAS: // 设置机器参数 { printf("receive set mc para cmd\r\n"); ReceiveMcParas(&operpkt); break; } case UCMD_SET_MEM_DATA: // 设置内存数据 { break; } case UCMD_SET_FILE_PARAS: // 设置文件参数 { ReceiveFileParas(&operpkt); break; } case UCMD_SET_FILE_EXDATA: // 设置文件扩展数据 { ReceiveFileExData(&operpkt); break; } case UCMD_SET_EXEC_PROGRESS: // 设置执行进度 { SetExecProgress(&operpkt); break; } case UCMD_SET_INSTALLMENT: // 设置分期密码 { int rslt; printf("set installment\r\n"); rslt = SetInstallMent((char*)(operpkt.setInstallment.exData)); RefreshWorkTimeEn(); if (rslt >= 0) { ReportError(ERR_INSTALLMENT_OK); // 密码设置成功 } else { ReportError(ERR_INSTALLMENT_FAIL); // 密码设置失败 } break; } case UCMD_SET_ELAPSED_TIME: // 设置经过的时间 { printf("set elapsed, type=%d, time = %d\r\n", operpkt.setElapsedTime.type, operpkt.setElapsedTime.time); if (g_workCtrl.cansetelapsed == 0) { u32 time; s32 val; time = operpkt.setElapsedTime.time; if (time > 5000*3600) // 5000小时 { time = 5000*3600; } time /= 60; // 分钟 val = time; val *= -1; if (abs(val) < 60) { printf("close time=%d min\r\n", val); } else if (abs(val) < 1440) { s32 hour, min; hour = val / 60; min = val % 60; printf("close time=%d hour %d min\r\n", hour, min); } else { s32 day, hour, min; day = val / 1440; hour = val % 1440; min = hour % 60; hour /= 60; printf("close time=%d day %d hour %d min\r\n", day, hour, min); } RefWorkableTimer(val); RefreshWorkTimeEn(); g_workCtrl.cansetelapsed = 1; } else { printf("has set elapsed already\r\n"); } break; } //--------------- case UCMD_ACT_BYHAND: // 手动控制命令 { ReportError(ERR_NONE); ControlByHand(&operpkt); CleanBuffAfterAction(); break; } case UCMD_MC_WORK: // 机器工作命令 { ReportError(ERR_NONE); ControlWork(&operpkt); CleanBuffAfterAction(); break; } case UCMD_MOVE_TO: // 框架移动到 { MoveFrameTo(&operpkt); break; } case UCMD_MOVE_OFST: // 框架移动偏移量 { MoveFrameAsOfst(&operpkt); break; } case UCMD_START_TRANS: // 启动文件传输 { StartReceiveFile(&operpkt); SaveFileIdxFromDatafile(); if (IsNewDatFile(0) == FALSE) { SetFileOkFlag(0); } break; } case UCMD_TRANS_FILE_DATA: // 文件传输命令 { u32 thistimer, oldtimer; oldtimer = GetMsSoftTimer(); do { int svrslt = SavePreProc(); if (svrslt == 2 || svrslt < 0) { break; } thistimer = GetMsSoftTimer(); if ((thistimer - oldtimer) > 3000) { oldtimer = thistimer; SendStatus(1); // 发送状态,防止界面断开连接 } }while(1); ReceiveFileData(&operpkt); if (IsNewDatFile(0) == TRUE) { SetFileOkFlag(1); // 文件接收标志 } break; } case UCMD_SET_FILE_LIST: // 设置文件列表 { ResetFileList(&operpkt); SaveFileIdxFromDatafile(); break; } case UCMD_BOARD_UPDATE: // 外围板升级 { // 机头板协议,上位机不需要知道对应的节点ID,只需告知节点类型和机头号即可 // 换色板协议 需告知第几块 printf("update ex board, protocolType=%d, nodetype=%d, nodeId=%d\r\n", operpkt.updateBoard.protocolType, operpkt.updateBoard.nodetype, operpkt.updateBoard.nodeId); StartBoardUpdate(operpkt.updateBoard.protocolType, operpkt.updateBoard.nodetype, operpkt.updateBoard.nodeId); DelayRef(1); break; } case UCMD_MC_UPDATE: // 下位机升级 { printf("receive updat mc cmd\r\n"); DelayRef(100); StartAppUpdate(1); // 升级并重启 break; } case UCMD_GET_FILE_LIST: // 获取下位机文件列表 { rslt = CreateFileList(&operpkt, g_datFile.fileIdxMap); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_FILE_LIST \r\n"); } } else { printf("error at call CreateMcStatus in OperatorTask UCMD_GET_FILE_LIST \r\n"); } break; } case UCMD_SET_DEF_PARA : // 设置默认参数 { printf("receive set def para cmd\r\n"); char * info = "set mc and wk def para"; SendDebugInfo(info); WriteDefMcPara(); WriteDefWkPara(); break; } case UCMD_SET_MVANGDEF_PARA: // 设置动框角度默认参数 { printf("receive set move angle def para cmd\r\n"); char * info = "set mv angle def para"; SendDebugInfo(info); WriteDefMvAngPara(); break; } case UCMD_SET_HEADDEF_PARA: // 设置机头板默认参数 { printf("set head def para, nodetype=%d, id=%d\r\n", operpkt.setDefParas.nodetype, operpkt.setDefParas.id); char buf[1024]; sprintf(buf, "set head def para, nodetype=%d", operpkt.setDefParas.nodetype); SendDebugInfo(&buf[0]); SetBoardNvPara(BN_PROTOCOL_HEAD, operpkt.setDefParas.nodetype, operpkt.setDefParas.id, 255, 0, 0); break; } case UCMD_SET_COLORDEF_PARA: // 设置换色板默认参数 { printf("set color def para, boardnum=%d\r\n", operpkt.setDefParas.id); char buf[1024]; sprintf(buf, "set color def para, id=%d", operpkt.setDefParas.id); SendDebugInfo(&buf[0]); SetBoardNvPara(BN_PROTOCOL_COLOR, 0, operpkt.setDefParas.id, 255, 0, 0); break; } case UCMD_TRA_BOARD: // 机头板遍历 { printf("traverse cmd, protocolType=%d, nodeId=%d, nodeType=%d, traNum=%d\r\n", operpkt.traverse.protocolType, operpkt.traverse.nodeId, operpkt.traverse.nodeType, operpkt.traverse.traNum); TraverseTask(operpkt.traverse.protocolType, operpkt.traverse.nodeId, operpkt.traverse.nodeType, operpkt.traverse.traNum); break; } case UCMD_GET_BOARD_VER: // 读取外围板程序版本 { RequestBoardVer(); DelayRef(100); #if (MAX_SUPPORT_COLOR > 0) ColorControl * color = NULL; for (int i = 1; i < MAX_SUPPORT_COLOR+1; i++) { color = GetColorFromList(i+1); if (color->verFlag == 1) { color->verFlag = 0; rslt = CreateBoardVer(&operpkt, BN_PROTOCOL_COLOR, color->nodeId, 0, &color->regVal); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask DCMD_SEND_BOARDVER \r\n"); } } else { printf("error at call CreateBoardVer in OperatorTask DCMD_SEND_BOARDVER \r\n"); } } } #endif #if (MAX_SUPPORT_HEAD > 0) HeadControl * head = NULL; for (int i = 1; i < MAX_SUPPORT_HEAD+1; i++) { head = GetHeadFromList(i+1); if (head->verFlag == 1) { head->verFlag = 0; rslt = CreateBoardVer(&operpkt, BN_PROTOCOL_HEAD, head->nodeId, head->nodeTye, &head->regVal); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask DCMD_SEND_BOARDVER \r\n"); } } else { printf("error at call CreateBoardVer in OperatorTask DCMD_SEND_BOARDVER \r\n"); } } } #endif #if (MAX_SUPPORT_EXTIO > 0) ExtIOControl * extio = NULL; for (int i = 1; i < MAX_SUPPORT_EXTIO+1; i++) { extio = GetExtIOFromList(i+1); if (extio->verFlag == 1) { extio->verFlag = 0; rslt = CreateBoardVer(&operpkt, BN_PROTOCOL_EXTIO, extio->nodeId, 0, &extio->regVal); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask DCMD_SEND_BOARDVER \r\n"); } } else { printf("error at call CreateBoardVer in OperatorTask DCMD_SEND_BOARDVER \r\n"); } } } #endif break; } #if (RD_HEAD_PARA_NUM > 0) case UCMD_GET_HEAD_PARA: // 读取机头板参数 { /* * 20220601 此种实现方式的前提是总线检测成功 * 上位机不需要知道具体的节点ID,只负责告知下位机节点类型(如平绣,毛巾,缠绕)和对应的机头号即可 */ int i, hdnm; hdnm = operpkt.boardPara.nodeId; // 对应机头号 for (i = 1; i < MAX_SUPPORT_HEAD+1; i++) { HeadControl * phd = GetHeadFromList(i+1); if (phd->nodeTye == operpkt.boardPara.nodeType) {// 若广播,则读取相应节点类型的第一个节点 if (hdnm <= 1) { break; } else { hdnm--; } } } if (i <= MAX_SUPPORT_HEAD) // 找到对应的节点 { printf("read head=%d para\r\n", i); RequestAHeadNvPara(i); // 读取某个节点的参数 DelayRef(100); HeadControl * head = GetHeadFromList(i+1); if (head->nvParaFlag == 1) { head->nvParaFlag = 0; int id = 0;; if (head->nodeTye == FLAT_EMB_HEAD) { id = 1; } else if (head->nodeTye == CHENILLE_HEAD) { id = 2; } else if (head->nodeTye == COIL_HEAD) { id = 3; } rslt = CreateHeadBoardPara(&operpkt, i, operpkt.boardPara.nodeType, GetBoardNvPara(id)); if (rslt == 0) { printf("send head para\r\n"); rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask DCMD_SEND_HEADPARA \r\n"); } } else { printf("error at call CreateHeadBoardPara in OperatorTask DCMD_SEND_HEADPARA \r\n"); } } else { printf("receive err\r\n"); ReportError(ERR_READ_HEAD_PARA); } } else // 总线检测错误 { printf("not find node\r\n"); ReportError(ERR_READ_HEAD_PARA); } break; } case UCMD_GET_COLOR_PARA: // 读取换色控制板参数 { if (operpkt.boardPara.nodeId != 0) // 不支持广播读取 { ColorControl * color = GetColorFromList(operpkt.boardPara.nodeId+1); if (color != NULL) { color->refNvPara = 1; DelayRef(100); if (color->nvParaFlag == 1) { color->nvParaFlag = 0; int id = 0;; if (operpkt.boardPara.nodeId == 2) {// 毛巾换色板 id = 4; } rslt = CreateColorBoardPara(&operpkt, operpkt.boardPara.nodeId, GetBoardNvPara(id)); if (rslt == 0) { printf("send color para, nodeid=%d\r\n", operpkt.boardPara.nodeId); rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_COLOR_PARA \r\n"); } } else { printf("error at call CreateColorBoardPara in OperatorTask UCMD_GET_COLOR_PARA \r\n"); } } else { printf("receive err\r\n"); ReportError(ERR_READ_COLOR_PARA); } } } else { printf("not support broadcast read color para\r\n"); } break; } #endif case UCMD_GET_HEAD_NVPARAS: // 选择性读取机头参数 {// 可读取任意机头 任意参数块参数,并打包发送给上位机 printf("get head type=%d id=%d nvparaid=%d\r\n", operpkt.boardPara.nodeType, operpkt.boardPara.nodeId, operpkt.boardPara.paraid); u32 buf[32] = {0}; int rslt = RequestHeadNvParas(operpkt.boardPara.nodeType, operpkt.boardPara.nodeId, operpkt.boardPara.paraid, &buf[0]); if (rslt == 0) { rslt = CreateHeadNvParas(&operpkt, operpkt.boardPara.nodeType, operpkt.boardPara.nodeId, operpkt.boardPara.paraid, (u8*)(&buf[0])); if (rslt == 0) { printf("send head nv paras\r\n"); rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_HEAD_NVPARAS \r\n"); } } else { printf("error at call CreateHeadNvParas in OperatorTask UCMD_GET_HEAD_NVPARAS \r\n"); } } else { printf("read head nv paras error, rslt=%d\r\n", rslt); ReportError(ERR_READ_HEAD_PARA); } break; } case UCMD_SET_HEAD_PARA: // 设置机头板参数 { printf("set head para, nodetype=%d, nodeId=%d\r\n", operpkt.boardPara.nodeType, operpkt.boardPara.nodeId); BoardFilePacketCtrl boardpkt; ParaDataFromOperToCan(BN_PROTOCOL_HEAD, &operpkt, &boardpkt); break; } case UCMD_SET_COLOR_PARA: // 设置换色控制板参数 { printf("set color para, boardnum=%d\r\n", operpkt.boardPara.nodeId); BoardFilePacketCtrl boardpkt; ParaDataFromOperToCan(BN_PROTOCOL_COLOR, &operpkt, &boardpkt); break; } case UCMD_SET_HEAD_NVPARA: // 选择性设置机头参数 { printf("set head type=%d id=%d paraid=%d nvpara\r\n", operpkt.boardPara.nodeType, operpkt.boardPara.nodeId, operpkt.boardPara.paraid); // SetHeadNvPara(operpkt.boardPara.nodeType, operpkt.boardPara.nodeId, operpkt.boardPara.paraid, (u32*)(&operpkt.boardPara.exData)); break; } default: { break; } } } // SavePreProc(); } void CleanBuffAfterAction(void) { int ret; int temp, timer; timer = GetMsSoftTimer(); do { ret = ReadBuffEmpty(&g_operDataExFuns); // 清空接收缓冲区 if (ret == 0) { break; } else { printf("ReadBuffEmpty rslt=%d\r\n", ret); } DelayRef(1); temp = GetMsSoftTimer(); if (temp - timer > 10) { printf("CleanBuffAfterAction timout\r\n"); break; } }while(1); } // 发送运行状态 void SendMcStatus(int force) { int rslt; OperPacket operpkt; DataPacket* pDatpkt = (DataPacket*)(&operpkt); if (IsStatusChanged() != 0 || force != 0) { rslt = CreateMcStatus(&operpkt, 0); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); // printf("SendMcStatus\r\n"); if (rslt != 0) { // printf("error at call SendAPacket in SendMcStatus\r\n"); } } else { printf("error at call CreateMcStatus in SendMcStatus\r\n"); } SetLightStaByCode(g_workCtrl.cursta.errorCode); } } // -------------------------------------------- int IsSocketConnected(void) { #if (OPERATOR_PORT == COMM_ETHERNET) if (g_pOperatorSocket->status == STA_CONNECT) { return TRUE; } #endif return FALSE; } int IsNewOperCmd(void) { int rslt; OperPacket operpkt; DataPacket* pDatpkt = (DataPacket*)(&operpkt); rslt = GetANormalPacket(&g_operDataExFuns, pDatpkt); if (rslt > 0) // 收到数据包 { return TRUE; } #if (OPERATOR_PORT == COMM_ETHERNET) if (IsSocketConnected() != TRUE) { // return TRUE; } #endif return FALSE; } void OperatorTaskWhenRun(int revfile) { int rslt; OperPacket operpkt; DataPacket* pDatpkt = (DataPacket*)(&operpkt); // 读取操作箱命令 rslt = GetANormalPacket(&g_operDataExFuns, pDatpkt); // 分析数据包,并执行 if (rslt > 0) // 收到数据包 { switch(operpkt.packet.fldp.cmd) // 先按固定长度解析 { case UCMD_GET_MC_STATUS: // 读取机器状态 { printf("get mc status cmd when run\r\n"); rslt = CreateMcStatus(&operpkt, operpkt.getMcStatus.toggle); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 0); if (rslt != 0) { printf("error at call SendAPacket in OperatorTaskWhenRun UCMD_GET_MC_STATUS \r\n"); } } else { printf("error at call CreateMcStatus in OperatorTaskWhenRun UCMD_GET_MC_STATUS \r\n"); } break; } case UCMD_GET_MC_PARAS: // 读取机器参数 { printf("get mc paras cmd\r\n"); rslt = CreateMcParas(&operpkt, operpkt.getMcParas.paraType, operpkt.getMcParas.paraId); if (rslt == 0) { // int temp = GetMsSoftTimer(); rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 10000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_MC_PARAS \r\n"); } } else { printf("error at call CreateMcParas in OperatorTask UCMD_GET_MC_PARAS \r\n"); } break; } case UCMD_SET_MC_STATUS: // 设置机器状态 { printf("SetMcStatus when run\r\n"); SetMcStatus(operpkt.setMcStatus.staCode, operpkt.setMcStatus.para); break; } case UCMD_MC_WORK: // 机器工作命令 { printf("get control work cmd when run\r\n"); ControlWorkWhenWorking(&operpkt); break; } case UCMD_GET_FILE_INFO: // 读取文件信息 { if (revfile == 1) { rslt = CreateFileInfo(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTaskWhenRun UCMD_GET_FILE_INFO \r\n"); } } else { printf("error at call CreateFileInfo in OperatorTaskWhenRun UCMD_GET_FILE_INFO \r\n"); } } break; } case UCMD_GET_TRANS_RESULT: // 读取传输结果 { if (revfile == 1) { printf("3. get trans result cmd\r\n"); rslt = CreateTransResult(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTaskWhenRun UCMD_GET_TRANS_RESULT \r\n"); } } else { printf("error at call CreateTransResult in OperatorTaskWhenRun UCMD_GET_TRANS_RESULT \r\n"); } } break; } case UCMD_SET_FILE_PARAS: // 设置文件参数 { if (revfile == 1) { ReceiveFileParas(&operpkt); } break; } case UCMD_START_TRANS: // 启动文件传输 { if (revfile == 1) { StartReceiveFile(&operpkt); SaveFileIdxFromDatafile(); if (IsNewDatFile(0) == FALSE) { SetFileOkFlag(0); } } break; } case UCMD_TRANS_FILE_DATA: // 文件传输命令 { if (revfile == 1) { ReceiveFileData(&operpkt); if (IsNewDatFile(0) == TRUE) { SetFileOkFlag(1); // 文件接收标志 } } break; } case UCMD_SET_FILE_LIST: // 设置文件列表 { ResetFileList(&operpkt); SaveFileIdxFromDatafile(); break; } case UCMD_SET_EXEC_PROGRESS: // 设置执行进度 { if (revfile == 1) { SetExecProgress(&operpkt); } break; } default: printf("get cmd = 0x%x when run\r\n", operpkt.packet.fldp.cmd); break; } } if (revfile == 1) { // SavePreProc(); } } int ReceiveMcParas(OperPacket * pPkt) { int rslt; rslt = 0; if (pPkt == NULL) { return -1; } //----------- //printf("ReceiveParas type = %d, exlen=%d\r\n", pPkt->setParas.paraType, pPkt->setParas.exLen); if (pPkt->setParas.paraType == SEW_MCPARA_MACH) { if (pPkt->setParas.exLen == sizeof(g_mcPara)) { memcpy((u8*)(&g_mcPara), pPkt->setParas.exData, sizeof(g_mcPara)); CheckMcParaRange(); SaveMcPara(); RefreshParas(PARA_MC_VALID); SetNewParasFlag(PARA_MC_VALID); rslt = 0; } else if (pPkt->setParas.exLen == sizeof(u32)) { SetAMcPara(pPkt->setParas.paraId, *((u32*)(pPkt->setParas.exData))); SaveMcPara(); RefreshParas(PARA_MC_VALID); SetNewParasFlag(PARA_MC_VALID); } else { rslt = -2; } } else if (pPkt->setParas.paraType == SEW_MCPARA_WORK) { if (pPkt->setParas.exLen == sizeof(g_wkPara)) { memcpy((u8*)(&g_wkPara), pPkt->setParas.exData, sizeof(g_wkPara)); CheckWkParaRange(); SaveWkPara(); RefreshParas(PARA_WK_VALID); SetNewParasFlag(PARA_WK_VALID); rslt = 0; } else if (pPkt->setParas.exLen == sizeof(u32)) { SetAWkPara(pPkt->setParas.paraId, *((u32*)(pPkt->setParas.exData))); SaveWkPara(); RefreshParas(PARA_WK_VALID); SetNewParasFlag(PARA_WK_VALID); } else { rslt = -2; } } else if (pPkt->setParas.paraType == EMB_MVSTANG_PARA) // 起始动框角度 { if (pPkt->setParas.exLen == sizeof(g_angPara)) { memcpy((u8*)(&g_angPara), pPkt->setParas.exData, sizeof(g_angPara)); SaveAngPara(); rslt = 0; printf("receive angle para\r\n"); } else if (pPkt->setParas.exLen == sizeof(u16)) { SetAAnglePara(pPkt->setParas.paraId, *((u16*)pPkt->setParas.exData)); SaveAngPara(); } else { rslt = -2; } } else if (pPkt->setParas.paraType == EMB_PATCH_DATA_IDX) // 贴布绣数据,按针(绣花机) { if (pPkt->setParas.exLen == 1024) { memcpy((u8*)(&g_patchData), pPkt->setParas.exData, sizeof(g_patchData)); printf("receive patch data (idx) para\r\n"); rslt = 0; } else { rslt = -2; } } else { printf("other para\r\n"); } return rslt; } int CreateMcParas(OperPacket * pPkt, int type, int id) { int rslt; if (pPkt == NULL) { return -1; } memset(pPkt, 0, LEN_NORMAL_PACKET); pPkt->sendMcParas.cmdCode = DCMD_SEND_MC_PARAS; pPkt->sendMcParas.paraType = type; pPkt->sendMcParas.paraId = id; if (id == 0) { if (type == SEW_MCPARA_MACH) { rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&g_mcPara), sizeof(g_mcPara)); } else if (type == SEW_MCPARA_WORK) { rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&g_wkPara), sizeof(g_wkPara)); } else if (type == EMB_MVSTANG_PARA) // 起始动框角度参数 { rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&g_angPara), sizeof(g_angPara)); } else { rslt = -2; } } else { if (type == SEW_MCPARA_MACH) { u32 val = GetAMcPara(id); rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&val), sizeof(u32)); } else if (type == SEW_MCPARA_WORK) { u32 val = GetAWkPara(id); rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&val), sizeof(u32)); } } if (rslt != 0) { printf("error at call PacketAVLDP in CreateMcParas\r\n"); } return rslt; } #else __WEAK int CreateMemDatList(OperPacket * pPkt, u32 begAddr, u16 rdSize){return 0;}; __WEAK int SetMemDats(u32 setAddr, u8 * buff, u16 len){return 0;}; int CreateMcInfoWhenBoot(OperPacket * pPkt, int toggle) { int rslt; MCInfo info; CpuId id; u32 cpuid; 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; GetVersionStr(info.softwareVerStr); // 软件版本信息 GetBuildStr(info.buildInfoStr); // 编译时间信息 // 板卡ID信息 cpuid = 0; GetCpuID(&id); cpuid += id.dword.dword1; cpuid += id.dword.dword2; cpuid += id.dword.dword3; cpuid += id.dword.dword4; sprintf(info.boardId, "CPUID: %u", cpuid); printf("create system info as follow:\r\n"); printf("%s\r\n", info.softwareVerStr); // 软件版本 printf("%s\r\n", info.buildInfoStr); // 编译日期信息 printf("%s\r\n", info.boardId); // 板卡ID rslt = PacketAVLDP(&(pPkt->packet), (u8*)(&(info)), sizeof(MCInfo)); if (rslt != 0) { printf("error at call PacketAVLDP in CreateMcInfoWhenBoot\r\n"); } return rslt; } void OperatorTaskWhenBoot(void) { int rslt; OperPacket operpkt; DataPacket* pDatpkt = (DataPacket*)(&operpkt); // 读取操作箱命令 rslt = GetANormalPacket(&g_operDataExFuns, pDatpkt); // 分析数据包,并执行 if (rslt > 0) // 收到数据包 { switch(operpkt.packet.fldp.cmd) // 先按固定长度解析 { case UCMD_GET_MC_INFO: // 读取机器信息 { printf("get mc info cmd, toggle=%d\r\n", operpkt.getMcInfo.toggle); rslt = CreateMcInfoWhenBoot(&operpkt, operpkt.getMcInfo.toggle); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTaskWhenBoot UCMD_GET_MC_INFO \r\n"); } } else { printf("error at call CreateMcInfo in OperatorTaskWhenBoot UCMD_GET_MC_INFO \r\n"); } break; } case UCMD_GET_MEM_DATA: // 读取内存数据 { rslt = CreateMemDatList(&operpkt, operpkt.getMemData.begAddr, operpkt.getMemData.rdSize); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call OperatorTaskWhenBoot in OperatorTask UCMD_GET_MEM_DATA \r\n"); } } else { printf("error at call OperatorTaskWhenBoot in OperatorTask UCMD_GET_MEM_DATA \r\n"); } break; } case UCMD_SET_MEM_DATA: // 设置内存数据 { SetMemDats(operpkt.setMemData.begAddr, operpkt.setMemData.exData, operpkt.setMemData.exLen); break; } case UCMD_GET_FILE_INFO: // 读取文件信息 { rslt = CreateFileInfo(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_FILE_INFO \r\n"); } } else { printf("error at call CreateFileInfo in OperatorTask UCMD_GET_FILE_INFO \r\n"); } break; } case UCMD_GET_TRANS_RESULT: // 读取传输结果 { printf("2. get trans result cmd\r\n"); rslt = CreateTransResult(&operpkt); if (rslt == 0) { rslt = SendAPacket(&g_operDataExFuns, pDatpkt, 1000); if (rslt != 0) { printf("error at call SendAPacket in OperatorTask UCMD_GET_TRANS_RESULT \r\n"); } } else { printf("error at call CreateTransResult in OperatorTask UCMD_GET_TRANS_RESULT \r\n"); } break; } case UCMD_START_TRANS: // 启动文件传输 StartReceiveFile(&operpkt); // SaveFileIdxFromDatafile(); break; case UCMD_TRANS_FILE_DATA: // 文件传输命令 ReceiveFileData(&operpkt); break; case UCMD_MC_UPDATE: // 下位机升级 printf("get update cmd\r\n"); StartAppUpdate(0); // 升级并重启 break; default: break; } } } #endif //------------------------------------------------------ int SendDebugInfo(char * pStr) { int rslt; OperPacket pkt; memset(&pkt, 0, LEN_NORMAL_PACKET); pkt.sendDebugInfo.cmdCode = DCMD_SEND_DEBUG_INFO; rslt = PacketAVLDP(&(pkt.packet), (u8*)(pStr), strlen(pStr)); if (rslt != 0) { printf("error at call PacketAVLDP in SendDebugInfo\r\n"); } else { rslt = SendAPacket(&g_operDataExFuns, (DataPacket *)(&pkt), 0); } return rslt; } int SendFileParas(int beginX, int beginY) { int rslt; OperPacket pkt; DataFilePara newPara; memset(&pkt, 0, LEN_NORMAL_PACKET); newPara.anchorX = beginX; newPara.anchorY = beginY; newPara.beginX = beginX; newPara.beginY = beginY; pkt.setFileParas.cmdCode = UCMD_SET_FILE_PARAS; rslt = PacketAVLDP(&(pkt.packet), (u8*)(&newPara), sizeof(DataFilePara)); if (rslt != 0) { printf("error at call PacketAVLDP in SendFileParas\r\n"); } else { rslt = SendAPacket(&g_operDataExFuns, (DataPacket *)(&pkt), 0); } return rslt; }