EmbHMI/machine/machine.cpp
2024-02-06 14:27:07 +08:00

2704 lines
76 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.

#include "machine.h"
#include <QTime>
#include <QApplication>
/*
Machine的dll如果是Release版本的在应用程序中只能在Release下调用
否则调用不成功(连接不上),Machine的dll如果是Debug版本,
应用程序中在Debug下调用成功
*/
//------------------------------------------
QByteArray g_receiveBuff;
DataExFuns g_exfuns = {NULL,NULL,NULL,NULL,NULL};
// 发送数据
int operatorSendData(u8 * pDatBuf, int len)
{
if (pDatBuf != NULL && len != 0)
{
// 不准备通过该函数发送数据
}
return 0;
}
// 得到发送缓冲区空闲长度
int operatorGetSdFreeLen(void)
{
return 0; // 认没有空间
}
// 接收数据
int operatorGetData(u8 * pDat, int expectLen)
{
int len = g_receiveBuff.size();
if (len > expectLen)
{
len = expectLen;
}
//if (len != 0 && pDat != NULL)
if (len == expectLen && pDat != NULL) //使len等于expectLen(串口下接收数据暴露的问题)
{
memcpy(pDat, g_receiveBuff.data(), len);
g_receiveBuff.remove(0, len);
}
else
{
len = 0;
}
return len;
}
// 已接收数据长度
int operatorGetRsLen(void)
{
return g_receiveBuff.size();
}
void delayMs(u32 ms)
{
QDateTime oldTime, curTime;
oldTime = QDateTime::currentDateTime();
while(1)
{
curTime = QDateTime::currentDateTime();
if(oldTime.msecsTo(curTime) > ms)
{
break;
}
}
}
void initDataExFuns(void)
{
g_exfuns.sendCommData = operatorSendData;
g_exfuns.getCommData = operatorGetData;
g_exfuns.getRsvLen = operatorGetRsLen;
g_exfuns.getTrsFreeLen = operatorGetSdFreeLen;
g_exfuns.delay = delayMs;
}
//------------------------------------------
Machine::Machine(QObject *parent) :
QObject(parent),
m_pTcpThread(NULL),
m_pTcpClient(NULL),
m_pComThread(NULL),
m_pComPort(NULL),
m_startComm(0)
{
memset(&m_mcStatus, 0, sizeof(MCStatus)); // 机器状态
memset(&m_mcPara, 0, sizeof(ParaStruct)); // 机器参数信息
memset(&m_wkPara, 0, sizeof(ParaStruct)); // 工作参数信息
memset(&m_mcPrePara, 0, sizeof(ParaStruct)); // 机器预留参数信息
memset(&m_wkPrePara, 0, sizeof(ParaStruct)); // 工作预留参数信息
memset(&m_frameAnglePara, 0, sizeof(EmbMvAng)); //动框角度参数
memset(&m_mcInfo,0,sizeof(MCInfo)); // 机器信息
memset(&m_ds16Head,0,sizeof(DataDs16FileHead)); // 文件头
memset(&m_lotData,0,sizeof(McLotData)); // 物联数据
memset(&m_exboardInfo,0,sizeof(ExBoardInfo)); // 外围板信息
memset(&m_sensorsStaDat, 0, sizeof(SensorsBitmap)); // 传感器信号状态位图
memset(&m_sensorEnBmp, 0, sizeof(SensorsBitmap)); // 传感器信号有效位图
memset(&m_transCtrl, 0, sizeof(FileTransCtrl)); // 文件传输信息
m_pSendTimer = new QTimer(this);
m_pSendTimer->setInterval(100); // 设置定时间隔100毫秒
connect(m_pSendTimer, SIGNAL(timeout()), this, SLOT(onSendTimer()));
m_transCtrl.pFileHead = new DataDs16FileHead;
m_transCtrl.pAppHead = new AppFileHead;
m_transCtrl.pBoardHead = new BoardFileHead;
m_transCtrl.pDatBuff = new u8[MAX_FILE_SIZE];
m_startComm = 0;
m_connected = 0;
m_statusEn = 0;
m_mcParaEn = 0;
m_wkParaEn = 0;
m_mcPreParaEn = 0;
m_wkPreParaEn = 0;
m_frameAngleParaEn = 0;
m_sensorStaEn = 0;
m_sensorBmpEn = 0;
m_statusToggle = 0;
m_fileTransEn = 0;
m_transBreak = 0;
m_totalSendNum = 0;
m_totalPacketNum = 0;
m_connectMode = 0;
initDataExFuns();
}
Machine::~Machine()
{
if (m_startComm != 0)
{
if(m_connectMode == USE_TCP_COMM)
{
m_pTcpThread->quit();
m_pTcpThread->wait();
}
else if(m_connectMode == USE_SERIAL_COMM)
{
m_pComThread->quit();
m_pComThread->wait();
}
}
if (m_transCtrl.pFileHead != NULL)
{
delete []m_transCtrl.pFileHead;
m_transCtrl.pFileHead = NULL;
}
if (m_transCtrl.pDatBuff != NULL)
{
delete []m_transCtrl.pDatBuff;
m_transCtrl.pDatBuff = NULL;
}
if(m_connectMode == USE_TCP_COMM)
{
if(m_pTcpThread != NULL)
{
delete m_pTcpThread;
}
}
else if(m_connectMode == USE_SERIAL_COMM)
{
if(m_pComThread != NULL)
{
delete m_pComThread;
}
}
}
//初始化通讯连接方式
void Machine::initConnectMode(s16 val)
{
m_connectMode = val;
if(m_connectMode == USE_TCP_COMM)//网口
{
m_pTcpThread = new QThread();
m_pTcpClient = new TcpClient();
}
else if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComThread = new QThread();
m_pComPort = new ComPort();
connect(m_pComPort, SIGNAL(siSerialPortOpenState(int)), this, SLOT(slIfOpenSerialPort(int)) );
}
}
void Machine::setConfigFileName(QString configfilename)
{
m_configFileName = configfilename;
if(m_connectMode == USE_TCP_COMM)//网口
{
m_pTcpClient->setConfigFileName(m_configFileName);
}
}
//设置串口名称
void Machine::setComportName(QString portName)
{
if(m_pComPort == NULL)
{
return;
}
if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComPort->setComPortName(portName);
}
}
QString Machine::getConfigFileName()
{
return m_configFileName;
}
int Machine::startCommunication()
{
if (m_startComm == 0)
{
// qDebug() << "Machine " << QThread::currentThread();
if(m_connectMode == USE_TCP_COMM)//网口
{
if (m_configFileName.isEmpty())
{
qDebug() << "mast call SetConfigFileName first ";
}
m_pTcpClient->moveToThread(m_pTcpThread); // 移动对象到线程中
// connect(qApp, SIGNAL(finished()), m_pTcpThread, SLOT(finished()));
connect(m_pTcpThread, SIGNAL(started()), m_pTcpClient, SLOT(connectToServer()) );
connect(m_pTcpThread, SIGNAL(finished()), m_pTcpClient, SLOT(deleteLater()) ); // 退出删除对象
connect(m_pTcpClient, SIGNAL(siConnectSta(int)),
this, SLOT(slotConnectSta(int)), Qt::AutoConnection); // 连接状态改变
connect(m_pTcpClient, SIGNAL(siConnectErr(QString)),
this, SLOT(slotConnectErr(QString)), Qt::AutoConnection); // 接收到通讯错误
connect(m_pTcpClient, SIGNAL(siReceiveData(QByteArray)),
this, SLOT(slotReceiveData(QByteArray)), Qt::AutoConnection); // 接收到数据
connect(this, SIGNAL(siSendData(QByteArray)),
m_pTcpClient, SLOT(slotSendData(QByteArray)), Qt::AutoConnection); // 发送数据的槽
m_pTcpThread->start(); // 启动线程
}
if(m_connectMode == USE_SERIAL_COMM)//串口
{
m_pComPort->moveToThread(m_pComThread);
connect(m_pComThread, SIGNAL(started()), m_pComPort, SLOT(initComm()) );
connect(m_pComThread, SIGNAL(finished()), m_pComPort, SLOT(deleteLater()) ); // 退出删除对象
connect(m_pComPort, SIGNAL(siReceiveData(QByteArray)),
this, SLOT(slotReceiveData(QByteArray)), Qt::QueuedConnection); // 接收到数据
connect(this, SIGNAL(siSendData(QByteArray)),
m_pComPort, SLOT(slotSendData(QByteArray)), Qt::QueuedConnection); // 发送数据的槽
m_pComThread->start(); // 启动线程
}
m_startComm = 1;
}
return m_startComm;
}
// 连接状态改变的槽函数
void Machine::slotConnectSta(int sta)
{
// qDebug() << "SlotConnectSta" << sta;
m_connected = sta;
}
// 接收到通讯错误槽函数
void Machine::slotConnectErr(QString errinfo)
{
if(errinfo.length() <= 0){}
//qDebug() << "SlotConnectErr" << errinfo;
}
void Machine::setMcStatusAsMc(u8 * buff, u16 len, int toggle)
{
//memcpy(&m_mcStatus, buff, sizeof(MCStatus));
memcpy(&m_mcStatus, buff, len);
m_statusEn = 1;
emit(siStatusChange(toggle));
}
// 接收到数据的槽函数
void Machine::slotReceiveData(QByteArray dat)
{
int rslt;
DataPacket packet;
OperPacket * operpkt = (OperPacket *)(&packet);
// qDebug() << "SlotReceiveData size=" << dat.size();
g_receiveBuff.append(dat);
//qDebug()<<"append dat size"<<dat.size();
do
{
rslt = getANormalPacket(&g_exfuns, &packet);
// 分析数据包,并执行
if (rslt > 0) // 收到数据包
{
//qDebug()<<"getANormalPacket rslt="<<rslt<<operpkt->packet.fldp.cmd;
switch(operpkt->packet.fldp.cmd) // 先按固定长度解析
{
case DCMD_REQUEST_DAT: // 请求文件数据
{
if (m_transCtrl.transActive == TRANS_ACTIVE)
{
if (1 &&
m_transCtrl.transflag == TRANS_REQUEST && // 请求传输数据模式
m_transCtrl.fileType == operpkt->dRequestDatBlock.fileType &&
m_transCtrl.fileIdx == operpkt->dRequestDatBlock.fileIdx &&
m_transCtrl.fileId == operpkt->dRequestDatBlock.fileId &&
1 )
{
qDebug("in request mode, send block idx=%d", operpkt->dRequestDatBlock.datBlockIdx);
transFileData(m_transCtrl, operpkt->dRequestDatBlock.datBlockIdx);
}
}
break;
}
case DCMD_SEND_MC_INFO: // 发送机器信息
{
memcpy(&m_mcInfo, operpkt->dSendMcInfo.exData, sizeof(MCInfo));
emit(siMcInfoChange( ));
break;
}
case DCMD_SEND_DEBUG_INFO: // 发送调试信息
{
memcpy(&m_debugInfo, operpkt->sendDebugInfo.exData, sizeof(DebugInfo));
emit(siDebugInfo( ));
break;
}
case DCMD_SEND_BOARDVER: // 发送外围板程序版本
{
if (operpkt->sendBoardVer.protocolType == BN_PROTOCOL_HEAD) // 机头板
{
memcpy(&m_exboardInfo.headInfo[operpkt->sendBoardVer.nodeId - 1].softwareVerStr,
operpkt->sendBoardVer.ver, BOARD_VER_LEN*sizeof(char)); //复制版本
memcpy(&m_exboardInfo.headInfo[operpkt->sendBoardVer.nodeId - 1].nodeType,
&operpkt->sendBoardVer.nodeType, sizeof(u8)); //复制节点类型 -rq
}
else if (operpkt->sendBoardVer.protocolType == BN_PROTOCOL_HCPS) // 勾剪扣换控制板
{
memcpy(&m_exboardInfo.hcpsInfo[operpkt->sendBoardVer.nodeId - 1].softwareVerStr,
operpkt->sendBoardVer.ver, BOARD_VER_LEN*sizeof(char));
}
else if (operpkt->sendBoardVer.protocolType == BN_PROTOCOL_DCUT) //D86
{
memcpy(&m_exboardInfo.d86Info[operpkt->sendBoardVer.nodeId - 1].softwareVerStr,
operpkt->sendBoardVer.ver, BOARD_VER_LEN*sizeof(char));
}
emit(siEXBInfoChange());
break;
}
case DCMD_SEND_MC_STATUS: // 发送机器状态
{
setMcStatusAsMc(operpkt->dSendMcStatus.exData, operpkt->dSendMcStatus.exLen, operpkt->dSendMcStatus.toggle);
break;
}
case DCMD_SEND_MC_PARAS: // 发送机器参数
{
int type;
type = operpkt->dSendMcParas.paraType;
if (operpkt->dSendMcParas.exLen == sizeof(ParaStruct) ||
operpkt->dSendMcParas.exLen == sizeof(EmbMvAng))
{
if (type == SEW_MCPARA_MACH || type == SEW_MCPARA_DEF_MC)
{
memcpy(&m_mcPara, operpkt->dSendMcParas.exData, sizeof(ParaStruct));
m_mcParaEn = 1;
}
else if (type == SEW_MCPARA_WORK || type == SEW_MCPARA_DEF_WK)
{
memcpy(&m_wkPara, operpkt->dSendMcParas.exData, sizeof(ParaStruct));
m_wkParaEn = 1;
}
else if (type == SEW_REVMCPARA_MACH || type == SEW_MCPARA_DEF_MC)
{
memcpy(&m_mcPrePara, operpkt->dSendMcParas.exData, sizeof(ParaStruct));
m_mcPreParaEn = 1;
}
else if (type == SEW_REVMCPARA_WORK || type == SEW_MCPARA_DEF_WK)
{
memcpy(&m_wkPrePara, operpkt->dSendMcParas.exData, sizeof(ParaStruct));
m_wkPreParaEn = 1;
}
else if(type == EMB_MVSTANG_PARA)
{
memcpy(&m_frameAnglePara, operpkt->dSendMcParas.exData, sizeof(EmbMvAng));
m_frameAngleParaEn = 1;
}
else
{
break;
}
//因为之前请求了机器参数和工作参数,所以当两个参数都返回时,再触发信号和槽
// if( m_mcParaEn==1 && m_wkParaEn==1)
{
printf("emit SiParaChange\r\n");
emit(siParaChange(type, 0));
}
}
else if (operpkt->dSendMcParas.exLen == sizeof(u32))
{
int id, idx;
id = operpkt->dSendMcParas.paraId;
idx = id - 1;
if (idx > 0 && idx < PARA_NUM)
{
idx *= sizeof(u32);
if (type == SEW_MCPARA_MACH)
{
memcpy((u8*)(&m_mcPara)+idx, operpkt->dSendMcParas.exData, sizeof(u32));
m_mcParaEn = 1;
}
else if (type == SEW_MCPARA_WORK)
{
memcpy((u8*)(&m_wkPara)+idx, operpkt->dSendMcParas.exData, sizeof(u32));
m_wkParaEn = 1;
}
else if (type == SEW_REVMCPARA_MACH)
{
memcpy((u8*)(&m_mcPrePara)+idx, operpkt->dSendMcParas.exData, sizeof(u32));
m_mcPreParaEn = 1;
}
else if (type == SEW_REVMCPARA_WORK)
{
memcpy((u8*)(&m_wkPrePara)+idx, operpkt->dSendMcParas.exData, sizeof(u32));
m_wkPreParaEn = 1;
}
else
{
break;
}
emit(siParaChange(type, id));
}
}
break;
}
case DCMD_SEND_SENSORS: // 发送传感信号
{
int len;
len = sizeof(SensorsBitmap);
if (len > operpkt->dSendSensors.exLen)
{
len = operpkt->dSendSensors.exLen;
}
memset(m_sensorsStaDat.bitmap, 0, sizeof(SensorsBitmap));
memcpy(m_sensorsStaDat.bitmap, operpkt->dSendSensors.exData, len);
m_sensorStaEn = 1;
//qDebug("get DCMD_SEND_SENSORS");
emit(siSensorChange(m_sensorsStaDat));
break;
}
case DCMD_SEND_FILE_INFO: // 发送文件信息
{
memcpy(&m_ds16Head, operpkt->dSendFileInfo.exData, sizeof(DataDs16FileHead));
emit(siFileInfoChange());
break;
}
case DCMD_SEND_TRANS_RESULT: // 发送传输结果
{
printf("get DCMD_SEND_TRANS_RESULT\r\n");
m_transCtrl.lenBmp = operpkt->dSendTransResult.exLen;
m_transCtrl.transActive = operpkt->dSendTransResult.active;
m_transCtrl.transflag = operpkt->dSendTransResult.result;
if (m_transCtrl.lenBmp != 0)
{
memcpy(m_transCtrl.rsvBitmap, operpkt->dSendTransResult.exData, m_transCtrl.lenBmp);
}
m_fileTransEn = 1;
emit (siTransResultChange());
break;
}
#if(0)
case DCMD_SEND_TRANS_RESULT2: // 发送传输结果2
{
printf("get DCMD_SEND_TRANS_RESULT2\r\n");
m_transCtrl.lenBmp = operpkt->dSendTransResult.exLen+MAX_EXDP_LEN;
m_transCtrl.transActive = operpkt->dSendTransResult.active;
m_transCtrl.transflag = operpkt->dSendTransResult.result;
if (m_transCtrl.lenBmp != 0)
{
memcpy(&m_transCtrl.rsvBitmap[MAX_EXDP_LEN], operpkt->dSendTransResult.exData, m_transCtrl.lenBmp-MAX_EXDP_LEN);
}
m_fileTransEn = 1;
emit (siTransResultChange());
break;
}
#endif
case DCMD_SEND_SENSOR_BMP: // 传感器信号有效位图
{
int len;
len = sizeof(SensorsBitmap);
if (len > operpkt->dSendSensorBmp.exLen)
{
len = operpkt->dSendSensorBmp.exLen;
}
memset(m_sensorEnBmp.bitmap, 0, sizeof(SensorsBitmap));
memcpy(m_sensorEnBmp.bitmap, operpkt->dSendSensorBmp.exData, len);
m_sensorBmpEn = 1;
qDebug("get DCMD_SEND_SENSOR_BMP");
emit (siSensorEnBitmap(m_sensorEnBmp));
break;
}
case DCMD_SEND_HEADPARA:// 发送机头板参数
{
if (operpkt->dSendMcParas.exLen == PARA_NUM)
{
memcpy(&m_exboardInfo.headInfo[operpkt->boardPara.nodeId - 1].paraBuf, &operpkt->boardPara.exData, operpkt->boardPara.exLen);
//节点类型,用于判断是毛巾还是平绣的机头板数据
memcpy(&m_exboardInfo.headInfo[operpkt->boardPara.nodeId - 1].nodeType, &operpkt->boardPara.nodeType,sizeof(u8));
emit(siEXBParaChange());
break;
}
else if (operpkt->dSendMcParas.exLen == sizeof(u32))
{
int id, idx;
id = operpkt->dSendMcParas.paraId;
idx = id - 1;
if (idx > 0 && idx < PARA_NUM)
{
idx *= sizeof(u32);
memcpy((u8*)&m_exboardInfo.headInfo[operpkt->sendBoardVer.nodeId - 1].paraBuf+idx, operpkt->boardPara.exData, sizeof(u32));
emit(siEXBParaChange());
break;
}
}
break;
}
case DCMD_SEND_HCPSPARA:// 发送勾剪扣换控制板参数(换色板)//目前是毛巾换色板,平绣换色板没用到-rq
{
if (operpkt->dSendMcParas.exLen == PARA_NUM)
{
memcpy(&m_exboardInfo.hcpsInfo[operpkt->boardPara.nodeId-1].paraBuf, operpkt->boardPara.exData, sizeof(u32)*PARA_NUM);
emit(siEXBParaChange());
break;
}
else if (operpkt->dSendMcParas.exLen == sizeof(u32))
{
int id, idx;
id = operpkt->dSendMcParas.paraId;
idx = id - 1;
if (idx > 0 && idx < PARA_NUM)
{
idx *= sizeof(u32);
memcpy((u8*)&m_exboardInfo.hcpsInfo[operpkt->sendBoardVer.nodeId].paraBuf+idx, operpkt->boardPara.exData, sizeof(u32));
emit(siEXBParaChange());
break;
}
}
break;
}
case DCMD_SEND_LOTDATA:// 发送物联网数据
{
memcpy(&m_lotData, operpkt->dSendMcInfo.exData, sizeof(McLotData));
//再定义一个结构体
emit(siReceiveLotData());
break;
}
case UCMD_SET_FILE_PARAS://边框检查超限后重新设置起绣点
{
DataFilePos newPos;
memset(&newPos, 0, sizeof(DataFilePos));
memcpy((u8*)&newPos, operpkt->setFileParas.exData, sizeof(DataFilePos));
//qDebug()<<"siDataFilePos";
emit(siDataFilePos(newPos));
break;
}
default:
break;
}
}
else
{
break;
}
}while(1);
}
//-------------------------------------------------------------------
// 读取机器信息
void Machine::getInfoFromMachine()
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getMcInfo.cmdCode = UCMD_GET_MC_INFO;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
void Machine::getFileInfoFromMachine()
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getMcInfo.cmdCode = UCMD_GET_FILE_INFO;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 读取外围板程序版本
void Machine::getExboardInfoFromMachine()
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.rdBoardVer.cmdCode = UCMD_GET_BOARD_VER;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 读取机器状态
int Machine::getStatusFromMachine()
{
int rslt;
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getMcStatus.cmdCode = UCMD_GET_MC_STATUS;
sendPacket.getMcStatus.toggle = m_statusToggle;
rslt = m_statusToggle;
m_statusToggle++;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
return rslt;
}
// 读取机器物联数据
void Machine::getNetDataFromMachine()
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.boardPara.cmdCode = UCMD_GET_LOT_DATA;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 读取机器参数
void Machine::getParasFromMachine(int type, int id)
{
int mctype = -1;
int wktype = -1;
int frametype = -1;//动框角度
if (type == -1)
{
mctype = SEW_MCPARA_MACH;
wktype = SEW_MCPARA_WORK;
frametype = EMB_MVSTANG_PARA;
m_mcParaEn = 0;
m_wkParaEn = 0;
m_frameAngleParaEn = 0;
}
else
{
if(type == SEW_MCPARA_MACH )
{
mctype = SEW_MCPARA_MACH;
m_mcParaEn = 0;
}
if(type == SEW_MCPARA_WORK )
{
wktype = SEW_MCPARA_WORK;
m_wkParaEn = 0;
}
if(type == EMB_MVSTANG_PARA)
{
frametype = EMB_MVSTANG_PARA;
m_frameAngleParaEn = 0;
}
}
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getMcParas.cmdCode = UCMD_GET_MC_PARAS;
if (mctype == SEW_MCPARA_MACH)
{
sendPacket.getMcParas.paraType = (u16)mctype;
sendPacket.getMcParas.paraId = (u16)id;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
if (wktype == SEW_MCPARA_WORK)
{
sendPacket.getMcParas.paraType = (u16)wktype;
sendPacket.getMcParas.paraId = id;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
if (frametype == EMB_MVSTANG_PARA)
{
sendPacket.getMcParas.paraType = (u16)frametype;
sendPacket.getMcParas.paraId = id;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
}
// 读取毛巾换色板参数
void Machine::getHcpsParasFromMachine(int nodeType)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.boardPara.cmdCode = UCMD_GET_HCPS_PARA;
sendPacket.boardPara.nodeId = nodeType;//毛巾换色板
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 读取外围板参数 (根据节点类型 ,发送读取平绣机头板参数,还是毛巾机头板参数)
void Machine::getHeadParasFromMachine(int id,int nodeType)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.boardPara.cmdCode = UCMD_GET_HEAD_PARA;
sendPacket.boardPara.nodeId = id;
sendPacket.boardPara.nodeType = nodeType;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 读取传感信号
void Machine::getSensorsFromMachine(int backtype)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getSensors.cmdCode = UCMD_GET_SENSORS;
sendPacket.getSensors.backType = (u16)backtype;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 读取传输结果
void Machine::getTransResultFromMachine(int fileid)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getTransResult.cmdCode = UCMD_GET_TRANS_RESULT;
sendPacket.getTransResult.fileId = (u16)fileid;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 获取传感器有效标志位图
void Machine::getSensorEnBmpFromMachine()
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getSensorBmp.cmdCode = UCMD_GET_SENSOR_BMP;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
//-------------------------------------------------------------------
//----------------------------设置状态命令
#ifdef UCMD_SET_MC_STATUS
// 清除错误
void Machine::setMcStatus(int stacode, int para)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setMcStatus.cmdCode = UCMD_SET_MC_STATUS;
sendPacket.setMcStatus.staCode = (u16)stacode;
sendPacket.setMcStatus.para = (u16)para;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
void Machine::cleanError()
{
setMcStatus(MC_STA_CLENA_ERR);
}
// 设置允许工作状态
void Machine::setEnableWorkSta()
{
setMcStatus(MC_STA_EN_WORK);
}
// 设置禁止工作状态
void Machine::setDisableWorkSta()
{
setMcStatus(MC_STA_DIS_WORK);
}
// 设置允许工作时间状态
void Machine::setEnableWorkTime()
{
setMcStatus(MC_STA_EN_TIME);
}
// 设置禁止工作时间状态
void Machine::setDisableWorkTime()
{
setMcStatus(MC_STA_DIS_TIME);
}
// 重置产量
void Machine::resetOutput()
{
setMcStatus(MC_CLEAN_COUNT);
}
// 手动工作状态
void Machine::setToManualWork()
{
setMcStatus(MC_STA_MANUAL);
}
// 自动工作状态
void Machine::setToAutoWork()
{
setMcStatus(MC_STA_AUTO);
}
// 文件切换
void Machine::switchWorkFile(int idx)
{
setMcStatus(MC_FILE_SWITCH, idx);
}
// 设置经过的时间(即关机时间)
void Machine::setShutDownTime(u8 type, u32 time)
{
int rslt;
OperPacket sendPacket;
//int size = sizeof(ParaStruct);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setElapsedTime.cmdCode = UCMD_SET_ELAPSED_TIME;
sendPacket.setElapsedTime.type = type;
sendPacket.setElapsedTime.time = time;
rslt = packetAFLDP(&sendPacket.packet);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
}
// 文件失效
void Machine::invalidateWorkFile(int idx)
{
setMcStatus(MC_INVALID_FILE, idx);
}
// 清除刷新参数标志
void Machine::cleanNewParaFlag()
{
setMcStatus(MC_CLEAN_PARA_REF);
}
// 模拟工作状态
void Machine::setSimulateWork()
{
setMcStatus(MC_SET_TO_SIMULATE);
}
// 正常工作状态
void Machine::setNormalWork()
{
setMcStatus(MC_SET_TO_NORMAL);
}
//退出遍历状态
void Machine::exitTraverStates()
{
setMcStatus(MC_STA_EXIT_TRA);
}
//退出断线测试
void Machine::exitDetectTest()
{
setMcStatus(MC_STA_EXIT_THREADBK);
}
// 底线计数复位
void Machine::resetBobbinCounter()
{
setMcStatus(MC_CLEAN_BOBBIN);
}
// 设置为 进入 扫描传感器状态
void Machine::entrySensorScan()
{
//
setMcStatus(MC_SET_ENTRY_SCAN_SENSOR);
}
// 设置为 退出 扫描传感器状态
void Machine::exitSensorScan()
{
//
setMcStatus(MC_SET_EXIT_SCAN_SENSOR);
}
#endif
//----------------------------
void Machine::setParasToMachine(int type, ParaStruct & para)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(ParaStruct);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS;
sendPacket.setParas.paraType = (u16)type;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&para, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
//设置动框角度参数
void Machine::setFrameAngleParasToMachine(int type, EmbMvAng &para)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(EmbMvAng);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS;
sendPacket.setParas.paraType = (u16)type;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&para, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
void Machine::setAParasToMachine(int type, int idx, u32 value)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(value);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS;
sendPacket.setParas.paraType = (u16)type;
sendPacket.setParas.paraId = idx;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&value, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
//设置机头板参数
void Machine::setEXBHeadParasToMachine(HeadInfo &para,int id)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(u32)*PARA_NUM;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.boardPara.cmdCode = UCMD_SET_HEAD_PARA;
sendPacket.boardPara.nodeId = 0;
sendPacket.boardPara.nodeType = id;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&para.paraBuf, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
//设置换色板参数
void Machine::setEXBHcpsParasToMachine(HcpsInfo &para, int idx)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(u32)*PARA_NUM;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.boardPara.cmdCode = UCMD_SET_HCPS_PARA;
sendPacket.boardPara.nodeId = idx+1;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&para.paraBuf, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
//隔头绣,贴布绣
void Machine::setHeadPatchParasToMachine(int type, ParaStruct &para, u16 packID)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(ParaStruct);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setParas.paraId = packID;
sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS;
sendPacket.setParas.paraType = (u16)type;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&para, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
//毛巾高度
void Machine::setTowelHighParasToMachine(int type, ParaStruct &para, u16 packID)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(ParaStruct);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setParas.paraId = packID;
sendPacket.setParas.cmdCode = UCMD_SET_FILE_EXDATA;
sendPacket.setParas.paraType = (u16)type;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&para, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
void Machine::setMcPara(ParaStruct * pPara)
{
if (pPara == NULL)
{
return;
}
int size = sizeof(ParaStruct);
memcpy(&m_mcPara, pPara, size);
setParasToMachine(SEW_MCPARA_MACH, m_mcPara);
}
void Machine::setWkPara(ParaStruct * pPara)
{
if (pPara == NULL)
{
return;
}
int size = sizeof(ParaStruct);
memcpy(&m_wkPara, pPara, size);
setParasToMachine(SEW_MCPARA_WORK, m_wkPara);
}
void Machine::setMcPrePara(ParaStruct *pPara)
{
if (pPara == NULL)
{
return;
}
int size = sizeof(ParaStruct);
memcpy(&m_mcPrePara, pPara, size);
setParasToMachine(SEW_REVMCPARA_MACH, m_mcPrePara);
}
void Machine::setWkPrePara(ParaStruct *pPara)
{
if (pPara == NULL)
{
return;
}
int size = sizeof(ParaStruct);
memcpy(&m_wkPrePara, pPara, size);
setParasToMachine(SEW_REVMCPARA_WORK, m_wkPrePara);
}
//动框角度参数设置
void Machine::setFrameAnglePara(EmbMvAng *pPara)
{
if (pPara == NULL)
{
return;
}
int size = sizeof(EmbMvAng);
memcpy(&m_frameAnglePara, pPara, size);
setFrameAngleParasToMachine(EMB_MVSTANG_PARA, m_frameAnglePara);
}
void Machine::setAMcPara(int id, u32 value)
{
setAParasToMachine(SEW_MCPARA_MACH, id, value);
}
void Machine::setAWkPara(int id, u32 value)
{
setAParasToMachine(SEW_MCPARA_WORK, id, value);
}
void Machine::setAMcPrePara(int id, u32 value)
{
setAParasToMachine(SEW_REVMCPARA_MACH, id, value);
}
void Machine::setAWkPrePara(int id, u32 value)
{
setAParasToMachine(SEW_REVMCPARA_WORK, id, value);
}
//设置机头板参数
void Machine::setHeadBoardPara(HeadInfo *pPara, int id)
{
int temp = 0;
if (pPara == NULL)
{
return;
}
int size = sizeof(HeadInfo);
if (id == 0)
{
temp = 1; // 广播时以第一个机头板的参数为准
}
else
{
temp = id;
}
memcpy(&m_exboardInfo.headInfo[temp-1], pPara, size);
setEXBHeadParasToMachine(m_exboardInfo.headInfo[temp-1], id);
}
//设置换色板参数
void Machine::setHcpsBoardPara(HcpsInfo *pPara, int idx)
{
if (pPara == NULL)
{
return;
}
int size = sizeof(HeadInfo);
memcpy(&m_exboardInfo.hcpsInfo[idx], pPara, size);
setEXBHcpsParasToMachine(m_exboardInfo.hcpsInfo[idx],idx);
}
//设置机头参数
void Machine::setHeadPara(ParaStruct *pPara,u16 ID)
{
if (pPara == NULL)
{
return;
}
ParaStruct headPara;
int size = sizeof(ParaStruct);
memcpy(&headPara, pPara, size);
setHeadPatchParasToMachine(EMB_SEPTUM_DATA, headPara,ID);
}
//按色贴布绣
void Machine::setPatchColorPara(ParaStruct *pPara)
{
if (pPara == NULL)
{
return;
}
ParaStruct patchPara;
int size = sizeof(ParaStruct);
memcpy(&patchPara, pPara, size);
setHeadPatchParasToMachine(EMB_PATCH_DATA_COLOR, patchPara,0);
}
//按针贴布绣
void Machine::setPatchNeedlePara(ParaStruct *pPara)
{
if (pPara == NULL)
{
return;
}
ParaStruct patchPara;
int size = sizeof(ParaStruct);
memcpy(&patchPara, pPara, size);
setHeadPatchParasToMachine(EMB_PATCH_DATA_IDX, patchPara,0);
}
//设置毛巾高度
void Machine::setTowelHeightPara(ParaStruct *pPara)
{
if (pPara == NULL)
{
return;
}
ParaStruct towelHeightPara;
int size = sizeof(ParaStruct);
memcpy(&towelHeightPara, pPara, size);
setTowelHighParasToMachine(CHENILLE_HIGH_DATA, towelHeightPara,0);
}
// 设置文件参数
void Machine::setFilePara(int fileidx, int fileid, DataFilePara & filePara)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(DataFilePara);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setFileParas.cmdCode = UCMD_SET_FILE_PARAS;
sendPacket.setFileParas.fileType = FILE_TYPE_DAT;
sendPacket.setFileParas.fileIdx = (u8)fileidx;
sendPacket.setFileParas.fileId = (u16)fileid;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&filePara, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
// 设置执行进度
void Machine::setFileExecProgress(int fileidx, int fileid, FileExecPara & fileExecPara)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(FileExecPara);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setFileParas.cmdCode = UCMD_SET_EXEC_PROGRESS;
sendPacket.setFileParas.fileType = FILE_TYPE_DAT;
sendPacket.setFileParas.fileIdx = (u8)fileidx;
sendPacket.setFileParas.fileId = (u16)fileid;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&fileExecPara, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
// 设置默认参数
void Machine::setToDefaultParas(int type, u8 id, u8 nodeType)
{
int rslt;
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setDefParas.cmdCode = (u16)type;
sendPacket.setDefParas.id = id;
sendPacket.setDefParas.nodeType = nodeType;
rslt = packetAFLDP(&sendPacket.packet);
if(rslt != 0)
{
//为了去掉构建警告
}
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
//-------------------------------------------------------------------
// 手动动作
void Machine::actionByhand(int actcode, int para1, int para2, int para3)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.actByhand.cmdCode = UCMD_ACT_BYHAND;
sendPacket.actByhand.actCode = (u16)actcode;
sendPacket.actByhand.para1 = (u16)para1;
sendPacket.actByhand.para2 = (u16)para2;
sendPacket.actByhand.para3 = (u16)para3;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
//-------------------------------------------------------------------
// 电机归零(辅助调试的功能,无安全保护和逻辑关系)
void Machine::motoToZero(int obj)
{
actionByhand(MOTO_TO_ZERO, obj);
}
// 电机移动(辅助调试的功能,无安全保护和逻辑关系)
void Machine::motoMove(int obj, int dir, int spd)
{
actionByhand(MOVE_BY_HAND, obj, dir, spd);
}
// 输出控制(辅助调试的功能,无安全保护和逻辑关系)
void Machine::outputCtrl(int obj, int act, int para)
{
actionByhand(OUTPUT_CTRL, obj, act, para);
}
// 电机使能控制(辅助调试的功能,无安全保护和逻辑关系)
void Machine::motoServoCtrl(int obj, int onoff)
{
actionByhand(MOTO_EN_CTRL, obj, onoff);
}
// 平绣主轴使能控制
void Machine::embMsServoOn()
{
motoServoCtrl(MT_LEM, MT_SERVO_ON);
}
void Machine::embMsServoOff()
{
motoServoCtrl(MT_LEM, MT_SERVO_OFF);
}
// 毛巾主轴使能控制
void Machine::towelMsServoOn()
{
motoServoCtrl(MT_LTM, MT_SERVO_ON);
}
void Machine::towelMsServoOff()
{
motoServoCtrl(MT_LTM, MT_SERVO_OFF);
}
// 毛巾M轴使能控制
void Machine::towelMMsServoOn()
{
motoServoCtrl(MT_LTMM, MT_SERVO_ON);
}
void Machine::towelMMsServoOff()
{
motoServoCtrl(MT_LTMM, MT_SERVO_OFF);
}
// 毛巾M轴使能控制
void Machine::towelRMMsServoOn()
{
motoServoCtrl(MT_LRM, MT_SERVO_ON);
}
void Machine::towelRMMsServoOff()
{
motoServoCtrl(MT_LRM, MT_SERVO_OFF);
}
void Machine::coilMsServoOn()
{
motoServoCtrl(MT_LCM2, MT_SERVO_ON);
}
void Machine::coilMsServoOff()
{
motoServoCtrl(MT_LCM2, MT_SERVO_OFF);
}
void Machine::coilMMsServoOn()
{
motoServoCtrl(MT_LCMM, MT_SERVO_ON);
}
void Machine::coilMMsServoOff()
{
motoServoCtrl(MT_LCMM, MT_SERVO_OFF);
}
// 手动动作功能(日常使用功能,有安全保护和逻辑时序关系)
void Machine::manualAction(int obj, int para2, int para3)
{
actionByhand(MANUAL_ACTION, obj, para2, para3);
}
// 定工作范围
void Machine::setWorkRange()
{
manualAction(AUTO_SET_RANGE);
}
// 手动加油
void Machine::manualOil(int nNum)
{
mcWorkCmd(WORK_ACT_OIL,nNum);
}
// 重置反复次数
void Machine::resetRepeatNum()
{
manualAction(RESET_REPEAT_NUM);
}
//梭盘计数复位
void Machine::shuttleCounter()
{
manualAction(RESET_SHUT_COUNTER);
}
//自动换一个梭
void Machine::changeOneShuttle()
{
manualAction(AUTO_CHANGE_ONE_SHUT);
}
// 松紧线
void Machine::looseOnOff()
{
manualAction(SEW_LOCLIP_TRD);
}
// 手动移框
void Machine::moveFrameByHand(char xy, char dir, int spd)
{
int para1, para2;
if (xy == 'x' || xy == 'X')
{
if (dir == 'l' || dir == 'L')
{
para1 = XY_MOVE_LEFT;
}
else if (dir == 'r' || dir == 'R')
{
para1 = XY_MOVE_RIGHT;
}
else
{
para1 = XY_MOVE_STOP;
}
}
else if (xy == 'y' || xy == 'Y')
{
if (dir == 'f' || dir == 'F')
{
para1 = XY_MOVE_FRONT;
}
else if (dir == 'b' || dir == 'B')
{
para1 = XY_MOVE_BACK;
}
else
{
para1 = XY_MOVE_STOP;
}
}
else
{
para1 = XY_MOVE_STOP;
}
para2 = spd;
manualAction(para1, para2);
}
// 平绣点动
void Machine::embJog()
{
manualAction(EMB_MS_JOG);
}
// 平绣锁头电机测试
void Machine::testLockMoto(int para)
{
manualAction(EMB_TEST_LOCKMOTO,para);
}
// 毛巾点动
void Machine::chenilleJog()
{
manualAction(CHENILLE_MS_JOG);
}
//毛巾提升电机控制
void Machine::hoistCtrl(int gearValue)
{
manualAction(CHENILLE_HOIST_CTRL,gearValue);
}
//毛巾松紧线控制
void Machine::elasticCtrl(int posValue)
{
manualAction(CHENILLE_ELASTIC_CTRL,posValue);
}
//测试电位器
void Machine::testADC(int para,int headNum)
{
manualAction(TEST_ADC_POTVAL,para,headNum);
}
// 平绣换色
void Machine::embSwitchNeedle(int nNum)
{
manualAction(EMB_SW_COLOR, nNum);
}
// 毛巾换色
void Machine::chenilleSwitchNeedle(int nNum)
{
manualAction(CHENILLE_SW_COLOR, nNum);
}
// 毛巾换色调试
void Machine::chenilleColorDebug(int nNum)
{
manualAction(CHENILLE_SW_DEBUG,nNum);
}
// 亮片换色
void Machine::sequinSwitchNeedle(int nNum, s16 sq)
{
if(sq == 0)//左亮片
{
manualAction(LEFT_SEQUIN_CHANGE_COLOR, nNum);
}
else if(sq == 1)//右亮片
{
manualAction(RIGHT_SEQUIN_CHANGE_COLOR, nNum);
}
}
void Machine::embSpindleTest(s32 para1, s32 para2)
{
manualAction(EMB_MS_RUN, para1, para2);
}
// 平绣主轴研车
/*
#define EMB_MS_RUN 0x0022 // 平绣主轴研车
*/
// 平绣剪线
void Machine::embCutThread()
{
manualAction(EMB_CUT_THREAD);
}
// 毛巾剪线
void Machine::chenilleCutThread()
{
manualAction(CHENILLE_CUT_THREAD);
}
// 机头切换
void Machine::headSwitch(int para)
{
manualAction(CHANGE_WORK_HEAD,para);
}
//遍历设置(进入遍历状态和退出遍历状态、断线检测、退出勾刀测试)
void Machine::enterOrExitStates(int obj, int para1, int para2, int para3, int para4)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.traverse.cmdCode = obj;
sendPacket.traverse.protocolType = (u8)para1;
sendPacket.traverse.nodeType = (u8)para2;
sendPacket.traverse.traNum = (u8)para3;
sendPacket.traverse.nodeId = (u8)para4;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
//-------------------------------------------------------
#ifdef UCMD_MC_WORK
void Machine::mcWorkCmd(int workcode, int para1, int para2)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.mcWork.cmdCode = UCMD_MC_WORK;
sendPacket.mcWork.workCode = (u16)workcode;
sendPacket.mcWork.para1 = (u32)para1;
sendPacket.mcWork.para2 = (u16)(para2);
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 启动工作
void Machine::startWork()
{
mcWorkCmd(WORK_START);
}
// 暂停工作
void Machine::pauseWork()
{
mcWorkCmd(WORK_PAUSE);
}
// 流程复位(结束工作)
void Machine::allToReset()
{
mcWorkCmd(WORK_FINISH);
}
// 自动找零(全部归零)
void Machine::allToZero()
{
mcWorkCmd(WORK_FIND_ZERO);
}
// 回起针点
void Machine::gotoStartPos()
{
mcWorkCmd(WORK_GOTO_ANCHOR);
}
// 定偏移点
void Machine::setOffsetPos()
{
mcWorkCmd(WORK_SET_OFFSET);
}
// 定上料点
void Machine::setFeedPos()
{
mcWorkCmd(WORK_SET_FEED);
}
// 回偏移点
void Machine::gotoOffsetPos()
{
mcWorkCmd(WORK_GOTO_OFFSET);
}
// 回上料点
void Machine::gotoFeedPos()
{
mcWorkCmd(WORK_GOTO_FEED);
}
// 边框检查
void Machine::checkFrame()
{
mcWorkCmd(WORK_CHECK_FRAME);
}
// 空走边框
void Machine::simulateFrame()
{
mcWorkCmd(WORK_SIMULATION_FRAME);
}
//进入匹绣
void Machine::enterClothEmbroidery()
{
manualAction(EMB_ENTER_CLOTH);
}
//退出匹绣
void Machine::exitClothEmbroidery()
{
manualAction(EMB_EXIT_CLOTH);
}
//自动定软限位
void Machine::autoSetSoftLimit()
{
manualAction(XY_AUTO_SOFTLIMIT);
}
//平绣主轴齿轮比测试
void Machine::embSpindleTest()
{
manualAction(TEST_EMB_SPINDLE_RATIO);
}
//毛巾主轴齿轮比测试
void Machine::chenSpindleTest()
{
manualAction(TEST_CHEN_SPINDLE_RATIO);
}
//测试平绣主轴编码器宽度
void Machine::ecdWidthTest()
{
manualAction(TEST_FLAT_ECD_WIDTH);
}
void Machine::footTest()
{
manualAction(TEST_EMB_FOOT);
}
//机头板总线检测
void Machine::headBoardBusDetect()
{
manualAction(CHECK_N5_CANBUS);
}
//线迹偏移
void Machine::traceOffset()
{
manualAction(TRACE_OFST);
}
//线迹偏移数据复位
void Machine::resetTraceOffset()
{
manualAction(RESET_TRAOFST);
}
//清除当前索引的线迹偏移数据
void Machine::clearCurTraceOffset()
{
manualAction(CLEAN_CURTRAOFST);
}
/*
#define WORK_CUT_FRAME 0x0009 // 边框切割
#define WORK_CUT_XLINE 0x000A // 手动断布
*/
// 快速进退
void Machine::fastJump(int idx)
{
mcWorkCmd(WORK_FAST_JUMP, idx);
}
// 回工作点
void Machine::gotoWorkPos()
{
mcWorkCmd(WORK_GOTO_WKPOS);
}
// 回穿线点
void Machine::gotoFixPos()
{
mcWorkCmd(WORK_GOTO_FEEDT);
}
/*
#define WORK_GOTO_CHGBO 0x000E // 回换梭位
#define WORK_FEED_MOVE 0x000F // 进料退料
#define WORK_DRAW_LATTICE 0x0010 // 画格子图
#define WORK_GOTO_FINISH 0x0011 // 回结束点
*/
// 回零点(框架归零)
void Machine::gotoZeroPos()
{
mcWorkCmd(WORK_GOTO_ZERO);
}
// 主轴点动
void Machine::mainShaftJog()
{
mcWorkCmd(WORK_MS_JOG);
}
// 速度改变
// chgram 主轴转速改变值。例如参数为10表示速度加10(升速),参数为-10表示速度减10(降速)
void Machine::msRpmChange(int chgram, int flag)
{
mcWorkCmd(WORK_RPM_CHG, chgram, flag);
}
#endif
//----------------------------
// 移动到XY坐标命令
void Machine::moveFrameTo(int x, int y)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.moveFrameTo.cmdCode = UCMD_MOVE_TO;
sendPacket.moveFrameTo.posx = x;
sendPacket.moveFrameTo.posy = y;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
void Machine::breakFileTrans()
{
m_transBreak = 1;
}
#define SEND_STEP0 0
#define SEND_STEP1 1
#define SEND_STEP2 2
#define SEND_STEP3 3
#define SEND_STEP4 4
#define SEND_STEP5 5
#define SEND_STEP_MAX 10
#define SEND_ANSWER 100
void Machine::onSendTimer(void)
{
int rslt;
rslt = 0;
//qDebug("file trans timer");
if (m_transBreak != 0) // 中断传输
{
qDebug("break file trans");
m_transCtrl.transphase = SEND_STEP5;
}
if (m_transCtrl.transphase == SEND_STEP0) // 文件失效
{
m_fileTransEn = 0;
qDebug("SEND_STEP1 InvalidateWorkFile ");
invalidateWorkFile(m_transCtrl.fileIdx); // 文件失效
m_transCtrl.transphase = SEND_STEP1;
rslt = 1;
}
else if (m_transCtrl.transphase == SEND_STEP1) // 启动文件传输
{
m_fileTransEn = 0;
startFileTrans(m_transCtrl);
qDebug("StartFileTrans ");
qDebug("trans progress %d/%d", 0, m_transCtrl.packetNum);
m_totalSendNum = 0;
m_totalPacketNum = m_transCtrl.packetNum;
emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送进度信号
m_transCtrl.transphase = SEND_STEP2;
rslt = 1;
if (m_transCtrl.fileType == FILE_TYPE_BOARD)
{
//如果是外围板升级需要增加延时等待外围板noflash擦除
QDateTime oldTime, curTime;
oldTime = QDateTime::currentDateTime();
while(1)
{
curTime = QDateTime::currentDateTime();
if(oldTime.msecsTo(curTime) > 6000)
{
break;
}
}
}
}
else if (m_transCtrl.transphase == SEND_STEP2) // 读取传输结果
{
qDebug("SEND_STEP2 send GetTransResult cmd ");
m_fileTransEn = 0;
getTransResultFromMachine(m_transCtrl.fileId);
m_transCtrl.transphase = SEND_STEP3;
rslt = 1;
}
else if (m_transCtrl.transphase == SEND_STEP3) // 根据传输结果传输文件数据
{
if (m_fileTransEn == 1)
{
qDebug("GetTransResult from machine");
if (m_transCtrl.transActive == TRANS_ACTIVE)
{
if ( m_transCtrl.transflag == TRANS_READY || // 准备好接收
m_transCtrl.transflag == TRANS_DOING || // 正在接收
0 )
{
qDebug("trans sta = TRANS_READY or TRANS_DOING flag=%d", m_transCtrl.transflag);
#if (1)
int i, j;
int thissendnum = 0;
int totalsendnum = 0;
int send_count = 1000;
#if(1)//发一个包查询一次结果
if ( m_transCtrl.fileType == FILE_TYPE_DAT )//花样文件(大文件)
{
if(m_connectMode == USE_TCP_COMM)//网口
{
send_count = 400;
}
else if(m_connectMode == USE_SERIAL_COMM)//串口
{
send_count = 10;
}
}
else if ( m_transCtrl.fileType == FILE_TYPE_PGM || //升级等文件(小文件)
m_transCtrl.fileType == FILE_TYPE_FRAME ||
m_transCtrl.fileType == FILE_TYPE_BOARD )
{
send_count = 25;
}
#endif
u8 mod, temp;
for (i = 0; i < m_transCtrl.lenBmp; i++)
{
temp = m_transCtrl.rsvBitmap[i];
mod = 0x01;
for (j = 0; j < 8; j++)
{
if ((temp & mod) == 0)
{
if (thissendnum < send_count ) // 每发送send_count个包查询一次结果
{
thissendnum++;
transFileData(m_transCtrl, i*8+j);
if (m_transCtrl.fileType == FILE_TYPE_BOARD)
{
//如果是外围板升级需要增加延时否则主控和外围板CAN缓存区会溢出
QDateTime oldTime, curTime;
oldTime = QDateTime::currentDateTime();
while(1)
{
curTime = QDateTime::currentDateTime();
if(oldTime.msecsTo(curTime) > 100)
{
break;
}
}
}
}
}
else
{
totalsendnum++;
}
mod <<= 1;
}
}
m_totalSendNum = totalsendnum;
m_totalPacketNum = m_transCtrl.packetNum;
emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送进度信号
m_transCtrl.transphase = SEND_STEP2; // 重新发送查询命令
#else
int i, j;
int thissendnum = 0;
int totalsendnum = 0;
u8 mod, temp;
for (i = 0; i < m_transCtrl.lenBmp; i++)
{
temp = m_transCtrl.rsvBitmap[i];
mod = 0x01;
for (j = 0; j < 8; j++)
{
if ((temp & mod) == 0)
{
if (thissendnum < 200) // 每发送200个包查询一次结果
{
thissendnum++;
TransFileData(m_transCtrl, i*8+j);
qDebug("TransFileData idx=%d", i*8+j);
}
}
else
{
totalsendnum++;
}
mod <<= 1;
}
}
qDebug("trans progress = %d/%d", totalsendnum , m_transCtrl.packetNum);
emit(SiTransProgress(totalsendnum, m_transCtrl.packetNum)); // 发送进度信号
m_transCtrl.transphase = SEND_STEP2; // 重新发送查询命令
#endif
}
else if (m_transCtrl.transflag == TRANS_DONE) // 接收完成
{
qDebug("trans sta = TRANS_DONE");
emit siSendDataDone();
m_totalSendNum = m_transCtrl.packetNum;
m_totalPacketNum = m_transCtrl.packetNum;
emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送进度信号
m_transCtrl.transphase = SEND_STEP4;
//qDebug()<<"m_transCtrl.fileType"<<m_transCtrl.fileType;
if( m_transCtrl.fileType == FILE_TYPE_DAT || m_transCtrl.fileType == FILE_TYPE_FRAME)
{
}
else if( m_transCtrl.fileType == FILE_TYPE_PGM )
{
qDebug() << "UpdateFirmware";
updateFirmware();
}
else if( m_transCtrl.fileType == FILE_TYPE_BOARD )
{
qDebug() << "Update ex board";
updateExBoard(m_transCtrl.pBoardHead->protocol, m_transCtrl.pBoardHead->nodeid,m_transCtrl.pBoardHead->nodeType);
}
}
else if (m_transCtrl.transflag == TRANS_REQUEST) // 请求传输数据模式
{
qDebug("trans sta = TRANS_REQUEST, sta=%d", m_transCtrl.transflag);
m_transCtrl.transphase = SEND_ANSWER;
}
else // if (m_transCtrl.transflag == TRANS_NOT_BEG) // 没有收到启动命令
{
qDebug("trans sta = TRANS_NOT_BEG, sta=%d, back to SEND_STEP1", m_transCtrl.transflag);
m_transCtrl.transphase = SEND_STEP1; // 重新发送启动文件传输
}
}
else
{
qDebug("transActive != TRANS_ACTIVE, back to SEND_STEP1 ");
m_transCtrl.transphase = SEND_STEP1; // 重新发送启动文件传输
}
rslt = 1;
}
else
{
if (m_transCtrl.waitcount > SEND_STEP_MAX) // 1秒没有回复
{
qDebug("waitcount > SEND_STEP_MAX, back to SEND_STEP2 ");
m_transCtrl.transphase = SEND_STEP2; // 重新发送查询命令
rslt = 1;
}
}
}
if (rslt == 0)
{
m_transCtrl.waitcount++;
}
else
{
m_transCtrl.waitcount = 0;
}
if ( m_transCtrl.transphase != SEND_STEP1 &&
m_transCtrl.transphase != SEND_STEP2 &&
m_transCtrl.transphase != SEND_STEP3 ) // 结束
{
qDebug("trans file over, step=%d", m_transCtrl.transphase);
if (m_transCtrl.transphase == SEND_STEP4)
{
m_totalSendNum = 0;
m_totalPacketNum = 0;
emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送结束信号(成功)
}
else
{
m_totalSendNum = -1;
m_totalPacketNum = -1;
emit(siTransProgress(m_transCtrl.fileType, m_totalSendNum, m_totalPacketNum)); // 发送结束信号(失败)
}
m_pSendTimer->stop(); // 停止定时器
m_transCtrl.filetransing = 0;
}
}
//串口是否打开
void Machine::slIfOpenSerialPort(int val)
{
if(val != 0)
{
if(m_connectMode == USE_SERIAL_COMM)
{
m_connected = 3;//串口已打开
}
}
}
// 发送文件过程
int Machine::sendFileProc(int type, int idx, int id, DataDs16FileHead & fileHead, u8 * pDatBuff)
{
return sendFileProc(type, idx, id, &fileHead, pDatBuff);
}
int Machine::dySendFileProc(int type, int idx, int id, DataDs16FileHead *pfileHead, u8 *pDatBuff)
{
if (pDatBuff == NULL || pfileHead == NULL)
{
return -1;
}
if ( pfileHead->dataSize <= 0 || pfileHead->dataSize > MAX_FILE_SIZE)
{
qDebug("pfileHead->dataSize <= 0 || pfileHead->dataSize > MAX_FILE_SIZE, not support");
return -2;
}
QTime delayTime;
int counter = 0;
delayTime.start();
if (m_transCtrl.filetransing != 0) // 已经有文件在传输
{
return -3;
}
while (m_transCtrl.filetransing != 0) // 已经有文件在传输
{
if (delayTime.elapsed() > 1000)
{
counter++;
qDebug("%d. wait old file trans over", counter);
delayTime.restart();
}
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
m_transBreak = 0;
m_transCtrl.fileType = (u8)type;
m_transCtrl.fileIdx = (u8)idx;
m_transCtrl.fileId = (u16)id;
memcpy(m_transCtrl.pFileHead, pfileHead, sizeof(DataDs16FileHead));
memcpy(m_transCtrl.pDatBuff, pDatBuff, pfileHead->dataSize);
m_transCtrl.packetSize = MAX_EXDP_LEN;
m_transCtrl.packetNum = (pfileHead->dataSize + MAX_EXDP_LEN - 1) / MAX_EXDP_LEN;
qDebug("StartFileTrans, fileType=%d, fileIdx=%d, fileId=%d, packetNum=%d, ",
m_transCtrl.fileType, m_transCtrl.fileIdx, m_transCtrl.fileId, m_transCtrl.packetNum);
m_transCtrl.filetransing = 1;
m_transCtrl.transflag = TRANS_REQUEST;
m_transCtrl.transActive = TRANS_ACTIVE;
startFileDyTrans(m_transCtrl);
m_transCtrl.filetransing = 0;
return 0;
}
int Machine::sendFileProc(int type, int idx, int id, DataDs16FileHead * pfileHead, u8 * pDatBuff)
{
if (pDatBuff == NULL || pfileHead == NULL)
{
return -1;
}
if ( pfileHead->dataSize <= 0 || pfileHead->dataSize > MAX_FILE_SIZE)
{
qDebug("pfileHead->dataSize <= 0 || pfileHead->dataSize > MAX_FILE_SIZE, not support");
return -2;
}
QTime delayTime;
int counter = 0;
delayTime.start();
if (m_transCtrl.filetransing != 0) // 已经有文件在传输
{
return -3;
}
while (m_transCtrl.filetransing != 0) // 已经有文件在传输
{
if (delayTime.elapsed() > 1000)
{
counter++;
qDebug("%d. wait old file trans over", counter);
delayTime.restart();
}
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);//进度条
}
m_transBreak = 0;
m_transCtrl.fileType = (u8)type;
m_transCtrl.fileIdx = (u8)idx;
m_transCtrl.fileId = (u16)id;
memcpy(m_transCtrl.pFileHead, pfileHead, sizeof(DataDs16FileHead));
memcpy(m_transCtrl.pDatBuff, pDatBuff, pfileHead->dataSize);
m_transCtrl.packetSize = MAX_EXDP_LEN;
m_transCtrl.packetNum = (pfileHead->dataSize + MAX_EXDP_LEN - 1) / MAX_EXDP_LEN;
qDebug("StartFileTrans, fileType=%d, fileIdx=%d, fileId=%d, packetNum=%d, ",
m_transCtrl.fileType, m_transCtrl.fileIdx, m_transCtrl.fileId, m_transCtrl.packetNum);
m_transCtrl.transphase = SEND_STEP1;
m_transCtrl.filetransing = 1;
m_pSendTimer->start();
return 0;
}
// 发送文件过程
int Machine::sendAPPFileProc(int type, int idx, int id, AppFileHead & fileHead, u8 * pDatBuff)
{
if (pDatBuff == NULL || fileHead.dataSize <= 0)
{
return -1;
}
if (fileHead.dataSize > MAX_FILE_SIZE)
{
qDebug("fileHead.dataSize > MAX_FILE_SIZE, not support");
return -2;
}
QTime delayTime;
int counter = 0;
delayTime.start();
while (m_transCtrl.filetransing != 0) // 已经有文件在传输
{
if (delayTime.elapsed() > 1000)
{
counter++;
qDebug("%d. wait old file trans over", counter);
delayTime.restart();
}
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
m_transBreak = 0;
// 拷贝数据到传输控制结构
m_transCtrl.fileType = (u8)type;
m_transCtrl.fileIdx = (u8)idx;
m_transCtrl.fileId = (u16)id;
memcpy(m_transCtrl.pAppHead, &fileHead, sizeof(AppFileHead));
memcpy(m_transCtrl.pDatBuff, pDatBuff, fileHead.dataSize);
m_transCtrl.packetSize = MAX_EXDP_LEN;
m_transCtrl.packetNum = (fileHead.dataSize + MAX_EXDP_LEN - 1 ) / MAX_EXDP_LEN;
qDebug("StartFileTrans, fileType=%d, fileIdx=%d, fileId=%d, packetNum=%d, ",
m_transCtrl.fileType, m_transCtrl.fileIdx, m_transCtrl.fileId, m_transCtrl.packetNum);
m_transCtrl.transphase = SEND_STEP1;
m_transCtrl.filetransing = 1;
// 启动定时器
m_pSendTimer->start();
return 0;
}
// 发送外围板文件过程
int Machine::sendBoardFileProc(int type, int idx, int id, BoardFileHead & fileHead, u8 * pDatBuff)
{
if (pDatBuff == NULL || fileHead.dataSize <= 0)
{
return -1;
}
if (fileHead.dataSize > MAX_FILE_SIZE)
{
qDebug("fileHead.dataSize > MAX_FILE_SIZE, not support");
return -2;
}
QTime delayTime;
int counter = 0;
delayTime.start();
while (m_transCtrl.filetransing != 0) // 已经有文件在传输
{
if (delayTime.elapsed() > 1000)
{
counter++;
qDebug("%d. wait old file trans over", counter);
delayTime.restart();
}
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
m_transBreak = 0;
// 拷贝数据到传输控制结构
m_transCtrl.fileType = (u8)type;
m_transCtrl.fileIdx = (u8)idx;
m_transCtrl.fileId = (u16)id;
memcpy(m_transCtrl.pBoardHead, &fileHead, sizeof(BoardFileHead));
memcpy(m_transCtrl.pDatBuff, pDatBuff, fileHead.dataSize);
m_transCtrl.packetSize = MAX_EXDP_LEN;
m_transCtrl.packetNum = (fileHead.dataSize + MAX_EXDP_LEN - 1 ) / MAX_EXDP_LEN;
qDebug("StartFileTrans, fileType=%d, fileIdx=%d, fileId=%d, packetNum=%d, ",
m_transCtrl.fileType, m_transCtrl.fileIdx, m_transCtrl.fileId, m_transCtrl.packetNum);
m_transCtrl.transphase = SEND_STEP1;
m_transCtrl.filetransing = 1;
// 启动定时器
m_pSendTimer->start();
return 0;
}
// 启动文件传输
void Machine::startFileTrans(FileTransCtrl & transCtrl)
{
int rslt;
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.startTrans.cmdCode = UCMD_START_TRANS;
sendPacket.startTrans.fileType = transCtrl.fileType;
sendPacket.startTrans.fileIdx = transCtrl.fileIdx;
sendPacket.startTrans.fileId = transCtrl.fileId;
if( transCtrl.fileType == FILE_TYPE_DAT || transCtrl.fileType == FILE_TYPE_FRAME)
{
rslt = packetAVLDP(&sendPacket.packet, (u8*)transCtrl.pFileHead, sizeof(DataDs16FileHead));
}
else if( transCtrl.fileType == FILE_TYPE_PGM )
{
rslt = packetAVLDP(&sendPacket.packet, (u8*)transCtrl.pAppHead, sizeof(AppFileHead));
}
else if ( transCtrl.fileType == FILE_TYPE_BOARD )
{
rslt = packetAVLDP(&sendPacket.packet, (u8*)transCtrl.pBoardHead, sizeof(BoardFileHead));
}
else
{
return ;
}
if (rslt == 0)
{
if( transCtrl.fileType == FILE_TYPE_DAT || transCtrl.fileType == FILE_TYPE_FRAME)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+sizeof(DataDs16FileHead));
emit(siSendData(dat));
}
else if( transCtrl.fileType == FILE_TYPE_PGM )
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+sizeof(AppFileHead));
emit(siSendData(dat));
}
else if ( transCtrl.fileType == FILE_TYPE_BOARD )
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+sizeof(BoardFileHead));
emit(siSendData(dat));
}
}
}
void Machine::startFileDyTrans(FileTransCtrl &transCtrl)
{
int rslt;
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.startTrans.cmdCode = UCMD_START_TRANS;
sendPacket.startTrans.fileType = transCtrl.fileType;
sendPacket.startTrans.fileIdx = transCtrl.fileIdx;
sendPacket.startTrans.fileId = transCtrl.fileId;
if( transCtrl.fileType == FILE_TYPE_DAT || transCtrl.fileType == FILE_TYPE_FRAME)
{
rslt = packetAVLDP(&sendPacket.packet, (u8*)transCtrl.pFileHead, sizeof(DataDs16FileHead));
}
else
{
return ;
}
if (rslt == 0)
{
if( transCtrl.fileType == FILE_TYPE_DAT || transCtrl.fileType == FILE_TYPE_FRAME)
{
//发送文件头
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+sizeof(DataDs16FileHead));
emit(siSendData(dat));
//发送第一个数据包
//transFileData(m_transCtrl, 0);
}
}
}
// 文件数据传输
void Machine::transFileData(FileTransCtrl & transCtrl, int pktidx)
{
int rslt;
int actsize;
u8 buff[MAX_EXDP_LEN];
if (pktidx < 0 || transCtrl.pDatBuff == NULL)
{
return;
}
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.transFileData.cmdCode = UCMD_TRANS_FILE_DATA;
sendPacket.transFileData.fileId = transCtrl.fileId;
sendPacket.transFileData.pktIdx = pktidx;
if (pktidx < (int)transCtrl.packetNum)
{
if( transCtrl.fileType == FILE_TYPE_DAT || transCtrl.fileType == FILE_TYPE_FRAME)
{
actsize = transCtrl.pFileHead->dataSize - pktidx*transCtrl.packetSize;
if (actsize >= transCtrl.packetSize)
{
actsize = transCtrl.packetSize;
}
else
{
memset(buff, 0, MAX_EXDP_LEN);
}
}
else if( transCtrl.fileType == FILE_TYPE_PGM )
{
actsize = transCtrl.pAppHead->dataSize - pktidx*transCtrl.packetSize;
if (actsize >= transCtrl.packetSize)
{
actsize = transCtrl.packetSize;
}
else
{
memset(buff, 0XFF, MAX_EXDP_LEN);
}
}
else if ( transCtrl.fileType == FILE_TYPE_BOARD )
{
actsize = transCtrl.pBoardHead->dataSize - pktidx*transCtrl.packetSize;
if (actsize >= transCtrl.packetSize)
{
actsize = transCtrl.packetSize;
}
else
{
memset(buff, 0XFF, MAX_EXDP_LEN);
}
}
else
{
actsize = 0;
}
memcpy(buff, &(transCtrl.pDatBuff[pktidx*transCtrl.packetSize]), actsize);
//qDebug("TransFileData pktidx=%d", pktidx);
#if (0)
int i;
for (i = 0; i < MAX_EXDP_LEN/16; i++)
{
qDebug("0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x",
buff[i*16+0], buff[i*16+1],buff[i*16+2],buff[i*16+3],buff[i*16+4],buff[i*16+5],buff[i*16+6],buff[i*16+7],
buff[i*16+8],buff[i*16+9],buff[i*16+10],buff[i*16+11],buff[i*16+12],buff[i*16+13],buff[i*16+14],buff[i*16+15]);
}
#endif
rslt = packetAVLDP(&sendPacket.packet, buff, MAX_EXDP_LEN);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+MAX_EXDP_LEN);
emit(siSendData(dat));
}
}
}
// 下位机升级
void Machine::updateFirmware()
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.mcUpdate.cmdCode = UCMD_MC_UPDATE;
sendPacket.mcUpdate.upObj = 0;
sendPacket.mcUpdate.upFileID = 0;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 外围板升级
void Machine::updateExBoard(u8 protocolType, u8 nodeId,u8 nodeType)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.updateBoard.cmdCode = UCMD_BOARD_UPDATE;
sendPacket.updateBoard.protocolType = protocolType;
sendPacket.updateBoard.nodeId = nodeId;
sendPacket.updateBoard.nodeType = nodeType;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 恢复出厂设置
void Machine::restoreFactorySetting(int type)
{
int mctype = -1;
int wktype = -1;
if (type == -1)
{
mctype = SEW_MCPARA_DEF_MC;
wktype = SEW_MCPARA_DEF_WK;
m_mcParaEn = 0;
m_wkParaEn = 0;
}
else
{
if(type == SEW_MCPARA_DEF_MC )
{
mctype = SEW_MCPARA_DEF_MC;
m_mcParaEn = 0;
}
if(type == SEW_MCPARA_DEF_WK )
{
wktype = SEW_MCPARA_DEF_WK;
m_wkParaEn = 0;
}
}
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getMcParas.cmdCode = UCMD_GET_MC_PARAS;
if (mctype == SEW_MCPARA_DEF_MC)
{
sendPacket.getMcParas.paraType = (u16)mctype;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
if (wktype == SEW_MCPARA_DEF_WK)
{
sendPacket.getMcParas.paraType = (u16)wktype;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
sleep(3);
setMcPara(&m_mcPara);
setWkPara(&m_wkPara);
setMcPara(&m_mcPrePara);
setWkPara(&m_wkPrePara);
}
void Machine::sleep(int sec)
{
QTime dieTime = QTime::currentTime().addSecs(sec);//延时sec秒
//QTime dieTime = QTime::currentTime().addMSecs(msec);//延时msec毫秒
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
//定量移框
void Machine::quantityMoveFrame(s32 x, s32 y)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.moveFrameTo.cmdCode = UCMD_MOVE_OFST;
sendPacket.moveFrameTo.posx = x;
sendPacket.moveFrameTo.posy = y;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
void Machine::setTcpConnectState(int state)
{
if(state == 0){}//为了去掉串口下的构建警告
if(m_connectMode == USE_TCP_COMM)
{
if(m_pTcpClient != NULL)
{
m_pTcpClient->m_connected = state;
}
}
else if(m_connectMode == USE_SERIAL_COMM)//串口
{
//注释掉此行代码因为串口发送文件较慢若是超过5秒不给上位机返状态就会检测断开其实并未断开
//m_connected = state;//改变连接状态
}
}
// 设置经过的时间
void Machine::setElapsed(unsigned char i_type , unsigned char i_time)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setElapsedTime.cmdCode = UCMD_SET_ELAPSED_TIME;
sendPacket.setElapsedTime.type = i_type ;
sendPacket.setElapsedTime.time = i_time ;
packetAFLDP(&sendPacket.packet);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET);
emit(siSendData(dat));
}
// 测试断线检测,1是面线2是底线
void Machine::testThreadBK(int type,int needle,int headType)
{
actionByhand(TEST_THREADBK, type, needle , headType);
}
// 测试锁头
void Machine::lockTest(int type, int para)
{
actionByhand(TEST_LOCK, type, para);
}
// 设置机器的密钥
void Machine::setMacKey(unsigned char * p_dat , int i_size)
{
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setMacKey.cmdCode = UCMD_SET_INSTALLMENT;
memcpy( sendPacket.setMacKey.exData , p_dat , i_size);
packetAVLDP(&sendPacket.packet, (u8*)p_dat, i_size);
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + i_size );
emit(siSendData(dat));
}
//idx 现在默认是0读第一个机头的机头板参数方便以后读其他机头的机头板的参数 -rq
HeadInfo* Machine::getHeadPara(int idx ,int nType)
{
int i;
for (i = 0; i < MAX_SUPPORT_N5; i++)
{
if (nType == m_exboardInfo.headInfo[i].nodeType)//平绣的nType是1
{// 若广播,则读取相应节点类型的第一个节点
if (idx <= 1)
{
break;
}
else
{
idx--;
}
}
}
if (i<MAX_SUPPORT_N5)
{
return &m_exboardInfo.headInfo[i];
}
else
{
return NULL;
}
}