QuiltingHMI/machine/machine.cpp
2024-02-06 15:10:48 +08:00

1963 lines
53 KiB
C++
Raw 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_mcInfo,0,sizeof(MCInfo)); // 机器信息
memset(&m_lotData,0,sizeof(McLotData)); // 物联数据
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.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_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, int toggle)
{
memcpy(&m_mcStatus, buff, sizeof(MCStatus));
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_MC_STATUS: // 发送机器状态
{
setMcStatusAsMc(operpkt->dSendMcStatus.exData, operpkt->dSendMcStatus.toggle);
break;
}
case DCMD_SEND_MC_PARAS: // 发送机器参数
{
int type;
type = operpkt->dSendMcParas.paraType;
if (operpkt->dSendMcParas.exLen == sizeof(ParaStruct))
{
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
{
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: // 发送文件信息
{
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;
}
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_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));
}
// 读取机器状态
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;
if (type == -1)
{
mctype = SEW_MCPARA_MACH;
wktype = SEW_MCPARA_WORK;
m_mcParaEn = 0;
m_wkParaEn = 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;
}
}
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));
}
}
// 读取传感信号
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::setHeadSpacingToMachine(int type, QByteArray data, u16 paraId)
{
int rslt;
OperPacket sendPacket;
int size = data.size();
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS;
sendPacket.setParas.paraType = (u16)type;
sendPacket.setParas.paraId = paraId;
rslt = packetAVLDP(&sendPacket.packet, (u8*)data.data(), size);
if(rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
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::exitDetectTest()
{
setMcStatus(MC_STA_EXIT_THREADBK);
}
// 底线计数复位
void Machine::resetBobbinCounter()
{
setMcStatus(MC_CLEAN_BOBBIN);
}
// 产量清零
void Machine::outputReset()
{
setMcStatus(MC_CLEAN_COUNT);
}
// 设置为 进入 扫描传感器状态
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::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::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::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::setHeadSpacing(DsrHeadEx62 para)
{
//分两个包发送
QByteArray pkg1((char *)(&para), sizeof(DsrHeadEx62)/2);
QByteArray pkg2((char *)(&para) + sizeof(DsrHeadEx62)/2, sizeof(DsrHeadEx62)/2);
setHeadSpacingToMachine(SEW_MCPARA_EX1, pkg1, 0);
setHeadSpacingToMachine(SEW_MCPARA_EX2, pkg2, 1);
}
// 设置文件参数
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::sewingMsServoOn()
{
motoServoCtrl(MT_LM, MT_SERVO_ON);
}
void Machine::sewingMsServoOff()
{
motoServoCtrl(MT_LM, MT_SERVO_OFF);
}
// 手动动作功能(日常使用功能,有安全保护和逻辑时序关系)
void Machine::manualAction(int obj, int para2, int para3)
{
actionByhand(MANUAL_ACTION, obj, para2, para3);
}
// 手动剪线
void Machine::cutThreadByhand()
{
manualAction(CUT_THREAD);
}
void Machine::makeup(int mode)
{
manualAction(mode);
}
// 针梭校对
// step是指执行针梭校对的第几步
// 1表示高位提升 2表示梭归零 3表示针归零 4表示针梭复位 0表示自动执行步骤1234
void Machine::msAdjust(int step)
{
manualAction(MAINSHAFT_ADJUST, step);
}
// 旋转校对
void Machine::rotaAdjust(int step)
{
manualAction(ROTATE_ADJUST, step);
}
// 机头升降
void Machine::sewHeadLiftUpDown()
{
manualAction(HEAD_LIFT_UPDW);
}
// 机头上升
void Machine::sewHeadLiftUp()
{
manualAction(HEAD_LIFT_UP);
}
// 机头下降
void Machine::sewHeadLiftDown()
{
manualAction(HEAD_LIFT_DOWN);
}
// 缝纫主轴研车
void Machine::sewingMsRun()
{
manualAction(SEWING_MS_RUN);
}
// 回角点
void Machine::gotoGorner(int nNum)
{
mcWorkCmd(WORK_GOTO_GORNER,nNum);
}
// 手动加油
void Machine::manualOil(int nNum)
{
mcWorkCmd(WORK_ACT_OIL,nNum);
}
//梭盘计数复位
void Machine::shuttleCounter()
{
manualAction(RESET_SHUT_COUNTER);
}
//自动换一个梭
void Machine::changeOneShuttle()
{
manualAction(AUTO_CHANGE_ONE_SHUT);
}
//安装第一个梭壳
void Machine::installShuttle()
{
manualAction(INSTALL_FIRST_BOBBIN);
}
//缝纫状态
void Machine::sewBuff()
{
manualAction(SHUT_INTO_INDX_STA);
}
//换梭盘状态
void Machine::shuttleDiskBuff()
{
manualAction(SHUT_INTO_TAKE_PLATE);
}
//将旋梭从梭盘到机头
void Machine::shuttleToHead()
{
manualAction(SHUT_FROM_PLATE_TO_HEAD);
}
// 将旋梭从机头拿到梭盘
void Machine::headToShuttle()
{
manualAction(SHUT_FROM_HEAD_TO_PLATE);
}
// 所有主轴研车
void Machine::allMsRun()
{
manualAction(ALL_MS_RUN);
}
// 机头升降
void Machine::headLift()
{
manualAction(SEW_HEAD_LIFT);
}
// 针梭复位
void Machine::msReset()
{
manualAction(SEW_MS_RESET);
}
// 针梭去穿线位
void Machine::msToFix()
{
manualAction(SEW_MS_TO_FIX);
}
// 手动移框
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::sewCutThread(int nNum)
{
manualAction(CUT_THREAD,0,nNum); // 加0的原因是主控上用的是para3
}
// 缝纫主轴点动
void Machine::sewJog()
{
manualAction(SEWING_MS_JOG);
}
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_START);
}
// 回定位点
void Machine::gotoAnchor()
{
mcWorkCmd(WORK_GOTO_ANCHOR);
}
// 定偏移点
void Machine::setOffsetPos()
{
mcWorkCmd(WORK_SET_OFFSET);
}
// 回偏移点
void Machine::gotoOffsetPos()
{
mcWorkCmd(WORK_GOTO_OFFSET);
}
// 边框检查
void Machine::checkFrame()
{
mcWorkCmd(WORK_CHECK_FRAME);
}
// 空走边框
void Machine::simulateFrame()
{
mcWorkCmd(WORK_SIMULATION_FRAME);
}
/*
#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);
}
void Machine::gotoShuttlePos()
{
mcWorkCmd( WORK_GOTO_CHGBO );
}
/*
#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);
}
//----------------------------
// 移动到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;
}
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 ) //升级等文件(小文件)
{
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);
}
}
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)
{
}
else if( m_transCtrl.fileType == FILE_TYPE_PGM )
{
qDebug() << "UpdateFirmware";
updateFirmware();
}
}
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::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;
}
// 启动文件传输
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)
{
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
{
return ;
}
if (rslt == 0)
{
if( transCtrl.fileType == FILE_TYPE_DAT)
{
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));
}
}
}
// 文件数据传输
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)
{
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
{
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::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::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)
{
actionByhand(TEST_THREADBK, type, needle);
}
// 设置机器的密钥
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));
}