From 3cc25a5a51a6581f3c812a314b9633e14ae97073 Mon Sep 17 00:00:00 2001 From: huyizhong Date: Fri, 12 Jul 2024 18:21:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BF=AE=E6=94=B9=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E4=B8=AD=E5=8F=91=E7=8E=B0=E7=9A=84Bug=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0log=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestComm/app/src/main/cpp/CMakeLists.txt | 6 +- TestComm/app/src/main/cpp/SensorsProtocol.cpp | 611 +++++++++--------- TestComm/app/src/main/cpp/SensorsProtocol.h | 6 +- TestComm/app/src/main/cpp/WeatherComm.cpp | 2 +- TestComm/app/src/main/cpp/native-lib.cpp | 10 +- TestComm/app/src/main/cpp/serialComm.h | 2 +- app/src/main/cpp/GPIOControl.cpp | 10 + app/src/main/cpp/GPIOControl.h | 11 + app/src/main/cpp/SensorsProtocol.cpp | 611 +++++++++--------- app/src/main/cpp/SensorsProtocol.h | 6 +- app/src/main/cpp/serialComm.h | 2 +- app/src/main/cpp/串口函数调用说明(V1.0).docx | Bin 0 -> 22797 bytes 12 files changed, 670 insertions(+), 607 deletions(-) create mode 100644 app/src/main/cpp/串口函数调用说明(V1.0).docx diff --git a/TestComm/app/src/main/cpp/CMakeLists.txt b/TestComm/app/src/main/cpp/CMakeLists.txt index c6ece9e8..4015c241 100644 --- a/TestComm/app/src/main/cpp/CMakeLists.txt +++ b/TestComm/app/src/main/cpp/CMakeLists.txt @@ -27,9 +27,9 @@ add_library( # Sets the name of the library. SpiLib.cpp native-lib.cpp GPIOControl.cpp - WeatherComm.cpp - #serialComm.cpp - #SensorsProtocol.cpp + #WeatherComm.cpp + serialComm.cpp + SensorsProtocol.cpp ) # Searches for a specified prebuilt library and stores the path as a diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.cpp b/TestComm/app/src/main/cpp/SensorsProtocol.cpp index a04db0eb..466c4d52 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.cpp +++ b/TestComm/app/src/main/cpp/SensorsProtocol.cpp @@ -577,6 +577,27 @@ void Gm_CloseSensorsPower() setCam3V3Enable(false); setRS485Enable(false); +#if 0 + setInt(CMD_SET_WTH_POWER, 0); + setInt(CMD_SET_PULL_POWER, 0); + setInt(CMD_SET_ANGLE_POWER, 0); + setInt(CMD_SET_OTHER_POWER, 0); + setInt(CMD_SET_PIC1_POWER, 0); +#endif +#if 1 + setInt(CMD_SET_485_en0, 1); + setInt(CMD_SET_485_en1, 1); + setInt(CMD_SET_485_en2, 1); + setInt(CMD_SET_485_en3, 1); + setInt(CMD_SET_485_en4, 1); +#else + setInt(CMD_SET_485_en0, 0); + setInt(CMD_SET_485_en1, 0); + setInt(CMD_SET_485_en2, 0); + setInt(CMD_SET_485_en3, 0); + setInt(CMD_SET_485_en4, 0); +#endif + } // 打开传感器电源 @@ -589,10 +610,38 @@ void Gm_OpenSensorsPower() // return; //sprintf(szbuf, "Open Sensors port %d Power!", port); - set12VEnable(true); + //set12VEnable(true); setCam3V3Enable(true); setRS485Enable(true); +#if 0 + setInt(CMD_SET_WTH_POWER, 0); + setInt(CMD_SET_PULL_POWER, 0); + setInt(CMD_SET_ANGLE_POWER, 0); + setInt(CMD_SET_OTHER_POWER, 0); + setInt(CMD_SET_PIC1_POWER, 0); +#else + setInt(CMD_SET_WTH_POWER, 1); + setInt(CMD_SET_PULL_POWER, 1); + setInt(CMD_SET_ANGLE_POWER, 1); + setInt(CMD_SET_OTHER_POWER, 1); + setInt(CMD_SET_PIC1_POWER, 1); +#endif +#if 1 + setInt(CMD_SET_SPI_POWER, 1); + setInt(CMD_SET_485_en0, 1); + setInt(CMD_SET_485_en1, 1); + setInt(CMD_SET_485_en2, 1); + setInt(CMD_SET_485_en3, 1); + setInt(CMD_SET_485_en4, 1); +#else + setInt(CMD_SET_485_en0, 0); + setInt(CMD_SET_485_en1, 0); + setInt(CMD_SET_485_en2, 0); + setInt(CMD_SET_485_en3, 0); + setInt(CMD_SET_485_en4, 0); +#endif + /* 打开电源*/ //switch(port) @@ -623,6 +672,7 @@ void BytestreamLOG(char* describe, u_char* buf, int len, char flag) { sprintf(szbuf, "%s %02X", szbuf, buf[i]); } + SaveLogTofile(szbuf); switch (flag) { case 'E': @@ -650,22 +700,30 @@ void BytestreamLOG(char* describe, u_char* buf, int len, char flag) void Gm_OpenSerialPort(int devidx) { int fd = -1; + char szbuf[512]; if((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM)) return; + memset(szbuf, 0, sizeof(szbuf)); if(serialport[devparam[devidx].commid].fd <= 0) { 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); + sprintf(szbuf, "装置%d 打开串口%d失败!fd=%d", devidx+1, devparam[devidx].commid+1, fd); + SaveLogTofile(szbuf); + LOGE("装置%d 打开串口%d失败!fd=%d", devidx+1, devparam[devidx].commid+1, fd); return; } - LOGI("装置%d 打开串口%d成功!fd=%d\n", devidx+1, devparam[devidx].commid+1, fd); + sprintf(szbuf, "装置%d 打开串口%d成功!fd=%d", devidx+1, devparam[devidx].commid+1, fd ); + SaveLogTofile(szbuf); + LOGI("装置%d 打开串口%d成功!fd=%d", 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); + sprintf(szbuf, "装置%d 串口%d已经打开!fd=%d", devidx+1, devparam[devidx].commid+1, serialport[devparam[devidx].commid].fd); + SaveLogTofile(szbuf); + LOGI("装置%d 串口%d已经打开!fd=%d", devidx+1, devparam[devidx].commid+1, serialport[devparam[devidx].commid].fd); } // 关闭串口通讯 @@ -703,7 +761,8 @@ int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commi //isendtime = get_msec(); if (len < 0) { - LOGE("write data error \n"); + LOGE("write data error "); + SaveLogTofile("write data error "); return -1; } else if(len > 0) @@ -718,12 +777,16 @@ int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commi int Gm_SetSerialPortParam(int commid) { int ret; + char szbuf[128]; SERIAL_PARAM *pPortParam=NULL; pPortParam = &devparam[srdt.curdevidx[commid]]; ret= set_port_attr (serialport[commid].fd, pPortParam->baudrate,pPortParam->databit,pPortParam->stopbit,pPortParam->parity,0,0 );/*9600 8n1 */ if(ret < 0) { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf,"串口%d 波特率等参数设置错误!", commid+1); + SaveLogTofile(szbuf); LOGE("串口%d 波特率等参数设置错误!", commid+1); return -1; } @@ -768,10 +831,10 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) //sprintf(devparam[0].stopbit, "1"); sensorParam[0].stopbit = 1; sensorParam[0].parity = 'n'; - sensorParam[0].IsNoInsta = 1; - //devparam[0].PowerPort = 2; - //devparam[0].devaddr = 4; - sensorParam[0].devaddr = 10; + sensorParam[0].IsNoInsta = 0; + sensorParam[0].devaddr = 4; + memset(sensorParam[0].pathname, 0, sizeof(sensorParam[0].pathname)); + sprintf(sensorParam[0].pathname, "/dev/ttysWK3"); sensorParam[1].SensorsType = WEATHER_PROTOCOL; sensorParam[1].baudrate = 9600; @@ -781,9 +844,9 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) sensorParam[1].stopbit = 1; sensorParam[1].parity = 0; sensorParam[1].IsNoInsta = 1; - //sensorParam[1].PowerPort = 14; - //sensorParam[1].devaddr = 1; - sensorParam[1].devaddr = 2; + sensorParam[1].devaddr = 1; + memset(sensorParam[1].pathname, 0, sizeof(sensorParam[1].pathname)); + sprintf(sensorParam[1].pathname, "/dev/ttysWK3"); sensorParam[2].SensorsType = RALLY_PROTOCOL; sensorParam[2].baudrate = 9600; @@ -796,110 +859,74 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) //sensorParam[2].PowerPort = 3; //sensorParam[2].devaddr = 13; sensorParam[2].devaddr = 13; -#if 0 - devparam[3].ProtocolIdx = PELCO_P_PROTOCOL; - devparam[3].baudrate = 9600; - devparam[3].databit = 8; - devparam[3].stopbit = 1; - devparam[3].parity = 0; - devparam[3].IsNoInsta = 0; - //devparam[3].PowerPort = 15; - devparam[3].CameraChannel = 1; - devparam[3].devaddr = 0; - - devparam[4].ProtocolIdx = WDIITEMP_PROTOCOL_NEW; - devparam[4].baudrate = 1200; - devparam[4].databit = 8; - devparam[4].stopbit = 1; - devparam[4].parity = 0; - devparam[4].IsNoInsta = 0; - //devparam[4].PowerPort = 17; - devparam[4].devaddr = 4; - - devparam[5].ProtocolIdx = RALLY_PROTOCOL_NEW; - devparam[5].baudrate = 9600; - devparam[5].databit = 8; - devparam[5].stopbit = 1; - devparam[5].parity = 0; - devparam[5].IsNoInsta = 1; - //devparam[5].PowerPort = 6; - devparam[5].devaddr = 11; - - devparam[6].ProtocolIdx = RALLY_PROTOCOL_NEW; - devparam[6].baudrate = 9600; - devparam[6].databit = 8; - devparam[6].stopbit = 1; - devparam[6].parity = 0; - devparam[6].IsNoInsta = 1; - //devparam[6].PowerPort = 6; - devparam[6].devaddr = 12; - - devparam[7].ProtocolIdx = RALLY_PROTOCOL_NEW; - devparam[7].baudrate = 9600; - devparam[7].databit = 8; - devparam[7].stopbit = 1; - devparam[7].parity = 0; - devparam[7].IsNoInsta = 1; - //devparam[7].PowerPort = 6; - devparam[7].devaddr = 10; - - devparam[8].ProtocolIdx = PELCO_P_PROTOCOL; - devparam[8].baudrate = 9600; - devparam[8].databit = 8; - devparam[8].stopbit = 1; - devparam[8].parity = 0; - devparam[8].IsNoInsta = 0; - //devparam[8].PowerPort = 10; - devparam[8].CameraChannel = 2; - devparam[8].devaddr = 0; - - devparam[9].ProtocolIdx = WDIITEMP_PROTOCOL_NEW; - devparam[9].baudrate = 9600; - devparam[9].databit = 8; - devparam[9].stopbit = 1; - devparam[9].parity = 0; - devparam[9].IsNoInsta = 1; - //devparam[9].PowerPort = 17; - devparam[9].devaddr = 47; - - devparam[10].ProtocolIdx = LCURRENT_PROTOCOL; - devparam[10].baudrate = 9600; - devparam[10].databit = 8; - devparam[10].stopbit = 1; - devparam[10].parity = 0; - devparam[10].IsNoInsta = 1; - //devparam[10].PowerPort = 5; - devparam[10].devaddr = 7; - - devparam[11].ProtocolIdx = LCURRENT_PROTOCOL; - devparam[11].baudrate = 9600; - devparam[11].databit = 8; - devparam[11].stopbit = 1; - devparam[11].parity = 0; - devparam[11].IsNoInsta = 1; - //devparam[11].PowerPort = 6; - devparam[11].devaddr = 6; - - devparam[12].ProtocolIdx = LCURRENT_PROTOCOL; - devparam[12].baudrate = 9600; - devparam[12].databit = 8; - devparam[12].stopbit = 1; - devparam[12].parity = 0; - devparam[12].IsNoInsta = 1; - //devparam[12].PowerPort = 8; - devparam[12].devaddr = 5; -#endif + memset(sensorParam[2].pathname, 0, sizeof(sensorParam[2].pathname)); + sprintf(sensorParam[2].pathname, "/dev/ttysWK1"); + + sensorParam[3].SensorsType = RALLY_PROTOCOL; + sensorParam[3].baudrate = 9600; + sensorParam[3].databit = 8; + //memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit)); + //sprintf(devparam[2].stopbit, "1"); + sensorParam[3].stopbit = 1; + sensorParam[3].parity = 0; + sensorParam[3].IsNoInsta = 1; + sensorParam[3].devaddr = 10; + memset(sensorParam[3].pathname, 0, sizeof(sensorParam[3].pathname)); + sprintf(sensorParam[3].pathname, "/dev/ttysWK1"); + + sensorParam[4].SensorsType = RALLY_PROTOCOL; + sensorParam[4].baudrate = 9600; + sensorParam[4].databit = 8; + //memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit)); + //sprintf(devparam[2].stopbit, "1"); + sensorParam[4].stopbit = 1; + sensorParam[4].parity = 0; + sensorParam[4].IsNoInsta = 1; + //sensorParam[2].PowerPort = 3; + //sensorParam[2].devaddr = 13; + sensorParam[4].devaddr = 12; + memset(sensorParam[4].pathname, 0, sizeof(sensorParam[4].pathname)); + sprintf(sensorParam[4].pathname, "/dev/ttysWK1"); + + sensorParam[6].SensorsType = SLANT_PROTOCOL; + sensorParam[6].baudrate = 9600; + sensorParam[6].databit = 8; + //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); + //sprintf(devparam[13].stopbit, "1"); + sensorParam[6].stopbit = 1; + sensorParam[6].parity = 0; + //devparam[13].PowerPort = 4; + sensorParam[6].IsNoInsta = 1; + sensorParam[6].devaddr = 2; + memset(sensorParam[6].pathname, 0, sizeof(sensorParam[6].pathname)); + sprintf(sensorParam[6].pathname, "/dev/ttysWK0"); + + + sensorParam[7].SensorsType = SLANT_PROTOCOL; + sensorParam[7].baudrate = 9600; + sensorParam[7].databit = 8; + //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); + //sprintf(devparam[13].stopbit, "1"); + sensorParam[7].stopbit = 1; + sensorParam[7].parity = 0; + //devparam[13].PowerPort = 4; + sensorParam[7].IsNoInsta = 1; + sensorParam[7].devaddr = 3; + memset(sensorParam[7].pathname, 0, sizeof(sensorParam[7].pathname)); + sprintf(sensorParam[7].pathname, "/dev/ttysWK0"); sensorParam[13].SensorsType = SLANT_PROTOCOL; sensorParam[13].baudrate = 9600; sensorParam[13].databit = 8; //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); //sprintf(devparam[13].stopbit, "1"); - sensorParam[0].stopbit = 1; + sensorParam[13].stopbit = 1; sensorParam[13].parity = 0; //devparam[13].PowerPort = 4; sensorParam[13].IsNoInsta = 1; - sensorParam[13].devaddr = 2; + sensorParam[13].devaddr = 5; + memset(sensorParam[13].pathname, 0, sizeof(sensorParam[13].pathname)); + sprintf(sensorParam[13].pathname, "/dev/ttysWK0"); #if 0 devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].baudrate = 1200; @@ -980,6 +1007,8 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) //devparam[3].PowerPort = 15; sensorParam[3].CameraChannel = 1; sensorParam[3].devaddr = 0; + memset(sensorParam[3].pathname, 0, sizeof(sensorParam[3].pathname)); + sprintf(sensorParam[3].pathname, "/dev/ttysWK0"); #endif } @@ -1056,6 +1085,7 @@ void Gm_InitSerialComm() else { sprintf(szbuf, "%s 已启用!;", szbuf); + SaveLogTofile(szbuf); LOGI("%s", szbuf); } } @@ -1230,7 +1260,7 @@ void FindDevUseSerialCommNo() case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); /* 目前还不确定//具体串口分配,暂时默认使用串口1*/ //sprintf(devparam[i].pathname, "/dev/ttyS1"); devparam[i].commid = 0; @@ -1246,7 +1276,7 @@ void FindDevUseSerialCommNo() void GM_StartSerialComm() { int i, j, commid; - char szbuf[64]; + char szbuf[64], logbuf[128]; long polltime=0; // 测试使用初始化配置 @@ -1267,8 +1297,8 @@ void GM_StartSerialComm() continue; serialport[i].Retry = 0; //serialport[i].RetryTime = 500/TIMER_CNT; - serialport[i].RetryTime = 300; - serialport[i].WaitTime = 0; + serialport[i].RetryTime = 800; + serialport[i].WaitTime = 20; serialport[i].m_iRevStatus = 0; serialport[i].m_iRecvLen = 0; serialport[i].m_iNeedRevLength = 0; @@ -1374,8 +1404,11 @@ void GM_StartSerialComm() // 打开传感器电源 // 打开对应的485电源 // 打开串口通讯 + memset(logbuf, 0 , sizeof(logbuf)); if(1 == srdt.ms_dev[i].IsNeedSerial) { + sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); + SaveLogTofile(logbuf); LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); @@ -1384,6 +1417,7 @@ void GM_StartSerialComm() } + SaveLogTofile("启动数据采样!"); LOGI("启动数据采样!"); /* 直接使用循环进行采样处理*/ polltime = get_msec(); @@ -1395,6 +1429,7 @@ void GM_StartSerialComm() if(GM_SerialTimer() < 0) { //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + SaveLogTofile("退出采样流程!"); LOGV("退出采样流程!"); sleep(15); GM_StartSerialComm(); @@ -1409,7 +1444,7 @@ void GM_StartSerialComm() void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { int i, flag=0; - char szbuf[64]; + char szbuf[128], logbuf[128]; srdt.RephotographCnt = 0; FindDevUseSerialCommNo(); @@ -1433,7 +1468,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) flag = 0; #endif i = srdt.camerauseserial; - if((i<0) ||(i > MAX_SERIAL_PORT_NUM)) + if((i<0) ||(i >= MAX_SERIAL_PORT_NUM)) return; serialport[i].Retry = 0; //serialport[i].RetryTime = 500/TIMER_CNT; @@ -1498,6 +1533,8 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) } if(1 == srdt.ms_dev[i].IsNeedSerial) { + sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); + SaveLogTofile(logbuf); LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); @@ -1507,6 +1544,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { sprintf(szbuf, "摄像机启动串口定时器!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); for(;;) { usleep(10); @@ -1516,6 +1554,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); LOGV("退出拍照流程!"); + SaveLogTofile("退出拍照流程!"); //sleep(15); //GM_StartSerialComm(); //GM_StartSerialCameraPhoto(1,0); @@ -1620,6 +1659,7 @@ void GM_IsCloseSensors() { if(srdt.ms_dev[i].IsNeedSerial == 0) continue; + memset(buf, 0, sizeof(buf)); switch(devparam[i].ProtocolIdx) { case WEATHER_PROTOCOL: /* 气象*/ @@ -1631,10 +1671,12 @@ void GM_IsCloseSensors() srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); break; } - if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 15*1000) + if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 50*1000) { srdt.ms_dev[i].IsNeedSerial = 0; // 关闭传感器电源 + sprintf(buf, "读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); + SaveLogTofile(buf); LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); for(j=0;jimage.ilen[i]; } + memset(szbuf, 0, sizeof(szbuf)); memset(filedir, 0, sizeof(filedir)); sprintf(filedir, "/sdcard/photo/"); if(access(filedir, 0)==0) - LOGI("文件路径已经存在!"); + { + sprintf(szbuf,"文件路径%s已经存在!", filedir); + SaveLogTofile(szbuf); + LOGI("%s", szbuf); + } else { status = mkdir(filedir, S_IRWXU | S_IRWXG | S_IRWXO); @@ -1798,10 +1891,15 @@ int SaveImageDataTofile(int devno) return -1; len = fwrite(image,1, pPortParam->image.imagelen, fp); fclose(fp); + free(image); + image = NULL; if(len < pPortParam->image.imagelen) return -1; else { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf,"写入图片文件%s成功!", pPortParam->image.photoname); + SaveLogTofile(szbuf); LOGI("写入图片文件%s成功!", pPortParam->image.photoname); return 1; } @@ -1928,7 +2026,7 @@ void CameraPhotoPortDataProcess( int devno) //DebugStringPrintf(szbuf, strlen(szbuf), 1); if(uDevAddr != devparam[devno].devaddr) return; - + memset(szbuf, 0, sizeof(szbuf)); switch(cmdidx) { case 0x10: /* 拍照应答*/ @@ -1938,6 +2036,8 @@ void CameraPhotoPortDataProcess( int devno) if(srdt.RephotographCnt > 2) { pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); + SaveLogTofile(szbuf); LOGE("因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); } break; @@ -1956,6 +2056,7 @@ void CameraPhotoPortDataProcess( int devno) srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); LOGV("%s", szbuf); + SaveLogTofile(szbuf); presetno = (int)rtumsg.MsgData[i+8]; pPortParam->image.presetno = presetno; pPortParam->image.state = Sample; @@ -1971,6 +2072,7 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->image.ilen[iNo-1] = packsize; sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); LOGV("%s", szbuf); + SaveLogTofile(szbuf); curserial->RevCmdFlag = 1; pPortParam->FirstCmdTimeCnt = get_msec(); if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) @@ -2025,6 +2127,7 @@ void CameraPhotoPortDataProcess( int devno) sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); LOGE("%s", szbuf); + SaveLogTofile(szbuf); if(srdt.errorPhotoNoCnt > 5) { pPortParam->SerialCmdidx = 0; @@ -2034,12 +2137,14 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); LOGE("%s", szbuf); + SaveLogTofile(szbuf); } } break; case 0x03: sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); LOGD("%s", szbuf); + SaveLogTofile(szbuf); pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; curserial->RevCmdFlag = 1; @@ -2051,6 +2156,7 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->SerialCmdidx = -1; sprintf(szbuf, "没有历史图片!结束读取图片!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); break; } i = 6; @@ -2068,6 +2174,7 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->image.presetno = presetno; sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); LOGI("%s", szbuf); + SaveLogTofile(szbuf); curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; @@ -2076,8 +2183,9 @@ void CameraPhotoPortDataProcess( int devno) if(0xFF == rtumsg.MsgData[10]) { pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "图片保存失败!"); + sprintf(szbuf, "摄像机图片保存失败!"); LOGE("%s", szbuf); + SaveLogTofile(szbuf); } pPortParam->SerialCmdidx = -1; if(0 == rtumsg.MsgData[10]) @@ -2106,12 +2214,13 @@ long lsendtime=0; **********************************************************************************/ void SendCmdFormPollCmdBuf( int port ) { - char buf[64]; + char buf[128]; int len, ret; long lctime; SIO_PARAM_SERIAL_DEF *pPortParam; pPortParam = &serialport[port]; + memset(buf, 0, sizeof(buf)); lctime = get_msec(); if(pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt) { @@ -2152,15 +2261,20 @@ void SendCmdFormPollCmdBuf( int port ) ClearCmdFormPollCmdBuf(port); } - if(pPortParam->WaitTime) + if(pPortParam->WaitTime > 0) { - pPortParam->WaitTimeCnt++; - if(pPortParam->WaitTimeCnt < pPortParam->WaitTime) + if((lctime - pPortParam->WaitTimeCnt > 30*pPortParam->WaitTime) || (lctime - pPortParam->WaitTimeCnt < 0)) + { + pPortParam->WaitTimeCnt = lctime; + return; + } + + if(lctime- pPortParam->WaitTimeCnt < pPortParam->WaitTime) { return; } } - pPortParam->WaitTimeCnt = 0; + pPortParam->WaitTimeCnt = lctime; if ( pPortParam->ReSendCmdFlag ) len = pPortParam->cmdlen; @@ -2174,6 +2288,8 @@ void SendCmdFormPollCmdBuf( int port ) serialport[devparam[srdt.curdevidx[port]].commid].m_iRecvLen = 0; // 当发送一条新指令时,清除接收状态 serialport[devparam[srdt.curdevidx[port]].commid].m_iRevStatus = 0; + if(serialport[port].fd < 0) + return; ret = Gm_SetSerialPortParam(port); if(ret < 0) return; @@ -2181,12 +2297,16 @@ void SendCmdFormPollCmdBuf( int port ) if(len < 1) { LOGE("串口%d, 发送命令失败!", port+1); + sprintf(buf, "串口%d, 发送命令失败!", port+1); + SaveLogTofile(buf); } else { sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); BytestreamLOG(buf, &pPortParam->PollCmd[2], len, 'D'); + sprintf(buf, "sendtimeconst= %ld", lctime-lsendtime); + SaveLogTofile(buf); LOGW("sendtimeconst= %ld", lctime-lsendtime); lsendtime = lctime; } @@ -2210,7 +2330,7 @@ void ClearCmdAllFlag(int commid) serialport[commid].RetryCnt = 0; serialport[commid].RetryTimeCnt = get_msec(); - serialport[commid].WaitTimeCnt = 0; + serialport[commid].WaitTimeCnt = get_msec(); serialport[commid].ForceWaitFlag = 0; serialport[commid].ForceWaitCnt = 0; serialport[commid].SendCmdFlag = 0; @@ -2245,7 +2365,7 @@ int FindNextCameraPhotoCommand(int devidx) char szbuf[128]; //如果命令缓冲区仍有命令,则退出本函数 - if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 > MAX_SERIAL_PORT_NUM)) return -1; // if(serialport[devparam[devidx].commid].cmdlen > 0) // return -1; @@ -2258,6 +2378,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); } cmdno = srdt.ms_dev[devidx].SerialCmdidx; lcurtime = get_msec(); @@ -2281,6 +2402,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return -1; } LOGE("time=%ldms", lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt); @@ -2308,6 +2430,7 @@ int FindNextCameraPhotoCommand(int devidx) default: sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return -1; @@ -2318,6 +2441,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return -1; } cmdidx = 0x03; @@ -2474,6 +2598,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return -1; } break; @@ -2573,6 +2698,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) { sprintf(szbuf, "没有找到摄像机使用的通道和串口通讯协议"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return 1; } #if 0 @@ -2587,6 +2713,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) #endif sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); LOGI("%s", szbuf); + SaveLogTofile(szbuf); //} srdt.usecameradevidx = i; // 查找串口序号 @@ -2723,6 +2850,7 @@ void Gm_SendPelco_pCommand( DWORD cmdtype) if(len < 1) { LOGE("发送Pelco_p命令失败"); + SaveLogTofile("发送Pelco_p命令失败"); } else { @@ -2775,6 +2903,7 @@ void Gm_SendPelco_DCommand( DWORD cmdtype) if(len < 1) { LOGE("发送Pelco_D命令失败"); + SaveLogTofile("发送Pelco_D命令失败"); } else { @@ -2806,30 +2935,26 @@ BYTE Gm_Pelco_DCheck( BYTE *msg, int len ) **********************************************************************************/ int FindNextShxyProtocolCommand( int devidx ) { + int cmdno = 0; + //如果命令缓冲区仍有命令,则退出本函数 - if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 > MAX_SERIAL_PORT_NUM)) return -1; - //if(srdt.ms_dev[devidx].SerialCmdidx == 0) + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) { - if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) - { - //srdt.ms_dev[devidx].FirstCmdTimeCnt++; - return -1; - } -#if 0 - if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - { - devparam[devidx].devaddr = 0xFF; - MakeShxyProtocolPollCommand(devidx, 0x02); - } - - //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) - // MakeShxyProtocolPollCommand(devidx, 0x09); - else -#endif + return -1; + } + //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + // return -1; + switch (cmdno) + { + case 0: /* 正常采集数据*/ MakeShxyProtocolPollCommand(devidx, 0x09); - srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; - return 1; + srdt.curdevidx[devparam[devidx].commid] = devidx; + return 1; + case 1: /* 测试读取地址*/ + default: + break; } return -1; } @@ -2839,11 +2964,15 @@ int FindNextShxyProtocolCommand( int devidx ) **********************************************************************************/ void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx) { - int i/*, sendWaitTime = 100, y*/; + int i, length=0; + int newaddr = 9, baud = 9600, stopbit = 1, parity=0; //char buf[128]; u_char *sendbuf; - sendbuf = serialport[srdt.ms_dev[portno].UseSerialidx].PollCmd; + sendbuf = serialport[devparam[portno].commid].PollCmd; + + /* 测试变量*/ + cmdidx =cmdidx; i = 0; sendbuf[i++] = 0x00; // 强制等待时间 @@ -2854,12 +2983,34 @@ void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx) sendbuf[i++] = 0x68; sendbuf[i++] = (BYTE)devparam[portno].devaddr; // 传感器地址 sendbuf[i++] = cmdidx; // 命令信息0x06 + switch (cmdidx) + { + case 1: /* 设置传感器新地址*/ + sendbuf[i++] = newaddr; + length = 1; + break; + case 2: /* 广播读地址*/ + sendbuf[6] = 0xFF; + break; + case 3: /* 设置串口参数*/ + sendbuf[i++] = (u_char)(baud >> 24); + sendbuf[i++] = (u_char)(baud >> 16); + sendbuf[i++] = (u_char)(baud >> 8); + sendbuf[i++] = (u_char)baud; + sendbuf[i++] = 8; + sendbuf[i++] = parity; + sendbuf[i++] = stopbit; + length = 7; + break; + default: + break; + } sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6); i+= 1; + sendbuf[3] = length; + sendbuf[4] = length; sendbuf[i++] = 0x16; // 信息尾 - serialport[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]); + serialport[devparam[portno].commid].cmdlen = i; } unsigned char CalLpc(unsigned char *msg, int len) @@ -3053,6 +3204,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; //srdt.SectimesamplingCnt[0] += 1; @@ -3065,6 +3217,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "Y =%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } if((fvalue < -59) ||(fvalue > 59)) { @@ -3098,9 +3251,7 @@ void ShxyProtocolDataProcess( int devno) *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[j+1]; } switch(curserial->m_au8RecvBuf[j]) - {slantpntmsg[aipnt][1].EuValue *= (1+frnb)slantpntmsg[aipnt][1].EuValue *= (1+frnb); - - + { case 1: /*温度*/ if((fvalue < -40) ||(fvalue > 85)) { @@ -3121,6 +3272,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "温度:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 2: /*气压*/ @@ -3142,6 +3294,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "气压:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 3: /*湿度*/ @@ -3163,6 +3316,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "湿度:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 4: /*雨量*/ @@ -3192,6 +3346,7 @@ void ShxyProtocolDataProcess( int devno) //sprintf(szbuf, "风速:%0.3f ", fwind); sprintf(szbuf, "风速:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 7: /*风向*/ @@ -3213,25 +3368,10 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "风向:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 8: /*拉力*/ -#if 0 - if(RESERVE1_PROTOCOL == pPortParam->ProtocolIdx) - { - leirallypntmsg[0].EuValue = fvalue*leirallypntmsg[0].AiParam.fFactor\ - +leirallypntmsg[0].AiParam.EuValueDelta; - leirallypntmsg[0].AiState = 1; - g_SelfTest.SensorsFault |= (0x800000); - if ((gDisSunRain & 0x10) == 0x10) - { - sprintf(szbuf, "地址%d模拟导线拉力:%0.3fKg ", pPortParam->devaddr, fvalue/1000.0); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - } - } - else - { -#endif pPortParam->recvdatacnt++; if(pPortParam->recvdatacnt < 2) break; @@ -3244,6 +3384,7 @@ void ShxyProtocolDataProcess( int devno) //rallypntmsg[aipnt][0].AiState = 1; sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); //} break; case 9: /*倾角传感器X轴倾角*/ @@ -3264,10 +3405,12 @@ void ShxyProtocolDataProcess( int devno) //slantpntmsg[aipnt][0].AiState = 1; sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); break; case 10: /*倾角传感器Y轴倾角*/ sprintf(szbuf, "Y =%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); if((fvalue < -59) ||(fvalue > 59)) { @@ -3282,130 +3425,6 @@ void ShxyProtocolDataProcess( int devno) pPortParam->aiValue[1].AiState = Sample; //slantpntmsg[aipnt][1].AiState = 1; break; -#if 0 - case 11: /*测温球导线温度*/ - - fcorvalue = WireTemperatureCorrection(fvalue/100, (WORD)pPortParam->devaddr); - - wdiitemppntmsg[aipnt][0].EuValue = fvalue*wdiitemppntmsg[aipnt][0].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta; -//#else - wdiitemppntmsg[aipnt][0].EuValue = fcorvalue*100*wdiitemppntmsg[aipnt][0].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta; - - wdiitemppntmsg[aipnt][0].AiState = 1; - g_SelfTest.SensorsFault |= (0x100000); - sprintf(szbuf, "地址%d导线温度:%0.3f ", pPortParam->devaddr, fcorvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 12: /*测温球内部温度*/ - wdiitemppntmsg[aipnt][1].EuValue = fvalue*wdiitemppntmsg[aipnt][1].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][1].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][1].AiState = 1; - sprintf(szbuf, "地址%d内部温度:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 13: /*测温球导线X轴倾角*/ - wdiitemppntmsg[aipnt][3].EuValue = fvalue*wdiitemppntmsg[aipnt][3].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][3].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][3].AiState = 1; - sprintf(szbuf, "地址%d导线X轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 14: /*测温球导线Y轴倾角*/ - wdiitemppntmsg[aipnt][4].EuValue = fvalue*wdiitemppntmsg[aipnt][4].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][4].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][4].AiState = 1; - sprintf(szbuf, "地址%d导线Y轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 15: /*测温球导线电流*/ - wdiitemppntmsg[aipnt][5].EuValue = fvalue*wdiitemppntmsg[aipnt][5].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][5].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][5].AiState = 1; - sprintf(szbuf, "地址%d导线电流:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 16: /*测温球电池电压*/ - wdiitemppntmsg[aipnt][2].EuValue = fvalue*wdiitemppntmsg[aipnt][2].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][2].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][2].AiState = 1; - sprintf(szbuf, "地址%d测温球电池电压:%0.3fV ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 17: /*A相泄漏电流平均值;*/ - LCpntmsg[0].EuValue = fvalue*LCpntmsg[0].AiParam.fFactor + LCpntmsg[0].AiParam.EuValueDelta; - LCpntmsg[0].AiState = 1; - sprintf(szbuf, "A相泄漏电流平均值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 18: /*A相泄漏电流最大值;*/ - LCpntmsg[1].EuValue = fvalue*LCpntmsg[1].AiParam.fFactor + LCpntmsg[1].AiParam.EuValueDelta; - LCpntmsg[1].AiState = 1; - sprintf(szbuf, "A相泄漏电流最大值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 19: /*A相超过3mA的脉冲频次*/ - LCpntmsg[2].EuValue = fvalue*LCpntmsg[2].AiParam.fFactor + LCpntmsg[2].AiParam.EuValueDelta; - LCpntmsg[2].AiState = 1; - sprintf(szbuf, "A相超过3mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 20: /*A相超过10mA的脉冲频次*/ - LCpntmsg[3].EuValue = fvalue*LCpntmsg[3].AiParam.fFactor + LCpntmsg[3].AiParam.EuValueDelta; - LCpntmsg[3].AiState = 1; - sprintf(szbuf, "A相超过10mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 21: /*B相泄漏电流平均值;*/ - LCpntmsg[4].EuValue = fvalue*LCpntmsg[4].AiParam.fFactor + LCpntmsg[4].AiParam.EuValueDelta; - LCpntmsg[4].AiState = 1; - sprintf(szbuf, "B相泄漏电流平均值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 22: /*B相泄漏电流最大值;*/ - LCpntmsg[5].EuValue = fvalue*LCpntmsg[5].AiParam.fFactor + LCpntmsg[5].AiParam.EuValueDelta; - LCpntmsg[5].AiState = 1; - sprintf(szbuf, "B相泄漏电流最大值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 23: /*B相超过3mA的脉冲频次*/ - LCpntmsg[6].EuValue = fvalue*LCpntmsg[6].AiParam.fFactor + LCpntmsg[6].AiParam.EuValueDelta; - LCpntmsg[6].AiState = 1; - sprintf(szbuf, "B相超过3mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 24: /*B相超过10mA的脉冲频次*/ - LCpntmsg[7].EuValue = fvalue*LCpntmsg[7].AiParam.fFactor + LCpntmsg[7].AiParam.EuValueDelta; - LCpntmsg[7].AiState = 1; - sprintf(szbuf, "B相超过10mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 25: /*C相泄漏电流平均值;*/ - LCpntmsg[8].EuValue = fvalue*LCpntmsg[8].AiParam.fFactor + LCpntmsg[8].AiParam.EuValueDelta; - LCpntmsg[8].AiState = 1; - sprintf(szbuf, "C相泄漏电流平均值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 26: /*C相泄漏电流最大值;*/ - LCpntmsg[9].EuValue = fvalue*LCpntmsg[9].AiParam.fFactor + LCpntmsg[9].AiParam.EuValueDelta; - LCpntmsg[9].AiState = 1; - sprintf(szbuf, "C相泄漏电流最大值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 27: /*C相超过3mA的脉冲频次*/ - LCpntmsg[10].EuValue = fvalue*LCpntmsg[10].AiParam.fFactor + LCpntmsg[10].AiParam.EuValueDelta; - LCpntmsg[10].AiState = 1; - sprintf(szbuf, "C相超过3mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 28: /*C相超过10mA的脉冲频次*/ - LCpntmsg[11].EuValue = fvalue*LCpntmsg[11].AiParam.fFactor + LCpntmsg[11].AiParam.EuValueDelta; - LCpntmsg[11].AiState = 1; - sprintf(szbuf, "C相超过10mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; -#endif } } @@ -3504,7 +3523,7 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam) memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); memmove(devparam[i].pathname, sensorParam[i].pathname, sizeof(devparam[i].pathname)); devparam[i].databit = sensorParam[i].databit; - devparam[i].stopbit = (int)sensorParam[i].stopbit*10; + devparam[i].stopbit = (int)(sensorParam[i].stopbit*10); devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; } @@ -3526,9 +3545,11 @@ void CameraPhotoCmd(SENSOR_PARAM *sensorParam, u_char channel, int cmdidx, u_cha //baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].databit = sensorParam[i].databit; - devparam[i].stopbit = (int)sensorParam[i].stopbit*10; + devparam[i].stopbit = (int)(sensorParam[i].stopbit*10); devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; + memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + memmove(devparam[i].pathname, sensorParam[i].pathname, sizeof(devparam[i].pathname)); } #if 0 FindDevUseSerialCommNo(); diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.h b/TestComm/app/src/main/cpp/SensorsProtocol.h index f534e80f..5c9d84f8 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.h +++ b/TestComm/app/src/main/cpp/SensorsProtocol.h @@ -36,7 +36,7 @@ typedef unsigned char BYTE; #define IOT_PARAM_READ 0xAF #define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ -#define MAX_SERIAL_PORT_NUM 3 +#define MAX_SERIAL_PORT_NUM 5 #define MAX_DEV_VALUE_NUM 12 /* 一台装置最大的采样值数量*/ #define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ @@ -130,7 +130,7 @@ typedef unsigned char BYTE; #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/ -#define COLLECT_DATA 0 /* 调试使用*/ +#define COLLECT_DATA 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) /* 草绿色*/ @@ -372,7 +372,7 @@ void Gm_OpenSerialPort(int devidx); // 关闭串口通讯 void Gm_CloseSerialPort(); - +int SaveLogTofile(char *szbuf); // 功能说明:串口发送数据 返回实际发送的字节数 int GM_SerialComSend(const unsigned char * cSendBuf, unsigned long nSendLen, int commid); void Gm_InitSerialComm(); diff --git a/TestComm/app/src/main/cpp/WeatherComm.cpp b/TestComm/app/src/main/cpp/WeatherComm.cpp index b73168db..62f8dab7 100644 --- a/TestComm/app/src/main/cpp/WeatherComm.cpp +++ b/TestComm/app/src/main/cpp/WeatherComm.cpp @@ -575,7 +575,7 @@ int serial_port_comm() #if 1 memset(portparm.pathname, 0, sizeof(portparm.pathname)); //sprintf(portparm.pathname, "/dev/ttyS1"); - sprintf(portparm.pathname, "/dev/ttysWK3"); + sprintf(portparm.pathname, "/dev/ttysWK0"); portparm.parity = 'N'; portparm.databit = 8; portparm.baudrate = B9600; diff --git a/TestComm/app/src/main/cpp/native-lib.cpp b/TestComm/app/src/main/cpp/native-lib.cpp index 78937587..0c61b9db 100644 --- a/TestComm/app/src/main/cpp/native-lib.cpp +++ b/TestComm/app/src/main/cpp/native-lib.cpp @@ -18,9 +18,9 @@ #include #include #include "GPIOControl.h" -//#include "serialComm.h" -//#include "SensorsProtocol.h" -#include "WeatherComm.h" +#include "serialComm.h" +#include "SensorsProtocol.h" +//#include "WeatherComm.h" #if 0 #define BYTE u_char; @@ -662,9 +662,9 @@ Java_com_xinyingpower_testcomm_MainActivity_testSpi( //setRS485Enable(true); //set12VEnable(true); - serial_port_comm(); + //serial_port_comm(); //GM_StartSerialComm(); - //Gm_InitSerialComm(); + Gm_InitSerialComm(); //GM_StartSerialCameraPhoto(1, 0); //lxy modify modify //LOGE("_test_ setRS485Enable false"); diff --git a/TestComm/app/src/main/cpp/serialComm.h b/TestComm/app/src/main/cpp/serialComm.h index 8321a31b..a8825221 100644 --- a/TestComm/app/src/main/cpp/serialComm.h +++ b/TestComm/app/src/main/cpp/serialComm.h @@ -12,7 +12,7 @@ #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 LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) int set_port_attr (int fd, unsigned int baudrate, int databit, const int stopbit, char parity, int vtime, int vmin ); diff --git a/app/src/main/cpp/GPIOControl.cpp b/app/src/main/cpp/GPIOControl.cpp index 187f7e33..783025af 100644 --- a/app/src/main/cpp/GPIOControl.cpp +++ b/app/src/main/cpp/GPIOControl.cpp @@ -31,6 +31,16 @@ typedef struct char str[MAX_STRING_LEN]; }IOT_PARAM; +typedef struct{ + float airtemp; /* 空气温度*/ + float RH; /* 相对湿度*/ + float atmos; /* 大气压*/ + float windspeed; /* 风速*/ + float winddirection; /* 风向*/ + float rainfall; /* 雨量*/ + float sunshine; /* 日照*/ +}Weather; + void GpioControl::setInt(int cmd, int value) { int fd = open("/dev/mtkgpioctrl", O_RDONLY); diff --git a/app/src/main/cpp/GPIOControl.h b/app/src/main/cpp/GPIOControl.h index 54a46177..70339636 100644 --- a/app/src/main/cpp/GPIOControl.h +++ b/app/src/main/cpp/GPIOControl.h @@ -36,6 +36,17 @@ #define CMD_SET_CAM_3V3_EN_STATE 132 #define CMD_SET_12V_EN_STATE 133 #define CMD_SET_SYSTEM_RESET 202 +#define CMD_SET_WTH_POWER 490 +#define CMD_SET_PULL_POWER 491 +#define CMD_SET_ANGLE_POWER 492 +#define CMD_SET_OTHER_POWER 493 +#define CMD_SET_PIC1_POWER 494 +#define CMD_SET_485_en0 301 +#define CMD_SET_485_en1 302 +#define CMD_SET_485_en2 303 +#define CMD_SET_485_en3 304 +#define CMD_SET_485_en4 305 + class GpioControl { diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index a04db0eb..466c4d52 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -577,6 +577,27 @@ void Gm_CloseSensorsPower() setCam3V3Enable(false); setRS485Enable(false); +#if 0 + setInt(CMD_SET_WTH_POWER, 0); + setInt(CMD_SET_PULL_POWER, 0); + setInt(CMD_SET_ANGLE_POWER, 0); + setInt(CMD_SET_OTHER_POWER, 0); + setInt(CMD_SET_PIC1_POWER, 0); +#endif +#if 1 + setInt(CMD_SET_485_en0, 1); + setInt(CMD_SET_485_en1, 1); + setInt(CMD_SET_485_en2, 1); + setInt(CMD_SET_485_en3, 1); + setInt(CMD_SET_485_en4, 1); +#else + setInt(CMD_SET_485_en0, 0); + setInt(CMD_SET_485_en1, 0); + setInt(CMD_SET_485_en2, 0); + setInt(CMD_SET_485_en3, 0); + setInt(CMD_SET_485_en4, 0); +#endif + } // 打开传感器电源 @@ -589,10 +610,38 @@ void Gm_OpenSensorsPower() // return; //sprintf(szbuf, "Open Sensors port %d Power!", port); - set12VEnable(true); + //set12VEnable(true); setCam3V3Enable(true); setRS485Enable(true); +#if 0 + setInt(CMD_SET_WTH_POWER, 0); + setInt(CMD_SET_PULL_POWER, 0); + setInt(CMD_SET_ANGLE_POWER, 0); + setInt(CMD_SET_OTHER_POWER, 0); + setInt(CMD_SET_PIC1_POWER, 0); +#else + setInt(CMD_SET_WTH_POWER, 1); + setInt(CMD_SET_PULL_POWER, 1); + setInt(CMD_SET_ANGLE_POWER, 1); + setInt(CMD_SET_OTHER_POWER, 1); + setInt(CMD_SET_PIC1_POWER, 1); +#endif +#if 1 + setInt(CMD_SET_SPI_POWER, 1); + setInt(CMD_SET_485_en0, 1); + setInt(CMD_SET_485_en1, 1); + setInt(CMD_SET_485_en2, 1); + setInt(CMD_SET_485_en3, 1); + setInt(CMD_SET_485_en4, 1); +#else + setInt(CMD_SET_485_en0, 0); + setInt(CMD_SET_485_en1, 0); + setInt(CMD_SET_485_en2, 0); + setInt(CMD_SET_485_en3, 0); + setInt(CMD_SET_485_en4, 0); +#endif + /* 打开电源*/ //switch(port) @@ -623,6 +672,7 @@ void BytestreamLOG(char* describe, u_char* buf, int len, char flag) { sprintf(szbuf, "%s %02X", szbuf, buf[i]); } + SaveLogTofile(szbuf); switch (flag) { case 'E': @@ -650,22 +700,30 @@ void BytestreamLOG(char* describe, u_char* buf, int len, char flag) void Gm_OpenSerialPort(int devidx) { int fd = -1; + char szbuf[512]; if((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM)) return; + memset(szbuf, 0, sizeof(szbuf)); if(serialport[devparam[devidx].commid].fd <= 0) { 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); + sprintf(szbuf, "装置%d 打开串口%d失败!fd=%d", devidx+1, devparam[devidx].commid+1, fd); + SaveLogTofile(szbuf); + LOGE("装置%d 打开串口%d失败!fd=%d", devidx+1, devparam[devidx].commid+1, fd); return; } - LOGI("装置%d 打开串口%d成功!fd=%d\n", devidx+1, devparam[devidx].commid+1, fd); + sprintf(szbuf, "装置%d 打开串口%d成功!fd=%d", devidx+1, devparam[devidx].commid+1, fd ); + SaveLogTofile(szbuf); + LOGI("装置%d 打开串口%d成功!fd=%d", 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); + sprintf(szbuf, "装置%d 串口%d已经打开!fd=%d", devidx+1, devparam[devidx].commid+1, serialport[devparam[devidx].commid].fd); + SaveLogTofile(szbuf); + LOGI("装置%d 串口%d已经打开!fd=%d", devidx+1, devparam[devidx].commid+1, serialport[devparam[devidx].commid].fd); } // 关闭串口通讯 @@ -703,7 +761,8 @@ int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commi //isendtime = get_msec(); if (len < 0) { - LOGE("write data error \n"); + LOGE("write data error "); + SaveLogTofile("write data error "); return -1; } else if(len > 0) @@ -718,12 +777,16 @@ int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commi int Gm_SetSerialPortParam(int commid) { int ret; + char szbuf[128]; SERIAL_PARAM *pPortParam=NULL; pPortParam = &devparam[srdt.curdevidx[commid]]; ret= set_port_attr (serialport[commid].fd, pPortParam->baudrate,pPortParam->databit,pPortParam->stopbit,pPortParam->parity,0,0 );/*9600 8n1 */ if(ret < 0) { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf,"串口%d 波特率等参数设置错误!", commid+1); + SaveLogTofile(szbuf); LOGE("串口%d 波特率等参数设置错误!", commid+1); return -1; } @@ -768,10 +831,10 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) //sprintf(devparam[0].stopbit, "1"); sensorParam[0].stopbit = 1; sensorParam[0].parity = 'n'; - sensorParam[0].IsNoInsta = 1; - //devparam[0].PowerPort = 2; - //devparam[0].devaddr = 4; - sensorParam[0].devaddr = 10; + sensorParam[0].IsNoInsta = 0; + sensorParam[0].devaddr = 4; + memset(sensorParam[0].pathname, 0, sizeof(sensorParam[0].pathname)); + sprintf(sensorParam[0].pathname, "/dev/ttysWK3"); sensorParam[1].SensorsType = WEATHER_PROTOCOL; sensorParam[1].baudrate = 9600; @@ -781,9 +844,9 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) sensorParam[1].stopbit = 1; sensorParam[1].parity = 0; sensorParam[1].IsNoInsta = 1; - //sensorParam[1].PowerPort = 14; - //sensorParam[1].devaddr = 1; - sensorParam[1].devaddr = 2; + sensorParam[1].devaddr = 1; + memset(sensorParam[1].pathname, 0, sizeof(sensorParam[1].pathname)); + sprintf(sensorParam[1].pathname, "/dev/ttysWK3"); sensorParam[2].SensorsType = RALLY_PROTOCOL; sensorParam[2].baudrate = 9600; @@ -796,110 +859,74 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) //sensorParam[2].PowerPort = 3; //sensorParam[2].devaddr = 13; sensorParam[2].devaddr = 13; -#if 0 - devparam[3].ProtocolIdx = PELCO_P_PROTOCOL; - devparam[3].baudrate = 9600; - devparam[3].databit = 8; - devparam[3].stopbit = 1; - devparam[3].parity = 0; - devparam[3].IsNoInsta = 0; - //devparam[3].PowerPort = 15; - devparam[3].CameraChannel = 1; - devparam[3].devaddr = 0; - - devparam[4].ProtocolIdx = WDIITEMP_PROTOCOL_NEW; - devparam[4].baudrate = 1200; - devparam[4].databit = 8; - devparam[4].stopbit = 1; - devparam[4].parity = 0; - devparam[4].IsNoInsta = 0; - //devparam[4].PowerPort = 17; - devparam[4].devaddr = 4; - - devparam[5].ProtocolIdx = RALLY_PROTOCOL_NEW; - devparam[5].baudrate = 9600; - devparam[5].databit = 8; - devparam[5].stopbit = 1; - devparam[5].parity = 0; - devparam[5].IsNoInsta = 1; - //devparam[5].PowerPort = 6; - devparam[5].devaddr = 11; - - devparam[6].ProtocolIdx = RALLY_PROTOCOL_NEW; - devparam[6].baudrate = 9600; - devparam[6].databit = 8; - devparam[6].stopbit = 1; - devparam[6].parity = 0; - devparam[6].IsNoInsta = 1; - //devparam[6].PowerPort = 6; - devparam[6].devaddr = 12; - - devparam[7].ProtocolIdx = RALLY_PROTOCOL_NEW; - devparam[7].baudrate = 9600; - devparam[7].databit = 8; - devparam[7].stopbit = 1; - devparam[7].parity = 0; - devparam[7].IsNoInsta = 1; - //devparam[7].PowerPort = 6; - devparam[7].devaddr = 10; - - devparam[8].ProtocolIdx = PELCO_P_PROTOCOL; - devparam[8].baudrate = 9600; - devparam[8].databit = 8; - devparam[8].stopbit = 1; - devparam[8].parity = 0; - devparam[8].IsNoInsta = 0; - //devparam[8].PowerPort = 10; - devparam[8].CameraChannel = 2; - devparam[8].devaddr = 0; - - devparam[9].ProtocolIdx = WDIITEMP_PROTOCOL_NEW; - devparam[9].baudrate = 9600; - devparam[9].databit = 8; - devparam[9].stopbit = 1; - devparam[9].parity = 0; - devparam[9].IsNoInsta = 1; - //devparam[9].PowerPort = 17; - devparam[9].devaddr = 47; - - devparam[10].ProtocolIdx = LCURRENT_PROTOCOL; - devparam[10].baudrate = 9600; - devparam[10].databit = 8; - devparam[10].stopbit = 1; - devparam[10].parity = 0; - devparam[10].IsNoInsta = 1; - //devparam[10].PowerPort = 5; - devparam[10].devaddr = 7; - - devparam[11].ProtocolIdx = LCURRENT_PROTOCOL; - devparam[11].baudrate = 9600; - devparam[11].databit = 8; - devparam[11].stopbit = 1; - devparam[11].parity = 0; - devparam[11].IsNoInsta = 1; - //devparam[11].PowerPort = 6; - devparam[11].devaddr = 6; - - devparam[12].ProtocolIdx = LCURRENT_PROTOCOL; - devparam[12].baudrate = 9600; - devparam[12].databit = 8; - devparam[12].stopbit = 1; - devparam[12].parity = 0; - devparam[12].IsNoInsta = 1; - //devparam[12].PowerPort = 8; - devparam[12].devaddr = 5; -#endif + memset(sensorParam[2].pathname, 0, sizeof(sensorParam[2].pathname)); + sprintf(sensorParam[2].pathname, "/dev/ttysWK1"); + + sensorParam[3].SensorsType = RALLY_PROTOCOL; + sensorParam[3].baudrate = 9600; + sensorParam[3].databit = 8; + //memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit)); + //sprintf(devparam[2].stopbit, "1"); + sensorParam[3].stopbit = 1; + sensorParam[3].parity = 0; + sensorParam[3].IsNoInsta = 1; + sensorParam[3].devaddr = 10; + memset(sensorParam[3].pathname, 0, sizeof(sensorParam[3].pathname)); + sprintf(sensorParam[3].pathname, "/dev/ttysWK1"); + + sensorParam[4].SensorsType = RALLY_PROTOCOL; + sensorParam[4].baudrate = 9600; + sensorParam[4].databit = 8; + //memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit)); + //sprintf(devparam[2].stopbit, "1"); + sensorParam[4].stopbit = 1; + sensorParam[4].parity = 0; + sensorParam[4].IsNoInsta = 1; + //sensorParam[2].PowerPort = 3; + //sensorParam[2].devaddr = 13; + sensorParam[4].devaddr = 12; + memset(sensorParam[4].pathname, 0, sizeof(sensorParam[4].pathname)); + sprintf(sensorParam[4].pathname, "/dev/ttysWK1"); + + sensorParam[6].SensorsType = SLANT_PROTOCOL; + sensorParam[6].baudrate = 9600; + sensorParam[6].databit = 8; + //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); + //sprintf(devparam[13].stopbit, "1"); + sensorParam[6].stopbit = 1; + sensorParam[6].parity = 0; + //devparam[13].PowerPort = 4; + sensorParam[6].IsNoInsta = 1; + sensorParam[6].devaddr = 2; + memset(sensorParam[6].pathname, 0, sizeof(sensorParam[6].pathname)); + sprintf(sensorParam[6].pathname, "/dev/ttysWK0"); + + + sensorParam[7].SensorsType = SLANT_PROTOCOL; + sensorParam[7].baudrate = 9600; + sensorParam[7].databit = 8; + //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); + //sprintf(devparam[13].stopbit, "1"); + sensorParam[7].stopbit = 1; + sensorParam[7].parity = 0; + //devparam[13].PowerPort = 4; + sensorParam[7].IsNoInsta = 1; + sensorParam[7].devaddr = 3; + memset(sensorParam[7].pathname, 0, sizeof(sensorParam[7].pathname)); + sprintf(sensorParam[7].pathname, "/dev/ttysWK0"); sensorParam[13].SensorsType = SLANT_PROTOCOL; sensorParam[13].baudrate = 9600; sensorParam[13].databit = 8; //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); //sprintf(devparam[13].stopbit, "1"); - sensorParam[0].stopbit = 1; + sensorParam[13].stopbit = 1; sensorParam[13].parity = 0; //devparam[13].PowerPort = 4; sensorParam[13].IsNoInsta = 1; - sensorParam[13].devaddr = 2; + sensorParam[13].devaddr = 5; + memset(sensorParam[13].pathname, 0, sizeof(sensorParam[13].pathname)); + sprintf(sensorParam[13].pathname, "/dev/ttysWK0"); #if 0 devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].baudrate = 1200; @@ -980,6 +1007,8 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam) //devparam[3].PowerPort = 15; sensorParam[3].CameraChannel = 1; sensorParam[3].devaddr = 0; + memset(sensorParam[3].pathname, 0, sizeof(sensorParam[3].pathname)); + sprintf(sensorParam[3].pathname, "/dev/ttysWK0"); #endif } @@ -1056,6 +1085,7 @@ void Gm_InitSerialComm() else { sprintf(szbuf, "%s 已启用!;", szbuf); + SaveLogTofile(szbuf); LOGI("%s", szbuf); } } @@ -1230,7 +1260,7 @@ void FindDevUseSerialCommNo() case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); /* 目前还不确定//具体串口分配,暂时默认使用串口1*/ //sprintf(devparam[i].pathname, "/dev/ttyS1"); devparam[i].commid = 0; @@ -1246,7 +1276,7 @@ void FindDevUseSerialCommNo() void GM_StartSerialComm() { int i, j, commid; - char szbuf[64]; + char szbuf[64], logbuf[128]; long polltime=0; // 测试使用初始化配置 @@ -1267,8 +1297,8 @@ void GM_StartSerialComm() continue; serialport[i].Retry = 0; //serialport[i].RetryTime = 500/TIMER_CNT; - serialport[i].RetryTime = 300; - serialport[i].WaitTime = 0; + serialport[i].RetryTime = 800; + serialport[i].WaitTime = 20; serialport[i].m_iRevStatus = 0; serialport[i].m_iRecvLen = 0; serialport[i].m_iNeedRevLength = 0; @@ -1374,8 +1404,11 @@ void GM_StartSerialComm() // 打开传感器电源 // 打开对应的485电源 // 打开串口通讯 + memset(logbuf, 0 , sizeof(logbuf)); if(1 == srdt.ms_dev[i].IsNeedSerial) { + sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); + SaveLogTofile(logbuf); LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); @@ -1384,6 +1417,7 @@ void GM_StartSerialComm() } + SaveLogTofile("启动数据采样!"); LOGI("启动数据采样!"); /* 直接使用循环进行采样处理*/ polltime = get_msec(); @@ -1395,6 +1429,7 @@ void GM_StartSerialComm() if(GM_SerialTimer() < 0) { //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); + SaveLogTofile("退出采样流程!"); LOGV("退出采样流程!"); sleep(15); GM_StartSerialComm(); @@ -1409,7 +1444,7 @@ void GM_StartSerialComm() void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { int i, flag=0; - char szbuf[64]; + char szbuf[128], logbuf[128]; srdt.RephotographCnt = 0; FindDevUseSerialCommNo(); @@ -1433,7 +1468,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) flag = 0; #endif i = srdt.camerauseserial; - if((i<0) ||(i > MAX_SERIAL_PORT_NUM)) + if((i<0) ||(i >= MAX_SERIAL_PORT_NUM)) return; serialport[i].Retry = 0; //serialport[i].RetryTime = 500/TIMER_CNT; @@ -1498,6 +1533,8 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) } if(1 == srdt.ms_dev[i].IsNeedSerial) { + sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); + SaveLogTofile(logbuf); LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf); Gm_OpenSensorsPower(); Gm_OpenSerialPort(i); @@ -1507,6 +1544,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { sprintf(szbuf, "摄像机启动串口定时器!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); for(;;) { usleep(10); @@ -1516,6 +1554,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx) { //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); LOGV("退出拍照流程!"); + SaveLogTofile("退出拍照流程!"); //sleep(15); //GM_StartSerialComm(); //GM_StartSerialCameraPhoto(1,0); @@ -1620,6 +1659,7 @@ void GM_IsCloseSensors() { if(srdt.ms_dev[i].IsNeedSerial == 0) continue; + memset(buf, 0, sizeof(buf)); switch(devparam[i].ProtocolIdx) { case WEATHER_PROTOCOL: /* 气象*/ @@ -1631,10 +1671,12 @@ void GM_IsCloseSensors() srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); break; } - if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 15*1000) + if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 50*1000) { srdt.ms_dev[i].IsNeedSerial = 0; // 关闭传感器电源 + sprintf(buf, "读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); + SaveLogTofile(buf); LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); for(j=0;jimage.ilen[i]; } + memset(szbuf, 0, sizeof(szbuf)); memset(filedir, 0, sizeof(filedir)); sprintf(filedir, "/sdcard/photo/"); if(access(filedir, 0)==0) - LOGI("文件路径已经存在!"); + { + sprintf(szbuf,"文件路径%s已经存在!", filedir); + SaveLogTofile(szbuf); + LOGI("%s", szbuf); + } else { status = mkdir(filedir, S_IRWXU | S_IRWXG | S_IRWXO); @@ -1798,10 +1891,15 @@ int SaveImageDataTofile(int devno) return -1; len = fwrite(image,1, pPortParam->image.imagelen, fp); fclose(fp); + free(image); + image = NULL; if(len < pPortParam->image.imagelen) return -1; else { + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf,"写入图片文件%s成功!", pPortParam->image.photoname); + SaveLogTofile(szbuf); LOGI("写入图片文件%s成功!", pPortParam->image.photoname); return 1; } @@ -1928,7 +2026,7 @@ void CameraPhotoPortDataProcess( int devno) //DebugStringPrintf(szbuf, strlen(szbuf), 1); if(uDevAddr != devparam[devno].devaddr) return; - + memset(szbuf, 0, sizeof(szbuf)); switch(cmdidx) { case 0x10: /* 拍照应答*/ @@ -1938,6 +2036,8 @@ void CameraPhotoPortDataProcess( int devno) if(srdt.RephotographCnt > 2) { pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); + SaveLogTofile(szbuf); LOGE("因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); } break; @@ -1956,6 +2056,7 @@ void CameraPhotoPortDataProcess( int devno) srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); LOGV("%s", szbuf); + SaveLogTofile(szbuf); presetno = (int)rtumsg.MsgData[i+8]; pPortParam->image.presetno = presetno; pPortParam->image.state = Sample; @@ -1971,6 +2072,7 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->image.ilen[iNo-1] = packsize; sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); LOGV("%s", szbuf); + SaveLogTofile(szbuf); curserial->RevCmdFlag = 1; pPortParam->FirstCmdTimeCnt = get_msec(); if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) @@ -2025,6 +2127,7 @@ void CameraPhotoPortDataProcess( int devno) sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); LOGE("%s", szbuf); + SaveLogTofile(szbuf); if(srdt.errorPhotoNoCnt > 5) { pPortParam->SerialCmdidx = 0; @@ -2034,12 +2137,14 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->SerialCmdidx = -1; sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); LOGE("%s", szbuf); + SaveLogTofile(szbuf); } } break; case 0x03: sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); LOGD("%s", szbuf); + SaveLogTofile(szbuf); pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; curserial->RevCmdFlag = 1; @@ -2051,6 +2156,7 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->SerialCmdidx = -1; sprintf(szbuf, "没有历史图片!结束读取图片!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); break; } i = 6; @@ -2068,6 +2174,7 @@ void CameraPhotoPortDataProcess( int devno) pPortParam->image.presetno = presetno; sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]); LOGI("%s", szbuf); + SaveLogTofile(szbuf); curserial->RevCmdFlag = 1; pPortParam->SerialCmdidx = 1; srdt.sendphotocmdcnt = 0; @@ -2076,8 +2183,9 @@ void CameraPhotoPortDataProcess( int devno) if(0xFF == rtumsg.MsgData[10]) { pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "图片保存失败!"); + sprintf(szbuf, "摄像机图片保存失败!"); LOGE("%s", szbuf); + SaveLogTofile(szbuf); } pPortParam->SerialCmdidx = -1; if(0 == rtumsg.MsgData[10]) @@ -2106,12 +2214,13 @@ long lsendtime=0; **********************************************************************************/ void SendCmdFormPollCmdBuf( int port ) { - char buf[64]; + char buf[128]; int len, ret; long lctime; SIO_PARAM_SERIAL_DEF *pPortParam; pPortParam = &serialport[port]; + memset(buf, 0, sizeof(buf)); lctime = get_msec(); if(pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt) { @@ -2152,15 +2261,20 @@ void SendCmdFormPollCmdBuf( int port ) ClearCmdFormPollCmdBuf(port); } - if(pPortParam->WaitTime) + if(pPortParam->WaitTime > 0) { - pPortParam->WaitTimeCnt++; - if(pPortParam->WaitTimeCnt < pPortParam->WaitTime) + if((lctime - pPortParam->WaitTimeCnt > 30*pPortParam->WaitTime) || (lctime - pPortParam->WaitTimeCnt < 0)) + { + pPortParam->WaitTimeCnt = lctime; + return; + } + + if(lctime- pPortParam->WaitTimeCnt < pPortParam->WaitTime) { return; } } - pPortParam->WaitTimeCnt = 0; + pPortParam->WaitTimeCnt = lctime; if ( pPortParam->ReSendCmdFlag ) len = pPortParam->cmdlen; @@ -2174,6 +2288,8 @@ void SendCmdFormPollCmdBuf( int port ) serialport[devparam[srdt.curdevidx[port]].commid].m_iRecvLen = 0; // 当发送一条新指令时,清除接收状态 serialport[devparam[srdt.curdevidx[port]].commid].m_iRevStatus = 0; + if(serialport[port].fd < 0) + return; ret = Gm_SetSerialPortParam(port); if(ret < 0) return; @@ -2181,12 +2297,16 @@ void SendCmdFormPollCmdBuf( int port ) if(len < 1) { LOGE("串口%d, 发送命令失败!", port+1); + sprintf(buf, "串口%d, 发送命令失败!", port+1); + SaveLogTofile(buf); } else { sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); BytestreamLOG(buf, &pPortParam->PollCmd[2], len, 'D'); + sprintf(buf, "sendtimeconst= %ld", lctime-lsendtime); + SaveLogTofile(buf); LOGW("sendtimeconst= %ld", lctime-lsendtime); lsendtime = lctime; } @@ -2210,7 +2330,7 @@ void ClearCmdAllFlag(int commid) serialport[commid].RetryCnt = 0; serialport[commid].RetryTimeCnt = get_msec(); - serialport[commid].WaitTimeCnt = 0; + serialport[commid].WaitTimeCnt = get_msec(); serialport[commid].ForceWaitFlag = 0; serialport[commid].ForceWaitCnt = 0; serialport[commid].SendCmdFlag = 0; @@ -2245,7 +2365,7 @@ int FindNextCameraPhotoCommand(int devidx) char szbuf[128]; //如果命令缓冲区仍有命令,则退出本函数 - if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 > MAX_SERIAL_PORT_NUM)) return -1; // if(serialport[devparam[devidx].commid].cmdlen > 0) // return -1; @@ -2258,6 +2378,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); } cmdno = srdt.ms_dev[devidx].SerialCmdidx; lcurtime = get_msec(); @@ -2281,6 +2402,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return -1; } LOGE("time=%ldms", lcurtime-srdt.ms_dev[devidx].FirstCmdTimeCnt); @@ -2308,6 +2430,7 @@ int FindNextCameraPhotoCommand(int devidx) default: sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; return -1; @@ -2318,6 +2441,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return -1; } cmdidx = 0x03; @@ -2474,6 +2598,7 @@ int FindNextCameraPhotoCommand(int devidx) srdt.ms_dev[devidx].SerialCmdidx = -1; sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return -1; } break; @@ -2573,6 +2698,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) { sprintf(szbuf, "没有找到摄像机使用的通道和串口通讯协议"); LOGI("%s", szbuf); + SaveLogTofile(szbuf); return 1; } #if 0 @@ -2587,6 +2713,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd) #endif sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); LOGI("%s", szbuf); + SaveLogTofile(szbuf); //} srdt.usecameradevidx = i; // 查找串口序号 @@ -2723,6 +2850,7 @@ void Gm_SendPelco_pCommand( DWORD cmdtype) if(len < 1) { LOGE("发送Pelco_p命令失败"); + SaveLogTofile("发送Pelco_p命令失败"); } else { @@ -2775,6 +2903,7 @@ void Gm_SendPelco_DCommand( DWORD cmdtype) if(len < 1) { LOGE("发送Pelco_D命令失败"); + SaveLogTofile("发送Pelco_D命令失败"); } else { @@ -2806,30 +2935,26 @@ BYTE Gm_Pelco_DCheck( BYTE *msg, int len ) **********************************************************************************/ int FindNextShxyProtocolCommand( int devidx ) { + int cmdno = 0; + //如果命令缓冲区仍有命令,则退出本函数 - if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 > MAX_SERIAL_PORT_NUM)) return -1; - //if(srdt.ms_dev[devidx].SerialCmdidx == 0) + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) { - if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) - { - //srdt.ms_dev[devidx].FirstCmdTimeCnt++; - return -1; - } -#if 0 - if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - { - devparam[devidx].devaddr = 0xFF; - MakeShxyProtocolPollCommand(devidx, 0x02); - } - - //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) - // MakeShxyProtocolPollCommand(devidx, 0x09); - else -#endif + return -1; + } + //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + // return -1; + switch (cmdno) + { + case 0: /* 正常采集数据*/ MakeShxyProtocolPollCommand(devidx, 0x09); - srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; - return 1; + srdt.curdevidx[devparam[devidx].commid] = devidx; + return 1; + case 1: /* 测试读取地址*/ + default: + break; } return -1; } @@ -2839,11 +2964,15 @@ int FindNextShxyProtocolCommand( int devidx ) **********************************************************************************/ void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx) { - int i/*, sendWaitTime = 100, y*/; + int i, length=0; + int newaddr = 9, baud = 9600, stopbit = 1, parity=0; //char buf[128]; u_char *sendbuf; - sendbuf = serialport[srdt.ms_dev[portno].UseSerialidx].PollCmd; + sendbuf = serialport[devparam[portno].commid].PollCmd; + + /* 测试变量*/ + cmdidx =cmdidx; i = 0; sendbuf[i++] = 0x00; // 强制等待时间 @@ -2854,12 +2983,34 @@ void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx) sendbuf[i++] = 0x68; sendbuf[i++] = (BYTE)devparam[portno].devaddr; // 传感器地址 sendbuf[i++] = cmdidx; // 命令信息0x06 + switch (cmdidx) + { + case 1: /* 设置传感器新地址*/ + sendbuf[i++] = newaddr; + length = 1; + break; + case 2: /* 广播读地址*/ + sendbuf[6] = 0xFF; + break; + case 3: /* 设置串口参数*/ + sendbuf[i++] = (u_char)(baud >> 24); + sendbuf[i++] = (u_char)(baud >> 16); + sendbuf[i++] = (u_char)(baud >> 8); + sendbuf[i++] = (u_char)baud; + sendbuf[i++] = 8; + sendbuf[i++] = parity; + sendbuf[i++] = stopbit; + length = 7; + break; + default: + break; + } sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6); i+= 1; + sendbuf[3] = length; + sendbuf[4] = length; sendbuf[i++] = 0x16; // 信息尾 - serialport[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]); + serialport[devparam[portno].commid].cmdlen = i; } unsigned char CalLpc(unsigned char *msg, int len) @@ -3053,6 +3204,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; //srdt.SectimesamplingCnt[0] += 1; @@ -3065,6 +3217,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "Y =%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } if((fvalue < -59) ||(fvalue > 59)) { @@ -3098,9 +3251,7 @@ void ShxyProtocolDataProcess( int devno) *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[j+1]; } switch(curserial->m_au8RecvBuf[j]) - {slantpntmsg[aipnt][1].EuValue *= (1+frnb)slantpntmsg[aipnt][1].EuValue *= (1+frnb); - - + { case 1: /*温度*/ if((fvalue < -40) ||(fvalue > 85)) { @@ -3121,6 +3272,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "温度:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 2: /*气压*/ @@ -3142,6 +3294,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "气压:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 3: /*湿度*/ @@ -3163,6 +3316,7 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "湿度:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 4: /*雨量*/ @@ -3192,6 +3346,7 @@ void ShxyProtocolDataProcess( int devno) //sprintf(szbuf, "风速:%0.3f ", fwind); sprintf(szbuf, "风速:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 7: /*风向*/ @@ -3213,25 +3368,10 @@ void ShxyProtocolDataProcess( int devno) { sprintf(szbuf, "风向:%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); } break; case 8: /*拉力*/ -#if 0 - if(RESERVE1_PROTOCOL == pPortParam->ProtocolIdx) - { - leirallypntmsg[0].EuValue = fvalue*leirallypntmsg[0].AiParam.fFactor\ - +leirallypntmsg[0].AiParam.EuValueDelta; - leirallypntmsg[0].AiState = 1; - g_SelfTest.SensorsFault |= (0x800000); - if ((gDisSunRain & 0x10) == 0x10) - { - sprintf(szbuf, "地址%d模拟导线拉力:%0.3fKg ", pPortParam->devaddr, fvalue/1000.0); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - } - } - else - { -#endif pPortParam->recvdatacnt++; if(pPortParam->recvdatacnt < 2) break; @@ -3244,6 +3384,7 @@ void ShxyProtocolDataProcess( int devno) //rallypntmsg[aipnt][0].AiState = 1; sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); //} break; case 9: /*倾角传感器X轴倾角*/ @@ -3264,10 +3405,12 @@ void ShxyProtocolDataProcess( int devno) //slantpntmsg[aipnt][0].AiState = 1; sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); break; case 10: /*倾角传感器Y轴倾角*/ sprintf(szbuf, "Y =%0.3f ", fvalue); LOGV("%s", szbuf); + SaveLogTofile(szbuf); if((fvalue < -59) ||(fvalue > 59)) { @@ -3282,130 +3425,6 @@ void ShxyProtocolDataProcess( int devno) pPortParam->aiValue[1].AiState = Sample; //slantpntmsg[aipnt][1].AiState = 1; break; -#if 0 - case 11: /*测温球导线温度*/ - - fcorvalue = WireTemperatureCorrection(fvalue/100, (WORD)pPortParam->devaddr); - - wdiitemppntmsg[aipnt][0].EuValue = fvalue*wdiitemppntmsg[aipnt][0].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta; -//#else - wdiitemppntmsg[aipnt][0].EuValue = fcorvalue*100*wdiitemppntmsg[aipnt][0].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta; - - wdiitemppntmsg[aipnt][0].AiState = 1; - g_SelfTest.SensorsFault |= (0x100000); - sprintf(szbuf, "地址%d导线温度:%0.3f ", pPortParam->devaddr, fcorvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 12: /*测温球内部温度*/ - wdiitemppntmsg[aipnt][1].EuValue = fvalue*wdiitemppntmsg[aipnt][1].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][1].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][1].AiState = 1; - sprintf(szbuf, "地址%d内部温度:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 13: /*测温球导线X轴倾角*/ - wdiitemppntmsg[aipnt][3].EuValue = fvalue*wdiitemppntmsg[aipnt][3].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][3].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][3].AiState = 1; - sprintf(szbuf, "地址%d导线X轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 14: /*测温球导线Y轴倾角*/ - wdiitemppntmsg[aipnt][4].EuValue = fvalue*wdiitemppntmsg[aipnt][4].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][4].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][4].AiState = 1; - sprintf(szbuf, "地址%d导线Y轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 15: /*测温球导线电流*/ - wdiitemppntmsg[aipnt][5].EuValue = fvalue*wdiitemppntmsg[aipnt][5].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][5].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][5].AiState = 1; - sprintf(szbuf, "地址%d导线电流:%0.3f ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 16: /*测温球电池电压*/ - wdiitemppntmsg[aipnt][2].EuValue = fvalue*wdiitemppntmsg[aipnt][2].AiParam.fFactor\ - +wdiitemppntmsg[aipnt][2].AiParam.EuValueDelta; - wdiitemppntmsg[aipnt][2].AiState = 1; - sprintf(szbuf, "地址%d测温球电池电压:%0.3fV ", pPortParam->devaddr, fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 17: /*A相泄漏电流平均值;*/ - LCpntmsg[0].EuValue = fvalue*LCpntmsg[0].AiParam.fFactor + LCpntmsg[0].AiParam.EuValueDelta; - LCpntmsg[0].AiState = 1; - sprintf(szbuf, "A相泄漏电流平均值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 18: /*A相泄漏电流最大值;*/ - LCpntmsg[1].EuValue = fvalue*LCpntmsg[1].AiParam.fFactor + LCpntmsg[1].AiParam.EuValueDelta; - LCpntmsg[1].AiState = 1; - sprintf(szbuf, "A相泄漏电流最大值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 19: /*A相超过3mA的脉冲频次*/ - LCpntmsg[2].EuValue = fvalue*LCpntmsg[2].AiParam.fFactor + LCpntmsg[2].AiParam.EuValueDelta; - LCpntmsg[2].AiState = 1; - sprintf(szbuf, "A相超过3mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 20: /*A相超过10mA的脉冲频次*/ - LCpntmsg[3].EuValue = fvalue*LCpntmsg[3].AiParam.fFactor + LCpntmsg[3].AiParam.EuValueDelta; - LCpntmsg[3].AiState = 1; - sprintf(szbuf, "A相超过10mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 21: /*B相泄漏电流平均值;*/ - LCpntmsg[4].EuValue = fvalue*LCpntmsg[4].AiParam.fFactor + LCpntmsg[4].AiParam.EuValueDelta; - LCpntmsg[4].AiState = 1; - sprintf(szbuf, "B相泄漏电流平均值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 22: /*B相泄漏电流最大值;*/ - LCpntmsg[5].EuValue = fvalue*LCpntmsg[5].AiParam.fFactor + LCpntmsg[5].AiParam.EuValueDelta; - LCpntmsg[5].AiState = 1; - sprintf(szbuf, "B相泄漏电流最大值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 23: /*B相超过3mA的脉冲频次*/ - LCpntmsg[6].EuValue = fvalue*LCpntmsg[6].AiParam.fFactor + LCpntmsg[6].AiParam.EuValueDelta; - LCpntmsg[6].AiState = 1; - sprintf(szbuf, "B相超过3mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 24: /*B相超过10mA的脉冲频次*/ - LCpntmsg[7].EuValue = fvalue*LCpntmsg[7].AiParam.fFactor + LCpntmsg[7].AiParam.EuValueDelta; - LCpntmsg[7].AiState = 1; - sprintf(szbuf, "B相超过10mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; - case 25: /*C相泄漏电流平均值;*/ - LCpntmsg[8].EuValue = fvalue*LCpntmsg[8].AiParam.fFactor + LCpntmsg[8].AiParam.EuValueDelta; - LCpntmsg[8].AiState = 1; - sprintf(szbuf, "C相泄漏电流平均值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 26: /*C相泄漏电流最大值;*/ - LCpntmsg[9].EuValue = fvalue*LCpntmsg[9].AiParam.fFactor + LCpntmsg[9].AiParam.EuValueDelta; - LCpntmsg[9].AiState = 1; - sprintf(szbuf, "C相泄漏电流最大值:%0.3f ", fvalue/100); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 27: /*C相超过3mA的脉冲频次*/ - LCpntmsg[10].EuValue = fvalue*LCpntmsg[10].AiParam.fFactor + LCpntmsg[10].AiParam.EuValueDelta; - LCpntmsg[10].AiState = 1; - sprintf(szbuf, "C相超过3mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 0); - break; - case 28: /*C相超过10mA的脉冲频次*/ - LCpntmsg[11].EuValue = fvalue*LCpntmsg[11].AiParam.fFactor + LCpntmsg[11].AiParam.EuValueDelta; - LCpntmsg[11].AiState = 1; - sprintf(szbuf, "C相超过10mA的脉冲频次:%0.3f ", fvalue); - DebugStringPrintf(szbuf, strlen(szbuf), 1); - break; -#endif } } @@ -3504,7 +3523,7 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam) memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); memmove(devparam[i].pathname, sensorParam[i].pathname, sizeof(devparam[i].pathname)); devparam[i].databit = sensorParam[i].databit; - devparam[i].stopbit = (int)sensorParam[i].stopbit*10; + devparam[i].stopbit = (int)(sensorParam[i].stopbit*10); devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; } @@ -3526,9 +3545,11 @@ void CameraPhotoCmd(SENSOR_PARAM *sensorParam, u_char channel, int cmdidx, u_cha //baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate); devparam[i].databit = sensorParam[i].databit; - devparam[i].stopbit = (int)sensorParam[i].stopbit*10; + devparam[i].stopbit = (int)(sensorParam[i].stopbit*10); devparam[i].CameraChannel = sensorParam[i].CameraChannel; devparam[i].Phase = sensorParam[i].Phase; + memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + memmove(devparam[i].pathname, sensorParam[i].pathname, sizeof(devparam[i].pathname)); } #if 0 FindDevUseSerialCommNo(); diff --git a/app/src/main/cpp/SensorsProtocol.h b/app/src/main/cpp/SensorsProtocol.h index f534e80f..5c9d84f8 100644 --- a/app/src/main/cpp/SensorsProtocol.h +++ b/app/src/main/cpp/SensorsProtocol.h @@ -36,7 +36,7 @@ typedef unsigned char BYTE; #define IOT_PARAM_READ 0xAF #define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ -#define MAX_SERIAL_PORT_NUM 3 +#define MAX_SERIAL_PORT_NUM 5 #define MAX_DEV_VALUE_NUM 12 /* 一台装置最大的采样值数量*/ #define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ @@ -130,7 +130,7 @@ typedef unsigned char BYTE; #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/ -#define COLLECT_DATA 0 /* 调试使用*/ +#define COLLECT_DATA 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) /* 草绿色*/ @@ -372,7 +372,7 @@ void Gm_OpenSerialPort(int devidx); // 关闭串口通讯 void Gm_CloseSerialPort(); - +int SaveLogTofile(char *szbuf); // 功能说明:串口发送数据 返回实际发送的字节数 int GM_SerialComSend(const unsigned char * cSendBuf, unsigned long nSendLen, int commid); void Gm_InitSerialComm(); diff --git a/app/src/main/cpp/serialComm.h b/app/src/main/cpp/serialComm.h index 8321a31b..a8825221 100644 --- a/app/src/main/cpp/serialComm.h +++ b/app/src/main/cpp/serialComm.h @@ -12,7 +12,7 @@ #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 LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) int set_port_attr (int fd, unsigned int baudrate, int databit, const int stopbit, char parity, int vtime, int vmin ); diff --git a/app/src/main/cpp/串口函数调用说明(V1.0).docx b/app/src/main/cpp/串口函数调用说明(V1.0).docx new file mode 100644 index 0000000000000000000000000000000000000000..c550d605cdbfb314f5024f0aa26f79e7f143e9e4 GIT binary patch literal 22797 zcmeFXgLkLFvMwBBVr!C2Y}>Xuv27a@C%@Pe+qP}nwr$_+z3)EX`PSM0!MX2R-K$qu zS9iU=s;axHA9*QIFjOE2ASfUpAOaxCb`X1OU?3oJ2p}L7ASe(`AzK?KV;d)3Wp_Jc zM{Qa+YpY+mU?Ak#Kp@}a|KIn&cn9he#w_~i5k;PYJ_BYNmnB=t3;IWLqm6OQUV#D3 zvckp^;_*vcu0Od76NqVLIvAFjo;H~b|IQd`rW(N!SeQDpjzdrbQ)SG$#MVWxNO?@f zh4xbFrw659{Hh&!ezjm;a}R|su^wMRp5e2@J3y91Vmj(kEU?Q#6|d6o>4?cP0DgC& zZ{C|#2MecA#k1n}@E0tHC7sfI)rtqBk0ptAHcU)p+Ub~4{I&41T8d9$9v>6yu!WMm zI)r1P_iiSr!ht(|ylKWFKqX#CxLrnG5^k#{uf@?qDUp)V#L;^K5R@`|NK8YJ6^y9A zn>Dg7KwZUqmU9qZ#|r(DQ+RV30wsig1u{$LLSm)&y^7pTb0-tu`Kb}&{T{j4iULx8 z8n(0j9?m15`xocf5Fyf;3~ZLf|COWtuc56YZ5(G&&x?36&Aa}2-%05_1>8A7HgDGn zYiv1PCPHahF+c9e;Tsp<=eL=CeSreW|NpEMFBZG$>Ra_>zo{_aR;ue@Y~@Ht`;Yqn zS?B*^ll*VLULM!;ZJn_ER{p&*hwmIfDY)z7o9%Mw{|z6#Gv*92De4KUD&k4N0X0HA_~rYfiEfkwO5w+YA{cW*im7=+;<~&{dzGc9zdlUaDGUpX7UG(okfl5# zox!-RlUP1KO!#V&nP_67dpB#f`;|}Qn;9c5C?2S>t?21U(qj$Ee_&s?&zySXbrlVS z1yMuiK!?%2d6{S-YkVF74zc)HuL#uZb$4uW(zONdzR#-vX&>sri+XeTKtSEbz(7df zo8oHgU_@tRYv^qKeU$y<3_I68b3_qq{PHQg{Mx?#h?5~P+eEn9t#GHv`B6PaI&!(O z>JV7~d?uQtJc}vV*eLlY%-YK87ns@}H`J67hBPwB;PSQpSA3)ivG1;K^9B=lrUDy zN;DnUw-PV3z?A4@ZwQ5f#DOv+Qj8uOB#CYP6_(teT$?IW4xX^j5tAmf4QLC@_+~0bE}O6-*;Er$J=LFFcnprZm+*wD1Rr z@+d+Rz2Za3UJI$*G%DySnlSUqd~EiKMG)=`1;y>d8z&c4)t;sEu;KFb4=36? zUUGJ#val0j#+*zDV?yN?Ope&sdT2nmW+Jl5joUWz@vs$VCGm}0OTvB6PK%XAzsJ|d z=v&M^(w+C2+yNZPNtK2?E{+1PQane)yUilP)%cRgST&|rxKSeUwjpO?nuHPMqJHDb zZ1+Tp0|D8SVfV<2(MyXG)_hUv0+V$vMX-gR&v26wTN*RPR+lj94S|fB@BthjG5Z;{ z5+e+vRz)+#;_~0{S7zP=km^*B;=j9fb>zuCYR19_Di^^A#9pN;EkBhgtJ8%OYl`J? zj!6eq`Mqf6kuY@%K|lSf)<#DM7M`W6cSjik-LA$enX!&&1%4!yJ=o%^04^TOJ=a5F zOUVZTR-WXNq$IP7dLflNj~|?zz@xPZb2ju26-Z1RM5cchG9n{?a>h!U9-I(oLlv(g zPA3rvfn2iz;l3MsDf2Q_3aR%Y+_VswH3W+ew>A1J$_>4W_sA%WGx1?JWF0?`t53q}Rcbuj0Kq5FY~m3TZVqQF5rMY6CuG-Qo{ zqa0znll2wu_eN$soz?%xTD7(h$&JNwGo7_l8ir%f_VVsFkKKSb=}l{xqe`UQl_>E? zZRUPsL7WoNshR$nsr5x;V|AJDL-YN!*3D_a>>Af=Z$3%;{Fuz9yyY9b;R+=>}z zL9d1hGDSC+$YhBYEkPPsz3BE(cXE}OG&?m15Cm8jM`_?}u?QXoG&d4>gdHIQ5+V1+Km1<$)uA89X3TxYys0r9W{@`3xPu%orG_$-yG;6%CP{B_B&>8`L? zYROiN?1`a8a?pR+R-9(7&ZOH75aIyoL03bwBh1@n+(m^uOM79&&EYrKStGwxGAGr2 z$LPos_b9#C;~~)hij<57WFjCE8xpi_q7e76k_QmVOX)mhX4^-sd_hAHg??lK$(Zv~ z0Dd`vDk=mT<4gl`sb~MFp@QzSx`7piiS8q#n#aKCn~yLg#~NnefkqDx2_yq$gW}7P z>bXWBCDNfdRF=aG#cG{~ziB085FU(<)RQ|*tEm>*#`+B&)-ook{t;~^B1YTxqRi*s3 zDB}-XmJ(+ODO?u*obgWR)f&m>T`8k&xG^ZcLk}v zkzIC%kp`JO=2Ef(Q&l!Lyb|c)F+B(8(e{bA?ColKHIyh|%XWML(XoMZB>cA{gA-I} zZDW4*y71|1R%Rj}GwHA*G5W%qROCK{{fqN@7GhIf*TZyi_SzCA2t%$x3ZtO`roc39 zb?n8jZc%JfgN?z@)LlTBtMJuPN!GT4FTFv6BvH!LaY)t_f~o-mSJ&6Y>)_#GAWO$= ziy9-#tLnn*!NXLf&9SSxV|C~+rXWOz!Bzzf_G{vKNky@*FXY*Sz zoe|%w?3O3*2f@+SLq)o)E?N~YdF7NPPIN=n-3P&i-_@#j=UE!eNplOLWWa}+dx-ip zAMabv`pkWfvTR~oNz0Bk`j@w^+D+3YT@$q*Pjs|1O>tG_mzUI*+AJQ8U)AewgW_lV zL-M_7`J-4U*n5l|8(*L_G+Lq)}BP@kvJFc5+Zx7L^JmjzOA8ypuf zb;w4{J)Nx2QrTX}BF+|%x;p3iZ`fd|N33g`U17IA2!TwM+FE*|B1OsCwA6P}kk1bD z8wf+dqB1{MQ=zRD#?sN#?U|=(=lo*k12{YcQm;VrQnL2ub3{5$`QxczEJAC0)Rfn$ zl)GcTW_wEk%_mAkz(XRqx4T4}ol;wE?tyO7rS3`eCZfn28f<|k0>HKLO=$F|2hjU{ z?9m(=4XkxnT$BEnr*E@UUi|FLNKIIYy^TNDEXHSqo^%-m1UhAA(ea%L8^Wkj`CL5bS>+(Ln9o)HD59G(q z!mL~q03o@Qr#=>bTsjC|u7W(PcsB&)4-z+pgRJcIVsrq?1I|Ue(or>FJl}(}Bw^rn zr-mqmMuE-IBxoR$6Fq;NZ`mk(oEpJw>+vNt1YooDCa|T+#_fNt`TRQaWQ4 zOH;B?E6BL^PMXB7}s;A=Ry{lpCaYvpY~E` z%VEQ|mfHzS+ubde6mIxGyqb08G>AXFQczR%L;%0GW96(>h|l(M1NtVhk)i}KQ$r3* z6(T_dh2S|N|BltJ4BPQ;!V@*Ns4lVT89uZzCEKA+RM| zv0QUl8!ZUTfAuHsg(WaL1-{MA=QG=fa&ePL;>+QF9EY;B4v0Uu?eI@c{?W5$)5xvb zWO0pNjr{gssb7aJhW4BE#P$h>cF37HCXnF4w?Bt&X!@!pUOe%~^fw)g+qKP~X4JD5 z&>QhU$X|A_0o$-)tsVj(WMBy{83hB`s6@(Bv$ggU?nS|tvLhM@X-=)RTT5dw_Q z8Q*1p&-daB6znfoGFntKTI6&Pul$n#M^44O*}TDV%7Ms#%{m+#zgCzXn2a9V*^iHs z@uw`;)T*V1RnG}qzWU_N9R}c;s=m2#9VsYzY_+5Aat^FQxB5kQ$SWYE3?_k!m@Q=EsrR{=k-O=sDk$y#aH3%0xV#TcH3`tsLhci`Bva}xpGMvz}(&D6!kcnK%r3MSd$~oH%RO1L<#;zSqG@|BV!6VG+r~;Rm-iIbZ z`&}#PrNx_btuFF8Z}y2ZkAP6b2=7{K@Ilmh>mXtl2GB6ubdg{~< zjg`i-56D_3=VE#$x}`6K)6lWT;ZONdwaMij9Gn5tRf%aV2{9m0>FyD+7IlC)tV;HG zJ*vUe5E0kO`5UI<^6KIxHEI>_HJe1ZA{d#0)BFme#=bmW&cGvc{(JC{mLG?+4jGlc z9)w$86{ke@f=Srz;SU+W-+q|N5=*Uq34p+MyMT5j`|7f)s!E~C>0y95M%Vonx@4N} z-*6AW*5f zlF-L680wFWE>vU=Kmysbp+rNo12|4XF6n+AwgfjN7M|+rP@mf<$J}_BDrj<4(S1qj zcB*mv;vdGVbyU&t(pc#(F5-1QZZeD84_I zU0`E$SZSVKEIh&WwEUro0r>5^kjY0w^L|{^n2o{#Ke;h!8LfIhAjKa&PQvJk<38^)VVPFgvC{Uij-V$VA;bMbzGca>FkJR9Kl9EYpF8cTgDi$b7KMlhmJU@KnHFklPWhvBli9`DKdfI`Nlb(wje~t8{ zCk<212KBocwyMo`ZknhM)5|nOiR1 z7lps>vRsS@e_nff8v{FyfI7VhVL)yuv~tS_`^X0q8RAPR?Jkp5`Z=ks{(0IKf1N$(U39ql zgt_Pq=%`|?=aPfqL~8$&ITsc^sEv(OsDa2+ijDzcF=J|BuLi(73zfXz{rONZwp!;2 znt05V_?P{@CnRGg3@=?hgtO*xjGydPnrx6PU*cqWrbgCGgk5PNR=!VWuywcN>Szbh zQa6cfc2QnZl+ba+|EXO3xY%9w&da&7>@}}vb{jMl)JP+ zx?@QsFNH%=eo?)Yg}!vO;mp1&l#6O=9oSx0w5H2tu&un_#zF``RTfTbLfU^gpb+Fu)np$0D?6;S%H@2bp&RF`xg;x zOw^t4O|$P8HW$4x(jPN_XhG)DTLp=JZLC!;QDz^#P|;9dT{3e@pc!UAG4<47EG$71 zPCHJz-EKqx13whADpK!RhRC(``@>`$9U{R@F(OM8f;-CXuQ5113Qy2(wl28tVsenr zw#m0sHBjpj!+@o#4divt z3Gg!hogqUI`9z#TvnDg_ADqJhZ6e7ZAi!*Rt0brg=6HEIxeFCDqvArb3L|&-IUfV6 zn|UTJJrKrof|JjhJS^2-^?H|%z>?!G71Wf&VrArVz34CH$QLex{awOF-e*{~5|(EYn(m&D(s(Rp#aDtAct#4J((X4R+WGk? z;{bJ~0dJnnx>GNWC3Gq9`{nnYvdWodmJm{QU!yFpl~f*x@>(t^(S$cO*^!`wp1)nI zk+t6E-4uf2z&0mJKCd{6_;hg5pcDvySsY z1b-ecKH)F3OcW#{UQ-lc5hjq)_{n@3bZb09yUh|Lf$PO~-Dt5wRBJ5|pE%zvR=ay6 ze0a^hh}ybl*E<;N8wPG{wk{oydi7`bKqPg%Mpi2ufp?bc(6sI39+0~3*|MPB0OLR8`0e~8sIlaWJZYr8KsXoDi+B)p z)q|b3DD7@;ZEi5Pz4HuAn%dx`K0t)X!l-5)@f7SL1PXx;c>bpbfV?>~sv^5&gmuQW zQzyRF-PXqVrAxXsDyF>mPP7R0ToA#wImbO@GUP*w1=cgbO#6NY+@}2yxA0=Sk+NB1 zZpDteuMMhI?ZA--owLNIpW7_Eci-NSt+ij=C^$7&=n&qeA9dpUx$7a!TG;@8<5T6A z)vJ&w=_S5*X-0JE>lyzqchok{ojwaSAC-f0aiV$rwT@`EmsaU$I#(!rJB<`Ft@AhX8zgtm*6UtN82uTW_K zAY`q%SLD6Bm^jYCJ|tn;5k#RDYDevJ!P8X@rRV<)k*V9uwW}d#yz60mh%2zGK@}HI3LmdZd&9-n$CwAM(x5x4Zd?U~a&_J1kX20r{OLy& z04tNxoazSRbtSh9`f`Q+Q~1anJMzxMA7U5~i<*JEYpeQmviY}-rzwU_$a zE_c0OcV`9lxwbm9P;Y^5GSA`CIq@oph+kSIkM9q0ii|ZDXy>d8)8?XY57%lU`+X^_ zJq)_9x=Qt9^v&_)rnG|%={DrIn(hPB5`k#V0q=$2T^RHu*q2sglfkt9zreo!E$#%D&0&{H~P z;^)Qu2wKPK0-EnKgmyybLqMbVRPSpa&gu$eKtL8K$Yo#4iZFLhrV9}*Sp9>Ia*dm# z)S6c%pYH>D4$U=fjh+3o1R+}1IJsoIP+?WbUR2ZXr`s*~2%T^}6clxmLekk1?CzjH zjhk@i!1duo!dD;{hXEZy4ZzbHK-fi-g^swVd?T6QsV+yn zn4D&1W1!^?e;R5cQbR{ZpgA&Qv^&h8%v;R2K4x@gH?#*_GN{ia$3CRc}wKcjMqFC?+2agNDD z6gi<0QUw%(kF+hT6tMNlft@phHe{~t0u{Z01BmI9P{J~qaT1qB$zlbNe@bjObLB+_ z8WyJz7us-lK^ramzta%*A#Gd-!3y@56o)?MkJy0`a)!bGFeGNCY%Uxj55zE2w43y=i?HAM&A{1hg+{x~>7>)s^Fk$(pIKPk1Pb<4-kgd3 zA*S%RyA2g!#NI8}pAuVUXD!0zUmZ50*Mfls%4zlFI0h&@?veHL&D|r#7V6k zOaxzed?4hK^1OXpT-gA#&fQPrv1s-ZWtw@KtZTEy9g)TIweBMqA!mn}Fgs$WhVxww zU~JdEAzI5Kkt)iFs%r6)T=4drlFCL%FwlG@Lv&7)l052~8$Z>YO}d22L|6|@$iA}L z+}4RyH0eY2EmlaZ8G*QtXk_9H!6S%Mj;ySZZiiGAA29 zlsVUZTCAzkyXzdVs#)oRYNPUL(pmo^+*NbB3D~9)M9vXGHvWLMW=Jw2x%x>H#T5)y zAtf3_>YP&j1U6495g^m}eDp;!Tq_WDBuZVnb++RBuDX*!$pGBelOOlPPoC;`?%9y7 zh(JDX%A@;PT(A%yB^GW@5k;|TUfmF zOe9+(ozJrh*~bU5c;uuQv5ffPC5%0IKyT9mt;^70Z&}$&umjpBK5y1=+|z{0v#(Dr zFLolobKQ7nL?Dg^G02?MJZBFH(>YYPK+OSGa~q2-fh8)9!izhNLYiLd)s|*FKbnwD zh&bszV3`cvx}QA9u_JxiU97Au;@;F!Q{TlAQ>(>3Vk?KI1?DuF_D-z_)cTnu#St-y zpxU$0Rw^6P78NX=g+d-MoUmc-X$VBjH4-qF9K8Jrh~tpba||;HL~>HMIJOxtevRBr z#0piEddM3lUC@0o5`av`G;{GFi~#i^QUpGUQoMg*E4jt8eX#%_0QXrl|;g% zfzkDp5duJZuq#H>{|1`MW^uAd8L365PX0LytZ{ZDPGe`t z>#bmd2rQf{P0g&>l%X6dV>3nNs07l$oK;iv;m%Oq`R&-XJsifd@NAL2_J?PlUWy5N z4k!aVtjG}G2!(#tsxk}`)QH4%9*j4FY##F$me?4uOFYZq(23J~{S9yeJzH7+{LB~R ze?kBtVPvnsePaVSz<_{$0zm=)69Moqn9P620sI>>1N;qW`yTzj`zw#1ko^X91zw4_ z2Q;|u=JN{_%hDAqRw3eb%dqkhs*63M53d=b739l{@H{sgUW^~rv}^b}S3L8dVGI3; zBZu%yNXyNU?9ps&aR=K`Q_9g4D%RtNJiC9jc<`?<>DoUnbnR`6QIcnRl2dGLACzqy zz8C+@XKtK37tP|m*XC2l-Fw-pb51)zCpHCN|K41BHeNo_aYVa z*}X(d`8Y^#T4)qhrAH#Vg1Y4%77|B%Y-n%WP(DPA%ZB2vX9s5= zcf1*kxhWu+ysyk??^j3-XhwkcQ;yj&hsk3MvBPMD?DNHpnuQ{eJAfs2jUgUL+F4Cqdm51c7yax%inXPb-9 z&j)t()+pA$L+lvol^ZAvmm7y?$!kIhQ2NdE%3R&soSfpdE=q<*fia{M#%f#D5#%`{ z1~#F3;=~f75Y*57tj*wLH+sb0pJeL{|?wm>j37+Yy&!yAR_BoS_(UoE8(MdTcXa)xI| zKoQa-Odbr^UW#j=)`8{#q8BFfn0k=H0X&zsgqeQRgoN%_N>ELYC$092)F3s)UIxjs zNuHbYj4X096;I{WagN+<(^g&0Cg^x(e|27CVaPSni%PtQoULFfCYR$`!7jt3wglda z8V+I(yY_1s*fVMA4u1A3#o~+7dW{m6raJoNXt}1n_T4b|>LIjHgc-m~`rct;4IO~8 zPRl*Yf-(8viJpax=mg{_=&6IwV(4!2Yu2Rcz=&tA^iWx$CcWIbe5($klkE@$5hDOm zKy6JQhpJ2OWV!!@UJIAVs9|{<^^DY3I}~O} zmB!WaCg<=cp<^7-tg=B+q&%(D3K8GUSQv7`+;9|+z>yWp+vA7+L7Oq1R>0sR?Ia&n zP}ShG`-O*HVBgAZ&dKU57)HxU)O)@5)7{EmU#`Y=QEg<>-|j+vWLemt@ZLIq?mB&_ z!ih0Q{f<8{L|XMNB9ZL|^PZ)_$}BnWRZqSP7{Ye(H@WTlI-73;ZM*1nS~N+~Yu8_P zV+$AF`?=v59WS8&N&llCmis2Y^&jh7|Nje6Wo%>g-_(D^W{n<^{|fvS!T%Dz!95I- zi@%YuDchXyPmY;XX!D=^_IK|Pjg4VA;sa$|VZc83WG~j~;p4D_sa)bDm~Pu=;t^*8 zO01DrlZ)?{M{0$Z7|u9KI*jbnWthd2%iYJ?1VJJ9POtn0kpJ29uaQ-m$XEu!)cgc} z?*Yc#Ky*z<5ilWxwh1T^$Q)!;x6a>>`N)A5aBmxiokOb?_WSG+N#tHY`Y;iQ5;ctX z%M9-`F&wR;WxV8nfk0qDyP|)H<)IH-EP#r{^Jl9>GiQmm>a81KQyj-9&57%0)u)P{ z;*u@$Z3`;G$7|+bvR;?Cgz7)&3}gKvVO`NoGCc&7ww=+l8{8r@15>2&3mP%&MP`Vd z=9b0=sI>*{+SBk^9#ov#ljyQlfK7y0!>nl&c`&!IMwVmmwn@GV#P}=NNLCSuI9}&% zb50m(;w~#=OBcc!eWidtQrj-#=JU}ne5$PCmC`$P6Pzy97`hj{90_mXAj*WBkpvfC zKV?Re!phn;-4HLOb1dPjd13QUgHl7`x~Vfqs7&zZkJ*fkKoqLcPDi zk7NC!5GC-hp6O#%eUB(WiO=7&lZl8)9DpcNYmzVwb4vHSLw7YW{Y+}BB3VEn`LQxn zTQ!r}cI#2i$4R8-?2w58`@v$YqePu^%81N&)hz!^0~z^i;pZ@VQN$nbe<=S-!H~oH z;HpbpZ;i^>hSQh%BmpZK^iLTQ)n%xI-WZ-6rYYC1*bX}L zf!T+e!n3KgPo*}3tR1^9PoofmQ+W9Ly{XRm^oPOceRDahmqOzVGDUMLJ}8+j@n2JEy_3Kbgit%jFmZUHbhEV|LNgNMA|?J%-onYqS@ zfs46c-4qxTZ~X$=y0)L+p8bD<33<`x4mZEy@RPrQfYAQ!`<={;t&QpaSu^|-P^hjM zj>CrPLwC;ydw1z(a(+Y758cTs;}RdUk-x8CImQHFAtD-SW5|)8Em9;$U7Zaca?$!q zKjLJ^t%H`xi}F0PQ#NmjiXqSVHLAF7pRCrLOxyV~2=1ga$le1#T(rx5+FX-xcehZA zDa3|+wEVM(p4FIJ06CSrRF<6+xC6QZB6F#jG&H|5J{N3WCrfq&ldFs8^W~|E@9Uuh zVP~qNIn_{nN0&0_6jRA3+oU@44U*o-?k(L`%h zjnB%h;@40T|4N>SYum|^w3mdhwWe>|49qEnPC)I@>m#<<#m+D0YwQG`V9n=BjQdp< z&?26DTX$j6XQMS|yRU)w}0wqy8&7BL;K1+B9H^0)PT&j4vgGx22 zY3)HVpy^4Gxcn%s$s5#2;HUF8gv^io@H(+v%w3x(Mbhjg7%%+Y%1iJwU28ihyu3KO zMHX~TZ9o*!VEVZ6PzQ*{2J-$l(oznO+v9e7i0rECYrp5|Wqr*dSphro;Pd@(udCB* z>SZsa>hpbHiAyKpW^lIL&V2gye5XzfA2 zX1DjCS+xCGYGrB5sH$3ithYla`JN4-lT}(<*UrI?0ldDP73CWPtJ!Auwgc)8s+3q{ z4b~uf4Obwh%LbX@Bv_i{5xl)esG5v}cvOTLWgu-l*n4d~5|}Se<4V`XJ!V4*{yV!ll!bwLhFI zpRetfKeG`6B1`RdBaL553x2W_pjyT~nM@RL;b0IMwMob*=!swmkevoIJX&011aB zHcws4uX5o`HNQ&zH(0`XcnrCWNnEkIIP>p}DT18eE|k=(=;$;BK4dT-v7X@YWRNAE zH`SR8{&oQ|ndE%Nw^Ub|twpX_b6PHX>N=YCJh*Z=#F9HEapXbzupvVxPZV#h+RgLX zMbb4gc`F`hovIQ>L~PUZRvcv2M-~LdSb6S48NFdd?W(h9qHREs}wv1!x zFdY1ZlX@QHn!bX>hwvoO{T?fD%rwm}0!kG(EF?>hI(%a%(Y5h6PJkf?F}az*8tE|S zdy<~g9(4ZKUzzFbVop7_g!IbG_ldw{!ov+LWP!>4ZPmM?t)or3HT|L$X&|+RyzUnR%f$IP9oVi=H&XCrfxKCZ#nwchX-qI}aluH1C+#JUMZGRI%m`6^dGmYV z-%qXj1#4vwRFR9-7!mLK-rKm@n{dvA)LMwYyFmbA8;Yo81%+u@Rm(-o*BCtSS|-8 z)=C$QKY}Z;S#d7eGa4yH(MH%Umqo>6Db}pSgV*>nz{He65gNmeua9tu4Y-wwZGCNw)X%P{=zb?G*Y! zmX1ye2zvHyGKq+-U3I&7iWL0lx0cF~<$2OA>UJ;uHGJK7<|JGZ#UP$}O7L=a4<^Qw zk5G==K9Pa~{&J~8`LpRx=reYgtTk0@f8cE1*_Jt}Ry-SoWhf#6`{s=H7=Hn`ly_6+ zB@T9ennm5Q-`TtALGFOrfFxt}z8bK_ZR-1)KyL$shQ0I)GoLV|X&)#$EEF2pgI-oDKd@$o4F_d` zyi~Y4WTMiABewvTf@YDkL_HSz4WiJ%qxwb1s7HBAUx&D_pq5`)l)qU<|IF8{`b^ix z71GY^#M$2t7xNp>julP=5Hf^|H11q2eEToVF3b6U8rxMYzJo~Hsk&&@-Z&h?=(;eY za4me+YsKEF_*tYMd$M9&t<=W`KJHFz`vCBNZL^bsmBq`Mtiz7ktu%}3z+I%&)>k>$-j<0yMEpALQ6LnH^+4@rmh-$NAU zaCeWC@?&LMn`gi_h%t(>RO4ty4ng)89RP6ea!l~`(mPkKbR8}#m(Ks&r*x#W_xQ|_M&~|0CZOaw*1bYM@%D{{b z%E&Lly3wLyC7>tjEta_@6W1I1Tn`nl#K*c|kGG3!?0A7@L{J)Y!zX(H^)wgMTDncD z#ClP1(%OP26-8JN>wsNr;uGVh3nj{f6gYpboRKwxoar?q16WbrM~I)V#UiCV%N`Sp z5<3vKW#}FauQ$z+GZNTuhoJ0v?+(kMiz4i@LwVJWe?PAcdTFYC=QBi2cLMD#M7t%i zQ)BuY(H#v{NgCn8j79y2*$$m|gTh{TC4S2OG#n%gJ4(|f(0*=ICza{=#dvr;dpFB} zu%;#?f3l$bi5j=3nzi4IsjOk(SIRhV1NSAA)G+njv<4F z*X+%dWM|w4=2mv=qKtP(gK3{)B~l|Q%5`Gjl+{DcCMV4y`S{G=SN@cCYP+V8%tNPo z6yB!17M_VSGab1*uGFnL|0r~E4Pe9cLDgI&J>Yz!85n+6%hRU%(ueZTI>P+a%v)}8jj z%^3lCL0kZRH;qe1c$Be^ri!&oJ_p**|9DJzug@@7e`nMDeSm-v{v9_tI=Nf@D`B>u zG3B_{j5c(Yaq`tYQ^G^MNH@l3(!muLKc5m=x0yJXPJmonO$wcuzw0*Td2&B3gpl!F zKTa#PHElM2Sf*ZH`YHf{k%&iUKl9IL$kH_m-*`i9cU*zui2(4uZ+XK4T$#tPNO#n2 z6;Q|K0s^?TrUUn*U*ZaP`#7eM6+@d=CIkd)*A{LShT};nmLmqroB1#w-{La|jjYMN zcufhs2m4e6=LA>qjhNAeGY?@J$EjAeaaM7sa*YRtQjc=yB(!dkduLfp=pnKLgRrJv z+TEx*^EC72d%dQASH-!3viAcA1JOgDc>df|V}cJX7|}?V!K{#7 zwYOiNE;FCwEKH7kB%F+c=rCmJf%WA@@KVhZ>oBP1g(6(-iXZPj$)x1@88>Xoqt8L< zbHSs}W30vMcZ;=_O}K=Il6Brm9-C5~w`oTedi133m<*GBaUI?Wo=g^bU(YkM30uCJ zG2z;AjU$qEjn6mdHf0m>R)tb0I*ODsW|!OJlQ&-~ z1$Ur`B9_;i2F{@631AIhIqs{_1F>rD{0JktkBS8Af>ioK-Y>7QFKT<1QkKzK)*%mx z%`@*eh~S+44Yr-$&w+QkmxolG^$7)~827#9r;hB0&3z0B0iO5%8IC>kGkkgaXL!rP;NH*&qO8z*mU$EPQ8(G&I&2M*Y zIIg~&u6vhLo8Pn%>?xXLjUFk2y87etT8<-;Q5fuD5nEGi32>=}2_H9y*}RlwS z6dAex408g7t0%Eg5lAmK|nqF~iP$;4s3TJE-wu@=A06>ndIW)t82Y`9w85~Z z_iMnx#*n0-e^D8GVWwKuN8n!r=PEeVLQnH-`VA`3pc5TTOx`;d;nYL(eCCO{Kjx`L z_EdXwOU?gi%rVRD6`F4hU8JJbNZx!ul}>-IZ@7;iu;FH`F&MLza8j+MHqIuUU zb*@Mqe*kjPE62m6Jps^|p;V-rk(Fqt#Him`5CvQ!H6nGxBpqxT$wxmR_Ea4>sJ70D z9j?{adiJrFU)HWpNa~~&#o}pT-CZxrVRts`&Ppd3H)TlBx&6H3!hRu=4Ub5!F_H8s z)|!>Por*v3-^sQa2g( zy8-nY4fiM8{QD}sEw?$lBKN_39Y*dy=PB3Wy?b&WTBro+5;H zrR2f4M;!h>UCF4SlcX#!*H0mlbdcK@&?v0aj`A|pXCZ#$Bg;rS1@nTu(17vRewAK# zqBCFrN%<)iQfCs@yODDKMXX_7W%1K)BNQo;E$H1HVAffG~JiTt_cd_{{yz=x_@W(zuQNU+DDgUS{WTEfs!RYlmcgN4}uTC`a zKo6-VQOAF$Q~a%BSEARoXZ1jze$k@#|BzvTnEgGDCGLwNqcLqX!W6gRDaadr0(WEQ zU!SjS>_vO^d&k@zsR=TlTMXAz%PN^&SJp?$bTgGyop>(3ovhC)qo%$pqY(kklBvFV7<5Io57D)JbmE za$A@~N4u}jDxNrv)k+{tiMwdxK#9rR)K%V4_qfiZidgQg_OXJ`uGZ3mMW^PPNm2I1 z(Q^9z2 zM5UA2wDsCs@*$&5H_%HlVJ<(0)$p}zK{d8KRO8%QL!@zp%a!X4QcI*^OjyQ2N%B3P zV?6E*r^E`-d>If|?t?>j6h90a;k4jIwPH1qyde0Y ztY8poy*vR3jdJKWg|^#HFzAszN6-@^M-UJ$PXPX}{%?*TsDBL`YUo&4mne?$N2e6d z4*G#)mQ(s*0Qt?4E}zr!%`qVI-)Vwi8pViy{}>whV>~192ZdSA|LwAHFUx6@&*70R zp5FXs*(FpK7x<@W|6b@H@(}(H5mmg^mj#Na@yL|TuD)69ktp;3CB^@@(zj6LIUtT? zIf6g_@8Zk@MW29Kmy{16-^DqP0iU<3N~gR|dfNk5g}le&QWY1~H&3KY2OpgIO*eMM z2T?Alw1J2+rTL_)1)0iLVvvV{Bh#Y^*XO_YQGBiWS3&YyDIm|y6(sCMj5a^q=a5m| z_X@??XnIN=*Au*Dr0C(I(&8#-jhz($f201`E2T0-K%(CjT3P??Bd{5r2`2ctQ#fvg z*$ZqlIuyL4|118k@#y^G9CA+<9Q*W*y3E>x?Y_ z%N(GGYcWdDb2-YvktG3Zap6+10j0V!7>w*UXhd5X!RX2Y;=!TCU(A~CzVfn-__~bk zeTzT#t}MbFZP>Z%T5v^-BUGFkkKqv*v%Rj)YU$h@9FLT zPdn$q)Kt5*;n1XrQiV_ifzaX5rFVkTi%3UW=pAWFhlnCY0V$yhA{`VEkRlNfkRU~R zH3Ej-k={=Dj;~;j-#<9nGixS0x$f+lto_V-_PS>c>Sh#AK5}HYFpDWpDk*Ebs}}P+ z_!!I-y_Wb-sAsp6Z0Z<%?^yWtpU|=DXj-K=cODjFDJrhboShw*M+b6UcggFLe-EEw-7==G?j#m}wq@|SX483ZgY4(Jd zV)2+bIoL3X^bRzK+I&{s9vSn_>2GR`h_wAO?OD(omFxfl_#QM_+Tgs}%~gu*>2aVp zkN0$Ie78p1|3D{5V!oJ>Z)86}|Kw`cpv)b@aU!u1SM~jBaUjBccG!S?B;ui=(7P{ejRAOL%%ZNR1*YOjO7t^Ag)UVFD6DLke(n72e}%@Q)Rk{>Hl0*9 zS@`A5eV{E(B2%>G(t2{5m>o?#I>_47T8{s4v1)~1jA7x6+qku#o<>Hsv~t3tr|>w# zOpCR&RJHWgc6NVb2^x}}cR%fgC;IzlEWH<$TS8VG7G5G{$3zQ`6B49dt`ln>_|r-P z84P+t->nKt6#a{+d{r=$zGznU%91@6iH9)bl-NCZVKDR+N+;Fs0}1kIF)R2qM);dl zwr8b=v`GI1>Fknk5zeflpm$dEV@MK?&Z%kVi+nCMI;{$4Akh#)pjSyqgm zWP`g`Bvn+P^KRb6R>xG-+&E_qTMOcv7mb3ACmsDFcSm&Kz)@X?a@w&+vnl zT2^BcdD(52_hZV%nTjXoIot5-$*6=t-|5Z6H^Gl%)dKP6!rN`OxlZ?xe{G7%>4P9s@3?skx=|leVuV9$eR-pgY>}8wBanRuv5-AJkQT@5;ee z9_g?>TySDY>&ttrTWHJ}VD#nVQF;53Gs)W?zO^Ms?|ey<)LE$}I}W1-Hc{~CL^`{< z3_Rdc2coWovjQP}ASG^}W_nL5a5Dh@ZK;cWC0(|^tU=X!*gGh5Io)a4!Er02OvvBX zcyce?q<;{$RX?d=Y&TgmzGLLNc=J9guSC`NHlYGD3{nTz5g2!YEjcA1hw41SgU1#S z+^KD=h#`i-o#0p1qGn%x*oKD=b_NCu4D4*SZiJ7rWY>L>wC)<$#TKYg^O{Tx%5w}n0 zkJ!K$JB_eTAJ}Bqwe5;aoA|YglkN50!*ASZ`)$$?-20ODD7Ub|8xyAohC6B51#9^J zNND4CI-e;rZiJ+yi@~8c(gCRQk%&c#9+@)jE=^zG$ra46;$Muv9P_R2)ir5D*(A|= z*%aBdo$?KYnB5|BxskyDJe)kCmDNT<9EmJP9&Q~dq@f;i&E*MZ&MgnYbaGM$ondpc z$+Wy%E3>@j)2ZEblfLayW=7ZG+mQ<7EZ_oq3D$^HI5e1tp{6}Z%y{ltK1G3EK$Dqe zia!j9BQH)J7e@-Te4(00U>z4{0o-uXM1+##ot@MPQl$==7lVM66)cpvTIHE&2?;|< zqiHT_a?ltwlEvLfGBzY{rb+Ys1UyMl#3o>h27qrj!*1c)0!%-7fk>4pZ}s`ALO{8Z z&^ww0`egCiH^`zde-vOM#3x@(@B!CGM?;$ku;ik5-6&XCn$$tMr0Q7i>fe)8F_YsmZTmx9ix@ zw!HS7TK2E^s7Is6XMMD3g8)6+?Sg5^)l1LP%Gu_uYdw*GbnWM-Y+H--d;EFVDg9@U zLY3E8-CYHRdJDzrA@B4y=4zI4m*HD-rknK3SkFoMaK@b6mqBJ#RA1d6*$(CnuLd@}cEQwz+!oukBliC9)aM{XO7k&Obc6IXx zig-}-vQ5Ki)D40Q=e%M=S`oWEkj$bH6RrGL7A@7xP>puFYH#6U0La)7+Es#f2Y)vsf5+ ziGPdBLiei!4g(5YTx;K(ozQ8_6o-gzKy=bUmDNYx8Wi4@1&u~cbd4O#ZW6P>jS5|# z)Pw#yi-{=WY0*RUCqL1dNQQP|qV1R3o^I~<`K;YM|1SyA6U+W*zeL}_(0HU)Ge2nv zQsam*snKl($ZXWc@95X}Nh!LmW{g4GFgTZ2^TfaYN<n5#&xf|5V}>xaz|if@BB^ToC;#Y_vz&wZzfy5%u$d$Aq^i!#c+@$J)(@ zMGdyTyPbGkw;;l?9UwLXwfNalG4>xHVD7!aREQbeQ`$Gyf@bkNj9QP|5?-40t!E_t zy|j6HKf?GdmA|4Bmh@u6TDrTREt>z!S9G$XU+KD?XLjKRmJJe})d9{&y1hdLRSNWe zDjJ=m6{3-ktWBz;=8=_5q+##l`d6cUr6dJR;WcdjEu>YIodFV@o5ZDFs^bq~Zk^)^ z;LKJ~33;25=`4QqzKE<$*xYxih+F|%kmZb^o9?DTGSrvY&@MxG{w{WSg~wmJF)?f=RaCkn*E4V8YMs9cAP+ zip2O5wOL|CzE+PBJHR;r*Z$cRL}2g2M-|73<`30BER;_Uo;Kj=;7_G}&hPJ@>TOmg z3g-gqpj)vQkM(e7V~-3jNi7%N2j3k zl_>l%R*2+*K$91BZ%L_6VAj5x7tQJcH6njYMILEqj|B3{NL@eqy~tu=^P)@dzYlKx z&p&h?|1!o^TkTJQKW9pwqX0l2y3W5aVG9JY6kwxL~f|229K6aUkxe+~lxpV@xl z|Br7UQwh_geXd2#`Ag{!%QhyDX>z^5^Zep3T3#`6OrPL6PQmvJ$8-&1N?>JyXy xvr;&x0RUZX0N}ss22A|Vb^9WYbLRs7YZcd4!$W5$0B{9;$e|Ow=I+_Me*;t}YJmU% literal 0 HcmV?d00001