diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.cpp b/TestComm/app/src/main/cpp/SensorsProtocol.cpp index e9e7c847..f862bd3b 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.cpp +++ b/TestComm/app/src/main/cpp/SensorsProtocol.cpp @@ -23,8 +23,8 @@ SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM]; SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM]; -#if 0 -float weatherpntmsg[10]; + +//float weatherpntmsg[10]; static void setInt(int cmd, int value) { @@ -35,12 +35,31 @@ static void setInt(int cmd, int 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); + 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; + //return; +} + +int getInt(int cmd) +{ + int fd = open("/dev/mtkgpioctrl", O_RDONLY); + // LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd); + if( fd > 0 ) + { + IOT_PARAM param; + param.cmd = cmd; + ioctl(fd, IOT_PARAM_READ, ¶m); +#ifdef _DEBUG + ALOGI("getInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); +#endif + close(fd); + return param.value; + } + return -1; } + static void setRS485Enable(bool z) { setInt(CMD_SET_485_EN_STATE, z ? 1 : 0); } @@ -60,6 +79,8 @@ static void setCam3V3Enable(bool enabled) { setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0); } + +#if 0 /********************************************************************************* * 气象数据处理 * **********************************************************************************/ @@ -510,13 +531,13 @@ AI_DEF rallypntmsg[6][RALLY_DATA_NUM]; AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM]; //extern void * memset(void *m, int c, unsigned int n); -extern int atoi(const char *s); +//extern int atoi(const char *s); //extern int Gm_GetSamplingTimeSec(void); //extern void Delayms(kal_uint32 time); -extern void srand( unsigned int seed ); -extern int rand( void ); +//extern void srand( unsigned int seed ); +//extern int rand( void ); -static long get_msec(void ) +static long get_msec() { struct timeval tv; @@ -529,40 +550,48 @@ static long get_msec(void ) /* 打开串口电源 */ -void Gm_OpenSerialPower(void) +void Gm_OpenSerialPower() { /*由传送的主站的地方来控制串口电源,这里不实现*/; } // 关闭串口电源 -void Gm_CloseSerialPower(void) +void Gm_CloseSerialPower() { } // 关闭传感器电源 void Gm_CloseSensorsPower(int port) { - char iIoNo; + //char iIoNo; char szbuf[128]; sprintf(szbuf, "Close Sensors port %d Power!", port); /* 关闭电源*/ //switch(port) - + /* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/ + set12VEnable(false); + setCam3V3Enable(false); + setRS485Enable(false); } // 打开传感器电源 void Gm_OpenSensorsPower(int port) { - char iIoNo; + //char iIoNo; char szbuf[128]; if(0 == port) return; sprintf(szbuf, "Open Sensors port %d Power!", port); - /* 打开电源*/ + + set12VEnable(true); + setCam3V3Enable(true); + setRS485Enable(true); + + /* 打开电源*/ //switch(port) } @@ -638,7 +667,7 @@ void Gm_OpenSerialPort(int devidx) } // 关闭串口通讯 -void Gm_CloseSerialPort(void) +void Gm_CloseSerialPort() { int i; @@ -706,7 +735,7 @@ int Gm_SetSerialPortParam(int commid) return ret; } -void Gm_InitSerialComm_Test(void) +void Gm_InitSerialComm_Test() { int i, j; @@ -740,7 +769,8 @@ void Gm_InitSerialComm_Test(void) devparam[0].parity = 0; devparam[0].IsNoInsta = 1; //devparam[0].PowerPort = 2; - devparam[0].devaddr = 4; + //devparam[0].devaddr = 4; + devparam[0].devaddr = 2; devparam[1].ProtocolIdx = WEATHER_PROTOCOL; devparam[1].baudrate = B9600; @@ -750,17 +780,20 @@ void Gm_InitSerialComm_Test(void) devparam[1].parity = 0; devparam[1].IsNoInsta = 1; //devparam[1].PowerPort = 14; - devparam[1].devaddr = 1; -#if 0 - devparam[2].ProtocolIdx = SLANT_PROTOCOL; - devparam[2].baudrate = 1200; + //devparam[1].devaddr = 1; + devparam[1].devaddr = 13; + + devparam[2].ProtocolIdx = RALLY_PROTOCOL; + devparam[2].baudrate = B9600; devparam[2].databit = 8; - devparam[2].stopbit = 1; + memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit)); + sprintf(devparam[2].stopbit, "1"); devparam[2].parity = 0; - devparam[2].IsNoInsta = 0; + devparam[2].IsNoInsta = 1; //devparam[2].PowerPort = 3; - devparam[2].devaddr = 2; - + //devparam[2].devaddr = 13; + devparam[2].devaddr = 13; +#if 0 devparam[3].ProtocolIdx = PELCO_P_PROTOCOL; devparam[3].baudrate = 9600; devparam[3].databit = 8; @@ -852,16 +885,18 @@ void Gm_InitSerialComm_Test(void) devparam[12].IsNoInsta = 1; //devparam[12].PowerPort = 8; devparam[12].devaddr = 5; +#endif devparam[13].ProtocolIdx = SLANT_PROTOCOL; - devparam[13].baudrate = 1200; + devparam[13].baudrate = B9600; devparam[13].databit = 8; - devparam[13].stopbit = 1; + memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); + sprintf(devparam[13].stopbit, "1"); devparam[13].parity = 0; //devparam[13].PowerPort = 4; devparam[13].IsNoInsta = 1; devparam[13].devaddr = 2; - +#if 0 devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].baudrate = 1200; devparam[14].databit = 8; @@ -935,7 +970,7 @@ void Gm_InitSerialComm_Test(void) } // 初始化所有串口及所接传感器的配置 -void Gm_InitSerialComm(void) +void Gm_InitSerialComm() { int i; char szbuf[128]; @@ -1003,7 +1038,6 @@ void Gm_InitSerialComm(void) else sprintf(szbuf, "已启用!;"); LOGI("%s", szbuf); - } #endif #if 0 @@ -1041,7 +1075,7 @@ void Gm_InitSerialComm(void) } // 通过传感器名称来确定使用的串口号 -void FindDevUseSerialCommNo(void) +void FindDevUseSerialCommNo() { int i; @@ -1068,7 +1102,7 @@ void FindDevUseSerialCommNo(void) } } -void GM_StartSerialComm(void) +void GM_StartSerialComm() { int i, j; char szbuf[64]; @@ -1128,10 +1162,37 @@ void GM_StartSerialComm(void) srdt.ms_dev[i].IsNeedSerial = 0; continue; } + // 测试查询传感器电源状态 +#if 0 + LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); + + set12VEnable(true); + setCam3V3Enable(true); + setRS485Enable(true); + sleep(1); + LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + LOGV("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + LOGV("485 state=%d", getInt(CMD_SET_485_EN_STATE)); + set12VEnable(false); + setCam3V3Enable(false); + setRS485Enable(false); + sleep(1); + LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); +#endif // 打开传感器电源 // 打开对应的485电源 // 打开串口通讯 - Gm_OpenSerialPort(i); + if(1 == srdt.ms_dev[i].IsNeedSerial) + { + Gm_OpenSensorsPower(i); + Gm_OpenSerialPort(i); + } + //LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + } LOGI("启动数据采样!"); @@ -1139,11 +1200,12 @@ void GM_StartSerialComm(void) polltime = get_msec(); for(;;) { - usleep(TIMER_CNT*100); - //LOGW("polltime=%ldms", get_msec()-polltime); + usleep(10); + LOGW("polltime=%ldms", get_msec()-polltime); polltime = get_msec(); if(GM_SerialTimer() < 0) { + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); LOGV("退出采样流程!"); break; } @@ -1165,7 +1227,8 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) //DebugStringPrintf(szbuf, strlen(szbuf), 1); if(0 == srdt.selfflag) srdt.selfflag = 1; - Gm_OpenSerialPower(); + //Gm_OpenSerialPower(); + //Gm_OpenSensorsPower(); //if(0x00 == srdt.sampling) //{ // Gm_OpenSerialPort(); @@ -1242,10 +1305,12 @@ int GM_SerialTimer(void) { int flag = -1; - Gm_FindAllSensorsCommand(); + GM_AllSerialComRecv(); GM_IsCloseSensors(); + Gm_FindAllSensorsCommand(); GM_AllSerialComRecv(); flag = GM_CloseTimer(); + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); return flag; } @@ -1263,7 +1328,7 @@ void Gm_FindAllSensorsCommand(void) //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ for(j=0; j 0) break; + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + //LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + //LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); + flag = -1; switch(devparam[curidx].ProtocolIdx) @@ -1304,6 +1373,8 @@ void Gm_FindAllSensorsCommand(void) srdt.curdevidx[j] = curidx; break; } + // 发送缓冲区中命令 生成了命令之后紧接着进行命令发送 + SendCmdFormPollCmdBuf(j); } } @@ -1382,13 +1453,17 @@ void GM_AllSerialComRecv(void) memset(recvbuf, 0, sizeof(recvbuf)); if(serialport[j].fd < 0) continue; - recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ + for(;;) + { + recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ + if(recvlen < 1) - continue; + break; sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); BytestreamLOG(buf, recvbuf, recvlen, 'I'); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); + } } } @@ -1484,6 +1559,8 @@ int GM_CloseTimer(void) { #endif Gm_CloseSerialPort(); + for(j=0; j< MAX_SERIAL_DEV_NUM; j++) + Gm_CloseSensorsPower(j); for(j=0; jPollCmd[i+2], len, 'D'); + BytestreamLOG(buf, &pPortParam->PollCmd[2], len, 'D'); LOGW("sendtimeconst= %ld", get_msec()-lsendtime); lsendtime = get_msec(); } @@ -2303,12 +2379,18 @@ int FindNextShxyProtocolCommand( int devidx ) //srdt.ms_dev[devidx].FirstCmdTimeCnt++; return -1; } - //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - // MakeShxyProtocolPollCommand(devidx, 0x06); +#if 0 + if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + { + devparam[devidx].devaddr = 0xFF; + MakeShxyProtocolPollCommand(devidx, 0x02); + } + //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) + // MakeShxyProtocolPollCommand(devidx, 0x09); + else +#endif MakeShxyProtocolPollCommand(devidx, 0x09); - //else - //MakeShxyProtocolPollCommand(devidx, 0x08); srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; return 1; } @@ -2488,28 +2570,27 @@ void ShxyProtocolDataProcess( int commid) BYTE cmdidx; int i, j, aipnt, datanum; SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *serialport; + SIO_PARAM_SERIAL_DEF *curserial; char szbuf[64]; pPortParam = &srdt.ms_dev[commid]; - serialport = &serialport[pPortParam->UseSerialidx]; + curserial = &serialport[devparam[commid].commid]; //取出装置地址,开始处理地址+++ - if(0x02 == serialport->m_au8RecvBuf[5]) + if(0x02 == curserial->m_au8RecvBuf[5]) { - devparam[commid].devaddr = serialport->m_au8RecvBuf[4]; - //pPortParam->LinkOk = TRUE; + devparam[commid].devaddr = curserial->m_au8RecvBuf[4]; return; } - cmdidx = serialport->m_au8RecvBuf[5]; + cmdidx = curserial->m_au8RecvBuf[5]; aipnt = pPortParam->SameTypeDevIdx; - uDevAddr = serialport->m_au8RecvBuf[4]; + uDevAddr = curserial->m_au8RecvBuf[4]; fvalua = &fvalue; if(0x06 == cmdidx) { - if(0x08 !=serialport->m_au8RecvBuf[1]) + if(0x08 !=curserial->m_au8RecvBuf[1]) return; pPortParam->recvdatacnt++; if(pPortParam->recvdatacnt < 2) @@ -2517,10 +2598,10 @@ void ShxyProtocolDataProcess( int commid) // ++++++++++++++++++++++++++++ //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]; + *(BYTE*)fvalua = curserial->m_au8RecvBuf[9]; + *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[8]; + *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[7]; + *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[6]; if((fvalue < -59) ||(fvalue > 59)) { frnb = (GeneratingRandomNumber()%101-50)/1000.0; @@ -2538,10 +2619,10 @@ void ShxyProtocolDataProcess( int commid) //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]; + *(BYTE*)fvalua = curserial->m_au8RecvBuf[13]; + *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[12]; + *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[11]; + *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[10]; //if ((gDisSunRain & 0x20) == 0x20) { sprintf(szbuf, "Y =%0.3f ", fvalue); @@ -2559,7 +2640,7 @@ void ShxyProtocolDataProcess( int commid) //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; srdt.SectimesamplingCnt[1] += 1; } - datanum = serialport->m_au8RecvBuf[6]; + datanum = curserial->m_au8RecvBuf[6]; if((0x08 != cmdidx) && (0x09 != cmdidx)) return; @@ -2577,19 +2658,19 @@ void ShxyProtocolDataProcess( int commid) aipnt = pPortParam->SameTypeDevIdx; } #endif - for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) + 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]; + fvalue = (curserial->m_au8RecvBuf[j+1]<<24)+(curserial->m_au8RecvBuf[j+2]<<16) + +(curserial->m_au8RecvBuf[j+3]<<8)+curserial->m_au8RecvBuf[j+4]; else { - *(BYTE*)fvalua = 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]; + *(BYTE*)fvalua = curserial->m_au8RecvBuf[j+4]; + *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[j+3]; + *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[j+2]; + *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[j+1]; } - switch(serialport->m_au8RecvBuf[j]) + switch(curserial->m_au8RecvBuf[j]) { case 1: /*温度*/ if((fvalue < -40) ||(fvalue > 85)) @@ -2659,7 +2740,7 @@ void ShxyProtocolDataProcess( int commid) //if(fvalue/1000 > 25) // fwind -= 1.2; //sprintf(szbuf, "风速:%0.3f ", fwind); - sprintf(szbuf, "风速:%0.3f ", fvalue/1000); + sprintf(szbuf, "风速:%0.3f ", fvalue); LOGV("%s", szbuf); } break; @@ -2675,7 +2756,7 @@ void ShxyProtocolDataProcess( int commid) //g_SelfTest.SensorsFault |= (0x08); //if ((gDisSunRain & 0x10) == 0x10) { - sprintf(szbuf, "风向:%0.3f ", fvalue/1000); + sprintf(szbuf, "风向:%0.3f ", fvalue); LOGV("%s", szbuf); } break; @@ -2708,7 +2789,7 @@ void ShxyProtocolDataProcess( int commid) rallypntmsg[aipnt][0].AiState = 1; //if ((gDisSunRain & 0x10) == 0x10) { - sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue/1000.0); + sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue); LOGV("%s", szbuf); } // yizhonghu 20110629 @@ -2717,8 +2798,35 @@ void ShxyProtocolDataProcess( int commid) //} break; case 9: /*倾角传感器X轴倾角*/ + if((fvalue < -59) ||(fvalue > 59)) + { + frnb = (GeneratingRandomNumber()%101-50)/1000.0; + slantpntmsg[aipnt][0].EuValue *= (1+frnb); + } + else + slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ + +slantpntmsg[aipnt][0].AiParam.EuValueDelta; + slantpntmsg[aipnt][0].AiState = 1; + //if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[commid].devaddr, fvalue); + LOGV("%s", szbuf); + } break; case 10: /*倾角传感器Y轴倾角*/ + { + sprintf(szbuf, "Y =%0.3f ", fvalue); + LOGV("%s", szbuf); + } + if((fvalue < -59) ||(fvalue > 59)) + { + frnb = (GeneratingRandomNumber()%101-50)/1000.0; + 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; break; #if 0 case 11: /*测温球导线温度*/ diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.h b/TestComm/app/src/main/cpp/SensorsProtocol.h index aed28963..9a4d9469 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.h +++ b/TestComm/app/src/main/cpp/SensorsProtocol.h @@ -296,7 +296,7 @@ typedef struct } SRDT_DEF; static void PortDataProcess( void ); -static long get_msec(void ); +static long get_msec(); int serial_port_comm(); static int weather_comm(SERIAL_PARAM weatherport); @@ -310,6 +310,11 @@ static void setCam3V3Enable(bool enabled); /* 打开串口电源*/ void Gm_OpenSerialPower(void); +// 打开传感器电源 +void Gm_OpenSensorsPower(int port); +// 关闭传感器电源 +void Gm_CloseSensorsPower(int port); + // 打开串口通讯 void Gm_OpenSerialPort(int devidx); diff --git a/TestComm/app/src/main/cpp/serialComm.cpp b/TestComm/app/src/main/cpp/serialComm.cpp index 937756db..b562babf 100644 --- a/TestComm/app/src/main/cpp/serialComm.cpp +++ b/TestComm/app/src/main/cpp/serialComm.cpp @@ -91,7 +91,7 @@ static void set_stopbit (struct termios *opt, const char *stopbit) } } -int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) +int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) { struct termios opt; tcgetattr(fd, &opt); diff --git a/TestComm/app/src/main/cpp/serialComm.h b/TestComm/app/src/main/cpp/serialComm.h index 1fae9b80..d74c315f 100644 --- a/TestComm/app/src/main/cpp/serialComm.h +++ b/TestComm/app/src/main/cpp/serialComm.h @@ -14,6 +14,6 @@ #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) -int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); +int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); #endif //SERIAL_COMM_BASE89656_H diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index e9e7c847..f862bd3b 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -23,8 +23,8 @@ SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM]; SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM]; -#if 0 -float weatherpntmsg[10]; + +//float weatherpntmsg[10]; static void setInt(int cmd, int value) { @@ -35,12 +35,31 @@ static void setInt(int cmd, int 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); + 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; + //return; +} + +int getInt(int cmd) +{ + int fd = open("/dev/mtkgpioctrl", O_RDONLY); + // LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd); + if( fd > 0 ) + { + IOT_PARAM param; + param.cmd = cmd; + ioctl(fd, IOT_PARAM_READ, ¶m); +#ifdef _DEBUG + ALOGI("getInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); +#endif + close(fd); + return param.value; + } + return -1; } + static void setRS485Enable(bool z) { setInt(CMD_SET_485_EN_STATE, z ? 1 : 0); } @@ -60,6 +79,8 @@ static void setCam3V3Enable(bool enabled) { setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0); } + +#if 0 /********************************************************************************* * 气象数据处理 * **********************************************************************************/ @@ -510,13 +531,13 @@ AI_DEF rallypntmsg[6][RALLY_DATA_NUM]; AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM]; //extern void * memset(void *m, int c, unsigned int n); -extern int atoi(const char *s); +//extern int atoi(const char *s); //extern int Gm_GetSamplingTimeSec(void); //extern void Delayms(kal_uint32 time); -extern void srand( unsigned int seed ); -extern int rand( void ); +//extern void srand( unsigned int seed ); +//extern int rand( void ); -static long get_msec(void ) +static long get_msec() { struct timeval tv; @@ -529,40 +550,48 @@ static long get_msec(void ) /* 打开串口电源 */ -void Gm_OpenSerialPower(void) +void Gm_OpenSerialPower() { /*由传送的主站的地方来控制串口电源,这里不实现*/; } // 关闭串口电源 -void Gm_CloseSerialPower(void) +void Gm_CloseSerialPower() { } // 关闭传感器电源 void Gm_CloseSensorsPower(int port) { - char iIoNo; + //char iIoNo; char szbuf[128]; sprintf(szbuf, "Close Sensors port %d Power!", port); /* 关闭电源*/ //switch(port) - + /* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/ + set12VEnable(false); + setCam3V3Enable(false); + setRS485Enable(false); } // 打开传感器电源 void Gm_OpenSensorsPower(int port) { - char iIoNo; + //char iIoNo; char szbuf[128]; if(0 == port) return; sprintf(szbuf, "Open Sensors port %d Power!", port); - /* 打开电源*/ + + set12VEnable(true); + setCam3V3Enable(true); + setRS485Enable(true); + + /* 打开电源*/ //switch(port) } @@ -638,7 +667,7 @@ void Gm_OpenSerialPort(int devidx) } // 关闭串口通讯 -void Gm_CloseSerialPort(void) +void Gm_CloseSerialPort() { int i; @@ -706,7 +735,7 @@ int Gm_SetSerialPortParam(int commid) return ret; } -void Gm_InitSerialComm_Test(void) +void Gm_InitSerialComm_Test() { int i, j; @@ -740,7 +769,8 @@ void Gm_InitSerialComm_Test(void) devparam[0].parity = 0; devparam[0].IsNoInsta = 1; //devparam[0].PowerPort = 2; - devparam[0].devaddr = 4; + //devparam[0].devaddr = 4; + devparam[0].devaddr = 2; devparam[1].ProtocolIdx = WEATHER_PROTOCOL; devparam[1].baudrate = B9600; @@ -750,17 +780,20 @@ void Gm_InitSerialComm_Test(void) devparam[1].parity = 0; devparam[1].IsNoInsta = 1; //devparam[1].PowerPort = 14; - devparam[1].devaddr = 1; -#if 0 - devparam[2].ProtocolIdx = SLANT_PROTOCOL; - devparam[2].baudrate = 1200; + //devparam[1].devaddr = 1; + devparam[1].devaddr = 13; + + devparam[2].ProtocolIdx = RALLY_PROTOCOL; + devparam[2].baudrate = B9600; devparam[2].databit = 8; - devparam[2].stopbit = 1; + memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit)); + sprintf(devparam[2].stopbit, "1"); devparam[2].parity = 0; - devparam[2].IsNoInsta = 0; + devparam[2].IsNoInsta = 1; //devparam[2].PowerPort = 3; - devparam[2].devaddr = 2; - + //devparam[2].devaddr = 13; + devparam[2].devaddr = 13; +#if 0 devparam[3].ProtocolIdx = PELCO_P_PROTOCOL; devparam[3].baudrate = 9600; devparam[3].databit = 8; @@ -852,16 +885,18 @@ void Gm_InitSerialComm_Test(void) devparam[12].IsNoInsta = 1; //devparam[12].PowerPort = 8; devparam[12].devaddr = 5; +#endif devparam[13].ProtocolIdx = SLANT_PROTOCOL; - devparam[13].baudrate = 1200; + devparam[13].baudrate = B9600; devparam[13].databit = 8; - devparam[13].stopbit = 1; + memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); + sprintf(devparam[13].stopbit, "1"); devparam[13].parity = 0; //devparam[13].PowerPort = 4; devparam[13].IsNoInsta = 1; devparam[13].devaddr = 2; - +#if 0 devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].baudrate = 1200; devparam[14].databit = 8; @@ -935,7 +970,7 @@ void Gm_InitSerialComm_Test(void) } // 初始化所有串口及所接传感器的配置 -void Gm_InitSerialComm(void) +void Gm_InitSerialComm() { int i; char szbuf[128]; @@ -1003,7 +1038,6 @@ void Gm_InitSerialComm(void) else sprintf(szbuf, "已启用!;"); LOGI("%s", szbuf); - } #endif #if 0 @@ -1041,7 +1075,7 @@ void Gm_InitSerialComm(void) } // 通过传感器名称来确定使用的串口号 -void FindDevUseSerialCommNo(void) +void FindDevUseSerialCommNo() { int i; @@ -1068,7 +1102,7 @@ void FindDevUseSerialCommNo(void) } } -void GM_StartSerialComm(void) +void GM_StartSerialComm() { int i, j; char szbuf[64]; @@ -1128,10 +1162,37 @@ void GM_StartSerialComm(void) srdt.ms_dev[i].IsNeedSerial = 0; continue; } + // 测试查询传感器电源状态 +#if 0 + LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); + + set12VEnable(true); + setCam3V3Enable(true); + setRS485Enable(true); + sleep(1); + LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + LOGV("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + LOGV("485 state=%d", getInt(CMD_SET_485_EN_STATE)); + set12VEnable(false); + setCam3V3Enable(false); + setRS485Enable(false); + sleep(1); + LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); +#endif // 打开传感器电源 // 打开对应的485电源 // 打开串口通讯 - Gm_OpenSerialPort(i); + if(1 == srdt.ms_dev[i].IsNeedSerial) + { + Gm_OpenSensorsPower(i); + Gm_OpenSerialPort(i); + } + //LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + } LOGI("启动数据采样!"); @@ -1139,11 +1200,12 @@ void GM_StartSerialComm(void) polltime = get_msec(); for(;;) { - usleep(TIMER_CNT*100); - //LOGW("polltime=%ldms", get_msec()-polltime); + usleep(10); + LOGW("polltime=%ldms", get_msec()-polltime); polltime = get_msec(); if(GM_SerialTimer() < 0) { + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); LOGV("退出采样流程!"); break; } @@ -1165,7 +1227,8 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) //DebugStringPrintf(szbuf, strlen(szbuf), 1); if(0 == srdt.selfflag) srdt.selfflag = 1; - Gm_OpenSerialPower(); + //Gm_OpenSerialPower(); + //Gm_OpenSensorsPower(); //if(0x00 == srdt.sampling) //{ // Gm_OpenSerialPort(); @@ -1242,10 +1305,12 @@ int GM_SerialTimer(void) { int flag = -1; - Gm_FindAllSensorsCommand(); + GM_AllSerialComRecv(); GM_IsCloseSensors(); + Gm_FindAllSensorsCommand(); GM_AllSerialComRecv(); flag = GM_CloseTimer(); + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); return flag; } @@ -1263,7 +1328,7 @@ void Gm_FindAllSensorsCommand(void) //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ for(j=0; j 0) break; + //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + //LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE)); + //LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE)); + flag = -1; switch(devparam[curidx].ProtocolIdx) @@ -1304,6 +1373,8 @@ void Gm_FindAllSensorsCommand(void) srdt.curdevidx[j] = curidx; break; } + // 发送缓冲区中命令 生成了命令之后紧接着进行命令发送 + SendCmdFormPollCmdBuf(j); } } @@ -1382,13 +1453,17 @@ void GM_AllSerialComRecv(void) memset(recvbuf, 0, sizeof(recvbuf)); if(serialport[j].fd < 0) continue; - recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ + for(;;) + { + recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ + if(recvlen < 1) - continue; + break; sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); BytestreamLOG(buf, recvbuf, recvlen, 'I'); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); + } } } @@ -1484,6 +1559,8 @@ int GM_CloseTimer(void) { #endif Gm_CloseSerialPort(); + for(j=0; j< MAX_SERIAL_DEV_NUM; j++) + Gm_CloseSensorsPower(j); for(j=0; jPollCmd[i+2], len, 'D'); + BytestreamLOG(buf, &pPortParam->PollCmd[2], len, 'D'); LOGW("sendtimeconst= %ld", get_msec()-lsendtime); lsendtime = get_msec(); } @@ -2303,12 +2379,18 @@ int FindNextShxyProtocolCommand( int devidx ) //srdt.ms_dev[devidx].FirstCmdTimeCnt++; return -1; } - //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - // MakeShxyProtocolPollCommand(devidx, 0x06); +#if 0 + if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + { + devparam[devidx].devaddr = 0xFF; + MakeShxyProtocolPollCommand(devidx, 0x02); + } + //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) + // MakeShxyProtocolPollCommand(devidx, 0x09); + else +#endif MakeShxyProtocolPollCommand(devidx, 0x09); - //else - //MakeShxyProtocolPollCommand(devidx, 0x08); srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; return 1; } @@ -2488,28 +2570,27 @@ void ShxyProtocolDataProcess( int commid) BYTE cmdidx; int i, j, aipnt, datanum; SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *serialport; + SIO_PARAM_SERIAL_DEF *curserial; char szbuf[64]; pPortParam = &srdt.ms_dev[commid]; - serialport = &serialport[pPortParam->UseSerialidx]; + curserial = &serialport[devparam[commid].commid]; //取出装置地址,开始处理地址+++ - if(0x02 == serialport->m_au8RecvBuf[5]) + if(0x02 == curserial->m_au8RecvBuf[5]) { - devparam[commid].devaddr = serialport->m_au8RecvBuf[4]; - //pPortParam->LinkOk = TRUE; + devparam[commid].devaddr = curserial->m_au8RecvBuf[4]; return; } - cmdidx = serialport->m_au8RecvBuf[5]; + cmdidx = curserial->m_au8RecvBuf[5]; aipnt = pPortParam->SameTypeDevIdx; - uDevAddr = serialport->m_au8RecvBuf[4]; + uDevAddr = curserial->m_au8RecvBuf[4]; fvalua = &fvalue; if(0x06 == cmdidx) { - if(0x08 !=serialport->m_au8RecvBuf[1]) + if(0x08 !=curserial->m_au8RecvBuf[1]) return; pPortParam->recvdatacnt++; if(pPortParam->recvdatacnt < 2) @@ -2517,10 +2598,10 @@ void ShxyProtocolDataProcess( int commid) // ++++++++++++++++++++++++++++ //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]; + *(BYTE*)fvalua = curserial->m_au8RecvBuf[9]; + *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[8]; + *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[7]; + *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[6]; if((fvalue < -59) ||(fvalue > 59)) { frnb = (GeneratingRandomNumber()%101-50)/1000.0; @@ -2538,10 +2619,10 @@ void ShxyProtocolDataProcess( int commid) //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]; + *(BYTE*)fvalua = curserial->m_au8RecvBuf[13]; + *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[12]; + *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[11]; + *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[10]; //if ((gDisSunRain & 0x20) == 0x20) { sprintf(szbuf, "Y =%0.3f ", fvalue); @@ -2559,7 +2640,7 @@ void ShxyProtocolDataProcess( int commid) //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; srdt.SectimesamplingCnt[1] += 1; } - datanum = serialport->m_au8RecvBuf[6]; + datanum = curserial->m_au8RecvBuf[6]; if((0x08 != cmdidx) && (0x09 != cmdidx)) return; @@ -2577,19 +2658,19 @@ void ShxyProtocolDataProcess( int commid) aipnt = pPortParam->SameTypeDevIdx; } #endif - for(i = 0, j=7; (im_au8RecvBuf[1]); i++, j+=5 ) + 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]; + fvalue = (curserial->m_au8RecvBuf[j+1]<<24)+(curserial->m_au8RecvBuf[j+2]<<16) + +(curserial->m_au8RecvBuf[j+3]<<8)+curserial->m_au8RecvBuf[j+4]; else { - *(BYTE*)fvalua = 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]; + *(BYTE*)fvalua = curserial->m_au8RecvBuf[j+4]; + *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[j+3]; + *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[j+2]; + *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[j+1]; } - switch(serialport->m_au8RecvBuf[j]) + switch(curserial->m_au8RecvBuf[j]) { case 1: /*温度*/ if((fvalue < -40) ||(fvalue > 85)) @@ -2659,7 +2740,7 @@ void ShxyProtocolDataProcess( int commid) //if(fvalue/1000 > 25) // fwind -= 1.2; //sprintf(szbuf, "风速:%0.3f ", fwind); - sprintf(szbuf, "风速:%0.3f ", fvalue/1000); + sprintf(szbuf, "风速:%0.3f ", fvalue); LOGV("%s", szbuf); } break; @@ -2675,7 +2756,7 @@ void ShxyProtocolDataProcess( int commid) //g_SelfTest.SensorsFault |= (0x08); //if ((gDisSunRain & 0x10) == 0x10) { - sprintf(szbuf, "风向:%0.3f ", fvalue/1000); + sprintf(szbuf, "风向:%0.3f ", fvalue); LOGV("%s", szbuf); } break; @@ -2708,7 +2789,7 @@ void ShxyProtocolDataProcess( int commid) rallypntmsg[aipnt][0].AiState = 1; //if ((gDisSunRain & 0x10) == 0x10) { - sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue/1000.0); + sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue); LOGV("%s", szbuf); } // yizhonghu 20110629 @@ -2717,8 +2798,35 @@ void ShxyProtocolDataProcess( int commid) //} break; case 9: /*倾角传感器X轴倾角*/ + if((fvalue < -59) ||(fvalue > 59)) + { + frnb = (GeneratingRandomNumber()%101-50)/1000.0; + slantpntmsg[aipnt][0].EuValue *= (1+frnb); + } + else + slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ + +slantpntmsg[aipnt][0].AiParam.EuValueDelta; + slantpntmsg[aipnt][0].AiState = 1; + //if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[commid].devaddr, fvalue); + LOGV("%s", szbuf); + } break; case 10: /*倾角传感器Y轴倾角*/ + { + sprintf(szbuf, "Y =%0.3f ", fvalue); + LOGV("%s", szbuf); + } + if((fvalue < -59) ||(fvalue > 59)) + { + frnb = (GeneratingRandomNumber()%101-50)/1000.0; + 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; break; #if 0 case 11: /*测温球导线温度*/ diff --git a/app/src/main/cpp/SensorsProtocol.h b/app/src/main/cpp/SensorsProtocol.h index aed28963..9a4d9469 100644 --- a/app/src/main/cpp/SensorsProtocol.h +++ b/app/src/main/cpp/SensorsProtocol.h @@ -296,7 +296,7 @@ typedef struct } SRDT_DEF; static void PortDataProcess( void ); -static long get_msec(void ); +static long get_msec(); int serial_port_comm(); static int weather_comm(SERIAL_PARAM weatherport); @@ -310,6 +310,11 @@ static void setCam3V3Enable(bool enabled); /* 打开串口电源*/ void Gm_OpenSerialPower(void); +// 打开传感器电源 +void Gm_OpenSensorsPower(int port); +// 关闭传感器电源 +void Gm_CloseSensorsPower(int port); + // 打开串口通讯 void Gm_OpenSerialPort(int devidx); diff --git a/app/src/main/cpp/serialComm.cpp b/app/src/main/cpp/serialComm.cpp index 937756db..b562babf 100644 --- a/app/src/main/cpp/serialComm.cpp +++ b/app/src/main/cpp/serialComm.cpp @@ -91,7 +91,7 @@ static void set_stopbit (struct termios *opt, const char *stopbit) } } -int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) +int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) { struct termios opt; tcgetattr(fd, &opt); diff --git a/app/src/main/cpp/serialComm.h b/app/src/main/cpp/serialComm.h index 1fae9b80..d74c315f 100644 --- a/app/src/main/cpp/serialComm.h +++ b/app/src/main/cpp/serialComm.h @@ -14,6 +14,6 @@ #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) -int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); +int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); #endif //SERIAL_COMM_BASE89656_H