PlotterHMI/machine/machine.cpp

1068 lines
32 KiB
C++
Raw Normal View History

2024-02-06 06:19:53 +00:00
#include "machine.h"
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_connected = 0;
m_mcParaEn = 0;
m_wkParaEn = 0;
m_transBreak = 0;
m_pTcpClient = new TcpClient();
m_pTcpBmpThread = new QThread();
m_pCreatPrintDat = new CreatPrintBmp();
m_mcPrintInfo.clear();
memset(&m_transCtrl, 0, sizeof(FileTransCtrl)); // 文件传输信息
m_transCtrl.pAppHead = new AppFileHead;
m_transCtrl.pBmpHead = new CompBmpHead;
m_transCtrl.pDatBuff = new u8[MAX_FILE_SIZE];
m_pPlotFileList = new PlotFileList();
memset(m_pPlotFileList,0,sizeof(PlotFileList));
m_pCompBmpHead = new CompBmpHead();
memset(m_pCompBmpHead,0,sizeof(CompBmpHead));
m_pSendTimer = new QTimer(this);
m_pSendTimer->setInterval(100); // 设置定时间隔100毫秒
connect(m_pSendTimer, SIGNAL(timeout()), this, SLOT(onSendTimer()));
initDataExFuns();
}
Machine::~Machine()
{
if(m_pTcpBmpThread != NULL)
{
m_pTcpBmpThread->quit();
m_pTcpBmpThread->wait();
delete m_pTcpBmpThread;
}
if(m_pSendTimer != NULL)
{
m_pSendTimer->stop();
delete m_pSendTimer;
m_pSendTimer = NULL;
}
if (m_transCtrl.pAppHead != NULL)
{
delete []m_transCtrl.pAppHead;
m_transCtrl.pAppHead = NULL;
}
if (m_transCtrl.pBmpHead != NULL)
{
delete []m_transCtrl.pBmpHead;
m_transCtrl.pBmpHead = NULL;
}
if (m_transCtrl.pDatBuff != NULL)
{
delete []m_transCtrl.pDatBuff;
m_transCtrl.pDatBuff = NULL;
}
}
void Machine::startFileTrans(FileTransCtrl &transCtrl)
{
2024-03-22 07:58:53 +00:00
int rslt = 0;
2024-02-06 06:19:53 +00:00
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_PLOT)
{
rslt = packetAVLDP(&sendPacket.packet, (u8*)transCtrl.pBmpHead, sizeof(CompBmpHead));
}
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET+sizeof(CompBmpHead));
emit(siSendData(dat));
}
}
void Machine::startFileDyTrans(FileTransCtrl &transCtrl)
{
int rslt = -1;
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
{
return ;
}
if (rslt == 0)
{
if( transCtrl.fileType == FILE_TYPE_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_PLOT)
{
actsize = transCtrl.pBmpHead->datSize - pktidx*transCtrl.packetSize;
if (actsize >= transCtrl.packetSize)
{
actsize = transCtrl.packetSize;
}
else
{
memset(buff, 0, MAX_EXDP_LEN);
}
}
else
{
actsize = 0;
}
memcpy(buff, &(transCtrl.pDatBuff[pktidx*transCtrl.packetSize]), actsize);
qDebug("TransFileData pktidx=%d", pktidx);
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::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::setMcStatusAsMc(u8 *buff, u16 len, int toggle)
{
memcpy(&m_mcStatus, buff, len);
emit(siStatusChange(toggle));
}
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));
}
int Machine::dySendFileProc(int type, int idx, int id, u8 *pDatBuff)
{
if (pDatBuff == NULL)
{
return -1;
}
int datSize = sizeof(pDatBuff);
if (datSize <= 0 || datSize > MAX_FILE_SIZE)
{
qDebug("datSize <= 0 || datSize > 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.pDatBuff, pDatBuff, datSize);
m_transCtrl.packetSize = MAX_EXDP_LEN;
m_transCtrl.packetNum = (datSize + 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::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::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::deleteFilePrintDat(int fileIdx)
{
m_pCreatPrintDat->setDeleteFile(&m_mcPrintInfo,fileIdx);
2024-02-06 06:19:53 +00:00
}
void Machine::moveFilePrintDat(int fileIdx,int dir)
{
m_pCreatPrintDat->setMoveFile(&m_mcPrintInfo,fileIdx,dir);
2024-02-06 06:19:53 +00:00
}
void Machine::invalidateWorkFile(int idx)
{
setMcStatus(MC_INVALID_FILE, idx);
}
void Machine::creatPrintDat(int fileIdx,u32 markSpace,int setFlag)
2024-02-06 06:19:53 +00:00
{
if(setFlag == 1)
{
m_pCreatPrintDat->setMcPrintInfo(fileIdx,markSpace,&m_mcPrintInfo);
}
2024-02-06 06:19:53 +00:00
emit siCreatData();
}
void Machine::stopPrint()
{
m_pCreatPrintDat->stopCreatPrintDat();
m_transBreak = 1;
}
2024-02-06 06:19:53 +00:00
void Machine::setIpAndPort(QString mcName, QString serverIp, quint16 serverPort, QString localIp, quint16 localPort)
{
m_mcName = mcName;
m_mcIp = serverIp;
m_pTcpClient->setIpAndPort(serverIp,serverPort,localIp,localPort);
}
void Machine::startCommunication()
{
//TCP通讯
m_pTcpClient->moveToThread(m_pTcpBmpThread); // 移动对象到线程中
connect(m_pTcpBmpThread, SIGNAL(started()), m_pTcpClient, SLOT(connectToServer()) );
connect(m_pTcpBmpThread, 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_pCreatPrintDat->moveToThread(m_pTcpBmpThread);
connect(m_pTcpBmpThread, SIGNAL(finished()), m_pCreatPrintDat, SLOT(deleteLater()) ); // 退出删除对象
connect(this, SIGNAL(siCreatData()),
m_pCreatPrintDat, SLOT(slotCreatBmp()), Qt::QueuedConnection); // 开始创建位图的槽
2024-02-06 06:19:53 +00:00
connect(this, SIGNAL(siSendDataDone()),
m_pCreatPrintDat, SLOT(slotCreatNextBmpBlockDat()), Qt::QueuedConnection); // 创建位图块并发送的槽
2024-02-06 06:19:53 +00:00
connect(this, SIGNAL(siCreatBmpBlockDatAndSend()),
m_pCreatPrintDat, SLOT(slotCreatNextBmpBlockDat()), Qt::QueuedConnection); // 创建位图块并发送的槽
2024-02-06 06:19:53 +00:00
connect(m_pCreatPrintDat, SIGNAL(siSendFileListDatToMc(int)),
this, SLOT(slotSendPlotFileListToMc(int)), Qt::QueuedConnection); // 发送文件列表的槽
connect(m_pCreatPrintDat, SIGNAL(siSendDatToMc(QByteArray)),
this, SLOT(slotSendDatToMc(QByteArray)), Qt::QueuedConnection); // 发送数据的槽
connect(m_pCreatPrintDat, SIGNAL(siOneFilePrintFinished(int,int,int)),
this, SIGNAL(siOneFilePrintFinished(int,int,int)), Qt::AutoConnection); // 完成一个文件的打印
connect(m_pCreatPrintDat, SIGNAL(siRefreshPrintProgress(int,int)),
this, SIGNAL(siRefreshPrintProgress(int,int)), Qt::AutoConnection); // 刷新打印进度
2024-02-06 06:19:53 +00:00
m_pTcpBmpThread->start(); // 启动线程
}
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::getParasFromMachine(int type, int id)
{
int mctype = -1;
int wktype = -1;
if (type == -1)
{
mctype = MCPARA_MACH;
wktype = MCPARA_WORK;
m_mcParaEn = 0;
m_wkParaEn = 0;
}
else
{
if(type == MCPARA_MACH)
{
mctype = MCPARA_MACH;
m_mcParaEn = 0;
}
if(type == MCPARA_WORK)
{
wktype = MCPARA_WORK;
m_wkParaEn = 0;
}
}
OperPacket sendPacket;
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.getMcParas.cmdCode = UCMD_GET_MC_PARAS;
if (mctype == MCPARA_MACH)
{
sendPacket.getMcParas.paraType = (u16)mctype;
}
if (wktype == 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::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::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::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::setParasToMachine(ParaStruct &para)
{
int rslt;
OperPacket sendPacket;
int size = sizeof(ParaStruct);
memset(&sendPacket, 0, sizeof(OperPacket));
//sendPacket.setParas.cmdCode = UCMD_SET_MC_PARAS;
rslt = packetAVLDP(&sendPacket.packet, (u8*)&para, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
}
}
void Machine::setAMcPara(int id, u32 value)
{
setAParasToMachine(MCPARA_MACH, id, value);
}
void Machine::setAWkPara(int id, u32 value)
{
setAParasToMachine(MCPARA_WORK, id, value);
}
// 启动工作
void Machine::startWork()
{
mcWorkCmd(WORK_START);
}
// 暂停工作
void Machine::pauseWork()
{
mcWorkCmd(WORK_PAUSE);
}
int Machine::sendFileProc( int idx, u8 *dat, int datSize)
{
if(dat == NULL)
{
return -1;
}
if (datSize <= 0 || datSize > MAX_FILE_SIZE)
{
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.fileIdx = (u8)idx;
memcpy(m_transCtrl.pDatBuff, dat, datSize);
m_transCtrl.packetSize = MAX_EXDP_LEN;
m_transCtrl.packetNum = (datSize + MAX_EXDP_LEN - 1) / MAX_EXDP_LEN;
qDebug("StartFileTrans, fileType=%d, fileIdx=%d, packetNum=%d, ",
m_transCtrl.fileType, m_transCtrl.fileIdx, m_transCtrl.packetNum);
m_transCtrl.transphase = SEND_STEP1;
m_transCtrl.filetransing = 1;
m_pSendTimer->start();
return 0;
}
void Machine::slotConnectSta(int sta)
{
m_connected = sta;
}
void Machine::slotConnectErr(QString errinfo)
{
if(errinfo.length() <= 0){}
}
// 接收到数据的槽函数
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.exLen, operpkt->dSendMcStatus.toggle);
break;
}
case DCMD_SEND_MC_PARAS: // 发送机器参数
{
int type;
type = operpkt->dSendMcParas.paraType;
if (operpkt->dSendMcParas.exLen == sizeof(ParaStruct))
{
if (type == MCPARA_MACH)
{
memcpy(&m_mcPara, operpkt->dSendMcParas.exData, sizeof(ParaStruct));
m_mcParaEn = 1;
}
else if (type == MCPARA_WORK)
{
memcpy(&m_wkPara, operpkt->dSendMcParas.exData, sizeof(ParaStruct));
m_wkParaEn = 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 == MCPARA_MACH)
{
memcpy((u8*)(&m_mcPara)+idx, operpkt->dSendMcParas.exData, sizeof(u32));
m_mcParaEn = 1;
}
else if (type == MCPARA_WORK)
{
memcpy((u8*)(&m_wkPara)+idx, operpkt->dSendMcParas.exData, sizeof(u32));
m_wkParaEn = 1;
}
else
{
break;
}
emit(siParaChange(type, id));
}
}
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;
}
default:
break;
}
}
else
{
break;
}
}while(1);
}
void Machine::onSendTimer()
{
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("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);
int thissendnum = 0;
int totalsendnum = 0;
int send_count = 400;
if ( m_transCtrl.fileType == FILE_TYPE_PGM) //升级等文件(小文件)
{
send_count = 25;
}
u8 mod, temp;
for (int i = 0; i < m_transCtrl.lenBmp; i++)
{
temp = m_transCtrl.rsvBitmap[i];
mod = 0x01;
for (int 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 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;
if( m_transCtrl.fileType == FILE_TYPE_PGM )
{
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::slotSendDatToMc(QByteArray dat)
2024-02-06 06:19:53 +00:00
{
2024-03-22 07:58:53 +00:00
//if(m_connected == Connected)
2024-02-06 06:19:53 +00:00
{
if (dat.size() <= 0 || m_pCompBmpHead == NULL)
{
return;
}
QTime delayTime;
int counter = 0;
delayTime.start();
if (m_transCtrl.filetransing != 0) // 已经有文件在传输
{
return;
}
2024-02-06 06:19:53 +00:00
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);//进度条
}
qDebug()<<"dat.size()"<<dat.size();
memcpy((u8*)m_pCompBmpHead,(u8*)dat.data(),sizeof(CompBmpHead));
2024-02-06 06:19:53 +00:00
m_pCompBmpHead->fileId = m_pPlotFileList->fileId;
if (m_pCompBmpHead->datSize <= 0 || m_pCompBmpHead->datSize > MAX_FILE_SIZE)
{
qDebug("m_pCompBmpHead->datSize <= 0 || m_pCompBmpHead->datSize > MAX_FILE_SIZE, not support");
return;
}
m_transBreak = 0;
m_transCtrl.fileType = (u8)FILE_TYPE_PLOT;
m_transCtrl.fileId = m_pCompBmpHead->fileId;
memcpy(m_transCtrl.pBmpHead, m_pCompBmpHead, sizeof(CompBmpHead));
memcpy(m_transCtrl.pDatBuff, dat.data()+sizeof(CompBmpHead), m_pCompBmpHead->datSize);
2024-02-06 06:19:53 +00:00
m_transCtrl.packetSize = MAX_EXDP_LEN;
m_transCtrl.packetNum = (m_pCompBmpHead->datSize + 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();
qDebug()<<"slotSendDatToMc";
return;
}
}
void Machine::slotSendPlotFileListToMc(int idx)
{
if(m_connected == Connected)
{
int oft = (int)(m_mcPrintInfo.m_filesList[idx].m_startPoint*MMPIXELY);
qDebug()<<"slotSendPlotFileListToMc";
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
u32 id =qrand() % (UINT16_MAX);//产生0到UINT16_MAX的随机数
m_pPlotFileList->fileId = id;
2024-03-22 07:58:53 +00:00
m_pPlotFileList->totalWidth = (m_mcPrintInfo.m_filesList[idx].m_sendPic.width() - oft) * m_mcPrintInfo.m_filesList[idx].m_printNum;
m_pPlotFileList->totalHeight = m_mcPrintInfo.m_filesList[idx].m_sendPic.height();
m_pPlotFileList->blkNums = m_mcPrintInfo.m_filesList[idx].m_totalBlocks;
2024-02-06 06:19:53 +00:00
m_pPlotFileList->blkWidth = PIXMAPWIDTH;
int rslt;
OperPacket sendPacket;
int size = sizeof(PlotFileList);
memset(&sendPacket, 0, sizeof(OperPacket));
sendPacket.setParas.cmdCode = UCMD_SET_FILE_LIST;
rslt = packetAVLDP(&sendPacket.packet, (u8*)m_pPlotFileList, size);
if (rslt == 0)
{
QByteArray dat((char*)(&sendPacket.packet), LEN_NORMAL_PACKET + size);
emit(siSendData(dat));
emit siCreatBmpBlockDatAndSend();
}
}
}
void Machine::breakFileTrans()
{
m_transBreak = 1;
}