From 8856013295d01571f3602bc5abfafd92d564db94 Mon Sep 17 00:00:00 2001 From: huyizhong Date: Sun, 23 Jun 2024 18:13:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=B9=B6=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E6=91=84=E5=83=8F=E6=9C=BA=E6=8B=8D=E7=85=A7=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E5=AE=8C=E5=96=84=E4=BA=91=E5=8F=B0=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E5=8F=91=E9=80=81=E9=80=BB=E8=BE=91=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestComm/app/src/main/cpp/SensorsProtocol.cpp | 351 ++++++++--- TestComm/app/src/main/cpp/SensorsProtocol.h | 6 + TestComm/app/src/main/cpp/WeatherComm.cpp | 574 ++++++++++++++++++ TestComm/app/src/main/cpp/WeatherComm.h | 51 ++ TestComm/app/src/main/cpp/native-lib.cpp | 1 + app/src/main/cpp/SensorsProtocol.cpp | 351 ++++++++--- app/src/main/cpp/SensorsProtocol.h | 6 + 7 files changed, 1146 insertions(+), 194 deletions(-) create mode 100644 TestComm/app/src/main/cpp/WeatherComm.cpp create mode 100644 TestComm/app/src/main/cpp/WeatherComm.h diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.cpp b/TestComm/app/src/main/cpp/SensorsProtocol.cpp index 5648eb27..2f6f0b0f 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.cpp +++ b/TestComm/app/src/main/cpp/SensorsProtocol.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "GPIOControl.h" #include "serialComm.h" @@ -738,7 +739,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) { int i, j; -#if 1 +#if 0 srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 for(i=0; i MAX_SERIAL_PORT_NUM)) + return; + serialport[i].Retry = 0; + //serialport[i].RetryTime = 500/TIMER_CNT; + serialport[i].RetryTime = 3000/TIMER_CNT; + serialport[i].WaitTime = 0; serialport[i].m_iRevStatus = 0; serialport[i].m_iRecvLen = 0; serialport[i].m_iNeedRevLength = 0; serialport[i].fd = -1; - ClearCmdAllFlag(i); + memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区 + ClearCmdFormPollCmdBuf(i); // 初始化串口使用状态 for(i=0; i 6*1000/TIMER_CNT) + //if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT) { srdt.ms_dev[i].IsNeedSerial = 0; //srdt.sampling &= 0xFB; @@ -1522,7 +1564,10 @@ void GM_AllSerialComRecv(void) if(recvlen < 1) break; sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); - BytestreamLOG(buf, recvbuf, recvlen, 'I'); + if(recvlen < 101) + BytestreamLOG(buf, recvbuf, recvlen, 'I'); + else + LOGI("%s", buf); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); @@ -1679,40 +1724,134 @@ void SerialDataProcess(int devidx, u_char *buf, int len) break; case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ break; - case RESERVE5_PROTOCOL: /* 网络安全加密协议*/ - //EncryptRecvData(devidx, buf, len); - break; - case SERIALCAMERA_PROTOCOL: /* 青青子木串口摄像机协议*/ + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + CameraRecvData(devidx, buf, len); break; } } +/******************************************************************* +* 读 摄像机 数据 * +*******************************************************************/ +void CameraRecvData(int devno, u_char *buf, int len) +{ + int i; + SIO_PARAM_SERIAL_DEF *pPortParam; + + if((devno<0) || (devno > MAX_SERIAL_DEV_NUM)) + { + return; + } + pPortParam = &serialport[devparam[devno].commid]; + + for(i=0; im_iRevStatus) + { + case 0: // 0x68 + pPortParam->m_iRecvLen = 0; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 1: // len1 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + break; + case 2: // len2 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + pPortParam->m_iNeedRevLength = pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2]*256+buf[i]+5; + break; + case 3: // 0x68 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iNeedRevLength--; + if(0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(pPortParam->m_iNeedRevLength > 0) + break; + if(buf[i] != 0x16) + { + pPortParam->m_iRevStatus=18; + break; + } + + if(pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2] == + CalLpc( &pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen-6 )) + { + CameraPhotoPortDataProcess(devno); + pPortParam->m_iRevStatus = 0; + pPortParam->RevCmdFlag = 1; + } + else + { + pPortParam->m_iRevStatus = 0; + } + pPortParam->m_iRecvLen = 0; + break; + case 255:// 错误接收数据 + default: + if(buf[i] == 0x68) + { + pPortParam->m_iRevStatus = 1; + pPortParam->m_iRecvLen = 1; + pPortParam->m_au8RecvBuf[0] = buf[i]; + } + else if(buf[i] == 0x16) + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus = 0; + pPortParam->m_iRecvLen = 0; + } + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; + } + } +} + /********************************************************************************* CameraPhoto 端口数据处理 **********************************************************************************/ -void CameraPhotoPortDataProcess( int port) +void CameraPhotoPortDataProcess( int devno) { RTUMSG rtumsg; SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *serialport; + SIO_PARAM_SERIAL_DEF *curserial; int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime; char szbuf[128]; WORD uDevAddr; BYTE cmdidx, recvend; - pPortParam = &srdt.ms_dev[port]; - serialport = &serialport[pPortParam->UseSerialidx]; + pPortParam = &srdt.ms_dev[devno]; + curserial = &serialport[devparam[devno].commid]; memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData)); - memcpy((void*)rtumsg.MsgData, (void*)serialport->m_au8RecvBuf, pPortParam->m_iRecvLen); - rtumsg.MsgLen = pPortParam->m_iRecvLen; - rtumsg.PortIdx = port; - cmdidx = serialport->m_au8RecvBuf[5]; - uDevAddr = serialport->m_au8RecvBuf[4]; + memcpy((void*)rtumsg.MsgData, (void*)curserial->m_au8RecvBuf, curserial->m_iRecvLen); + rtumsg.MsgLen = curserial->m_iRecvLen; + rtumsg.PortIdx = devparam[devno].commid; + cmdidx = curserial->m_au8RecvBuf[5]; + uDevAddr = curserial->m_au8RecvBuf[4]; //sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx); //DebugStringPrintf(szbuf, strlen(szbuf), 1); - if(uDevAddr != devparam[port].devaddr) + if(uDevAddr != devparam[devno].devaddr) return; switch(cmdidx) @@ -1724,8 +1863,7 @@ void CameraPhotoPortDataProcess( int port) if(srdt.RephotographCnt > 2) { pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGE("因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); } break; } @@ -1736,41 +1874,32 @@ void CameraPhotoPortDataProcess( int port) img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8); srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); - sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - //presetno = (int)GetPhotoPresetNo(pPortParam->CameraChannel); + srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); + sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); + LOGV("%s", szbuf); presetno = (int)rtumsg.MsgData[i+8]; - //if(0 == netportparam.InitTimeFlag) - { - serialport->RevCmdFlag = 1; - srdt.sendphotocmdcnt = 0; - pPortParam->SerialCmdidx = 10001; -/* 保存图片*/ - //break - } - serialport->RevCmdFlag = 1; + curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; case 0x11: /* 图片数据包*/ - // if(0 == netportparam.InitTimeFlag) - { - serialport->RevCmdFlag = 1; - srdt.sendphotocmdcnt = 0; - pPortParam->SerialCmdidx = 10001; -/* 保存图片*/ - //break; - } i = 6; iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256; packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256; sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - serialport->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = 0; + LOGV("%s", szbuf); + curserial->RevCmdFlag = 1; + pPortParam->FirstCmdTimeCnt = get_msec(); if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) { + if(iNo == srdt.imagepacketnum) + recvend = 1; + else + recvend = 0; + + if(packsize > MAX_PHOTO_FRAME_LEN) + recvend = 0xFF; + if(1 == recvend) pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ else if(0xFF == recvend) @@ -1792,6 +1921,7 @@ void CameraPhotoPortDataProcess( int port) srdt.errorPhotoNoCnt++; sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); + LOGE("%s", szbuf); if(srdt.errorPhotoNoCnt > 5) { pPortParam->SerialCmdidx = 0; @@ -1800,16 +1930,15 @@ void CameraPhotoPortDataProcess( int port) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGE("%s", szbuf); } } break; case 0x03: - sprintf(szbuf, "设置波特率%d成功", devparam[port].baudrate); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - //pPortParam->Baud = serialport->Baud; + sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); + LOGD("%s", szbuf); pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; - serialport->RevCmdFlag = 1; + curserial->RevCmdFlag = 1; pPortParam->FirstCmdTimeCnt = 0; break; case 0x15: @@ -1817,7 +1946,7 @@ void CameraPhotoPortDataProcess( int port) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "没有历史图片!结束读取图片!"); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGI("%s", szbuf); break; } i = 6; @@ -1827,20 +1956,11 @@ void CameraPhotoPortDataProcess( int port) img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8); srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); - //presetno = netportparam.CurPresetno[pPortParam->CameraChannel-1]; + srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); presetno = rtumsg.MsgData[i+8]; - sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - //if(0 == netportparam.InitTimeFlag) - { - serialport->RevCmdFlag = 1; - srdt.sendphotocmdcnt = 0; - pPortParam->SerialCmdidx = -1; - //netportparam.PhotosFlag = FALSE; - break; - } - serialport->RevCmdFlag = 1; + sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); + LOGI("%s", szbuf); + curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; @@ -1849,30 +1969,22 @@ void CameraPhotoPortDataProcess( int port) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "图片保存失败!"); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGE("%s", szbuf); } if(0 == rtumsg.MsgData[10]) { - if(0 == srdt.historyimagenum[devparam[port].CameraChannel-1]) + if(0 == srdt.historyimagenum[devparam[devno].CameraChannel-1]) { - //netportparam.SerialCameraPowerCtrl[devparam[port].CameraChannel-1] = 0; - //srdt.sampling &= 0xFB; - + ; } else - pPortParam->FirstCmdTimeCnt = -3*60*1000/TIMER_CNT; - } - else - { - //srdt.sampling &= 0xFB; - //netportparam.SerialCameraPowerCtrl[pPortParam->CameraChannel-1] = 0; + pPortParam->FirstCmdTimeCnt = get_msec(); } pPortParam->SerialCmdidx = -1; - serialport->RevCmdFlag = 1; - //if(0 == netportparam.InitTimeFlag) + curserial->RevCmdFlag = 1; break; default: - serialport->RevCmdFlag = 1; + curserial->RevCmdFlag = 1; break; } } @@ -2018,18 +2130,20 @@ int FindNextCameraPhotoCommand(int devidx) char szbuf[128]; //如果命令缓冲区仍有命令,则退出本函数 - if((devparam[devidx].commid < 1) || (devparam[devidx].commid >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) return -1; if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/ return -1; cmdno = srdt.ms_dev[devidx].SerialCmdidx; if(0 == cmdno)/* 下发拍照指令*/ { - if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 4*1000/TIMER_CNT) + if((get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 3*35*1000) ||(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 0)) { + srdt.ms_dev[devidx].FirstCmdTimeCnt = get_msec(); return -1; } - if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) + + if(get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); @@ -2079,7 +2193,8 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; return -1; } - if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000/TIMER_CNT) + + if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); @@ -2109,7 +2224,7 @@ int FindNextCameraPhotoCommand(int devidx) imagesize = 0xFF; packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; cmdidx = 0x11; - if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); @@ -2118,7 +2233,8 @@ int FindNextCameraPhotoCommand(int devidx) } } MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality); - srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; + //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality); + srdt.curdevidx[devparam[devidx].commid] = devidx; return 1; } @@ -2145,6 +2261,9 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara sendbuf[i++] = cmdidx; /* 命令字*/ switch(cmdidx) { + case 0x02: /* */ + sendbuf[i-2] = 0xFF; + break; case 0x03: /*设置传感器通讯参数(03H)*/ sendbuf[i++] = 0x00; /* 波特率*/ sendbuf[i++] = 0x00; @@ -2163,7 +2282,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara sendbuf[i++] = HIBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = LOBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = Threep;/*图像质量(ImageQuality)*/ - //sendbuf[i++] = netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ + sendbuf[i++] = 0;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ break; case 0x11: /* 获取指定包数据(11H)*/ sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ @@ -2187,7 +2306,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara sendbuf[3] = (BYTE)((i-10)>>8); sendbuf[4] = (BYTE)(i-10); serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i; - return; + //return; } // 准备发送云台指令 @@ -2210,6 +2329,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) LOGI("%s", szbuf); return 1; } +#if 0 if((2 > srdt.ms_dev[i].UseSerialidx+1) ||(MAX_SERIAL_PORT_NUM < srdt.ms_dev[i].UseSerialidx+1)) { sprintf(szbuf, "通道%d摄像机错误的使用了串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); @@ -2218,9 +2338,10 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) } else { +#endif sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); LOGI("%s", szbuf); - } + //} srdt.usecameradevidx = i; // 查找串口序号 srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; @@ -2243,12 +2364,14 @@ int Gm_Camera_Timer(void) { char szbuf[128]; +#if 0 if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1)) { sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1); LOGI("%s", szbuf); return 1; } +#endif if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) { switch(srdt.PtzCmdType) @@ -3146,5 +3269,39 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam) GM_StartSerialComm(); } +void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx) +{ + int i; + //speed_t baudrate; + + for(i=0; i 0) && (sensorParam[i].stopbit < 3)) + { + memset(devparam[i].stopbit, 0, sizeof(devparam[i].stopbit)); + sprintf(devparam[i].stopbit, "%0.1f", sensorParam[i].stopbit); + } + devparam[i].CameraChannel = sensorParam[i].CameraChannel; + devparam[i].Phase = sensorParam[i].Phase; + } + for(;;) + { + Gm_CtrlPtzCmd(1, P_MOVE_LEFT); + sleep(3); + Gm_CtrlPtzCmd(1, Cmd_Cancel); + sleep(10); + } + //GM_StartSerialComm(); + //GM_StartSerialCameraPhoto(1, 0); +} diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.h b/TestComm/app/src/main/cpp/SensorsProtocol.h index 791ab9cf..e0e841d2 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.h +++ b/TestComm/app/src/main/cpp/SensorsProtocol.h @@ -7,6 +7,7 @@ #include #include "GPIOControl.h" +#include "termios.h" #ifndef DWORD typedef unsigned int DWORD; @@ -96,6 +97,8 @@ typedef unsigned char BYTE; #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/ +#define COLLECT_DATA 0 /* 调试使用*/ + #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/ #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/ #define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/ @@ -355,6 +358,8 @@ int GM_CloseTimer(void); // 串口接收数据处理 void SerialDataProcess(int devidx, u_char *buf, int len); +void CameraRecvData(int commid, u_char *buf, int len); + // 串口摄像机数据处理 void CameraPhotoPortDataProcess( int port); @@ -422,6 +427,7 @@ int Gm_SetSerialPortBaud(int commid); //T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate); void Gm_CloseSerialCamera(); +void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx); // 生成一个随机整数 int GeneratingRandomNumber(); diff --git a/TestComm/app/src/main/cpp/WeatherComm.cpp b/TestComm/app/src/main/cpp/WeatherComm.cpp new file mode 100644 index 00000000..1ebb75d2 --- /dev/null +++ b/TestComm/app/src/main/cpp/WeatherComm.cpp @@ -0,0 +1,574 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "GPIOControl.h" +#include "WeatherComm.h" +#include + +SIO_PARAM_SERIAL_DEF serialport; +float weatherpntmsg[10]; + +static void set_baudrate (struct termios *opt, unsigned int baudrate) +{ + cfsetispeed(opt, baudrate); + cfsetospeed(opt, baudrate); +} + +static void set_data_bit (struct termios *opt, unsigned int databit) +{ + opt->c_cflag &= ~CSIZE; + switch (databit) + { + case 8: + opt->c_cflag |= CS8; + break; + case 7: + opt->c_cflag |= CS7; + break; + case 6: + opt->c_cflag |= CS6; + break; + case 5: + opt->c_cflag |= CS5; + break; + default: + opt->c_cflag |= CS8; + break; + } +} + +static void set_parity (struct termios *opt, char parity) +{ + switch (parity) + { + case'N':/* 无校验 */ + case 'n': + opt->c_cflag &= ~PARENB; + break; + case'E':/*偶校验*/ + case 'e': + opt->c_cflag |= PARENB; + opt->c_cflag &= ~PARODD; + break; + case'O':/* 奇校验 */ + case 'o': + opt->c_cflag |= PARENB; + opt->c_cflag |= ~PARODD; + break; + default: /*其它选择为无校验 */ + opt->c_cflag &= ~PARENB; + break; + } +} + +static void set_stopbit (struct termios *opt, const char *stopbit) +{ + if (strcmp(stopbit, "1") == 0) + { + opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */ + } + else if(0 == strcmp(stopbit, "1.5")) + { + opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */ + } + else if(0 == strcmp (stopbit,"2")) + { + opt->c_cflag |= CSTOPB; /*2 位停止位 */ + } + else + { + opt->c_cflag &= ~CSTOPB; /*1 位停止位 */ + } +} + +int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) +{ + struct termios opt; + tcgetattr(fd, &opt); + set_baudrate(&opt, baudrate); + //opt.c_cflag |= CLOCAL|CREAD; /*|CRTSCTS */ + opt.c_lflag &= ~(ICANON | ECHO |ECHOE |ISIG); + opt.c_iflag &=~(INLCR|ICRNL); + opt.c_iflag &=~(IXON);/* 流控*/ + set_data_bit(&opt, databit); + set_parity(&opt, parity); + set_stopbit(&opt, stopbit); + opt.c_oflag = 0; + //opt.c_lflag |= 0; + opt.c_oflag &= ~OPOST; + opt.c_cc[VTIME] = vtime; + opt.c_cc[VMIN] = vmin; + tcflush (fd, TCIFLUSH); + return (tcsetattr (fd, TCSANOW, &opt)); +} + +static void setInt(int cmd, int value) +{ + int fd = open("/dev/mtkgpioctrl", O_RDONLY); + IOT_PARAM param; + param.cmd = cmd; + param.value = value; + // LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value); + if( fd > 0 ) + { + int res = ioctl(fd, IOT_PARAM_WRITE, ¶m); + // LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); + close(fd); + } + return; +} +static void setRS485Enable(bool z) { + setInt(CMD_SET_485_EN_STATE, z ? 1 : 0); +} + +static void set485WriteMode() { + setInt(CMD_SET_485_STATE, 1); +} + +static void set485ReadMode() { + setInt(CMD_SET_485_STATE, 0); +} +static void set12VEnable(bool z) { + setInt(CMD_SET_12V_EN_STATE, z ? 1 : 0); +} + +static void setCam3V3Enable(bool enabled) +{ + setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0); +} + + +/********************************************************************************* +* 气象数据处理 * +**********************************************************************************/ +void PortDataProcess( void ) +{ + float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; + //WORD uDevAddr; + unsigned char cmdidx; + int i, j, aipnt, datanum; + SIO_PARAM_SERIAL_DEF *pPortParam; + char szbuf[64]; + + pPortParam = &serialport; + //取出装置地址,开始处理地址+++ + if(0x02 == pPortParam->m_au8RecvBuf[5]) + { + //pPortParam->devaddr = pPortParam->m_au8RecvBuf[4]; + return; + } + cmdidx = pPortParam->m_au8RecvBuf[5]; +#if 0 + aipnt = pPortParam->SameTypeDevIdx; + uDevAddr = serialport->m_au8RecvBuf[4]; + if(0 == srdt.IsReadWireTem) + { + if(uDevAddr != pPortParam->devaddr) + return; + } +#endif + fvalua = &fvalue; + datanum = pPortParam->m_au8RecvBuf[6]; + if((0x08 != cmdidx) && (0x09 != cmdidx)) + return; + + for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) + { + if(0x08 == cmdidx) + fvalue = (pPortParam->m_au8RecvBuf[j+1]<<24)+(pPortParam->m_au8RecvBuf[j+2]<<16) + +(pPortParam->m_au8RecvBuf[j+3]<<8)+pPortParam->m_au8RecvBuf[j+4]; + else + { + *(u_char *)fvalua = pPortParam->m_au8RecvBuf[j+4]; + *((u_char *)fvalua+1) = pPortParam->m_au8RecvBuf[j+3]; + *((u_char *)fvalua+2) = pPortParam->m_au8RecvBuf[j+2]; + *((u_char *)fvalua+3) = pPortParam->m_au8RecvBuf[j+1]; + } + switch(pPortParam->m_au8RecvBuf[j]) + { + case 1: /*温度*/ + weatherpntmsg[0] = fvalue; + LOGE("温度:%0.3f ", fvalue); + break; + case 2: /*气压*/ + weatherpntmsg[5] = fvalue; + LOGE("气压:%0.3f ", fvalue); + break; + case 3: /*湿度*/ + weatherpntmsg[1] = fvalue; + LOGE("湿度:%0.3f ", fvalue); + break; + case 4: /*雨量*/ + break; + case 5: /*日照*/ + break; + case 6: /*风速*/ + weatherpntmsg[2] = fvalue; + LOGE("风速:%0.3f ", fvalue); + break; + case 7: /*风向*/ + weatherpntmsg[3] = fvalue; + LOGE("风向:%0.3f ", fvalue); + break; + case 8: /*拉力*/ + LOGE("拉力:%0.3f ", fvalue); + break; + case 9: /*倾角传感器X轴倾角*/ + LOGE("X:%0.3f ", fvalue); + break; + case 10: /*倾角传感器Y轴倾角*/ + LOGE("Y:%0.3f ", fvalue); + break; + case 11: /*测温球导线温度*/ + case 12: /*测温球内部温度*/ + break; + case 13: /*测温球导线X轴倾角*/ + break; + case 14: /*测温球导线Y轴倾角*/ + break; + case 15: /*测温球导线电流*/ + break; + case 16: /*测温球电池电压*/ + break; + case 17: /*A相泄漏电流平均值;*/ + break; + case 18: /*A相泄漏电流最大值;*/ + break; + case 19: /*A相超过3mA的脉冲频次*/ + break; + case 20: /*A相超过10mA的脉冲频次*/ + break; + case 21: /*B相泄漏电流平均值;*/ + break; + case 22: /*B相泄漏电流最大值;*/ + break; + case 23: /*B相超过3mA的脉冲频次*/ + break; + case 24: /*B相超过10mA的脉冲频次*/ + case 25: /*C相泄漏电流平均值;*/ + case 26: /*C相泄漏电流最大值;*/ + case 27: /*C相超过3mA的脉冲频次*/ + case 28: /*C相超过10mA的脉冲频次*/ + break; + } + } +} + +//*************************************************************** +//* 按照协议格式化接收数据 * +//*************************************************************** +static void RecvData(u_char *buf, int len)// 规约读数据处理 +{ + int i, ictime; + //WORD crc, check; + SIO_PARAM_SERIAL_DEF *pPortParam; + + pPortParam = &serialport; + ictime = (int)time(NULL); + + if(pPortParam->m_iRecvLen == 0) + { + pPortParam->iRecvTime = ictime; + } + else + { + if((ictime-pPortParam->iRecvTime > 6) || (ictime - pPortParam->iRecvTime < 0)) + pPortParam->iRecvTime = ictime; + else if(ictime - pPortParam->iRecvTime > 2) + { + pPortParam->m_iRecvLen = 0; + pPortParam->m_iRevStatus = 0; + } + } + + for(i=0; im_iRevStatus) + { + case 0: // 0x68 + pPortParam->m_iRecvLen = 0; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 1: // len1 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + break; + case 2: // len2 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + //if(buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2]) + { + pPortParam->m_iRevStatus++; + pPortParam->m_iNeedRevLength = buf[i]+5; + } + //else + // pPortParam->m_iRevStatus = 18; + break; + case 3: // 0x68 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iNeedRevLength--; + if(0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(pPortParam->m_iNeedRevLength > 0) + break; + if(buf[i] != 0x16) + { + pPortParam->m_iRevStatus=18; + break; + } + + //if(CheckLpcError(serialport->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE) + { + PortDataProcess(); + pPortParam->m_iRevStatus = 0; + pPortParam->RevCmdFlag = 1; + } + pPortParam->m_iRecvLen = 0; + break; + case 255:// 错误接收数据 + default: + if(buf[i] == 0x68) + { + pPortParam->m_iRevStatus = 1; + pPortParam->m_iRecvLen = 1; + pPortParam->m_au8RecvBuf[0] = buf[i]; + } + else if(buf[i] == 0x16) + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus = 0; + pPortParam->m_iRecvLen = 0; + } + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; + } + } +} + +static long get_msec(void ) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + long time_in_msec = tv.tv_sec * 1000 + tv.tv_usec/1000; + + return time_in_msec; +} +//int inum =0; +//int itimecnt=0; +static int weather_comm(SERIAL_PARAM weatherport) +{ + int fd = -1; + int len, i,ret, icnt=0; + long ictime, iruntime, isendtime, irecvtime; + //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0D,0x09,0x16,0x16}; + //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x02,0x09,0x0B,0x16}; + unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16}; + //unsigned char sendbuf[] = {0x68,0x01,0x01,0x68,0x0a,0x01,0x01,0x0c, 0x16}; + char recvbuf[256], szbuf[512]; + //char serial_description[] = "/dev/ttyS0"; + +#if 0 + DIR *dir = opendir("/dev"); + if (dir == NULL) { + LOGE("_test_ opendir"); + return -1; + } + + // 读取目录项 + struct dirent *entry; + while ((entry = readdir(dir)) != NULL) { + // 过滤出串口设备,通常以"ttyS"或"ttyUSB"开头 + if ((strncmp(entry->d_name, "ttyS2", 5) == 0) || + (strncmp(entry->d_name, "ttyS0", 5) == 0)) { + LOGE("_test_ Found serial port: %s\n", entry->d_name); + } + } + + // 关闭目录 + closedir(dir); +#endif + serialport.RevCmdFlag = 1; + serialport.m_iRecvLen = 0; + serialport.m_iRevStatus = 0; + + set12VEnable(true); + setCam3V3Enable(true); + setRS485Enable(true); + sleep(3); + //ictime = (int)time(NULL); + ictime = get_msec(); + for(;;) + { + if(fd < 0) + { + fd = open(weatherport.pathname, O_RDWR | O_NDELAY); + //fd = open(weatherport.pathname, O_RDWR | O_NOCTTY); + if(fd < 0) + { + LOGE("_test_ open serial error \n"); + perror(weatherport.pathname); + return -1; + } + + ret= set_port_attr (fd, weatherport.baudrate,weatherport.databit,weatherport.stopbit,weatherport.parity,0,0 );/*9600 8n1 */ + if(ret < 0) + { + LOGE("_test_ set uart arrt faile \n"); + return -1; + } + } + //tcdrain(fd); + //sleep(2); + usleep(100); + //iruntime = (int)time(NULL); + iruntime = get_msec(); + if((iruntime - ictime > 120000) || (iruntime - ictime < 0)) + ictime = iruntime; + if(iruntime - ictime > 20000) + { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "气象采样时间=%0.3f秒,停止采样!", (iruntime-ictime)/1000.0); + LOGE("%s", szbuf); + break; + } + + if(1 == serialport.RevCmdFlag) + { + //set485WriteMode(); + + len = write(fd, sendbuf, sizeof(sendbuf));/* 向串囗发送字符串 */ + serialport.RevCmdFlag = 0; + LOGE("发送命令时间差%ld毫秒", get_msec()-isendtime); + //isendtime = time(NULL); + isendtime = get_msec(); + if (len < 0) { + LOGE("write data error \n"); + return -1; + } else { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "Send:"); + for (i = 0; i < len; i++) { + sprintf(szbuf, "%s %02X", szbuf, sendbuf[i]); + } + LOGE("%s", szbuf); + //icnt = 0; + //inum++; + } + //tcdrain(fd); + //usleep(50000); + } + else + { + //irecvtime = time(NULL); + irecvtime = get_msec(); + if((irecvtime-isendtime > 6000) ||(irecvtime - isendtime < 0)) + isendtime = irecvtime; + if (irecvtime-isendtime > 500) + { + LOGE("传感器超过%ld毫秒未应答", irecvtime-isendtime); + serialport.RevCmdFlag = 1; + serialport.m_iRecvLen = 0; + serialport.m_iRevStatus = 0; + //close(fd); + //set12VEnable(false); + //setCam3V3Enable(false); + //setRS485Enable(false); + //fd = -1; + continue; + } + } + //set485ReadMode(); + memset(recvbuf, 0, sizeof(recvbuf)); + len = read(fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ + if (len < 0) { + LOGE("serial read error \n"); + continue; + } + if(0 == len) + { + //icnt++; + continue; + } + + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "Recv:"); + for (i = 0; i < len; i++) { + sprintf(szbuf, "%s %02X", szbuf, recvbuf[i]); + } + __android_log_print(ANDROID_LOG_INFO, "serial", "%s", szbuf); + RecvData((u_char*)recvbuf, len); + //LOGE("一周期空循环次数%d, 读取次数%d, 时间:%d %d", icnt, inum, (int)time(NULL), itimecnt); + icnt = 0; + //serialport.RevCmdFlag =1; + } + + close(fd); + set12VEnable(false); + setCam3V3Enable(false); + setRS485Enable(false); + + //exit(-1); + return(0); +} + +int serial_port_comm() +{ + SERIAL_PARAM portparm; + + //struct timeval tv; + + //gettimeofday(&tv, NULL); + //long time_in_microseconds = tv.tv_sec * 1000000 + tv.tv_usec; + + //LOGE("Current time in microseconds: %ld\n", time_in_microseconds); + +#if 1 + memset(portparm.pathname, 0, sizeof(portparm.pathname)); + sprintf(portparm.pathname, "/dev/ttyS0"); + portparm.parity = 'N'; + portparm.databit = 8; + portparm.baudrate = B38400; + memset(portparm.stopbit, 0, sizeof(portparm.stopbit)); + sprintf(portparm.stopbit, "1"); +#endif + //itimecnt = (int)time(NULL); + + for(;;) + { + sleep(10); + weather_comm(portparm); + } + + return 0; +} + diff --git a/TestComm/app/src/main/cpp/WeatherComm.h b/TestComm/app/src/main/cpp/WeatherComm.h new file mode 100644 index 00000000..80c47f98 --- /dev/null +++ b/TestComm/app/src/main/cpp/WeatherComm.h @@ -0,0 +1,51 @@ +// +// Created by hyz on 2024/6/5. +// + +#ifndef WEATHERCOMM_H +#define WEATHERCOMM_H + +#include +#include "GPIOControl.h" + +#define MAX_STRING_LEN 32 +#define IOT_PARAM_WRITE 0xAE +#define IOT_PARAM_READ 0xAF + +#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) + +// 串口参数 +typedef struct +{ + int baudrate; /* 波特率*/ + int databit; /* 数据位*/ + char stopbit[8]; /* 停止位*/ + char parity; /* 校验位*/ + char pathname[128];/* 串口文件名及路径*/ +} SERIAL_PARAM; + +typedef struct +{ + int m_iRevStatus; /* */ + int m_iRecvLen; /* */ + int m_iNeedRevLength; /* */ + int iRecvTime; /* */ + int RevCmdFlag; + unsigned char m_au8RecvBuf[128];/* */ +} SIO_PARAM_SERIAL_DEF; + +typedef struct +{ + int cmd; + int value; + int result; + long value2; + char str[MAX_STRING_LEN]; +}IOT_PARAM; + +void PortDataProcess( void ); +int serial_port_comm(); +static int weather_comm(SERIAL_PARAM weatherport); +int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); + +#endif //WEATHERCOMM_H diff --git a/TestComm/app/src/main/cpp/native-lib.cpp b/TestComm/app/src/main/cpp/native-lib.cpp index 9c793ba0..8eac6f29 100644 --- a/TestComm/app/src/main/cpp/native-lib.cpp +++ b/TestComm/app/src/main/cpp/native-lib.cpp @@ -665,6 +665,7 @@ Java_com_xinyingpower_testcomm_MainActivity_testSpi( //serial_port_comm(); //GM_StartSerialComm(); Gm_InitSerialComm(); + //GM_StartSerialCameraPhoto(1, 0); //lxy modify modify //LOGE("_test_ setRS485Enable false"); //setRS485Enable(false); diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 5648eb27..2f6f0b0f 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "GPIOControl.h" #include "serialComm.h" @@ -738,7 +739,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) { int i, j; -#if 1 +#if 0 srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 for(i=0; i MAX_SERIAL_PORT_NUM)) + return; + serialport[i].Retry = 0; + //serialport[i].RetryTime = 500/TIMER_CNT; + serialport[i].RetryTime = 3000/TIMER_CNT; + serialport[i].WaitTime = 0; serialport[i].m_iRevStatus = 0; serialport[i].m_iRecvLen = 0; serialport[i].m_iNeedRevLength = 0; serialport[i].fd = -1; - ClearCmdAllFlag(i); + memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区 + ClearCmdFormPollCmdBuf(i); // 初始化串口使用状态 for(i=0; i 6*1000/TIMER_CNT) + //if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT) { srdt.ms_dev[i].IsNeedSerial = 0; //srdt.sampling &= 0xFB; @@ -1522,7 +1564,10 @@ void GM_AllSerialComRecv(void) if(recvlen < 1) break; sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); - BytestreamLOG(buf, recvbuf, recvlen, 'I'); + if(recvlen < 101) + BytestreamLOG(buf, recvbuf, recvlen, 'I'); + else + LOGI("%s", buf); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); @@ -1679,40 +1724,134 @@ void SerialDataProcess(int devidx, u_char *buf, int len) break; case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ break; - case RESERVE5_PROTOCOL: /* 网络安全加密协议*/ - //EncryptRecvData(devidx, buf, len); - break; - case SERIALCAMERA_PROTOCOL: /* 青青子木串口摄像机协议*/ + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + CameraRecvData(devidx, buf, len); break; } } +/******************************************************************* +* 读 摄像机 数据 * +*******************************************************************/ +void CameraRecvData(int devno, u_char *buf, int len) +{ + int i; + SIO_PARAM_SERIAL_DEF *pPortParam; + + if((devno<0) || (devno > MAX_SERIAL_DEV_NUM)) + { + return; + } + pPortParam = &serialport[devparam[devno].commid]; + + for(i=0; im_iRevStatus) + { + case 0: // 0x68 + pPortParam->m_iRecvLen = 0; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 1: // len1 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + break; + case 2: // len2 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + pPortParam->m_iNeedRevLength = pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2]*256+buf[i]+5; + break; + case 3: // 0x68 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iNeedRevLength--; + if(0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(pPortParam->m_iNeedRevLength > 0) + break; + if(buf[i] != 0x16) + { + pPortParam->m_iRevStatus=18; + break; + } + + if(pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2] == + CalLpc( &pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen-6 )) + { + CameraPhotoPortDataProcess(devno); + pPortParam->m_iRevStatus = 0; + pPortParam->RevCmdFlag = 1; + } + else + { + pPortParam->m_iRevStatus = 0; + } + pPortParam->m_iRecvLen = 0; + break; + case 255:// 错误接收数据 + default: + if(buf[i] == 0x68) + { + pPortParam->m_iRevStatus = 1; + pPortParam->m_iRecvLen = 1; + pPortParam->m_au8RecvBuf[0] = buf[i]; + } + else if(buf[i] == 0x16) + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus = 0; + pPortParam->m_iRecvLen = 0; + } + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if(pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; + } + } +} + /********************************************************************************* CameraPhoto 端口数据处理 **********************************************************************************/ -void CameraPhotoPortDataProcess( int port) +void CameraPhotoPortDataProcess( int devno) { RTUMSG rtumsg; SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *serialport; + SIO_PARAM_SERIAL_DEF *curserial; int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime; char szbuf[128]; WORD uDevAddr; BYTE cmdidx, recvend; - pPortParam = &srdt.ms_dev[port]; - serialport = &serialport[pPortParam->UseSerialidx]; + pPortParam = &srdt.ms_dev[devno]; + curserial = &serialport[devparam[devno].commid]; memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData)); - memcpy((void*)rtumsg.MsgData, (void*)serialport->m_au8RecvBuf, pPortParam->m_iRecvLen); - rtumsg.MsgLen = pPortParam->m_iRecvLen; - rtumsg.PortIdx = port; - cmdidx = serialport->m_au8RecvBuf[5]; - uDevAddr = serialport->m_au8RecvBuf[4]; + memcpy((void*)rtumsg.MsgData, (void*)curserial->m_au8RecvBuf, curserial->m_iRecvLen); + rtumsg.MsgLen = curserial->m_iRecvLen; + rtumsg.PortIdx = devparam[devno].commid; + cmdidx = curserial->m_au8RecvBuf[5]; + uDevAddr = curserial->m_au8RecvBuf[4]; //sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx); //DebugStringPrintf(szbuf, strlen(szbuf), 1); - if(uDevAddr != devparam[port].devaddr) + if(uDevAddr != devparam[devno].devaddr) return; switch(cmdidx) @@ -1724,8 +1863,7 @@ void CameraPhotoPortDataProcess( int port) if(srdt.RephotographCnt > 2) { pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGE("因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); } break; } @@ -1736,41 +1874,32 @@ void CameraPhotoPortDataProcess( int port) img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8); srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); - sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - //presetno = (int)GetPhotoPresetNo(pPortParam->CameraChannel); + srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); + sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); + LOGV("%s", szbuf); presetno = (int)rtumsg.MsgData[i+8]; - //if(0 == netportparam.InitTimeFlag) - { - serialport->RevCmdFlag = 1; - srdt.sendphotocmdcnt = 0; - pPortParam->SerialCmdidx = 10001; -/* 保存图片*/ - //break - } - serialport->RevCmdFlag = 1; + curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; case 0x11: /* 图片数据包*/ - // if(0 == netportparam.InitTimeFlag) - { - serialport->RevCmdFlag = 1; - srdt.sendphotocmdcnt = 0; - pPortParam->SerialCmdidx = 10001; -/* 保存图片*/ - //break; - } i = 6; iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256; packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256; sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - serialport->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = 0; + LOGV("%s", szbuf); + curserial->RevCmdFlag = 1; + pPortParam->FirstCmdTimeCnt = get_msec(); if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) { + if(iNo == srdt.imagepacketnum) + recvend = 1; + else + recvend = 0; + + if(packsize > MAX_PHOTO_FRAME_LEN) + recvend = 0xFF; + if(1 == recvend) pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ else if(0xFF == recvend) @@ -1792,6 +1921,7 @@ void CameraPhotoPortDataProcess( int port) srdt.errorPhotoNoCnt++; sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); + LOGE("%s", szbuf); if(srdt.errorPhotoNoCnt > 5) { pPortParam->SerialCmdidx = 0; @@ -1800,16 +1930,15 @@ void CameraPhotoPortDataProcess( int port) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGE("%s", szbuf); } } break; case 0x03: - sprintf(szbuf, "设置波特率%d成功", devparam[port].baudrate); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - //pPortParam->Baud = serialport->Baud; + sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); + LOGD("%s", szbuf); pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; - serialport->RevCmdFlag = 1; + curserial->RevCmdFlag = 1; pPortParam->FirstCmdTimeCnt = 0; break; case 0x15: @@ -1817,7 +1946,7 @@ void CameraPhotoPortDataProcess( int port) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "没有历史图片!结束读取图片!"); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGI("%s", szbuf); break; } i = 6; @@ -1827,20 +1956,11 @@ void CameraPhotoPortDataProcess( int port) img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8); srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); - //presetno = netportparam.CurPresetno[pPortParam->CameraChannel-1]; + srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); presetno = rtumsg.MsgData[i+8]; - sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - //if(0 == netportparam.InitTimeFlag) - { - serialport->RevCmdFlag = 1; - srdt.sendphotocmdcnt = 0; - pPortParam->SerialCmdidx = -1; - //netportparam.PhotosFlag = FALSE; - break; - } - serialport->RevCmdFlag = 1; + sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); + LOGI("%s", szbuf); + curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; @@ -1849,30 +1969,22 @@ void CameraPhotoPortDataProcess( int port) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "图片保存失败!"); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); + LOGE("%s", szbuf); } if(0 == rtumsg.MsgData[10]) { - if(0 == srdt.historyimagenum[devparam[port].CameraChannel-1]) + if(0 == srdt.historyimagenum[devparam[devno].CameraChannel-1]) { - //netportparam.SerialCameraPowerCtrl[devparam[port].CameraChannel-1] = 0; - //srdt.sampling &= 0xFB; - + ; } else - pPortParam->FirstCmdTimeCnt = -3*60*1000/TIMER_CNT; - } - else - { - //srdt.sampling &= 0xFB; - //netportparam.SerialCameraPowerCtrl[pPortParam->CameraChannel-1] = 0; + pPortParam->FirstCmdTimeCnt = get_msec(); } pPortParam->SerialCmdidx = -1; - serialport->RevCmdFlag = 1; - //if(0 == netportparam.InitTimeFlag) + curserial->RevCmdFlag = 1; break; default: - serialport->RevCmdFlag = 1; + curserial->RevCmdFlag = 1; break; } } @@ -2018,18 +2130,20 @@ int FindNextCameraPhotoCommand(int devidx) char szbuf[128]; //如果命令缓冲区仍有命令,则退出本函数 - if((devparam[devidx].commid < 1) || (devparam[devidx].commid >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) return -1; if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/ return -1; cmdno = srdt.ms_dev[devidx].SerialCmdidx; if(0 == cmdno)/* 下发拍照指令*/ { - if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 4*1000/TIMER_CNT) + if((get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 3*35*1000) ||(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 0)) { + srdt.ms_dev[devidx].FirstCmdTimeCnt = get_msec(); return -1; } - if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) + + if(get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); @@ -2079,7 +2193,8 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; return -1; } - if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000/TIMER_CNT) + + if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); @@ -2109,7 +2224,7 @@ int FindNextCameraPhotoCommand(int devidx) imagesize = 0xFF; packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; cmdidx = 0x11; - if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); @@ -2118,7 +2233,8 @@ int FindNextCameraPhotoCommand(int devidx) } } MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality); - srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; + //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality); + srdt.curdevidx[devparam[devidx].commid] = devidx; return 1; } @@ -2145,6 +2261,9 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara sendbuf[i++] = cmdidx; /* 命令字*/ switch(cmdidx) { + case 0x02: /* */ + sendbuf[i-2] = 0xFF; + break; case 0x03: /*设置传感器通讯参数(03H)*/ sendbuf[i++] = 0x00; /* 波特率*/ sendbuf[i++] = 0x00; @@ -2163,7 +2282,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara sendbuf[i++] = HIBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = LOBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = Threep;/*图像质量(ImageQuality)*/ - //sendbuf[i++] = netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ + sendbuf[i++] = 0;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ break; case 0x11: /* 获取指定包数据(11H)*/ sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ @@ -2187,7 +2306,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara sendbuf[3] = (BYTE)((i-10)>>8); sendbuf[4] = (BYTE)(i-10); serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i; - return; + //return; } // 准备发送云台指令 @@ -2210,6 +2329,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) LOGI("%s", szbuf); return 1; } +#if 0 if((2 > srdt.ms_dev[i].UseSerialidx+1) ||(MAX_SERIAL_PORT_NUM < srdt.ms_dev[i].UseSerialidx+1)) { sprintf(szbuf, "通道%d摄像机错误的使用了串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); @@ -2218,9 +2338,10 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) } else { +#endif sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); LOGI("%s", szbuf); - } + //} srdt.usecameradevidx = i; // 查找串口序号 srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; @@ -2243,12 +2364,14 @@ int Gm_Camera_Timer(void) { char szbuf[128]; +#if 0 if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1)) { sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1); LOGI("%s", szbuf); return 1; } +#endif if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) { switch(srdt.PtzCmdType) @@ -3146,5 +3269,39 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam) GM_StartSerialComm(); } +void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx) +{ + int i; + //speed_t baudrate; + + for(i=0; i 0) && (sensorParam[i].stopbit < 3)) + { + memset(devparam[i].stopbit, 0, sizeof(devparam[i].stopbit)); + sprintf(devparam[i].stopbit, "%0.1f", sensorParam[i].stopbit); + } + devparam[i].CameraChannel = sensorParam[i].CameraChannel; + devparam[i].Phase = sensorParam[i].Phase; + } + for(;;) + { + Gm_CtrlPtzCmd(1, P_MOVE_LEFT); + sleep(3); + Gm_CtrlPtzCmd(1, Cmd_Cancel); + sleep(10); + } + //GM_StartSerialComm(); + //GM_StartSerialCameraPhoto(1, 0); +} diff --git a/app/src/main/cpp/SensorsProtocol.h b/app/src/main/cpp/SensorsProtocol.h index 791ab9cf..e0e841d2 100644 --- a/app/src/main/cpp/SensorsProtocol.h +++ b/app/src/main/cpp/SensorsProtocol.h @@ -7,6 +7,7 @@ #include #include "GPIOControl.h" +#include "termios.h" #ifndef DWORD typedef unsigned int DWORD; @@ -96,6 +97,8 @@ typedef unsigned char BYTE; #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/ +#define COLLECT_DATA 0 /* 调试使用*/ + #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/ #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/ #define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/ @@ -355,6 +358,8 @@ int GM_CloseTimer(void); // 串口接收数据处理 void SerialDataProcess(int devidx, u_char *buf, int len); +void CameraRecvData(int commid, u_char *buf, int len); + // 串口摄像机数据处理 void CameraPhotoPortDataProcess( int port); @@ -422,6 +427,7 @@ int Gm_SetSerialPortBaud(int commid); //T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate); void Gm_CloseSerialCamera(); +void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx); // 生成一个随机整数 int GeneratingRandomNumber();