From 11e60728963d904bea7acf94bc102cba23534b5c Mon Sep 17 00:00:00 2001 From: huyizhong Date: Fri, 28 Jun 2024 09:08:07 +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=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E5=B9=B6=E8=B0=83=E8=AF=95=E4=BA=91=E5=8F=B0=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=8C=87=E4=BB=A4=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=9C=A8?= =?UTF-8?q?=E6=8B=8D=E7=85=A7=E8=BF=87=E7=A8=8B=E4=B8=AD=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E4=BA=91=E5=8F=B0=E6=8E=A7=E5=88=B6=E6=8C=87=E4=BB=A4=E9=80=A0?= =?UTF-8?q?=E6=88=90=E5=91=BD=E4=BB=A4=E9=80=BB=E8=BE=91=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E7=B4=8A=E4=B9=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestComm/app/src/main/AndroidManifest.xml | 5 +- TestComm/app/src/main/cpp/CMakeLists.txt | 6 +- TestComm/app/src/main/cpp/GPIOControl.h | 11 + TestComm/app/src/main/cpp/SensorsProtocol.cpp | 770 +++++++++++------- TestComm/app/src/main/cpp/SensorsProtocol.h | 61 +- TestComm/app/src/main/cpp/WeatherComm.cpp | 23 +- TestComm/app/src/main/cpp/native-lib.cpp | 17 +- TestComm/app/src/main/cpp/serialComm.cpp | 31 +- TestComm/app/src/main/cpp/serialComm.h | 2 +- .../xinyingpower/testcomm/MainActivity.java | 5 +- app/src/main/cpp/SensorsProtocol.cpp | 770 +++++++++++------- app/src/main/cpp/SensorsProtocol.h | 61 +- app/src/main/cpp/serialComm.cpp | 31 +- app/src/main/cpp/serialComm.h | 2 +- 14 files changed, 1131 insertions(+), 664 deletions(-) diff --git a/TestComm/app/src/main/AndroidManifest.xml b/TestComm/app/src/main/AndroidManifest.xml index 1c677876..9cf69840 100644 --- a/TestComm/app/src/main/AndroidManifest.xml +++ b/TestComm/app/src/main/AndroidManifest.xml @@ -2,7 +2,9 @@ - + + + + diff --git a/TestComm/app/src/main/cpp/CMakeLists.txt b/TestComm/app/src/main/cpp/CMakeLists.txt index 4015c241..c6ece9e8 100644 --- a/TestComm/app/src/main/cpp/CMakeLists.txt +++ b/TestComm/app/src/main/cpp/CMakeLists.txt @@ -27,9 +27,9 @@ add_library( # Sets the name of the library. SpiLib.cpp native-lib.cpp GPIOControl.cpp - #WeatherComm.cpp - serialComm.cpp - SensorsProtocol.cpp + WeatherComm.cpp + #serialComm.cpp + #SensorsProtocol.cpp ) # Searches for a specified prebuilt library and stores the path as a diff --git a/TestComm/app/src/main/cpp/GPIOControl.h b/TestComm/app/src/main/cpp/GPIOControl.h index 54a46177..70339636 100644 --- a/TestComm/app/src/main/cpp/GPIOControl.h +++ b/TestComm/app/src/main/cpp/GPIOControl.h @@ -36,6 +36,17 @@ #define CMD_SET_CAM_3V3_EN_STATE 132 #define CMD_SET_12V_EN_STATE 133 #define CMD_SET_SYSTEM_RESET 202 +#define CMD_SET_WTH_POWER 490 +#define CMD_SET_PULL_POWER 491 +#define CMD_SET_ANGLE_POWER 492 +#define CMD_SET_OTHER_POWER 493 +#define CMD_SET_PIC1_POWER 494 +#define CMD_SET_485_en0 301 +#define CMD_SET_485_en1 302 +#define CMD_SET_485_en2 303 +#define CMD_SET_485_en3 304 +#define CMD_SET_485_en4 305 + class GpioControl { diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.cpp b/TestComm/app/src/main/cpp/SensorsProtocol.cpp index 2f6f0b0f..89d4030c 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.cpp +++ b/TestComm/app/src/main/cpp/SensorsProtocol.cpp @@ -4,9 +4,11 @@ #include #include #include +#include #include #include #include +//#include #include #include #include @@ -561,12 +563,12 @@ void Gm_CloseSerialPower() } // 关闭传感器电源 -void Gm_CloseSensorsPower(int port) +void Gm_CloseSensorsPower() { //char iIoNo; - char szbuf[128]; + //char szbuf[128]; - sprintf(szbuf, "Close Sensors port %d Power!", port); + //sprintf(szbuf, "Close Sensors port %d Power!", port); /* 关闭电源*/ //switch(port) @@ -578,14 +580,14 @@ void Gm_CloseSensorsPower(int port) } // 打开传感器电源 -void Gm_OpenSensorsPower(int port) +void Gm_OpenSensorsPower() { //char iIoNo; char szbuf[128]; - if(0 == port) - return; - sprintf(szbuf, "Open Sensors port %d Power!", port); + //if(0 == port) + // return; + //sprintf(szbuf, "Open Sensors port %d Power!", port); set12VEnable(true); setCam3V3Enable(true); @@ -997,6 +999,7 @@ void Gm_InitSerialComm() //if(NULL == sensorParam) // return; + srdt.IsSleep = 0; memset(sensorParam, 0, sizeof(sensorParam)); Gm_InitSerialComm_Test(sensorParam); // srdt 配置 @@ -1066,9 +1069,38 @@ void Gm_InitSerialComm() #if COLLECT_DATA Collect_sensor_data(sensorParam); #else - CameraPhoto(sensorParam, 1, 0); + for(;;) + { + CameraPhotoCmd(sensorParam, 1, 0, 6, 1); + sleep(5); + + //CameraPhotoCmd(sensorParam, 1, 10017, 0, 1); + //sleep(5); + + //CameraPhotoCmd(sensorParam, 1, MOVE_LEFT, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, MOVE_DOWN, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, MOVE_RIGHT, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, MOVE_UP, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, 10017, 0, 2); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, ZOOM_TELE, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, ZOOM_WIDE, 0, 0); + //sleep(5); + } +#endif +#if 0 +#define ZOOM_WIDE 10011 /* 远离物体(1 有效)*/ +#define ZOOM_TELE 10012 /* 接近物体(1 有效)*/ +#define MOVE_DOWN 10013 /* 向下移动镜头(1 有效)*/ +#define MOVE_UP 10014 /* 向上移动镜头(1 有效)*/ +#define MOVE_LEFT 10015 /* 向左移动镜头(1 有效)*/ +#define MOVE_RIGHT 10016 /* 向右移动镜头(1 有效)*/ #endif - #endif #if 0 //u_char UseSerialidx; // 使用的串口序号 @@ -1104,6 +1136,74 @@ void Gm_InitSerialComm() #endif } +void testComm() +{ + int i; + char szbuf[128]; + SENSOR_PARAM sensorParam[MAX_SERIAL_DEV_NUM]; + + memset(sensorParam, 0, sizeof(sensorParam)); + Gm_InitSerialComm_Test(sensorParam); + +#if 1 + //******************** 端口基本信息 ************************ + /*for(i=0; i*/ + sprintf(devparam[i].pathname, "/dev/swk0"); + devparam[i].commid = 0; + break; case SLANT_PROTOCOL: + memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定具体串口分配,暂时默认使用串口1*/ + sprintf(devparam[i].pathname, "/dev/swk2"); + devparam[i].commid = 2; + break; case RALLY_PROTOCOL: memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); /* 目前还不确定具体串口分配,暂时默认使用串口1*/ - sprintf(devparam[i].pathname, "/dev/ttyS0"); - devparam[i].commid = 0; + sprintf(devparam[i].pathname, "/dev/swk1"); + devparam[i].commid = 1; break; case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/ @@ -1210,11 +1320,13 @@ void GM_StartSerialComm() sprintf(szbuf, "气象"); srdt.ms_dev[i].IsNeedSerial = 1; srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.ms_dev[i].recvdatacnt = 0; break; case RALLY_PROTOCOL: /* 拉力*/ sprintf(szbuf, "拉力"); srdt.ms_dev[i].IsNeedSerial = 1; srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.ms_dev[i].recvdatacnt = 0; break; case WIND_PROTOCOL: /* 风速风向*/ sprintf(szbuf, "风速风向"); @@ -1263,7 +1375,7 @@ void GM_StartSerialComm() if(1 == srdt.ms_dev[i].IsNeedSerial) { LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); - Gm_OpenSensorsPower(i); + Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); } //LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); @@ -1362,7 +1474,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) else srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx; srdt.ms_dev[i].IsNeedSerial = 1; - srdt.ms_dev[i].SerialCmdidx = cmdidx; + 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, "摄像机"); @@ -1377,14 +1495,14 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) if(1 == srdt.ms_dev[i].IsNeedSerial) { LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); - Gm_OpenSensorsPower(i); + Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); } } if(0x01 == flag) { - sprintf(szbuf, "摄像机拍照启动串口定时器!"); + sprintf(szbuf, "摄像机启动串口定时器!"); LOGI("%s", szbuf); for(;;) { @@ -1395,10 +1513,10 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); LOGV("退出采样流程!"); - sleep(15); + //sleep(15); //GM_StartSerialComm(); - GM_StartSerialCameraPhoto(1,0); - //break; + //GM_StartSerialCameraPhoto(1,0); + break; } } } @@ -1515,7 +1633,6 @@ void GM_IsCloseSensors(void) srdt.ms_dev[i].IsNeedSerial = 0; // 关闭传感器电源 LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); - //Gm_CtrlCloseSensorsPower(i); } break; case PELCO_D_PROTOCOL: /* 摄像机类型*/ @@ -1523,18 +1640,9 @@ void GM_IsCloseSensors(void) case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ if(-1 == srdt.ms_dev[i].SerialCmdidx) { - //if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT) - { - srdt.ms_dev[i].IsNeedSerial = 0; - //srdt.sampling &= 0xFB; - memset(buf, 0, sizeof(buf)); - LOGI("通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); - //netportparam.SerialCameraPowerCtrl[srdt.ms_dev[i].CameraChannel-1] = 0; - //if(0 == netportparam.InitTimeFlag) - // Gm_CtrlCloseSensorsPower(i); - } + srdt.ms_dev[i].IsNeedSerial = 0; + LOGI("通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); } - srdt.ms_dev[i].FirstCmdTimeCnt++; break; } } @@ -1563,14 +1671,15 @@ void GM_AllSerialComRecv(void) if(recvlen < 1) break; +#if 1 sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); - if(recvlen < 101) + //if(recvlen < 101) BytestreamLOG(buf, recvbuf, recvlen, 'I'); - else - LOGI("%s", buf); + //else + //LOGI("%s", buf); +#endif SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); - } } @@ -1598,116 +1707,14 @@ int GM_CloseTimer(void) } else // 关闭所有串口及电源 { -#if 0 - for(i=0; i 35) - //{ - // if((devparam[j].PowerPort) == 0) - { - sprintf(buf, "打开无线模块电源!当前时间%d秒,起始时间%d秒", - (int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt); - LOGI("%s", buf); - } - //} - -#if 1 - //samtime = (int)(Gm_GetSamplingTimeSec()-10); - //if(iretime > samtime) - if(iretime > 155) - { - srdt.ms_dev[j].IsNeedSerial = 0; - //srdt.tempsamplingstartime = -1; - srdt.tempsamplingsucctime = -1; - // 关闭传感器电源 - memset(buf, 0, sizeof(buf)); - sprintf(buf, "关闭无线模块电源!当前时间%d秒,起始时间%d秒,采样间隔时间10", - (int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt/*, samtime*/); - LOGI("%s", buf); - //Gm_CtrlCloseSensorsPower(j); - } -#endif - break; - } - } - //StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); - } - else - - { -#endif -#if 0 - for(i=0; iimage.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]; + } + + memset(filedir, 0, sizeof(filedir)); + sprintf(filedir, "/sdcard/photo/"); + + if(access(filedir, 0)==0) + LOGI("文件路径已经存在!"); + else + { + status = mkdir(filedir, S_IRWXU | S_IRWXG | S_IRWXO); + if(status < 0) + return -1; + } + // 写入文件到sdcard + memset(filename, 0, sizeof(filename)); + sprintf(filename, "%s%d-%d-%d.jpg", filedir,devparam[devno].CameraChannel, pPortParam->image.presetno, pPortParam->image.phototime); + fp = fopen(filename, "wb+"); + if(NULL == fp) + return -1; + len = fwrite(image,1, pPortParam->image.imagelen, fp); + fclose(fp); + if(len < pPortParam->image.imagelen) + return -1; + else + { + LOGI("写入图片文件%s成功!", filename); + return 1; + } +} + /******************************************************************* * 读 摄像机 数据 * *******************************************************************/ @@ -1834,7 +1888,7 @@ void CameraPhotoPortDataProcess( int devno) RTUMSG rtumsg; SERIAL_DEV_DEF *pPortParam; SIO_PARAM_SERIAL_DEF *curserial; - int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime; + int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime, pidx; char szbuf[128]; WORD uDevAddr; BYTE cmdidx, recvend; @@ -1868,16 +1922,21 @@ void CameraPhotoPortDataProcess( int devno) break; } i = 6; + memset(&pPortParam->image, 0, sizeof(pPortParam->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; 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]); LOGV("%s", szbuf); presetno = (int)rtumsg.MsgData[i+8]; + pPortParam->image.presetno = presetno; curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; @@ -1886,14 +1945,32 @@ void CameraPhotoPortDataProcess( int devno) 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); + memmove(&pPortParam->image.buf[iNo-1], &rtumsg.MsgData[i+4], packsize); + pPortParam->image.ilen[iNo-1] = packsize; + sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); 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; + { /* 检查是否有漏包*/ + for(pidx = 0; pidx < srdt.imagepacketnum; pidx++) + { + if(pPortParam->image.ilen[pidx] < 1) + break; + } + if(pidx < srdt.imagepacketnum) + { + iNo = pidx; + recvend = 0; + } + else + { + SaveImageDataTofile(devno); + recvend = 1; + } + } else recvend = 0; @@ -1901,7 +1978,10 @@ void CameraPhotoPortDataProcess( int devno) recvend = 0xFF; if(1 == recvend) + { pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ + //pPortParam->image.lastlen = packsize; + } else if(0xFF == recvend) { pPortParam->SerialCmdidx = -1; @@ -1938,8 +2018,9 @@ void CameraPhotoPortDataProcess( int devno) sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); LOGD("%s", szbuf); pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = 0; + pPortParam->FirstCmdTimeCnt = get_msec(); break; case 0x15: if(0xFF == rtumsg.MsgData[6]) @@ -1952,12 +2033,16 @@ void CameraPhotoPortDataProcess( int devno) 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; 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); presetno = rtumsg.MsgData[i+8]; + pPortParam->image.presetno = presetno; sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); LOGI("%s", szbuf); curserial->RevCmdFlag = 1; @@ -1971,6 +2056,7 @@ void CameraPhotoPortDataProcess( int devno) sprintf(szbuf, "图片保存失败!"); LOGE("%s", szbuf); } + pPortParam->SerialCmdidx = -1; if(0 == rtumsg.MsgData[10]) { if(0 == srdt.historyimagenum[devparam[devno].CameraChannel-1]) @@ -1978,9 +2064,11 @@ void CameraPhotoPortDataProcess( int devno) ; } else - pPortParam->FirstCmdTimeCnt = get_msec(); + { + pPortParam->SerialCmdidx = 10003;/* 暂时不实现*/ + } } - pPortParam->SerialCmdidx = -1; + pPortParam->FirstCmdTimeCnt = get_msec(); curserial->RevCmdFlag = 1; break; default: @@ -1996,10 +2084,8 @@ long lsendtime=0; void SendCmdFormPollCmdBuf( int port ) { char buf[64]; - int len, idelay=0, ret; + int len, ret; SIO_PARAM_SERIAL_DEF *pPortParam; - //int recvlen; - //u_char recvbuf[300]; pPortParam = &serialport[port]; if(pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt) @@ -2011,10 +2097,7 @@ void SendCmdFormPollCmdBuf( int port ) if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0)) { pPortParam->RetryTimeCnt++; - //if(srdt.sendphotocmdcnt > 0) - // idelay = 10*1000/TIMER_CNT; - //LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt); - if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay)) + if(pPortParam->RetryTimeCnt < pPortParam->RetryTime) { return; } @@ -2081,8 +2164,8 @@ void SendCmdFormPollCmdBuf( int port ) pPortParam->RevCmdFlag = 0; pPortParam->RetryTimeCnt = 0; - pPortParam->ForceWaitCnt = pPortParam->PollCmd[0]*256+pPortParam->PollCmd[1]+TIMER_CNT-1; - pPortParam->ForceWaitCnt /= TIMER_CNT; + //pPortParam->ForceWaitCnt = pPortParam->PollCmd[0]*256+pPortParam->PollCmd[1]+TIMER_CNT-1; + //pPortParam->ForceWaitCnt /= TIMER_CNT; if(pPortParam->ForceWaitCnt) { pPortParam->ForceWaitFlag = 1; @@ -2124,113 +2207,245 @@ void ClearCmdFormPollCmdBuf(int port) int FindNextCameraPhotoCommand(int devidx) { int imagesize=3, cmdno; - BYTE channel, imagequality=50; + BYTE channel, imagequality=90, presetno; WORD packetsize; + long lcurtime; BYTE cmdidx=0x10; 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)/* 下发拍照指令*/ return -1; - cmdno = srdt.ms_dev[devidx].SerialCmdidx; - if(0 == cmdno)/* 下发拍照指令*/ + channel = devparam[devidx].CameraChannel; + if((1>channel) || (channel >MAX_CHANNEL_NUM)) { - 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(get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); - LOGI("%s", szbuf); + /* 通道号错误退出拍照流程*/; + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); + LOGI("%s", szbuf); + } + cmdno = srdt.ms_dev[devidx].SerialCmdidx; + lcurtime = get_msec(); + if((1 > cmdno) || (10000 <= cmdno)) { + if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 300) return -1; - } - channel = devparam[devidx].CameraChannel; - if((1>channel) || (channel >MAX_CHANNEL_NUM)) - { - /* 通道号错误退出拍照流程*/; - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); - LOGI("%s", szbuf); - } - packetsize = (WORD)MAX_PHOTO_FRAME_LEN; - srdt.sendphotocmdcnt++; - srdt.imagepacketnum = 0; - srdt.errorPhotoNoCnt = 0; - cmdidx = 0x10; - srdt.sendphototime=(int)time(NULL); } - else if(10000 == cmdno)/* 下发设置串口波特率命令*/ + switch (cmdno) { - switch(devparam[devidx].baudrate) - { - case 9600: - imagesize = 0x07; - break; - case 14400: - imagesize = 0x08; - break; - case 19200: - imagesize = 0x08; - break; - case 38400: - imagesize = 0x09; - break; - case 57600: - imagesize = 0x09; - break; - case 115200: - imagesize = 0x09; - break; - default: - sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); + case 0:/* 下发拍照指令*/ + if(lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3800) + return -1; + if((lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt > 3*35*1000) ||(lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt < 0)) + { + srdt.ms_dev[devidx].FirstCmdTimeCnt = lcurtime; + return -1; + } + + if(lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); LOGI("%s", szbuf); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; return -1; - } + } + LOGE("time=%ldms", lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt); + packetsize = (WORD)MAX_PHOTO_FRAME_LEN; + srdt.sendphotocmdcnt++; + srdt.imagepacketnum = 0; + srdt.errorPhotoNoCnt = 0; + cmdidx = 0x10; + imagesize = srdt.bImageSize; + srdt.sendphototime=(int)time(NULL); + break; - if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); - LOGI("%s", szbuf); - return -1; - } - cmdidx = 0x03; - packetsize = 0xFFFF; - } - else if((10001 == cmdno)||(10002 == cmdno))/* 通知摄像机图片读取完成或存储(16H)*/ - { - cmdidx = 0x16; - if(10001 == cmdno) - packetsize = 1; - else - packetsize = 0; - imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/ - } - else if(10003 == cmdno) /* 读取历史图片(15H)*/ - { - cmdidx = 0x15; - packetsize = (WORD)MAX_PHOTO_FRAME_LEN; - srdt.sendphototime=(int)time(NULL); - } - else - { - imagesize = 0xFF; - packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; - cmdidx = 0x11; - if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); - LOGI("%s", szbuf); - return -1; - } + case 10000: /* 下发设置串口波特率命令*/ + switch(devparam[devidx].baudrate) + { + case B9600: + imagesize = 0x07; + break; + case B19200: + imagesize = 0x08; + break; + case B38400: + imagesize = 0x09; + break; + default: + sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); + LOGI("%s", szbuf); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return -1; + } + + if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); + LOGI("%s", szbuf); + return -1; + } + cmdidx = 0x03; + packetsize = 0xFFFF; + break; + + case 10001: /* 通知摄像机图片读取完成或存储(16H)*/ + case 10002: + cmdidx = 0x16; + if(10001 == cmdno) + packetsize = 1; + else + packetsize = 0; + imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/ + break; + + case 10003: /* 读取历史图片(15H)*/ + cmdidx = 0x15; + packetsize = (WORD)MAX_PHOTO_FRAME_LEN; + srdt.sendphototime=(int)time(NULL); + break; + + case 10005: /* 关闭功能*/ + //Gm_CtrlPtzCmd(1, P_MOVE_LEFT); + //sleep(2); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + //sleep(20); + return 1; + case 10006: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ + Gm_CtrlPtzCmd(channel, P_Auto_Scan); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10007: /* 光圈缩小(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_IRIS_CLOSE); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10008: /* 光圈放大(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_IRIS_OPEN); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10009: /* 近距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_FOCUS_NEAR); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10010: /* 远距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_FOCUS_FAR); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10011: /* 远离物体(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_ZOOM_WIDE); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10012: /* 接近物体(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_ZOOM_TELE); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10013: /* 向下移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_DOWN); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10014: /* 向上移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_UP); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10015: /* 向左移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_LEFT); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10016: /* 向右移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_RIGHT); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10017: /* 调用预置点*/ + //srdt.presetno = 2; + Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO+srdt.presetno); + sleep(2); + if(0 == srdt.IsSleep) + { + srdt.ms_dev[devidx].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; + srdt.iLastGetPhotoNo = -1; + srdt.IsSleep = 0; + return 1; + case 10018: /* 设置预置点*/ + Gm_CtrlPtzCmd(channel, SET_PRESETNO+srdt.presetno); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + default: + imagesize = 0xFF; + packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; + cmdidx = 0x11; +#if 0 + if(0 == srdt.IsSleep) + { + srdt.IsSleep++; + testComm(); + } +#endif + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); + LOGI("%s", szbuf); + return -1; + } + break; } MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality); //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality); @@ -2282,7 +2497,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++] = 0;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ + sendbuf[i++] = srdt.presetno;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ break; case 0x11: /* 获取指定包数据(11H)*/ sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ @@ -2344,13 +2559,13 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) //} srdt.usecameradevidx = i; // 查找串口序号 - srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; + //srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; //if(0 == srdt.sampling) //{ // 1.打开串口电源 - Gm_OpenSerialPower(); + //Gm_OpenSensorsPower(); // 2.打开串口通讯 - Gm_OpenSerialPort(i); + //Gm_OpenSerialPort(i); //} //srdt.sampling |= 2; srdt.SendStopPtzCmdTimeCnt = -1; @@ -2429,8 +2644,9 @@ int Gm_Camera_Timer(void) srdt.PtzCmdType = Cmd_Cancel; srdt.SendStopPtzCmdTimeCnt = 0; } - - if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000) + return 1; +#if 0 + //if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000/TIMER_CNT) { if(serialport[srdt.camerauseserial].cmdlen > 0) return -1; @@ -2442,9 +2658,10 @@ int Gm_Camera_Timer(void) //srdt.sampling &= 0xFD; return 1; } - else - srdt.SendStopPtzCmdTimeCnt ++; - return -1; + //else + // srdt.SendStopPtzCmdTimeCnt ++; + //return -1; +#endif } /******************************************************************************** @@ -2468,6 +2685,9 @@ void Gm_SendPelco_pCommand( DWORD cmdtype) len++; serialport[srdt.camerauseserial].cmdlen = len; Gm_SetSerialPortParam(srdt.camerauseserial); + //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16}; + //len = GM_SerialComSend(sendbuf, sizeof(sendbuf), srdt.camerauseserial); + len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); if(len < 1) { @@ -2478,10 +2698,11 @@ void Gm_SendPelco_pCommand( DWORD cmdtype) sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:", srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel); BytestreamLOG(buf, commandbuf, len, 'D'); + //BytestreamLOG(buf, sendbuf, len, 'D'); } ClearCmdFormPollCmdBuf(srdt.camerauseserial); - serialport[srdt.camerauseserial].ForceWaitCnt = 100; - serialport[srdt.camerauseserial].ForceWaitFlag = 1; + //serialport[srdt.camerauseserial].ForceWaitCnt = 100; + //serialport[srdt.camerauseserial].ForceWaitFlag = 1; } BYTE Gm_Pelco_pXORCheck( BYTE *msg, int len ) @@ -2531,8 +2752,8 @@ void Gm_SendPelco_DCommand( DWORD cmdtype) BytestreamLOG(buf, commandbuf, len, 'D'); } ClearCmdFormPollCmdBuf(srdt.camerauseserial); - serialport[srdt.camerauseserial].ForceWaitCnt = 10; - serialport[srdt.camerauseserial].ForceWaitFlag = 1; + //serialport[srdt.camerauseserial].ForceWaitCnt = 10; + //serialport[srdt.camerauseserial].ForceWaitFlag = 1; } // 计算Pelco_D校验 @@ -3258,18 +3479,14 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam) devparam[i].devaddr = sensorParam[i].devaddr; devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].databit = sensorParam[i].databit; - if((sensorParam[i].stopbit > 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].stopbit = (int)sensorParam[i].stopbit*10; devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; } GM_StartSerialComm(); } -void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx) +void CameraPhotoCmd(SENSOR_PARAM *sensorParam, u_char channel, int cmdidx, u_char bImageSize, u_char presetno) { int i; //speed_t baudrate; @@ -3283,25 +3500,26 @@ void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx) devparam[i].devaddr = sensorParam[i].devaddr; //baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate); - //devparam[i].baudrate = 17; devparam[i].databit = sensorParam[i].databit; - if((sensorParam[i].stopbit > 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].stopbit = (int)sensorParam[i].stopbit*10; devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; } +#if 0 + FindDevUseSerialCommNo(); for(;;) { Gm_CtrlPtzCmd(1, P_MOVE_LEFT); sleep(3); + GM_AllSerialComRecv(); Gm_CtrlPtzCmd(1, Cmd_Cancel); sleep(10); } +#endif + srdt.bImageSize = bImageSize; + srdt.presetno = presetno; //GM_StartSerialComm(); - //GM_StartSerialCameraPhoto(1, 0); + GM_StartSerialCameraPhoto(1, cmdidx); } diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.h b/TestComm/app/src/main/cpp/SensorsProtocol.h index e0e841d2..194bba48 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.h +++ b/TestComm/app/src/main/cpp/SensorsProtocol.h @@ -58,6 +58,7 @@ typedef unsigned char BYTE; #define PTZ_MOVETIME 1 // 云台移动等待时间为1秒 #define MAX_CHANNEL_NUM 2 /* 视频通道最大通道*/ #define MAX_PHOTO_FRAME_LEN 1024 /* 图片数据一包最大长度*/ +#define MAX_PHOTO_PACKET_NUM 1024 /* 图片最大包数(图片最大定为1MB)*/ #define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ #define TIMER_CNT 50 // Poll命令定时器时间 5 ms @@ -94,6 +95,19 @@ typedef unsigned char BYTE; #define D_MOVE_LEFT 0x00042d00 /* 向左移动镜头(1 有效)*/ #define D_MOVE_RIGHT 0x00022d00 /* 向右移动镜头(1 有效)*/ +/* 摄像机下发命令宏定义*/ +#define Auto_Scan 10006 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define IRIS_CLOSE 10007 /* 光圈缩小(1 有效)*/ +#define IRIS_OPEN 10008 /* 光圈放大(1 有效)*/ +#define FOCUS_NEAR 10009 /* 近距离聚焦(1 有效)*/ +#define FOCUS_FAR 10010 /* 远距离聚焦(1 有效)*/ +#define ZOOM_WIDE 10011 /* 远离物体(1 有效)*/ +#define ZOOM_TELE 10012 /* 接近物体(1 有效)*/ +#define MOVE_DOWN 10013 /* 向下移动镜头(1 有效)*/ +#define MOVE_UP 10014 /* 向上移动镜头(1 有效)*/ +#define MOVE_LEFT 10015 /* 向左移动镜头(1 有效)*/ +#define MOVE_RIGHT 10016 /* 向右移动镜头(1 有效)*/ + #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/ @@ -139,6 +153,16 @@ typedef struct float EuValue; // 遥测工程值 } AI_DEF; +typedef struct +{ + int imagelen; // 整个图片大小 + int imagenum; // 整个图片的总包数 + int phototime; // 拍照时间 + u_char presetno; // 拍照预置点 + u_char buf[MAX_PHOTO_PACKET_NUM][MAX_PHOTO_FRAME_LEN]; // 图片数据缓存 + int ilen[MAX_PHOTO_PACKET_NUM]; // 相对应的每包图片数据的长度 +} PHOTO_DEF; + // 上层调用采集传感器参数 typedef struct { @@ -159,7 +183,7 @@ typedef struct { unsigned int baudrate; /* 波特率*/ int databit; /* 数据位*/ - char stopbit[8]; /* 停止位*/ + int stopbit; /* 停止位*/ char parity; /* 校验位*/ char pathname[64]; /* 串口文件名及路径*/ int commid; /* 串口序号 注意:从0开始*/ @@ -234,13 +258,10 @@ typedef struct 0x3X,密钥协商确认过程; 0x4X,数据加密过程; 0x5X,数据解密过程;*/ - int m_iRevStatus; /* 接收数据缓冲区状态*/ - int m_iRecvLen; /* 接收数据长度*/ - int m_iNeedRevLength; /* 还需要接收的数据长度*/ - int recvdatacnt; /* 接收到有效数据*/ u_char SameTypeDevIdx; /* 相同类型装置顺序排列序号(从0开始)*/ - int iRecvTime; /* 最近一次收到数据的绝对时间*/ u_char uOpenPowerFlag; /* 传感器上电标志(0:不需要打开; 1:需要打开)*/ + int recvdatacnt; /* 接收到有效数据*/ + PHOTO_DEF image; /* 临时存储图片数据*/ AI_DEF aiValue[MAX_DEV_VALUE_NUM]; /* 传感器采样值*/ } SERIAL_DEV_DEF; @@ -284,29 +305,11 @@ typedef struct int sendphotocmdcnt; /* 一次拍照过程中发送拍照指令计数*/ int photographtime; /* 图片拍摄的时间*/ int iLastGetPhotoNo; /* 设置串口摄像机参数时暂存拍照命令序号*/ + u_char bImageSize; /* 用于临时存储接收上层命令的图片大小*/ + u_char presetno; /* 用于临时存储接收上层命令的预置点*/ #endif u_char errorPhotoNoCnt; /* 串口摄像机拍照时回应错误包号计数(如:召第6包回应第3包)*/ u_char RephotographCnt; /* 串口摄像机重拍计数(只在读照片数据应答出错时才重拍)*/ - int restartflag; /* 升级重启标识*/ - int selfflag; /* 是否检测传感器故障和关闭485电源标志*/ - - BYTE bEncryptstate; /* 加密状态 - 0:加密协商过程;1:加密协商完成; - 2:明文协商过程;3:明文协商完成*/ -#if ENCRYPTION_CHIP - CERTIFICATE cert; /* 本端证书*/ - - BYTE Randomnumber[18]; /* 临时存储加密芯片产生的随机数据*/ - BYTE KeyRandonum[18]; /* 临时存储对端的随机数据及会话密钥DK*/ - BYTE Sm2publickey[64]; /* 临时存储本端Sm2公钥*/ - BYTE Sm2encrypt[128]; /* 临时存储使用本端Sm2公钥加密后的数据*/ - BYTE Sm3hashdata[32]; /* 临时存储Sm3 Hash后数据*/ - BYTE Safetycertification[32];/* 临时存储安全认证因子*/ - char ticr[64]; /* 临时存储证书请求的主题信息*/ - WORD wframeno; /* 帧序号*/ - BYTE encry_chipstate; /* 加密芯片复位状态*/ - int enchipstartnum; /* 加密芯片复位次数*/ -#endif } SRDT_DEF; static void PortDataProcess( void ); @@ -325,7 +328,7 @@ static void setCam3V3Enable(bool enabled); void Gm_OpenSerialPower(void); // 打开传感器电源 -void Gm_OpenSensorsPower(int port); +void Gm_OpenSensorsPower(); // 关闭传感器电源 void Gm_CloseSensorsPower(int port); @@ -427,8 +430,8 @@ 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); - +void CameraPhotoCmd(SENSOR_PARAM *sensorParam, u_char channel, int cmdidx, u_char bImageSize, u_char presetno); +int SaveImageDataTofile(int devno); // 生成一个随机整数 int GeneratingRandomNumber(); diff --git a/TestComm/app/src/main/cpp/WeatherComm.cpp b/TestComm/app/src/main/cpp/WeatherComm.cpp index 1ebb75d2..285c55de 100644 --- a/TestComm/app/src/main/cpp/WeatherComm.cpp +++ b/TestComm/app/src/main/cpp/WeatherComm.cpp @@ -424,6 +424,16 @@ static int weather_comm(SERIAL_PARAM weatherport) set12VEnable(true); setCam3V3Enable(true); setRS485Enable(true); + setInt(CMD_SET_WTH_POWER, 1); + setInt(CMD_SET_PULL_POWER, 1); + setInt(CMD_SET_ANGLE_POWER, 1); + setInt(CMD_SET_OTHER_POWER, 1); + setInt(CMD_SET_PIC1_POWER, 1); + setInt(CMD_SET_485_en0, 1); + setInt(CMD_SET_485_en1, 1); + setInt(CMD_SET_485_en2, 1); + setInt(CMD_SET_485_en3, 1); + setInt(CMD_SET_485_en4, 1); sleep(3); //ictime = (int)time(NULL); ictime = get_msec(); @@ -435,10 +445,12 @@ static int weather_comm(SERIAL_PARAM weatherport) //fd = open(weatherport.pathname, O_RDWR | O_NOCTTY); if(fd < 0) { - LOGE("_test_ open serial error \n"); - perror(weatherport.pathname); + LOGE("open serial %s fail!", weatherport.pathname); + //perror(weatherport.pathname); return -1; - } + } else + LOGE("open serial %s success!", weatherport.pathname); + ret= set_port_attr (fd, weatherport.baudrate,weatherport.databit,weatherport.stopbit,weatherport.parity,0,0 );/*9600 8n1 */ if(ret < 0) @@ -554,10 +566,11 @@ int serial_port_comm() #if 1 memset(portparm.pathname, 0, sizeof(portparm.pathname)); - sprintf(portparm.pathname, "/dev/ttyS0"); + sprintf(portparm.pathname, "/dev/ttyS1"); + //sprintf(portparm.pathname, "/dev/ttysWK3"); portparm.parity = 'N'; portparm.databit = 8; - portparm.baudrate = B38400; + portparm.baudrate = B9600; memset(portparm.stopbit, 0, sizeof(portparm.stopbit)); sprintf(portparm.stopbit, "1"); #endif diff --git a/TestComm/app/src/main/cpp/native-lib.cpp b/TestComm/app/src/main/cpp/native-lib.cpp index 8eac6f29..78937587 100644 --- a/TestComm/app/src/main/cpp/native-lib.cpp +++ b/TestComm/app/src/main/cpp/native-lib.cpp @@ -18,9 +18,9 @@ #include #include #include "GPIOControl.h" -#include "serialComm.h" -#include "SensorsProtocol.h" -//#include "WeatherComm.h" +//#include "serialComm.h" +//#include "SensorsProtocol.h" +#include "WeatherComm.h" #if 0 #define BYTE u_char; @@ -634,7 +634,7 @@ Java_com_xinyingpower_testcomm_MainActivity_stringFromJNI( extern "C" JNIEXPORT jstring JNICALL Java_com_xinyingpower_testcomm_MainActivity_testSpi( JNIEnv* env, - jobject /* this */, jint port) { + jobject /*this*/, jint port) { //testSpi(); SpiLIb a; unsigned char newkey[32]={0xaf,0x0c,0xa9,0x40,0x1f,0xe6,0xee,0x0f,0x4c, @@ -662,9 +662,9 @@ Java_com_xinyingpower_testcomm_MainActivity_testSpi( //setRS485Enable(true); //set12VEnable(true); - //serial_port_comm(); + serial_port_comm(); //GM_StartSerialComm(); - Gm_InitSerialComm(); + //Gm_InitSerialComm(); //GM_StartSerialCameraPhoto(1, 0); //lxy modify modify //LOGE("_test_ setRS485Enable false"); @@ -751,7 +751,7 @@ Java_com_xinyingpower_testcomm_MainActivity_testSpi( /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //// lxy add /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - +#if 0 static speed_t getBaudrate(jint baudrate) { switch(baudrate) { @@ -915,4 +915,5 @@ extern "C" JNIEXPORT jint JNICALL Java_com_xinyingpower_testcomm_MainActivity_re //LOGE("_test serial_read res=%d\n", res); env->ReleaseByteArrayElements(out, outData, 0); return res; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/TestComm/app/src/main/cpp/serialComm.cpp b/TestComm/app/src/main/cpp/serialComm.cpp index b562babf..b300d1c8 100644 --- a/TestComm/app/src/main/cpp/serialComm.cpp +++ b/TestComm/app/src/main/cpp/serialComm.cpp @@ -71,27 +71,26 @@ static void set_parity (struct termios *opt, char parity) } } -static void set_stopbit (struct termios *opt, const char *stopbit) +static void set_stopbit (struct termios *opt, const int stopbit) { - if (strcmp(stopbit, "1") == 0) + switch (stopbit) { - 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 位停止位 */ + case 10: + opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */ + break; + case 15: + opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */ + break; + case 20: + opt->c_cflag |= CSTOPB; /*2 位停止位 */ + break; + default: + opt->c_cflag &= ~CSTOPB; /*1 位停止位 */ + break; } } -int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) +int set_port_attr (int fd, unsigned int baudrate, int databit, const int stopbit, char parity, int vtime, int vmin ) { struct termios opt; tcgetattr(fd, &opt); diff --git a/TestComm/app/src/main/cpp/serialComm.h b/TestComm/app/src/main/cpp/serialComm.h index d74c315f..8321a31b 100644 --- a/TestComm/app/src/main/cpp/serialComm.h +++ b/TestComm/app/src/main/cpp/serialComm.h @@ -14,6 +14,6 @@ #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) -int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); +int set_port_attr (int fd, unsigned int baudrate, int databit, const int stopbit, char parity, int vtime, int vmin ); #endif //SERIAL_COMM_BASE89656_H diff --git a/TestComm/app/src/main/java/com/xinyingpower/testcomm/MainActivity.java b/TestComm/app/src/main/java/com/xinyingpower/testcomm/MainActivity.java index 2562cb9d..85f615e4 100644 --- a/TestComm/app/src/main/java/com/xinyingpower/testcomm/MainActivity.java +++ b/TestComm/app/src/main/java/com/xinyingpower/testcomm/MainActivity.java @@ -1,6 +1,5 @@ package com.xinyingpower.testcomm; -import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; @@ -36,7 +35,7 @@ public class MainActivity extends AppCompatActivity { public void onClick(View v) { String s = binding.edtPort.getText().toString(); // Integer integer = Integer.valueOf(s); - String str = testSpi(0,"ghghghh"); + String str = testSpi(0); binding.sampleText.setText(s); } }); @@ -58,5 +57,5 @@ public class MainActivity extends AppCompatActivity { */ public native String stringFromJNI(); - public native String testSpi(int port,String ss); + public native String testSpi(int port); } \ No newline at end of file diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 2f6f0b0f..89d4030c 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -4,9 +4,11 @@ #include #include #include +#include #include #include #include +//#include #include #include #include @@ -561,12 +563,12 @@ void Gm_CloseSerialPower() } // 关闭传感器电源 -void Gm_CloseSensorsPower(int port) +void Gm_CloseSensorsPower() { //char iIoNo; - char szbuf[128]; + //char szbuf[128]; - sprintf(szbuf, "Close Sensors port %d Power!", port); + //sprintf(szbuf, "Close Sensors port %d Power!", port); /* 关闭电源*/ //switch(port) @@ -578,14 +580,14 @@ void Gm_CloseSensorsPower(int port) } // 打开传感器电源 -void Gm_OpenSensorsPower(int port) +void Gm_OpenSensorsPower() { //char iIoNo; char szbuf[128]; - if(0 == port) - return; - sprintf(szbuf, "Open Sensors port %d Power!", port); + //if(0 == port) + // return; + //sprintf(szbuf, "Open Sensors port %d Power!", port); set12VEnable(true); setCam3V3Enable(true); @@ -997,6 +999,7 @@ void Gm_InitSerialComm() //if(NULL == sensorParam) // return; + srdt.IsSleep = 0; memset(sensorParam, 0, sizeof(sensorParam)); Gm_InitSerialComm_Test(sensorParam); // srdt 配置 @@ -1066,9 +1069,38 @@ void Gm_InitSerialComm() #if COLLECT_DATA Collect_sensor_data(sensorParam); #else - CameraPhoto(sensorParam, 1, 0); + for(;;) + { + CameraPhotoCmd(sensorParam, 1, 0, 6, 1); + sleep(5); + + //CameraPhotoCmd(sensorParam, 1, 10017, 0, 1); + //sleep(5); + + //CameraPhotoCmd(sensorParam, 1, MOVE_LEFT, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, MOVE_DOWN, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, MOVE_RIGHT, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, MOVE_UP, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, 10017, 0, 2); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, ZOOM_TELE, 0, 0); + //sleep(5); + //CameraPhotoCmd(sensorParam, 1, ZOOM_WIDE, 0, 0); + //sleep(5); + } +#endif +#if 0 +#define ZOOM_WIDE 10011 /* 远离物体(1 有效)*/ +#define ZOOM_TELE 10012 /* 接近物体(1 有效)*/ +#define MOVE_DOWN 10013 /* 向下移动镜头(1 有效)*/ +#define MOVE_UP 10014 /* 向上移动镜头(1 有效)*/ +#define MOVE_LEFT 10015 /* 向左移动镜头(1 有效)*/ +#define MOVE_RIGHT 10016 /* 向右移动镜头(1 有效)*/ #endif - #endif #if 0 //u_char UseSerialidx; // 使用的串口序号 @@ -1104,6 +1136,74 @@ void Gm_InitSerialComm() #endif } +void testComm() +{ + int i; + char szbuf[128]; + SENSOR_PARAM sensorParam[MAX_SERIAL_DEV_NUM]; + + memset(sensorParam, 0, sizeof(sensorParam)); + Gm_InitSerialComm_Test(sensorParam); + +#if 1 + //******************** 端口基本信息 ************************ + /*for(i=0; i*/ + sprintf(devparam[i].pathname, "/dev/swk0"); + devparam[i].commid = 0; + break; case SLANT_PROTOCOL: + memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定具体串口分配,暂时默认使用串口1*/ + sprintf(devparam[i].pathname, "/dev/swk2"); + devparam[i].commid = 2; + break; case RALLY_PROTOCOL: memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); /* 目前还不确定具体串口分配,暂时默认使用串口1*/ - sprintf(devparam[i].pathname, "/dev/ttyS0"); - devparam[i].commid = 0; + sprintf(devparam[i].pathname, "/dev/swk1"); + devparam[i].commid = 1; break; case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/ @@ -1210,11 +1320,13 @@ void GM_StartSerialComm() sprintf(szbuf, "气象"); srdt.ms_dev[i].IsNeedSerial = 1; srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.ms_dev[i].recvdatacnt = 0; break; case RALLY_PROTOCOL: /* 拉力*/ sprintf(szbuf, "拉力"); srdt.ms_dev[i].IsNeedSerial = 1; srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.ms_dev[i].recvdatacnt = 0; break; case WIND_PROTOCOL: /* 风速风向*/ sprintf(szbuf, "风速风向"); @@ -1263,7 +1375,7 @@ void GM_StartSerialComm() if(1 == srdt.ms_dev[i].IsNeedSerial) { LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); - Gm_OpenSensorsPower(i); + Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); } //LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); @@ -1362,7 +1474,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) else srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx; srdt.ms_dev[i].IsNeedSerial = 1; - srdt.ms_dev[i].SerialCmdidx = cmdidx; + 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, "摄像机"); @@ -1377,14 +1495,14 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) if(1 == srdt.ms_dev[i].IsNeedSerial) { LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); - Gm_OpenSensorsPower(i); + Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); } } if(0x01 == flag) { - sprintf(szbuf, "摄像机拍照启动串口定时器!"); + sprintf(szbuf, "摄像机启动串口定时器!"); LOGI("%s", szbuf); for(;;) { @@ -1395,10 +1513,10 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); LOGV("退出采样流程!"); - sleep(15); + //sleep(15); //GM_StartSerialComm(); - GM_StartSerialCameraPhoto(1,0); - //break; + //GM_StartSerialCameraPhoto(1,0); + break; } } } @@ -1515,7 +1633,6 @@ void GM_IsCloseSensors(void) srdt.ms_dev[i].IsNeedSerial = 0; // 关闭传感器电源 LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); - //Gm_CtrlCloseSensorsPower(i); } break; case PELCO_D_PROTOCOL: /* 摄像机类型*/ @@ -1523,18 +1640,9 @@ void GM_IsCloseSensors(void) case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ if(-1 == srdt.ms_dev[i].SerialCmdidx) { - //if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT) - { - srdt.ms_dev[i].IsNeedSerial = 0; - //srdt.sampling &= 0xFB; - memset(buf, 0, sizeof(buf)); - LOGI("通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); - //netportparam.SerialCameraPowerCtrl[srdt.ms_dev[i].CameraChannel-1] = 0; - //if(0 == netportparam.InitTimeFlag) - // Gm_CtrlCloseSensorsPower(i); - } + srdt.ms_dev[i].IsNeedSerial = 0; + LOGI("通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); } - srdt.ms_dev[i].FirstCmdTimeCnt++; break; } } @@ -1563,14 +1671,15 @@ void GM_AllSerialComRecv(void) if(recvlen < 1) break; +#if 1 sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); - if(recvlen < 101) + //if(recvlen < 101) BytestreamLOG(buf, recvbuf, recvlen, 'I'); - else - LOGI("%s", buf); + //else + //LOGI("%s", buf); +#endif SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); - } } @@ -1598,116 +1707,14 @@ int GM_CloseTimer(void) } else // 关闭所有串口及电源 { -#if 0 - for(i=0; i 35) - //{ - // if((devparam[j].PowerPort) == 0) - { - sprintf(buf, "打开无线模块电源!当前时间%d秒,起始时间%d秒", - (int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt); - LOGI("%s", buf); - } - //} - -#if 1 - //samtime = (int)(Gm_GetSamplingTimeSec()-10); - //if(iretime > samtime) - if(iretime > 155) - { - srdt.ms_dev[j].IsNeedSerial = 0; - //srdt.tempsamplingstartime = -1; - srdt.tempsamplingsucctime = -1; - // 关闭传感器电源 - memset(buf, 0, sizeof(buf)); - sprintf(buf, "关闭无线模块电源!当前时间%d秒,起始时间%d秒,采样间隔时间10", - (int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt/*, samtime*/); - LOGI("%s", buf); - //Gm_CtrlCloseSensorsPower(j); - } -#endif - break; - } - } - //StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); - } - else - - { -#endif -#if 0 - for(i=0; iimage.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]; + } + + memset(filedir, 0, sizeof(filedir)); + sprintf(filedir, "/sdcard/photo/"); + + if(access(filedir, 0)==0) + LOGI("文件路径已经存在!"); + else + { + status = mkdir(filedir, S_IRWXU | S_IRWXG | S_IRWXO); + if(status < 0) + return -1; + } + // 写入文件到sdcard + memset(filename, 0, sizeof(filename)); + sprintf(filename, "%s%d-%d-%d.jpg", filedir,devparam[devno].CameraChannel, pPortParam->image.presetno, pPortParam->image.phototime); + fp = fopen(filename, "wb+"); + if(NULL == fp) + return -1; + len = fwrite(image,1, pPortParam->image.imagelen, fp); + fclose(fp); + if(len < pPortParam->image.imagelen) + return -1; + else + { + LOGI("写入图片文件%s成功!", filename); + return 1; + } +} + /******************************************************************* * 读 摄像机 数据 * *******************************************************************/ @@ -1834,7 +1888,7 @@ void CameraPhotoPortDataProcess( int devno) RTUMSG rtumsg; SERIAL_DEV_DEF *pPortParam; SIO_PARAM_SERIAL_DEF *curserial; - int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime; + int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime, pidx; char szbuf[128]; WORD uDevAddr; BYTE cmdidx, recvend; @@ -1868,16 +1922,21 @@ void CameraPhotoPortDataProcess( int devno) break; } i = 6; + memset(&pPortParam->image, 0, sizeof(pPortParam->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; 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]); LOGV("%s", szbuf); presetno = (int)rtumsg.MsgData[i+8]; + pPortParam->image.presetno = presetno; curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; @@ -1886,14 +1945,32 @@ void CameraPhotoPortDataProcess( int devno) 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); + memmove(&pPortParam->image.buf[iNo-1], &rtumsg.MsgData[i+4], packsize); + pPortParam->image.ilen[iNo-1] = packsize; + sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); 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; + { /* 检查是否有漏包*/ + for(pidx = 0; pidx < srdt.imagepacketnum; pidx++) + { + if(pPortParam->image.ilen[pidx] < 1) + break; + } + if(pidx < srdt.imagepacketnum) + { + iNo = pidx; + recvend = 0; + } + else + { + SaveImageDataTofile(devno); + recvend = 1; + } + } else recvend = 0; @@ -1901,7 +1978,10 @@ void CameraPhotoPortDataProcess( int devno) recvend = 0xFF; if(1 == recvend) + { pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ + //pPortParam->image.lastlen = packsize; + } else if(0xFF == recvend) { pPortParam->SerialCmdidx = -1; @@ -1938,8 +2018,9 @@ void CameraPhotoPortDataProcess( int devno) sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); LOGD("%s", szbuf); pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = 0; + pPortParam->FirstCmdTimeCnt = get_msec(); break; case 0x15: if(0xFF == rtumsg.MsgData[6]) @@ -1952,12 +2033,16 @@ void CameraPhotoPortDataProcess( int devno) 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; 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); presetno = rtumsg.MsgData[i+8]; + pPortParam->image.presetno = presetno; sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); LOGI("%s", szbuf); curserial->RevCmdFlag = 1; @@ -1971,6 +2056,7 @@ void CameraPhotoPortDataProcess( int devno) sprintf(szbuf, "图片保存失败!"); LOGE("%s", szbuf); } + pPortParam->SerialCmdidx = -1; if(0 == rtumsg.MsgData[10]) { if(0 == srdt.historyimagenum[devparam[devno].CameraChannel-1]) @@ -1978,9 +2064,11 @@ void CameraPhotoPortDataProcess( int devno) ; } else - pPortParam->FirstCmdTimeCnt = get_msec(); + { + pPortParam->SerialCmdidx = 10003;/* 暂时不实现*/ + } } - pPortParam->SerialCmdidx = -1; + pPortParam->FirstCmdTimeCnt = get_msec(); curserial->RevCmdFlag = 1; break; default: @@ -1996,10 +2084,8 @@ long lsendtime=0; void SendCmdFormPollCmdBuf( int port ) { char buf[64]; - int len, idelay=0, ret; + int len, ret; SIO_PARAM_SERIAL_DEF *pPortParam; - //int recvlen; - //u_char recvbuf[300]; pPortParam = &serialport[port]; if(pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt) @@ -2011,10 +2097,7 @@ void SendCmdFormPollCmdBuf( int port ) if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0)) { pPortParam->RetryTimeCnt++; - //if(srdt.sendphotocmdcnt > 0) - // idelay = 10*1000/TIMER_CNT; - //LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt); - if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay)) + if(pPortParam->RetryTimeCnt < pPortParam->RetryTime) { return; } @@ -2081,8 +2164,8 @@ void SendCmdFormPollCmdBuf( int port ) pPortParam->RevCmdFlag = 0; pPortParam->RetryTimeCnt = 0; - pPortParam->ForceWaitCnt = pPortParam->PollCmd[0]*256+pPortParam->PollCmd[1]+TIMER_CNT-1; - pPortParam->ForceWaitCnt /= TIMER_CNT; + //pPortParam->ForceWaitCnt = pPortParam->PollCmd[0]*256+pPortParam->PollCmd[1]+TIMER_CNT-1; + //pPortParam->ForceWaitCnt /= TIMER_CNT; if(pPortParam->ForceWaitCnt) { pPortParam->ForceWaitFlag = 1; @@ -2124,113 +2207,245 @@ void ClearCmdFormPollCmdBuf(int port) int FindNextCameraPhotoCommand(int devidx) { int imagesize=3, cmdno; - BYTE channel, imagequality=50; + BYTE channel, imagequality=90, presetno; WORD packetsize; + long lcurtime; BYTE cmdidx=0x10; 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)/* 下发拍照指令*/ return -1; - cmdno = srdt.ms_dev[devidx].SerialCmdidx; - if(0 == cmdno)/* 下发拍照指令*/ + channel = devparam[devidx].CameraChannel; + if((1>channel) || (channel >MAX_CHANNEL_NUM)) { - 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(get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); - LOGI("%s", szbuf); + /* 通道号错误退出拍照流程*/; + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); + LOGI("%s", szbuf); + } + cmdno = srdt.ms_dev[devidx].SerialCmdidx; + lcurtime = get_msec(); + if((1 > cmdno) || (10000 <= cmdno)) { + if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 300) return -1; - } - channel = devparam[devidx].CameraChannel; - if((1>channel) || (channel >MAX_CHANNEL_NUM)) - { - /* 通道号错误退出拍照流程*/; - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); - LOGI("%s", szbuf); - } - packetsize = (WORD)MAX_PHOTO_FRAME_LEN; - srdt.sendphotocmdcnt++; - srdt.imagepacketnum = 0; - srdt.errorPhotoNoCnt = 0; - cmdidx = 0x10; - srdt.sendphototime=(int)time(NULL); } - else if(10000 == cmdno)/* 下发设置串口波特率命令*/ + switch (cmdno) { - switch(devparam[devidx].baudrate) - { - case 9600: - imagesize = 0x07; - break; - case 14400: - imagesize = 0x08; - break; - case 19200: - imagesize = 0x08; - break; - case 38400: - imagesize = 0x09; - break; - case 57600: - imagesize = 0x09; - break; - case 115200: - imagesize = 0x09; - break; - default: - sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); + case 0:/* 下发拍照指令*/ + if(lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3800) + return -1; + if((lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt > 3*35*1000) ||(lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt < 0)) + { + srdt.ms_dev[devidx].FirstCmdTimeCnt = lcurtime; + return -1; + } + + if(lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); LOGI("%s", szbuf); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; return -1; - } + } + LOGE("time=%ldms", lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt); + packetsize = (WORD)MAX_PHOTO_FRAME_LEN; + srdt.sendphotocmdcnt++; + srdt.imagepacketnum = 0; + srdt.errorPhotoNoCnt = 0; + cmdidx = 0x10; + imagesize = srdt.bImageSize; + srdt.sendphototime=(int)time(NULL); + break; - if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); - LOGI("%s", szbuf); - return -1; - } - cmdidx = 0x03; - packetsize = 0xFFFF; - } - else if((10001 == cmdno)||(10002 == cmdno))/* 通知摄像机图片读取完成或存储(16H)*/ - { - cmdidx = 0x16; - if(10001 == cmdno) - packetsize = 1; - else - packetsize = 0; - imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/ - } - else if(10003 == cmdno) /* 读取历史图片(15H)*/ - { - cmdidx = 0x15; - packetsize = (WORD)MAX_PHOTO_FRAME_LEN; - srdt.sendphototime=(int)time(NULL); - } - else - { - imagesize = 0xFF; - packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; - cmdidx = 0x11; - if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); - LOGI("%s", szbuf); - return -1; - } + case 10000: /* 下发设置串口波特率命令*/ + switch(devparam[devidx].baudrate) + { + case B9600: + imagesize = 0x07; + break; + case B19200: + imagesize = 0x08; + break; + case B38400: + imagesize = 0x09; + break; + default: + sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); + LOGI("%s", szbuf); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return -1; + } + + if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); + LOGI("%s", szbuf); + return -1; + } + cmdidx = 0x03; + packetsize = 0xFFFF; + break; + + case 10001: /* 通知摄像机图片读取完成或存储(16H)*/ + case 10002: + cmdidx = 0x16; + if(10001 == cmdno) + packetsize = 1; + else + packetsize = 0; + imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/ + break; + + case 10003: /* 读取历史图片(15H)*/ + cmdidx = 0x15; + packetsize = (WORD)MAX_PHOTO_FRAME_LEN; + srdt.sendphototime=(int)time(NULL); + break; + + case 10005: /* 关闭功能*/ + //Gm_CtrlPtzCmd(1, P_MOVE_LEFT); + //sleep(2); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + //sleep(20); + return 1; + case 10006: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ + Gm_CtrlPtzCmd(channel, P_Auto_Scan); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10007: /* 光圈缩小(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_IRIS_CLOSE); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10008: /* 光圈放大(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_IRIS_OPEN); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10009: /* 近距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_FOCUS_NEAR); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10010: /* 远距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_FOCUS_FAR); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10011: /* 远离物体(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_ZOOM_WIDE); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10012: /* 接近物体(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_ZOOM_TELE); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10013: /* 向下移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_DOWN); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10014: /* 向上移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_UP); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10015: /* 向左移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_LEFT); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10016: /* 向右移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_RIGHT); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10017: /* 调用预置点*/ + //srdt.presetno = 2; + Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO+srdt.presetno); + sleep(2); + if(0 == srdt.IsSleep) + { + srdt.ms_dev[devidx].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; + srdt.iLastGetPhotoNo = -1; + srdt.IsSleep = 0; + return 1; + case 10018: /* 设置预置点*/ + Gm_CtrlPtzCmd(channel, SET_PRESETNO+srdt.presetno); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + default: + imagesize = 0xFF; + packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; + cmdidx = 0x11; +#if 0 + if(0 == srdt.IsSleep) + { + srdt.IsSleep++; + testComm(); + } +#endif + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); + LOGI("%s", szbuf); + return -1; + } + break; } MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality); //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality); @@ -2282,7 +2497,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++] = 0;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ + sendbuf[i++] = srdt.presetno;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ break; case 0x11: /* 获取指定包数据(11H)*/ sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ @@ -2344,13 +2559,13 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) //} srdt.usecameradevidx = i; // 查找串口序号 - srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; + //srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; //if(0 == srdt.sampling) //{ // 1.打开串口电源 - Gm_OpenSerialPower(); + //Gm_OpenSensorsPower(); // 2.打开串口通讯 - Gm_OpenSerialPort(i); + //Gm_OpenSerialPort(i); //} //srdt.sampling |= 2; srdt.SendStopPtzCmdTimeCnt = -1; @@ -2429,8 +2644,9 @@ int Gm_Camera_Timer(void) srdt.PtzCmdType = Cmd_Cancel; srdt.SendStopPtzCmdTimeCnt = 0; } - - if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000) + return 1; +#if 0 + //if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000/TIMER_CNT) { if(serialport[srdt.camerauseserial].cmdlen > 0) return -1; @@ -2442,9 +2658,10 @@ int Gm_Camera_Timer(void) //srdt.sampling &= 0xFD; return 1; } - else - srdt.SendStopPtzCmdTimeCnt ++; - return -1; + //else + // srdt.SendStopPtzCmdTimeCnt ++; + //return -1; +#endif } /******************************************************************************** @@ -2468,6 +2685,9 @@ void Gm_SendPelco_pCommand( DWORD cmdtype) len++; serialport[srdt.camerauseserial].cmdlen = len; Gm_SetSerialPortParam(srdt.camerauseserial); + //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16}; + //len = GM_SerialComSend(sendbuf, sizeof(sendbuf), srdt.camerauseserial); + len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); if(len < 1) { @@ -2478,10 +2698,11 @@ void Gm_SendPelco_pCommand( DWORD cmdtype) sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:", srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel); BytestreamLOG(buf, commandbuf, len, 'D'); + //BytestreamLOG(buf, sendbuf, len, 'D'); } ClearCmdFormPollCmdBuf(srdt.camerauseserial); - serialport[srdt.camerauseserial].ForceWaitCnt = 100; - serialport[srdt.camerauseserial].ForceWaitFlag = 1; + //serialport[srdt.camerauseserial].ForceWaitCnt = 100; + //serialport[srdt.camerauseserial].ForceWaitFlag = 1; } BYTE Gm_Pelco_pXORCheck( BYTE *msg, int len ) @@ -2531,8 +2752,8 @@ void Gm_SendPelco_DCommand( DWORD cmdtype) BytestreamLOG(buf, commandbuf, len, 'D'); } ClearCmdFormPollCmdBuf(srdt.camerauseserial); - serialport[srdt.camerauseserial].ForceWaitCnt = 10; - serialport[srdt.camerauseserial].ForceWaitFlag = 1; + //serialport[srdt.camerauseserial].ForceWaitCnt = 10; + //serialport[srdt.camerauseserial].ForceWaitFlag = 1; } // 计算Pelco_D校验 @@ -3258,18 +3479,14 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam) devparam[i].devaddr = sensorParam[i].devaddr; devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].databit = sensorParam[i].databit; - if((sensorParam[i].stopbit > 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].stopbit = (int)sensorParam[i].stopbit*10; devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; } GM_StartSerialComm(); } -void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx) +void CameraPhotoCmd(SENSOR_PARAM *sensorParam, u_char channel, int cmdidx, u_char bImageSize, u_char presetno) { int i; //speed_t baudrate; @@ -3283,25 +3500,26 @@ void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx) devparam[i].devaddr = sensorParam[i].devaddr; //baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate); - //devparam[i].baudrate = 17; devparam[i].databit = sensorParam[i].databit; - if((sensorParam[i].stopbit > 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].stopbit = (int)sensorParam[i].stopbit*10; devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; } +#if 0 + FindDevUseSerialCommNo(); for(;;) { Gm_CtrlPtzCmd(1, P_MOVE_LEFT); sleep(3); + GM_AllSerialComRecv(); Gm_CtrlPtzCmd(1, Cmd_Cancel); sleep(10); } +#endif + srdt.bImageSize = bImageSize; + srdt.presetno = presetno; //GM_StartSerialComm(); - //GM_StartSerialCameraPhoto(1, 0); + GM_StartSerialCameraPhoto(1, cmdidx); } diff --git a/app/src/main/cpp/SensorsProtocol.h b/app/src/main/cpp/SensorsProtocol.h index e0e841d2..194bba48 100644 --- a/app/src/main/cpp/SensorsProtocol.h +++ b/app/src/main/cpp/SensorsProtocol.h @@ -58,6 +58,7 @@ typedef unsigned char BYTE; #define PTZ_MOVETIME 1 // 云台移动等待时间为1秒 #define MAX_CHANNEL_NUM 2 /* 视频通道最大通道*/ #define MAX_PHOTO_FRAME_LEN 1024 /* 图片数据一包最大长度*/ +#define MAX_PHOTO_PACKET_NUM 1024 /* 图片最大包数(图片最大定为1MB)*/ #define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ #define TIMER_CNT 50 // Poll命令定时器时间 5 ms @@ -94,6 +95,19 @@ typedef unsigned char BYTE; #define D_MOVE_LEFT 0x00042d00 /* 向左移动镜头(1 有效)*/ #define D_MOVE_RIGHT 0x00022d00 /* 向右移动镜头(1 有效)*/ +/* 摄像机下发命令宏定义*/ +#define Auto_Scan 10006 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define IRIS_CLOSE 10007 /* 光圈缩小(1 有效)*/ +#define IRIS_OPEN 10008 /* 光圈放大(1 有效)*/ +#define FOCUS_NEAR 10009 /* 近距离聚焦(1 有效)*/ +#define FOCUS_FAR 10010 /* 远距离聚焦(1 有效)*/ +#define ZOOM_WIDE 10011 /* 远离物体(1 有效)*/ +#define ZOOM_TELE 10012 /* 接近物体(1 有效)*/ +#define MOVE_DOWN 10013 /* 向下移动镜头(1 有效)*/ +#define MOVE_UP 10014 /* 向上移动镜头(1 有效)*/ +#define MOVE_LEFT 10015 /* 向左移动镜头(1 有效)*/ +#define MOVE_RIGHT 10016 /* 向右移动镜头(1 有效)*/ + #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/ @@ -139,6 +153,16 @@ typedef struct float EuValue; // 遥测工程值 } AI_DEF; +typedef struct +{ + int imagelen; // 整个图片大小 + int imagenum; // 整个图片的总包数 + int phototime; // 拍照时间 + u_char presetno; // 拍照预置点 + u_char buf[MAX_PHOTO_PACKET_NUM][MAX_PHOTO_FRAME_LEN]; // 图片数据缓存 + int ilen[MAX_PHOTO_PACKET_NUM]; // 相对应的每包图片数据的长度 +} PHOTO_DEF; + // 上层调用采集传感器参数 typedef struct { @@ -159,7 +183,7 @@ typedef struct { unsigned int baudrate; /* 波特率*/ int databit; /* 数据位*/ - char stopbit[8]; /* 停止位*/ + int stopbit; /* 停止位*/ char parity; /* 校验位*/ char pathname[64]; /* 串口文件名及路径*/ int commid; /* 串口序号 注意:从0开始*/ @@ -234,13 +258,10 @@ typedef struct 0x3X,密钥协商确认过程; 0x4X,数据加密过程; 0x5X,数据解密过程;*/ - int m_iRevStatus; /* 接收数据缓冲区状态*/ - int m_iRecvLen; /* 接收数据长度*/ - int m_iNeedRevLength; /* 还需要接收的数据长度*/ - int recvdatacnt; /* 接收到有效数据*/ u_char SameTypeDevIdx; /* 相同类型装置顺序排列序号(从0开始)*/ - int iRecvTime; /* 最近一次收到数据的绝对时间*/ u_char uOpenPowerFlag; /* 传感器上电标志(0:不需要打开; 1:需要打开)*/ + int recvdatacnt; /* 接收到有效数据*/ + PHOTO_DEF image; /* 临时存储图片数据*/ AI_DEF aiValue[MAX_DEV_VALUE_NUM]; /* 传感器采样值*/ } SERIAL_DEV_DEF; @@ -284,29 +305,11 @@ typedef struct int sendphotocmdcnt; /* 一次拍照过程中发送拍照指令计数*/ int photographtime; /* 图片拍摄的时间*/ int iLastGetPhotoNo; /* 设置串口摄像机参数时暂存拍照命令序号*/ + u_char bImageSize; /* 用于临时存储接收上层命令的图片大小*/ + u_char presetno; /* 用于临时存储接收上层命令的预置点*/ #endif u_char errorPhotoNoCnt; /* 串口摄像机拍照时回应错误包号计数(如:召第6包回应第3包)*/ u_char RephotographCnt; /* 串口摄像机重拍计数(只在读照片数据应答出错时才重拍)*/ - int restartflag; /* 升级重启标识*/ - int selfflag; /* 是否检测传感器故障和关闭485电源标志*/ - - BYTE bEncryptstate; /* 加密状态 - 0:加密协商过程;1:加密协商完成; - 2:明文协商过程;3:明文协商完成*/ -#if ENCRYPTION_CHIP - CERTIFICATE cert; /* 本端证书*/ - - BYTE Randomnumber[18]; /* 临时存储加密芯片产生的随机数据*/ - BYTE KeyRandonum[18]; /* 临时存储对端的随机数据及会话密钥DK*/ - BYTE Sm2publickey[64]; /* 临时存储本端Sm2公钥*/ - BYTE Sm2encrypt[128]; /* 临时存储使用本端Sm2公钥加密后的数据*/ - BYTE Sm3hashdata[32]; /* 临时存储Sm3 Hash后数据*/ - BYTE Safetycertification[32];/* 临时存储安全认证因子*/ - char ticr[64]; /* 临时存储证书请求的主题信息*/ - WORD wframeno; /* 帧序号*/ - BYTE encry_chipstate; /* 加密芯片复位状态*/ - int enchipstartnum; /* 加密芯片复位次数*/ -#endif } SRDT_DEF; static void PortDataProcess( void ); @@ -325,7 +328,7 @@ static void setCam3V3Enable(bool enabled); void Gm_OpenSerialPower(void); // 打开传感器电源 -void Gm_OpenSensorsPower(int port); +void Gm_OpenSensorsPower(); // 关闭传感器电源 void Gm_CloseSensorsPower(int port); @@ -427,8 +430,8 @@ 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); - +void CameraPhotoCmd(SENSOR_PARAM *sensorParam, u_char channel, int cmdidx, u_char bImageSize, u_char presetno); +int SaveImageDataTofile(int devno); // 生成一个随机整数 int GeneratingRandomNumber(); diff --git a/app/src/main/cpp/serialComm.cpp b/app/src/main/cpp/serialComm.cpp index b562babf..b300d1c8 100644 --- a/app/src/main/cpp/serialComm.cpp +++ b/app/src/main/cpp/serialComm.cpp @@ -71,27 +71,26 @@ static void set_parity (struct termios *opt, char parity) } } -static void set_stopbit (struct termios *opt, const char *stopbit) +static void set_stopbit (struct termios *opt, const int stopbit) { - if (strcmp(stopbit, "1") == 0) + switch (stopbit) { - 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 位停止位 */ + case 10: + opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */ + break; + case 15: + opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */ + break; + case 20: + opt->c_cflag |= CSTOPB; /*2 位停止位 */ + break; + default: + opt->c_cflag &= ~CSTOPB; /*1 位停止位 */ + break; } } -int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) +int set_port_attr (int fd, unsigned int baudrate, int databit, const int stopbit, char parity, int vtime, int vmin ) { struct termios opt; tcgetattr(fd, &opt); diff --git a/app/src/main/cpp/serialComm.h b/app/src/main/cpp/serialComm.h index d74c315f..8321a31b 100644 --- a/app/src/main/cpp/serialComm.h +++ b/app/src/main/cpp/serialComm.h @@ -14,6 +14,6 @@ #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) -int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); +int set_port_attr (int fd, unsigned int baudrate, int databit, const int stopbit, char parity, int vtime, int vmin ); #endif //SERIAL_COMM_BASE89656_H