diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 3fafc88b..983c2d8c 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1700,7 +1700,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< { if (localPhotoInfo.preset != 0 && localPhotoInfo.preset != 0xFF) { - CameraPhotoCmd(time(NULL), localPhotoInfo.channel, MOVE_PRESETNO, 0, localPhotoInfo.preset); + //CameraPhotoCmd(time(NULL), localPhotoInfo.channel, MOVE_PRESETNO, 0, localPhotoInfo.preset); std::this_thread::sleep_for(std::chrono::seconds(3)); } time_t ts = time(NULL); @@ -1709,7 +1709,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< XYLOG(XYLOG_SEVERITY_INFO, "Camera is SeltTesting, selfTestingtime = %d", localPhotoInfo.selfTestingTime); pThis->OpenPTZSensors(localPhotoInfo.selfTestingTime); } - CameraPhotoCmd(ts, localPhotoInfo.channel, 0, localPhotoInfo.resolution, 0); + //CameraPhotoCmd(ts, localPhotoInfo.channel, 0, localPhotoInfo.resolution, 0); XYLOG(XYLOG_SEVERITY_INFO, "Taking photo over"); pThis->TakePTZPhotoCb(3, localPhotoInfo); }); diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 38f72441..49e354f0 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -30,6 +30,7 @@ #include SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM]; + SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM]; SRDT_DEF srdt; AI_DEF weatherpntmsg[WEATHER_DATA_NUM]; @@ -441,7 +442,7 @@ int serial_port_comm() return 0; } #endif - +extern int Gm_SetSerialPortParam(int commid); static speed_t getBaudrate(unsigned int baudrate) { switch (baudrate) { @@ -1081,28 +1082,27 @@ void testComm() >>>>>>> cf0f3f52d373254ad85da3aa96b1e8c8f7c34070 #else sleep(15); - CameraPhotoCmd(time(NULL), 1, 0, 6, 1); + CameraPhotoCmd(time(NULL), 1, 0, 6, 1, "/dev/ttyS1",38400, 1); sleep(5); - CameraPhotoCmd(time(NULL), 1, 10017, 0, 2); + CameraPhotoCmd(time(NULL), 1, 10017, 0, 2, "/dev/ttyS1",38400, 1); sleep(5); - CameraPhotoCmd(0, 1, MOVE_LEFT, 0, 0); - sleep(5); - CameraPhotoCmd(0, 1, MOVE_DOWN, 0, 0); - sleep(5); - CameraPhotoCmd(0, 1, MOVE_RIGHT, 0, 0); + CameraPhotoCmd(0, 1, MOVE_LEFT, 0, 0, "/dev/ttyS1",38400, 1); sleep(5); - CameraPhotoCmd(0, 1, MOVE_UP, 0, 0); + CameraPhotoCmd(0, 1, MOVE_DOWN, 0, 0, "/dev/ttyS1",38400, 1); sleep(5); - CameraPhotoCmd(0, 1, 10017, 0, 1); + CameraPhotoCmd(0, 1, MOVE_RIGHT, 0, 0, "/dev/ttyS1",38400, 1); sleep(5); - CameraPhotoCmd(0, 1, ZOOM_TELE, 0, 0); + CameraPhotoCmd(0, 1, MOVE_UP, 0, 0, "/dev/ttyS1",38400, 1); sleep(5); - CameraPhotoCmd(0, 1, ZOOM_WIDE, 0, 0); + CameraPhotoCmd(0, 1, 10017, 0, 1, "/dev/ttyS1",38400, 1); sleep(5); - CameraPhotoCmd(time(NULL), 1, 0, 6, 2); sleep(5); + //CameraPhotoCmd(0, 1, ZOOM_WIDE, 0, 0); + //sleep(5); + //CameraPhotoCmd(time(NULL), 1, 0, 6, 2); + //sleep(5); #endif } @@ -1363,127 +1363,6 @@ void GM_StartSerialComm() return; } -#if 1 -// 启动使用串口拍照 -void GM_StartSerialCameraPhoto(uint8_t channel, int cmdidx) -{ - int i, flag = 0; - char szbuf[128], logbuf[128]; - - srdt.RephotographCnt = 0; - //FindDevUseSerialCommNo(); -#if 0 - //sprintf(szbuf, "sampling=%02X !", srdt.sampling); - //DebugStringPrintf(szbuf, strlen(szbuf), 1); - //if(0 == srdt.selfflag) - // srdt.selfflag = 1; - //Gm_OpenSerialPower(); - //Gm_OpenSensorsPower(); - //if(0x00 == srdt.sampling) - //{ - // Gm_OpenSerialPort(); - //} - if (0 == (srdt.sampling & 0x04)) - { - srdt.sampling |= 4; - flag = 1; - } - if (0x01 == (srdt.sampling & 0x01)) - flag = 0; -#endif - i = srdt.camerauseserial; - if ((i < 0) || (i >= MAX_SERIAL_PORT_NUM)) - return; - serialport[i].Retry = 0; - serialport[i].RetryTime = 2000; - serialport[i].WaitTime = 0; - serialport[i].m_iRevStatus = 0; - serialport[i].m_iRecvLen = 0; - serialport[i].m_iNeedRevLength = 0; - serialport[i].fd = -1; - memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区 - ClearCmdFormPollCmdBuf(i); - - // 初始化串口使用状态 - for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) - { - if (0 == devparam[i].IsNoInsta) - { - srdt.ms_dev[i].IsNeedSerial = 0; - continue; - } - memset(szbuf, 0, sizeof(szbuf)); - switch (devparam[i].ProtocolIdx) - { - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - if ((1 > devparam[i].CameraChannel) || (devparam[i].CameraChannel > MAX_CHANNEL_NUM)) - { - srdt.ms_dev[i].IsNeedSerial = 0; - break; - } - if (channel == devparam[i].CameraChannel) - { - ; - } - else - break; - if (0 == srdt.ms_dev[i].IsNeedSerial) - srdt.iLastGetPhotoNo = -1; - else - srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx; - srdt.ms_dev[i].IsNeedSerial = 1; - if (0 == cmdidx) - srdt.ms_dev[i].image.state = SER_STARTSAMPLE; - if ((0 == cmdidx) && (srdt.presetno > 0)) - { - srdt.ms_dev[i].SerialCmdidx = 10017; - srdt.iLastGetPhotoNo = cmdidx; - } - else - srdt.ms_dev[i].SerialCmdidx = cmdidx; - srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); - srdt.sendphotocmdcnt = 0; - sprintf(szbuf, "摄像机"); - flag = 1; - break; - default: - if (1 == srdt.ms_dev[i].IsNeedSerial) - break; - srdt.ms_dev[i].IsNeedSerial = 0; - break; - } - if (1 == srdt.ms_dev[i].IsNeedSerial) - { - sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i + 1, devparam[i].IsNoInsta, szbuf); - DebugLog(8, logbuf, 'I'); - Gm_OpenSensorsPower(); - Gm_OpenSerialPort(i); - } - } - if (0x01 == flag) - { - sprintf(szbuf, "摄像机启动串口定时器!"); - DebugLog(8, szbuf, 'I'); - for (;;) - { - usleep(10); - //LOGW("polltime=%ldms", get_msec()-polltime); - //polltime = get_msec(); - if (GM_SerialTimer() < 0) - { - //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); - DebugLog(8, "退出拍照流程!", 'V'); - sleep(3); - break; - } - } - } - //return; -} -#endif - int GM_SerialTimer(void) { int flag = -1; @@ -1508,7 +1387,7 @@ void Gm_FindAllSensorsCommand() int i, j, curidx, flag; //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ - for (j = 0; j < MAX_SERIAL_PORT_NUM; j++) + for (j = 1; j < MAX_SERIAL_PORT_NUM; j++) { // 发送缓冲区中命令 接收到了应答报文,紧接着进行缓冲区清理 SendCmdFormPollCmdBuf(j); @@ -1546,7 +1425,6 @@ void Gm_FindAllSensorsCommand() case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - flag = FindNextCameraPhotoCommand(curidx); break; break; } @@ -1713,7 +1591,6 @@ void SerialDataProcess(int devidx, u_char *buf, int len) case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - CameraRecvData(devidx, buf, len); break; } } @@ -1791,23 +1668,21 @@ int SaveLogTofile(int commid, char *szbuf) return 1; } -int SaveImageDataTofile(int devno) +int SaveImageDataTofile(SIO_PARAM_SERIAL_DEF *curserial) { u_char *image = NULL, *tempphoto = NULL; int i, status; size_t len; char filename[512]/*, filedir[512]*/, szbuf[128]; FILE *fp = NULL; - SERIAL_DEV_DEF *pPortParam; - pPortParam = &srdt.ms_dev[devno]; - image = (u_char*)malloc(pPortParam->image.imagelen); + image = (u_char*)malloc(curserial->image.imagelen); if (NULL == image) return -1; tempphoto = image; - for (i = 0; i < pPortParam->image.imagenum; ++i) { - memmove(tempphoto, &pPortParam->image.buf[i], (size_t)pPortParam->image.ilen[i]); - tempphoto += (size_t)pPortParam->image.ilen[i]; + for (i = 0; i < curserial->image.imagenum; ++i) { + memmove(tempphoto, &curserial->image.buf[i], (size_t)curserial->image.ilen[i]); + tempphoto += (size_t)curserial->image.ilen[i]; } memset(szbuf, 0, sizeof(szbuf)); @@ -1817,7 +1692,7 @@ int SaveImageDataTofile(int devno) if (access(srdt.filedir, 0) == 0) { sprintf(szbuf, "文件路径%s已经存在!", srdt.filedir); - DebugLog(devparam[devno].commid, szbuf, 'I'); + DebugLog(0, szbuf, 'I'); } else { @@ -1826,22 +1701,22 @@ int SaveImageDataTofile(int devno) return -1; } // 写入文件到sdcard - memset(pPortParam->image.photoname, 0, sizeof(pPortParam->image.photoname)); - sprintf(pPortParam->image.photoname, "%s%d-%d-%d.jpg", srdt.filedir, devparam[devno].CameraChannel, pPortParam->image.presetno, pPortParam->image.phototime); - fp = fopen(pPortParam->image.photoname, "wb+"); + memset(curserial->image.photoname, 0, sizeof(curserial->image.photoname)); + sprintf(curserial->image.photoname, "%s1-%d-%d.jpg", srdt.filedir, curserial->image.presetno, curserial->image.phototime); + fp = fopen(curserial->image.photoname, "wb+"); if (NULL == fp) return -1; - len = fwrite(image, 1, pPortParam->image.imagelen, fp); + len = fwrite(image, 1, curserial->image.imagelen, fp); fclose(fp); free(image); image = NULL; - if (len < pPortParam->image.imagelen) + if (len < curserial->image.imagelen) return -1; else { memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "写入图片文件%s成功!", pPortParam->image.photoname); - DebugLog(devparam[devno].commid, szbuf, 'I'); + sprintf(szbuf, "写入图片文件%s成功!", curserial->image.photoname); + DebugLog(0, szbuf, 'I'); return 1; } } @@ -1849,16 +1724,9 @@ int SaveImageDataTofile(int devno) /******************************************************************* * 读 摄像机 数据 * *******************************************************************/ -void CameraRecvData(int devno, u_char *buf, int len) +void CameraRecvData(SIO_PARAM_SERIAL_DEF *pPortParam, 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; i < len; i++) { @@ -1903,7 +1771,7 @@ void CameraRecvData(int devno, u_char *buf, int len) if (pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] == CalLpc(&pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen - 6)) { - CameraPhotoPortDataProcess(devno); + CameraPhotoPortDataProcess(pPortParam); pPortParam->m_iRevStatus = 0; pPortParam->RevCmdFlag = 1; } @@ -1943,29 +1811,25 @@ void CameraRecvData(int devno, u_char *buf, int len) /********************************************************************************* CameraPhoto 端口数据处理 **********************************************************************************/ -void CameraPhotoPortDataProcess(int devno) +void CameraPhotoPortDataProcess(SIO_PARAM_SERIAL_DEF *curserial) { RTUMSG rtumsg; - SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *curserial; int img_file_size, packetnum, iNo, packsize, i = 0, presetno, iphototime, pidx; char szbuf[128]; - uint16_t uDevAddr; + uint16_t uDevAddr, datalen=0; uint8_t cmdidx, recvend; - pPortParam = &srdt.ms_dev[devno]; - curserial = &serialport[devparam[devno].commid]; - memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData)); memcpy((void*)rtumsg.MsgData, (void*)curserial->m_au8RecvBuf, curserial->m_iRecvLen); rtumsg.MsgLen = curserial->m_iRecvLen; - rtumsg.PortIdx = devparam[devno].commid; + //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[devno].devaddr) + datalen = rtumsg.MsgData[1]*256+rtumsg.MsgData[2]; + if (uDevAddr != curserial->cameraaddr) return; memset(szbuf, 0, sizeof(szbuf)); switch (cmdidx) @@ -1976,50 +1840,55 @@ void CameraPhotoPortDataProcess(int devno) srdt.RephotographCnt++; if (srdt.RephotographCnt > 2) { - pPortParam->SerialCmdidx = -1; + curserial->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); + DebugLog(0, szbuf, 'E'); } break; } i = 6; - memset(&pPortParam->image, 0, sizeof(pPortParam->image)); + memset(&curserial->image, 0, sizeof(curserial->image)); iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); srdt.photographtime = iphototime; - pPortParam->image.phototime = iphototime; + curserial->image.phototime = iphototime; i = 10; 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); - pPortParam->image.imagelen = img_file_size; - pPortParam->image.imagenum = packetnum; - srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[devno].CameraChannel - 1] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); - sprintf(szbuf, "有%d张历史图片!", srdt.historyimagenum[devparam[devno].CameraChannel - 1]); - DebugLog(devparam[devno].commid, szbuf, 'V'); + curserial->image.imagelen = img_file_size; + curserial->image.imagenum = packetnum; + srdt.historyimagenum[0] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); + sprintf(szbuf, "有%d张历史图片!", srdt.historyimagenum[0]); + DebugLog(0, szbuf, 'V'); presetno = (int)rtumsg.MsgData[i + 8]; - pPortParam->image.presetno = presetno; - pPortParam->image.state = SER_SAMPLE; + curserial->image.presetno = presetno; + curserial->image.state = SER_SAMPLE; curserial->RevCmdFlag = 1; - pPortParam->SerialCmdidx = 1; + curserial->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; case 0x11: /* 图片数据包*/ i = 6; iNo = rtumsg.MsgData[i + 1] + rtumsg.MsgData[i] * 256; + if((0xFF == rtumsg.MsgData[i+2]) && (3 == datalen)) + { + curserial->SerialCmdidx = iNo + 1; + break; + } + packsize = rtumsg.MsgData[i + 3] + rtumsg.MsgData[i + 2] * 256; - memmove(&pPortParam->image.buf[iNo - 1], &rtumsg.MsgData[i + 4], packsize); - pPortParam->image.ilen[iNo - 1] = packsize; + memmove(&curserial->image.buf[iNo - 1], &rtumsg.MsgData[i + 4], packsize); + curserial->image.ilen[iNo - 1] = packsize; sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); - DebugLog(devparam[devno].commid, szbuf, 'V'); + DebugLog(0, szbuf, 'V'); curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = get_msec(); - if ((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i + 2])) + curserial->FirstCmdTimeCnt = get_msec(); + if (iNo == curserial->SerialCmdidx) { if (iNo == srdt.imagepacketnum) { /* 检查是否有漏包*/ for (pidx = 0; pidx < srdt.imagepacketnum; pidx++) { - if (pPortParam->image.ilen[pidx] < 1) + if (curserial->image.ilen[pidx] < 1) break; } if (pidx < srdt.imagepacketnum) @@ -2029,8 +1898,12 @@ void CameraPhotoPortDataProcess(int devno) } else { - if ((1 == SaveImageDataTofile(devno)) && (SER_SAMPLE == pPortParam->image.state)) - pPortParam->image.state = PHOTO_SAVE_SUCC; + if ((1 == SaveImageDataTofile(curserial)) && (SER_SAMPLE == curserial->image.state)) + { + curserial->image.state = PHOTO_SAVE_SUCC; + memset(&serialport[0].image, 0, sizeof(PHOTO_DEF)); + memmove((void *)&serialport[0].image, (void*)&curserial->image, sizeof(PHOTO_DEF)); + } recvend = 1; } } @@ -2042,96 +1915,95 @@ void CameraPhotoPortDataProcess(int devno) if (1 == recvend) { - pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ - //pPortParam->image.lastlen = packsize; + curserial->SerialCmdidx = 10002;/* 图片读取完成*/ } else if (0xFF == recvend) { - pPortParam->SerialCmdidx = -1; + curserial->SerialCmdidx = -1; } else { if ((iNo > srdt.imagepacketnum) || (0 >= srdt.imagepacketnum)) { - pPortParam->SerialCmdidx = -1; + curserial->SerialCmdidx = -1; } else - pPortParam->SerialCmdidx = iNo + 1; + curserial->SerialCmdidx = iNo + 1; } srdt.errorPhotoNoCnt = 0; break; } srdt.errorPhotoNoCnt++; sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", - pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); + curserial->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); + DebugLog(0, szbuf, 'E'); if (srdt.errorPhotoNoCnt > 5) { - pPortParam->SerialCmdidx = 0; + curserial->SerialCmdidx = 0; srdt.RephotographCnt++; if (srdt.RephotographCnt > 2) { - pPortParam->SerialCmdidx = -1; + curserial->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); + DebugLog(0, szbuf, 'E'); } } break; case 0x03: - sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); - DebugLog(devparam[devno].commid, szbuf, 'D'); - pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + //sprintf(szbuf, "设置波特率%d成功", curserial->baud); + //DebugLog(devparam[devno].commid, szbuf, 'D'); + curserial->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = get_msec(); + curserial->FirstCmdTimeCnt = get_msec(); break; case 0x15: if (0xFF == rtumsg.MsgData[6]) { - pPortParam->SerialCmdidx = -1; + curserial->SerialCmdidx = -1; sprintf(szbuf, "没有历史图片!结束读取图片!"); - DebugLog(devparam[devno].commid, szbuf, 'I'); + DebugLog(0, szbuf, 'I'); break; } i = 6; iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); srdt.photographtime = iphototime; - pPortParam->image.phototime = iphototime; + curserial->image.phototime = iphototime; i = 10; 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); - pPortParam->image.imagelen = img_file_size; - pPortParam->image.imagenum = packetnum; - srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[devno].CameraChannel - 1] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); + curserial->image.imagelen = img_file_size; + curserial->image.imagenum = packetnum; + //srdt.imagepacketnum = packetnum; + srdt.historyimagenum[0] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); presetno = rtumsg.MsgData[i + 8]; - pPortParam->image.presetno = presetno; - sprintf(szbuf, "读取历史图片,还有%d张历史图片!", srdt.historyimagenum[devparam[devno].CameraChannel - 1]); - DebugLog(devparam[devno].commid, szbuf, 'I'); + curserial->image.presetno = presetno; + sprintf(szbuf, "读取历史图片,还有%d张历史图片!", srdt.historyimagenum[0]); + DebugLog(0, szbuf, 'I'); curserial->RevCmdFlag = 1; - pPortParam->SerialCmdidx = 1; + curserial->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; case 0x16: if (0xFF == rtumsg.MsgData[10]) { - pPortParam->SerialCmdidx = -1; + curserial->SerialCmdidx = -1; sprintf(szbuf, "摄像机图片保存失败!"); - DebugLog(devparam[devno].commid, szbuf, 'E'); + DebugLog(0, szbuf, 'E'); } - pPortParam->SerialCmdidx = -1; + curserial->SerialCmdidx = -1; if (0 == rtumsg.MsgData[10]) { - if (0 == srdt.historyimagenum[devparam[devno].CameraChannel - 1]) + if (0 == srdt.historyimagenum[0]) { ; } else { - pPortParam->SerialCmdidx = 10003;/* 暂时不实现*/ + curserial->SerialCmdidx = 10003;/* 暂时不实现*/ } } - pPortParam->FirstCmdTimeCnt = get_msec(); + curserial->FirstCmdTimeCnt = get_msec(); curserial->RevCmdFlag = 1; break; default: @@ -2150,6 +2022,8 @@ void SendCmdFormPollCmdBuf(int port) int64_t lctime; SIO_PARAM_SERIAL_DEF *pPortParam; + if(port < 1) + return; pPortParam = &serialport[port]; memset(buf, 0, sizeof(buf)); lctime = get_msec(); @@ -2283,8 +2157,29 @@ void ClearCmdFormPollCmdBuf(int port) ClearCmdAllFlag(port); } +void ClearCameraCmdFormPollCmdBuf(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + pPortParam->cmdlen = 0; + memset(pPortParam->PollCmd, 0, sizeof(pPortParam->PollCmd)); + //srdt.serialstatus[port] = 0; + // 清除指令下发标识 + ClearCameraCmdAllFlag(pPortParam); +} + +void ClearCameraCmdAllFlag(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + pPortParam->RetryCnt = 0; + pPortParam->RetryTimeCnt = get_msec(); + pPortParam->WaitTimeCnt = get_msec(); + pPortParam->ForceWaitFlag = 0; + pPortParam->ForceWaitCnt = 0; + pPortParam->SendCmdFlag = 0; + pPortParam->RevCmdFlag = 0; + pPortParam->ReSendCmdFlag = 0; +} + // 下发串口拍照指令控制 -int FindNextCameraPhotoCommand(int devidx) +int FindNextCameraPhotoCommand(SIO_PARAM_SERIAL_DEF *pPortParam) { int imagesize = 3, cmdno; uint8_t channel, imagequality = 90, presetno; @@ -2294,47 +2189,36 @@ int FindNextCameraPhotoCommand(int devidx) char szbuf[128]; //如果命令缓冲区仍有命令,则退出本函数 - if ((devparam[devidx].commid + 1 < 1) || (devparam[devidx].commid + 1 > MAX_SERIAL_PORT_NUM)) - return -1; - // if(serialport[devparam[devidx].commid].cmdlen > 0) - // return -1; - if (-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/ + if (-1 == pPortParam->SerialCmdidx)/* 下发拍照指令*/ return -1; - channel = devparam[devidx].CameraChannel; - if ((1 > channel) || (channel > MAX_CHANNEL_NUM)) - { - /* 通道号错误退出拍照流程*/; - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); - DebugLog(devparam[devidx].commid, szbuf, 'I'); - } - cmdno = srdt.ms_dev[devidx].SerialCmdidx; + channel = 1; + cmdno = pPortParam->SerialCmdidx; lcurtime = get_msec(); if ((1 > cmdno) || (10000 <= cmdno)) { - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 300) + if (lcurtime - pPortParam->FirstCmdTimeCnt < 300) return -1; } switch (cmdno) { case 0:/* 下发拍照指令*/ - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3800) + if (lcurtime - pPortParam->FirstCmdTimeCnt < 3800) return -1; - if ((lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 3 * 35 * 1000) || (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 0)) + if ((lcurtime - pPortParam->FirstCmdTimeCnt > 3 * 35 * 1000) || (lcurtime - pPortParam->FirstCmdTimeCnt < 0)) { - srdt.ms_dev[devidx].FirstCmdTimeCnt = lcurtime; + pPortParam->FirstCmdTimeCnt = lcurtime; return -1; } - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35 * 1000) + if (lcurtime - pPortParam->FirstCmdTimeCnt > 35 * 1000) { - srdt.ms_dev[devidx].SerialCmdidx = -1; + pPortParam->SerialCmdidx = -1; sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); - DebugLog(devparam[devidx].commid, szbuf, 'I'); + DebugLog(0, szbuf, 'I'); return -1; } memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "time=%lldms", lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt); - DebugLog(devparam[devidx].commid, szbuf, 'I'); + sprintf(szbuf, "time=%lldms", lcurtime - pPortParam->FirstCmdTimeCnt); + DebugLog(0, szbuf, 'I'); packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN; srdt.sendphotocmdcnt++; srdt.imagepacketnum = 0; @@ -2344,6 +2228,7 @@ int FindNextCameraPhotoCommand(int devidx) break; case 10000: /* 下发设置串口波特率命令*/ +#if 0 switch (devparam[devidx].baudrate) { case B9600: @@ -2358,20 +2243,21 @@ int FindNextCameraPhotoCommand(int devidx) default: sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); DebugLog(devparam[devidx].commid, szbuf, 'I'); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return -1; } - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 15 * 1000) + if (lcurtime - pPortParam->FirstCmdTimeCnt > 15 * 1000) { - srdt.ms_dev[devidx].SerialCmdidx = -1; + pPortParam->SerialCmdidx = -1; sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); DebugLog(devparam[devidx].commid, szbuf, 'I'); return -1; } cmdidx = 0x03; packetsize = 0xFFFF; +#endif break; case 10001: /* 通知摄像机图片读取完成或存储(16H)*/ @@ -2392,124 +2278,117 @@ int FindNextCameraPhotoCommand(int devidx) case 10005: /* 关闭功能*/ //Gm_CtrlPtzCmd(1, P_MOVE_LEFT); //sleep(2); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; //sleep(20); return 1; case 10006: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ - Gm_CtrlPtzCmd(channel, P_Auto_Scan); + Gm_CtrlPtzCmd(pPortParam, P_Auto_Scan); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10007: /* 光圈缩小(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_IRIS_CLOSE); + Gm_CtrlPtzCmd(pPortParam, P_IRIS_CLOSE); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10008: /* 光圈放大(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_IRIS_OPEN); + Gm_CtrlPtzCmd(pPortParam, P_IRIS_OPEN); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10009: /* 近距离聚焦(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_FOCUS_NEAR); + Gm_CtrlPtzCmd(pPortParam, P_FOCUS_NEAR); usleep(500000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10010: /* 远距离聚焦(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_FOCUS_FAR); + Gm_CtrlPtzCmd(pPortParam, P_FOCUS_FAR); usleep(500000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10011: /* 远离物体(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_ZOOM_WIDE); + Gm_CtrlPtzCmd(pPortParam, P_ZOOM_WIDE); usleep(500000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10012: /* 接近物体(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_ZOOM_TELE); + Gm_CtrlPtzCmd(pPortParam, P_ZOOM_TELE); usleep(500000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10013: /* 向下移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_DOWN); + Gm_CtrlPtzCmd(pPortParam, P_MOVE_DOWN); sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10014: /* 向上移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_UP); + Gm_CtrlPtzCmd(pPortParam, P_MOVE_UP); sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10015: /* 向左移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_LEFT); + Gm_CtrlPtzCmd(pPortParam, P_MOVE_LEFT); sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10016: /* 向右移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_RIGHT); + Gm_CtrlPtzCmd(pPortParam, P_MOVE_RIGHT); sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; case 10017: /* 调用预置点*/ //srdt.presetno = 2; - Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO + srdt.presetno); + Gm_CtrlPtzCmd(pPortParam, MOVE_TO_PRESETNO + srdt.presetno); sleep(2); if (0 == srdt.IsSleep) { - srdt.ms_dev[devidx].SerialCmdidx = 10017; + pPortParam->SerialCmdidx = 10017; srdt.IsSleep++; return 1; } - //if(srdt.presetno > 1) - // srdt.presetno = 1; - // else - // srdt.presetno++; - //srdt.ms_dev[devidx].SerialCmdidx = -1; - //Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO+srdt.presetno); - //usleep(1000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; srdt.IsSleep = 0; return 1; case 10018: /* 设置预置点*/ - Gm_CtrlPtzCmd(channel, SET_PRESETNO + srdt.presetno); + Gm_CtrlPtzCmd(pPortParam, SET_PRESETNO + srdt.presetno); usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return 1; default: imagesize = 0xFF; - packetsize = (uint16_t)srdt.ms_dev[devidx].SerialCmdidx; + packetsize = (uint16_t)pPortParam->SerialCmdidx; cmdidx = 0x11; #if 0 if (0 == srdt.IsSleep) @@ -2518,31 +2397,29 @@ int FindNextCameraPhotoCommand(int devidx) testComm(); } #endif - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35 * 1000) + if (lcurtime - pPortParam->FirstCmdTimeCnt > 35 * 1000) { - srdt.ms_dev[devidx].SerialCmdidx = -1; + pPortParam->SerialCmdidx = -1; sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!", packetsize); - DebugLog(devparam[devidx].commid, szbuf, 'I'); + DebugLog(0, szbuf, 'I'); return -1; } break; } - MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality, srdt.sendphototime); - //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality); - srdt.curdevidx[devparam[devidx].commid] = devidx; + MakeCameraPhotoCommand(pPortParam, cmdidx, imagesize, packetsize, imagequality, srdt.sendphototime); return 1; } /********************************************************************************* 生成 CameraPhoto命令 **********************************************************************************/ -void MakeCameraPhotoCommand(int portno, uint8_t cmdidx, int OneParam, uint16_t TwoParam, uint8_t Threep, int phototime) +void MakeCameraPhotoCommand(SIO_PARAM_SERIAL_DEF *pPortParam, uint8_t cmdidx, int OneParam, uint16_t TwoParam, uint8_t Threep, int phototime) { int i, icurtime; u_char *sendbuf; //char szbuf[128]; - sendbuf = serialport[devparam[portno].commid].PollCmd; + sendbuf = pPortParam->PollCmd; icurtime = phototime; i = 0; @@ -2552,7 +2429,7 @@ void MakeCameraPhotoCommand(int portno, uint8_t cmdidx, int OneParam, uint16_t T sendbuf[i++] = (uint8_t)0x00; /* length */ sendbuf[i++] = (uint8_t)0x00; /* length */ sendbuf[i++] = 0x68; /* 起始字符*/ - sendbuf[i++] = (uint8_t)devparam[portno].devaddr;/* 传感器地址*/ + sendbuf[i++] = (uint8_t)pPortParam->cameraaddr;/* 传感器地址*/ sendbuf[i++] = cmdidx; /* 命令字*/ switch (cmdidx) { @@ -2600,57 +2477,57 @@ void MakeCameraPhotoCommand(int portno, uint8_t cmdidx, int OneParam, uint16_t T sendbuf[i++] = 0x16; /* 信息尾*/ sendbuf[3] = (uint8_t)((i - 10) >> 8); sendbuf[4] = (uint8_t)(i - 10); - serialport[devparam[portno].commid].cmdlen = i; + pPortParam->cmdlen = i; //return; } // 准备发送云台指令 -int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) +int Gm_CtrlPtzCmd(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t ptzcmd) { - int i; - char szbuf[64]; - - srdt.PtzCmdType = ptzcmd; - // 查找装置序号 - for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) + switch (ptzcmd) { - if ((channel == devparam[i].CameraChannel) && ((devparam[i].ProtocolIdx == PELCO_P_PROTOCOL) - || (devparam[i].ProtocolIdx == PELCO_D_PROTOCOL))) + case P_Auto_Scan: + srdt.PtzCmdType = D_Auto_Scan; + break; + case P_IRIS_CLOSE: + srdt.PtzCmdType = D_IRIS_CLOSE; + break; + case P_IRIS_OPEN: + srdt.PtzCmdType = D_IRIS_OPEN; + break; + case P_FOCUS_NEAR: + srdt.PtzCmdType = D_FOCUS_NEAR; + break; + case P_FOCUS_FAR: + srdt.PtzCmdType = D_FOCUS_FAR; + break; + case P_ZOOM_WIDE: + srdt.PtzCmdType = D_ZOOM_WIDE; + break; + case P_ZOOM_TELE: + srdt.PtzCmdType = D_ZOOM_TELE; + break; + case P_MOVE_DOWN: + srdt.PtzCmdType = D_MOVE_DOWN; + break; + case P_MOVE_UP: + srdt.PtzCmdType = D_MOVE_UP; + break; + case P_MOVE_LEFT: + srdt.PtzCmdType = D_MOVE_LEFT; + break; + case P_MOVE_RIGHT: + srdt.PtzCmdType = D_MOVE_RIGHT; break; } - if (i == MAX_SERIAL_DEV_NUM) - { - sprintf(szbuf, "没有找到摄像机使用的通道和串口通讯协议"); - DebugLog(8, szbuf, 'E'); - 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); - LOGI("%s", szbuf); - return 1; - } - else - { -#endif - sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, devparam[i].commid + 1); - DebugLog(devparam[i].commid, szbuf, 'I'); - //} - srdt.usecameradevidx = i; - // 查找串口序号 - // 1.打开串口电源 - //Gm_OpenSensorsPower(); - // 2.打开串口通讯 - //Gm_OpenSerialPort(i); - - srdt.SendStopPtzCmdTimeCnt = -1; - //return 1; - return Gm_Camera_Timer(); - //return 1; + if (serialport[srdt.camerauseserial].cmdlen > 0) + return -1; + Gm_SendPelco_DCommand(pPortParam,ptzcmd); + return 1; } // 发送转动摄像机云台命令定时器 +#if 0 int Gm_Camera_Timer() { char szbuf[128]; @@ -2731,6 +2608,7 @@ int Gm_Camera_Timer() //return -1; #endif } +#endif /******************************************************************************** * 生成 PELCO_P 命令 * @@ -2786,7 +2664,7 @@ uint8_t Gm_Pelco_pXORCheck(uint8_t *msg, int len) /******************************************************************************** * 生成 PELCO_D 命令 * *********************************************************************************/ -void Gm_SendPelco_DCommand(uint32_t cmdtype) +void Gm_SendPelco_DCommand(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t cmdtype) { int len; uint8_t commandbuf[32]; @@ -2795,7 +2673,7 @@ void Gm_SendPelco_DCommand(uint32_t cmdtype) len = 0; #if 1 /* Pelco_D*/ commandbuf[len++] = (uint8_t)0xFF; - commandbuf[len++] = (uint8_t)devparam[srdt.usecameradevidx].devaddr; + commandbuf[len++] = (uint8_t)pPortParam->cameraaddr; commandbuf[len++] = (uint8_t)(cmdtype >> 24); commandbuf[len++] = (uint8_t)(cmdtype >> 16); commandbuf[len++] = (uint8_t)(cmdtype >> 8); @@ -2803,22 +2681,19 @@ void Gm_SendPelco_DCommand(uint32_t cmdtype) commandbuf[len] = (uint8_t)Gm_Pelco_DCheck(commandbuf, len); #endif len++; - serialport[srdt.camerauseserial].cmdlen = len; + pPortParam->cmdlen = len; //Gm_SetSerialPortParam(srdt.camerauseserial); - len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); + len = GM_CameraComSend(commandbuf, len, pPortParam->fd); if (len < 1) { - DebugLog(srdt.camerauseserial, "发送Pelco_D命令失败", 'E'); + DebugLog(0, "发送Pelco_D命令失败", 'E'); } else { - sprintf(buf, "发送串口%d 像机通道%d Pelco_D命令:", - srdt.camerauseserial + 1, devparam[srdt.usecameradevidx].CameraChannel); - BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); + sprintf(buf, "发送像机Pelco_D命令:"); + BytestreamLOG(0, buf, commandbuf, len, 'D'); } - ClearCmdFormPollCmdBuf(srdt.camerauseserial); - //serialport[srdt.camerauseserial].ForceWaitCnt = 10; - //serialport[srdt.camerauseserial].ForceWaitFlag = 1; + ClearCameraCmdFormPollCmdBuf(pPortParam); } // 计算Pelco_D校验 @@ -3494,43 +3369,358 @@ void Collect_sensor_data() GM_StartSerialComm(); } -void CameraPhotoCmd(int phototime, u_char channel, int cmdidx, u_char bImageSize, u_char presetno) +int Gm_SetCameraSerialPortParam(int fd, unsigned int baud) { -#if 0 - int i; - //speed_t baudrate; + int ret; + char szbuf[128]; - for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) + ret = set_port_attr(fd, baud, 8, 1, 'n', 0, 0);/*9600 8n1 */ + if (ret < 0) + { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "摄像机串口波特率等参数设置错误!"); + DebugLog(0, szbuf, 'E'); + return -1; + } + return ret; +} + +int Gm_OpenCameraSerial(SIO_PARAM_SERIAL_DEF *pPortParam, char *serfile, unsigned int baud) +{ + int fd = -1; + char szbuf[512]; + + memset(szbuf, 0, sizeof(szbuf)); + if (pPortParam->fd <= 0) + { + fd = ::open(serfile, O_RDWR | O_NDELAY); + if (fd < 0) { - devparam[i].IsNoInsta = sensorParam[i].IsNoInsta; - if (0 == sensorParam[i].IsNoInsta) - continue; - devparam[i].ProtocolIdx = sensorParam[i].SensorsType; - devparam[i].devaddr = sensorParam[i].devaddr; - //baudrate = getBaudrate(sensorParam[i].baudrate); - devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate); - devparam[i].databit = sensorParam[i].databit; - devparam[i].stopbit = (int)(sensorParam[i].stopbit * 10); - devparam[i].CameraChannel = sensorParam[i].CameraChannel; - devparam[i].Phase = sensorParam[i].Phase; - memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); - memmove(devparam[i].pathname, sensorParam[i].pathname, sizeof(devparam[i].pathname)); + sprintf(szbuf, "摄像机串口%s打开失败!fd=%d", serfile, fd); + DebugLog(0, szbuf, 'E'); + return -1; } + sprintf(szbuf, "摄像机打开串口%s成功!fd=%d", serfile, fd); + DebugLog(0, szbuf, 'I'); + pPortParam->fd = fd; + Gm_SetCameraSerialPortParam(fd, baud); + return 0; + } + sprintf(szbuf, "摄像机串口%s已经打开!fd=%d", serfile, pPortParam->fd); + DebugLog(0, szbuf, 'I'); + return 0; +} - FindDevUseSerialCommNo(); +int GM_CameraComSend(unsigned char * cSendBuf, size_t nSendLen, int fd) +{ + int i, len; + char szbuf[512]; + + memset(szbuf, 0, sizeof(szbuf)); + len = write(fd, cSendBuf, (size_t)nSendLen);/* 向串囗发送字符串 */ + if (len < 0) + { + sprintf(szbuf, "write data error "); + DebugLog(0, szbuf, 'E'); + return -1; + } + else if (len > 0) + { + ; + } + return len; +} + +void SendCameraCmdFormPollCmdBuf(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + char buf[128]; + int len, ret; + int64_t lctime; + + memset(buf, 0, sizeof(buf)); + lctime = get_msec(); + if (pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt) + { + pPortParam->ForceWaitCnt--; + return; + } + + if (pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0)) + { + //pPortParam->RetryTimeCnt++; + if ((lctime - pPortParam->RetryTimeCnt > 3 * pPortParam->RetryTime) || (lctime - pPortParam->RetryTimeCnt < 0)) + { + pPortParam->RetryTimeCnt = lctime; + return; + } + if (lctime - pPortParam->RetryTimeCnt < pPortParam->RetryTime) + { + return; + } + pPortParam->RetryTimeCnt = lctime; + pPortParam->RetryCnt++; + if (pPortParam->RetryCnt > pPortParam->Retry) + { + ClearCameraCmdFormPollCmdBuf(pPortParam); + } + else + { + pPortParam->SendCmdFlag = 0; + pPortParam->RevCmdFlag = 0; + pPortParam->ReSendCmdFlag = 1; + } + } + + if (pPortParam->SendCmdFlag && pPortParam->RevCmdFlag) + { + // 清除当前命令 + ClearCameraCmdFormPollCmdBuf(pPortParam); + } + + if (pPortParam->WaitTime > 0) + { + if ((lctime - pPortParam->WaitTimeCnt > 30 * pPortParam->WaitTime) || (lctime - pPortParam->WaitTimeCnt < 0)) + { + pPortParam->WaitTimeCnt = lctime; + return; + } + + if (lctime - pPortParam->WaitTimeCnt < pPortParam->WaitTime) + { + return; + } + } + pPortParam->WaitTimeCnt = lctime; + + if (pPortParam->ReSendCmdFlag) + len = pPortParam->cmdlen; + else + { + len = pPortParam->cmdlen; + pPortParam->RetryCnt = 0; + } + if (len == 0) + return; + + pPortParam->m_iRecvLen = 0; // 当发送一条新指令时,清除接收状态 + pPortParam->m_iRevStatus = 0; + if (pPortParam->fd < 0) + return; + len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen - 2, pPortParam->fd); + if (len < 1) + { + sprintf(buf, "摄像机串口, 发送命令失败!"); + DebugLog(0, buf, 'E'); + } + else + { + + sprintf(buf, "摄像机串口命令:"); + BytestreamLOG(0, buf, &pPortParam->PollCmd[2], len, 'D'); + sprintf(buf, "sendtimeconst= %lld", lctime - pPortParam->lsendtime); + DebugLog(0, buf, 'W'); + pPortParam->lsendtime = lctime; + } + pPortParam->SendCmdFlag = 1; + pPortParam->ReSendCmdFlag = 0; + pPortParam->RevCmdFlag = 0; + pPortParam->RetryTimeCnt = lctime; + + pPortParam->ForceWaitCnt = pPortParam->PollCmd[0] * 256 + pPortParam->PollCmd[1] + TIMER_CNT - 1; + pPortParam->ForceWaitCnt /= TIMER_CNT; + if (pPortParam->ForceWaitCnt) + { + pPortParam->ForceWaitFlag = 1; + } +} + +void Gm_FindCameraCommand(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + int flag; + + // 发送缓冲区中命令 接收到了应答报文,紧接着进行缓冲区清理 + SendCameraCmdFormPollCmdBuf(pPortParam); + // 串口已经被占用则直接跳过 + if (pPortParam->cmdlen > 0) + return; + flag = -1; + flag = FindNextCameraPhotoCommand(pPortParam); + if (flag == -1) + return; + // 发送缓冲区中命令 生成了命令之后紧接着进行命令发送 + SendCameraCmdFormPollCmdBuf(pPortParam); +} + +int GM_IsCloseCamera(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + int i, j; + char buf[256]; + int64_t lctime; + + lctime = get_msec(); + memset(buf, 0, sizeof(buf)); + if (-1 == pPortParam->SerialCmdidx) + { + if ((SER_STARTSAMPLE == pPortParam->image.state) || (SER_SAMPLE == pPortParam->image.state)) + pPortParam->image.state = SER_SAMPLEFAIL; + else if (PHOTO_SAVE_SUCC == pPortParam->image.state) + pPortParam->image.state = SAMPLINGSUCCESS; + sprintf(buf, "通道1摄像机使用完毕!可以关闭摄像机电源!"); + DebugLog(0, buf, 'I'); + } + return pPortParam->SerialCmdidx; +} + +void GM_CameraSerialComRecv(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + int recvlen; + u_char recvbuf[RECVDATA_MAXLENTH]; + char buf[256]; + + memset(recvbuf, 0, sizeof(recvbuf)); + if (pPortParam->fd <= 0) + return; + //for(;;) + recvlen = read(pPortParam->fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ + + if (recvlen < 1) + return; +#if 1 + sprintf(buf, "收到Camera, %d字节数据:", recvlen); + BytestreamLOG(0, buf, recvbuf, recvlen, 'I'); +#endif + + CameraRecvData(pPortParam, recvbuf, recvlen); +} + +int GM_CameraSerialTimer(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + int flag = -1; + + GM_CameraSerialComRecv(pPortParam); + Gm_FindCameraCommand(pPortParam); + GM_CameraSerialComRecv(pPortParam); + flag = GM_IsCloseCamera(pPortParam); + return flag; +} + +#if 1 +// 启动使用串口拍照 +int GM_StartSerialCameraPhoto(uint8_t channel, int cmdidx, u_char bImageSize, int phototime, u_char presetno, char *serfile, unsigned int baud, int addr) +{ + int flag = 0; + char szbuf[128], logbuf[128]; + SIO_PARAM_SERIAL_DEF cameraport; + + srdt.RephotographCnt = 0; + + cameraport.cameraaddr = addr; + cameraport.Retry = 0; + cameraport.RetryTime = 2000; + cameraport.WaitTime = 0; + cameraport.m_iRevStatus = 0; + cameraport.m_iRecvLen = 0; + cameraport.m_iNeedRevLength = 0; + cameraport.fd = -1; + memset(cameraport.m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区 + ClearCameraCmdFormPollCmdBuf(&cameraport); + + flag = Gm_OpenCameraSerial(&cameraport, serfile, baud); + +#if 0 + // 初始化串口使用状态 + for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) + { + if (0 == devparam[i].IsNoInsta) + { + srdt.ms_dev[i].IsNeedSerial = 0; + continue; + } + memset(szbuf, 0, sizeof(szbuf)); + switch (devparam[i].ProtocolIdx) + { + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + if ((1 > devparam[i].CameraChannel) || (devparam[i].CameraChannel > MAX_CHANNEL_NUM)) + { + srdt.ms_dev[i].IsNeedSerial = 0; + break; + } + if (channel == devparam[i].CameraChannel) + { + ; + } + else + break; + if (0 == srdt.ms_dev[i].IsNeedSerial) + srdt.iLastGetPhotoNo = -1; + else + srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx; + srdt.ms_dev[i].IsNeedSerial = 1; + if (0 == cmdidx) + srdt.ms_dev[i].image.state = SER_STARTSAMPLE; + if ((0 == cmdidx) && (srdt.presetno > 0)) + { + srdt.ms_dev[i].SerialCmdidx = 10017; + srdt.iLastGetPhotoNo = cmdidx; + } + else + srdt.ms_dev[i].SerialCmdidx = cmdidx; + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.sendphotocmdcnt = 0; + sprintf(szbuf, "摄像机"); + flag = 1; + break; + default: + if (1 == srdt.ms_dev[i].IsNeedSerial) + break; + srdt.ms_dev[i].IsNeedSerial = 0; + break; + } + if (1 == srdt.ms_dev[i].IsNeedSerial) + { + sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i + 1, devparam[i].IsNoInsta, szbuf); + DebugLog(8, logbuf, 'I'); + Gm_OpenSensorsPower(); + Gm_OpenSerialPort(i); + } + } +#endif + if(-1 == flag) + return -1; + + if (0x00 == flag) + { + sprintf(szbuf, "摄像机启动串口定时器!"); + DebugLog(8, szbuf, 'I'); for (;;) { - Gm_CtrlPtzCmd(1, P_MOVE_LEFT); - sleep(3); - GM_AllSerialComRecv(); - Gm_CtrlPtzCmd(1, Cmd_Cancel); - sleep(10); + usleep(10); + //LOGW("polltime=%ldms", get_msec()-polltime); + //polltime = get_msec(); + if (GM_CameraSerialTimer(&cameraport) < 0) + { + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + DebugLog(8, "退出操作摄像机流程!", 'V'); + sleep(3); + break; + } } + } + //return; +} #endif + +int CameraPhotoCmd(int phototime, u_char channel, int cmdidx, u_char bImageSize, u_char presetno, char *serfile, unsigned int baud, int addr) +{ + int flag = 0; + srdt.bImageSize = bImageSize; srdt.presetno = presetno; srdt.sendphototime = phototime; - GM_StartSerialCameraPhoto(1, cmdidx); + flag = GM_StartSerialCameraPhoto(channel, cmdidx, bImageSize, phototime, presetno, serfile, baud, addr); + return flag; } /* 串口启动接口函数 结束*/ @@ -3694,19 +3884,15 @@ int GetImage(int devno, IMAGE_DEF *photo) { if (NULL == photo) return -1; - if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) - return -1; - if ((PELCO_D_PROTOCOL != devparam[devno].ProtocolIdx) && (PELCO_P_PROTOCOL != devparam[devno].ProtocolIdx) && (SERIALCAMERA_PROTOCOL != devparam[devno].ProtocolIdx)) - return -1; - photo->presetno = srdt.ms_dev[devno].image.presetno; - photo->phototime = srdt.ms_dev[devno].image.phototime; + photo->presetno = serialport[0].image.presetno; + photo->phototime = serialport[0].image.phototime; memset(photo->photoname, 0, sizeof(photo->photoname)); - memmove(photo->photoname, srdt.ms_dev[devno].image.photoname, sizeof(photo->photoname)); - photo->imagelen = srdt.ms_dev[devno].image.imagelen; - photo->state = srdt.ms_dev[devno].image.state; + memmove(photo->photoname, serialport[0].image.photoname, sizeof(photo->photoname)); + photo->imagelen = serialport[0].image.imagelen; + photo->state = serialport[0].image.state; if ((SER_SAMPLEFAIL == photo->state) || (SAMPLINGSUCCESS == photo->state)) { - srdt.ms_dev[devno].image.state = SER_IDLE; + serialport[0].image.state = SER_IDLE; return 2; } return 1;