QuiltingHMI/machine/machine.cpp

1963 lines
53 KiB
C++
Raw Normal View History

2024-02-06 07:10:48 +00:00
#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));
}