#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "GPIOControl.h" #include "serialComm.h" #include "SensorsProtocol.h" #include #include "SensorsProtocol.h" //#include "Eint.h" SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM]; SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM]; //float weatherpntmsg[10]; 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 ) { 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; } int getInt(int cmd) { int fd = open("/dev/mtkgpioctrl", O_RDONLY); // LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd); if( fd > 0 ) { IOT_PARAM param; param.cmd = cmd; ioctl(fd, IOT_PARAM_READ, ¶m); #ifdef _DEBUG ALOGI("getInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); #endif close(fd); return param.value; } return -1; } 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); } #if 0 /********************************************************************************* * 气象数据处理 * **********************************************************************************/ 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]; #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: /*拉力*/ 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; } } } /*************************************************************** * 按照协议格式化接收数据 * ***************************************************************/ 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,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); } } // 关闭目录 closedir(dir); #endif 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; } } 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; } close(fd); set12VEnable(false); setCam3V3Enable(false); setRS485Enable(false); //exit(-1); return(0); } int serial_port_comm() { SERIAL_PARAM portparm; //struct timeval tv; //gettimeofday(&tv, NULL); //long time_in_microseconds = tv.tv_sec * 1000000 + tv.tv_usec; //LOGE("Current time in microseconds: %ld\n", time_in_microseconds); #if 1 memset(portparm.pathname, 0, sizeof(portparm.pathname)); sprintf(portparm.pathname, "/dev/ttyS0"); portparm.parity = 'N'; portparm.databit = 8; portparm.baudrate = B9600; memset(portparm.stopbit, 0, sizeof(portparm.stopbit)); sprintf(portparm.stopbit, "1"); #endif //itimecnt = (int)time(NULL); //for(;;) weather_comm(portparm); return 0; } static speed_t getBaudrate(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 -1; } } #endif //u_char serialstatus[MAX_SERIAL_PORT_NUM]; SRDT_DEF srdt; AI_DEF weatherpntmsg[WEATHER_DATA_NUM]; AI_DEF rallypntmsg[6][RALLY_DATA_NUM]; AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM]; //extern void * memset(void *m, int c, unsigned int n); //extern int atoi(const char *s); //extern int Gm_GetSamplingTimeSec(void); //extern void Delayms(kal_uint32 time); //extern void srand( unsigned int seed ); //extern int rand( void ); static long get_msec() { struct timeval tv; gettimeofday(&tv, NULL); long time_in_msec = tv.tv_sec * 1000 + tv.tv_usec/1000; return time_in_msec; } /* 打开串口电源 */ void Gm_OpenSerialPower() { /*由传送的主站的地方来控制串口电源,这里不实现*/; } // 关闭串口电源 void Gm_CloseSerialPower() { } // 关闭传感器电源 void Gm_CloseSensorsPower(int port) { //char iIoNo; char szbuf[128]; sprintf(szbuf, "Close Sensors port %d Power!", port); /* 关闭电源*/ //switch(port) /* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/ set12VEnable(false); setCam3V3Enable(false); setRS485Enable(false); } // 打开传感器电源 void Gm_OpenSensorsPower(int port) { //char iIoNo; char szbuf[128]; if(0 == port) return; sprintf(szbuf, "Open Sensors port %d Power!", port); set12VEnable(true); setCam3V3Enable(true); setRS485Enable(true); /* 打开电源*/ //switch(port) } // 查询传感器电源状态 char Gm_GetSensorsPowerState(int port) { char iIoNo, cstate=0; //char szbuf[128]; /* 查询电源状态*/ //switch(port) return cstate; } void BytestreamLOG(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]); } 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; } } // 打开串口通讯 void Gm_OpenSerialPort(int devidx) { int fd = -1; if((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM)) return; if(serialport[devparam[devidx].commid].fd < 0) { fd = open(devparam[devidx].pathname, O_RDWR | O_NDELAY); if(fd < 0) { LOGE("装置%d 打开串口%d失败!fd=%d\n", devidx+1, devparam[devidx].commid+1, fd); return; } LOGI("装置%d 打开串口%d成功!fd=%d\n", devidx+1, devparam[devidx].commid+1, fd); serialport[devparam[devidx].commid].fd = fd; return; } LOGI("装置%d 串口%d已经打开!fd=%d\n", devidx+1, devparam[devidx].commid+1, serialport[devparam[devidx].commid].fd); } // 关闭串口通讯 void Gm_CloseSerialPort() { int i; for(i=0; i 0) { close(serialport[i].fd); serialport[i].fd = -1; } } } /******************************************************************************* 函数名称: int GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) 功能说明:串口发送数据 返回实际发送的字节数 输入参数: 输出参数: 其它说明: *********************************************************************************/ int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commid) { int i, len; char szbuf[512]; len = write(serialport[commid].fd, cSendBuf, nSendLen);/* 向串囗发送字符串 */ //serialport[commid].RevCmdFlag = 0; //LOGE("发送命令时间差%ld毫秒", get_msec() - isendtime); //isendtime = time(NULL); //isendtime = get_msec(); if (len < 0) { LOGE("write data error \n"); return -1; } else if(len > 0) { //memset(szbuf, 0, sizeof(szbuf)); //sprintf(szbuf, "串口%d发送%d字节:", commid+1, len); //BytestreamLOG(szbuf, cSendBuf, len, 'D'); #if 0 for (i = 0; i < len; i++) { sprintf(szbuf, "%s %02X", szbuf, cSendBuf[i]); } LOGE("%s", szbuf); #endif } return len; } int Gm_SetSerialPortParam(int commid) { int ret; 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) { LOGE("串口%d 波特率等参数设置错误!", commid+1); return -1; } return ret; } void Gm_InitSerialComm_Test() { int i, j; srdt.sampling = 0; srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 for(i=0; i*/ sprintf(devparam[i].pathname, "/dev/ttyS0"); devparam[i].commid = 0; break; default: devparam[i].IsNoInsta = 0; break; } } } void GM_StartSerialComm() { int i, j; char szbuf[64]; long polltime=0; // 测试使用初始化配置 Gm_InitSerialComm(); //DebugStringPrintf(szbuf, strlen(szbuf), 1); memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); //Gm_OpenSerialPower(); /* 不在这使用*/ FindDevUseSerialCommNo(); //Gm_InitSensorsIsUse(); // 初始化串口使用状态 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(SERIAL_CAMERA == bCameratype) { if(0 == srdt.ms_dev[i].IsNeedSerial) srdt.iLastGetPhotoNo = -1; else srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx; srdt.ms_dev[i].IsNeedSerial = 1; srdt.ms_dev[i].SerialCmdidx = cmdidx; srdt.ms_dev[i].FirstCmdTimeCnt = -1; srdt.sendphotocmdcnt = 0; break; } srdt.ms_dev[i].IsNeedSerial = 0; break; default: if(1 == srdt.ms_dev[i].IsNeedSerial) break; srdt.ms_dev[i].IsNeedSerial = 0; break; } } //if(0x01 == flag) //{ sprintf(szbuf, "摄像机拍照启动串口定时器!"); LOGI("%s", szbuf); //StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); //} return; } #endif int GM_SerialTimer(void) { int flag = -1; GM_AllSerialComRecv(); GM_IsCloseSensors(); Gm_FindAllSensorsCommand(); GM_AllSerialComRecv(); flag = GM_CloseTimer(); //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); return flag; } /******************************************************************************** 函数名称: void Gm_FindAllSensorsCommand() 功能说明:轮询所有串口和传感器是否需要生成下发命令 输入参数: 输出参数: 其它说明: *********************************************************************************/ void Gm_FindAllSensorsCommand(void) { 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: /* 摄像机协议*/ flag = FindNextCameraPhotoCommand(curidx); break; case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ break; } if(flag == -1) continue; srdt.curdevidx[j] = curidx; break; } // 发送缓冲区中命令 生成了命令之后紧接着进行命令发送 SendCmdFormPollCmdBuf(j); } } /******************************************************************************** 函数名称: void GM_IsCloseSensors() 功能说明:检查所有传感器是否采集完毕,采集完毕的关闭传感器电源 输入参数: 输出参数: 其它说明: *********************************************************************************/ void GM_IsCloseSensors(void) { int i; char buf[256]; for(i=0; i 50*1000) ||(get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt < 0)) { srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); break; } if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 15*1000) { srdt.ms_dev[i].IsNeedSerial = 0; // 关闭传感器电源 LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); //Gm_CtrlCloseSensorsPower(i); } break; case PELCO_D_PROTOCOL: /* 摄像机类型*/ case PELCO_P_PROTOCOL: /* 摄像机类型*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ if(-1 == srdt.ms_dev[i].SerialCmdidx) { if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT) { srdt.ms_dev[i].IsNeedSerial = 0; srdt.sampling &= 0xFB; memset(buf, 0, sizeof(buf)); LOGI("通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); //netportparam.SerialCameraPowerCtrl[srdt.ms_dev[i].CameraChannel-1] = 0; //if(0 == netportparam.InitTimeFlag) // Gm_CtrlCloseSensorsPower(i); } } srdt.ms_dev[i].FirstCmdTimeCnt++; break; } } } /******************************************************************************** 函数名称: void GM_AllSerialComRecv() 功能说明:检查所有串口是否有数据接收,有则启动接收 输入参数: 输出参数: 其它说明: *********************************************************************************/ void GM_AllSerialComRecv(void) { 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 // 关闭所有串口及电源 { #if 0 for(i=0; i 35) //{ // if((devparam[j].PowerPort) == 0) { sprintf(buf, "打开无线模块电源!当前时间%d秒,起始时间%d秒", (int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt); LOGI("%s", buf); } //} #if 1 //samtime = (int)(Gm_GetSamplingTimeSec()-10); //if(iretime > samtime) if(iretime > 155) { srdt.ms_dev[j].IsNeedSerial = 0; //srdt.tempsamplingstartime = -1; srdt.tempsamplingsucctime = -1; // 关闭传感器电源 memset(buf, 0, sizeof(buf)); sprintf(buf, "关闭无线模块电源!当前时间%d秒,起始时间%d秒,采样间隔时间10", (int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt/*, samtime*/); LOGI("%s", buf); //Gm_CtrlCloseSensorsPower(j); } #endif break; } } //StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); } else { #endif #if 0 for(i=0; iUseSerialidx]; memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData)); memcpy((void*)rtumsg.MsgData, (void*)serialport->m_au8RecvBuf, pPortParam->m_iRecvLen); rtumsg.MsgLen = pPortParam->m_iRecvLen; rtumsg.PortIdx = port; cmdidx = serialport->m_au8RecvBuf[5]; uDevAddr = serialport->m_au8RecvBuf[4]; //sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx); //DebugStringPrintf(szbuf, strlen(szbuf), 1); if(uDevAddr != devparam[port].devaddr) return; switch(cmdidx) { case 0x10: /* 拍照应答*/ if(0xFF == rtumsg.MsgData[6]) { srdt.RephotographCnt++; if(srdt.RephotographCnt > 2) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); //DebugStringPrintf(szbuf, strlen(szbuf), 1); } 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; 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); srdt.imagepacketnum = packetnum; srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); //DebugStringPrintf(szbuf, strlen(szbuf), 1); //presetno = (int)GetPhotoPresetNo(pPortParam->CameraChannel); presetno = (int)rtumsg.MsgData[i+8]; //if(0 == netportparam.InitTimeFlag) { serialport->RevCmdFlag = 1; srdt.sendphotocmdcnt = 0; pPortParam->SerialCmdidx = 10001; /* 保存图片*/ //break } serialport->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; case 0x11: /* 图片数据包*/ // if(0 == netportparam.InitTimeFlag) { serialport->RevCmdFlag = 1; srdt.sendphotocmdcnt = 0; pPortParam->SerialCmdidx = 10001; /* 保存图片*/ //break; } i = 6; iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256; packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256; sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum); //DebugStringPrintf(szbuf, strlen(szbuf), 1); serialport->RevCmdFlag = 1; pPortParam->FirstCmdTimeCnt = 0; if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) { if(1 == recvend) pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ 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); if(srdt.errorPhotoNoCnt > 5) { pPortParam->SerialCmdidx = 0; srdt.RephotographCnt++; if(srdt.RephotographCnt > 2) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); //DebugStringPrintf(szbuf, strlen(szbuf), 1); } } break; case 0x03: sprintf(szbuf, "设置波特率%d成功", devparam[port].baudrate); //DebugStringPrintf(szbuf, strlen(szbuf), 1); //pPortParam->Baud = serialport->Baud; pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; serialport->RevCmdFlag = 1; pPortParam->FirstCmdTimeCnt = 0; break; case 0x15: if(0xFF == rtumsg.MsgData[6]) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "没有历史图片!结束读取图片!"); //DebugStringPrintf(szbuf, strlen(szbuf), 1); 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; 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); srdt.imagepacketnum = packetnum; srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); //presetno = netportparam.CurPresetno[pPortParam->CameraChannel-1]; presetno = rtumsg.MsgData[i+8]; sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); //DebugStringPrintf(szbuf, strlen(szbuf), 1); //if(0 == netportparam.InitTimeFlag) { serialport->RevCmdFlag = 1; srdt.sendphotocmdcnt = 0; pPortParam->SerialCmdidx = -1; //netportparam.PhotosFlag = FALSE; break; } serialport->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; break; case 0x16: if(0xFF == rtumsg.MsgData[10]) { pPortParam->SerialCmdidx = -1; sprintf(szbuf, "图片保存失败!"); //DebugStringPrintf(szbuf, strlen(szbuf), 1); } if(0 == rtumsg.MsgData[10]) { if(0 == srdt.historyimagenum[devparam[port].CameraChannel-1]) { //netportparam.SerialCameraPowerCtrl[devparam[port].CameraChannel-1] = 0; srdt.sampling &= 0xFB; } else pPortParam->FirstCmdTimeCnt = -3*60*1000/TIMER_CNT; } else { srdt.sampling &= 0xFB; //netportparam.SerialCameraPowerCtrl[pPortParam->CameraChannel-1] = 0; } pPortParam->SerialCmdidx = -1; serialport->RevCmdFlag = 1; //if(0 == netportparam.InitTimeFlag) break; default: serialport->RevCmdFlag = 1; break; } } long lsendtime=0; /********************************************************************************* 发送命令 **********************************************************************************/ void SendCmdFormPollCmdBuf( int port ) { char buf[64]; int len, idelay=0, ret; SIO_PARAM_SERIAL_DEF *pPortParam; //int recvlen; //u_char recvbuf[300]; pPortParam = &serialport[port]; if(pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt) { pPortParam->ForceWaitCnt--; return; } if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0)) { pPortParam->RetryTimeCnt++; //if(srdt.sendphotocmdcnt > 0) // idelay = 10*1000/TIMER_CNT; //LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt); if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay)) { return; } pPortParam->RetryTimeCnt = 0; 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); } if(pPortParam->WaitTime) { pPortParam->WaitTimeCnt++; if(pPortParam->WaitTimeCnt < pPortParam->WaitTime) { return; } } pPortParam->WaitTimeCnt = 0; 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; ret = Gm_SetSerialPortParam(port); if(ret < 0) return; len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen-2, port); if(len < 1) { LOGE("串口%d, 发送命令失败!", port+1); } else { sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); BytestreamLOG(buf, &pPortParam->PollCmd[2], len, 'D'); LOGW("sendtimeconst= %ld", get_msec()-lsendtime); lsendtime = get_msec(); } pPortParam->SendCmdFlag = 1; pPortParam->ReSendCmdFlag = 0; pPortParam->RevCmdFlag = 0; pPortParam->RetryTimeCnt = 0; 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; serialport[commid].RetryCnt = 0; serialport[commid].RetryTimeCnt = 0; serialport[commid].WaitTimeCnt = 0; 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; 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); } // 下发串口拍照指令控制 int FindNextCameraPhotoCommand(int devidx) { int imagesize=3, cmdno; BYTE channel, imagequality=50; WORD packetsize; BYTE cmdidx=0x10; char szbuf[128]; //如果命令缓冲区仍有命令,则退出本函数 if((srdt.ms_dev[devidx].UseSerialidx < 1) || (srdt.ms_dev[devidx].UseSerialidx >= MAX_SERIAL_PORT_NUM)) return -1; if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/ return -1; cmdno = srdt.ms_dev[devidx].SerialCmdidx; if(0 == cmdno)/* 下发拍照指令*/ { if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 4*1000/TIMER_CNT) { return -1; } if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); LOGI("%s", szbuf); return -1; } channel = devparam[devidx].CameraChannel; if((1>channel) || (channel >MAX_CHANNEL_NUM)) { /* 通道号错误退出拍照流程*/; srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); LOGI("%s", szbuf); } packetsize = (WORD)MAX_PHOTO_FRAME_LEN; srdt.sendphotocmdcnt++; srdt.imagepacketnum = 0; srdt.errorPhotoNoCnt = 0; cmdidx = 0x10; srdt.sendphototime=(int)time(NULL); } else if(10000 == cmdno)/* 下发设置串口波特率命令*/ { switch(devparam[devidx].baudrate) { case 9600: imagesize = 0x07; break; case 14400: imagesize = 0x08; break; case 19200: imagesize = 0x08; break; case 38400: imagesize = 0x09; break; case 57600: imagesize = 0x09; break; case 115200: imagesize = 0x09; break; default: sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); LOGI("%s", szbuf); srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; return -1; } if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000/TIMER_CNT) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); LOGI("%s", szbuf); return -1; } cmdidx = 0x03; packetsize = 0xFFFF; } else if((10001 == cmdno)||(10002 == cmdno))/* 通知摄像机图片读取完成或存储(16H)*/ { cmdidx = 0x16; if(10001 == cmdno) packetsize = 1; else packetsize = 0; imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/ } else if(10003 == cmdno) /* 读取历史图片(15H)*/ { cmdidx = 0x15; packetsize = (WORD)MAX_PHOTO_FRAME_LEN; srdt.sendphototime=(int)time(NULL); } else { imagesize = 0xFF; packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; cmdidx = 0x11; if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) { srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); LOGI("%s", szbuf); return -1; } } MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality); srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; return 1; } /********************************************************************************* 生成 CameraPhoto命令 **********************************************************************************/ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoParam, BYTE Threep ) { int i, icurtime; u_char *sendbuf; //char szbuf[128]; sendbuf = serialport[srdt.ms_dev[portno].UseSerialidx].PollCmd; icurtime = (int)time(NULL); 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 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++] = 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[srdt.ms_dev[portno].UseSerialidx].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 { sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); LOGI("%s", szbuf); } srdt.usecameradevidx = i; // 查找串口序号 srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; //if(0 == srdt.sampling) //{ // 1.打开串口电源 Gm_OpenSerialPower(); // 2.打开串口通讯 Gm_OpenSerialPort(i); //} srdt.sampling |= 2; srdt.SendStopPtzCmdTimeCnt = -1; //return 1; return Gm_Camera_Timer(); //return 1; } // 发送转动摄像机云台命令定时器 int Gm_Camera_Timer(void) { char szbuf[128]; if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1)) { sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1); LOGI("%s", szbuf); 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; } if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000) { 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; } /******************************************************************************** * 生成 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); len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); if(len < 1) { LOGE("发送Pelco_p命令失败"); } else { sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:", srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel); BytestreamLOG(buf, commandbuf, len, 'D'); } ClearCmdFormPollCmdBuf(srdt.camerauseserial); serialport[srdt.camerauseserial].ForceWaitCnt = 100; serialport[srdt.camerauseserial].ForceWaitFlag = 1; } 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++] = (BYTE)(cmdtype>>16); commandbuf[len++] = (BYTE)(cmdtype>>8); commandbuf[len++] = (BYTE)(cmdtype); commandbuf[len] = (BYTE)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) { LOGE("发送Pelco_D命令失败"); } else { sprintf(buf, "发送串口%d 像机通道%d Pelco_D命令:", srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel); BytestreamLOG(buf, commandbuf, len, 'D'); } ClearCmdFormPollCmdBuf(srdt.camerauseserial); serialport[srdt.camerauseserial].ForceWaitCnt = 10; serialport[srdt.camerauseserial].ForceWaitFlag = 1; } // 计算Pelco_D校验 BYTE Gm_Pelco_DCheck( BYTE *msg, int len ) { int i; BYTE checkvalue=0; if(len <= 0) return checkvalue; checkvalue = 0; for(i=1; i= MAX_SERIAL_PORT_NUM)) return -1; //if(srdt.ms_dev[devidx].SerialCmdidx == 0) { if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) { //srdt.ms_dev[devidx].FirstCmdTimeCnt++; return -1; } #if 0 if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) { devparam[devidx].devaddr = 0xFF; MakeShxyProtocolPollCommand(devidx, 0x02); } //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) // MakeShxyProtocolPollCommand(devidx, 0x09); else #endif MakeShxyProtocolPollCommand(devidx, 0x09); srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; return 1; } return -1; } /********************************************************************************* 生成下发命令 **********************************************************************************/ void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx) { int i/*, sendWaitTime = 100, y*/; //char buf[128]; u_char *sendbuf; sendbuf = serialport[srdt.ms_dev[portno].UseSerialidx].PollCmd; 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 sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6); i+= 1; sendbuf[i++] = 0x16; // 信息尾 serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i; //sprintf((char*)buf, "生成串口%d 装置%d倾角命令:", srdt.ms_dev[portno].UseSerialidx+1, portno+1); //Gm_OMC_UART_DebugHex(buf, i-2, (char*)&sendbuf[2]); } unsigned char CalLpc(unsigned char *msg, int len) { int i; u_char retval = 0; for (i = 0 ; i < len; i++) retval += msg[i]; return retval; } /*************************************************************** * 读上海欣影传感器协议数据 * ***************************************************************/ void ShxyProtocolRecvData(int devno, u_char *buf, int len)// 规约读数据处理 { int i, ictime; //WORD 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]; 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; } } } //******************************************************************************** // 检查检验和是否正确 //******************************************************************************** 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; } /********************************************************************************* 上海欣影传感器协议数据处理 **********************************************************************************/ 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; 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; slantpntmsg[aipnt][0].EuValue *= (1+frnb); } else 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); LOGV("%s", szbuf); } //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, "Y =%0.3f ", fvalue); LOGV("%s", szbuf); } if((fvalue < -59) ||(fvalue > 59)) { frnb = (GeneratingRandomNumber()%101-50)/1000.0; slantpntmsg[aipnt][1].EuValue *= (1+frnb); } else 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; #if 0 if(1 == srdt.IsReadWireTem) { for(i=0; iSameTypeDevIdx; } #endif 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[0].EuValue *= (1+frnb); weatherpntmsg[0].EuValue *= (1+frnb); } else { pPortParam->aiValue[0].EuValue = fvalue*pPortParam->aiValue[0].AiParam.fFactor + pPortParam->aiValue[0].AiParam.EuValueDelta; weatherpntmsg[0].EuValue = fvalue*weatherpntmsg[0].AiParam.fFactor + weatherpntmsg[0].AiParam.EuValueDelta; } pPortParam->aiValue[0].AiState = 1; weatherpntmsg[0].AiState = 1; //g_SelfTest.SensorsFault |= (0x01); //if ((gDisSunRain & 0x80) == 0x80) { sprintf(szbuf, "温度:%0.3f ", fvalue); LOGV("%s", szbuf); } break; case 2: /*气压*/ if((fvalue < 550) ||(fvalue > 1060)) { frnb = (GeneratingRandomNumber()%41-20)/10000.0; pPortParam->aiValue[5].EuValue *= (1+frnb); weatherpntmsg[5].EuValue *= (1+frnb); } else { pPortParam->aiValue[5].EuValue = fvalue*pPortParam->aiValue[5].AiParam.fFactor + pPortParam->aiValue[5].AiParam.EuValueDelta; weatherpntmsg[5].EuValue = fvalue*weatherpntmsg[5].AiParam.fFactor + weatherpntmsg[5].AiParam.EuValueDelta; } pPortParam->aiValue[5].AiState = 1; weatherpntmsg[5].AiState = 1; //g_SelfTest.SensorsFault |= (0x10); //if ((gDisSunRain & 0x80) == 0x80) { sprintf(szbuf, "气压:%0.3f ", fvalue); LOGV("%s", szbuf); } break; case 3: /*湿度*/ if((fvalue < 0) ||(fvalue > 100)) { frnb = (GeneratingRandomNumber()%41-20)/1000.0; pPortParam->aiValue[1].EuValue *= (1+frnb); weatherpntmsg[1].EuValue *= (1+frnb); } else { pPortParam->aiValue[1].EuValue = fvalue*pPortParam->aiValue[1].AiParam.fFactor + pPortParam->aiValue[1].AiParam.EuValueDelta; weatherpntmsg[1].EuValue = fvalue*weatherpntmsg[1].AiParam.fFactor + weatherpntmsg[1].AiParam.EuValueDelta; } pPortParam->aiValue[1].AiState = 1; weatherpntmsg[1].AiState = 1; //g_SelfTest.SensorsFault |= (0x02); //if ((gDisSunRain & 0x80) == 0x80) { sprintf(szbuf, "湿度:%0.3f ", fvalue); LOGV("%s", szbuf); } break; case 4: /*雨量*/ break; case 5: /*日照*/ break; case 6: /*风速*/ if((fvalue/1000 < 0) ||(fvalue/1000 > 80)) { frnb = (GeneratingRandomNumber()%41-20)/1000.0; pPortParam->aiValue[2].EuValue *= (1+frnb); weatherpntmsg[2].EuValue *= (1+frnb); } else { pPortParam->aiValue[2].EuValue = fvalue*pPortParam->aiValue[2].AiParam.fFactor + pPortParam->aiValue[2].AiParam.EuValueDelta; weatherpntmsg[2].EuValue = fvalue*weatherpntmsg[2].AiParam.fFactor + weatherpntmsg[2].AiParam.EuValueDelta; } pPortParam->aiValue[2].AiState = 1; weatherpntmsg[2].AiState = 1; //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, "风速:%0.3f ", fvalue); LOGV("%s", szbuf); } break; case 7: /*风向*/ if((fvalue/1000 < 0) ||(fvalue/1000 > 359.99)) { frnb = (GeneratingRandomNumber()%41-20)/1000.0; pPortParam->aiValue[3].EuValue *= (1+frnb); weatherpntmsg[3].EuValue *= (1+frnb); } else { pPortParam->aiValue[3].EuValue = fvalue*pPortParam->aiValue[3].AiParam.fFactor + pPortParam->aiValue[3].AiParam.EuValueDelta; weatherpntmsg[3].EuValue = fvalue*weatherpntmsg[3].AiParam.fFactor + weatherpntmsg[3].AiParam.EuValueDelta; } pPortParam->aiValue[3].AiState = 1; weatherpntmsg[3].AiState = 1; //g_SelfTest.SensorsFault |= (0x08); //if ((gDisSunRain & 0x10) == 0x10) { sprintf(szbuf, "风向:%0.3f ", fvalue); LOGV("%s", szbuf); } break; case 8: /*拉力*/ #if 0 if(RESERVE1_PROTOCOL == pPortParam->ProtocolIdx) { leirallypntmsg[0].EuValue = fvalue*leirallypntmsg[0].AiParam.fFactor\ +leirallypntmsg[0].AiParam.EuValueDelta; leirallypntmsg[0].AiState = 1; g_SelfTest.SensorsFault |= (0x800000); if ((gDisSunRain & 0x10) == 0x10) { sprintf(szbuf, "地址%d模拟导线拉力:%0.3fKg ", pPortParam->devaddr, fvalue/1000.0); DebugStringPrintf(szbuf, strlen(szbuf), 1); } } else { #endif pPortParam->recvdatacnt++; if(pPortParam->recvdatacnt < 2) break; 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 = 1; //rallypntmsg[aipnt][0].AiState = 1; sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); //} 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 = 1; //slantpntmsg[aipnt][0].AiState = 1; sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); break; case 10: /*倾角传感器Y轴倾角*/ sprintf(szbuf, "Y =%0.3f ", fvalue); LOGV("%s", szbuf); 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].AiParam.fFactor\ +pPortParam->aiValue[1].AiParam.EuValueDelta; //slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\ // +slantpntmsg[aipnt][1].AiParam.EuValueDelta; } pPortParam->aiValue[1].AiState = 1; //slantpntmsg[aipnt][1].AiState = 1; break; #if 0 case 11: /*测温球导线温度*/ fcorvalue = WireTemperatureCorrection(fvalue/100, (WORD)pPortParam->devaddr); wdiitemppntmsg[aipnt][0].EuValue = fvalue*wdiitemppntmsg[aipnt][0].AiParam.fFactor\ +wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta; //#else wdiitemppntmsg[aipnt][0].EuValue = fcorvalue*100*wdiitemppntmsg[aipnt][0].AiParam.fFactor\ +wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta; wdiitemppntmsg[aipnt][0].AiState = 1; g_SelfTest.SensorsFault |= (0x100000); sprintf(szbuf, "地址%d导线温度:%0.3f ", pPortParam->devaddr, fcorvalue); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 12: /*测温球内部温度*/ wdiitemppntmsg[aipnt][1].EuValue = fvalue*wdiitemppntmsg[aipnt][1].AiParam.fFactor\ +wdiitemppntmsg[aipnt][1].AiParam.EuValueDelta; wdiitemppntmsg[aipnt][1].AiState = 1; sprintf(szbuf, "地址%d内部温度:%0.3f ", pPortParam->devaddr, fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 1); break; case 13: /*测温球导线X轴倾角*/ wdiitemppntmsg[aipnt][3].EuValue = fvalue*wdiitemppntmsg[aipnt][3].AiParam.fFactor\ +wdiitemppntmsg[aipnt][3].AiParam.EuValueDelta; wdiitemppntmsg[aipnt][3].AiState = 1; sprintf(szbuf, "地址%d导线X轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 14: /*测温球导线Y轴倾角*/ wdiitemppntmsg[aipnt][4].EuValue = fvalue*wdiitemppntmsg[aipnt][4].AiParam.fFactor\ +wdiitemppntmsg[aipnt][4].AiParam.EuValueDelta; wdiitemppntmsg[aipnt][4].AiState = 1; sprintf(szbuf, "地址%d导线Y轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 1); break; case 15: /*测温球导线电流*/ wdiitemppntmsg[aipnt][5].EuValue = fvalue*wdiitemppntmsg[aipnt][5].AiParam.fFactor\ +wdiitemppntmsg[aipnt][5].AiParam.EuValueDelta; wdiitemppntmsg[aipnt][5].AiState = 1; sprintf(szbuf, "地址%d导线电流:%0.3f ", pPortParam->devaddr, fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 16: /*测温球电池电压*/ wdiitemppntmsg[aipnt][2].EuValue = fvalue*wdiitemppntmsg[aipnt][2].AiParam.fFactor\ +wdiitemppntmsg[aipnt][2].AiParam.EuValueDelta; wdiitemppntmsg[aipnt][2].AiState = 1; sprintf(szbuf, "地址%d测温球电池电压:%0.3fV ", pPortParam->devaddr, fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 1); break; case 17: /*A相泄漏电流平均值;*/ LCpntmsg[0].EuValue = fvalue*LCpntmsg[0].AiParam.fFactor + LCpntmsg[0].AiParam.EuValueDelta; LCpntmsg[0].AiState = 1; sprintf(szbuf, "A相泄漏电流平均值:%0.3f ", fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 18: /*A相泄漏电流最大值;*/ LCpntmsg[1].EuValue = fvalue*LCpntmsg[1].AiParam.fFactor + LCpntmsg[1].AiParam.EuValueDelta; LCpntmsg[1].AiState = 1; sprintf(szbuf, "A相泄漏电流最大值:%0.3f ", fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 19: /*A相超过3mA的脉冲频次*/ LCpntmsg[2].EuValue = fvalue*LCpntmsg[2].AiParam.fFactor + LCpntmsg[2].AiParam.EuValueDelta; LCpntmsg[2].AiState = 1; sprintf(szbuf, "A相超过3mA的脉冲频次:%0.3f ", fvalue); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 20: /*A相超过10mA的脉冲频次*/ LCpntmsg[3].EuValue = fvalue*LCpntmsg[3].AiParam.fFactor + LCpntmsg[3].AiParam.EuValueDelta; LCpntmsg[3].AiState = 1; sprintf(szbuf, "A相超过10mA的脉冲频次:%0.3f ", fvalue); DebugStringPrintf(szbuf, strlen(szbuf), 1); break; case 21: /*B相泄漏电流平均值;*/ LCpntmsg[4].EuValue = fvalue*LCpntmsg[4].AiParam.fFactor + LCpntmsg[4].AiParam.EuValueDelta; LCpntmsg[4].AiState = 1; sprintf(szbuf, "B相泄漏电流平均值:%0.3f ", fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 22: /*B相泄漏电流最大值;*/ LCpntmsg[5].EuValue = fvalue*LCpntmsg[5].AiParam.fFactor + LCpntmsg[5].AiParam.EuValueDelta; LCpntmsg[5].AiState = 1; sprintf(szbuf, "B相泄漏电流最大值:%0.3f ", fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 23: /*B相超过3mA的脉冲频次*/ LCpntmsg[6].EuValue = fvalue*LCpntmsg[6].AiParam.fFactor + LCpntmsg[6].AiParam.EuValueDelta; LCpntmsg[6].AiState = 1; sprintf(szbuf, "B相超过3mA的脉冲频次:%0.3f ", fvalue); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 24: /*B相超过10mA的脉冲频次*/ LCpntmsg[7].EuValue = fvalue*LCpntmsg[7].AiParam.fFactor + LCpntmsg[7].AiParam.EuValueDelta; LCpntmsg[7].AiState = 1; sprintf(szbuf, "B相超过10mA的脉冲频次:%0.3f ", fvalue); DebugStringPrintf(szbuf, strlen(szbuf), 1); break; case 25: /*C相泄漏电流平均值;*/ LCpntmsg[8].EuValue = fvalue*LCpntmsg[8].AiParam.fFactor + LCpntmsg[8].AiParam.EuValueDelta; LCpntmsg[8].AiState = 1; sprintf(szbuf, "C相泄漏电流平均值:%0.3f ", fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 26: /*C相泄漏电流最大值;*/ LCpntmsg[9].EuValue = fvalue*LCpntmsg[9].AiParam.fFactor + LCpntmsg[9].AiParam.EuValueDelta; LCpntmsg[9].AiState = 1; sprintf(szbuf, "C相泄漏电流最大值:%0.3f ", fvalue/100); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 27: /*C相超过3mA的脉冲频次*/ LCpntmsg[10].EuValue = fvalue*LCpntmsg[10].AiParam.fFactor + LCpntmsg[10].AiParam.EuValueDelta; LCpntmsg[10].AiState = 1; sprintf(szbuf, "C相超过3mA的脉冲频次:%0.3f ", fvalue); DebugStringPrintf(szbuf, strlen(szbuf), 0); break; case 28: /*C相超过10mA的脉冲频次*/ LCpntmsg[11].EuValue = fvalue*LCpntmsg[11].AiParam.fFactor + LCpntmsg[11].AiParam.EuValueDelta; LCpntmsg[11].AiState = 1; sprintf(szbuf, "C相超过10mA的脉冲频次:%0.3f ", fvalue); DebugStringPrintf(szbuf, strlen(szbuf), 1); break; #endif } } } /********************************************************************************* 把16进制和10进制ASCII字符串转换成int整数 *********************************************************************************/ int ATOI(char *buf) { 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 MAX_SERIAL_DEV_NUM-1)) return; srdt.ms_dev[devidx].uOpenPowerFlag = CLOSEPOWER; } // 检查传感器电源是否应该关闭或打开 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 rand()%(m-n+1)+n*/ ictime = (int)time(NULL); srand((DWORD)ictime); randomdate = rand(); return randomdate; }