📄 ccd_commcenter.c
字号:
if(FILE_PATHLEN == commVar.fStep) {
if(readcount < sizeof(UInt32)) {
//包体尚未接收到最小数据长度
continue;
}
//计算包体的CRC16
commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, sizeof(UInt32));
//读取路径长度
commVar.fcb.PathLen = CommCenter_ntohl( CommCenter_strtol(commVar.szStoreBuffer + commVar.nPotS) );
if(commVar.fcb.PathLen <= 0 || commVar.fcb.PathLen >= MAXPATH_LEN) {//文件路径长度字段错误
//文件错误报告, 处理
CommCenter_ErrorDealEvent(&commVar, 0x00000006, 0x00000006);
continue;
}
#ifdef debug_modul
sprintf((char *)szOutPutBuff, (char *)"==== COM4: %d %d %d\n", commVar.fcb.PathLen, commVar.nPotS, commVar.nPotE);
EOS_Write(commVar.deBugfp, szOutPutBuff, StrLen(szOutPutBuff));
#endif
//更新其它数据
commVar.fStep = FILE_PATH;
commVar.nPotS+= sizeof(UInt32);
readcount -= sizeof(UInt32);
//继续处理缓冲区
} //end 取文件路径长度
//3. 取文件路径
if(FILE_PATH == commVar.fStep) {
if(readcount < commVar.fcb.PathLen) {
//包体尚未接收到完整文件路径信息
continue;
}
//计算包体的CRC16
commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, commVar.fcb.PathLen);
//更新文件路径
StrNCopy(commVar.fcb.Path, commVar.szStoreBuffer + commVar.nPotS, commVar.fcb.PathLen);
#ifdef debug_modul
sprintf((char *)szOutPutBuff, (char *)"==== PATH: %s %d %d\n", commVar.fcb.Path, commVar.nPotS, commVar.nPotE);
EOS_Write(commVar.deBugfp, szOutPutBuff, StrLen(szOutPutBuff));
#endif
//创建可能的目标目录(假定前3个是盘符, 如C:\)
MdWithFile(commVar.fcb.Path, commVar.fcb.Path + StrLen((Char *)"C:\\"));
//打开或创建目标文件
if(0 <=commVar.hFile) EOS_Close(commVar.hFile);
commVar.hFile = EOS_Open(commVar.fcb.Path, PO_CREAT|PO_TRUNC|PO_BINARY|PO_WRONLY, PS_IWRITE);
if(0 > commVar.hFile) {
//打开或创建目标文件失败
CommCenter_ErrorDealEvent(&commVar, 0x00000005, 0x00000007);
continue;
}
//更新其它数据
commVar.fStep = FILE_LENTH;
commVar.nPotS+= commVar.fcb.PathLen;
readcount -= commVar.fcb.PathLen;
//继续处理缓冲区
} //end 取文件路径
//4. 取文件长度
if(FILE_LENTH == commVar.fStep) {
if(readcount < sizeof(UInt32)) {
//包体尚未接收到完整文件路径信息
continue;
}
//计算至文件内容的CRC16
commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, sizeof(UInt32));
//更新文件长度
commVar.fcb.len = CommCenter_ntohl( CommCenter_strtol(commVar.szStoreBuffer + commVar.nPotS) );
if(0 >= commVar.fcb.len) {//文件长度字段错误
//文件错误报告,处理
CommCenter_ErrorDealEvent(&commVar, 0x00000006, 0x00000008);
continue;
}
#ifdef debug_modul
sprintf((char *)szOutPutBuff, (char *)"==== COM6: %d %d %d\n", commVar.fcb.len, commVar.nPotS, commVar.nPotE);
EOS_Write(commVar.deBugfp, szOutPutBuff, StrLen(szOutPutBuff));
#endif
//更新相关数据
commVar.fStep = FILE_DATA;
commVar.nPotS+= sizeof(UInt32);
commVar.fcb.WriteLen = 0;
readcount -= sizeof(UInt32);
//继续处理缓冲区
} //end 取文件长度
//5. 取文件数据
if(CommCenter_FILEDATA == commVar.nStep) {
if(readcount <= 0) {
//包体尚未接收到最小数据长度
continue;
}
if(commVar.fcb.WriteLen < commVar.fcb.len) {
tmpWcount = min(readcount, commVar.fcb.len - commVar.fcb.WriteLen);
//计算当前所读数据的CRC16
commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, tmpWcount);
if(tmpWcount != EOS_Write(commVar.hFile, commVar.szStoreBuffer+commVar.nPotS, tmpWcount)) {
//文件写入失败
CommCenter_ErrorDealEvent(&commVar, 0x00000006, 0x00000009);
continue;
}
readcount -= tmpWcount;
commVar.fcb.WriteLen += tmpWcount; //保存当前所读数据到文件
//向父进程发送消息,要求显示“文件下载进度”
CommCenterThread_Inform(AppRequest_GetFatherPid(), WinGetWindowHwndId(g__winP), CommCenter_FILEDATA, commVar.fcb.nId, commVar.fcb.WriteLen, commVar.fcb.len);
//汇报已经正确接收并处理完报文
CommCenter_ErrorDealEvent(&commVar, 0x00000000, sizeof(CommCenter_PACKETHEADType)+sizeof(UInt32)+sizeof(UInt32)+commVar.fcb.PathLen+sizeof(UInt32)+commVar.fcb.WriteLen);
}
//在此, 可以认为已经处理完所读的数据, 更新相关数据
commVar.nPotS = sizeof(CommCenter_PACKETHEADType);
commVar.nPotE = sizeof(CommCenter_PACKETHEADType);
if(commVar.fcb.WriteLen >= commVar.fcb.len) { //写完一个文件
if(0 <= commVar.hFile) {
EOS_Close(commVar.hFile);
commVar.hFile = -1;
}
//校验报文的CRC16
if(FALSE == IsValid_CRC16(commVar.pcb->cCRC, commVar.CRC) ) {
//文件传输出错
CommCenter_ErrorDealEvent(&commVar, 0x00000003, 0x0000000A);
continue;
}
//汇报已经正确写入文件
CommCenter_ErrorDealEvent(&commVar, 0x00000000, sizeof(CommCenter_PACKETHEADType)+sizeof(UInt32)+sizeof(UInt32)+commVar.fcb.PathLen+sizeof(UInt32)+commVar.fcb.WriteLen);
//更新数据
commVar.nStat = CommCenter_PACKETHEAD;
commVar.fStep = FILE_INDEX;
commVar.nPotS = 0;
commVar.nPotE = 0;
if(commVar.fcb.nId >= commVar.FiletotleCount) {
MemSet(&commVar.fcb, 0, sizeof(CommCenter_FILEINDEXType));
commVar.nStep = CommCenter_FILEWAIT;
commVar.FiletotleCount = 0;
//向父进程发送消息,要求显示“文件传输完毕,进入文件传输等待状态”
CommCenterThread_Inform(AppRequest_GetFatherPid(), WinGetWindowHwndId(g__winP), CommCenter_FILEWAIT, 0, 0, 0);
}
} //end if(commVar.fcb.WriteLen >= commVar.fcb.len)
} //end 取文件数据
} //end 发送文件
} //end 接收报体
} // end while(FALSE == bExitThread)
if(0 <= commVar.comId) {
Close(commVar.comId);
commVar.comId = -1;
}
if(0 <= commVar.hFile) {
EOS_Close(commVar.hFile);
commVar.hFile = -1;
}
#ifdef debug_modul
if(0 <= commVar.deBugfp) {
EOS_Write(commVar.deBugfp, (Char *)"thread end!\n", StrLen((Char *)"thread end!\n"));
EOS_Close(commVar.deBugfp);
}
#endif
return TRUE;
}
////////////////////////////////////////
// 串口下载窗体处理函数
Boolean CommCenterAppFrmProgressHandleEvent(void *globalVarPtr, WinHandle formP, EventPtr eventP)
{
//CommCenter_DEMOGVRType *pVar = (CommCenter_DEMOGVRType *)globalVarPtr;
Boolean handled = FALSE;
Char szTxt[512];
LabelType *pLab_BarHint = WinGetControlPtr(formP, Com_ID_FrmProgress_BarHint_FrmProgress);
RectangleType rtCtl;
Int32 r;
switch(eventP->eType) {
case winInitEvent:
//启动IO线程
g__winP = formP;
r = AppRequest_MethodExec((Char *)"Comm_IOType", (Char *)APP_NAME_CDD_COMMCENTER, (Char *)"Comm_IO", NULL, 0);
handled = TRUE;
break;
case winPaintEvent:
WinDrawWindow(formP);
handled = TRUE;
break;
case RSPCOM_MSG:
switch(eventP->sParam1){
case CommCenter_FILEWAIT://等待文件传输
sprintf((char *)szTxt, (char *)"正在等待文件传输...");
break;
case CommCenter_FILEREQ://传输文件请求
sprintf((char *)szTxt, (char *)"开始传输文件,共%d个", eventP->lParam3);
break;
case CommCenter_FILEDATA://传输文件内容
sprintf((char *)szTxt, (char *)"目前传输: %d字节", eventP->lParam3);
break;
default: break;
}
//更新文件下载进度说明
if(0 != StrLen(szTxt)) WinSetControlCaption(formP, Com_ID_FrmProgress_TxtHint_FrmProgress, szTxt, FALSE);
if(CommCenter_FILEDATA == eventP->sParam1) {
//更新文件下载进度条
CtlGetBounds(pLab_BarHint, &rtCtl);
rtCtl.extent.X = (Int16)(162*eventP->lParam3/eventP->lParam4);
CtlSetBounds(pLab_BarHint, &rtCtl);
WinDrawControl(formP, Com_ID_FrmProgress_BarHint_FrmProgress);
if(eventP->lParam3 == eventP->lParam4) {
CtlGetBounds(pLab_BarHint, &rtCtl);
rtCtl.extent.X = 0;
CtlSetBounds(pLab_BarHint, &rtCtl);
WinDrawControl(formP, Com_ID_FrmProgress_Field1114);
}
}
handled = TRUE;
break;
case ctlSelectEvent:
if(Com_ID_FrmProgress_Close_FrmProgress == eventP->sParam1) {
g__winP = NULL;
WinCloseWindow(formP);
AppSendStopEvent();
handled = TRUE;
}
break;
}
return handled;
}
//////////////////////////////////////////////////////////////////////////
// 串口下载窗体处理函数
//
Boolean App_CCD_CommCenterAppHandleEvent(void *globalVarPtr, EventPtr eventP)
{
//CommCenter_DEMOGVRType * pVar = (CommCenter_DEMOGVRType *)globalVarPtr;
WinHandle formP;
Boolean handled = FALSE;
if (eventP->eType == frmOpenEvent)
{
formP = WinGetWindowPtrByResId(eventP->sParam1);
WinSetActiveWindow(formP);
switch (eventP->sParam1)
{
case Com_ID_FrmProgress:
WinSetEventHandlerEx (formP, CommCenterAppFrmProgressHandleEvent);
break;
default: break;
}
handled = TRUE;
}
return handled;
}
//////////////////////////////////////////////////////////////////////////
// 串口下载应用入口
//
void CCD_CommCenterAppMain(UInt32 cmd, void *cmdPBP)
{
CommCenter_DEMOGVRType *pVar;
Int32 r;
switch(cmd)
{
case SYSTEM_START_REGISTER: // 终端操作系统启动时进入
case SYSTEM_RESTART_REGISTER: //终端操作系统重新启动时进入
r = AppRegister_DataTypeAdd((Char *)"Comm_IOType", NULL);
r = AppRegister_MethodAdd((Char *)"Comm_IOType", (Char *)"Comm_IO", 2, METHOD_THREAD);
break;
case 2:
CommCenter_IOThread(); //线程处理过程
break;
case 0: // 在终端操作界面点击图标时进入
//应用进行本功能的初始化工作
pVar = mcMalloc(sizeof(CommCenter_DEMOGVRType));
MemSet(pVar, 0, sizeof(CommCenter_DEMOGVRType));
//初始化并注册GUI应用,设置应用消息处理函数和主窗口ID
WM_GuiAppInit(pVar, App_CCD_CommCenterAppHandleEvent, Com_ID_FrmProgress);
//缺省的事件处理循环,一般来说,不要更改
AppDefaultEventLoop();
//注销GUI应用,释放占用的资源
WM_GuiAppStop();
//应用进行本功能的资源释放工作
mcFree(pVar);
break;
default:
break;
};
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -