From 9f61f98cab99461bf6d5547b13307b85e60b4a0e Mon Sep 17 00:00:00 2001 From: huyizhong Date: Mon, 17 Jun 2024 11:13:39 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=9C=E6=8A=8A=E5=8E=9F=E6=9D=A5=E5=8D=95?= =?UTF-8?q?=E4=B8=80=E4=B8=B2=E5=8F=A3=E5=8D=95=E4=B8=80=E4=BC=A0=E6=84=9F?= =?UTF-8?q?=E5=99=A8=E6=94=B9=E6=88=90=E5=A4=9A=E4=B8=B2=E5=8F=A3=E5=A4=9A?= =?UTF-8?q?=E4=BC=A0=E6=84=9F=E5=99=A8=E6=A8=A1=E5=BC=8F=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestComm/app/src/main/cpp/SensorsProtocol.cpp | 2297 +++++++++++++- TestComm/app/src/main/cpp/SensorsProtocol.h | 372 ++- TestComm/app/src/main/cpp/native-lib.cpp | 1 + TestComm/app/src/main/cpp/serialComm.cpp | 2 + app/src/main/cpp/CMakeLists.txt | 4 +- app/src/main/cpp/SensorsProtocol.cpp | 2755 +++++++++++++++++ app/src/main/cpp/SensorsProtocol.h | 405 +++ app/src/main/cpp/WeatherComm.cpp | 558 ---- app/src/main/cpp/WeatherComm.h | 51 - app/src/main/cpp/serialComm.cpp | 117 + app/src/main/cpp/serialComm.h | 19 + 11 files changed, 5957 insertions(+), 624 deletions(-) create mode 100644 app/src/main/cpp/SensorsProtocol.cpp create mode 100644 app/src/main/cpp/SensorsProtocol.h delete mode 100644 app/src/main/cpp/WeatherComm.cpp delete mode 100644 app/src/main/cpp/WeatherComm.h create mode 100644 app/src/main/cpp/serialComm.cpp create mode 100644 app/src/main/cpp/serialComm.h diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.cpp b/TestComm/app/src/main/cpp/SensorsProtocol.cpp index 49012639..988cd19d 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.cpp +++ b/TestComm/app/src/main/cpp/SensorsProtocol.cpp @@ -18,8 +18,12 @@ #include "serialComm.h" #include "SensorsProtocol.h" #include +#include "SensorsProtocol.h" +#include "Eint.h" -SIO_PARAM_SERIAL_DEF serialport; +SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM]; +SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM]; +#if 0 float weatherpntmsg[10]; static void setInt(int cmd, int value) @@ -411,7 +415,6 @@ static int weather_comm(SERIAL_PARAM weatherport) //icnt++; continue; } - memset(szbuf, 0, sizeof(szbuf)); sprintf(szbuf, "Recv:"); for (i = 0; i < len; i++) { @@ -460,3 +463,2293 @@ int serial_port_comm() 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 int gDisSunRain; /* add by dzf 20110613控制打印信息*/ + +extern void rmmi_write_to_uart (kal_uint8 *buffer, kal_uint16 length, kal_bool stuff); +extern void GPIO_InitIO(char direction, char port); +extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada); +extern void GPIO_WriteIO(char data, char port); +extern int sprintf(char *, const char *, ...); +extern void StartTimer(U16 timerid, U32 delay, FuncPtr funcPtr); +extern void StopTimer(U16 timerid); +extern void Gm_OMC_UART_DebugHex(char *print_buf_ptr , int hexlen, char* out_pstr); +extern void applib_dt_get_date_time(applib_time_struct *t); +extern void U_SetBaudRate(UART_PORT port, UART_baudrate baudrate, module_type ownerid); +extern kal_uint32 Gm_GetTimeSec(void); +//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 CsgSensorsFaultStatus(BYTE askall); +#if PREVENT_PIRATES_BOARD_V40 +#else +#if STATE_GRID_CORPORATION_1738 +// 保存图片大小和包数 +extern void SavePhotosPacketNumAndSize(u_char channel, int presetno, int img_file_size, int packetnum, int iphototime); +// 采集到的图片填充到缓存区 +extern BYTE PhotosPacketToBuffer(BYTE channel, BYTE* photobuf, int packetno, int page_size); +// 获取摄像机类型 +extern BYTE GetCameraType(BYTE channel); +// 获取摄像机拍照图片大小 +extern BYTE GetCameraImageSize(BYTE channel); +// 传感器故障状态 +extern void SGC1738_SensorsFaultStatus(BYTE askall); +#endif +#endif +extern BOOL SetConfigToMcu(U8 ctrl); +#if ENCRYPTION_CHIP +// 获取需要加密的原始数据 +extern int GetEnDecryptData(BYTE * cmdbuf); +// 清除需要加密数据存储缓存区 +extern void ClearEncryptCmdbuf(void); +extern void GetOriginalID(int component, BYTE *buf); +extern int MakeEncryptNetCommand( BYTE cmdidx, BYTE subcmd, BYTE *cmdbuf, int len, BYTE nettype); +extern void OtomZh_RecvData(u_char *buf, int len); +// 设置加密状态 +extern void SetEncryptState(int encryptstate); +#endif +extern void srand( unsigned int seed ); +extern int rand( void ); + +/* +打开串口电源 +*/ +void Gm_OpenSerialPower(void) +{ + /*由传送的主站的地方来控制串口电源,这里不实现*/; +} + +// 关闭串口电源 +void Gm_CloseSerialPower(void) +{ +} + +// 关闭传感器电源 +void Gm_CloseSensorsPower(int port) +{ + char iIoNo; + char szbuf[128]; + + sprintf(szbuf, "Close Sensors port %d Power!", port); + + /* 关闭电源*/ + switch(port) + + +} + +// 打开传感器电源 +void Gm_OpenSensorsPower(int port) +{ + char iIoNo; + char szbuf[128]; + + if(0 == port) + return; + sprintf(szbuf, "Open Sensors port %d Power!", port); + /* 打开电源*/ + 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(void) +{ + + +} + +/******************************************************************************* +函数名称: kal_uint16 GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) +功能说明:串口发送数据 返回实际发送的字节数 +输入参数: +输出参数: +其它说明: +*********************************************************************************/ +int GM_SerialComSend(const unsigned char * cSendBuf, unsigned long nSendLen, int commid) +{ + +} + +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; + } +} + +// 初始化所有串口及所接传感器的配置 +void Gm_InitSerialComm(void) +{ + int i; + char szbuf[128]; + + //Gm_InitSerialComm_Test(); + // srdt 配置 + //srdt.sampling = 0; + //srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 + //srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数 + //srdt.uRunMode = 0; + srdt.CommMod = 0; + + // 查找装置使用的串口序号 + FindDevUseSerialCommNo(); + +#if 0 + for(i=0; i*/ + sprintf(devparam[i].pathname, "/dev/ttyS0"); + break; + default: + devparam[i].IsNoInsta = 0; + break; + } + } +} + +void GM_StartSerialComm(BYTE compid) +{ + int i, j; + char szbuf[64]; + + // 测试使用初始化配置 + //Gm_InitSerialComm(); + //DebugStringPrintf(szbuf, strlen(szbuf), 1); + memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); + //Gm_OpenSerialPower(); /* 不在这使用*/ + FindDevUseSerialCommNo(); + //Gm_InitSensorsIsUse(); + // 初始化串口使用状态 + for(i=0; isrdt.ms_dev[i].CameraChannel) || (srdt.ms_dev[i].CameraChannel >MAX_CHANNEL_NUM)) + { + srdt.ms_dev[i].IsNeedSerial = 0; + break; + } + if(channel == srdt.ms_dev[i].CameraChannel) + { +#if PREVENT_PIRATES_BOARD_V40 + ; +#else + bCameratype = GetCameraType(channel); +#endif + } + 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, "非数据采样期间,摄像机拍照启动串口定时器!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); + } + return; +} +#endif + +int GM_SerialTimer(void) +{ + Gm_FindAllSensorsCommand(); + GM_IsCloseSensors(); + GM_AllSerialComRecv(); + GM_ReadWireTemAndCloseTimer(); +} + +/******************************************************************************** +函数名称: void Gm_FindAllSensorsCommand() +功能说明:轮询所有串口和传感器是否需要生成下发命令 +输入参数: +输出参数: +其它说明: +*********************************************************************************/ +void Gm_FindAllSensorsCommand(void) +{ + int i, j,curidx,flag; + + //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ + for(j=0; j 0) + break; + + flag = -1; + if(srdt.ms_dev[curidx].IsNeedSerial == 0) + continue; + 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; + } + } +} + +/******************************************************************************** +函数名称: void GM_IsCloseSensors() +功能说明:检查所有传感器是否采集完毕,采集完毕的关闭传感器电源 +输入参数: +输出参数: +其它说明: +*********************************************************************************/ +void GM_IsCloseSensors(void) +{ + int i; + char buf[256]; + + for(i=0; i20*1000/TIMER_CNT) + { + srdt.ms_dev[i].IsNeedSerial = 0; + // 关闭传感器电源 + LOGI("因读取装置%d数据超过20秒,关闭装置%d电源!", i+1, i+1); + Gm_CtrlCloseSensorsPower(i); + } + else + srdt.ms_dev[i].FirstCmdTimeCnt++; + 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; jsrdt.ms_dev[i].ProtocolIdx))) + break; + } + // 增加被动读取测温数据方式 + if(i < MAX_SERIAL_DEV_NUM) + { + srdt.IsReadWireTem = 0;/* add by hyz 20120522*/ + StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); + } + else // 关闭所有串口及电源 + { + for(i=0; i 35) + //{ + if((srdt.ms_dev[j].PowerPort) == 0) + { + if(-1 == srdt.tempsamplingstartime) + srdt.tempsamplingstartime = iretime; // yizhonghu 110612 + srdt.IsReadWireTem = 1;/* add by dzf 20101110*/ + sprintf(buf, "打开无线模块电源!当前时间%d秒,起始时间%d秒", + (int)Gm_GetTimeSec(), srdt.ms_dev[j].FirstCmdTimeCnt); + DebugStringPrintf(buf, strlen(buf), 1); + } + //} + +#if 1 + //samtime = (int)(Gm_GetSamplingTimeSec()-10); + //if(iretime > samtime) + if(iretime > 155) + { + srdt.IsReadWireTem = 0;/* add by dzf 20101110*/ + srdt.ms_dev[j].IsNeedSerial = 0; + //srdt.tempsamplingstartime = -1; + srdt.tempsamplingsucctime = -1; + // 关闭传感器电源 + memset(buf, 0, sizeof(buf)); + sprintf(buf, "关闭无线模块电源!当前时间%d秒,起始时间%d秒,采样间隔时间10", + (int)Gm_GetTimeSec(), srdt.ms_dev[j].FirstCmdTimeCnt/*, samtime*/); + DebugStringPrintf(buf, strlen(buf), 1); + Gm_CtrlCloseSensorsPower(j); + } +#endif + break; + } + } + StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); + } + else + { + 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 != pPortParam->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[pPortParam->CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); + sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[pPortParam->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成功", serialport->Baud); + //DebugStringPrintf(szbuf, strlen(szbuf), 1); + pPortParam->Baud = serialport->Baud; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + SetConfigToMcu(UART_PARAM); + 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[pPortParam->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[pPortParam->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[pPortParam->CameraChannel-1]) + { + netportparam.SerialCameraPowerCtrl[pPortParam->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) + netportparam.PhotosFlag = FALSE; + break; + default: + serialport->RevCmdFlag = 1; + break; + } +} + +/********************************************************************************* + 发送命令 +**********************************************************************************/ +void SendCmdFormPollCmdBuf( int port ) +{ + char buf[64]; + int len, idelay=0, i, ilen; + 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; + 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; + Gm_SetSerialPortParam(port); + len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen-2, port); + if(len < 1) + { + rmmi_write_to_uart((kal_uint8*)"发送命令失败",strlen("发送命令失败"),KAL_FALSE); + rmmi_write_to_uart((kal_uint8*)"\n\r",2,KAL_FALSE); + rmmi_write_to_uart((kal_uint8 *)"\n\r",2,KAL_FALSE); + } + else + { + if(WDIITEMP_PROTOCOL_OLD == srdt.ms_dev[srdt.curdevidx[port]].ProtocolIdx) + { + sprintf(buf, "发送串口%d 装置%d命令:%s", port+1, srdt.curdevidx[port]+1,(char*)&pPortParam->PollCmd[2]); + DebugStringPrintf(buf, strlen(buf), 0); + } + else + { + if ((gDisSunRain & 0x04) == 0x04) + { /* add by dzf 20110613 控制打印信息*/ + sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); + DebugStringPrintf(buf, strlen(buf), 0); + for(i=0; i 100) + ilen = 100; + else + ilen = len-i; + memset(buf, 0,sizeof(buf)); + Gm_OMC_UART_DebugHex(buf, ilen, (char*)&pPortParam->PollCmd[i+2]); + } + } + } + } + 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, "串口摄像机未接或故障!结束拍照!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + return -1; + } + channel = srdt.ms_dev[devidx].CameraChannel; + if((1>channel) || (channel >MAX_CHANNEL_NUM)) + { + /* 通道号错误退出拍照流程*/; + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } +#if PREVENT_PIRATES_BOARD_V40 +#else + //imagesize = GetCameraImageSize(channel); + //imagequality = netportparam.bContrast[channel-1]; +#endif + //if((imagesize > 6) || (imagesize < 1)) + // imagesize = 6; + packetsize = (WORD)MAX_PHOTO_FRAME_LEN; + srdt.sendphotocmdcnt++; + srdt.imagepacketnum = 0; + srdt.errorPhotoNoCnt = 0; + cmdidx = 0x10; + srdt.sendphototime=(int)Gm_GetTimeSec(); + } + else if(10000 == cmdno)/* 下发设置串口波特率命令*/ + { + switch(g_serialparam[srdt.ms_dev[devidx].UseSerialidx].Baud) + { + 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, "设置串口摄像机参数时,配置参数错误!退出设置!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + 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秒未收到摄像机应答!退出设置!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + 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)Gm_GetTimeSec(); + } + 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); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + 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)Gm_GetTimeSec(); + 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(); + //} + 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_SetSerialPortBaud(srdt.camerauseserial, devparam[srdt.usecameradevidx].baudrate); + 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); + Gm_OMC_UART_DebugHex(buf, len, (char*)commandbuf); + } + 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_SetSerialPortBaud(srdt.camerauseserial, devparam[srdt.usecameradevidx].baudrate); + 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); + Gm_OMC_UART_DebugHex(buf, len, (char*)commandbuf); + } + 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(srdt.ms_dev[devidx].FirstCmdTimeCnt < 1*1000) + { + //srdt.ms_dev[devidx].FirstCmdTimeCnt++; + return -1; + } + if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + MakeShxyProtocolPollCommand(devidx, 0x06); + else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) + MakeShxyProtocolPollCommand(devidx, 0x09); + else + MakeShxyProtocolPollCommand(devidx, 0x08); + 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 = g_serialparam[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)srdt.ms_dev[portno].devaddr; // 传感器地址 + sendbuf[i++] = cmdidx; // 命令信息0x06 + sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6); + i+= 1; + sendbuf[i++] = 0x16; // 信息尾 + g_serialparam[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 commid, u_char *buf, int len)// 规约读数据处理 +{ + int i, ictime; + //WORD crc, check; + //SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *pPortParam; + + if((commid<0) || (commid > MAX_SERIAL_DEV_NUM)) + { + return; + } + pPortParam = &serialport[devparam[commid].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(commid); + 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 commid) +{ + float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; + WORD uDevAddr; + BYTE cmdidx; + int i, j, aipnt, datanum; + SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *serialport; + char szbuf[64]; + + pPortParam = &srdt.ms_dev[commid]; + serialport = &g_serialparam[pPortParam->UseSerialidx]; + + //取出装置地址,开始处理地址+++ + if(0x02 == serialport->m_au8RecvBuf[5]) + { + pPortParam->devaddr = serialport->m_au8RecvBuf[4]; + //pPortParam->LinkOk = TRUE; + return; + } +#if 0 + if(0x06 != serialport->m_au8RecvBuf[5]) + return; + if(0x08 !=serialport->m_au8RecvBuf[1]) + return; +#endif + cmdidx = serialport->m_au8RecvBuf[5]; + aipnt = pPortParam->SameTypeDevIdx; + uDevAddr = serialport->m_au8RecvBuf[4]; +#if MINI_INTERFACE_BOARD_V20/* 2.0板子测温单独使用串口2接测温球数据*/ + if(1==pPortParam->UseSerialidx) + ; + else + { + if(0 == srdt.IsReadWireTem) + { + if(uDevAddr != pPortParam->devaddr) + return; + } + } +#else + if(0 == srdt.IsReadWireTem) + { + if(uDevAddr != pPortParam->devaddr) + return; + } +#endif + /* 增加拉力实时采样数据存储时间控制 yizhonghu 20110629*/ + if(srdt.samplingtimeSec == 0) + { + srdt.samplingtimeSec = Gm_GetTimeSec(); + srdt.SectimesamplingCnt[0] = 0; + srdt.SectimesamplingCnt[1] = 0; + srdt.SectimesamplingCnt[2] = 0; + memset(XslantSec, 0xff, 6*Second_Sam_NUM*sizeof(short)); + memset(YslantSec, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + memset(rallyd, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + } + if(srdt.samplingtimeSec - Gm_GetTimeSec() >= 1) + { + if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "拉力次数:%d ", srdt.SectimesamplingCnt[2]); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + srdt.samplingtimeSec = Gm_GetTimeSec(); + srdt.SectimesamplingCnt[0] = 0; + srdt.SectimesamplingCnt[1] = 0; + srdt.SectimesamplingCnt[2] = 0; + memset(XslantSec, 0xff, 6*Second_Sam_NUM*sizeof(short)); + memset(YslantSec, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + memset(rallyd, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + } + + fvalua = &fvalue; + if(0x06 == cmdidx) + { + if(0x08 !=serialport->m_au8RecvBuf[1]) + return; + pPortParam->recvdatacnt++; + if(pPortParam->recvdatacnt < 2) + return; + // ++++++++++++++++++++++++++++ + g_SelfTest.SensorsFault |= (0x800<m_au8RecvBuf[9]; + *((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[8]; + *((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[7]; + *((BYTE*)fvalua+3) = serialport->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 ", pPortParam->devaddr, fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + // yizhonghu 20110629 + XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; + srdt.SectimesamplingCnt[0] += 1; + + *(BYTE*)fvalua = serialport->m_au8RecvBuf[13]; + *((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[12]; + *((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[11]; + *((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[10]; + if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "Y =%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + 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; + // yizhonghu 20110629 + YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; + srdt.SectimesamplingCnt[1] += 1; + } + datanum = serialport->m_au8RecvBuf[6]; + if((0x08 != cmdidx) && (0x09 != cmdidx)) + return; + + if(1 == srdt.IsReadWireTem) + { + for(i=0; iSameTypeDevIdx; + } + + for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) + { + if(0x08 == cmdidx) + fvalue = (serialport->m_au8RecvBuf[j+1]<<24)+(serialport->m_au8RecvBuf[j+2]<<16) + +(serialport->m_au8RecvBuf[j+3]<<8)+serialport->m_au8RecvBuf[j+4]; + else + { + *(BYTE*)fvalua = serialport->m_au8RecvBuf[j+4]; + *((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[j+3]; + *((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[j+2]; + *((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[j+1]; + } + switch(serialport->m_au8RecvBuf[j]) + { + case 1: /*温度*/ + if((fvalue < -40) ||(fvalue > 85)) + { + frnb = (GeneratingRandomNumber()%101-50)/1000.0; + weatherpntmsg[0].EuValue *= (1+frnb); + } + else + weatherpntmsg[0].EuValue = fvalue*weatherpntmsg[0].AiParam.fFactor + weatherpntmsg[0].AiParam.EuValueDelta; + weatherpntmsg[0].AiState = 1; + g_SelfTest.SensorsFault |= (0x01); + if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "温度:%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + break; + case 2: /*气压*/ + if((fvalue < 550) ||(fvalue > 1060)) + { + frnb = (GeneratingRandomNumber()%41-20)/10000.0; + weatherpntmsg[5].EuValue *= (1+frnb); + } + else + weatherpntmsg[5].EuValue = fvalue*weatherpntmsg[5].AiParam.fFactor + weatherpntmsg[5].AiParam.EuValueDelta; + weatherpntmsg[5].AiState = 1; + g_SelfTest.SensorsFault |= (0x10); + if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "气压:%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + break; + case 3: /*湿度*/ + if((fvalue < 0) ||(fvalue > 100)) + { + frnb = (GeneratingRandomNumber()%41-20)/1000.0; + weatherpntmsg[1].EuValue *= (1+frnb); + } + else + weatherpntmsg[1].EuValue = fvalue*weatherpntmsg[1].AiParam.fFactor + weatherpntmsg[1].AiParam.EuValueDelta; + weatherpntmsg[1].AiState = 1; + g_SelfTest.SensorsFault |= (0x02); + if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "湿度:%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + break; + case 4: /*雨量*/ + break; + case 5: /*日照*/ + break; + case 6: /*风速*/ + if((fvalue/1000 < 0) ||(fvalue/1000 > 80)) + { + frnb = (GeneratingRandomNumber()%41-20)/1000.0; + weatherpntmsg[2].EuValue *= (1+frnb); + } + else + weatherpntmsg[2].EuValue = fvalue*weatherpntmsg[2].AiParam.fFactor + weatherpntmsg[2].AiParam.EuValueDelta; + 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/1000); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + break; + case 7: /*风向*/ + if((fvalue/1000 < 0) ||(fvalue/1000 > 359.99)) + { + frnb = (GeneratingRandomNumber()%41-20)/1000.0; + weatherpntmsg[3].EuValue *= (1+frnb); + } + else + weatherpntmsg[3].EuValue = fvalue*weatherpntmsg[3].AiParam.fFactor + weatherpntmsg[3].AiParam.EuValueDelta; + weatherpntmsg[3].AiState = 1; + g_SelfTest.SensorsFault |= (0x08); + if ((gDisSunRain & 0x10) == 0x10) + { + sprintf(szbuf, "风向:%0.3f ", fvalue/1000); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + break; + case 8: /*拉力*/ + 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 + { + pPortParam->recvdatacnt++; + if(pPortParam->recvdatacnt < 2) + break; + g_SelfTest.SensorsFault |= (0x040<devaddr, fvalue/1000.0); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + // yizhonghu 20110629 + rallyd[aipnt][srdt.SectimesamplingCnt[2]] = (short)slantpntmsg[aipnt][0].EuValue; + srdt.SectimesamplingCnt[2] += 1; + } + break; + case 9: /*倾角传感器X轴倾角*/ + break; + case 10: /*倾角传感器Y轴倾角*/ + break; + case 11: /*测温球导线温度*/ + fcorvalue = WireTemperatureCorrection(fvalue/100, (WORD)pPortParam->devaddr); +#if 0 + 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; +#endif + 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; + } + } +} + +/********************************************************************************* + 把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; +} + + diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.h b/TestComm/app/src/main/cpp/SensorsProtocol.h index 857174b8..0c1d820e 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.h +++ b/TestComm/app/src/main/cpp/SensorsProtocol.h @@ -8,11 +8,98 @@ #include #include "GPIOControl.h" +#ifndef DWORD +typedef unsigned int DWORD; +#endif +#ifndef WORD +typedef unsigned short WORD; +#endif +#ifndef BYTE +typedef unsigned char BYTE; +#endif +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + +#define LOBYTE(w) ((unsigned char)(w)) +#define HIBYTE(w) ((unsigned char)(((unsigned short)(w) >> 8) & 0xFF)) + +#define LOWORD(l) ((WORD)(l)) +#define HIWORD(l) ((WORD)((DWORD)(l) >> 16)) + #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) +#define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ +#define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/ + +#define TIMER_CNT 10 // Poll命令定时器时间 50 ms + +#define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ +#define WIND_PROTOCOL 2 /* 风速风向协议序号*/ +#define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/ +#define RALLY_PROTOCOL 4 /* 拉力协议序号*/ +#define PELCO_P_PROTOCOL 5 /* 摄像机Pelco_P协议序号*/ +#define PELCO_D_PROTOCOL 6 /* 摄像机Pelco_D协议序号*/ +#define SERIALCAMERA_PROTOCOL 8 /* 串口摄像机协议序号*/ +#define RESERVE2_PROTOCOL 17 /* 备用2协议序号*/ +#define RESERVE4_PROTOCOL 19 /* 备用4协议序号*/ +#define RESERVE5_PROTOCOL 20 /* 备用5协议序号*/ +#define INVALID_PROTOCOL 21 /* 无效协议序号*/ + +#define WEATHER_DATA_NUM 8 /* 气象数据最大数量(一般最多是6要素)*/ +#define RALLY_DATA_NUM 2 /* 拉力数据最大数量(一般是1个)*/ +#define SLANTANGLE_DATA_NUM 3 /* 倾角数据最大数量(一般只有X轴和Y轴值)*/ + +#define PTZ_MOVETIME 1 // 云台移动等待时间为1秒 +#define MAX_CHANNEL_NUM 2 /* 视频通道最大通道*/ +#define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/ + +#define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ +#define TIMER_CNT 10 // Poll命令定时器时间 50 ms +#define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/ + +// 摄像机控制命令宏定义 +#define Cmd_Cancel 0x00000000 // 关闭功能 +#define SET_PRESETNO 0x00030000 // 设置预置点 +#define MOVE_TO_PRESETNO 0x00070000 // 调用预置点 + +/* 摄像机PELCO-P控制命令宏定义*/ +#define P_Auto_Scan 0x20000000 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define P_IRIS_CLOSE 0x08000000 /* 光圈缩小(1 有效)*/ +#define P_IRIS_OPEN 0x04000000 /* 光圈放大(1 有效)*/ +#define P_FOCUS_NEAR 0x02000000 /* 近距离聚焦(1 有效)*/ +#define P_FOCUS_FAR 0x01000000 /* 远距离聚焦(1 有效)*/ +#define P_ZOOM_WIDE 0x00400000 /* 远离物体(1 有效)*/ +#define P_ZOOM_TELE 0x00200000 /* 接近物体(1 有效)*/ +#define P_MOVE_DOWN 0x0010001f /* 向下移动镜头(1 有效)*/ +#define P_MOVE_UP 0x0008001f /* 向上移动镜头(1 有效)*/ +#define P_MOVE_LEFT 0x00041f00 /* 向左移动镜头(1 有效)*/ +#define P_MOVE_RIGHT 0x00021f00 /* 向右移动镜头(1 有效)*/ + +// 摄像机PELCO-D控制命令宏定义 +#define D_Auto_Scan 0x10000000 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define D_IRIS_CLOSE 0x04000000 /* 光圈缩小(1 有效)*/ +#define D_IRIS_OPEN 0x02000000 /* 光圈放大(1 有效)*/ +#define D_FOCUS_NEAR 0x01000000 /* 近距离聚焦(1 有效)*/ +#define D_FOCUS_FAR 0x00800000 /* 远距离聚焦(1 有效)*/ +#define D_ZOOM_WIDE 0x00400000 /* 远离物体(1 有效)*/ +#define D_ZOOM_TELE 0x00200000 /* 接近物体(1 有效)*/ +#define D_MOVE_DOWN 0x0010002d /* 向下移动镜头(1 有效)*/ +#define D_MOVE_UP 0x0008002d /* 向上移动镜头(1 有效)*/ +#define D_MOVE_LEFT 0x00042d00 /* 向左移动镜头(1 有效)*/ +#define D_MOVE_RIGHT 0x00022d00 /* 向右移动镜头(1 有效)*/ + +#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/ +#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/ +#define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/ +#define LOGW(fmt, args...) __android_log_print(ANDROID_LOG_WARN, "Sensors_Protocol", fmt, ##args) /* 黄色*/ +#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, "Sensors_Protocol", fmt, ##args) /* 蓝色*/ +#define HexCharToInt( c ) (((c) >= '0') && ((c) <= '9') ? (c) - '0' : ((c) >= 'a') && ((c) <= 'f') ? (c) - 'a' + 10 :((c) >= 'A') && ((c) <= 'F') ? (c) - 'A' + 10 : 0 ) typedef struct { @@ -23,26 +110,184 @@ typedef struct char str[MAX_STRING_LEN]; }IOT_PARAM; -// 串口参数 typedef struct { - int baudrate; /* 波特率*/ - int databit; /* 数据位*/ - char stopbit[8]; /* 停止位*/ - char parity; /* 校验位*/ - char pathname[128];/* 串口文件名及路径*/ + //float fAiDead; // 数据变化死区(百分系数值,如:设置死区为5%,只需赋值5即可) + float fFactor; // 数据系数 + float EuValueDelta; // 数据工程值偏移 + //BYTE Polar; // 数据极性(有无符号位) +} AI_PARAM; + +typedef struct +{ + AI_PARAM AiParam; // 数据点配置参数 + BYTE AiState; // 遥测是否有效标识 + float EuValue; // 遥测工程值 +} AI_DEF; + +// 需要配置的串口装置参数 +typedef struct +{ + unsigned int baudrate; /* 波特率*/ + int databit; /* 数据位*/ + char stopbit[8]; /* 停止位*/ + char parity; /* 校验位*/ + char pathname[64]; /* 串口文件名及路径*/ + int commid; /* 串口序号*/ + u_char ProtocolIdx; /* 规约索引,大于 0*/ + int devaddr; /* 装置使用的地址*/ + u_char IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ + u_char CameraChannel; /* 像机的通道号*/ + //u_char PowerPort; /* 传感器所接航空头编号*/ } SERIAL_PARAM; typedef struct { - int m_iRevStatus; /* */ - int m_iRecvLen; /* */ + int m_iRevStatus; /* */ + int m_iRecvLen; /* */ int m_iNeedRevLength; /* */ - int iRecvTime; /* */ - int RevCmdFlag; - unsigned char m_au8RecvBuf[128];/* */ + int iRecvTime; /* */ + u_char m_au8RecvBuf[RECVDATA_MAXLENTH];/* */ + int fd; /* 串口打开的文件句柄*/ + u_char PollCmd[SENDDATA_MAXLENTH]; + int cmdlen; // 发送缓冲区命令长度 + //******************** Poll Cmd **************************** + u_char Retry; /* 重试命令次数 */ + u_char RetryCnt; /* 重试命令计数*/ + u_long RetryTime; /* 重试命令时间 */ + u_long RetryTimeCnt; /* 重试命令时间计数*/ + u_long WaitTime; /* 命令间隔时间 */ + u_long WaitTimeCnt; /* 命令间隔时间计数*/ + u_char ForceWaitFlag; /* 强制等待标志*/ + u_short ForceWaitCnt; /* 强制等待计数*/ + u_char ReSendCmdFlag; /* 重发命令标志 */ + u_char SendCmdFlag; /* 命令发送标志 */ + u_char RevCmdFlag; /* 命令正常接收标志*/ + //********************************************************** } SIO_PARAM_SERIAL_DEF; +//串口相关装置所有参数集中定义 +typedef struct +{ + //******************** 端口基本信息 ************************ + u_char IsNeedSerial; /* 是否需要使用串口通讯*/ + int CmdWaitTime; /* 没有使用*/ + u_char UseSerialidx; /* 使用的串口序号*/ + int SerialCmdidx; /* 正在使用的串口发送命令的命令序号(-1:表示没有命令发送) + 加密使用 + 0x00,生成初始向量IV(即生成随机数) + 0x01,导入初始向量; + 0x02,用对端SM2公钥加密随机数; + 0x03,使用SM3 Hash报文数据; + 0x04,使用SM2私钥签名; + 0x05,使用SM2私钥解密对端随机数; + 0x06,对安全因子进行认证; + 0x0a,使用对端SM2公钥验签; + 0x09,导入密钥DK(即导入对称密钥); + 0x08,使用SM1加密; + 0x0b,使用SM1解密; + 0x0c,导出SM2公钥; + 密钥协商过程: + 1、请求0->2->c->3->3->4 + 2、对端应答5->a + 3、确认6->3->9 + 数据加解密过程: + 1、加密0->1->8 + 2、解密1->b*/ + + int enrecvtime; /* 发送加密命令后接收到应答计时*/ + int FirstCmdTimeCnt; /* 读取雨量计时计数*/ + u_char nextcmd; /* 第二次发送读取气象雨量命令 + 加密使用: + 0x00,无加密动作; + 0x1X,密钥协商请求过程; + 0x2X,密钥协商对端应答过程; + 0x3X,密钥协商确认过程; + 0x4X,数据加密过程; + 0x5X,数据解密过程;*/ + int m_iRevStatus; /* 接收数据缓冲区状态*/ + int m_iRecvLen; /* 接收数据长度*/ + int m_iNeedRevLength; /* 还需要接收的数据长度*/ + int recvdatacnt; /* 接收到有效数据*/ + u_char SameTypeDevIdx; /* 相同类型装置顺序排列序号(从0开始)*/ + int iRecvTime; /* 最近一次收到数据的绝对时间*/ + u_char uOpenPowerFlag; /* 传感器上电标志(0:不需要打开; 1:需要打开)*/ +} SERIAL_DEV_DEF; + +//串口相关装置所有参数集中定义 +typedef struct +{ + u_char uRunMode; /* 程序运行模式(0:正常运行模式;1:测试运行模式;)*/ + u_char IsGprs; /* GPRS网络是否注册*/ + + u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/ + module_type modtype; /* 切换到mod_mmi用户之前的用户名称*/ + u_char CommMod; /* 通讯模式(0:自动切换通讯模式;1:手动强制使用光网通讯;2:手动强制使用GPRS通讯)*/ + + u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ + u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ + u_char camerauseserial; /* 云台指令正在使用那个串口*/ + DWORD PtzCmdType; /* 云台指令类型*/ + int usecameradevidx; /* 有像机指令需要执行*/ + /* 执行指令的装置序号(-1:表示没有需要执行的指令;)*/ + int SendStopPtzCmdTimeCnt; /* 发送云台停止指令*/ + u_char 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:是)*/ + //int proruntime; /* 程序运行时间*/ + int IsSleep; /* 是否使程序休眠(1:不休眠;2:休眠)*/ + int tempsamplingstartime; /* 测温启动距离采样启动时间间隔*/ + int tempsamplingsucctime; /* 测温启动距离采样成功时间间隔*/ + int samplingtimeSec; /* 高速采样数据秒级时间控制*/ + int SectimesamplingCnt[3]; /* 高速采样数据秒级采样数*/ + int SunshineSensorsFault; /* 控制日照传感器故障发送*/ + int TempSensorsFault; /* 控制测温传感器故障发送*/ + int FirstSensorsFault; /* 第一次检测传感器故障发送*/ + int SensorsIsUse; /* 传感器是否启用与自检位置匹配*/ + int sequsampling; /* 顺序采样控制序号-1:无采样;其他对应相应装置序号*/ + +#if !SOUTHERN_POWER_GRID_V1 + int SensorsFault; /*字节位从低到高温度、湿度、风速、风向、 + 气压、导线测温、日照、雨量、摄像头、拉力、倾角*/ + int FlagSensorsFault; /*标志字节位从低到高温度、湿度、风速、风向、 + 气压、导线测温、日照、雨量、摄像头、拉力、倾角*/ +#endif + BYTE SameTypeDevNum[SENSORS_TYPE_NUM]; /* 相同类型数据传感器数量*/ + int imagepacketnum; /* 串口摄像机拍照图片总包数*/ + int historyimagenum[MAX_CHANNEL_NUM]; /* 球机保存的历史图片数量*/ +#if 1 + //int sendflag; /* 临时上送泄露电流值标志*/ + int sendphototime; /* 临时上送图片数据统计*/ + int sendphotocmdcnt; /* 一次拍照过程中发送拍照指令计数*/ + int photographtime; /* 图片拍摄的时间*/ + int iLastGetPhotoNo; /* 设置串口摄像机参数时暂存拍照命令序号*/ +#endif + u_char errorPhotoNoCnt; /* 串口摄像机拍照时回应错误包号计数(如:召第6包回应第3包)*/ + u_char RephotographCnt; /* 串口摄像机重拍计数(只在读照片数据应答出错时才重拍)*/ + int restartflag; /* 升级重启标识*/ + int selfflag; /* 是否检测传感器故障和关闭485电源标志*/ + + BYTE bEncryptstate; /* 加密状态 + 0:加密协商过程;1:加密协商完成; + 2:明文协商过程;3:明文协商完成*/ +#if ENCRYPTION_CHIP + CERTIFICATE cert; /* 本端证书*/ + + BYTE Randomnumber[18]; /* 临时存储加密芯片产生的随机数据*/ + BYTE KeyRandonum[18]; /* 临时存储对端的随机数据及会话密钥DK*/ + BYTE Sm2publickey[64]; /* 临时存储本端Sm2公钥*/ + BYTE Sm2encrypt[128]; /* 临时存储使用本端Sm2公钥加密后的数据*/ + BYTE Sm3hashdata[32]; /* 临时存储Sm3 Hash后数据*/ + BYTE Safetycertification[32];/* 临时存储安全认证因子*/ + char ticr[64]; /* 临时存储证书请求的主题信息*/ + WORD wframeno; /* 帧序号*/ + BYTE encry_chipstate; /* 加密芯片复位状态*/ + int enchipstartnum; /* 加密芯片复位次数*/ +#endif +} SRDT_DEF; + static void PortDataProcess( void ); static long get_msec(void ); int serial_port_comm(); @@ -54,4 +299,107 @@ static void set485ReadMode(); static void set12VEnable(bool z); static void setCam3V3Enable(bool enabled); +// 串口相关的所有函数定义 +/* 打开串口电源*/ +void Gm_OpenSerialPower(void); + +// 打开串口通讯 +void Gm_OpenSerialPort(int devidx); + +// 关闭串口通讯 +void Gm_CloseSerialPort(void); + +// 功能说明:串口发送数据 返回实际发送的字节数 +WORD GM_SerialComSend(const unsigned char * cSendBuf, unsigned long nSendLen, int commid); + +// 启动串口通讯 +void GM_StartSerialComm(BYTE compid); +// 启动使用串口拍照 +void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx); + +// 串口轮询通讯定时器 +int GM_SerialTimer(void); +//轮询所有串口和传感器是否需要生成下发命令 +void Gm_FindAllSensorsCommand(void); +//检查所有传感器是否采集完毕,采集完毕的关闭传感器电源 +void GM_IsCloseSensors(void); +//检查所有串口是否有数据接收,有则启动接收 +void GM_AllSerialComRecv(void); +//读取被动接收的测温球数据以及判断是否需要关闭定时器 +void GM_ReadWireTemAndCloseTimer(void); + +// 串口接收数据处理 +void SerialDataProcess(int devidx, u_char *buf, int len); + +// 串口摄像机数据处理 +void CameraPhotoPortDataProcess( int port); + +// 发送命令 +void SendCmdFormPollCmdBuf( int port ); + +// 清除发送命令的所有标识 +void ClearCmdAllFlag(int commid); + +// 下发串口拍照指令控制 +int FindNextCameraPhotoCommand(int devidx); +// 生成 CameraPhoto命令 +void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoParam, BYTE Threep ); + +// 清除命令缓冲区 +void ClearCmdFormPollCmdBuf(int port); + +// 准备发送云台指令 +int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd); + +// 发送转动摄像机云台命令定时器 +int Gm_Camera_Timer(void); + +// 生成 PELCO_P 命令 * +void Gm_SendPelco_pCommand( DWORD cmdtype); + +// 计算Pelco_p校验 +BYTE Gm_Pelco_pXORCheck( BYTE *msg, int len ); +// 生成 PELCO_D 命令 * +void Gm_SendPelco_DCommand( DWORD cmdtype); + +// 计算Pelco_D校验 +BYTE Gm_Pelco_DCheck( BYTE *msg, int len ); +// 查询传感器电源状态 +char Gm_GetSensorsPowerState(int port); + +// 通过传感器使用的航空头查找传感器使用的串口序号 +void FindDevUseSerialCommNo(void); + +// 初始化所有串口及所接传感器的配置 +void Gm_InitSerialComm(void); + +// 寻找并生成下一条倾角命令 +int FindNextShxyProtocolCommand( int devidx ); +// 倾角命令校验码计算 +unsigned char CalLpc(unsigned char *msg, int len); +// 读上海欣影传感器协议数据 +void ShxyProtocolRecvData(int commid, u_char *buf, int len); +// 检查检验和是否正确 +int CheckShxyProtocolLpcError( u_char* msg, int len ); + +// 把16进制和10进制ASCII字符串转换成int整数 +int ATOI(char *buf); + +//生成倾角命令 +void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx); +// 上海欣影传感器协议数据处理 +void ShxyProtocolDataProcess( int commid); +// 控制关闭传感器电源 +void Gm_CtrlCloseSensorsPower(int devidx); +// 检查传感器电源是否应该关闭或打开 +//void Gm_CheckSensorsPower(void); +void Gm_SetSerialPortBaud(int commid, UART_baudrate Baudrate); +// 得到串口波特率 +//T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate); + +void Gm_CloseSerialCamera(void); + +// 生成一个随机整数 +int GeneratingRandomNumber(void); + #endif //WEATHERCOMM_H diff --git a/TestComm/app/src/main/cpp/native-lib.cpp b/TestComm/app/src/main/cpp/native-lib.cpp index 0db89398..ad9630ad 100644 --- a/TestComm/app/src/main/cpp/native-lib.cpp +++ b/TestComm/app/src/main/cpp/native-lib.cpp @@ -20,6 +20,7 @@ #include "GPIOControl.h" #include "serialComm.h" #include "SensorsProtocol.h" +//#include "WeatherComm.h" #if 0 #define BYTE u_char; diff --git a/TestComm/app/src/main/cpp/serialComm.cpp b/TestComm/app/src/main/cpp/serialComm.cpp index 59afbd29..937756db 100644 --- a/TestComm/app/src/main/cpp/serialComm.cpp +++ b/TestComm/app/src/main/cpp/serialComm.cpp @@ -101,6 +101,8 @@ int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char 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; diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index bdb60179..b597da14 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -302,7 +302,9 @@ add_library( # Sets the name of the library. # TextPaint.cpp CvText.cpp SerialPort.cpp - WeatherComm.cpp + #WeatherComm.cpp + SensorsProtocol.cpp + serialComm.cpp ncnn/yolov5ncnn.cpp diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp new file mode 100644 index 00000000..988cd19d --- /dev/null +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -0,0 +1,2755 @@ +#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]; +#if 0 +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 ) + { + 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); +} +/********************************************************************************* +* 气象数据处理 * +**********************************************************************************/ +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 int gDisSunRain; /* add by dzf 20110613控制打印信息*/ + +extern void rmmi_write_to_uart (kal_uint8 *buffer, kal_uint16 length, kal_bool stuff); +extern void GPIO_InitIO(char direction, char port); +extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada); +extern void GPIO_WriteIO(char data, char port); +extern int sprintf(char *, const char *, ...); +extern void StartTimer(U16 timerid, U32 delay, FuncPtr funcPtr); +extern void StopTimer(U16 timerid); +extern void Gm_OMC_UART_DebugHex(char *print_buf_ptr , int hexlen, char* out_pstr); +extern void applib_dt_get_date_time(applib_time_struct *t); +extern void U_SetBaudRate(UART_PORT port, UART_baudrate baudrate, module_type ownerid); +extern kal_uint32 Gm_GetTimeSec(void); +//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 CsgSensorsFaultStatus(BYTE askall); +#if PREVENT_PIRATES_BOARD_V40 +#else +#if STATE_GRID_CORPORATION_1738 +// 保存图片大小和包数 +extern void SavePhotosPacketNumAndSize(u_char channel, int presetno, int img_file_size, int packetnum, int iphototime); +// 采集到的图片填充到缓存区 +extern BYTE PhotosPacketToBuffer(BYTE channel, BYTE* photobuf, int packetno, int page_size); +// 获取摄像机类型 +extern BYTE GetCameraType(BYTE channel); +// 获取摄像机拍照图片大小 +extern BYTE GetCameraImageSize(BYTE channel); +// 传感器故障状态 +extern void SGC1738_SensorsFaultStatus(BYTE askall); +#endif +#endif +extern BOOL SetConfigToMcu(U8 ctrl); +#if ENCRYPTION_CHIP +// 获取需要加密的原始数据 +extern int GetEnDecryptData(BYTE * cmdbuf); +// 清除需要加密数据存储缓存区 +extern void ClearEncryptCmdbuf(void); +extern void GetOriginalID(int component, BYTE *buf); +extern int MakeEncryptNetCommand( BYTE cmdidx, BYTE subcmd, BYTE *cmdbuf, int len, BYTE nettype); +extern void OtomZh_RecvData(u_char *buf, int len); +// 设置加密状态 +extern void SetEncryptState(int encryptstate); +#endif +extern void srand( unsigned int seed ); +extern int rand( void ); + +/* +打开串口电源 +*/ +void Gm_OpenSerialPower(void) +{ + /*由传送的主站的地方来控制串口电源,这里不实现*/; +} + +// 关闭串口电源 +void Gm_CloseSerialPower(void) +{ +} + +// 关闭传感器电源 +void Gm_CloseSensorsPower(int port) +{ + char iIoNo; + char szbuf[128]; + + sprintf(szbuf, "Close Sensors port %d Power!", port); + + /* 关闭电源*/ + switch(port) + + +} + +// 打开传感器电源 +void Gm_OpenSensorsPower(int port) +{ + char iIoNo; + char szbuf[128]; + + if(0 == port) + return; + sprintf(szbuf, "Open Sensors port %d Power!", port); + /* 打开电源*/ + 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(void) +{ + + +} + +/******************************************************************************* +函数名称: kal_uint16 GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) +功能说明:串口发送数据 返回实际发送的字节数 +输入参数: +输出参数: +其它说明: +*********************************************************************************/ +int GM_SerialComSend(const unsigned char * cSendBuf, unsigned long nSendLen, int commid) +{ + +} + +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; + } +} + +// 初始化所有串口及所接传感器的配置 +void Gm_InitSerialComm(void) +{ + int i; + char szbuf[128]; + + //Gm_InitSerialComm_Test(); + // srdt 配置 + //srdt.sampling = 0; + //srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 + //srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数 + //srdt.uRunMode = 0; + srdt.CommMod = 0; + + // 查找装置使用的串口序号 + FindDevUseSerialCommNo(); + +#if 0 + for(i=0; i*/ + sprintf(devparam[i].pathname, "/dev/ttyS0"); + break; + default: + devparam[i].IsNoInsta = 0; + break; + } + } +} + +void GM_StartSerialComm(BYTE compid) +{ + int i, j; + char szbuf[64]; + + // 测试使用初始化配置 + //Gm_InitSerialComm(); + //DebugStringPrintf(szbuf, strlen(szbuf), 1); + memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); + //Gm_OpenSerialPower(); /* 不在这使用*/ + FindDevUseSerialCommNo(); + //Gm_InitSensorsIsUse(); + // 初始化串口使用状态 + for(i=0; isrdt.ms_dev[i].CameraChannel) || (srdt.ms_dev[i].CameraChannel >MAX_CHANNEL_NUM)) + { + srdt.ms_dev[i].IsNeedSerial = 0; + break; + } + if(channel == srdt.ms_dev[i].CameraChannel) + { +#if PREVENT_PIRATES_BOARD_V40 + ; +#else + bCameratype = GetCameraType(channel); +#endif + } + 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, "非数据采样期间,摄像机拍照启动串口定时器!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); + } + return; +} +#endif + +int GM_SerialTimer(void) +{ + Gm_FindAllSensorsCommand(); + GM_IsCloseSensors(); + GM_AllSerialComRecv(); + GM_ReadWireTemAndCloseTimer(); +} + +/******************************************************************************** +函数名称: void Gm_FindAllSensorsCommand() +功能说明:轮询所有串口和传感器是否需要生成下发命令 +输入参数: +输出参数: +其它说明: +*********************************************************************************/ +void Gm_FindAllSensorsCommand(void) +{ + int i, j,curidx,flag; + + //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ + for(j=0; j 0) + break; + + flag = -1; + if(srdt.ms_dev[curidx].IsNeedSerial == 0) + continue; + 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; + } + } +} + +/******************************************************************************** +函数名称: void GM_IsCloseSensors() +功能说明:检查所有传感器是否采集完毕,采集完毕的关闭传感器电源 +输入参数: +输出参数: +其它说明: +*********************************************************************************/ +void GM_IsCloseSensors(void) +{ + int i; + char buf[256]; + + for(i=0; i20*1000/TIMER_CNT) + { + srdt.ms_dev[i].IsNeedSerial = 0; + // 关闭传感器电源 + LOGI("因读取装置%d数据超过20秒,关闭装置%d电源!", i+1, i+1); + Gm_CtrlCloseSensorsPower(i); + } + else + srdt.ms_dev[i].FirstCmdTimeCnt++; + 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; jsrdt.ms_dev[i].ProtocolIdx))) + break; + } + // 增加被动读取测温数据方式 + if(i < MAX_SERIAL_DEV_NUM) + { + srdt.IsReadWireTem = 0;/* add by hyz 20120522*/ + StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); + } + else // 关闭所有串口及电源 + { + for(i=0; i 35) + //{ + if((srdt.ms_dev[j].PowerPort) == 0) + { + if(-1 == srdt.tempsamplingstartime) + srdt.tempsamplingstartime = iretime; // yizhonghu 110612 + srdt.IsReadWireTem = 1;/* add by dzf 20101110*/ + sprintf(buf, "打开无线模块电源!当前时间%d秒,起始时间%d秒", + (int)Gm_GetTimeSec(), srdt.ms_dev[j].FirstCmdTimeCnt); + DebugStringPrintf(buf, strlen(buf), 1); + } + //} + +#if 1 + //samtime = (int)(Gm_GetSamplingTimeSec()-10); + //if(iretime > samtime) + if(iretime > 155) + { + srdt.IsReadWireTem = 0;/* add by dzf 20101110*/ + srdt.ms_dev[j].IsNeedSerial = 0; + //srdt.tempsamplingstartime = -1; + srdt.tempsamplingsucctime = -1; + // 关闭传感器电源 + memset(buf, 0, sizeof(buf)); + sprintf(buf, "关闭无线模块电源!当前时间%d秒,起始时间%d秒,采样间隔时间10", + (int)Gm_GetTimeSec(), srdt.ms_dev[j].FirstCmdTimeCnt/*, samtime*/); + DebugStringPrintf(buf, strlen(buf), 1); + Gm_CtrlCloseSensorsPower(j); + } +#endif + break; + } + } + StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); + } + else + { + 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 != pPortParam->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[pPortParam->CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); + sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[pPortParam->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成功", serialport->Baud); + //DebugStringPrintf(szbuf, strlen(szbuf), 1); + pPortParam->Baud = serialport->Baud; + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + SetConfigToMcu(UART_PARAM); + 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[pPortParam->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[pPortParam->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[pPortParam->CameraChannel-1]) + { + netportparam.SerialCameraPowerCtrl[pPortParam->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) + netportparam.PhotosFlag = FALSE; + break; + default: + serialport->RevCmdFlag = 1; + break; + } +} + +/********************************************************************************* + 发送命令 +**********************************************************************************/ +void SendCmdFormPollCmdBuf( int port ) +{ + char buf[64]; + int len, idelay=0, i, ilen; + 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; + 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; + Gm_SetSerialPortParam(port); + len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen-2, port); + if(len < 1) + { + rmmi_write_to_uart((kal_uint8*)"发送命令失败",strlen("发送命令失败"),KAL_FALSE); + rmmi_write_to_uart((kal_uint8*)"\n\r",2,KAL_FALSE); + rmmi_write_to_uart((kal_uint8 *)"\n\r",2,KAL_FALSE); + } + else + { + if(WDIITEMP_PROTOCOL_OLD == srdt.ms_dev[srdt.curdevidx[port]].ProtocolIdx) + { + sprintf(buf, "发送串口%d 装置%d命令:%s", port+1, srdt.curdevidx[port]+1,(char*)&pPortParam->PollCmd[2]); + DebugStringPrintf(buf, strlen(buf), 0); + } + else + { + if ((gDisSunRain & 0x04) == 0x04) + { /* add by dzf 20110613 控制打印信息*/ + sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); + DebugStringPrintf(buf, strlen(buf), 0); + for(i=0; i 100) + ilen = 100; + else + ilen = len-i; + memset(buf, 0,sizeof(buf)); + Gm_OMC_UART_DebugHex(buf, ilen, (char*)&pPortParam->PollCmd[i+2]); + } + } + } + } + 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, "串口摄像机未接或故障!结束拍照!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + return -1; + } + channel = srdt.ms_dev[devidx].CameraChannel; + if((1>channel) || (channel >MAX_CHANNEL_NUM)) + { + /* 通道号错误退出拍照流程*/; + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } +#if PREVENT_PIRATES_BOARD_V40 +#else + //imagesize = GetCameraImageSize(channel); + //imagequality = netportparam.bContrast[channel-1]; +#endif + //if((imagesize > 6) || (imagesize < 1)) + // imagesize = 6; + packetsize = (WORD)MAX_PHOTO_FRAME_LEN; + srdt.sendphotocmdcnt++; + srdt.imagepacketnum = 0; + srdt.errorPhotoNoCnt = 0; + cmdidx = 0x10; + srdt.sendphototime=(int)Gm_GetTimeSec(); + } + else if(10000 == cmdno)/* 下发设置串口波特率命令*/ + { + switch(g_serialparam[srdt.ms_dev[devidx].UseSerialidx].Baud) + { + 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, "设置串口摄像机参数时,配置参数错误!退出设置!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + 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秒未收到摄像机应答!退出设置!"); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + 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)Gm_GetTimeSec(); + } + 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); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + 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)Gm_GetTimeSec(); + 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(); + //} + 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_SetSerialPortBaud(srdt.camerauseserial, devparam[srdt.usecameradevidx].baudrate); + 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); + Gm_OMC_UART_DebugHex(buf, len, (char*)commandbuf); + } + 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_SetSerialPortBaud(srdt.camerauseserial, devparam[srdt.usecameradevidx].baudrate); + 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); + Gm_OMC_UART_DebugHex(buf, len, (char*)commandbuf); + } + 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(srdt.ms_dev[devidx].FirstCmdTimeCnt < 1*1000) + { + //srdt.ms_dev[devidx].FirstCmdTimeCnt++; + return -1; + } + if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + MakeShxyProtocolPollCommand(devidx, 0x06); + else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) + MakeShxyProtocolPollCommand(devidx, 0x09); + else + MakeShxyProtocolPollCommand(devidx, 0x08); + 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 = g_serialparam[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)srdt.ms_dev[portno].devaddr; // 传感器地址 + sendbuf[i++] = cmdidx; // 命令信息0x06 + sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6); + i+= 1; + sendbuf[i++] = 0x16; // 信息尾 + g_serialparam[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 commid, u_char *buf, int len)// 规约读数据处理 +{ + int i, ictime; + //WORD crc, check; + //SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *pPortParam; + + if((commid<0) || (commid > MAX_SERIAL_DEV_NUM)) + { + return; + } + pPortParam = &serialport[devparam[commid].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(commid); + 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 commid) +{ + float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; + WORD uDevAddr; + BYTE cmdidx; + int i, j, aipnt, datanum; + SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *serialport; + char szbuf[64]; + + pPortParam = &srdt.ms_dev[commid]; + serialport = &g_serialparam[pPortParam->UseSerialidx]; + + //取出装置地址,开始处理地址+++ + if(0x02 == serialport->m_au8RecvBuf[5]) + { + pPortParam->devaddr = serialport->m_au8RecvBuf[4]; + //pPortParam->LinkOk = TRUE; + return; + } +#if 0 + if(0x06 != serialport->m_au8RecvBuf[5]) + return; + if(0x08 !=serialport->m_au8RecvBuf[1]) + return; +#endif + cmdidx = serialport->m_au8RecvBuf[5]; + aipnt = pPortParam->SameTypeDevIdx; + uDevAddr = serialport->m_au8RecvBuf[4]; +#if MINI_INTERFACE_BOARD_V20/* 2.0板子测温单独使用串口2接测温球数据*/ + if(1==pPortParam->UseSerialidx) + ; + else + { + if(0 == srdt.IsReadWireTem) + { + if(uDevAddr != pPortParam->devaddr) + return; + } + } +#else + if(0 == srdt.IsReadWireTem) + { + if(uDevAddr != pPortParam->devaddr) + return; + } +#endif + /* 增加拉力实时采样数据存储时间控制 yizhonghu 20110629*/ + if(srdt.samplingtimeSec == 0) + { + srdt.samplingtimeSec = Gm_GetTimeSec(); + srdt.SectimesamplingCnt[0] = 0; + srdt.SectimesamplingCnt[1] = 0; + srdt.SectimesamplingCnt[2] = 0; + memset(XslantSec, 0xff, 6*Second_Sam_NUM*sizeof(short)); + memset(YslantSec, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + memset(rallyd, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + } + if(srdt.samplingtimeSec - Gm_GetTimeSec() >= 1) + { + if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "拉力次数:%d ", srdt.SectimesamplingCnt[2]); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + srdt.samplingtimeSec = Gm_GetTimeSec(); + srdt.SectimesamplingCnt[0] = 0; + srdt.SectimesamplingCnt[1] = 0; + srdt.SectimesamplingCnt[2] = 0; + memset(XslantSec, 0xff, 6*Second_Sam_NUM*sizeof(short)); + memset(YslantSec, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + memset(rallyd, 0xFF, 6*Second_Sam_NUM*sizeof(short)); + } + + fvalua = &fvalue; + if(0x06 == cmdidx) + { + if(0x08 !=serialport->m_au8RecvBuf[1]) + return; + pPortParam->recvdatacnt++; + if(pPortParam->recvdatacnt < 2) + return; + // ++++++++++++++++++++++++++++ + g_SelfTest.SensorsFault |= (0x800<m_au8RecvBuf[9]; + *((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[8]; + *((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[7]; + *((BYTE*)fvalua+3) = serialport->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 ", pPortParam->devaddr, fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + // yizhonghu 20110629 + XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; + srdt.SectimesamplingCnt[0] += 1; + + *(BYTE*)fvalua = serialport->m_au8RecvBuf[13]; + *((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[12]; + *((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[11]; + *((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[10]; + if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "Y =%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + 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; + // yizhonghu 20110629 + YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; + srdt.SectimesamplingCnt[1] += 1; + } + datanum = serialport->m_au8RecvBuf[6]; + if((0x08 != cmdidx) && (0x09 != cmdidx)) + return; + + if(1 == srdt.IsReadWireTem) + { + for(i=0; iSameTypeDevIdx; + } + + for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) + { + if(0x08 == cmdidx) + fvalue = (serialport->m_au8RecvBuf[j+1]<<24)+(serialport->m_au8RecvBuf[j+2]<<16) + +(serialport->m_au8RecvBuf[j+3]<<8)+serialport->m_au8RecvBuf[j+4]; + else + { + *(BYTE*)fvalua = serialport->m_au8RecvBuf[j+4]; + *((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[j+3]; + *((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[j+2]; + *((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[j+1]; + } + switch(serialport->m_au8RecvBuf[j]) + { + case 1: /*温度*/ + if((fvalue < -40) ||(fvalue > 85)) + { + frnb = (GeneratingRandomNumber()%101-50)/1000.0; + weatherpntmsg[0].EuValue *= (1+frnb); + } + else + weatherpntmsg[0].EuValue = fvalue*weatherpntmsg[0].AiParam.fFactor + weatherpntmsg[0].AiParam.EuValueDelta; + weatherpntmsg[0].AiState = 1; + g_SelfTest.SensorsFault |= (0x01); + if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "温度:%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + break; + case 2: /*气压*/ + if((fvalue < 550) ||(fvalue > 1060)) + { + frnb = (GeneratingRandomNumber()%41-20)/10000.0; + weatherpntmsg[5].EuValue *= (1+frnb); + } + else + weatherpntmsg[5].EuValue = fvalue*weatherpntmsg[5].AiParam.fFactor + weatherpntmsg[5].AiParam.EuValueDelta; + weatherpntmsg[5].AiState = 1; + g_SelfTest.SensorsFault |= (0x10); + if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "气压:%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + break; + case 3: /*湿度*/ + if((fvalue < 0) ||(fvalue > 100)) + { + frnb = (GeneratingRandomNumber()%41-20)/1000.0; + weatherpntmsg[1].EuValue *= (1+frnb); + } + else + weatherpntmsg[1].EuValue = fvalue*weatherpntmsg[1].AiParam.fFactor + weatherpntmsg[1].AiParam.EuValueDelta; + weatherpntmsg[1].AiState = 1; + g_SelfTest.SensorsFault |= (0x02); + if ((gDisSunRain & 0x80) == 0x80) + { + sprintf(szbuf, "湿度:%0.3f ", fvalue); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + break; + case 4: /*雨量*/ + break; + case 5: /*日照*/ + break; + case 6: /*风速*/ + if((fvalue/1000 < 0) ||(fvalue/1000 > 80)) + { + frnb = (GeneratingRandomNumber()%41-20)/1000.0; + weatherpntmsg[2].EuValue *= (1+frnb); + } + else + weatherpntmsg[2].EuValue = fvalue*weatherpntmsg[2].AiParam.fFactor + weatherpntmsg[2].AiParam.EuValueDelta; + 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/1000); + DebugStringPrintf(szbuf, strlen(szbuf), 0); + } + break; + case 7: /*风向*/ + if((fvalue/1000 < 0) ||(fvalue/1000 > 359.99)) + { + frnb = (GeneratingRandomNumber()%41-20)/1000.0; + weatherpntmsg[3].EuValue *= (1+frnb); + } + else + weatherpntmsg[3].EuValue = fvalue*weatherpntmsg[3].AiParam.fFactor + weatherpntmsg[3].AiParam.EuValueDelta; + weatherpntmsg[3].AiState = 1; + g_SelfTest.SensorsFault |= (0x08); + if ((gDisSunRain & 0x10) == 0x10) + { + sprintf(szbuf, "风向:%0.3f ", fvalue/1000); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + break; + case 8: /*拉力*/ + 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 + { + pPortParam->recvdatacnt++; + if(pPortParam->recvdatacnt < 2) + break; + g_SelfTest.SensorsFault |= (0x040<devaddr, fvalue/1000.0); + DebugStringPrintf(szbuf, strlen(szbuf), 1); + } + // yizhonghu 20110629 + rallyd[aipnt][srdt.SectimesamplingCnt[2]] = (short)slantpntmsg[aipnt][0].EuValue; + srdt.SectimesamplingCnt[2] += 1; + } + break; + case 9: /*倾角传感器X轴倾角*/ + break; + case 10: /*倾角传感器Y轴倾角*/ + break; + case 11: /*测温球导线温度*/ + fcorvalue = WireTemperatureCorrection(fvalue/100, (WORD)pPortParam->devaddr); +#if 0 + 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; +#endif + 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; + } + } +} + +/********************************************************************************* + 把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; +} + + diff --git a/app/src/main/cpp/SensorsProtocol.h b/app/src/main/cpp/SensorsProtocol.h new file mode 100644 index 00000000..0c1d820e --- /dev/null +++ b/app/src/main/cpp/SensorsProtocol.h @@ -0,0 +1,405 @@ +// +// Created by hyz on 2024/6/5. +// + +#ifndef WEATHERCOMM_H +#define WEATHERCOMM_H + +#include +#include "GPIOControl.h" + +#ifndef DWORD +typedef unsigned int DWORD; +#endif +#ifndef WORD +typedef unsigned short WORD; +#endif +#ifndef BYTE +typedef unsigned char BYTE; +#endif +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + +#define LOBYTE(w) ((unsigned char)(w)) +#define HIBYTE(w) ((unsigned char)(((unsigned short)(w) >> 8) & 0xFF)) + +#define LOWORD(l) ((WORD)(l)) +#define HIWORD(l) ((WORD)((DWORD)(l) >> 16)) + +#define MAX_STRING_LEN 32 +#define IOT_PARAM_WRITE 0xAE +#define IOT_PARAM_READ 0xAF + +#define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ +#define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/ + +#define TIMER_CNT 10 // Poll命令定时器时间 50 ms + +#define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ +#define WIND_PROTOCOL 2 /* 风速风向协议序号*/ +#define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/ +#define RALLY_PROTOCOL 4 /* 拉力协议序号*/ +#define PELCO_P_PROTOCOL 5 /* 摄像机Pelco_P协议序号*/ +#define PELCO_D_PROTOCOL 6 /* 摄像机Pelco_D协议序号*/ +#define SERIALCAMERA_PROTOCOL 8 /* 串口摄像机协议序号*/ +#define RESERVE2_PROTOCOL 17 /* 备用2协议序号*/ +#define RESERVE4_PROTOCOL 19 /* 备用4协议序号*/ +#define RESERVE5_PROTOCOL 20 /* 备用5协议序号*/ +#define INVALID_PROTOCOL 21 /* 无效协议序号*/ + +#define WEATHER_DATA_NUM 8 /* 气象数据最大数量(一般最多是6要素)*/ +#define RALLY_DATA_NUM 2 /* 拉力数据最大数量(一般是1个)*/ +#define SLANTANGLE_DATA_NUM 3 /* 倾角数据最大数量(一般只有X轴和Y轴值)*/ + +#define PTZ_MOVETIME 1 // 云台移动等待时间为1秒 +#define MAX_CHANNEL_NUM 2 /* 视频通道最大通道*/ +#define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/ + +#define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ +#define TIMER_CNT 10 // Poll命令定时器时间 50 ms +#define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/ + +// 摄像机控制命令宏定义 +#define Cmd_Cancel 0x00000000 // 关闭功能 +#define SET_PRESETNO 0x00030000 // 设置预置点 +#define MOVE_TO_PRESETNO 0x00070000 // 调用预置点 + +/* 摄像机PELCO-P控制命令宏定义*/ +#define P_Auto_Scan 0x20000000 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define P_IRIS_CLOSE 0x08000000 /* 光圈缩小(1 有效)*/ +#define P_IRIS_OPEN 0x04000000 /* 光圈放大(1 有效)*/ +#define P_FOCUS_NEAR 0x02000000 /* 近距离聚焦(1 有效)*/ +#define P_FOCUS_FAR 0x01000000 /* 远距离聚焦(1 有效)*/ +#define P_ZOOM_WIDE 0x00400000 /* 远离物体(1 有效)*/ +#define P_ZOOM_TELE 0x00200000 /* 接近物体(1 有效)*/ +#define P_MOVE_DOWN 0x0010001f /* 向下移动镜头(1 有效)*/ +#define P_MOVE_UP 0x0008001f /* 向上移动镜头(1 有效)*/ +#define P_MOVE_LEFT 0x00041f00 /* 向左移动镜头(1 有效)*/ +#define P_MOVE_RIGHT 0x00021f00 /* 向右移动镜头(1 有效)*/ + +// 摄像机PELCO-D控制命令宏定义 +#define D_Auto_Scan 0x10000000 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define D_IRIS_CLOSE 0x04000000 /* 光圈缩小(1 有效)*/ +#define D_IRIS_OPEN 0x02000000 /* 光圈放大(1 有效)*/ +#define D_FOCUS_NEAR 0x01000000 /* 近距离聚焦(1 有效)*/ +#define D_FOCUS_FAR 0x00800000 /* 远距离聚焦(1 有效)*/ +#define D_ZOOM_WIDE 0x00400000 /* 远离物体(1 有效)*/ +#define D_ZOOM_TELE 0x00200000 /* 接近物体(1 有效)*/ +#define D_MOVE_DOWN 0x0010002d /* 向下移动镜头(1 有效)*/ +#define D_MOVE_UP 0x0008002d /* 向上移动镜头(1 有效)*/ +#define D_MOVE_LEFT 0x00042d00 /* 向左移动镜头(1 有效)*/ +#define D_MOVE_RIGHT 0x00022d00 /* 向右移动镜头(1 有效)*/ + +#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/ +#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/ +#define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/ +#define LOGW(fmt, args...) __android_log_print(ANDROID_LOG_WARN, "Sensors_Protocol", fmt, ##args) /* 黄色*/ +#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, "Sensors_Protocol", fmt, ##args) /* 蓝色*/ +#define HexCharToInt( c ) (((c) >= '0') && ((c) <= '9') ? (c) - '0' : ((c) >= 'a') && ((c) <= 'f') ? (c) - 'a' + 10 :((c) >= 'A') && ((c) <= 'F') ? (c) - 'A' + 10 : 0 ) + +typedef struct +{ + int cmd; + int value; + int result; + long value2; + char str[MAX_STRING_LEN]; +}IOT_PARAM; + +typedef struct +{ + //float fAiDead; // 数据变化死区(百分系数值,如:设置死区为5%,只需赋值5即可) + float fFactor; // 数据系数 + float EuValueDelta; // 数据工程值偏移 + //BYTE Polar; // 数据极性(有无符号位) +} AI_PARAM; + +typedef struct +{ + AI_PARAM AiParam; // 数据点配置参数 + BYTE AiState; // 遥测是否有效标识 + float EuValue; // 遥测工程值 +} AI_DEF; + +// 需要配置的串口装置参数 +typedef struct +{ + unsigned int baudrate; /* 波特率*/ + int databit; /* 数据位*/ + char stopbit[8]; /* 停止位*/ + char parity; /* 校验位*/ + char pathname[64]; /* 串口文件名及路径*/ + int commid; /* 串口序号*/ + u_char ProtocolIdx; /* 规约索引,大于 0*/ + int devaddr; /* 装置使用的地址*/ + u_char IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ + u_char CameraChannel; /* 像机的通道号*/ + //u_char PowerPort; /* 传感器所接航空头编号*/ +} SERIAL_PARAM; + +typedef struct +{ + int m_iRevStatus; /* */ + int m_iRecvLen; /* */ + int m_iNeedRevLength; /* */ + int iRecvTime; /* */ + u_char m_au8RecvBuf[RECVDATA_MAXLENTH];/* */ + int fd; /* 串口打开的文件句柄*/ + u_char PollCmd[SENDDATA_MAXLENTH]; + int cmdlen; // 发送缓冲区命令长度 + //******************** Poll Cmd **************************** + u_char Retry; /* 重试命令次数 */ + u_char RetryCnt; /* 重试命令计数*/ + u_long RetryTime; /* 重试命令时间 */ + u_long RetryTimeCnt; /* 重试命令时间计数*/ + u_long WaitTime; /* 命令间隔时间 */ + u_long WaitTimeCnt; /* 命令间隔时间计数*/ + u_char ForceWaitFlag; /* 强制等待标志*/ + u_short ForceWaitCnt; /* 强制等待计数*/ + u_char ReSendCmdFlag; /* 重发命令标志 */ + u_char SendCmdFlag; /* 命令发送标志 */ + u_char RevCmdFlag; /* 命令正常接收标志*/ + //********************************************************** +} SIO_PARAM_SERIAL_DEF; + +//串口相关装置所有参数集中定义 +typedef struct +{ + //******************** 端口基本信息 ************************ + u_char IsNeedSerial; /* 是否需要使用串口通讯*/ + int CmdWaitTime; /* 没有使用*/ + u_char UseSerialidx; /* 使用的串口序号*/ + int SerialCmdidx; /* 正在使用的串口发送命令的命令序号(-1:表示没有命令发送) + 加密使用 + 0x00,生成初始向量IV(即生成随机数) + 0x01,导入初始向量; + 0x02,用对端SM2公钥加密随机数; + 0x03,使用SM3 Hash报文数据; + 0x04,使用SM2私钥签名; + 0x05,使用SM2私钥解密对端随机数; + 0x06,对安全因子进行认证; + 0x0a,使用对端SM2公钥验签; + 0x09,导入密钥DK(即导入对称密钥); + 0x08,使用SM1加密; + 0x0b,使用SM1解密; + 0x0c,导出SM2公钥; + 密钥协商过程: + 1、请求0->2->c->3->3->4 + 2、对端应答5->a + 3、确认6->3->9 + 数据加解密过程: + 1、加密0->1->8 + 2、解密1->b*/ + + int enrecvtime; /* 发送加密命令后接收到应答计时*/ + int FirstCmdTimeCnt; /* 读取雨量计时计数*/ + u_char nextcmd; /* 第二次发送读取气象雨量命令 + 加密使用: + 0x00,无加密动作; + 0x1X,密钥协商请求过程; + 0x2X,密钥协商对端应答过程; + 0x3X,密钥协商确认过程; + 0x4X,数据加密过程; + 0x5X,数据解密过程;*/ + int m_iRevStatus; /* 接收数据缓冲区状态*/ + int m_iRecvLen; /* 接收数据长度*/ + int m_iNeedRevLength; /* 还需要接收的数据长度*/ + int recvdatacnt; /* 接收到有效数据*/ + u_char SameTypeDevIdx; /* 相同类型装置顺序排列序号(从0开始)*/ + int iRecvTime; /* 最近一次收到数据的绝对时间*/ + u_char uOpenPowerFlag; /* 传感器上电标志(0:不需要打开; 1:需要打开)*/ +} SERIAL_DEV_DEF; + +//串口相关装置所有参数集中定义 +typedef struct +{ + u_char uRunMode; /* 程序运行模式(0:正常运行模式;1:测试运行模式;)*/ + u_char IsGprs; /* GPRS网络是否注册*/ + + u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/ + module_type modtype; /* 切换到mod_mmi用户之前的用户名称*/ + u_char CommMod; /* 通讯模式(0:自动切换通讯模式;1:手动强制使用光网通讯;2:手动强制使用GPRS通讯)*/ + + u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ + u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ + u_char camerauseserial; /* 云台指令正在使用那个串口*/ + DWORD PtzCmdType; /* 云台指令类型*/ + int usecameradevidx; /* 有像机指令需要执行*/ + /* 执行指令的装置序号(-1:表示没有需要执行的指令;)*/ + int SendStopPtzCmdTimeCnt; /* 发送云台停止指令*/ + u_char 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:是)*/ + //int proruntime; /* 程序运行时间*/ + int IsSleep; /* 是否使程序休眠(1:不休眠;2:休眠)*/ + int tempsamplingstartime; /* 测温启动距离采样启动时间间隔*/ + int tempsamplingsucctime; /* 测温启动距离采样成功时间间隔*/ + int samplingtimeSec; /* 高速采样数据秒级时间控制*/ + int SectimesamplingCnt[3]; /* 高速采样数据秒级采样数*/ + int SunshineSensorsFault; /* 控制日照传感器故障发送*/ + int TempSensorsFault; /* 控制测温传感器故障发送*/ + int FirstSensorsFault; /* 第一次检测传感器故障发送*/ + int SensorsIsUse; /* 传感器是否启用与自检位置匹配*/ + int sequsampling; /* 顺序采样控制序号-1:无采样;其他对应相应装置序号*/ + +#if !SOUTHERN_POWER_GRID_V1 + int SensorsFault; /*字节位从低到高温度、湿度、风速、风向、 + 气压、导线测温、日照、雨量、摄像头、拉力、倾角*/ + int FlagSensorsFault; /*标志字节位从低到高温度、湿度、风速、风向、 + 气压、导线测温、日照、雨量、摄像头、拉力、倾角*/ +#endif + BYTE SameTypeDevNum[SENSORS_TYPE_NUM]; /* 相同类型数据传感器数量*/ + int imagepacketnum; /* 串口摄像机拍照图片总包数*/ + int historyimagenum[MAX_CHANNEL_NUM]; /* 球机保存的历史图片数量*/ +#if 1 + //int sendflag; /* 临时上送泄露电流值标志*/ + int sendphototime; /* 临时上送图片数据统计*/ + int sendphotocmdcnt; /* 一次拍照过程中发送拍照指令计数*/ + int photographtime; /* 图片拍摄的时间*/ + int iLastGetPhotoNo; /* 设置串口摄像机参数时暂存拍照命令序号*/ +#endif + u_char errorPhotoNoCnt; /* 串口摄像机拍照时回应错误包号计数(如:召第6包回应第3包)*/ + u_char RephotographCnt; /* 串口摄像机重拍计数(只在读照片数据应答出错时才重拍)*/ + int restartflag; /* 升级重启标识*/ + int selfflag; /* 是否检测传感器故障和关闭485电源标志*/ + + BYTE bEncryptstate; /* 加密状态 + 0:加密协商过程;1:加密协商完成; + 2:明文协商过程;3:明文协商完成*/ +#if ENCRYPTION_CHIP + CERTIFICATE cert; /* 本端证书*/ + + BYTE Randomnumber[18]; /* 临时存储加密芯片产生的随机数据*/ + BYTE KeyRandonum[18]; /* 临时存储对端的随机数据及会话密钥DK*/ + BYTE Sm2publickey[64]; /* 临时存储本端Sm2公钥*/ + BYTE Sm2encrypt[128]; /* 临时存储使用本端Sm2公钥加密后的数据*/ + BYTE Sm3hashdata[32]; /* 临时存储Sm3 Hash后数据*/ + BYTE Safetycertification[32];/* 临时存储安全认证因子*/ + char ticr[64]; /* 临时存储证书请求的主题信息*/ + WORD wframeno; /* 帧序号*/ + BYTE encry_chipstate; /* 加密芯片复位状态*/ + int enchipstartnum; /* 加密芯片复位次数*/ +#endif +} SRDT_DEF; + +static void PortDataProcess( void ); +static long get_msec(void ); +int serial_port_comm(); +static int weather_comm(SERIAL_PARAM weatherport); + +static void setRS485Enable(bool z); +static void set485WriteMode(); +static void set485ReadMode(); +static void set12VEnable(bool z); +static void setCam3V3Enable(bool enabled); + +// 串口相关的所有函数定义 +/* 打开串口电源*/ +void Gm_OpenSerialPower(void); + +// 打开串口通讯 +void Gm_OpenSerialPort(int devidx); + +// 关闭串口通讯 +void Gm_CloseSerialPort(void); + +// 功能说明:串口发送数据 返回实际发送的字节数 +WORD GM_SerialComSend(const unsigned char * cSendBuf, unsigned long nSendLen, int commid); + +// 启动串口通讯 +void GM_StartSerialComm(BYTE compid); +// 启动使用串口拍照 +void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx); + +// 串口轮询通讯定时器 +int GM_SerialTimer(void); +//轮询所有串口和传感器是否需要生成下发命令 +void Gm_FindAllSensorsCommand(void); +//检查所有传感器是否采集完毕,采集完毕的关闭传感器电源 +void GM_IsCloseSensors(void); +//检查所有串口是否有数据接收,有则启动接收 +void GM_AllSerialComRecv(void); +//读取被动接收的测温球数据以及判断是否需要关闭定时器 +void GM_ReadWireTemAndCloseTimer(void); + +// 串口接收数据处理 +void SerialDataProcess(int devidx, u_char *buf, int len); + +// 串口摄像机数据处理 +void CameraPhotoPortDataProcess( int port); + +// 发送命令 +void SendCmdFormPollCmdBuf( int port ); + +// 清除发送命令的所有标识 +void ClearCmdAllFlag(int commid); + +// 下发串口拍照指令控制 +int FindNextCameraPhotoCommand(int devidx); +// 生成 CameraPhoto命令 +void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoParam, BYTE Threep ); + +// 清除命令缓冲区 +void ClearCmdFormPollCmdBuf(int port); + +// 准备发送云台指令 +int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd); + +// 发送转动摄像机云台命令定时器 +int Gm_Camera_Timer(void); + +// 生成 PELCO_P 命令 * +void Gm_SendPelco_pCommand( DWORD cmdtype); + +// 计算Pelco_p校验 +BYTE Gm_Pelco_pXORCheck( BYTE *msg, int len ); +// 生成 PELCO_D 命令 * +void Gm_SendPelco_DCommand( DWORD cmdtype); + +// 计算Pelco_D校验 +BYTE Gm_Pelco_DCheck( BYTE *msg, int len ); +// 查询传感器电源状态 +char Gm_GetSensorsPowerState(int port); + +// 通过传感器使用的航空头查找传感器使用的串口序号 +void FindDevUseSerialCommNo(void); + +// 初始化所有串口及所接传感器的配置 +void Gm_InitSerialComm(void); + +// 寻找并生成下一条倾角命令 +int FindNextShxyProtocolCommand( int devidx ); +// 倾角命令校验码计算 +unsigned char CalLpc(unsigned char *msg, int len); +// 读上海欣影传感器协议数据 +void ShxyProtocolRecvData(int commid, u_char *buf, int len); +// 检查检验和是否正确 +int CheckShxyProtocolLpcError( u_char* msg, int len ); + +// 把16进制和10进制ASCII字符串转换成int整数 +int ATOI(char *buf); + +//生成倾角命令 +void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx); +// 上海欣影传感器协议数据处理 +void ShxyProtocolDataProcess( int commid); +// 控制关闭传感器电源 +void Gm_CtrlCloseSensorsPower(int devidx); +// 检查传感器电源是否应该关闭或打开 +//void Gm_CheckSensorsPower(void); +void Gm_SetSerialPortBaud(int commid, UART_baudrate Baudrate); +// 得到串口波特率 +//T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate); + +void Gm_CloseSerialCamera(void); + +// 生成一个随机整数 +int GeneratingRandomNumber(void); + +#endif //WEATHERCOMM_H diff --git a/app/src/main/cpp/WeatherComm.cpp b/app/src/main/cpp/WeatherComm.cpp deleted file mode 100644 index 52dcd5ed..00000000 --- a/app/src/main/cpp/WeatherComm.cpp +++ /dev/null @@ -1,558 +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_oflag = 0; - //opt.c_lflag |= 0; - opt.c_oflag &= ~OPOST; - opt.c_cc[VTIME] = vtime; - opt.c_cc[VMIN] = vmin; - tcflush (fd, TCIFLUSH); - return (tcsetattr (fd, TCSANOW, &opt)); -} - -static void setInt(int cmd, int value) -{ - int fd = open("/dev/mtkgpioctrl", O_RDONLY); - IOT_PARAM param; - param.cmd = cmd; - param.value = value; - // LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value); - if( fd > 0 ) - { - int res = ioctl(fd, IOT_PARAM_WRITE, ¶m); - // LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); - close(fd); - } - return; -} -static void setRS485Enable(bool z) { - setInt(CMD_SET_485_EN_STATE, z ? 1 : 0); -} - -static void set485WriteMode() { - setInt(CMD_SET_485_STATE, 1); -} - -static void set485ReadMode() { - setInt(CMD_SET_485_STATE, 0); -} -static void set12VEnable(bool z) { - setInt(CMD_SET_12V_EN_STATE, z ? 1 : 0); -} - -static void setCam3V3Enable(bool enabled) -{ - setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0); -} - - -/********************************************************************************* -* 气象数据处理 * -**********************************************************************************/ -void PortDataProcess( void ) -{ - float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; - //WORD uDevAddr; - unsigned char cmdidx; - int i, j, aipnt, datanum; - SIO_PARAM_SERIAL_DEF *pPortParam; - char szbuf[64]; - - pPortParam = &serialport; - //取出装置地址,开始处理地址+++ - if(0x02 == pPortParam->m_au8RecvBuf[5]) - { - //pPortParam->devaddr = pPortParam->m_au8RecvBuf[4]; - return; - } - cmdidx = pPortParam->m_au8RecvBuf[5]; -#if 0 - aipnt = pPortParam->SameTypeDevIdx; - uDevAddr = serialport->m_au8RecvBuf[4]; - if(0 == srdt.IsReadWireTem) - { - if(uDevAddr != pPortParam->devaddr) - return; - } -#endif - fvalua = &fvalue; - datanum = pPortParam->m_au8RecvBuf[6]; - if((0x08 != cmdidx) && (0x09 != cmdidx)) - return; - - for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) - { - if(0x08 == cmdidx) - fvalue = (pPortParam->m_au8RecvBuf[j+1]<<24)+(pPortParam->m_au8RecvBuf[j+2]<<16) - +(pPortParam->m_au8RecvBuf[j+3]<<8)+pPortParam->m_au8RecvBuf[j+4]; - else - { - *(u_char *)fvalua = pPortParam->m_au8RecvBuf[j+4]; - *((u_char *)fvalua+1) = pPortParam->m_au8RecvBuf[j+3]; - *((u_char *)fvalua+2) = pPortParam->m_au8RecvBuf[j+2]; - *((u_char *)fvalua+3) = pPortParam->m_au8RecvBuf[j+1]; - } - switch(pPortParam->m_au8RecvBuf[j]) - { - case 1: /*温度*/ - weatherpntmsg[0] = fvalue; - LOGE("温度:%0.3f ", fvalue); - break; - case 2: /*气压*/ - weatherpntmsg[5] = fvalue; - LOGE("气压:%0.3f ", fvalue); - break; - case 3: /*湿度*/ - weatherpntmsg[1] = fvalue; - LOGE("湿度:%0.3f ", fvalue); - break; - case 4: /*雨量*/ - break; - case 5: /*日照*/ - break; - case 6: /*风速*/ - weatherpntmsg[2] = fvalue; - LOGE("风速:%0.3f ", fvalue); - break; - case 7: /*风向*/ - weatherpntmsg[3] = fvalue; - LOGE("风向:%0.3f ", fvalue); - break; - case 8: /*拉力*/ - 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); - //set12VEnable(false); - //setCam3V3Enable(false); - //setRS485Enable(false); - fd = -1; - continue; - } - } - set485ReadMode(); - memset(recvbuf, 0, sizeof(recvbuf)); - len = read(fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ - if (len < 0) { - LOGE("serial read error \n"); - continue; - } - if(0 == len) - { - //icnt++; - continue; - } - - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "Recv:"); - for (i = 0; i < len; i++) { - sprintf(szbuf, "%s %02X", szbuf, recvbuf[i]); - } - __android_log_print(ANDROID_LOG_INFO, "serial", "%s", szbuf); - RecvData((u_char*)recvbuf, len); - //LOGE("一周期空循环次数%d, 读取次数%d, 时间:%d %d", icnt, inum, (int)time(NULL), itimecnt); - icnt = 0; - //serialport.RevCmdFlag =1; - } - - close(fd); - set12VEnable(false); - setCam3V3Enable(false); - setRS485Enable(false); - - //exit(-1); - return(0); -} - -int serial_port_comm() -{ - SERIAL_PARAM portparm; - - //struct timeval tv; - - //gettimeofday(&tv, NULL); - //long time_in_microseconds = tv.tv_sec * 1000000 + tv.tv_usec; - - //LOGE("Current time in microseconds: %ld\n", time_in_microseconds); - -#if 1 - memset(portparm.pathname, 0, sizeof(portparm.pathname)); - sprintf(portparm.pathname, "/dev/ttyS0"); - portparm.parity = 'N'; - portparm.databit = 8; - portparm.baudrate = B9600; - memset(portparm.stopbit, 0, sizeof(portparm.stopbit)); - sprintf(portparm.stopbit, "1"); -#endif - //itimecnt = (int)time(NULL); - - //for(;;) - 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 80c47f98..00000000 --- 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( void ); -int serial_port_comm(); -static int weather_comm(SERIAL_PARAM weatherport); -int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); - -#endif //WEATHERCOMM_H diff --git a/app/src/main/cpp/serialComm.cpp b/app/src/main/cpp/serialComm.cpp new file mode 100644 index 00000000..937756db --- /dev/null +++ b/app/src/main/cpp/serialComm.cpp @@ -0,0 +1,117 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "GPIOControl.h" +#include "serialComm.h" + + +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)); +} + + + + diff --git a/app/src/main/cpp/serialComm.h b/app/src/main/cpp/serialComm.h new file mode 100644 index 00000000..1fae9b80 --- /dev/null +++ b/app/src/main/cpp/serialComm.h @@ -0,0 +1,19 @@ +// +// Created by hyz on 2024/6/5. +// + +#ifndef SERIAL_COMM_BASE89656_H +#define SERIAL_COMM_BASE89656_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) + +int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); + +#endif //SERIAL_COMM_BASE89656_H