From 1ce54d8c03e6b706ab25e3578a3a30be228031da Mon Sep 17 00:00:00 2001 From: jxjajs Date: Thu, 5 Dec 2024 22:23:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8B=8D=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/SensorsProtocol.cpp | 6471 +++++++++++++------------- app/src/main/cpp/SensorsProtocol.h | 208 +- app/src/main/cpp/WeatherComm.cpp | 595 --- app/src/main/cpp/WeatherComm.h | 51 - app/src/main/cpp/native-lib.cpp | 31 +- 5 files changed, 3455 insertions(+), 3901 deletions(-) delete mode 100644 app/src/main/cpp/WeatherComm.cpp delete mode 100644 app/src/main/cpp/WeatherComm.h diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 05e63c9..86b95bf 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -20,12 +21,16 @@ #include #include "GPIOControl.h" #include "serialComm.h" -#include "SensorsProtocol.h" #include + +//#include #include "SensorsProtocol.h" //#include "Eint.h" +#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]; @@ -90,111 +95,111 @@ static void setCam3V3Enable(bool enabled) /********************************************************************************* * 气象数据处理 * **********************************************************************************/ -static void PortDataProcess( void ) -{ - float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; - //WORD uDevAddr; - unsigned char cmdidx; - int i, j, aipnt, datanum; - SIO_PARAM_SERIAL_DEF *pPortParam; - char szbuf[64]; - - pPortParam = &serialport; - //取出装置地址,开始处理地址+++ - if(0x02 == pPortParam->m_au8RecvBuf[5]) - { - //pPortParam->devaddr = pPortParam->m_au8RecvBuf[4]; - return; - } - cmdidx = pPortParam->m_au8RecvBuf[5]; +static void PortDataProcess(void) +{ + float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; + //uint16_t uDevAddr; + unsigned char cmdidx; + int i, j, aipnt, datanum; + SIO_PARAM_SERIAL_DEF *pPortParam; + char szbuf[64]; + + pPortParam = &serialport; + //取出装置地址,开始处理地址+++ + if (0x02 == pPortParam->m_au8RecvBuf[5]) + { + //pPortParam->devaddr = pPortParam->m_au8RecvBuf[4]; + return; + } + cmdidx = pPortParam->m_au8RecvBuf[5]; #if 0 - aipnt = pPortParam->SameTypeDevIdx; - uDevAddr = serialport->m_au8RecvBuf[4]; - if(0 == srdt.IsReadWireTem) - { - if(uDevAddr != pPortParam->devaddr) - return; - } + aipnt = pPortParam->SameTypeDevIdx; + uDevAddr = serialport->m_au8RecvBuf[4]; + if (0 == srdt.IsReadWireTem) + { + if (uDevAddr != pPortParam->devaddr) + return; + } #endif - fvalua = &fvalue; - datanum = pPortParam->m_au8RecvBuf[6]; - if((0x08 != cmdidx) && (0x09 != cmdidx)) - return; - - for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) - { - if(0x08 == cmdidx) - fvalue = (pPortParam->m_au8RecvBuf[j+1]<<24)+(pPortParam->m_au8RecvBuf[j+2]<<16) - +(pPortParam->m_au8RecvBuf[j+3]<<8)+pPortParam->m_au8RecvBuf[j+4]; - else - { - *(u_char *)fvalua = pPortParam->m_au8RecvBuf[j+4]; - *((u_char *)fvalua+1) = pPortParam->m_au8RecvBuf[j+3]; - *((u_char *)fvalua+2) = pPortParam->m_au8RecvBuf[j+2]; - *((u_char *)fvalua+3) = pPortParam->m_au8RecvBuf[j+1]; - } - switch(pPortParam->m_au8RecvBuf[j]) - { - case 1: /*温度*/ - weatherpntmsg[0] = fvalue; - LOGE("温度:%0.3f ", fvalue); - break; - case 2: /*气压*/ - weatherpntmsg[5] = fvalue; - LOGE("气压:%0.3f ", fvalue); - break; - case 3: /*湿度*/ - weatherpntmsg[1] = fvalue; - LOGE("湿度:%0.3f ", fvalue); - break; - case 4: /*雨量*/ - break; - case 5: /*日照*/ - break; - case 6: /*风速*/ - weatherpntmsg[2] = fvalue; - LOGE("风速:%0.3f ", fvalue); - break; - case 7: /*风向*/ - weatherpntmsg[3] = fvalue; - LOGE("风向:%0.3f ", fvalue); - break; - case 8: /*拉力*/ - case 9: /*倾角传感器X轴倾角*/ - case 10: /*倾角传感器Y轴倾角*/ - case 11: /*测温球导线温度*/ - case 12: /*测温球内部温度*/ - break; - case 13: /*测温球导线X轴倾角*/ - break; - case 14: /*测温球导线Y轴倾角*/ - break; - case 15: /*测温球导线电流*/ - break; - case 16: /*测温球电池电压*/ - break; - case 17: /*A相泄漏电流平均值;*/ - break; - case 18: /*A相泄漏电流最大值;*/ - break; - case 19: /*A相超过3mA的脉冲频次*/ - break; - case 20: /*A相超过10mA的脉冲频次*/ - break; - case 21: /*B相泄漏电流平均值;*/ - break; - case 22: /*B相泄漏电流最大值;*/ - break; - case 23: /*B相超过3mA的脉冲频次*/ - break; - case 24: /*B相超过10mA的脉冲频次*/ - case 25: /*C相泄漏电流平均值;*/ - case 26: /*C相泄漏电流最大值;*/ - case 27: /*C相超过3mA的脉冲频次*/ - case 28: /*C相超过10mA的脉冲频次*/ - break; - } - } + fvalua = &fvalue; + datanum = pPortParam->m_au8RecvBuf[6]; + if ((0x08 != cmdidx) && (0x09 != cmdidx)) + return; + + for (i = 0, j = 7; (i < datanum) && (j < 6 + pPortParam->m_au8RecvBuf[1]); i++, j += 5) + { + if (0x08 == cmdidx) + fvalue = (pPortParam->m_au8RecvBuf[j + 1] << 24) + (pPortParam->m_au8RecvBuf[j + 2] << 16) + + (pPortParam->m_au8RecvBuf[j + 3] << 8) + pPortParam->m_au8RecvBuf[j + 4]; + else + { + *(u_char *)fvalua = pPortParam->m_au8RecvBuf[j + 4]; + *((u_char *)fvalua + 1) = pPortParam->m_au8RecvBuf[j + 3]; + *((u_char *)fvalua + 2) = pPortParam->m_au8RecvBuf[j + 2]; + *((u_char *)fvalua + 3) = pPortParam->m_au8RecvBuf[j + 1]; + } + switch (pPortParam->m_au8RecvBuf[j]) + { + case 1: /*温度*/ + weatherpntmsg[0] = fvalue; + LOGE("温度:%0.3f ", fvalue); + break; + case 2: /*气压*/ + weatherpntmsg[5] = fvalue; + LOGE("气压:%0.3f ", fvalue); + break; + case 3: /*湿度*/ + weatherpntmsg[1] = fvalue; + LOGE("湿度:%0.3f ", fvalue); + break; + case 4: /*雨量*/ + break; + case 5: /*日照*/ + break; + case 6: /*风速*/ + weatherpntmsg[2] = fvalue; + LOGE("风速:%0.3f ", fvalue); + break; + case 7: /*风向*/ + weatherpntmsg[3] = fvalue; + LOGE("风向:%0.3f ", fvalue); + break; + case 8: /*拉力*/ + case 9: /*倾角传感器X轴倾角*/ + case 10: /*倾角传感器Y轴倾角*/ + case 11: /*测温球导线温度*/ + case 12: /*测温球内部温度*/ + break; + case 13: /*测温球导线X轴倾角*/ + break; + case 14: /*测温球导线Y轴倾角*/ + break; + case 15: /*测温球导线电流*/ + break; + case 16: /*测温球电池电压*/ + break; + case 17: /*A相泄漏电流平均值;*/ + break; + case 18: /*A相泄漏电流最大值;*/ + break; + case 19: /*A相超过3mA的脉冲频次*/ + break; + case 20: /*A相超过10mA的脉冲频次*/ + break; + case 21: /*B相泄漏电流平均值;*/ + break; + case 22: /*B相泄漏电流最大值;*/ + break; + case 23: /*B相超过3mA的脉冲频次*/ + break; + case 24: /*B相超过10mA的脉冲频次*/ + case 25: /*C相泄漏电流平均值;*/ + case 26: /*C相泄漏电流最大值;*/ + case 27: /*C相超过3mA的脉冲频次*/ + case 28: /*C相超过10mA的脉冲频次*/ + break; + } + } } /*************************************************************** @@ -202,344 +207,345 @@ static void PortDataProcess( void ) ***************************************************************/ static void RecvData(u_char *buf, int len)// 规约读数据处理 { - int i, ictime; - //WORD crc, check; - SIO_PARAM_SERIAL_DEF *pPortParam; - - pPortParam = &serialport; - ictime = (int)time(NULL); - - if(pPortParam->m_iRecvLen == 0) - { - pPortParam->iRecvTime = ictime; - } - else - { - if((ictime-pPortParam->iRecvTime > 6) || (ictime - pPortParam->iRecvTime < 0)) - pPortParam->iRecvTime = ictime; - else if(ictime - pPortParam->iRecvTime > 2) - { - pPortParam->m_iRecvLen = 0; - pPortParam->m_iRevStatus = 0; - } - } + int i, ictime; + //uint16_t crc, check; + SIO_PARAM_SERIAL_DEF *pPortParam; + + pPortParam = &serialport; + ictime = (int)time(NULL); + + if (pPortParam->m_iRecvLen == 0) + { + pPortParam->iRecvTime = ictime; + } + else + { + if ((ictime - pPortParam->iRecvTime > 6) || (ictime - pPortParam->iRecvTime < 0)) + pPortParam->iRecvTime = ictime; + else if (ictime - pPortParam->iRecvTime > 2) + { + pPortParam->m_iRecvLen = 0; + pPortParam->m_iRevStatus = 0; + } + } - for(i=0; im_iRevStatus) - { - case 0: // 0x68 - pPortParam->m_iRecvLen = 0; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 1: // len1 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus++; - break; - case 2: // len2 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2]) - { - pPortParam->m_iRevStatus++; - pPortParam->m_iNeedRevLength = buf[i]+5; - } - else - pPortParam->m_iRevStatus = 18; - break; - case 3: // 0x68 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iNeedRevLength--; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 4: // 正确接收数据 - pPortParam->m_iNeedRevLength--; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iNeedRevLength > 0) - break; - if(buf[i] != 0x16) - { - pPortParam->m_iRevStatus=18; - break; - } - - //if(CheckLpcError(serialport->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE) - { - PortDataProcess(); - pPortParam->m_iRevStatus = 0; - pPortParam->RevCmdFlag = 1; - } - pPortParam->m_iRecvLen = 0; - break; - case 255:// 错误接收数据 - default: - if(buf[i] == 0x68) - { - pPortParam->m_iRevStatus = 1; - pPortParam->m_iRecvLen = 1; - pPortParam->m_au8RecvBuf[0] = buf[i]; - } - else if(buf[i] == 0x16) - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus = 0; - pPortParam->m_iRecvLen = 0; - } - else - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iRecvLen > 200) - { - pPortParam->m_iRecvLen = 0; - } - } - break; - } - } + for (i = 0; i < len; i++) + { + switch (pPortParam->m_iRevStatus) + { + case 0: // 0x68 + pPortParam->m_iRecvLen = 0; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 1: // len1 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + break; + case 2: // len2 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2]) + { + pPortParam->m_iRevStatus++; + pPortParam->m_iNeedRevLength = buf[i] + 5; + } + else + pPortParam->m_iRevStatus = 18; + break; + case 3: // 0x68 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iNeedRevLength--; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iNeedRevLength > 0) + break; + if (buf[i] != 0x16) + { + pPortParam->m_iRevStatus = 18; + break; + } + + //if(CheckLpcError(serialport->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE) + { + PortDataProcess(); + pPortParam->m_iRevStatus = 0; + pPortParam->RevCmdFlag = 1; + } + pPortParam->m_iRecvLen = 0; + break; + case 255:// 错误接收数据 + default: + if (buf[i] == 0x68) + { + pPortParam->m_iRevStatus = 1; + pPortParam->m_iRecvLen = 1; + pPortParam->m_au8RecvBuf[0] = buf[i]; + } + else if (buf[i] == 0x16) + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus = 0; + pPortParam->m_iRecvLen = 0; + } + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; + } + } } -static LONG get_msec(void ) +static int64_t get_msec(void) { - struct timeval tv; + struct timeval tv; - gettimeofday(&tv, NULL); - LONG time_in_msec = tv.tv_sec * 1000 + tv.tv_usec/1000; + gettimeofday(&tv, NULL); + int64_t time_in_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000; - return time_in_msec; + return time_in_msec; } //int inum =0; //int itimecnt=0; static int weather_comm(SERIAL_PARAM weatherport) { - int fd = -1; - int len, i,ret, icnt=0; - LONG ictime, iruntime, isendtime, irecvtime; - unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x01,0x09,0x0a,0x16}; - char recvbuf[256], szbuf[512]; - //char serial_description[] = "/dev/ttyS0"; + int fd = -1; + int len, i, ret, icnt = 0; + int64_t ictime, iruntime, isendtime, irecvtime; + unsigned char sendbuf[] = { 0x68,0x00,0x00,0x68,0x01,0x09,0x0a,0x16 }; + char recvbuf[256], szbuf[512]; + //char serial_description[] = "/dev/ttyS0"; #if 0 - DIR *dir = opendir("/dev"); - if (dir == NULL) { - LOGE("_test_ opendir"); - return -1; - } - - // 读取目录项 - struct dirent *entry; - while ((entry = readdir(dir)) != NULL) { - // 过滤出串口设备,通常以"ttyS"或"ttyUSB"开头 - if ((strncmp(entry->d_name, "ttyS2", 5) == 0) || - (strncmp(entry->d_name, "ttyS0", 5) == 0)) { - LOGE("_test_ Found serial port: %s\n", entry->d_name); - } - } + DIR *dir = opendir("/dev"); + if (dir == NULL) { + LOGE("_test_ opendir"); + return -1; + } + + // 读取目录项 + struct dirent *entry; + while ((entry = readdir(dir)) != NULL) { + // 过滤出串口设备,通常以"ttyS"或"ttyUSB"开头 + if ((strncmp(entry->d_name, "ttyS2", 5) == 0) || + (strncmp(entry->d_name, "ttyS0", 5) == 0)) { + LOGE("_test_ Found serial port: %s\n", entry->d_name); + } + } - // 关闭目录 - closedir(dir); + // 关闭目录 + closedir(dir); #endif - serialport.RevCmdFlag = 1; - serialport.m_iRecvLen = 0; - serialport.m_iRevStatus = 0; + serialport.RevCmdFlag = 1; + serialport.m_iRecvLen = 0; + serialport.m_iRevStatus = 0; + + set12VEnable(true); + setCam3V3Enable(true); + setRS485Enable(true); + sleep(2); + //ictime = (int)time(NULL); + ictime = get_msec(); + for (;;) + { + if (fd < 0) + { + fd = open(weatherport.pathname, O_RDWR | O_NDELAY); + //fd = open(weatherport.pathname, O_RDWR | O_NOCTTY); + if (fd < 0) + { + LOGE("_test_ open serial error \n"); + perror(weatherport.pathname); + return -1; + } + + ret = set_port_attr(fd, weatherport.baudrate, weatherport.databit, weatherport.stopbit, weatherport.parity, 0, 0);/*9600 8n1 */ + if (ret < 0) + { + LOGE("_test_ set uart arrt faile \n"); + return -1; + } + } - set12VEnable(true); - setCam3V3Enable(true); - setRS485Enable(true); - sleep(2); - //ictime = (int)time(NULL); - ictime = get_msec(); - for(;;) - { - if(fd < 0) - { - fd = open(weatherport.pathname, O_RDWR | O_NDELAY); - //fd = open(weatherport.pathname, O_RDWR | O_NOCTTY); - if(fd < 0) - { - LOGE("_test_ open serial error \n"); - perror(weatherport.pathname); - return -1; - } - - ret= set_port_attr (fd, weatherport.baudrate,weatherport.databit,weatherport.stopbit,weatherport.parity,0,0 );/*9600 8n1 */ - if(ret < 0) - { - LOGE("_test_ set uart arrt faile \n"); - return -1; - } - } - - usleep(10000); - //iruntime = (int)time(NULL); - iruntime = get_msec(); - if((iruntime - ictime > 120000) || (iruntime - ictime < 0)) - ictime = iruntime; - if(iruntime - ictime > 20000) - { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "气象采样时间=%0.3f秒,停止采样!", (iruntime-ictime)/1000.0); - LOGE("%s", szbuf); - break; - } - - if(1 == serialport.RevCmdFlag) - { - set485WriteMode(); - - len = write(fd, sendbuf, sizeof(sendbuf));/* 向串囗发送字符串 */ - serialport.RevCmdFlag = 0; - LOGE("发送命令时间差%ld毫秒", get_msec()-isendtime); - //isendtime = time(NULL); - isendtime = get_msec(); - if (len < 0) { - LOGE("write data error \n"); - return -1; - } else { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "Send:"); - for (i = 0; i < len; i++) { - sprintf(szbuf, "%s %02X", szbuf, sendbuf[i]); - } - LOGE("%s", szbuf); - //icnt = 0; - //inum++; - } - tcdrain(fd); - //usleep(50000); - } - else - { - //irecvtime = time(NULL); - irecvtime = get_msec(); - if((irecvtime-isendtime > 6000) ||(irecvtime - isendtime < 0)) - isendtime = irecvtime; - if (irecvtime-isendtime > 300) - { - LOGE("传感器超过%ld毫秒未应答", irecvtime-isendtime); - serialport.RevCmdFlag = 1; - serialport.m_iRecvLen = 0; - serialport.m_iRevStatus = 0; - close(fd); - fd = -1; - continue; - } - } - set485ReadMode(); - memset(recvbuf, 0, sizeof(recvbuf)); - len = read(fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ - if (len < 0) { - LOGE("serial read error \n"); - continue; - } - if(0 == len) - { - //icnt++; - continue; - } - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "Recv:"); - for (i = 0; i < len; i++) { - sprintf(szbuf, "%s %02X", szbuf, recvbuf[i]); - } - __android_log_print(ANDROID_LOG_INFO, "serial", "%s", szbuf); - RecvData((u_char*)recvbuf, len); - //LOGE("一周期空循环次数%d, 读取次数%d, 时间:%d %d", icnt, inum, (int)time(NULL), itimecnt); - icnt = 0; - //serialport.RevCmdFlag =1; - } + usleep(10000); + //iruntime = (int)time(NULL); + iruntime = get_msec(); + if ((iruntime - ictime > 120000) || (iruntime - ictime < 0)) + ictime = iruntime; + if (iruntime - ictime > 20000) + { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "气象采样时间=%0.3f秒,停止采样!", (iruntime - ictime) / 1000.0); + LOGE("%s", szbuf); + break; + } - close(fd); - set12VEnable(false); - setCam3V3Enable(false); - setRS485Enable(false); + if (1 == serialport.RevCmdFlag) + { + set485WriteMode(); + + len = write(fd, sendbuf, sizeof(sendbuf));/* 向串囗发送字符串 */ + serialport.RevCmdFlag = 0; + LOGE("发送命令时间差%ld毫秒", get_msec() - isendtime); + //isendtime = time(NULL); + isendtime = get_msec(); + if (len < 0) { + LOGE("write data error \n"); + return -1; + } + else { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "Send:"); + for (i = 0; i < len; i++) { + sprintf(szbuf, "%s %02X", szbuf, sendbuf[i]); + } + LOGE("%s", szbuf); + //icnt = 0; + //inum++; + } + tcdrain(fd); + //usleep(50000); + } + else + { + //irecvtime = time(NULL); + irecvtime = get_msec(); + if ((irecvtime - isendtime > 6000) || (irecvtime - isendtime < 0)) + isendtime = irecvtime; + if (irecvtime - isendtime > 300) + { + LOGE("传感器超过%ld毫秒未应答", irecvtime - isendtime); + serialport.RevCmdFlag = 1; + serialport.m_iRecvLen = 0; + serialport.m_iRevStatus = 0; + close(fd); + fd = -1; + continue; + } + } + set485ReadMode(); + memset(recvbuf, 0, sizeof(recvbuf)); + len = read(fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ + if (len < 0) { + LOGE("serial read error \n"); + continue; + } + if (0 == len) + { + //icnt++; + continue; + } + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "Recv:"); + for (i = 0; i < len; i++) { + sprintf(szbuf, "%s %02X", szbuf, recvbuf[i]); + } + __android_log_print(ANDROID_LOG_INFO, "serial", "%s", szbuf); + RecvData((u_char*)recvbuf, len); + //LOGE("一周期空循环次数%d, 读取次数%d, 时间:%d %d", icnt, inum, (int)time(NULL), itimecnt); + icnt = 0; + //serialport.RevCmdFlag =1; + } - //exit(-1); - return(0); + close(fd); + set12VEnable(false); + setCam3V3Enable(false); + setRS485Enable(false); + + //exit(-1); + return(0); } int serial_port_comm() { - SERIAL_PARAM portparm; + SERIAL_PARAM portparm; - //struct timeval tv; + //struct timeval tv; - //gettimeofday(&tv, NULL); - //LONG time_in_microseconds = tv.tv_sec * 1000000 + tv.tv_usec; + //gettimeofday(&tv, NULL); + //int64_t time_in_microseconds = tv.tv_sec * 1000000 + tv.tv_usec; - //LOGE("Current time in microseconds: %ld\n", time_in_microseconds); + //LOGE("Current time in microseconds: %ld\n", time_in_microseconds); #if 1 - memset(portparm.pathname, 0, sizeof(portparm.pathname)); - sprintf(portparm.pathname, "/dev/ttyS0"); - portparm.parity = 'N'; - portparm.databit = 8; - portparm.baudrate = B9600; - memset(portparm.stopbit, 0, sizeof(portparm.stopbit)); - sprintf(portparm.stopbit, "1"); + memset(portparm.pathname, 0, sizeof(portparm.pathname)); + sprintf(portparm.pathname, "/dev/ttyS0"); + portparm.parity = 'N'; + portparm.databit = 8; + portparm.baudrate = B9600; + memset(portparm.stopbit, 0, sizeof(portparm.stopbit)); + sprintf(portparm.stopbit, "1"); #endif - //itimecnt = (int)time(NULL); + //itimecnt = (int)time(NULL); - //for(;;) - weather_comm(portparm); - return 0; + //for(;;) + weather_comm(portparm); + return 0; } #endif - +extern int Gm_SetSerialPortParam(int commid); static speed_t getBaudrate(unsigned int baudrate) { - switch(baudrate) { - case 0: return B0; - case 50: return B50; - case 75: return B75; - case 110: return B110; - case 134: return B134; - case 150: return B150; - case 200: return B200; - case 300: return B300; - case 600: return B600; - case 1200: return B1200; - case 1800: return B1800; - case 2400: return B2400; - case 4800: return B4800; - case 9600: return B9600; - case 19200: return B19200; - case 38400: return B38400; - case 57600: return B57600; - case 115200: return B115200; - case 230400: return B230400; - case 460800: return B460800; - case 500000: return B500000; - case 576000: return B576000; - case 921600: return B921600; - case 1000000: return B1000000; - case 1152000: return B1152000; - case 1500000: return B1500000; - case 2000000: return B2000000; - case 2500000: return B2500000; - case 3000000: return B3000000; - case 3500000: return B3500000; - case 4000000: return B4000000; - default: return B9600; - } -} - -static LONG get_msec() -{ - struct timeval tv; - LONG time_in_msec=0; - - gettimeofday(&tv, NULL); - time_in_msec = tv.tv_sec; - time_in_msec *= 1000; - time_in_msec += tv.tv_usec/1000; - - return time_in_msec; + switch (baudrate) { + case 0: return B0; + case 50: return B50; + case 75: return B75; + case 110: return B110; + case 134: return B134; + case 150: return B150; + case 200: return B200; + case 300: return B300; + case 600: return B600; + case 1200: return B1200; + case 1800: return B1800; + case 2400: return B2400; + case 4800: return B4800; + case 9600: return B9600; + case 19200: return B19200; + case 38400: return B38400; + case 57600: return B57600; + case 115200: return B115200; + case 230400: return B230400; + case 460800: return B460800; + case 500000: return B500000; + case 576000: return B576000; + case 921600: return B921600; + case 1000000: return B1000000; + case 1152000: return B1152000; + case 1500000: return B1500000; + case 2000000: return B2000000; + case 2500000: return B2500000; + case 3000000: return B3000000; + case 3500000: return B3500000; + case 4000000: return B4000000; + default: return B9600; + } +} + +static int64_t get_msec() +{ + struct timeval tv; + int64_t time_in_msec = 0; + + gettimeofday(&tv, NULL); + time_in_msec = tv.tv_sec; + time_in_msec *= 1000; + time_in_msec += tv.tv_usec / 1000; + + return time_in_msec; } /* @@ -547,7 +553,7 @@ static LONG get_msec() */ void Gm_OpenSerialPower() { - /*由传送的主站的地方来控制串口电源,这里不实现*/; + /*由传送的主站的地方来控制串口电源,这里不实现*/; } // 关闭串口电源 @@ -558,18 +564,18 @@ void Gm_CloseSerialPower() // 关闭传感器电源 void Gm_CloseSensorsPower() { - //char iIoNo; - //char szbuf[128]; - int igpio; + //char iIoNo; + //char szbuf[128]; + int igpio; - //sprintf(szbuf, "Close Sensors port %d Power!", port); + //sprintf(szbuf, "Close Sensors port %d Power!", port); - /* 关闭电源*/ - //switch(port) - /* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/ - //set12VEnable(false); - //setCam3V3Enable(false); - //setRS485Enable(false); + /* 关闭电源*/ + //switch(port) + /* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/ + set12VEnable(false); + setCam3V3Enable(false); + setRS485Enable(false); #if 0 setInt(CMD_SET_WTH_POWER, 0); @@ -672,40 +678,40 @@ void Gm_OpenSensorsPower() setInt(CMD_SET_485_en4, 0); #endif - /* 打开电源*/ - //switch(port) + // 打开电源 + //switch(port) } // 查询传感器电源状态 char Gm_GetSensorsPowerState(int port) { - char iIoNo, cstate=0; - //char szbuf[128]; + char iIoNo, cstate = 0; + //char szbuf[128]; - /* 查询电源状态*/ - //switch(port) + /* 查询电源状态*/ + //switch(port) - return cstate; + return cstate; } void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) { - int i; - char szbuf[4096]; - - memset(szbuf, 0, sizeof(szbuf)); - if(NULL != describe) - strncpy(szbuf, describe, strlen(describe)); - for (i = 0; i < len; i++) - { - sprintf(szbuf, "%s %02X", szbuf, buf[i]); - } - SaveLogTofile(commid, szbuf); - switch (flag) - { - case 'E': + int i; + char szbuf[4096]; + + memset(szbuf, 0, sizeof(szbuf)); + if (NULL != describe) + strncpy(szbuf, describe, strlen(describe)); + for (i = 0; i < len; i++) + { + ::sprintf(szbuf, "%s %02X", szbuf, buf[i]); + } + SaveLogTofile(commid, szbuf); + switch (flag) + { + case 'E': LOGE("%s", szbuf); break; case 'I': @@ -722,491 +728,491 @@ void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) break; default: LOGI("%s", szbuf); - break; - } + break; + } } // 打开串口通讯 void Gm_OpenSerialPort(int devidx) { - int fd = -1; - char szbuf[512]; + int fd = -1; + char szbuf[512]; - if((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM)) - return; - memset(szbuf, 0, sizeof(szbuf)); - if(serialport[devparam[devidx].commid].fd <= 0) - { + if ((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM)) + return; + memset(szbuf, 0, sizeof(szbuf)); + if (serialport[devparam[devidx].commid].fd <= 0) + { fd = open(devparam[devidx].pathname, O_RDWR | O_NDELAY); - if(fd < 0) - { + if (fd < 0) + { sprintf(szbuf, "装置%d 打开串口%d %s失败!fd=%d", devidx+1, devparam[devidx].pathname, devparam[devidx].commid+1, fd); - DebugLog(devparam[devidx].commid, szbuf, 'E'); - return; - } - sprintf(szbuf, "装置%d 打开串口%d %s成功!fd=%d", devidx+1, devparam[devidx].commid+1, devparam[devidx].pathname, fd ); - DebugLog(devparam[devidx].commid, szbuf, 'I'); - serialport[devparam[devidx].commid].fd = fd; - return; - } - sprintf(szbuf, "装置%d 串口%d %s已经打开!fd=%d", devidx+1, devparam[devidx].commid+1, devparam[devidx].pathname,serialport[devparam[devidx].commid].fd); - DebugLog(devparam[devidx].commid, szbuf, 'I'); + DebugLog(devparam[devidx].commid, szbuf, 'E'); + return; + } + sprintf(szbuf, "装置%d 打开串口%d %s成功!fd=%d", devidx + 1, devparam[devidx].commid + 1, devparam[devidx].pathname, fd); + DebugLog(devparam[devidx].commid, szbuf, 'I'); + serialport[devparam[devidx].commid].fd = fd; + return; + } + sprintf(szbuf, "装置%d 串口%d %s已经打开!fd=%d", devidx + 1, devparam[devidx].commid + 1, devparam[devidx].pathname, serialport[devparam[devidx].commid].fd); + DebugLog(devparam[devidx].commid, szbuf, 'I'); } // 关闭串口通讯 void Gm_CloseSerialPort() { - int i; + int i; - for(i=0; i 0) - { - close(serialport[i].fd); - serialport[i].fd = -1; - } - } + for (i = 0; i < MAX_SERIAL_PORT_NUM; i++) + { + if (serialport[i].fd > 0) + { + close(serialport[i].fd); + serialport[i].fd = -1; + } + } } /******************************************************************************* -函数名称: int GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) +函数名称: int GM_SerialComSend(const uint8_t * cSendBuf, uint32_t nSendLen, int commid) 功能说明:串口发送数据 返回实际发送的字节数 输入参数: 输出参数: 其它说明: *********************************************************************************/ -int GM_SerialComSend(unsigned char * cSendBuf, LONG nSendLen, int commid) -{ - int i, len; - char szbuf[512]; - - memset(szbuf, 0, sizeof(szbuf)); - len = write(serialport[commid].fd, cSendBuf, (size_t)nSendLen);/* 向串囗发送字符串 */ - //serialport[commid].RevCmdFlag = 0; - //LOGE("发送命令时间差%ld毫秒", get_msec() - isendtime); - //isendtime = time(NULL); - //isendtime = get_msec(); - if (len < 0) - { - sprintf(szbuf, "write data error "); - DebugLog(commid, szbuf, 'E'); - return -1; - } - else if(len > 0) - { - ; - } - return len; +int GM_SerialComSend(unsigned char * cSendBuf, size_t nSendLen, int commid) +{ + int i, len; + char szbuf[512]; + + memset(szbuf, 0, sizeof(szbuf)); + len = write(serialport[commid].fd, cSendBuf, (size_t)nSendLen);/* 向串囗发送字符串 */ + //serialport[commid].RevCmdFlag = 0; + //LOGE("发送命令时间差%ld毫秒", get_msec() - isendtime); + //isendtime = time(NULL); + //isendtime = get_msec(); + if (len < 0) + { + sprintf(szbuf, "write data error "); + DebugLog(commid, szbuf, 'E'); + return -1; + } + else if (len > 0) + { + ; + } + return len; } int Gm_SetSerialPortParam(int commid) { - int ret; - char szbuf[128]; - SERIAL_PARAM *pPortParam=NULL; + int ret; + char szbuf[128]; + SERIAL_PARAM *pPortParam = NULL; - pPortParam = &devparam[srdt.curdevidx[commid]]; - ret= set_port_attr (serialport[commid].fd, pPortParam->baudrate,pPortParam->databit,pPortParam->stopbit,pPortParam->parity,0,0 );/*9600 8n1 */ - if(ret < 0) - { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf,"串口%d 波特率等参数设置错误!", commid+1); - DebugLog(commid, szbuf, 'E'); - return -1; - } - return ret; + pPortParam = &devparam[srdt.curdevidx[commid]]; + ret = set_port_attr(serialport[commid].fd, pPortParam->baudrate, pPortParam->databit, pPortParam->stopbit, pPortParam->parity, 0, 0);/*9600 8n1 */ + if (ret < 0) + { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "串口%d 波特率等参数设置错误!", commid + 1); + DebugLog(commid, szbuf, 'E'); + return -1; + } + return ret; } void Gm_InitSerialComm_Test() { - int i, j; - SENSOR_PARAM sensorParam[MAX_SERIAL_DEV_NUM]; + int i, j; + SENSOR_PARAM sensorParam[MAX_SERIAL_DEV_NUM]; #if 0 - srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 - for(i=0; i*/ - //sprintf(devparam[i].pathname, "/dev/swk3"); - devparam[i].commid = 0; - break; + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定具体串口分配,暂时默认使用串口1*/ + //sprintf(devparam[i].pathname, "/dev/swk3"); + devparam[i].commid = 3; + 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; + //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/swk1"); - devparam[i].commid = 1; - break; - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); - /* 目前还不确定//具体串口分配,暂时默认使用串口1*/ - //sprintf(devparam[i].pathname, "/dev/ttyS1"); - devparam[i].commid = 1; - srdt.camerauseserial = 1; - break; - default: - devparam[i].IsNoInsta = 0; - break; + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定具体串口分配,暂时默认使用串口1*/ + //sprintf(devparam[i].pathname, "/dev/swk1"); + devparam[i].commid = 1; + break; + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定//具体串口分配,暂时默认使用串口1*/ + //sprintf(devparam[i].pathname, "/dev/ttyS1"); + devparam[i].commid = 0; + srdt.camerauseserial = 0; + break; + default: + devparam[i].IsNoInsta = 0; + break; } - } + } } void GM_StartSerialComm() { - int i, j, commid; - char szbuf[64], logbuf[128]; - //LONG polltime=0; - - // 此处不能对轮询设备标识清零,否则如果先起摄像机,就会导致poll乱掉 - //memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); - //Gm_OpenSerialPower(); /* 不在这使用*/ - //FindDevUseSerialCommNo(); - // 初始化串口使用状态(需要考虑不同时间启用了摄像机使用) - for (i = 0; i < MAX_SERIAL_PORT_NUM; i++) - { - if(i == srdt.camerauseserial) - continue; - serialport[i].Retry = 0; - serialport[i].RetryTime = 800; - serialport[i].WaitTime = 20; - 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); - } + int i, j, commid; + char szbuf[64], logbuf[128]; + //int64_t polltime=0; + + // 此处不能对轮询设备标识清零,否则如果先起摄像机,就会导致poll乱掉 + //memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); + //Gm_OpenSerialPower(); /* 不在这使用*/ + //FindDevUseSerialCommNo(); + // 初始化串口使用状态(需要考虑不同时间启用了摄像机使用) + for (i = 0; i < MAX_SERIAL_PORT_NUM; i++) + { + if (i == srdt.camerauseserial) + continue; + + serialport[i].Retry = 0; + serialport[i].RetryTime = 800; + serialport[i].WaitTime = 20; + 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); + } #if 0/* 简化插入使用摄像机过程,摄像机使用单独的串口*/ - else - { - for (i = 0; i < MAX_SERIAL_PORT_NUM; i++) - { - for(j=0; j= MAX_SERIAL_PORT_NUM)) - return; - serialport[i].Retry = 0; - serialport[i].RetryTime = 1000; - 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; idevparam[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 = 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; + // 打开传感器电源 + // 打开对应的485电源 + // 打开串口通讯 + memset(logbuf, 0, sizeof(logbuf)); + 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); + } + } + + DebugLog(8, "启动数据采样!", 'I'); + /* 直接使用循环进行采样处理*/ + //polltime = get_msec(); + 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(5); + //GM_StartSerialComm(); + break; + } + } + return; } -#endif int GM_SerialTimer(void) { - int flag = -1; + int flag = -1; - GM_AllSerialComRecv(); - GM_IsCloseSensors(); - Gm_FindAllSensorsCommand(); - GM_AllSerialComRecv(); - flag = GM_CloseTimer(); - return flag; + GM_AllSerialComRecv(); + GM_IsCloseSensors(); + Gm_FindAllSensorsCommand(); + GM_AllSerialComRecv(); + flag = GM_CloseTimer(); + return flag; } /******************************************************************************** @@ -1550,59 +1436,58 @@ int GM_SerialTimer(void) *********************************************************************************/ void Gm_FindAllSensorsCommand() { - int i, j,curidx,flag; + int i, j, curidx, flag; - //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ - for(j=0; j 0) - break; - //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); - //LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); - //LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); - - - flag = -1; - switch(devparam[curidx].ProtocolIdx) - { - case WEATHER_PROTOCOL: /* 温湿度气压*/ - case RALLY_PROTOCOL: /* 拉力*/ - case WIND_PROTOCOL: /* 风速风向*/ - case SLANT_PROTOCOL: /* 倾角*/ - flag = FindNextShxyProtocolCommand(curidx); - break; - case RESERVE2_PROTOCOL: - break; - case RESERVE5_PROTOCOL: - break; - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - flag = FindNextCameraPhotoCommand(curidx); - break; - break; - } - if(flag == -1) - continue; - srdt.curdevidx[j] = curidx; - break; - } - // 发送缓冲区中命令 生成了命令之后紧接着进行命令发送 - SendCmdFormPollCmdBuf(j); - } + //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ + for (j = 1; j < MAX_SERIAL_PORT_NUM; j++) + { + // 发送缓冲区中命令 接收到了应答报文,紧接着进行缓冲区清理 + SendCmdFormPollCmdBuf(j); + // 串口已经被占用则直接跳过 + curidx = srdt.curdevidx[j]; + for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) + { + curidx = (curidx + 1) % MAX_SERIAL_DEV_NUM; + if (j != devparam[curidx].commid) + continue; + if (srdt.ms_dev[curidx].IsNeedSerial == 0) + continue; + if (serialport[devparam[curidx].commid].fd < 0) + Gm_OpenSerialPort(curidx); + if (serialport[devparam[curidx].commid].cmdlen > 0) + break; + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + //LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + //LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); + + + flag = -1; + switch (devparam[curidx].ProtocolIdx) + { + case WEATHER_PROTOCOL: /* 温湿度气压*/ + case RALLY_PROTOCOL: /* 拉力*/ + case WIND_PROTOCOL: /* 风速风向*/ + case SLANT_PROTOCOL: /* 倾角*/ + flag = FindNextShxyProtocolCommand(curidx); + break; + case RESERVE2_PROTOCOL: + break; + case RESERVE5_PROTOCOL: + break; + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + break; + break; + } + if (flag == -1) + continue; + srdt.curdevidx[j] = curidx; + break; + } + // 发送缓冲区中命令 生成了命令之后紧接着进行命令发送 + SendCmdFormPollCmdBuf(j); + } } /******************************************************************************** @@ -1614,65 +1499,65 @@ void Gm_FindAllSensorsCommand() *********************************************************************************/ void GM_IsCloseSensors() { - int i, j; - char buf[256]; - LONG lctime; - - lctime = get_msec(); - for(i=0; i 50*1000) ||(lctime-srdt.ms_dev[i].FirstCmdTimeCnt < 0)) - { - srdt.ms_dev[i].FirstCmdTimeCnt = lctime; - break; - } - if(lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 15*1000) - { - srdt.ms_dev[i].IsNeedSerial = 0; - // 关闭传感器电源 - sprintf(buf, "读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); - DebugLog(devparam[i].commid, buf, 'I'); - for(j=0;j 50 * 1000) || (lctime - srdt.ms_dev[i].FirstCmdTimeCnt < 0)) + { + srdt.ms_dev[i].FirstCmdTimeCnt = lctime; + break; + } + if (lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 15 * 1000) + { + srdt.ms_dev[i].IsNeedSerial = 0; + // 关闭传感器电源 + sprintf(buf, "读取装置%d数据%0.3f秒,关闭装置%d电源!", i + 1, (get_msec() - srdt.ms_dev[i].FirstCmdTimeCnt) / 1000.0, i + 1); + DebugLog(devparam[i].commid, buf, 'I'); + for (j = 0; j < MAX_DEV_VALUE_NUM; j++) + { + if (SER_STARTSAMPLE == srdt.ms_dev[i].aiValue[j].AiState) + srdt.ms_dev[i].aiValue[j].AiState = SER_SAMPLEFAIL; + else if (SER_SAMPLE == srdt.ms_dev[i].aiValue[j].AiState) + srdt.ms_dev[i].aiValue[j].AiState = SAMPLINGSUCCESS; + } + for (j = 0; j < WEATHER_DATA_NUM; j++) + { + if (SER_STARTSAMPLE == weatherpntmsg[j].AiState) + weatherpntmsg[j].AiState = SER_SAMPLEFAIL; + else if (SER_SAMPLE == weatherpntmsg[j].AiState) + weatherpntmsg[j].AiState = SAMPLINGSUCCESS; + } + } + break; + case PELCO_D_PROTOCOL: /* 摄像机类型*/ + case PELCO_P_PROTOCOL: /* 摄像机类型*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + if (-1 == srdt.ms_dev[i].SerialCmdidx) + { + if ((SER_STARTSAMPLE == srdt.ms_dev[i].image.state) || (SER_SAMPLE == srdt.ms_dev[i].image.state)) + srdt.ms_dev[i].image.state = SER_SAMPLEFAIL; + else if (PHOTO_SAVE_SUCC == srdt.ms_dev[i].image.state) + srdt.ms_dev[i].image.state = SAMPLINGSUCCESS; + srdt.ms_dev[i].IsNeedSerial = 0; + sprintf(buf, "通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); + DebugLog(devparam[i].commid, buf, 'I'); + } + break; + } + } } /******************************************************************************** @@ -1684,27 +1569,27 @@ void GM_IsCloseSensors() *********************************************************************************/ void GM_AllSerialComRecv() { - int i, j, recvlen; - u_char recvbuf[RECVDATA_MAXLENTH]; - char buf[256]; + int i, j, recvlen; + u_char recvbuf[RECVDATA_MAXLENTH]; + char buf[256]; - for(j=0; jdevparam[i].ProtocolIdx))) - break; - } - if(i < MAX_SERIAL_DEV_NUM) - { - return 1; // 寻找 - } - else // 关闭所有串口及电源 - { - Gm_CloseSerialPort(); - for(j=0; j< MAX_SERIAL_DEV_NUM; j++) - Gm_CloseSensorsPower(); - for(j=0; j devparam[i].ProtocolIdx))) + break; + } + if (i < MAX_SERIAL_DEV_NUM) + { + return 1; // 寻找 + } + else // 关闭所有串口及电源 + { + Gm_CloseSerialPort(); + for (j = 0; j < MAX_SERIAL_DEV_NUM; j++) + Gm_CloseSensorsPower(); + for (j = 0; j < MAX_SERIAL_PORT_NUM; j++) + ClearCmdFormPollCmdBuf(j); + sprintf(buf, "关闭串口定时器!"); + DebugLog(8, buf, 'I'); + return -1; + } } void SerialDataProcess(int devidx, u_char *buf, int len) { - switch(devparam[devidx].ProtocolIdx) - { + switch (devparam[devidx].ProtocolIdx) + { - case WEATHER_PROTOCOL: /* 气象*/ - case RALLY_PROTOCOL: /* 拉力*/ - case WIND_PROTOCOL: /* 风速风向*/ - case SLANT_PROTOCOL: /* 倾角*/ - ShxyProtocolRecvData(devidx, buf, len); - break; - case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ - break; - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - CameraRecvData(devidx, buf, len); - break; - } + case WEATHER_PROTOCOL: /* 气象*/ + case RALLY_PROTOCOL: /* 拉力*/ + case WIND_PROTOCOL: /* 风速风向*/ + case SLANT_PROTOCOL: /* 倾角*/ + ShxyProtocolRecvData(devidx, buf, len); + break; + case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ + break; + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + break; + } } void DebugLog(int commid, char *szbuf, char flag) { - if(NULL == szbuf) - return; - SaveLogTofile(commid, szbuf); - switch (flag) - { - case 'E': - LOGE("%s", szbuf); - break; - case 'I': - LOGI("%s", szbuf); - break; - case 'D': - LOGD("%s", szbuf); - break; - case 'V': - LOGV("%s", szbuf); - break; - case 'W': - LOGW("%s", szbuf); - break; - default: - LOGI("%s", szbuf); - break; - } + if (NULL == szbuf) + return; + SaveLogTofile(commid, szbuf); + switch (flag) + { + case 'E': + LOGE("%s", szbuf); + break; + case 'I': + LOGI("%s", szbuf); + break; + case 'D': + LOGD("%s", szbuf); + break; + case 'V': + LOGI("%s", szbuf); + break; + case 'W': + LOGW("%s", szbuf); + break; + default: + LOGI("%s", szbuf); + break; + } } int SaveLogTofile(int commid, char *szbuf) { - int status; - time_t now; - char filename[512], filedir[512], buf[128]; - FILE *fp=NULL; - struct tm t0; - struct timeval tv; - - if(NULL == szbuf) - return -1; - - now = time(NULL); - localtime_r(&now, &t0); - gettimeofday(&tv, NULL); - - memset(filedir, 0, sizeof(filedir)); - sprintf(filedir, "/sdcard/log/"); - - 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-COM%d.log", filedir,t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, commid+1); - fp = fopen(filename, "a+"); - if(NULL == fp) - return -1; - memset(buf, 0, sizeof(buf)); - sprintf(buf, "%d-%d-%d %d:%d:%d-%d ", t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, t0.tm_hour, t0.tm_min, t0.tm_sec, tv.tv_usec/1000); - fwrite(buf, 1, strlen(buf), fp); - fwrite(szbuf, 1, strlen(szbuf), fp); - memset(buf, 0, sizeof(buf)); - sprintf(buf, "\n"); - fwrite(buf, 1, strlen(buf), fp); - - fclose(fp); - return 1; -} - -int SaveImageDataTofile(int devno) -{ - 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); - 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(szbuf, 0, sizeof(szbuf)); - //memset(filedir, 0, sizeof(filedir)); - //sprintf(filedir, "/sdcard/photo/"); - - if(access(srdt.filedir, 0)==0) - { - sprintf(szbuf,"文件路径%s已经存在!", srdt.filedir); - DebugLog(devparam[devno].commid, szbuf, 'I'); - } - else - { - status = mkdir(srdt.filedir, S_IRWXU | S_IRWXG | S_IRWXO); - if(status < 0) - 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+"); - if(NULL == fp) - return -1; - len = fwrite(image,1, pPortParam->image.imagelen, fp); - fclose(fp); - free(image); - image = NULL; - if(len < pPortParam->image.imagelen) - return -1; - else - { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf,"写入图片文件%s成功!", pPortParam->image.photoname); - DebugLog(devparam[devno].commid, szbuf, 'I'); - return 1; - } + int status; + time_t now; + char filename[512], filedir[512], buf[128]; + FILE *fp = NULL; + struct tm t0; + struct timeval tv; + + if (NULL == szbuf) + return -1; + + now = time(NULL); + localtime_r(&now, &t0); + gettimeofday(&tv, NULL); + + memset(filedir, 0, sizeof(filedir)); + sprintf(filedir, "/sdcard/log/"); + + 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-COM%d.log", filedir, t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, commid + 1); + fp = fopen(filename, "a+"); + if (NULL == fp) + return -1; + memset(buf, 0, sizeof(buf)); + sprintf(buf, "%d-%d-%d %d:%d:%d-%d ", t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, t0.tm_hour, t0.tm_min, t0.tm_sec, tv.tv_usec / 1000); + fwrite(buf, 1, strlen(buf), fp); + fwrite(szbuf, 1, strlen(szbuf), fp); + memset(buf, 0, sizeof(buf)); + sprintf(buf, "\n"); + fwrite(buf, 1, strlen(buf), fp); + + fclose(fp); + return 1; +} + +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; + + image = (u_char*)malloc(curserial->image.imagelen); + if (NULL == image) + return -1; + tempphoto = image; + 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)); + //memset(filedir, 0, sizeof(filedir)); + //sprintf(filedir, "/sdcard/photo/"); + + if (access(srdt.filedir, 0) == 0) + { + sprintf(szbuf, "文件路径%s已经存在!", srdt.filedir); + DebugLog(0, szbuf, 'I'); + } + else + { + status = mkdir(srdt.filedir, S_IRWXU | S_IRWXG | S_IRWXO); + if (status < 0) + return -1; + } + // 写入文件到sdcard + 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, curserial->image.imagelen, fp); + fclose(fp); + free(image); + image = NULL; + if (len < curserial->image.imagelen) + return -1; + else + { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "写入图片文件%s成功!", curserial->image.photoname); + DebugLog(0, szbuf, 'I'); + return 1; + } } /******************************************************************* * 读 摄像机 数据 * *******************************************************************/ -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; + int i; - if((devno<0) || (devno > MAX_SERIAL_DEV_NUM)) - { - return; - } - pPortParam = &serialport[devparam[devno].commid]; - - for(i=0; im_iRevStatus) - { - case 0: // 0x68 - pPortParam->m_iRecvLen = 0; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 1: // len1 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus++; - break; - case 2: // len2 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus++; - pPortParam->m_iNeedRevLength = pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2]*256+buf[i]+5; - break; - case 3: // 0x68 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iNeedRevLength--; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 4: // 正确接收数据 - pPortParam->m_iNeedRevLength--; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iNeedRevLength > 0) - break; - if(buf[i] != 0x16) - { - pPortParam->m_iRevStatus=18; - break; - } - - if(pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2] == - CalLpc( &pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen-6 )) - { - CameraPhotoPortDataProcess(devno); - pPortParam->m_iRevStatus = 0; - pPortParam->RevCmdFlag = 1; - } - else - { - pPortParam->m_iRevStatus = 0; - } - pPortParam->m_iRecvLen = 0; - break; - case 255:// 错误接收数据 - default: - if(buf[i] == 0x68) - { - pPortParam->m_iRevStatus = 1; - pPortParam->m_iRecvLen = 1; - pPortParam->m_au8RecvBuf[0] = buf[i]; - } - else if(buf[i] == 0x16) - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus = 0; - pPortParam->m_iRecvLen = 0; - } - else - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iRecvLen > 200) - { - pPortParam->m_iRecvLen = 0; - } - } - break; - } - } -} - -/********************************************************************************* + for (i = 0; i < len; i++) + { + switch (pPortParam->m_iRevStatus) + { + case 0: // 0x68 + pPortParam->m_iRecvLen = 0; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 1: // len1 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + break; + case 2: // len2 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + pPortParam->m_iNeedRevLength = pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] * 256 + buf[i] + 5; + break; + case 3: // 0x68 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iNeedRevLength--; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iNeedRevLength > 0) + break; + if (buf[i] != 0x16) + { + pPortParam->m_iRevStatus = 18; + break; + } + + if (pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] == + CalLpc(&pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen - 6)) + { + CameraPhotoPortDataProcess(pPortParam); + pPortParam->m_iRevStatus = 0; + pPortParam->RevCmdFlag = 1; + } + else + { + pPortParam->m_iRevStatus = 0; + } + pPortParam->m_iRecvLen = 0; + break; + case 255:// 错误接收数据 + default: + if (buf[i] == 0x68) + { + pPortParam->m_iRevStatus = 1; + pPortParam->m_iRecvLen = 1; + pPortParam->m_au8RecvBuf[0] = buf[i]; + } + else if (buf[i] == 0x16) + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus = 0; + pPortParam->m_iRecvLen = 0; + } + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; + } + } +} + +/********************************************************************************* CameraPhoto 端口数据处理 **********************************************************************************/ -void CameraPhotoPortDataProcess( int devno) -{ - 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]; - WORD uDevAddr; - BYTE 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; - 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) - return; - memset(szbuf, 0, sizeof(szbuf)); - switch(cmdidx) - { - case 0x10: /* 拍照应答*/ - if(0xFF == rtumsg.MsgData[6]) - { - srdt.RephotographCnt++; - if(srdt.RephotographCnt > 2) - { - pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); - } - 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]); - DebugLog(devparam[devno].commid, szbuf, 'V'); - presetno = (int)rtumsg.MsgData[i+8]; - pPortParam->image.presetno = presetno; - pPortParam->image.state = Sample; - curserial->RevCmdFlag = 1; - pPortParam->SerialCmdidx = 1; - srdt.sendphotocmdcnt = 0; - break; - case 0x11: /* 图片数据包*/ - i = 6; - iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256; - 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; - sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); - DebugLog(devparam[devno].commid, szbuf, 'V'); - curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = get_msec(); - if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) - { - if(iNo == srdt.imagepacketnum) - { /* 检查是否有漏包*/ - for(pidx = 0; pidx < srdt.imagepacketnum; pidx++) - { - if(pPortParam->image.ilen[pidx] < 1) - break; - } - if(pidx < srdt.imagepacketnum) - { - iNo = pidx; - recvend = 0; - } - else - { - if((1 == SaveImageDataTofile(devno)) && (Sample == pPortParam->image.state)) - pPortParam->image.state = PHOTO_SAVE_SUCC; - recvend = 1; - } - } - else - recvend = 0; - - if(packsize > MAX_PHOTO_FRAME_LEN) - recvend = 0xFF; - - if(1 == recvend) - { - pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ - //pPortParam->image.lastlen = packsize; - } - else if(0xFF == recvend) - { - pPortParam->SerialCmdidx = -1; - } - else - { - if((iNo > srdt.imagepacketnum) || (0 >= srdt.imagepacketnum)) - { - pPortParam->SerialCmdidx = -1; - } - else - pPortParam->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'); - if(srdt.errorPhotoNoCnt > 5) - { - pPortParam->SerialCmdidx = 0; - srdt.RephotographCnt++; - if(srdt.RephotographCnt > 2) - { - pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); - } - } - break; - case 0x03: - sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); - DebugLog(devparam[devno].commid, szbuf, 'D'); - pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = get_msec(); - break; - case 0x15: - if(0xFF == rtumsg.MsgData[6]) - { - pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "没有历史图片!结束读取图片!"); - DebugLog(devparam[devno].commid, 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; - 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]); - DebugLog(devparam[devno].commid, szbuf, 'I'); - curserial->RevCmdFlag = 1; - pPortParam->SerialCmdidx = 1; - srdt.sendphotocmdcnt = 0; - break; - case 0x16: - if(0xFF == rtumsg.MsgData[10]) - { - pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "摄像机图片保存失败!"); - DebugLog(devparam[devno].commid, szbuf, 'E'); - } - pPortParam->SerialCmdidx = -1; - if(0 == rtumsg.MsgData[10]) - { - if(0 == srdt.historyimagenum[devparam[devno].CameraChannel-1]) - { - ; - } - else - { - pPortParam->SerialCmdidx = 10003;/* 暂时不实现*/ - } - } - pPortParam->FirstCmdTimeCnt = get_msec(); - curserial->RevCmdFlag = 1; - break; - default: - curserial->RevCmdFlag = 1; - break; - } +void CameraPhotoPortDataProcess(SIO_PARAM_SERIAL_DEF *curserial) +{ + RTUMSG rtumsg; + int img_file_size, packetnum, iNo, packsize, i = 0, presetno, iphototime, pidx; + char szbuf[128]; + uint16_t uDevAddr, datalen=0; + uint8_t cmdidx, recvend; + + 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; + cmdidx = curserial->m_au8RecvBuf[5]; + uDevAddr = curserial->m_au8RecvBuf[4]; + + //sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx); + //DebugStringPrintf(szbuf, strlen(szbuf), 1); + datalen = rtumsg.MsgData[1]*256+rtumsg.MsgData[2]; + if (uDevAddr != curserial->cameraaddr) + return; + memset(szbuf, 0, sizeof(szbuf)); + switch (cmdidx) + { + case 0x10: /* 拍照应答*/ + if (0xFF == rtumsg.MsgData[6]) + { + srdt.RephotographCnt++; + if (srdt.RephotographCnt > 2) + { + curserial->SerialCmdidx = -1; + sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); + DebugLog(0, szbuf, 'E'); + } + break; + } + i = 6; + 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; + 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); + 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]; + curserial->image.presetno = presetno; + curserial->image.state = SER_SAMPLE; + curserial->RevCmdFlag = 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(&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(0, szbuf, 'V'); + curserial->RevCmdFlag = 1; + curserial->FirstCmdTimeCnt = get_msec(); + if (iNo == curserial->SerialCmdidx) + { + if (iNo == srdt.imagepacketnum) + { /* 检查是否有漏包*/ + for (pidx = 0; pidx < srdt.imagepacketnum; pidx++) + { + if (curserial->image.ilen[pidx] < 1) + break; + } + if (pidx < srdt.imagepacketnum) + { + iNo = pidx; + recvend = 0; + } + else + { + 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; + } + } + else + recvend = 0; + + if (packsize > MAX_PHOTO_FRAME_LEN) + recvend = 0xFF; + + if (1 == recvend) + { + curserial->SerialCmdidx = 10002;/* 图片读取完成*/ + } + else if (0xFF == recvend) + { + curserial->SerialCmdidx = -1; + } + else + { + if ((iNo > srdt.imagepacketnum) || (0 >= srdt.imagepacketnum)) + { + curserial->SerialCmdidx = -1; + } + else + curserial->SerialCmdidx = iNo + 1; + } + srdt.errorPhotoNoCnt = 0; + break; + } + srdt.errorPhotoNoCnt++; + sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", + curserial->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); + DebugLog(0, szbuf, 'E'); + if (srdt.errorPhotoNoCnt > 5) + { + curserial->SerialCmdidx = 0; + srdt.RephotographCnt++; + if (srdt.RephotographCnt > 2) + { + curserial->SerialCmdidx = -1; + sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); + DebugLog(0, szbuf, 'E'); + } + } + break; + case 0x03: + //sprintf(szbuf, "设置波特率%d成功", curserial->baud); + //DebugLog(devparam[devno].commid, szbuf, 'D'); + curserial->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + curserial->RevCmdFlag = 1; + curserial->FirstCmdTimeCnt = get_msec(); + break; + case 0x15: + if (0xFF == rtumsg.MsgData[6]) + { + curserial->SerialCmdidx = -1; + sprintf(szbuf, "没有历史图片!结束读取图片!"); + 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; + 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); + 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]; + curserial->image.presetno = presetno; + sprintf(szbuf, "读取历史图片,还有%d张历史图片!", srdt.historyimagenum[0]); + DebugLog(0, szbuf, 'I'); + curserial->RevCmdFlag = 1; + curserial->SerialCmdidx = 1; + srdt.sendphotocmdcnt = 0; + break; + case 0x16: + if (0xFF == rtumsg.MsgData[10]) + { + curserial->SerialCmdidx = -1; + sprintf(szbuf, "摄像机图片保存失败!"); + DebugLog(0, szbuf, 'E'); + } + curserial->SerialCmdidx = -1; + if (0 == rtumsg.MsgData[10]) + { + if (0 == srdt.historyimagenum[0]) + { + ; + } + else + { + curserial->SerialCmdidx = 10003;/* 暂时不实现*/ + } + } + curserial->FirstCmdTimeCnt = get_msec(); + curserial->RevCmdFlag = 1; + break; + default: + curserial->RevCmdFlag = 1; + break; + } } /********************************************************************************* 发送命令 **********************************************************************************/ -void SendCmdFormPollCmdBuf( int port ) -{ - char buf[128]; - int len, ret; - LONG lctime; - SIO_PARAM_SERIAL_DEF *pPortParam; - - pPortParam = &serialport[port]; - 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) - //if(pPortParam->RetryTimeCnt < pPortParam->RetryTime) - { - return; - } - pPortParam->RetryTimeCnt = lctime; - pPortParam->RetryCnt++; - if(pPortParam->RetryCnt > pPortParam->Retry) - { - ClearCmdFormPollCmdBuf(port); - } - else - { - pPortParam->SendCmdFlag = 0; - pPortParam->RevCmdFlag = 0; - pPortParam->ReSendCmdFlag = 1; - } - } - - if ( pPortParam->SendCmdFlag && pPortParam->RevCmdFlag ) - { - // 清除当前命令 - ClearCmdFormPollCmdBuf(port); - } +void SendCmdFormPollCmdBuf(int port) +{ + char buf[128]; + int len, ret; + int64_t lctime; + SIO_PARAM_SERIAL_DEF *pPortParam; + + if(port < 1) + return; + pPortParam = &serialport[port]; + 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) + //if(pPortParam->RetryTimeCnt < pPortParam->RetryTime) + { + return; + } + pPortParam->RetryTimeCnt = lctime; + pPortParam->RetryCnt++; + if (pPortParam->RetryCnt > pPortParam->Retry) + { + ClearCmdFormPollCmdBuf(port); + } + else + { + pPortParam->SendCmdFlag = 0; + pPortParam->RevCmdFlag = 0; + pPortParam->ReSendCmdFlag = 1; + } + } - 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->SendCmdFlag && pPortParam->RevCmdFlag) + { + // 清除当前命令 + ClearCmdFormPollCmdBuf(port); + } - if ( pPortParam->ReSendCmdFlag ) - len = pPortParam->cmdlen; - else - { - len = pPortParam->cmdlen; - pPortParam->RetryCnt = 0; - } - if ( len == 0 ) - return; - - serialport[devparam[srdt.curdevidx[port]].commid].m_iRecvLen = 0; // 当发送一条新指令时,清除接收状态 - serialport[devparam[srdt.curdevidx[port]].commid].m_iRevStatus = 0; - if(serialport[port].fd < 0) - return; - ret = Gm_SetSerialPortParam(port); - if(ret < 0) - return; - len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen-2, port); - if(len < 1) - { - sprintf(buf, "串口%d, 发送命令失败!", port+1); - DebugLog(port, buf, 'E'); - } - else - { + if (pPortParam->WaitTime > 0) + { + if ((lctime - pPortParam->WaitTimeCnt > 30 * pPortParam->WaitTime) || (lctime - pPortParam->WaitTimeCnt < 0)) + { + pPortParam->WaitTimeCnt = lctime; + return; + } - sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); - BytestreamLOG(port, buf, &pPortParam->PollCmd[2], len, 'D'); - sprintf(buf, "sendtimeconst= %lld", lctime-pPortParam->lsendtime); - DebugLog(port, 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; - } + 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; + + serialport[devparam[srdt.curdevidx[port]].commid].m_iRecvLen = 0; // 当发送一条新指令时,清除接收状态 + serialport[devparam[srdt.curdevidx[port]].commid].m_iRevStatus = 0; + if (serialport[port].fd < 0) + return; + //ret = Gm_SetSerialPortParam(port); + //if (ret < 0) + // return; + len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen - 2, port); + if (len < 1) + { + sprintf(buf, "串口%d, 发送命令失败!", port + 1); + DebugLog(port, buf, 'E'); + } + else + { + + sprintf(buf, "发送串口%d 装置%d命令:", port + 1, srdt.curdevidx[port] + 1); + BytestreamLOG(port, buf, &pPortParam->PollCmd[2], len, 'D'); + sprintf(buf, "sendtimeconst= %lld", lctime - pPortParam->lsendtime); + DebugLog(port, 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 ClearCmdAllFlag(int commid) { - if((commid < 0) || (commid >= MAX_SERIAL_PORT_NUM)) - return; + if ((commid < 0) || (commid >= MAX_SERIAL_PORT_NUM)) + return; - serialport[commid].RetryCnt = 0; - serialport[commid].RetryTimeCnt = get_msec(); - serialport[commid].WaitTimeCnt = get_msec(); - serialport[commid].ForceWaitFlag = 0; - serialport[commid].ForceWaitCnt = 0; - serialport[commid].SendCmdFlag = 0; - serialport[commid].RevCmdFlag = 0; - serialport[commid].ReSendCmdFlag = 0; + serialport[commid].RetryCnt = 0; + serialport[commid].RetryTimeCnt = get_msec(); + serialport[commid].WaitTimeCnt = get_msec(); + serialport[commid].ForceWaitFlag = 0; + serialport[commid].ForceWaitCnt = 0; + serialport[commid].SendCmdFlag = 0; + serialport[commid].RevCmdFlag = 0; + serialport[commid].ReSendCmdFlag = 0; } void ClearCmdFormPollCmdBuf(int port) { - //int len, idx; - SIO_PARAM_SERIAL_DEF *pPortParam; + //int len, idx; + SIO_PARAM_SERIAL_DEF *pPortParam; - if((port < 0) || (port >= MAX_SERIAL_PORT_NUM)) - return; - pPortParam = &serialport[port]; + if ((port < 0) || (port >= MAX_SERIAL_PORT_NUM)) + return; + pPortParam = &serialport[port]; - pPortParam->cmdlen = 0; - memset(pPortParam->PollCmd, 0, sizeof(pPortParam->PollCmd)); - srdt.serialstatus[port] = 0; - // 清除指令下发标识 - ClearCmdAllFlag(port); + pPortParam->cmdlen = 0; + memset(pPortParam->PollCmd, 0, sizeof(pPortParam->PollCmd)); + srdt.serialstatus[port] = 0; + // 清除指令下发标识 + ClearCmdAllFlag(port); } -// 下发串口拍照指令控制 -int FindNextCameraPhotoCommand(int devidx) +void ClearCameraCmdFormPollCmdBuf(SIO_PARAM_SERIAL_DEF *pPortParam) { - int imagesize=3, cmdno; - 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; - 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; - lcurtime = get_msec(); - if((1 > cmdno) || (10000 <= cmdno)) { - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 300) - return -1; - } - switch (cmdno) - { - 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, "串口摄像机未接或故障!结束拍照!"); - DebugLog(devparam[devidx].commid, 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'); - packetsize = (WORD)MAX_PHOTO_FRAME_LEN; - srdt.sendphotocmdcnt++; - srdt.imagepacketnum = 0; - srdt.errorPhotoNoCnt = 0; - cmdidx = 0x10; - imagesize = srdt.bImageSize; - break; - - case 10000: /* 下发设置串口波特率命令*/ - switch(devparam[devidx].baudrate) - { - case B9600: - imagesize = 0x07; - break; - case B19200: - imagesize = 0x08; - break; - case B38400: - imagesize = 0x09; - break; - default: - sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); - DebugLog(devparam[devidx].commid, szbuf, 'I'); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return -1; - } - - if(lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); - DebugLog(devparam[devidx].commid, szbuf, 'I'); - 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; + pPortParam->cmdlen = 0; + memset(pPortParam->PollCmd, 0, sizeof(pPortParam->PollCmd)); + //srdt.serialstatus[port] = 0; + // 清除指令下发标识 + ClearCameraCmdAllFlag(pPortParam); +} - case 10003: /* 读取历史图片(15H)*/ - cmdidx = 0x15; - packetsize = (WORD)MAX_PHOTO_FRAME_LEN; - break; +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; +} - case Stop_Cmd: /* 关闭功能*/ - //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 Auto_Scan: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ - Gm_CtrlPtzCmd(channel, P_Auto_Scan); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case IRIS_CLOSE: /* 光圈缩小(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_IRIS_CLOSE); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case IRIS_OPEN: /* 光圈放大(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_IRIS_OPEN); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case FOCUS_NEAR: /* 近距离聚焦(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 FOCUS_FAR: /* 远距离聚焦(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 ZOOM_WIDE: /* 远离物体(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 ZOOM_TELE: /* 接近物体(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 MOVE_DOWN: /* 向下移动镜头(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 MOVE_UP: /* 向上移动镜头(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 MOVE_LEFT: /* 向左移动镜头(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 MOVE_RIGHT: /* 向右移动镜头(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 MOVE_PRESETNO: /* 调用预置点*/ - //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 SAVE_PRESETNO: /* 设置预置点*/ - Gm_CtrlPtzCmd(channel, SET_PRESETNO+srdt.presetno); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case OPEN_TOTAL: /* 设置预置点*/ - Gm_CtrlPtzCmd(channel, D_OPEN_TOTAL); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case OPEN_MODULE_POWER: /* 设置预置点*/ - Gm_CtrlPtzCmd(channel, D_OPEN_MODULE_POWER); - 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; +// 下发串口拍照指令控制 +int FindNextCameraPhotoCommand(SIO_PARAM_SERIAL_DEF *pPortParam) +{ + int imagesize = 3, cmdno; + uint8_t channel, imagequality = 90, presetno; + uint16_t packetsize; + int64_t lcurtime; + uint8_t cmdidx = 0x10; + char szbuf[128]; + + //如果命令缓冲区仍有命令,则退出本函数 + if (-1 == pPortParam->SerialCmdidx)/* 下发拍照指令*/ + return -1; + channel = 1; + cmdno = pPortParam->SerialCmdidx; + lcurtime = get_msec(); + if ((1 > cmdno) || (10000 <= cmdno)) { + if (lcurtime - pPortParam->FirstCmdTimeCnt < 300) + return -1; + } + switch (cmdno) + { + case 0:/* 下发拍照指令*/ + if (lcurtime - pPortParam->FirstCmdTimeCnt < 3800) + return -1; + if ((lcurtime - pPortParam->FirstCmdTimeCnt > 3 * 35 * 1000) || (lcurtime - pPortParam->FirstCmdTimeCnt < 0)) + { + pPortParam->FirstCmdTimeCnt = lcurtime; + return -1; + } + + if (lcurtime - pPortParam->FirstCmdTimeCnt > 35 * 1000) + { + pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); + DebugLog(0, szbuf, 'I'); + return -1; + } + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "time=%lldms", lcurtime - pPortParam->FirstCmdTimeCnt); + DebugLog(0, szbuf, 'I'); + packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN; + srdt.sendphotocmdcnt++; + srdt.imagepacketnum = 0; + srdt.errorPhotoNoCnt = 0; + cmdidx = 0x10; + imagesize = srdt.bImageSize; + break; + + case 10000: /* 下发设置串口波特率命令*/ #if 0 - if(0 == srdt.IsSleep) - { - srdt.IsSleep++; - testComm(); - } + switch (devparam[devidx].baudrate) + { + case B9600: + imagesize = 0x07; + break; + case B19200: + imagesize = 0x08; + break; + case B38400: + imagesize = 0x09; + break; + default: + sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); + DebugLog(devparam[devidx].commid, szbuf, 'I'); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return -1; + } + + if (lcurtime - pPortParam->FirstCmdTimeCnt > 15 * 1000) + { + pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); + DebugLog(devparam[devidx].commid, szbuf, 'I'); + return -1; + } + cmdidx = 0x03; + packetsize = 0xFFFF; #endif - if(lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); - DebugLog(devparam[devidx].commid, 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; - return 1; + 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 = (uint16_t)MAX_PHOTO_FRAME_LEN; + break; + + case 10005: /* 关闭功能*/ + //Gm_CtrlPtzCmd(1, P_MOVE_LEFT); + //sleep(2); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + //sleep(20); + return 1; + case 10006: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ + Gm_CtrlPtzCmd(pPortParam, P_Auto_Scan); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10007: /* 光圈缩小(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_IRIS_CLOSE); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10008: /* 光圈放大(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_IRIS_OPEN); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10009: /* 近距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_FOCUS_NEAR); + usleep(500000); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10010: /* 远距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_FOCUS_FAR); + usleep(500000); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10011: /* 远离物体(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_ZOOM_WIDE); + usleep(500000); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10012: /* 接近物体(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_ZOOM_TELE); + usleep(500000); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10013: /* 向下移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_MOVE_DOWN); + sleep(1); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10014: /* 向上移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_MOVE_UP); + sleep(1); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10015: /* 向左移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_MOVE_LEFT); + sleep(1); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10016: /* 向右移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(pPortParam, P_MOVE_RIGHT); + sleep(1); + Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10017: /* 调用预置点*/ + //srdt.presetno = 2; + Gm_CtrlPtzCmd(pPortParam, MOVE_TO_PRESETNO + srdt.presetno); + sleep(2); + if (0 == srdt.IsSleep) + { + pPortParam->SerialCmdidx = 10017; + srdt.IsSleep++; + return 1; + } + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + srdt.IsSleep = 0; + return 1; + case 10018: /* 设置预置点*/ + Gm_CtrlPtzCmd(pPortParam, SET_PRESETNO + srdt.presetno); + usleep(100000); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + default: + imagesize = 0xFF; + packetsize = (uint16_t)pPortParam->SerialCmdidx; + cmdidx = 0x11; +#if 0 + if (0 == srdt.IsSleep) + { + srdt.IsSleep++; + testComm(); + } +#endif + if (lcurtime - pPortParam->FirstCmdTimeCnt > 35 * 1000) + { + pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!", packetsize); + DebugLog(0, szbuf, 'I'); + return -1; + } + break; + } + MakeCameraPhotoCommand(pPortParam, cmdidx, imagesize, packetsize, imagequality, srdt.sendphototime); + return 1; } /********************************************************************************* 生成 CameraPhoto命令 **********************************************************************************/ -void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoParam, BYTE Threep, int phototime ) -{ - int i, icurtime; - u_char *sendbuf; - //char szbuf[128]; - - sendbuf = serialport[devparam[portno].commid].PollCmd; - - icurtime = phototime; - i = 0; - sendbuf[i++] = 0x00; /* 强制等待时间*/ - sendbuf[i++] = 0x00; /* 强制等待时间*/ - sendbuf[i++] = 0x68; /* 起始字符*/ - sendbuf[i++] = (BYTE)0x00; /* length */ - sendbuf[i++] = (BYTE)0x00; /* length */ - sendbuf[i++] = 0x68; /* 起始字符*/ - sendbuf[i++] = (BYTE)devparam[portno].devaddr;/* 传感器地址*/ - sendbuf[i++] = cmdidx; /* 命令字*/ - switch(cmdidx) - { - case 0x02: /* */ - sendbuf[i-2] = 0xFF; - break; - case 0x03: /*设置传感器通讯参数(03H)*/ - sendbuf[i++] = 0x00; /* 波特率*/ - sendbuf[i++] = 0x00; - sendbuf[i++] = 0x00; - sendbuf[i++] = (BYTE)OneParam; - sendbuf[i++] = 0x08; /* 数据位*/ - sendbuf[i++] = 0x00; /* 校验位*/ - sendbuf[i++] = 0x01; /* 停止位*/ - break; - case 0x010: /* 拍摄图片并指定大小分包(10H)*/ - sendbuf[i++] = OneParam; /* 图片大小(Resolution)*/ - sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ - sendbuf[i++] = LOBYTE(TwoParam); - sendbuf[i++] = HIBYTE(HIWORD(icurtime+8*60*60));/* 请求拍摄图片时间(PhotoTime)*/ - sendbuf[i++] = LOBYTE(HIWORD(icurtime+8*60*60)); - sendbuf[i++] = HIBYTE(LOWORD(icurtime+8*60*60)); - sendbuf[i++] = LOBYTE(LOWORD(icurtime+8*60*60)); - sendbuf[i++] = Threep;/*图像质量(ImageQuality)*/ - sendbuf[i++] = srdt.presetno;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ - break; - case 0x11: /* 获取指定包数据(11H)*/ - sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ - sendbuf[i++] = LOBYTE(TwoParam); - break; - case 0x15: /* 读取历史图片(15H)*/ - sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ - sendbuf[i++] = LOBYTE(TwoParam); - break; - case 0x16: /* 通知摄像机图片读取完成或存储(16H)*/ - sendbuf[i++] = HIBYTE(HIWORD(OneParam));/* 需要保存或删除的图片拍摄时间*/ - sendbuf[i++] = LOBYTE(HIWORD(OneParam)); - sendbuf[i++] = HIBYTE(LOWORD(OneParam)); - sendbuf[i++] = LOBYTE(LOWORD(OneParam)); - sendbuf[i++] = (BYTE)TwoParam; /* 是否需要保存*/ - break; - } - sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6); - i+= 1; - sendbuf[i++] = 0x16; /* 信息尾*/ - sendbuf[3] = (BYTE)((i-10)>>8); - sendbuf[4] = (BYTE)(i-10); - serialport[devparam[portno].commid].cmdlen = i; - //return; +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 = pPortParam->PollCmd; + + icurtime = phototime; + i = 0; + sendbuf[i++] = 0x00; /* 强制等待时间*/ + sendbuf[i++] = 0x00; /* 强制等待时间*/ + sendbuf[i++] = 0x68; /* 起始字符*/ + sendbuf[i++] = (uint8_t)0x00; /* length */ + sendbuf[i++] = (uint8_t)0x00; /* length */ + sendbuf[i++] = 0x68; /* 起始字符*/ + sendbuf[i++] = (uint8_t)pPortParam->cameraaddr;/* 传感器地址*/ + sendbuf[i++] = cmdidx; /* 命令字*/ + switch (cmdidx) + { + case 0x02: /* */ + sendbuf[i - 2] = 0xFF; + break; + case 0x03: /*设置传感器通讯参数(03H)*/ + sendbuf[i++] = 0x00; /* 波特率*/ + sendbuf[i++] = 0x00; + sendbuf[i++] = 0x00; + sendbuf[i++] = (uint8_t)OneParam; + sendbuf[i++] = 0x08; /* 数据位*/ + sendbuf[i++] = 0x00; /* 校验位*/ + sendbuf[i++] = 0x01; /* 停止位*/ + break; + case 0x010: /* 拍摄图片并指定大小分包(10H)*/ + sendbuf[i++] = OneParam; /* 图片大小(Resolution)*/ + sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ + sendbuf[i++] = LOBYTE(TwoParam); + sendbuf[i++] = HIBYTE(HIWORD(icurtime + 8 * 60 * 60));/* 请求拍摄图片时间(PhotoTime)*/ + sendbuf[i++] = LOBYTE(HIWORD(icurtime + 8 * 60 * 60)); + sendbuf[i++] = HIBYTE(LOWORD(icurtime + 8 * 60 * 60)); + sendbuf[i++] = LOBYTE(LOWORD(icurtime + 8 * 60 * 60)); + sendbuf[i++] = Threep;/*图像质量(ImageQuality)*/ + sendbuf[i++] = srdt.presetno;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ + break; + case 0x11: /* 获取指定包数据(11H)*/ + sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ + sendbuf[i++] = LOBYTE(TwoParam); + break; + case 0x15: /* 读取历史图片(15H)*/ + sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ + sendbuf[i++] = LOBYTE(TwoParam); + break; + case 0x16: /* 通知摄像机图片读取完成或存储(16H)*/ + sendbuf[i++] = HIBYTE(HIWORD(OneParam));/* 需要保存或删除的图片拍摄时间*/ + sendbuf[i++] = LOBYTE(HIWORD(OneParam)); + sendbuf[i++] = HIBYTE(LOWORD(OneParam)); + sendbuf[i++] = LOBYTE(LOWORD(OneParam)); + sendbuf[i++] = (uint8_t)TwoParam; /* 是否需要保存*/ + break; + } + sendbuf[i] = CalLpc((u_char *)&sendbuf[6], i - 6); + i += 1; + sendbuf[i++] = 0x16; /* 信息尾*/ + sendbuf[3] = (uint8_t)((i - 10) >> 8); + sendbuf[4] = (uint8_t)(i - 10); + pPortParam->cmdlen = i; + //return; } // 准备发送云台指令 -int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) -{ - int i; - char szbuf[64]; - - srdt.PtzCmdType = ptzcmd; - // 查找装置序号 - for(i=0; i 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; +int Gm_CtrlPtzCmd(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t ptzcmd) +{ + switch (ptzcmd) + { + 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 (serialport[srdt.camerauseserial].cmdlen > 0) + return -1; + Gm_SendPelco_DCommand(pPortParam,ptzcmd); + return 1; } // 发送转动摄像机云台命令定时器 +#if 0 int Gm_Camera_Timer() { - char szbuf[128]; + char szbuf[128]; - if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) - { - switch(srdt.PtzCmdType) - { - 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(srdt.SendStopPtzCmdTimeCnt == -1) - { - if(serialport[srdt.camerauseserial].cmdlen > 0) - return -1; - if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) - Gm_SendPelco_DCommand(srdt.PtzCmdType); - else - Gm_SendPelco_pCommand(srdt.PtzCmdType); - - if((SET_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000)) - || (MOVE_TO_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000))) - { - //srdt.sampling &= 0xFD; - return 1; - } - srdt.PtzCmdType = Cmd_Cancel; - srdt.SendStopPtzCmdTimeCnt = 0; - } - return 1; + if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) + { + switch (srdt.PtzCmdType) + { + 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 (srdt.SendStopPtzCmdTimeCnt == -1) + { + if (serialport[srdt.camerauseserial].cmdlen > 0) + return -1; + if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) + Gm_SendPelco_DCommand(srdt.PtzCmdType); + else + Gm_SendPelco_pCommand(srdt.PtzCmdType); + + if ((SET_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000)) + || (MOVE_TO_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000))) + { + //srdt.sampling &= 0xFD; + return 1; + } + srdt.PtzCmdType = Cmd_Cancel; + srdt.SendStopPtzCmdTimeCnt = 0; + } + return 1; #if 0 - //if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000/TIMER_CNT) - { - if(serialport[srdt.camerauseserial].cmdlen > 0) - return -1; - if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) - Gm_SendPelco_DCommand(srdt.PtzCmdType); - else - Gm_SendPelco_pCommand(srdt.PtzCmdType); - srdt.SendStopPtzCmdTimeCnt = -1; - //srdt.sampling &= 0xFD; - return 1; - } - //else - // srdt.SendStopPtzCmdTimeCnt ++; - //return -1; + //if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000/TIMER_CNT) + { + if (serialport[srdt.camerauseserial].cmdlen > 0) + return -1; + if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) + Gm_SendPelco_DCommand(srdt.PtzCmdType); + else + Gm_SendPelco_pCommand(srdt.PtzCmdType); + srdt.SendStopPtzCmdTimeCnt = -1; + //srdt.sampling &= 0xFD; + return 1; + } + //else + // srdt.SendStopPtzCmdTimeCnt ++; + //return -1; #endif } +#endif /******************************************************************************** * 生成 PELCO_P 命令 * *********************************************************************************/ -void Gm_SendPelco_pCommand( DWORD cmdtype) -{ - int len; - BYTE commandbuf[32]; - char buf[128]; - - len = 0; - commandbuf[len++] = (BYTE)0xA0; - commandbuf[len++] = (BYTE)devparam[srdt.usecameradevidx].devaddr; - commandbuf[len++] = (BYTE)(cmdtype>>24); - commandbuf[len++] = (BYTE)(cmdtype>>16); - commandbuf[len++] = (BYTE)(cmdtype>>8); - commandbuf[len++] = (BYTE)(cmdtype); - commandbuf[len++] = (BYTE)0xAF; - commandbuf[len] = (BYTE)Gm_Pelco_pXORCheck(commandbuf, len); - 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) - { - DebugLog(srdt.camerauseserial, "发送Pelco_p命令失败", 'E'); - } - else - { - sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:", - srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel); - BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); - } - ClearCmdFormPollCmdBuf(srdt.camerauseserial); -} - -BYTE Gm_Pelco_pXORCheck( BYTE *msg, int len ) -{ - int i; - BYTE checkvalue=0; - - if(len <= 0) - return checkvalue; - checkvalue = msg[0]; - for(i=1; i> 24); + commandbuf[len++] = (uint8_t)(cmdtype >> 16); + commandbuf[len++] = (uint8_t)(cmdtype >> 8); + commandbuf[len++] = (uint8_t)(cmdtype); + commandbuf[len++] = (uint8_t)0xAF; + commandbuf[len] = (uint8_t)Gm_Pelco_pXORCheck(commandbuf, len); + 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) + { + DebugLog(srdt.camerauseserial, "发送Pelco_p命令失败", 'E'); + } + else + { + sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:", + srdt.camerauseserial + 1, devparam[srdt.usecameradevidx].CameraChannel); + BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); + } + ClearCmdFormPollCmdBuf(srdt.camerauseserial); +} + +uint8_t Gm_Pelco_pXORCheck(uint8_t *msg, int len) +{ + int i; + uint8_t checkvalue = 0; + + if (len <= 0) + return checkvalue; + checkvalue = msg[0]; + for (i = 1; i < len; i++) + checkvalue ^= msg[i]; + return checkvalue; } /******************************************************************************** * 生成 PELCO_D 命令 * *********************************************************************************/ -void Gm_SendPelco_DCommand( DWORD cmdtype) +void Gm_SendPelco_DCommand(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t cmdtype) { - int len; - BYTE commandbuf[32]; - char buf[128]; + int len; + uint8_t commandbuf[32]; + char buf[128]; - len = 0; + len = 0; #if 1 /* Pelco_D*/ - commandbuf[len++] = (BYTE)0xFF; - commandbuf[len++] = (BYTE)devparam[srdt.usecameradevidx].devaddr; - commandbuf[len++] = (BYTE)(cmdtype>>24); - commandbuf[len++] = (BYTE)(cmdtype>>16); - commandbuf[len++] = (BYTE)(cmdtype>>8); - commandbuf[len++] = (BYTE)(cmdtype); - commandbuf[len] = (BYTE)Gm_Pelco_DCheck(commandbuf, len); + commandbuf[len++] = (uint8_t)0xFF; + commandbuf[len++] = (uint8_t)pPortParam->cameraaddr; + commandbuf[len++] = (uint8_t)(cmdtype >> 24); + commandbuf[len++] = (uint8_t)(cmdtype >> 16); + commandbuf[len++] = (uint8_t)(cmdtype >> 8); + commandbuf[len++] = (uint8_t)(cmdtype); + commandbuf[len] = (uint8_t)Gm_Pelco_DCheck(commandbuf, len); #endif - len++; - serialport[srdt.camerauseserial].cmdlen = len; - Gm_SetSerialPortParam(srdt.camerauseserial); - len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); - if(len < 1) - { - DebugLog(srdt.camerauseserial, "发送Pelco_D命令失败", 'E'); - } - else - { - sprintf(buf, "发送串口%d 像机通道%d Pelco_D命令:", - srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel); - BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); - } - ClearCmdFormPollCmdBuf(srdt.camerauseserial); - //serialport[srdt.camerauseserial].ForceWaitCnt = 10; - //serialport[srdt.camerauseserial].ForceWaitFlag = 1; + len++; + pPortParam->cmdlen = len; + //Gm_SetSerialPortParam(srdt.camerauseserial); + len = GM_CameraComSend(commandbuf, len, pPortParam->fd); + if (len < 1) + { + DebugLog(0, "发送Pelco_D命令失败", 'E'); + } + else + { + sprintf(buf, "发送像机Pelco_D命令:"); + BytestreamLOG(0, buf, commandbuf, len, 'D'); + } + ClearCameraCmdFormPollCmdBuf(pPortParam); } // 计算Pelco_D校验 -BYTE Gm_Pelco_DCheck( BYTE *msg, int len ) +uint8_t Gm_Pelco_DCheck(uint8_t *msg, int len) { - int i; - BYTE checkvalue=0; + int i; + uint8_t checkvalue = 0; - if(len <= 0) - return checkvalue; - checkvalue = 0; - for(i=1; i MAX_SERIAL_PORT_NUM)) - return -1; - if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) - { - return -1; - } - //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - // return -1; - switch (cmdno) - { - case 0: /* 正常采集数据*/ - MakeShxyProtocolPollCommand(devidx, 0x09); - srdt.curdevidx[devparam[devidx].commid] = devidx; - return 1; - case 1: /* 测试读取地址*/ - MakeShxyProtocolPollCommand(devidx, 0x02); - srdt.curdevidx[devparam[devidx].commid] = devidx; - return 1; - default: - break; - } - return -1; +int FindNextShxyProtocolCommand(int devidx) +{ + int cmdno = 0; + + //如果命令缓冲区仍有命令,则退出本函数 + if ((devparam[devidx].commid + 1 < 1) || (devparam[devidx].commid + 1 > MAX_SERIAL_PORT_NUM)) + return -1; + if (get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3 * 1000) + { + return -1; + } + //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + // return -1; + switch (cmdno) + { + case 0: /* 正常采集数据*/ + MakeShxyProtocolPollCommand(devidx, 0x09); + srdt.curdevidx[devparam[devidx].commid] = devidx; + return 1; + case 1: /* 测试读取地址*/ + MakeShxyProtocolPollCommand(devidx, 0x02); + srdt.curdevidx[devparam[devidx].commid] = devidx; + return 1; + default: + break; + } + return -1; } /********************************************************************************* - 生成下发命令 + 生成下发命令 **********************************************************************************/ -void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx) -{ - int i, length=0; - int newaddr = 9, baud = 9600, stopbit = 1, parity=0; - //char buf[128]; - u_char *sendbuf; - - sendbuf = serialport[devparam[portno].commid].PollCmd; - - /* 测试变量*/ - cmdidx =cmdidx; - - i = 0; - sendbuf[i++] = 0x00; // 强制等待时间 - sendbuf[i++] = 0x00; // - sendbuf[i++] = 0x68; // 起始字符 - sendbuf[i++] = (BYTE)0x00; // length - sendbuf[i++] = (BYTE)0x00; // length - sendbuf[i++] = 0x68; - sendbuf[i++] = (BYTE)devparam[portno].devaddr; // 传感器地址 - sendbuf[i++] = cmdidx; // 命令信息0x06 - switch (cmdidx) - { - case 1: /* 设置传感器新地址*/ - sendbuf[i++] = newaddr; - length = 1; - break; - case 2: /* 广播读地址*/ - sendbuf[6] = 0xFF; - break; - case 3: /* 设置串口参数*/ - sendbuf[i++] = (u_char)(baud >> 24); - sendbuf[i++] = (u_char)(baud >> 16); - sendbuf[i++] = (u_char)(baud >> 8); - sendbuf[i++] = (u_char)baud; - sendbuf[i++] = 8; - sendbuf[i++] = parity; - sendbuf[i++] = stopbit; - length = 7; - break; - default: - break; - } - sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6); - i+= 1; - sendbuf[3] = length; - sendbuf[4] = length; - sendbuf[i++] = 0x16; // 信息尾 - serialport[devparam[portno].commid].cmdlen = i; +void MakeShxyProtocolPollCommand(int portno, uint8_t cmdidx) +{ + int i, length = 0; + int newaddr = 9, baud = 9600, stopbit = 1, parity = 0; + //char buf[128]; + u_char *sendbuf; + + sendbuf = serialport[devparam[portno].commid].PollCmd; + + /* 测试变量*/ + cmdidx = cmdidx; + + i = 0; + sendbuf[i++] = 0x00; // 强制等待时间 + sendbuf[i++] = 0x00; // + sendbuf[i++] = 0x68; // 起始字符 + sendbuf[i++] = (uint8_t)0x00; // length + sendbuf[i++] = (uint8_t)0x00; // length + sendbuf[i++] = 0x68; + sendbuf[i++] = (uint8_t)devparam[portno].devaddr; // 传感器地址 + sendbuf[i++] = cmdidx; // 命令信息0x06 + switch (cmdidx) + { + case 1: /* 设置传感器新地址*/ + sendbuf[i++] = newaddr; + length = 1; + break; + case 2: /* 广播读地址*/ + sendbuf[6] = 0xFF; + break; + case 3: /* 设置串口参数*/ + sendbuf[i++] = (u_char)(baud >> 24); + sendbuf[i++] = (u_char)(baud >> 16); + sendbuf[i++] = (u_char)(baud >> 8); + sendbuf[i++] = (u_char)baud; + sendbuf[i++] = 8; + sendbuf[i++] = parity; + sendbuf[i++] = stopbit; + length = 7; + break; + default: + break; + } + sendbuf[i] = CalLpc((u_char *)&sendbuf[6], i - 6); + i += 1; + sendbuf[3] = length; + sendbuf[4] = length; + sendbuf[i++] = 0x16; // 信息尾 + serialport[devparam[portno].commid].cmdlen = i; } unsigned char CalLpc(unsigned char *msg, int len) { - int i; - u_char retval = 0; + int i; + u_char retval = 0; - for (i = 0 ; i < len; i++) - retval += msg[i]; - return retval; + for (i = 0; i < len; i++) + retval += msg[i]; + return retval; } /*************************************************************** @@ -2993,779 +2863,1090 @@ unsigned char CalLpc(unsigned char *msg, int len) ***************************************************************/ void ShxyProtocolRecvData(int devno, u_char *buf, int len)// 规约读数据处理 { - int i, ictime; - //WORD crc, check; - //SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *pPortParam; + int i, ictime; + //uint16_t crc, check; + //SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *pPortParam; - if((devno<0) || (devno > MAX_SERIAL_DEV_NUM)) - { - return; - } - pPortParam = &serialport[devparam[devno].commid]; + if ((devno < 0) || (devno > MAX_SERIAL_DEV_NUM)) + { + return; + } + pPortParam = &serialport[devparam[devno].commid]; - for(i=0; im_iRevStatus) - { - case 0: // 0x68 - pPortParam->m_iRecvLen = 0; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 1: // len1 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus++; - break; - case 2: // len2 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2]) - { - pPortParam->m_iRevStatus++; - pPortParam->m_iNeedRevLength = buf[i]+5; - } - else - pPortParam->m_iRevStatus = 18; - break; - case 3: // 0x68 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iNeedRevLength--; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 4: // 正确接收数据 - pPortParam->m_iNeedRevLength--; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iNeedRevLength > 0) - break; - if(buf[i] != 0x16) - { - pPortParam->m_iRevStatus=18; - break; - } - - if(CheckShxyProtocolLpcError(pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE) - { - ShxyProtocolDataProcess(devno); - pPortParam->m_iRevStatus = 0; - pPortParam->RevCmdFlag = 1; - } - else - { - pPortParam->m_iRevStatus = 0; - } - pPortParam->m_iRecvLen = 0; - break; - case 255:// 错误接收数据 - default: - if(buf[i] == 0x68) - { - pPortParam->m_iRevStatus = 1; - pPortParam->m_iRecvLen = 1; - pPortParam->m_au8RecvBuf[0] = buf[i]; - } - else if(buf[i] == 0x16) - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus = 0; - pPortParam->m_iRecvLen = 0; - } - else - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iRecvLen > 200) - { - pPortParam->m_iRecvLen = 0; - } - } - break; - } - } + for (i = 0; i < len; i++) + { + switch (pPortParam->m_iRevStatus) + { + case 0: // 0x68 + pPortParam->m_iRecvLen = 0; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 1: // len1 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus++; + break; + case 2: // len2 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2]) + { + pPortParam->m_iRevStatus++; + pPortParam->m_iNeedRevLength = buf[i] + 5; + } + else + pPortParam->m_iRevStatus = 18; + break; + case 3: // 0x68 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iNeedRevLength--; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iNeedRevLength > 0) + break; + if (buf[i] != 0x16) + { + pPortParam->m_iRevStatus = 18; + break; + } + + if (CheckShxyProtocolLpcError(pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen) == 1) + { + ShxyProtocolDataProcess(devno); + pPortParam->m_iRevStatus = 0; + pPortParam->RevCmdFlag = 1; + } + else + { + pPortParam->m_iRevStatus = 0; + } + pPortParam->m_iRecvLen = 0; + break; + case 255:// 错误接收数据 + default: + if (buf[i] == 0x68) + { + pPortParam->m_iRevStatus = 1; + pPortParam->m_iRecvLen = 1; + pPortParam->m_au8RecvBuf[0] = buf[i]; + } + else if (buf[i] == 0x16) + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus = 0; + pPortParam->m_iRecvLen = 0; + } + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; + } + } } //******************************************************************************** // 检查检验和是否正确 //******************************************************************************** -int CheckShxyProtocolLpcError( u_char* msg, int len ) -{ - int bRetval = FALSE; - int iCheckLen; - - if(0x68 == msg[0]) - { - if ( msg[0] != msg[3] ) - return bRetval; - if ( msg[len-1] != 0x16 ) - return bRetval; - if ( msg[1] != msg[2] ) - return bRetval; - iCheckLen = msg[1]; - if ( CalLpc( &msg[4], iCheckLen+2 ) != msg[len-2] ) - return bRetval; - bRetval = TRUE; - } - return bRetval; +int CheckShxyProtocolLpcError(u_char* msg, int len) +{ + int bRetval = 0; + int iCheckLen; + + if (0x68 == msg[0]) + { + if (msg[0] != msg[3]) + return bRetval; + if (msg[len - 1] != 0x16) + return bRetval; + if (msg[1] != msg[2]) + return bRetval; + iCheckLen = msg[1]; + if (CalLpc(&msg[4], iCheckLen + 2) != msg[len - 2]) + return bRetval; + bRetval = 1; + } + return bRetval; } /********************************************************************************* - 上海欣影传感器协议数据处理 + 上海欣影传感器协议数据处理 **********************************************************************************/ -void ShxyProtocolDataProcess( int devno) -{ - float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; - WORD uDevAddr; - BYTE cmdidx; - int i, j, aipnt, datanum; - SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *curserial; - char szbuf[64]; - - pPortParam = &srdt.ms_dev[devno]; - curserial = &serialport[devparam[devno].commid]; - - //取出装置地址,开始处理地址+++ - if(0x02 == curserial->m_au8RecvBuf[5]) - { - devparam[devno].devaddr = curserial->m_au8RecvBuf[4]; - return; - } - - cmdidx = curserial->m_au8RecvBuf[5]; - aipnt = pPortParam->SameTypeDevIdx; - uDevAddr = curserial->m_au8RecvBuf[4]; - - fvalua = &fvalue; - memset(szbuf, 0, sizeof(szbuf)); - if(0x06 == cmdidx) - { - if(0x08 !=curserial->m_au8RecvBuf[1]) - return; - pPortParam->recvdatacnt++; - if(pPortParam->recvdatacnt < 2) - return; - // ++++++++++++++++++++++++++++ - //g_SelfTest.SensorsFault |= (0x800<m_au8RecvBuf[9]; - *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[8]; - *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[7]; - *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[6]; - if((fvalue < -59) ||(fvalue > 59)) - { - frnb = (GeneratingRandomNumber()%101-50)/1000.0; - pPortParam->aiValue[0].EuValue *= (1+frnb); - } - else - pPortParam->aiValue[0].EuValue = fvalue; - pPortParam->aiValue[0].AiState = Sample; - //slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ +void ShxyProtocolDataProcess(int devno) +{ + float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; + uint16_t uDevAddr; + uint8_t cmdidx; + int i, j, aipnt, datanum; + SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *curserial; + char szbuf[64]; + + pPortParam = &srdt.ms_dev[devno]; + curserial = &serialport[devparam[devno].commid]; + + //取出装置地址,开始处理地址+++ + if (0x02 == curserial->m_au8RecvBuf[5]) + { + devparam[devno].devaddr = curserial->m_au8RecvBuf[4]; + return; + } + + cmdidx = curserial->m_au8RecvBuf[5]; + aipnt = pPortParam->SameTypeDevIdx; + uDevAddr = curserial->m_au8RecvBuf[4]; + + fvalua = &fvalue; + memset(szbuf, 0, sizeof(szbuf)); + if (0x06 == cmdidx) + { + if (0x08 != curserial->m_au8RecvBuf[1]) + return; + pPortParam->recvdatacnt++; + if (pPortParam->recvdatacnt < 2) + return; + // ++++++++++++++++++++++++++++ + //g_SelfTest.SensorsFault |= (0x800<m_au8RecvBuf[9]; + *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[8]; + *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[7]; + *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[6]; + if ((fvalue < -59) || (fvalue > 59)) + { + frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; + pPortParam->aiValue[0].EuValue *= (1 + frnb); + } + else + pPortParam->aiValue[0].EuValue = fvalue; + pPortParam->aiValue[0].AiState = SER_SAMPLE; + //slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ // +slantpntmsg[aipnt][0].AiParam.EuValueDelta; - //slantpntmsg[aipnt][0].AiState = 1; - //if ((gDisSunRain & 0x20) == 0x20) - { - sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); - //DebugLog(devparam[devno].commid, szbuf, 'V'); - } - //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; - //srdt.SectimesamplingCnt[0] += 1; - - *(BYTE*)fvalua = curserial->m_au8RecvBuf[13]; - *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[12]; - *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[11]; - *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[10]; - //if ((gDisSunRain & 0x20) == 0x20) - { - sprintf(szbuf, "%sY =%0.3f ", szbuf, fvalue); - DebugLog(devparam[devno].commid, szbuf, 'V'); - } - if((fvalue < -59) ||(fvalue > 59)) - { - frnb = (GeneratingRandomNumber()%101-50)/1000.0; - pPortParam->aiValue[1].EuValue *= (1+frnb); - //slantpntmsg[aipnt][1].EuValue *= (1+frnb); - } - else - pPortParam->aiValue[1].EuValue = fvalue; - pPortParam->aiValue[1].AiState = Sample; - /*slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\ - +slantpntmsg[aipnt][1].AiParam.EuValueDelta; - slantpntmsg[aipnt][1].AiState = 1;*/ - //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; - srdt.SectimesamplingCnt[1] += 1; - } - datanum = curserial->m_au8RecvBuf[6]; - if((0x08 != cmdidx) && (0x09 != cmdidx)) - return; + //slantpntmsg[aipnt][0].AiState = 1; + //if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); + //DebugLog(devparam[devno].commid, szbuf, 'V'); + } + //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; + //srdt.SectimesamplingCnt[0] += 1; + + *(uint8_t*)fvalua = curserial->m_au8RecvBuf[13]; + *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[12]; + *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[11]; + *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[10]; + //if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "%sY =%0.3f ", szbuf, fvalue); + DebugLog(devparam[devno].commid, szbuf, 'V'); + } + if ((fvalue < -59) || (fvalue > 59)) + { + frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; + pPortParam->aiValue[1].EuValue *= (1 + frnb); + //slantpntmsg[aipnt][1].EuValue *= (1+frnb); + } + else + pPortParam->aiValue[1].EuValue = fvalue; + pPortParam->aiValue[1].AiState = SER_SAMPLE; + /*slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\ + +slantpntmsg[aipnt][1].AiParam.EuValueDelta; + slantpntmsg[aipnt][1].AiState = 1;*/ + //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; + srdt.SectimesamplingCnt[1] += 1; + } + datanum = curserial->m_au8RecvBuf[6]; + if ((0x08 != cmdidx) && (0x09 != cmdidx)) + return; + + for (i = 0, j = 7; (i < datanum) && (j < 6 + curserial->m_au8RecvBuf[1]); i++, j += 5) + { + if (0x08 == cmdidx) + fvalue = (curserial->m_au8RecvBuf[j + 1] << 24) + (curserial->m_au8RecvBuf[j + 2] << 16) + + (curserial->m_au8RecvBuf[j + 3] << 8) + curserial->m_au8RecvBuf[j + 4]; + else + { + *(uint8_t*)fvalua = curserial->m_au8RecvBuf[j + 4]; + *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[j + 3]; + *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[j + 2]; + *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[j + 1]; + } + switch (curserial->m_au8RecvBuf[j]) + { + case 1: /*温度*/ + if ((fvalue < -40) || (fvalue > 85)) + { + frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; + pPortParam->aiValue[AirTempNo].EuValue *= (1 + frnb); + weatherpntmsg[AirTempNo].EuValue *= (1 + frnb); + //weatherpntmsg[AirTempNo].AiState = SER_SAMPLE; + } + else + { + pPortParam->aiValue[AirTempNo].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor + pPortParam->aiValue[0].AiParam.EuValueDelta;*/ + weatherpntmsg[AirTempNo].EuValue = fvalue;/*weatherpntmsg[AirTempNo].AiParam.fFactor + weatherpntmsg[AirTempNo].AiParam.EuValueDelta;*/ + } + pPortParam->aiValue[AirTempNo].AiState = SER_SAMPLE; + weatherpntmsg[AirTempNo].AiState = SER_SAMPLE; + //g_SelfTest.SensorsFault |= (0x01); + //if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "ID:%d 温度:%0.3f ", devparam[devno].devaddr, fvalue); + //DebugLog(devparam[devno].commid, szbuf, 'V'); + } + break; + case 2: /*气压*/ + if ((fvalue < 550) || (fvalue > 1060)) + { + frnb = (GeneratingRandomNumber() % 41 - 20) / 10000.0; + pPortParam->aiValue[AtmosNo].EuValue *= (1 + frnb); + weatherpntmsg[AtmosNo].EuValue *= (1 + frnb); + } + else + { + pPortParam->aiValue[AtmosNo].EuValue = fvalue;/*pPortParam->aiValue[5].AiParam.fFactor + pPortParam->aiValue[5].AiParam.EuValueDelta;*/ + weatherpntmsg[AtmosNo].EuValue = fvalue;/*weatherpntmsg[AtmosNo].AiParam.fFactor + weatherpntmsg[AtmosNo].AiParam.EuValueDelta;*/ + } + pPortParam->aiValue[AtmosNo].AiState = SER_SAMPLE; + weatherpntmsg[AtmosNo].AiState = SER_SAMPLE; + //g_SelfTest.SensorsFault |= (0x10); + //if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "气压:%0.3f ", fvalue); + DebugLog(devparam[devno].commid, szbuf, 'V'); + } + break; + case 3: /*湿度*/ + if ((fvalue < 0) || (fvalue > 100)) + { + frnb = (GeneratingRandomNumber() % 41 - 20) / 1000.0; + pPortParam->aiValue[HumidityNo].EuValue *= (1 + frnb); + weatherpntmsg[HumidityNo].EuValue *= (1 + frnb); + } + else + { + pPortParam->aiValue[HumidityNo].EuValue = fvalue;/*pPortParam->aiValue[1].AiParam.fFactor + pPortParam->aiValue[1].AiParam.EuValueDelta;*/ + weatherpntmsg[HumidityNo].EuValue = fvalue;/*weatherpntmsg[HumidityNo].AiParam.fFactor + weatherpntmsg[HumidityNo].AiParam.EuValueDelta;*/ + } + pPortParam->aiValue[HumidityNo].AiState = SER_SAMPLE; + weatherpntmsg[HumidityNo].AiState = SER_SAMPLE; + //g_SelfTest.SensorsFault |= (0x02); + //if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "%s湿度:%0.3f ", szbuf, fvalue); + DebugLog(devparam[devno].commid, szbuf, 'V'); + } + break; + case 4: /*雨量*/ + break; + case 5: /*日照*/ + break; + case 6: /*风速*/ + if ((fvalue < 0) || (fvalue > 80)) + { + frnb = (GeneratingRandomNumber() % 41 - 20) / 1000.0; + pPortParam->aiValue[WindSpeedNo].EuValue *= (1 + frnb); + weatherpntmsg[WindSpeedNo].EuValue *= (1 + frnb); + } + else + { + pPortParam->aiValue[WindSpeedNo].EuValue = fvalue;/*pPortParam->aiValue[2].AiParam.fFactor + pPortParam->aiValue[2].AiParam.EuValueDelta;*/ + weatherpntmsg[WindSpeedNo].EuValue = fvalue;/*weatherpntmsg[WindSpeedNo].AiParam.fFactor + weatherpntmsg[WindSpeedNo].AiParam.EuValueDelta;*/ + } + pPortParam->aiValue[WindSpeedNo].AiState = SER_SAMPLE; + weatherpntmsg[WindSpeedNo].AiState = SER_SAMPLE; + //g_SelfTest.SensorsFault |= (0x04); + //if ((gDisSunRain & 0x10) == 0x10) + { + //fwind = fvalue/1000*0.95; + //if(fvalue/1000 > 25) + // fwind -= 1.2; + //sprintf(szbuf, "风速:%0.3f ", fwind); + sprintf(szbuf, "ID:%d 风速:%0.3f ", devparam[devno].devaddr, fvalue); + } + break; + case 7: /*风向*/ + if ((fvalue / 1000 < 0) || (fvalue / 1000 > 359.99)) + { + frnb = (GeneratingRandomNumber() % 41 - 20) / 1000.0; + pPortParam->aiValue[WindDirectionNo].EuValue *= (1 + frnb); + weatherpntmsg[WindDirectionNo].EuValue *= (1 + frnb); + } + else + { + pPortParam->aiValue[WindDirectionNo].EuValue = fvalue;/*pPortParam->aiValue[3].AiParam.fFactor + pPortParam->aiValue[3].AiParam.EuValueDelta;*/ + weatherpntmsg[WindDirectionNo].EuValue = fvalue;/*weatherpntmsg[WindDirectionNo].AiParam.fFactor + weatherpntmsg[WindDirectionNo].AiParam.EuValueDelta;*/ + } + pPortParam->aiValue[WindDirectionNo].AiState = SER_SAMPLE; + weatherpntmsg[WindDirectionNo].AiState = SER_SAMPLE; + //g_SelfTest.SensorsFault |= (0x08); + //if ((gDisSunRain & 0x10) == 0x10) + { + sprintf(szbuf, "%s 风向:%0.3f ", szbuf, fvalue); + DebugLog(devparam[devno].commid, szbuf, 'V'); + } + break; + case 8: /*拉力*/ + pPortParam->recvdatacnt++; + if (pPortParam->recvdatacnt < 2) + break; - for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) - { - if(0x08 == cmdidx) - fvalue = (curserial->m_au8RecvBuf[j+1]<<24)+(curserial->m_au8RecvBuf[j+2]<<16) - +(curserial->m_au8RecvBuf[j+3]<<8)+curserial->m_au8RecvBuf[j+4]; - else - { - *(BYTE*)fvalua = curserial->m_au8RecvBuf[j+4]; - *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[j+3]; - *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[j+2]; - *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[j+1]; - } - switch(curserial->m_au8RecvBuf[j]) - { - case 1: /*温度*/ - if((fvalue < -40) ||(fvalue > 85)) - { - frnb = (GeneratingRandomNumber()%101-50)/1000.0; - pPortParam->aiValue[AirTempNo].EuValue *= (1+frnb); - weatherpntmsg[AirTempNo].EuValue *= (1+frnb); - //weatherpntmsg[AirTempNo].AiState = Sample; - } - else - { - pPortParam->aiValue[AirTempNo].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor + pPortParam->aiValue[0].AiParam.EuValueDelta;*/ - weatherpntmsg[AirTempNo].EuValue = fvalue;/*weatherpntmsg[AirTempNo].AiParam.fFactor + weatherpntmsg[AirTempNo].AiParam.EuValueDelta;*/ - } - pPortParam->aiValue[AirTempNo].AiState = Sample; - weatherpntmsg[AirTempNo].AiState = Sample; - //g_SelfTest.SensorsFault |= (0x01); - //if ((gDisSunRain & 0x80) == 0x80) - { - sprintf(szbuf, "ID:%d 温度:%0.3f ", devparam[devno].devaddr, fvalue); - //DebugLog(devparam[devno].commid, szbuf, 'V'); - } - break; - case 2: /*气压*/ - if((fvalue < 550) ||(fvalue > 1060)) - { - frnb = (GeneratingRandomNumber()%41-20)/10000.0; - pPortParam->aiValue[AtmosNo].EuValue *= (1+frnb); - weatherpntmsg[AtmosNo].EuValue *= (1+frnb); - } - else - { - pPortParam->aiValue[AtmosNo].EuValue = fvalue;/*pPortParam->aiValue[5].AiParam.fFactor + pPortParam->aiValue[5].AiParam.EuValueDelta;*/ - weatherpntmsg[AtmosNo].EuValue = fvalue;/*weatherpntmsg[AtmosNo].AiParam.fFactor + weatherpntmsg[AtmosNo].AiParam.EuValueDelta;*/ - } - pPortParam->aiValue[AtmosNo].AiState = Sample; - weatherpntmsg[AtmosNo].AiState = Sample; - //g_SelfTest.SensorsFault |= (0x10); - //if ((gDisSunRain & 0x80) == 0x80) - { - sprintf(szbuf, "气压:%0.3f ", fvalue); - DebugLog(devparam[devno].commid, szbuf, 'V'); - } - break; - case 3: /*湿度*/ - if((fvalue < 0) ||(fvalue > 100)) - { - frnb = (GeneratingRandomNumber()%41-20)/1000.0; - pPortParam->aiValue[HumidityNo].EuValue *= (1+frnb); - weatherpntmsg[HumidityNo].EuValue *= (1+frnb); - } - else - { - pPortParam->aiValue[HumidityNo].EuValue = fvalue;/*pPortParam->aiValue[1].AiParam.fFactor + pPortParam->aiValue[1].AiParam.EuValueDelta;*/ - weatherpntmsg[HumidityNo].EuValue = fvalue;/*weatherpntmsg[HumidityNo].AiParam.fFactor + weatherpntmsg[HumidityNo].AiParam.EuValueDelta;*/ - } - pPortParam->aiValue[HumidityNo].AiState = Sample; - weatherpntmsg[HumidityNo].AiState = Sample; - //g_SelfTest.SensorsFault |= (0x02); - //if ((gDisSunRain & 0x80) == 0x80) - { - sprintf(szbuf, "%s湿度:%0.3f ", szbuf, fvalue); - DebugLog(devparam[devno].commid, szbuf, 'V'); - } - break; - case 4: /*雨量*/ - break; - case 5: /*日照*/ - break; - case 6: /*风速*/ - if((fvalue < 0) ||(fvalue > 80)) - { - frnb = (GeneratingRandomNumber()%41-20)/1000.0; - pPortParam->aiValue[WindSpeedNo].EuValue *= (1+frnb); - weatherpntmsg[WindSpeedNo].EuValue *= (1+frnb); - } - else - { - pPortParam->aiValue[WindSpeedNo].EuValue = fvalue;/*pPortParam->aiValue[2].AiParam.fFactor + pPortParam->aiValue[2].AiParam.EuValueDelta;*/ - weatherpntmsg[WindSpeedNo].EuValue = fvalue;/*weatherpntmsg[WindSpeedNo].AiParam.fFactor + weatherpntmsg[WindSpeedNo].AiParam.EuValueDelta;*/ - } - pPortParam->aiValue[WindSpeedNo].AiState = Sample; - weatherpntmsg[WindSpeedNo].AiState = Sample; - //g_SelfTest.SensorsFault |= (0x04); - //if ((gDisSunRain & 0x10) == 0x10) - { - //fwind = fvalue/1000*0.95; - //if(fvalue/1000 > 25) - // fwind -= 1.2; - //sprintf(szbuf, "风速:%0.3f ", fwind); - sprintf(szbuf, "ID:%d 风速:%0.3f ", devparam[devno].devaddr, fvalue); - } - break; - case 7: /*风向*/ - if((fvalue/1000 < 0) ||(fvalue/1000 > 359.99)) - { - frnb = (GeneratingRandomNumber()%41-20)/1000.0; - pPortParam->aiValue[WindDirectionNo].EuValue *= (1+frnb); - weatherpntmsg[WindDirectionNo].EuValue *= (1+frnb); - } - else - { - pPortParam->aiValue[WindDirectionNo].EuValue = fvalue;/*pPortParam->aiValue[3].AiParam.fFactor + pPortParam->aiValue[3].AiParam.EuValueDelta;*/ - weatherpntmsg[WindDirectionNo].EuValue = fvalue;/*weatherpntmsg[WindDirectionNo].AiParam.fFactor + weatherpntmsg[WindDirectionNo].AiParam.EuValueDelta;*/ - } - pPortParam->aiValue[WindDirectionNo].AiState = Sample; - weatherpntmsg[WindDirectionNo].AiState = Sample; - //g_SelfTest.SensorsFault |= (0x08); - //if ((gDisSunRain & 0x10) == 0x10) - { - sprintf(szbuf, "%s 风向:%0.3f ", szbuf, fvalue); - DebugLog(devparam[devno].commid, szbuf, 'V'); - } - break; - case 8: /*拉力*/ - pPortParam->recvdatacnt++; - if(pPortParam->recvdatacnt < 2) - break; - - pPortParam->aiValue[0].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor\ + pPortParam->aiValue[0].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor\ +pPortParam->aiValue[0].AiParam.EuValueDelta;*/ - //rallypntmsg[aipnt][0].EuValue = fvalue*rallypntmsg[aipnt][0].AiParam.fFactor\ - // +rallypntmsg[aipnt][0].AiParam.EuValueDelta; - pPortParam->aiValue[0].AiState = Sample; - //rallypntmsg[aipnt][0].AiState = 1; - sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[devno].devaddr, fvalue); - DebugLog(devparam[devno].commid, szbuf, 'V'); - //} - break; - case 9: /*倾角传感器X轴倾角*/ - if((fvalue < -59) ||(fvalue > 59)) - { - frnb = (GeneratingRandomNumber()%101-50)/1000.0; - pPortParam->aiValue[0].EuValue *= (1+frnb); - //slantpntmsg[aipnt][0].EuValue *= (1+frnb); - } - else - { - pPortParam->aiValue[0].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor\ - +pPortParam->aiValue[0].AiParam.EuValueDelta;*/ - //slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ + //rallypntmsg[aipnt][0].EuValue = fvalue*rallypntmsg[aipnt][0].AiParam.fFactor\ + // +rallypntmsg[aipnt][0].AiParam.EuValueDelta; + pPortParam->aiValue[0].AiState = SER_SAMPLE; + //rallypntmsg[aipnt][0].AiState = 1; + sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[devno].devaddr, fvalue); + DebugLog(devparam[devno].commid, szbuf, 'V'); + //} + break; + case 9: /*倾角传感器X轴倾角*/ + if ((fvalue < -59) || (fvalue > 59)) + { + frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; + pPortParam->aiValue[0].EuValue *= (1 + frnb); + //slantpntmsg[aipnt][0].EuValue *= (1+frnb); + } + else + { + pPortParam->aiValue[0].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor\ + +pPortParam->aiValue[0].AiParam.EuValueDelta;*/ + //slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ //+slantpntmsg[aipnt][0].AiParam.EuValueDelta; - } - pPortParam->aiValue[0].AiState = Sample; - //slantpntmsg[aipnt][0].AiState = 1; - sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); - break; - case 10: /*倾角传感器Y轴倾角*/ - sprintf(szbuf, "%s Y =%0.3f ", szbuf, fvalue); - DebugLog(devparam[devno].commid, szbuf, 'V'); - - if((fvalue < -59) ||(fvalue > 59)) - { - frnb = (GeneratingRandomNumber()%101-50)/1000.0; - pPortParam->aiValue[1].EuValue *= (1+frnb); - } - else - { - pPortParam->aiValue[1].EuValue = fvalue;/*pPortParam->aiValue[1].AiParam.fFactor\ - +pPortParam->aiValue[1].AiParam.EuValueDelta;*/ - } - pPortParam->aiValue[1].AiState = Sample; - //slantpntmsg[aipnt][1].AiState = 1; - break; - - } - } + } + pPortParam->aiValue[0].AiState = SER_SAMPLE; + //slantpntmsg[aipnt][0].AiState = 1; + sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); + break; + case 10: /*倾角传感器Y轴倾角*/ + sprintf(szbuf, "%s Y =%0.3f ", szbuf, fvalue); + DebugLog(devparam[devno].commid, szbuf, 'V'); + + if ((fvalue < -59) || (fvalue > 59)) + { + frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; + pPortParam->aiValue[1].EuValue *= (1 + frnb); + } + else + { + pPortParam->aiValue[1].EuValue = fvalue;/*pPortParam->aiValue[1].AiParam.fFactor\ + +pPortParam->aiValue[1].AiParam.EuValueDelta;*/ + } + pPortParam->aiValue[1].AiState = SER_SAMPLE; + //slantpntmsg[aipnt][1].AiState = 1; + break; + + } + } } void delete_old_files(const char *path, int days) { - struct stat file_stat; - struct tm *file_tm; - time_t now = time(NULL); - DIR *dir = opendir(path); - struct dirent *entry; - char szbuf[1024]; - char fullpath[256]; - - memset(szbuf, 0, sizeof(szbuf)); - if (!dir) - { - sprintf(szbuf, "delete_old_files opendir %s error ", path); - DebugLog(8, szbuf, 'E'); - return; - } - - while ((entry = readdir(dir))) - { - memset(szbuf, 0, sizeof(szbuf)); - if (entry->d_type == DT_REG) - { // 只处理普通文件 - snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name); - - if (stat(fullpath, &file_stat) == -1) - { - perror("stat"); - sprintf(szbuf, "stat"); - DebugLog(8, szbuf, 'E'); - continue; - } - - localtime_r(&(file_stat.st_mtime), file_tm); - //file_tm = localtime(&(file_stat.st_mtime)); - - if (difftime(now, mktime(file_tm)) > days * 24 * 60 * 60) - { - if (unlink(fullpath) == -1) - { // 删除文件 - perror("unlink"); - } - } - } - } + struct stat file_stat; + struct tm *file_tm; + time_t now = time(NULL); + DIR *dir = opendir(path); + struct dirent *entry; + char szbuf[1024]; + char fullpath[256]; + + memset(szbuf, 0, sizeof(szbuf)); + if (!dir) + { + sprintf(szbuf, "delete_old_files opendir %s error ", path); + DebugLog(8, szbuf, 'E'); + return; + } + + while ((entry = readdir(dir))) + { + memset(szbuf, 0, sizeof(szbuf)); + if (entry->d_type == DT_REG) + { // 只处理普通文件 + snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name); + + if (stat(fullpath, &file_stat) == -1) + { + perror("stat"); + sprintf(szbuf, "stat"); + DebugLog(8, szbuf, 'E'); + continue; + } + + localtime_r(&(file_stat.st_mtime), file_tm); + //file_tm = localtime(&(file_stat.st_mtime)); + + if (difftime(now, mktime(file_tm)) > days * 24 * 60 * 60) + { + if (unlink(fullpath) == -1) + { // 删除文件 + perror("unlink"); + } + } + } + } - closedir(dir); + closedir(dir); } /********************************************************************************* - 把16进制和10进制ASCII字符串转换成int整数 + 把16进制和10进制ASCII字符串转换成int整数 *********************************************************************************/ int ATOI(char *buf) { - int i, ilen, iRetVal; + int i, ilen, iRetVal; - if(NULL == buf) - return 0; - ilen = strlen(buf); - if(ilen > 2) - { - if((buf[0]=='0') && ((buf[1]=='x') || (buf[1]=='X'))) - { - iRetVal = 0; - for(i=2; i 2) + { + if ((buf[0] == '0') && ((buf[1] == 'x') || (buf[1] == 'X'))) + { + iRetVal = 0; + for (i = 2; i < ilen; i++) + { + iRetVal = (iRetVal << 4) + HexCharToInt(buf[i]); + } + } + else + { + iRetVal = atoi(buf); + } + } + else + { + iRetVal = atoi(buf); + } + return iRetVal; } #if 0 // 控制关闭传感器电源 -void Gm_CtrlCloseSensorsPower(int devidx) -{ - if((devidx<0) || (devidx > MAX_SERIAL_DEV_NUM-1)) - return; - srdt.ms_dev[devidx].uOpenPowerFlag = CLOSEPOWER; -} + void Gm_CtrlCloseSensorsPower(int devidx) + { + if ((devidx < 0) || (devidx > MAX_SERIAL_DEV_NUM - 1)) + return; + srdt.ms_dev[devidx].uOpenPowerFlag = CLOSEPOWER; + } -// 检查传感器电源是否应该关闭或打开 -void Gm_CheckSensorsPower(void) -{ - int i, j; + // 检查传感器电源是否应该关闭或打开 + void Gm_CheckSensorsPower(void) + { + int i, j; - for(i=0; i srdt.ms_dev[i].ProtocolIdx) ||(INVALID_PROTOCOL<=srdt.ms_dev[i].ProtocolIdx)) - continue; - if((PELCO_P_PROTOCOL == srdt.ms_dev[i].ProtocolIdx) ||(PELCO_D_PROTOCOL == srdt.ms_dev[i].ProtocolIdx) - ||( SERIALCAMERA_PROTOCOL == srdt.ms_dev[i].ProtocolIdx)) - continue; - // 需要传感器处于上电状态 - for(j=0; j srdt.ms_dev[i].ProtocolIdx) || (INVALID_PROTOCOL <= srdt.ms_dev[i].ProtocolIdx)) + continue; + if ((PELCO_P_PROTOCOL == srdt.ms_dev[i].ProtocolIdx) || (PELCO_D_PROTOCOL == srdt.ms_dev[i].ProtocolIdx) + || (SERIALCAMERA_PROTOCOL == srdt.ms_dev[i].ProtocolIdx)) + continue; + // 需要传感器处于上电状态 + for (j = 0; j < MAX_SERIAL_DEV_NUM - 2; j++) + { + if ((srdt.ms_dev[i].PowerPort == srdt.ms_dev[j].PowerPort) && (srdt.ms_dev[j].uOpenPowerFlag == OPENPOWER)) + break; + } + if (j < MAX_SERIAL_DEV_NUM - 2) + continue; - } -} + } + } #endif int GeneratingRandomNumber(void) { - int ictime, randomdate; - /* 生成随机数n-m -> rand()%(m-n+1)+n*/ - ictime = (int)time(NULL); - srand((DWORD)ictime); - randomdate = rand(); - return randomdate; + int ictime, randomdate; + /* 生成随机数n-m -> rand()%(m-n+1)+n*/ + ictime = (int)time(NULL); + srand((uint32_t)ictime); + randomdate = rand(); + return randomdate; } /* 串口启动接口函数 开始*/ void Collect_sensor_data() { #if 0 - int i; + int i; - for(i=0; ifd <= 0) + { + fd = ::open(serfile, O_RDWR | O_NDELAY); + if (fd < 0) + { + 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; +} + +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 (;;) + { + 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 - srdt.bImageSize = bImageSize; - srdt.presetno = presetno; - srdt.sendphototime = phototime; - GM_StartSerialCameraPhoto(1, cmdidx); + +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; + flag = GM_StartSerialCameraPhoto(channel, cmdidx, bImageSize, phototime, presetno, serfile, baud, addr); + return flag; } /* 串口启动接口函数 结束*/ /* 数据和图片采集数据返回函数 开始*/ int GetWeatherData(Data_DEF *data, int datano) { - int i; + int i; - if(NULL == data) - return -1; - if((AirTempNo > datano) || (datano > OpticalRadiationNo)) - return -1; - data->EuValue = weatherpntmsg[datano].EuValue; - data->AiState = weatherpntmsg[datano].AiState; - if((SampleFail == data->AiState) || (SamplingSuccess == data->AiState)) - { - weatherpntmsg[datano].AiState = Idle; - return 2; - } - return 1; + if (NULL == data) + return -1; + if ((AirTempNo > datano) || (datano > OpticalRadiationNo)) + return -1; + data->EuValue = weatherpntmsg[datano].EuValue; + data->AiState = weatherpntmsg[datano].AiState; + if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) + { + weatherpntmsg[datano].AiState = SER_IDLE; + return 2; + } + return 1; } int GetAirTempData(Data_DEF *airt) { - if(NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[AirTempNo].EuValue; - airt->AiState = weatherpntmsg[AirTempNo].AiState; - if((SampleFail == airt->AiState) || (SamplingSuccess == airt->AiState)) - { - weatherpntmsg[AirTempNo].AiState = Idle; - return 2; - } - return 1; + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[AirTempNo].EuValue; + airt->AiState = weatherpntmsg[AirTempNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) + { + weatherpntmsg[AirTempNo].AiState = SER_IDLE; + return 2; + } + return 1; } int GetHumidityData(Data_DEF *airt) { - if(NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[HumidityNo].EuValue; - airt->AiState = weatherpntmsg[HumidityNo].AiState; - if((SampleFail == airt->AiState) || (SamplingSuccess == airt->AiState)) - { - weatherpntmsg[HumidityNo].AiState = Idle; - return 2; - } - return 1; + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[HumidityNo].EuValue; + airt->AiState = weatherpntmsg[HumidityNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) + { + weatherpntmsg[HumidityNo].AiState = SER_IDLE; + return 2; + } + return 1; } int GetWindSpeedData(Data_DEF *airt) { - if(NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[WindSpeedNo].EuValue; - airt->AiState = weatherpntmsg[WindSpeedNo].AiState; - if((SampleFail == airt->AiState) || (SamplingSuccess == airt->AiState)) - { - weatherpntmsg[WindSpeedNo].AiState = Idle; - return 2; - } - return 1; + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[WindSpeedNo].EuValue; + airt->AiState = weatherpntmsg[WindSpeedNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) + { + weatherpntmsg[WindSpeedNo].AiState = SER_IDLE; + return 2; + } + return 1; } int GetWindDirectionData(Data_DEF *airt) { - if(NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[WindDirectionNo].EuValue; - airt->AiState = weatherpntmsg[WindDirectionNo].AiState; - if((SampleFail == airt->AiState) || (SamplingSuccess == airt->AiState)) - { - weatherpntmsg[WindDirectionNo].AiState = Idle; - return 2; - } - return 1; + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[WindDirectionNo].EuValue; + airt->AiState = weatherpntmsg[WindDirectionNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) + { + weatherpntmsg[WindDirectionNo].AiState = SER_IDLE; + return 2; + } + return 1; } int GetRainfallData(Data_DEF *airt) { - if(NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[RainfallNo].EuValue; - airt->AiState = weatherpntmsg[RainfallNo].AiState; - if((SampleFail == airt->AiState) || (SamplingSuccess == airt->AiState)) - { - weatherpntmsg[RainfallNo].AiState = Idle; - return 2; - } - return 1; + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[RainfallNo].EuValue; + airt->AiState = weatherpntmsg[RainfallNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) + { + weatherpntmsg[RainfallNo].AiState = SER_IDLE; + return 2; + } + return 1; } int GetAtmosData(Data_DEF *airt) { - if(NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[AtmosNo].EuValue; - airt->AiState = weatherpntmsg[AtmosNo].AiState; - if((SampleFail == airt->AiState) || (SamplingSuccess == airt->AiState)) - { - weatherpntmsg[AtmosNo].AiState = Idle; - return 2; - } - return 1; + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[AtmosNo].EuValue; + airt->AiState = weatherpntmsg[AtmosNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) + { + weatherpntmsg[AtmosNo].AiState = SER_IDLE; + return 2; + } + return 1; } int GetOpticalRadiationData(Data_DEF *airt) { - if(NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[OpticalRadiationNo].EuValue; - airt->AiState = weatherpntmsg[OpticalRadiationNo].AiState; - if((SampleFail == airt->AiState) || (SamplingSuccess == airt->AiState)) - { - weatherpntmsg[OpticalRadiationNo].AiState = Idle; - return 2; - } - return 1; + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[OpticalRadiationNo].EuValue; + airt->AiState = weatherpntmsg[OpticalRadiationNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) + { + weatherpntmsg[OpticalRadiationNo].AiState = SER_IDLE; + return 2; + } + return 1; } int GetPullValue(int devno, Data_DEF *data) { - if(NULL == data) - return -1; - if((0>devno)||(MAX_SERIAL_DEV_NUM < devno)) - return -1; - if(RALLY_PROTOCOL != devparam[devno].ProtocolIdx) - return -1; - data->EuValue = srdt.ms_dev[devno].aiValue[0].EuValue; - data->AiState = srdt.ms_dev[devno].aiValue[0].AiState; - if((SampleFail == data->AiState) || (SamplingSuccess == data->AiState)) - { - srdt.ms_dev[devno].aiValue[0].AiState = Idle; - return 2; - } - return 1; + if (NULL == data) + return -1; + if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) + return -1; + if (RALLY_PROTOCOL != devparam[devno].ProtocolIdx) + return -1; + data->EuValue = srdt.ms_dev[devno].aiValue[0].EuValue; + data->AiState = srdt.ms_dev[devno].aiValue[0].AiState; + if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) + { + srdt.ms_dev[devno].aiValue[0].AiState = SER_IDLE; + return 2; + } + return 1; } int GetAngleValue(int devno, Data_DEF *data, int Xy) { - if(NULL == data) - return -1; - if((0>devno)||(MAX_SERIAL_DEV_NUM < devno)) - return -1; - if(SLANT_PROTOCOL != devparam[devno].ProtocolIdx) - return -1; - if((0 > Xy) || (1 < Xy)) - return -1; - - data->EuValue = srdt.ms_dev[devno].aiValue[Xy].EuValue; - data->AiState = srdt.ms_dev[devno].aiValue[Xy].AiState; - if((SampleFail == data->AiState) || (SamplingSuccess == data->AiState)) - { - srdt.ms_dev[devno].aiValue[Xy].AiState = Idle; - return 2; - } - return 1; + if (NULL == data) + return -1; + if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) + return -1; + if (SLANT_PROTOCOL != devparam[devno].ProtocolIdx) + return -1; + if ((0 > Xy) || (1 < Xy)) + return -1; + + data->EuValue = srdt.ms_dev[devno].aiValue[Xy].EuValue; + data->AiState = srdt.ms_dev[devno].aiValue[Xy].AiState; + if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) + { + srdt.ms_dev[devno].aiValue[Xy].AiState = SER_IDLE; + return 2; + } + return 1; } 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; - 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; - if((SampleFail == photo->state) || (SamplingSuccess == photo->state)) - { - srdt.ms_dev[devno].image.state = Idle; - return 2; - } - return 1; + if (NULL == photo) + return -1; + photo->presetno = serialport[0].image.presetno; + photo->phototime = serialport[0].image.phototime; + memset(photo->photoname, 0, sizeof(photo->photoname)); + 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)) + { + serialport[0].image.state = SER_IDLE; + return 2; + } + return 1; } /* 数据和图片采集数据返回函数 结束*/ \ No newline at end of file diff --git a/app/src/main/cpp/SensorsProtocol.h b/app/src/main/cpp/SensorsProtocol.h index 2be9685..805149f 100644 --- a/app/src/main/cpp/SensorsProtocol.h +++ b/app/src/main/cpp/SensorsProtocol.h @@ -2,37 +2,26 @@ // Created by hyz on 2024/6/5. // -#ifndef WEATHERCOMM_H -#define WEATHERCOMM_H +#ifndef __SENSOR_PROTOCOL_H__ +#define __SENSOR_PROTOCOL_H__ #include -#include "GPIOControl.h" -#include "termios.h" -#ifndef DWORD -typedef unsigned int DWORD; -#endif -#ifndef WORD -typedef unsigned short WORD; -#endif -#ifndef BYTE -typedef unsigned char BYTE; -#endif -#ifndef LONG -typedef long long LONG; -#endif -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 +#ifndef LOBYTE +#define LOBYTE(w) ((unsigned char)(w)) #endif -#define LOBYTE(w) ((unsigned char)(w)) +#ifndef HIBYTE #define HIBYTE(w) ((unsigned char)(((unsigned short)(w) >> 8) & 0xFF)) +#endif -#define LOWORD(l) ((WORD)(l)) -#define HIWORD(l) ((WORD)((DWORD)(l) >> 16)) +#ifndef LOWORD +#define LOWORD(l) ((uint16_t)(l)) +#endif + +#ifndef HIWORD +#define HIWORD(l) ((uint16_t)((uint32_t)(l) >> 16)) +#endif #define min(a, b) ((a) < (b) ? (a) : (b)) #define MAX_STRING_LEN 32 @@ -63,11 +52,11 @@ typedef long long LONG; #define AtmosNo 5 /* 大气压数据存储序号*/ #define OpticalRadiationNo 6 /* 日照(光辐射)数据存储序号*/ -#define Idle 0 /* 传感器处于空闲状态,未启动采样*/ -#define Sample 1 /* 正在采样过程中*/ -#define SamplingSuccess 2 /* 采样结束,正常读取到数据*/ -#define StartSample 3 /* 启动采样*/ -#define SampleFail -1 /* 采样失败,未采集到数据,传感器故障或未接*/ +#define SER_IDLE 0 /* 传感器处于空闲状态,未启动采样*/ +#define SER_SAMPLE 1 /* 正在采样过程中*/ +#define SAMPLINGSUCCESS 2 /* 采样结束,正常读取到数据*/ +#define SER_STARTSAMPLE 3 /* 启动采样*/ +#define SER_SAMPLEFAIL -1 /* 采样失败,未采集到数据,传感器故障或未接*/ #define PHOTO_SAVE_SUCC 5 /* 图片保存成功*/ #define WEATHER_DATA_NUM 8 /* 气象数据最大数量(一般最多是6要素)*/ @@ -138,7 +127,7 @@ typedef long long LONG; #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/ -#define COLLECT_DATA 1 /* 调试使用*/ +#define COLLECT_DATA 0 /* 调试使用*/ #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/ #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/ @@ -152,17 +141,16 @@ typedef struct int cmd; int value; int result; - LONG value2; + uint64_t value2; char str[MAX_STRING_LEN]; }IOT_PARAM; - //SDS包类型结构 typedef struct { - BYTE PortIdx; // 信息类型 - WORD MsgType; // 信息类型 + uint8_t PortIdx; // 信息类型 + uint16_t MsgType; // 信息类型 int MsgLen; // 信息长度 - u_char MsgData[RECVDATA_MAXLENTH]; + uint8_t MsgData[RECVDATA_MAXLENTH]; } RTUMSG; typedef struct @@ -180,7 +168,7 @@ typedef struct typedef struct { - BYTE AiState; // 数据标识(-1:采样失败;0:没有采样;1:正在采样;2:采样结束;3:启动采样;) + uint8_t AiState; // 数据标识(-1:采样失败;0:没有采样;1:正在采样;2:采样结束;3:启动采样;) float EuValue; // 数据工程值 } Data_DEF; @@ -188,7 +176,7 @@ typedef struct { int imagelen; // 整个图片大小 int phototime; // 拍照时间 - u_char presetno; // 拍照预置点 + uint8_t presetno; // 拍照预置点 char photoname[512]; // 图片存储名称和路径 int state;// 标识(-1:拍照失败;0:没有拍照;1:正在取图;2:拍照成功;3:启动拍照;) } IMAGE_DEF; @@ -198,15 +186,15 @@ typedef struct int imagelen; // 整个图片大小 int imagenum; // 整个图片的总包数 int phototime; // 拍照时间 - u_char presetno; // 拍照预置点 + uint8_t presetno; // 拍照预置点 char photoname[512]; // 图片存储名称和路径 - u_char buf[MAX_PHOTO_PACKET_NUM][MAX_PHOTO_FRAME_LEN]; // 图片数据缓存 + uint8_t buf[MAX_PHOTO_PACKET_NUM][MAX_PHOTO_FRAME_LEN]; // 图片数据缓存 int ilen[MAX_PHOTO_PACKET_NUM]; // 相对应的每包图片数据的长度 int state;// 标识(-1:拍照失败;0:没有拍照;1:正在取图;2:拍照成功;3:启动拍照;) } PHOTO_DEF; // 上层调用采集传感器参数 -typedef struct +typedef struct SENSOR_PARAM { unsigned int baudrate; /* 波特率*/ int databit; /* 数据位*/ @@ -214,11 +202,11 @@ typedef struct char parity; /* 校验位*/ char pathname[64]; /* 串口文件名及路径*/ //int commNo; /* 约定的串口序号,例如我们PC机上显示的COM1。。。*/ - u_char SensorsType; /* 传感器类型索引,大于 0*/ + uint8_t SensorsType; /* 传感器类型索引,大于 0*/ int devaddr; /* 装置(传感器)使用的地址*/ - u_char IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ - u_char CameraChannel; /* 像机的通道号*/ - u_char Phase; /* 传感器所安装相别,指拉力和倾角11表示A1....*/ + uint8_t IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ + uint8_t CameraChannel; /* 像机的通道号*/ + uint8_t Phase; /* 传感器所安装相别,指拉力和倾角11表示A1....*/ } SENSOR_PARAM; // 需要配置的串口装置参数 @@ -230,11 +218,11 @@ typedef struct char parity; /* 校验位*/ char pathname[64]; /* 串口文件名及路径*/ int commid; /* 串口序号 注意:从0开始*/ - u_char ProtocolIdx; /* 规约索引,大于 0*/ + uint8_t ProtocolIdx; /* 规约索引,大于 0*/ int devaddr; /* 装置使用的地址*/ - u_char IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ - u_char CameraChannel; /* 像机的通道号*/ - u_char Phase; /* 传感器所安装相别,指拉力和倾角11表示A1....*/ + uint8_t IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ + uint8_t CameraChannel; /* 像机的通道号*/ + uint8_t Phase; /* 传感器所安装相别,指拉力和倾角11表示A1....*/ } SERIAL_PARAM; typedef struct @@ -243,40 +231,45 @@ typedef struct int m_iRecvLen; /* */ int m_iNeedRevLength; /* */ int iRecvTime; /* */ - u_char m_au8RecvBuf[RECVDATA_MAXLENTH];/* */ + uint8_t m_au8RecvBuf[RECVDATA_MAXLENTH];/* */ int fd; /* 串口打开的文件句柄*/ - u_char PollCmd[SENDDATA_MAXLENTH]; + uint8_t PollCmd[SENDDATA_MAXLENTH]; int cmdlen; // 发送缓冲区命令长度 //******************** Poll Cmd **************************** - u_char Retry; /* 重试命令次数 */ - u_char RetryCnt; /* 重试命令计数*/ - LONG RetryTime; /* 重试命令时间 */ - LONG RetryTimeCnt; /* 重试命令时间计数*/ - LONG WaitTime; /* 命令间隔时间 */ - LONG WaitTimeCnt; /* 命令间隔时间计数*/ - u_char ForceWaitFlag; /* 强制等待标志*/ - u_short ForceWaitCnt; /* 强制等待计数*/ - u_char ReSendCmdFlag; /* 重发命令标志 */ - u_char SendCmdFlag; /* 命令发送标志 */ - u_char RevCmdFlag; /* 命令正常接收标志*/ + uint8_t Retry; /* 重试命令次数 */ + uint8_t RetryCnt; /* 重试命令计数*/ + int64_t RetryTime; /* 重试命令时间 */ + int64_t RetryTimeCnt; /* 重试命令时间计数*/ + int64_t WaitTime; /* 命令间隔时间 */ + int64_t WaitTimeCnt; /* 命令间隔时间计数*/ + uint8_t ForceWaitFlag; /* 强制等待标志*/ + uint16_t ForceWaitCnt; /* 强制等待计数*/ + uint8_t ReSendCmdFlag; /* 重发命令标志 */ + uint8_t SendCmdFlag; /* 命令发送标志 */ + uint8_t RevCmdFlag; /* 命令正常接收标志*/ //********************************************************** - LONG lsendtime; /* 命令发送绝对时间计时(毫秒)*/ + int64_t lsendtime; /* 命令发送绝对时间计时(毫秒)*/ + int cameraaddr; /* 摄像机地址*/ + int SerialCmdidx; /* 正在使用的串口发送命令的命令序号(-1:表示没有命令发送) + 摄像机使用命令序号存储*/ + PHOTO_DEF image; /* 临时存储图片数据*/ + int64_t FirstCmdTimeCnt; /* 串口读取数据起始时间*/ } SIO_PARAM_SERIAL_DEF; //串口相关装置所有参数集中定义 typedef struct { //******************** 端口基本信息 ************************ - u_char IsNeedSerial; /* 是否需要使用串口通讯*/ + uint8_t IsNeedSerial; /* 是否需要使用串口通讯*/ int CmdWaitTime; /* 没有使用*/ - u_char UseSerialidx; /* 使用的串口序号*/ + uint8_t UseSerialidx; /* 使用的串口序号*/ int SerialCmdidx; /* 正在使用的串口发送命令的命令序号(-1:表示没有命令发送) 摄像机使用命令序号存储*/ int enrecvtime; /* 发送加密命令后接收到应答计时*/ - LONG FirstCmdTimeCnt; /* 串口读取数据起始时间*/ - u_char nextcmd; /* 第二次发送读取气象雨量命令 */ - u_char SameTypeDevIdx; /* 相同类型装置顺序排列序号(从0开始)*/ - u_char uOpenPowerFlag; /* 传感器上电标志(0:不需要打开; 1:需要打开)*/ + int64_t FirstCmdTimeCnt; /* 串口读取数据起始时间*/ + uint8_t nextcmd; /* 第二次发送读取气象雨量命令 */ + uint8_t SameTypeDevIdx; /* 相同类型装置顺序排列序号(从0开始)*/ + uint8_t uOpenPowerFlag; /* 传感器上电标志(0:不需要打开; 1:需要打开)*/ int recvdatacnt; /* 接收到有效数据*/ PHOTO_DEF image; /* 临时存储图片数据*/ AI_DEF aiValue[MAX_DEV_VALUE_NUM]; /* 传感器采样值*/ @@ -285,17 +278,17 @@ typedef struct //串口相关装置所有参数集中定义 typedef struct { - u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ - u_char camerauseserial; /* 摄像机使用那个串口*/ - DWORD PtzCmdType; /* 云台指令类型*/ + uint8_t clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ + uint8_t camerauseserial; /* 摄像机使用那个串口*/ + uint32_t PtzCmdType; /* 云台指令类型*/ int usecameradevidx; /* 有像机指令需要执行*/ /* 执行指令的装置序号(-1:表示没有需要执行的指令;)*/ - int SendStopPtzCmdTimeCnt; /* 发送云台停止指令*/ - u_char serialstatus[MAX_SERIAL_PORT_NUM]; /* 串口是否可以使用状态分别对应串口1、2、3*/ + int SendStopPtzCmdTimeCnt; /* 发送云台停止指令*/ + uint8_t serialstatus[MAX_SERIAL_PORT_NUM]; /* 串口是否可以使用状态分别对应串口1、2、3*/ SERIAL_DEV_DEF ms_dev[MAX_SERIAL_DEV_NUM]; /* 装置所接传感器数量*/ int UseingSerialdev[MAX_SERIAL_PORT_NUM]; /* 正在使用串口通讯的装置序号(-1,表示串口空闲)*/ int curdevidx[MAX_SERIAL_PORT_NUM]; /* 当前正在通讯的装置序号(-1表示没有装置需要通讯)*/ - u_char IsReadWireTem; /* 是否在开始读取测温数据(0:表示没有;1:是)*/ + uint8_t IsReadWireTem; /* 是否在开始读取测温数据(0:表示没有;1:是)*/ //int proruntime; /* 程序运行时间*/ int IsSleep; /* 是否使程序休眠(1:不休眠;2:休眠)*/ int tempsamplingstartime; /* 测温启动距离采样启动时间间隔*/ @@ -316,16 +309,16 @@ typedef struct int sendphotocmdcnt; /* 一次拍照过程中发送拍照指令计数*/ int photographtime; /* 图片拍摄的时间*/ int iLastGetPhotoNo; /* 设置串口摄像机参数时暂存拍照命令序号*/ - u_char bImageSize; /* 用于临时存储接收上层命令的图片大小*/ - u_char presetno; /* 用于临时存储接收上层命令的预置点*/ + uint8_t bImageSize; /* 用于临时存储接收上层命令的图片大小*/ + uint8_t presetno; /* 用于临时存储接收上层命令的预置点*/ char filedir[512]; /* 用于摄像机拍照之后暂时存放的路径*/ #endif - u_char errorPhotoNoCnt; /* 串口摄像机拍照时回应错误包号计数(如:召第6包回应第3包)*/ - u_char RephotographCnt; /* 串口摄像机重拍计数(只在读照片数据应答出错时才重拍)*/ + uint8_t errorPhotoNoCnt; /* 串口摄像机拍照时回应错误包号计数(如:召第6包回应第3包)*/ + uint8_t RephotographCnt; /* 串口摄像机重拍计数(只在读照片数据应答出错时才重拍)*/ } SRDT_DEF; static void PortDataProcess( void ); -static LONG get_msec(); +static int64_t get_msec(); int serial_port_comm(); static int weather_comm(SERIAL_PARAM weatherport); @@ -352,12 +345,12 @@ void Gm_CloseSerialPort(); void DebugLog(int commid, char *szbuf, char flag); int SaveLogTofile(int commid, char *szbuf); // 功能说明:串口发送数据 返回实际发送的字节数 -int GM_SerialComSend(const unsigned char * cSendBuf, LONG nSendLen, int commid); +int GM_SerialComSend(const unsigned char * cSendBuf, size_t nSendLen, int commid); void Gm_InitSerialComm(SENSOR_PARAM *sensorParam, char *filedir); // 启动串口通讯 void GM_StartSerialComm(); // 启动使用串口拍照 -void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx); +int GM_StartSerialCameraPhoto(uint8_t channel, int cmdidx, u_char bImageSize, int phototime, u_char presetno, char *serfile, unsigned int baud, int addr); void delete_old_files(const char *path, int days); // 串口轮询通讯定时器 @@ -373,12 +366,12 @@ int GM_CloseTimer(); void testComm(); void Gm_InitSerialComm_Test(); // 串口接收数据处理 -void SerialDataProcess(int devidx, u_char *buf, int len); +void SerialDataProcess(int devidx, uint8_t *buf, int len); -void CameraRecvData(int commid, u_char *buf, int len); +void CameraRecvData(SIO_PARAM_SERIAL_DEF *pPortParam, u_char *buf, int len); // 串口摄像机数据处理 -void CameraPhotoPortDataProcess( int port); +void CameraPhotoPortDataProcess(SIO_PARAM_SERIAL_DEF *curserial); // 发送命令 void SendCmdFormPollCmdBuf( int port ); @@ -387,29 +380,29 @@ void SendCmdFormPollCmdBuf( int port ); void ClearCmdAllFlag(int commid); // 下发串口拍照指令控制 -int FindNextCameraPhotoCommand(int devidx); +int FindNextCameraPhotoCommand(SIO_PARAM_SERIAL_DEF *pPortParam); // 生成 CameraPhoto命令 -void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoParam, BYTE Threep, int phototime); +void MakeCameraPhotoCommand(SIO_PARAM_SERIAL_DEF *pPortParam, uint8_t cmdidx, int OneParam, uint16_t TwoParam, uint8_t Threep, int phototime); // 清除命令缓冲区 void ClearCmdFormPollCmdBuf(int port); // 准备发送云台指令 -int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd); +int Gm_CtrlPtzCmd(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t ptzcmd); // 发送转动摄像机云台命令定时器 int Gm_Camera_Timer(); // 生成 PELCO_P 命令 * -void Gm_SendPelco_pCommand( DWORD cmdtype); +void Gm_SendPelco_pCommand( uint32_t cmdtype); // 计算Pelco_p校验 -BYTE Gm_Pelco_pXORCheck( BYTE *msg, int len ); +uint8_t Gm_Pelco_pXORCheck( uint8_t *msg, int len ); // 生成 PELCO_D 命令 * -void Gm_SendPelco_DCommand( DWORD cmdtype); +void Gm_SendPelco_DCommand(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t cmdtype); // 计算Pelco_D校验 -BYTE Gm_Pelco_DCheck( BYTE *msg, int len ); +uint8_t Gm_Pelco_DCheck( uint8_t *msg, int len ); // 查询传感器电源状态 char Gm_GetSensorsPowerState(int port); @@ -421,15 +414,15 @@ int FindNextShxyProtocolCommand( int devidx ); // 倾角命令校验码计算 unsigned char CalLpc(unsigned char *msg, int len); // 读上海欣影传感器协议数据 -void ShxyProtocolRecvData(int commid, u_char *buf, int len); +void ShxyProtocolRecvData(int commid, uint8_t *buf, int len); // 检查检验和是否正确 -int CheckShxyProtocolLpcError( u_char* msg, int len ); +int CheckShxyProtocolLpcError( uint8_t* msg, int len ); // 把16进制和10进制ASCII字符串转换成int整数 int ATOI(char *buf); //生成倾角命令 -void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx); +void MakeShxyProtocolPollCommand(int portno, uint8_t cmdidx); // 上海欣影传感器协议数据处理 void ShxyProtocolDataProcess( int commid); // 控制关闭传感器电源 @@ -439,8 +432,7 @@ void ShxyProtocolDataProcess( int commid); int SaveImageDataTofile(int devno); void Collect_sensor_data(); -void CameraPhotoCmd(int phototime, u_char channel, int cmdidx, u_char bImageSize, u_char presetno); - +int CameraPhotoCmd(int phototime, u_char channel, int cmdidx, u_char bImageSize, u_char presetno, char *serfile, unsigned int baud, int addr); /* 数据和图片采集数据返回函数 开始*/ int GetWeatherData(Data_DEF *data, int datano); @@ -468,4 +460,26 @@ int GetImage(int devno, IMAGE_DEF *photo); // 生成一个随机整数 int GeneratingRandomNumber(); -#endif //WEATHERCOMM_H +void ClearCameraCmdAllFlag(SIO_PARAM_SERIAL_DEF *pPortParam); + +void ClearCameraCmdFormPollCmdBuf(SIO_PARAM_SERIAL_DEF *pPortParam); + +int Gm_OpenCameraSerial(SIO_PARAM_SERIAL_DEF *pPortParam, char *serfile, unsigned int baud); + +int Gm_SetCameraSerialPortParam(int fd, unsigned int baud); + +int GM_CameraComSend(unsigned char * cSendBuf, size_t nSendLen, int fd); + +void SendCameraCmdFormPollCmdBuf(SIO_PARAM_SERIAL_DEF *pPortParam); + +void Gm_FindCameraCommand(SIO_PARAM_SERIAL_DEF *pPortParam); + +void GM_CameraSerialComRecv(SIO_PARAM_SERIAL_DEF *pPortParam); + +int GM_IsCloseCamera(SIO_PARAM_SERIAL_DEF *pPortParam); + +int GM_CameraSerialTimer(SIO_PARAM_SERIAL_DEF *pPortParam); + +#endif // __SENSOR_PROTOCOL_H__ + + diff --git a/app/src/main/cpp/WeatherComm.cpp b/app/src/main/cpp/WeatherComm.cpp deleted file mode 100644 index b0b2630..0000000 --- a/app/src/main/cpp/WeatherComm.cpp +++ /dev/null @@ -1,595 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "GPIOControl.h" -#include "WeatherComm.h" -#include - -SIO_PARAM_SERIAL_DEF serialport; -float weatherpntmsg[10]; - -static void set_baudrate (struct termios *opt, unsigned int baudrate) -{ - cfsetispeed(opt, baudrate); - cfsetospeed(opt, baudrate); -} - -static void set_data_bit (struct termios *opt, unsigned int databit) -{ - opt->c_cflag &= ~CSIZE; - switch (databit) - { - case 8: - opt->c_cflag |= CS8; - break; - case 7: - opt->c_cflag |= CS7; - break; - case 6: - opt->c_cflag |= CS6; - break; - case 5: - opt->c_cflag |= CS5; - break; - default: - opt->c_cflag |= CS8; - break; - } -} - -static void set_parity (struct termios *opt, char parity) -{ - switch (parity) - { - case'N':/* 无校验 */ - case 'n': - opt->c_cflag &= ~PARENB; - break; - case'E':/*偶校验*/ - case 'e': - opt->c_cflag |= PARENB; - opt->c_cflag &= ~PARODD; - break; - case'O':/* 奇校验 */ - case 'o': - opt->c_cflag |= PARENB; - opt->c_cflag |= ~PARODD; - break; - default: /*其它选择为无校验 */ - opt->c_cflag &= ~PARENB; - break; - } -} - -static void set_stopbit (struct termios *opt, const char *stopbit) -{ - if (strcmp(stopbit, "1") == 0) - { - opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */ - } - else if(0 == strcmp(stopbit, "1.5")) - { - opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */ - } - else if(0 == strcmp (stopbit,"2")) - { - opt->c_cflag |= CSTOPB; /*2 位停止位 */ - } - else - { - opt->c_cflag &= ~CSTOPB; /*1 位停止位 */ - } -} - -int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) -{ - struct termios opt; - tcgetattr(fd, &opt); - set_baudrate(&opt, baudrate); - //opt.c_cflag |= CLOCAL|CREAD; /*|CRTSCTS */ - opt.c_lflag &= ~(ICANON | ECHO |ECHOE |ISIG); - set_data_bit(&opt, databit); - set_parity(&opt, parity); - set_stopbit(&opt, stopbit); - opt.c_iflag &=~(INLCR|ICRNL); - opt.c_iflag &=~(IXON);/* 流控*/ - opt.c_oflag = 0; - //opt.c_lflag |= 0; - opt.c_oflag &= ~OPOST; - opt.c_cc[VTIME] = vtime; - opt.c_cc[VMIN] = vmin; - tcflush (fd, TCIFLUSH); - return (tcsetattr (fd, TCSANOW, &opt)); -} - -static void setInt(int cmd, int value) -{ - int fd = open("/dev/mtkgpioctrl", O_RDONLY); - IOT_PARAM param; - param.cmd = cmd; - param.value = value; - // LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value); - if( fd > 0 ) - { - int res = ioctl(fd, IOT_PARAM_WRITE, ¶m); - // LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); - close(fd); - } - return; -} -static void setRS485Enable(bool z) { - setInt(CMD_SET_485_EN_STATE, z ? 1 : 0); -} - -static void set485WriteMode() { - setInt(CMD_SET_485_STATE, 1); -} - -static void set485ReadMode() { - setInt(CMD_SET_485_STATE, 0); -} -static void set12VEnable(bool z) { - setInt(CMD_SET_12V_EN_STATE, z ? 1 : 0); -} - -static void setCam3V3Enable(bool enabled) -{ - setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0); -} - - -/********************************************************************************* -* 气象数据处理 * -**********************************************************************************/ -void PortDataProcess( ) -{ - float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; - //WORD uDevAddr; - unsigned char cmdidx; - int i, j, aipnt, datanum; - SIO_PARAM_SERIAL_DEF *pPortParam; - char szbuf[64]; - - pPortParam = &serialport; - //取出装置地址,开始处理地址+++ - if(0x02 == pPortParam->m_au8RecvBuf[5]) - { - //pPortParam->devaddr = pPortParam->m_au8RecvBuf[4]; - return; - } - cmdidx = pPortParam->m_au8RecvBuf[5]; -#if 0 - aipnt = pPortParam->SameTypeDevIdx; - uDevAddr = serialport->m_au8RecvBuf[4]; - if(0 == srdt.IsReadWireTem) - { - if(uDevAddr != pPortParam->devaddr) - return; - } -#endif - fvalua = &fvalue; - datanum = pPortParam->m_au8RecvBuf[6]; - if((0x08 != cmdidx) && (0x09 != cmdidx)) - return; - - for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) - { - if(0x08 == cmdidx) - fvalue = (pPortParam->m_au8RecvBuf[j+1]<<24)+(pPortParam->m_au8RecvBuf[j+2]<<16) - +(pPortParam->m_au8RecvBuf[j+3]<<8)+pPortParam->m_au8RecvBuf[j+4]; - else - { - *(u_char *)fvalua = pPortParam->m_au8RecvBuf[j+4]; - *((u_char *)fvalua+1) = pPortParam->m_au8RecvBuf[j+3]; - *((u_char *)fvalua+2) = pPortParam->m_au8RecvBuf[j+2]; - *((u_char *)fvalua+3) = pPortParam->m_au8RecvBuf[j+1]; - } - switch(pPortParam->m_au8RecvBuf[j]) - { - case 1: /*温度*/ - weatherpntmsg[0] = fvalue; - LOGE("温度:%0.3f ", fvalue); - break; - case 2: /*气压*/ - weatherpntmsg[5] = fvalue; - LOGE("气压:%0.3f ", fvalue); - break; - case 3: /*湿度*/ - weatherpntmsg[1] = fvalue; - LOGE("湿度:%0.3f ", fvalue); - break; - case 4: /*雨量*/ - break; - case 5: /*日照*/ - break; - case 6: /*风速*/ - weatherpntmsg[2] = fvalue; - LOGE("风速:%0.3f ", fvalue); - break; - case 7: /*风向*/ - weatherpntmsg[3] = fvalue; - LOGE("风向:%0.3f ", fvalue); - break; - case 8: /*拉力*/ - LOGE("拉力:%0.3f ", fvalue); - break; - case 9: /*倾角传感器X轴倾角*/ - LOGE("X:%0.3f ", fvalue); - break; - case 10: /*倾角传感器Y轴倾角*/ - LOGE("Y:%0.3f ", fvalue); - break; - case 11: /*测温球导线温度*/ - case 12: /*测温球内部温度*/ - break; - case 13: /*测温球导线X轴倾角*/ - break; - case 14: /*测温球导线Y轴倾角*/ - break; - case 15: /*测温球导线电流*/ - break; - case 16: /*测温球电池电压*/ - break; - case 17: /*A相泄漏电流平均值;*/ - break; - case 18: /*A相泄漏电流最大值;*/ - break; - case 19: /*A相超过3mA的脉冲频次*/ - break; - case 20: /*A相超过10mA的脉冲频次*/ - break; - case 21: /*B相泄漏电流平均值;*/ - break; - case 22: /*B相泄漏电流最大值;*/ - break; - case 23: /*B相超过3mA的脉冲频次*/ - break; - case 24: /*B相超过10mA的脉冲频次*/ - case 25: /*C相泄漏电流平均值;*/ - case 26: /*C相泄漏电流最大值;*/ - case 27: /*C相超过3mA的脉冲频次*/ - case 28: /*C相超过10mA的脉冲频次*/ - break; - } - } -} - -//*************************************************************** -//* 按照协议格式化接收数据 * -//*************************************************************** -static void RecvData(u_char *buf, int len)// 规约读数据处理 -{ - int i, ictime; - //WORD crc, check; - SIO_PARAM_SERIAL_DEF *pPortParam; - - pPortParam = &serialport; - ictime = (int)time(NULL); - - if(pPortParam->m_iRecvLen == 0) - { - pPortParam->iRecvTime = ictime; - } - else - { - if((ictime-pPortParam->iRecvTime > 6) || (ictime - pPortParam->iRecvTime < 0)) - pPortParam->iRecvTime = ictime; - else if(ictime - pPortParam->iRecvTime > 2) - { - pPortParam->m_iRecvLen = 0; - pPortParam->m_iRevStatus = 0; - } - } - - for(i=0; im_iRevStatus) - { - case 0: // 0x68 - pPortParam->m_iRecvLen = 0; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 1: // len1 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus++; - break; - case 2: // len2 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - //if(buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2]) - { - pPortParam->m_iRevStatus++; - pPortParam->m_iNeedRevLength = buf[i]+5; - } - //else - // pPortParam->m_iRevStatus = 18; - break; - case 3: // 0x68 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iNeedRevLength--; - if(0x68 == buf[i]) - pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 4: // 正确接收数据 - pPortParam->m_iNeedRevLength--; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iNeedRevLength > 0) - break; - if(buf[i] != 0x16) - { - pPortParam->m_iRevStatus=18; - break; - } - - //if(CheckLpcError(serialport->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE) - { - PortDataProcess(); - pPortParam->m_iRevStatus = 0; - pPortParam->RevCmdFlag = 1; - } - pPortParam->m_iRecvLen = 0; - break; - case 255:// 错误接收数据 - default: - if(buf[i] == 0x68) - { - pPortParam->m_iRevStatus = 1; - pPortParam->m_iRecvLen = 1; - pPortParam->m_au8RecvBuf[0] = buf[i]; - } - else if(buf[i] == 0x16) - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus = 0; - pPortParam->m_iRecvLen = 0; - } - else - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if(pPortParam->m_iRecvLen > 200) - { - pPortParam->m_iRecvLen = 0; - } - } - break; - } - } -} - -static long get_msec(void ) -{ - struct timeval tv; - - gettimeofday(&tv, NULL); - long time_in_msec = tv.tv_sec * 1000 + tv.tv_usec/1000; - - return time_in_msec; -} -//int inum =0; -//int itimecnt=0; -static int weather_comm(SERIAL_PARAM weatherport) -{ - int fd = -1; - int len, i,ret, icnt=0; - long ictime, iruntime, isendtime, irecvtime; - //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0D,0x09,0x16,0x16}; - unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x01,0x09,0x0A,0x16}; - //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16}; - //unsigned char sendbuf[] = {0x68,0x01,0x01,0x68,0x02,0x01,0x01,0x04, 0x16}; - char recvbuf[256], szbuf[512]; - //char serial_description[] = "/dev/ttyS0"; - -#if 0 - DIR *dir = opendir("/dev"); - if (dir == NULL) { - LOGE("_test_ opendir"); - return -1; - } - - // 读取目录项 - struct dirent *entry; - while ((entry = readdir(dir)) != NULL) { - // 过滤出串口设备,通常以"ttyS"或"ttyUSB"开头 - if ((strncmp(entry->d_name, "ttyS2", 5) == 0) || - (strncmp(entry->d_name, "ttyS0", 5) == 0)) { - LOGE("_test_ Found serial port: %s\n", entry->d_name); - } - } - - // 关闭目录 - closedir(dir); -#endif - serialport.RevCmdFlag = 1; - serialport.m_iRecvLen = 0; - serialport.m_iRevStatus = 0; - - set12VEnable(true); - setCam3V3Enable(true); - setRS485Enable(true); - 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); -#if 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); -#else - setInt(CMD_SET_485_en0, 0); - setInt(CMD_SET_485_en1, 0); - setInt(CMD_SET_485_en2, 0); - setInt(CMD_SET_485_en3, 0); - setInt(CMD_SET_485_en4, 0); -#endif - sleep(3); - //ictime = (int)time(NULL); - ictime = get_msec(); - for(;;) - { - if(fd < 0) - { - fd = open(weatherport.pathname, O_RDWR | O_NDELAY); - //fd = open(weatherport.pathname, O_RDWR | O_NOCTTY); - if(fd < 0) - { - LOGE("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) - { - LOGE("_test_ set uart arrt faile \n"); - return -1; - } - } - //tcdrain(fd); - //sleep(2); - usleep(100); - //iruntime = (int)time(NULL); - iruntime = get_msec(); - if((iruntime - ictime > 120000) || (iruntime - ictime < 0)) - ictime = iruntime; - if(iruntime - ictime > 20000) - { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "气象采样时间=%0.3f秒,停止采样!", (iruntime-ictime)/1000.0); - LOGE("%s", szbuf); - break; - } - - if(1 == serialport.RevCmdFlag) - { - //set485WriteMode(); - - len = write(fd, sendbuf, sizeof(sendbuf));/* 向串囗发送字符串 */ - serialport.RevCmdFlag = 0; - LOGE("发送命令时间差%ld毫秒", get_msec()-isendtime); - //isendtime = time(NULL); - isendtime = get_msec(); - if (len < 0) { - LOGE("write data error \n"); - return -1; - } else { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "Send:"); - for (i = 0; i < len; i++) { - sprintf(szbuf, "%s %02X", szbuf, sendbuf[i]); - } - LOGE("%s", szbuf); - //icnt = 0; - //inum++; - } - //tcdrain(fd); - //usleep(50000); - } - else - { - //irecvtime = time(NULL); - irecvtime = get_msec(); - if((irecvtime-isendtime > 6000) ||(irecvtime - isendtime < 0)) - isendtime = irecvtime; - if (irecvtime-isendtime > 500) - { - LOGE("传感器超过%ld毫秒未应答", irecvtime-isendtime); - serialport.RevCmdFlag = 1; - serialport.m_iRecvLen = 0; - serialport.m_iRevStatus = 0; - //close(fd); - //set12VEnable(false); - //setCam3V3Enable(false); - //setRS485Enable(false); - //fd = -1; - continue; - } - } - //set485ReadMode(); - memset(recvbuf, 0, sizeof(recvbuf)); - len = read(fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ - if (len < 0) { - LOGE("serial read error \n"); - continue; - } - if(0 == len) - { - //icnt++; - continue; - } - - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "Recv:"); - for (i = 0; i < len; i++) { - sprintf(szbuf, "%s %02X", szbuf, recvbuf[i]); - } - __android_log_print(ANDROID_LOG_INFO, "serial", "%s", szbuf); - RecvData((u_char*)recvbuf, len); - //LOGE("一周期空循环次数%d, 读取次数%d, 时间:%d %d", icnt, inum, (int)time(NULL), itimecnt); - icnt = 0; - //serialport.RevCmdFlag =1; - } - - close(fd); - set12VEnable(false); - setCam3V3Enable(false); - setRS485Enable(false); - - //exit(-1); - return(0); -} - -int serial_port_comm() -{ - SERIAL_PARAM portparm; - - //struct timeval tv; - - //gettimeofday(&tv, NULL); - //long time_in_microseconds = tv.tv_sec * 1000000 + tv.tv_usec; - - //LOGE("Current time in microseconds: %ld\n", time_in_microseconds); - -#if 1 - memset(portparm.pathname, 0, sizeof(portparm.pathname)); - //sprintf(portparm.pathname, "/dev/ttyS1"); - sprintf(portparm.pathname, "/dev/ttysWK3"); - portparm.parity = 'N'; - portparm.databit = 8; - portparm.baudrate = B9600; - memset(portparm.stopbit, 0, sizeof(portparm.stopbit)); - sprintf(portparm.stopbit, "1"); -#endif - //itimecnt = (int)time(NULL); - - for(;;) - { - sleep(3); - weather_comm(portparm); - } - - return 0; -} - diff --git a/app/src/main/cpp/WeatherComm.h b/app/src/main/cpp/WeatherComm.h deleted file mode 100644 index 3a9d311..0000000 --- a/app/src/main/cpp/WeatherComm.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// Created by hyz on 2024/6/5. -// - -#ifndef WEATHERCOMM_H -#define WEATHERCOMM_H - -#include -#include "GPIOControl.h" - -#define MAX_STRING_LEN 32 -#define IOT_PARAM_WRITE 0xAE -#define IOT_PARAM_READ 0xAF - -#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) - -// 串口参数 -typedef struct -{ - int baudrate; /* 波特率*/ - int databit; /* 数据位*/ - char stopbit[8]; /* 停止位*/ - char parity; /* 校验位*/ - char pathname[128];/* 串口文件名及路径*/ -} SERIAL_PARAM; - -typedef struct -{ - int m_iRevStatus; /* */ - int m_iRecvLen; /* */ - int m_iNeedRevLength; /* */ - int iRecvTime; /* */ - int RevCmdFlag; - unsigned char m_au8RecvBuf[128];/* */ -} SIO_PARAM_SERIAL_DEF; - -typedef struct -{ - int cmd; - int value; - int result; - long value2; - char str[MAX_STRING_LEN]; -}IOT_PARAM; - -void PortDataProcess( ); -int serial_port_comm(); -static int weather_comm(SERIAL_PARAM weatherport); -int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); - -#endif //WEATHERCOMM_H diff --git a/app/src/main/cpp/native-lib.cpp b/app/src/main/cpp/native-lib.cpp index 7ae08e3..5fabc6f 100644 --- a/app/src/main/cpp/native-lib.cpp +++ b/app/src/main/cpp/native-lib.cpp @@ -20,7 +20,7 @@ #include "GPIOControl.h" #include "serialComm.h" #include "SensorsProtocol.h" -#include "WeatherComm.h" +//#include "WeatherComm.h" //#include "jsoncpp/include/json/value.h" //#include "jsoncpp/include/json/json.h" #include @@ -322,7 +322,7 @@ static void InitPLZ() #if 1 //云台 sensorParam[0].SensorsType = PELCO_D_PROTOCOL; - sensorParam[0].baudrate = 9600; + sensorParam[0].baudrate = 38400; sensorParam[0].databit = 8; sensorParam[0].stopbit = 1; sensorParam[0].parity = '0'; @@ -900,51 +900,55 @@ extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_turnLeft( JNIEnv* env, jobject /*this*/) { - CameraPhotoCmd(0, 1, MOVE_LEFT, 0, 0); + CameraPhotoCmd(0, 1, MOVE_LEFT, 0, 0, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_turnRight( JNIEnv* env, jobject /*this*/) { - CameraPhotoCmd(0, 1, MOVE_RIGHT, 0, 0); + CameraPhotoCmd(0, 1, MOVE_RIGHT, 0, 0, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_turnUp( JNIEnv* env, jobject /*this*/) { - CameraPhotoCmd(0, 1, MOVE_UP, 0, 0); + CameraPhotoCmd(0, 1, MOVE_UP, 0, 0, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_turnDown( JNIEnv* env, jobject /*this*/) { - CameraPhotoCmd(0, 1, MOVE_DOWN, 0, 0); + CameraPhotoCmd(0, 1, MOVE_DOWN, 0, 0, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_zoomIn( JNIEnv* env, jobject /*this*/) { - CameraPhotoCmd(0, 1, ZOOM_TELE, 0, 0); + CameraPhotoCmd(0, 1, ZOOM_TELE, 0, 0, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_zoomOut( JNIEnv* env, jobject /*this*/) { - CameraPhotoCmd(0, 1, ZOOM_WIDE, 0, 0); + CameraPhotoCmd(0, 1, ZOOM_WIDE, 0, 0, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_setSpeed( JNIEnv* env, jobject /*this*/, jint speed) { - CameraPhotoCmd(0, 1, OPEN_TOTAL, 0, 0); + + //CameraPhotoCmd(0, 1, ZOOM_WIDE, 0, 0); + CameraPhotoCmd(time(NULL), 1, 0, (u_char)(speed/10), speed%10, "/dev/ttyS0", 38400, 1); + return; + CameraPhotoCmd(0, 1, OPEN_TOTAL, 0, 0, "/dev/ttyS0", 38400, 1); usleep(200000); - CameraPhotoCmd(0, 1, OPEN_MODULE_POWER, 0, 0); + CameraPhotoCmd(0, 1, OPEN_MODULE_POWER, 0, 0, "/dev/ttyS0", 38400, 1); } @@ -952,21 +956,21 @@ extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_setPreset( JNIEnv* env, jobject /*this*/, jint preset) { - CameraPhotoCmd(0, 1, SAVE_PRESETNO, 0, preset); + CameraPhotoCmd(0, 1, SAVE_PRESETNO, 0, preset, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_gotoPreset( JNIEnv* env, jobject /*this*/, jint preset) { - CameraPhotoCmd(0, 1, MOVE_PRESETNO, 0, preset); + CameraPhotoCmd(0, 1, MOVE_PRESETNO, 0, preset, "/dev/ttyS0", 38400, 1); } extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_turnOnWipers( JNIEnv* env, jobject /*this*/) { - + int i =0; } extern "C" JNIEXPORT void JNICALL @@ -974,6 +978,7 @@ Java_com_xinyingpower_testcomm_MainActivity_turnOffWipers( JNIEnv* env, jobject /*this*/) { + int i =0; }