From 9e260d2b936e3385e46c6d0f9f78dd10175db920 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 20 Nov 2024 11:32:17 +0800 Subject: [PATCH 01/25] =?UTF-8?q?GPIO=E6=8E=A7=E5=88=B6=E7=9A=84=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 50 ++++++++++++++++++++++++---- app/src/main/cpp/SensorsProtocol.cpp | 34 ++++++++++++++----- 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index ac8c9a13..8110bda2 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -498,6 +498,7 @@ void CPhoneDevice::SetListener(IListener* listener) void CPhoneDevice::SetRecognizationCfg(const IDevice::CFG_RECOGNIZATION* pRecognizationCfg) { + return; if (m_pRecognizationCfg == NULL && pRecognizationCfg != NULL && (pRecognizationCfg->enabled != 0)) { // TODO @@ -1167,6 +1168,9 @@ bool CPhoneDevice::RegisterHandlerForSignal(int sig) void CPhoneDevice::handleTimer(union sigval v) { +#ifdef _DEBUG + setThreadName("bztimer"); +#endif TIMER_CONTEXT* context = (TIMER_CONTEXT*)(v.sival_ptr); context->device->handleTimerImpl(context); } @@ -3200,8 +3204,6 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT return true; } - - int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) { Collect_sensor_data(); //15s @@ -3238,7 +3240,11 @@ bool CPhoneDevice::OpenSensors(int sensortype) GpioControl::setRS485Enable(true); // GpioControl::setInt(CMD_SET_485_EN_STATE, 1); // 打开RS485电源 #ifndef USING_N938 +#ifndef USING_PLZ + GpioControl::setInt(CMD_SET_485_EN_STATE, 1); +#else GpioControl::setInt(CMD_SET_485_ENABLE, 1); +#endif #else GpioControl::setInt(CMD_SPI2SERIAL_POWER_EN, 1); GpioControl::setInt(CMD_RS485_3V3_EN, 1); @@ -3247,30 +3253,43 @@ bool CPhoneDevice::OpenSensors(int sensortype) } if(sensortype == CAMERA_SENSOR_OPEN) { +#ifndef USING_N938 +#ifndef USING_PLZ +#else + GpioControl::setInt(CMD_SET_PTZ_PWR_ENABLE, 1); +#endif +#else GpioControl::setInt(CMD_SET_PIC1_POWER, 1); GpioControl::setInt(CMD_SET_485_EN4, 1); +#endif // GpioControl::setInt(CMD_SET_CAM_3V3_EN_STATE, 1); // 打开3.3V电压 // GpioControl::setInt(CMD_SET_3V3_PWR_ENABLE, 1); -#ifndef USING_N938 - GpioControl::setInt(CMD_SET_PTZ_PWR_ENABLE, 1); -#endif } if(sensortype == WEATHER_SENSOR_OPEN || sensortype == ICETHICK_SENSOR_OPEN) { +#ifndef USING_N938 +#else GpioControl::setInt(CMD_SET_WTH_POWER, 1); GpioControl::setInt(CMD_SET_485_EN3, 1); +#endif } if(sensortype == ICETHICK_SENSOR_OPEN) { +#ifndef USING_N938 +#else GpioControl::setInt(CMD_SET_PULL_POWER, 1); GpioControl::setInt(CMD_SET_ANGLE_POWER, 1); GpioControl::setInt(CMD_SET_485_EN1, 1); GpioControl::setInt(CMD_SET_485_EN0, 1); +#endif } if(sensortype == OTHER_SENSOR) { +#ifndef USING_N938 +#else GpioControl::setInt(CMD_SET_OTHER_POWER, 1); GpioControl::setInt(CMD_SET_485_EN2, 1); +#endif } return 0; } @@ -3285,7 +3304,11 @@ bool CPhoneDevice::CloseSensors(int sensortype) GpioControl::setRS485Enable(false); // GpioControl::setInt(CMD_SET_485_EN_STATE, 0); #ifndef USING_N938 +#ifndef USING_PLZ + GpioControl::setInt(CMD_SET_485_EN_STATE, 0); +#else GpioControl::setInt(CMD_SET_485_ENABLE, 0); +#endif #else GpioControl::setInt(CMD_SPI2SERIAL_POWER_EN, 0); GpioControl::setInt(CMD_RS485_3V3_EN, 0); @@ -3294,30 +3317,45 @@ bool CPhoneDevice::CloseSensors(int sensortype) } if(sensortype == CAMERA_SENSOR_OPEN) { +#ifdef USING_N938 GpioControl::setInt(CMD_SET_PIC1_POWER, 0); GpioControl::setInt(CMD_SET_485_EN4, 0); // GpioControl::setInt(CMD_SET_CAM_3V3_EN_STATE, 0); +#endif + #ifndef USING_N938 - GpioControl::setInt(CMD_SET_3V3_PWR_ENABLE, 0); + // GpioControl::setInt(CMD_SET_3V3_PWR_ENABLE, 0); + #ifndef USING_PLZ + #else GpioControl::setInt(CMD_SET_PTZ_PWR_ENABLE, 0); + #endif #endif } if(sensortype == WEATHER_SENSOR_OPEN || sensortype == ICETHICK_SENSOR_OPEN) { +#ifndef USING_N938 +#else GpioControl::setInt(CMD_SET_WTH_POWER, 0); GpioControl::setInt(CMD_SET_485_EN3, 0); +#endif } if(sensortype == ICETHICK_SENSOR_OPEN) { +#ifndef USING_N938 +#else GpioControl::setInt(CMD_SET_PULL_POWER, 0); GpioControl::setInt(CMD_SET_ANGLE_POWER, 0); GpioControl::setInt(CMD_SET_485_EN1, 0); GpioControl::setInt(CMD_SET_485_EN0, 0); +#endif } if(sensortype == OTHER_SENSOR) { +#ifndef USING_N938 +#else GpioControl::setInt(CMD_SET_OTHER_POWER, 0); GpioControl::setInt(CMD_SET_485_EN2, 0); +#endif } return 0; } diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index d4bca25a..da58ed3a 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -706,7 +706,10 @@ char Gm_GetSensorsPowerState(int port) void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) { int i; - char szbuf[4096]; + // char szbuf[4096]; + + char* szbuf = new char[4096]; + std::unique_ptr bufptr(szbuf); memset(szbuf, 0, sizeof(szbuf)); if (NULL != describe) @@ -743,7 +746,8 @@ void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) void Gm_OpenSerialPort(int devidx) { int fd = -1; - char szbuf[512]; + char* szbuf = new char[512]; + std::unique_ptr bufptr(szbuf); if ((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM)) return; @@ -792,7 +796,8 @@ void Gm_CloseSerialPort() int GM_SerialComSend(unsigned char * cSendBuf, size_t nSendLen, int commid) { int i, len; - char szbuf[512]; + char* szbuf = new char[512]; + std::unique_ptr bufptr(szbuf); memset(szbuf, 0, sizeof(szbuf)); len = write(serialport[commid].fd, cSendBuf, (size_t)nSendLen);/* 向串囗发送字符串 */ @@ -1700,7 +1705,9 @@ void GM_IsCloseSensors() void GM_AllSerialComRecv() { int i, j, recvlen; - u_char recvbuf[RECVDATA_MAXLENTH]; + u_char* recvbuf = new u_char[RECVDATA_MAXLENTH]; + std::unique_ptr recvbufptr(recvbuf); + char buf[256]; for (j = 0; j < MAX_SERIAL_PORT_NUM; j++) @@ -1732,7 +1739,7 @@ void GM_AllSerialComRecv() int GM_CloseTimer() { int i, j, iretime; - char buf[256]; + char buf[32]; for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) { @@ -1810,7 +1817,17 @@ int SaveLogTofile(int commid, char *szbuf) { int status; time_t now; - char filename[512], filedir[512], buf[128]; + + // char filename[512], filedir[512], buf[128]; + + char* filename = new char[512]; + char* filedir = new char[512]; + char* buf = new char[128]; + + std::unique_ptr fnptr(filename); + std::unique_ptr fdptr(filedir); + std::unique_ptr bufptr(buf); + FILE *fp = NULL; struct tm t0; struct timeval tv; @@ -1856,7 +1873,7 @@ int SaveImageDataTofile(int devno) u_char *image = NULL, *tempphoto = NULL; int i, status; size_t len; - char filename[512]/*, filedir[512]*/, szbuf[128]; + char szbuf[32]; FILE *fp = NULL; SERIAL_DEV_DEF *pPortParam; @@ -3394,7 +3411,8 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) time_t now = time(NULL); DIR *dir = opendir(path); struct dirent *entry; - char szbuf[1024]; + char* szbuf = new char[1024]; + std::unique_ptr szbufptr(szbuf); char fullpath[256]; memset(szbuf, 0, sizeof(szbuf)); From a7e4fabe13d535df301bf748912a84014327789f Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 20 Nov 2024 13:39:11 +0800 Subject: [PATCH 02/25] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=92=8C=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/CvText.cpp | 4 ++-- app/src/main/cpp/PhoneDevice.cpp | 2 +- app/src/main/cpp/camera2/ndkcamera.cpp | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/CvText.cpp b/app/src/main/cpp/CvText.cpp index 39be43a9..d17187e7 100644 --- a/app/src/main/cpp/CvText.cpp +++ b/app/src/main/cpp/CvText.cpp @@ -371,7 +371,7 @@ namespace cv { delete userData; #if defined(USING_HB) hb_buffer_destroy(hb_buffer); -#endif 0 +#endif // 0 } // https://freetype.org/freetype2/docs/tutorial/example2.cpp @@ -630,7 +630,7 @@ namespace cv { #if defined(USING_HB) hb_buffer_destroy(hb_buffer); -#endif 0 +#endif // 0 } Size FreeType2Impl::getTextSize( diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 8110bda2..4a74d909 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -2122,7 +2122,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi int32_t planeCount = 0; mstatus = AImage_getNumberOfPlanes(spImage.get(), &planeCount); - AASSERT(status == AMEDIA_OK && planeCount == 1, "Error: getNumberOfPlanes() planeCount = %d", planeCount); + AASSERT(mstatus == AMEDIA_OK && planeCount == 1, "Error: getNumberOfPlanes() planeCount = %d", planeCount); uint8_t *planeData = NULL; int planeDataLen = 0; diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 5386fe90..57fa9a15 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -2328,6 +2328,8 @@ bool NdkCamera::convertAImageToNv21(AImage* image, uint8_t** nv21, int32_t& widt } } + + return true; } void NdkCamera::EnumCameraResult(ACameraMetadata* result, CAPTURE_RESULT& captureResult) From 265329068208082e18581d643d54ccd7b5eb60f8 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 20 Nov 2024 14:25:25 +0800 Subject: [PATCH 03/25] =?UTF-8?q?=E5=9B=9E=E9=80=80=209e260d2b936e3385e46c?= =?UTF-8?q?6d0f9f78dd10175db920?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/SensorsProtocol.cpp | 2592 +++++++++++++------------- 1 file changed, 1287 insertions(+), 1305 deletions(-) diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index da58ed3a..63297bb7 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -510,38 +510,38 @@ int serial_port_comm() static speed_t getBaudrate(unsigned int baudrate) { switch (baudrate) { - case 0: return B0; - case 50: return B50; - case 75: return B75; - case 110: return B110; - case 134: return B134; - case 150: return B150; - case 200: return B200; - case 300: return B300; - case 600: return B600; - case 1200: return B1200; - case 1800: return B1800; - case 2400: return B2400; - case 4800: return B4800; - case 9600: return B9600; - case 19200: return B19200; - case 38400: return B38400; - case 57600: return B57600; - case 115200: return B115200; - case 230400: return B230400; - case 460800: return B460800; - case 500000: return B500000; - case 576000: return B576000; - case 921600: return B921600; - case 1000000: return B1000000; - case 1152000: return B1152000; - case 1500000: return B1500000; - case 2000000: return B2000000; - case 2500000: return B2500000; - case 3000000: return B3000000; - case 3500000: return B3500000; - case 4000000: return B4000000; - default: return B9600; + case 0: return B0; + case 50: return B50; + case 75: return B75; + case 110: return B110; + case 134: return B134; + case 150: return B150; + case 200: return B200; + case 300: return B300; + case 600: return B600; + case 1200: return B1200; + case 1800: return B1800; + case 2400: return B2400; + case 4800: return B4800; + case 9600: return B9600; + case 19200: return B19200; + case 38400: return B38400; + case 57600: return B57600; + case 115200: return B115200; + case 230400: return B230400; + case 460800: return B460800; + case 500000: return B500000; + case 576000: return B576000; + case 921600: return B921600; + case 1000000: return B1000000; + case 1152000: return B1152000; + case 1500000: return B1500000; + case 2000000: return B2000000; + case 2500000: return B2500000; + case 3000000: return B3000000; + case 3500000: return B3500000; + case 4000000: return B4000000; + default: return B9600; } } @@ -706,10 +706,7 @@ char Gm_GetSensorsPowerState(int port) void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) { int i; - // char szbuf[4096]; - - char* szbuf = new char[4096]; - std::unique_ptr bufptr(szbuf); + char szbuf[4096]; memset(szbuf, 0, sizeof(szbuf)); if (NULL != describe) @@ -721,24 +718,24 @@ void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) SaveLogTofile(commid, szbuf); switch (flag) { - case 'E': - ALOGE("%s", szbuf); - break; - case 'I': - ALOGI("%s", szbuf); - break; - case 'D': - ALOGD("%s", szbuf); - break; - case 'V': - ALOGI("%s", szbuf); - break; - case 'W': - ALOGW("%s", szbuf); - break; - default: - ALOGI("%s", szbuf); - break; + case 'E': + ALOGE("%s", szbuf); + break; + case 'I': + ALOGI("%s", szbuf); + break; + case 'D': + ALOGD("%s", szbuf); + break; + case 'V': + ALOGI("%s", szbuf); + break; + case 'W': + ALOGW("%s", szbuf); + break; + default: + ALOGI("%s", szbuf); + break; } } @@ -746,8 +743,7 @@ void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) void Gm_OpenSerialPort(int devidx) { int fd = -1; - char* szbuf = new char[512]; - std::unique_ptr bufptr(szbuf); + char szbuf[512]; if ((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM)) return; @@ -796,8 +792,7 @@ void Gm_CloseSerialPort() int GM_SerialComSend(unsigned char * cSendBuf, size_t nSendLen, int commid) { int i, len; - char* szbuf = new char[512]; - std::unique_ptr bufptr(szbuf); + char szbuf[512]; memset(szbuf, 0, sizeof(szbuf)); len = write(serialport[commid].fd, cSendBuf, (size_t)nSendLen);/* 向串囗发送字符串 */ @@ -1054,36 +1049,36 @@ void Gm_InitSerialComm(SENSOR_PARAM *sensorParam, char *filedir) memset(szbuf, 0, sizeof(szbuf)); switch (sensorParam[i].SensorsType) { - case 0: - sprintf(szbuf, "传感器%d没有接!", i + 1); - break; - case WEATHER_PROTOCOL: - sprintf(szbuf, "传感器%d接的是气象传感器!", i + 1); - break; - case SERIALCAMERA_PROTOCOL: - sprintf(szbuf, "传感器%d接的是串口摄像机!", i + 1); - break; - case PELCO_P_PROTOCOL: - sprintf(szbuf, "传感器%d接的是PELCO_P摄像机!", i + 1); - break; - case SLANT_PROTOCOL: - sprintf(szbuf, "传感器%d接的是倾角!", i + 1); - break; - case WIND_PROTOCOL: - sprintf(szbuf, "传感器%d接的是风速风向传感器", i + 1); - break; - case RALLY_PROTOCOL: - sprintf(szbuf, "传感器%d接的是拉力!", i + 1); - break; - case PELCO_D_PROTOCOL: - sprintf(szbuf, "传感器%d接的是PELCO_D摄像机!", i + 1); - break; - case RESERVE5_PROTOCOL: - sprintf(szbuf, "传感器%d接的是加密芯片", i + 1); - break; - default: - sprintf(szbuf, "传感器%d没有接!", i + 1); - break; + case 0: + sprintf(szbuf, "传感器%d没有接!", i + 1); + break; + case WEATHER_PROTOCOL: + sprintf(szbuf, "传感器%d接的是气象传感器!", i + 1); + break; + case SERIALCAMERA_PROTOCOL: + sprintf(szbuf, "传感器%d接的是串口摄像机!", i + 1); + break; + case PELCO_P_PROTOCOL: + sprintf(szbuf, "传感器%d接的是PELCO_P摄像机!", i + 1); + break; + case SLANT_PROTOCOL: + sprintf(szbuf, "传感器%d接的是倾角!", i + 1); + break; + case WIND_PROTOCOL: + sprintf(szbuf, "传感器%d接的是风速风向传感器", i + 1); + break; + case RALLY_PROTOCOL: + sprintf(szbuf, "传感器%d接的是拉力!", i + 1); + break; + case PELCO_D_PROTOCOL: + sprintf(szbuf, "传感器%d接的是PELCO_D摄像机!", i + 1); + break; + case RESERVE5_PROTOCOL: + sprintf(szbuf, "传感器%d接的是加密芯片", i + 1); + break; + default: + sprintf(szbuf, "传感器%d没有接!", i + 1); + break; } sprintf(szbuf, "%s 地址%d!;", szbuf, sensorParam[i].devaddr); @@ -1241,37 +1236,37 @@ void FindDevUseSerialCommNo() continue; switch (devparam[i].ProtocolIdx) { - case WEATHER_PROTOCOL: - case WIND_PROTOCOL: - //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); - /* 目前还不确定具体串口分配,暂时默认使用串口1*/ - //sprintf(devparam[i].pathname, "/dev/swk3"); - devparam[i].commid = 3; - break; - case SLANT_PROTOCOL: - //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); - /* 目前还不确定具体串口分配,暂时默认使用串口1*/ - //sprintf(devparam[i].pathname, "/dev/swk2"); - devparam[i].commid = 2; - break; - case RALLY_PROTOCOL: - //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); - /* 目前还不确定具体串口分配,暂时默认使用串口1*/ - //sprintf(devparam[i].pathname, "/dev/swk1"); - devparam[i].commid = 1; - break; - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); - /* 目前还不确定//具体串口分配,暂时默认使用串口1*/ - //sprintf(devparam[i].pathname, "/dev/ttyS1"); - devparam[i].commid = 0; - srdt.camerauseserial = 0; - break; - default: - devparam[i].IsNoInsta = 0; - break; + case WEATHER_PROTOCOL: + case WIND_PROTOCOL: + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定具体串口分配,暂时默认使用串口1*/ + //sprintf(devparam[i].pathname, "/dev/swk3"); + devparam[i].commid = 3; + break; + case SLANT_PROTOCOL: + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定具体串口分配,暂时默认使用串口1*/ + //sprintf(devparam[i].pathname, "/dev/swk2"); + devparam[i].commid = 2; + break; + case RALLY_PROTOCOL: + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定具体串口分配,暂时默认使用串口1*/ + //sprintf(devparam[i].pathname, "/dev/swk1"); + devparam[i].commid = 1; + break; + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + //memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); + /* 目前还不确定//具体串口分配,暂时默认使用串口1*/ + //sprintf(devparam[i].pathname, "/dev/ttyS1"); + devparam[i].commid = 0; + srdt.camerauseserial = 0; + break; + default: + devparam[i].IsNoInsta = 0; + break; } } } @@ -1333,46 +1328,46 @@ void GM_StartSerialComm() memset(szbuf, 0, sizeof(szbuf)); switch (devparam[i].ProtocolIdx) { - case WEATHER_PROTOCOL: // 气象 - sprintf(szbuf, "气象"); - srdt.ms_dev[i].IsNeedSerial = 1; - srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); - srdt.ms_dev[i].recvdatacnt = 0; - for (j = 0; j < WEATHER_DATA_NUM; j++) - srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; - break; - case RALLY_PROTOCOL: /* 拉力*/ - sprintf(szbuf, "拉力"); - srdt.ms_dev[i].IsNeedSerial = 1; - srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); - srdt.ms_dev[i].recvdatacnt = 0; - for (j = 0; j < RALLY_DATA_NUM; j++) - srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; - break; - case WIND_PROTOCOL: /* 风速风向*/ - sprintf(szbuf, "风速风向"); - srdt.ms_dev[i].IsNeedSerial = 1; - srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); - for (j = 0; j < WEATHER_DATA_NUM; j++) - srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; - break; - case SLANT_PROTOCOL: /* 倾角*/ - sprintf(szbuf, "倾角"); - srdt.ms_dev[i].IsNeedSerial = 1; - srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); - srdt.ms_dev[i].recvdatacnt = 0; - for (j = 0; j < SLANTANGLE_DATA_NUM; j++) - srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; - break; - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - sprintf(szbuf, "摄像机"); - break; - default: - srdt.ms_dev[i].IsNeedSerial = 0; - sprintf(szbuf, "无效传感器"); - break; + case WEATHER_PROTOCOL: // 气象 + sprintf(szbuf, "气象"); + srdt.ms_dev[i].IsNeedSerial = 1; + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.ms_dev[i].recvdatacnt = 0; + for (j = 0; j < WEATHER_DATA_NUM; j++) + srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; + break; + case RALLY_PROTOCOL: /* 拉力*/ + sprintf(szbuf, "拉力"); + srdt.ms_dev[i].IsNeedSerial = 1; + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.ms_dev[i].recvdatacnt = 0; + for (j = 0; j < RALLY_DATA_NUM; j++) + srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; + break; + case WIND_PROTOCOL: /* 风速风向*/ + sprintf(szbuf, "风速风向"); + srdt.ms_dev[i].IsNeedSerial = 1; + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + for (j = 0; j < WEATHER_DATA_NUM; j++) + srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; + break; + case SLANT_PROTOCOL: /* 倾角*/ + sprintf(szbuf, "倾角"); + srdt.ms_dev[i].IsNeedSerial = 1; + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.ms_dev[i].recvdatacnt = 0; + for (j = 0; j < SLANTANGLE_DATA_NUM; j++) + srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE; + break; + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + sprintf(szbuf, "摄像机"); + break; + default: + srdt.ms_dev[i].IsNeedSerial = 0; + sprintf(szbuf, "无效传感器"); + break; } // 测试查询传感器电源状态 #if 0 @@ -1480,44 +1475,44 @@ void GM_StartSerialCameraPhoto(uint8_t channel, int cmdidx) memset(szbuf, 0, sizeof(szbuf)); switch (devparam[i].ProtocolIdx) { - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - if ((1 > devparam[i].CameraChannel) || (devparam[i].CameraChannel > MAX_CHANNEL_NUM)) - { - srdt.ms_dev[i].IsNeedSerial = 0; - break; - } - if (channel == devparam[i].CameraChannel) - { - ; - } - else + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + if ((1 > devparam[i].CameraChannel) || (devparam[i].CameraChannel > MAX_CHANNEL_NUM)) + { + srdt.ms_dev[i].IsNeedSerial = 0; + break; + } + if (channel == devparam[i].CameraChannel) + { + ; + } + else + break; + if (0 == srdt.ms_dev[i].IsNeedSerial) + srdt.iLastGetPhotoNo = -1; + else + srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx; + srdt.ms_dev[i].IsNeedSerial = 1; + if (0 == cmdidx) + srdt.ms_dev[i].image.state = SER_STARTSAMPLE; + if ((0 == cmdidx) && (srdt.presetno > 0)) + { + srdt.ms_dev[i].SerialCmdidx = 10017; + srdt.iLastGetPhotoNo = cmdidx; + } + else + srdt.ms_dev[i].SerialCmdidx = cmdidx; + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + srdt.sendphotocmdcnt = 0; + sprintf(szbuf, "摄像机"); + flag = 1; break; - if (0 == srdt.ms_dev[i].IsNeedSerial) - srdt.iLastGetPhotoNo = -1; - else - srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx; - srdt.ms_dev[i].IsNeedSerial = 1; - if (0 == cmdidx) - srdt.ms_dev[i].image.state = SER_STARTSAMPLE; - if ((0 == cmdidx) && (srdt.presetno > 0)) - { - srdt.ms_dev[i].SerialCmdidx = 10017; - srdt.iLastGetPhotoNo = cmdidx; - } - else - srdt.ms_dev[i].SerialCmdidx = cmdidx; - srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); - srdt.sendphotocmdcnt = 0; - sprintf(szbuf, "摄像机"); - flag = 1; - break; - default: - if (1 == srdt.ms_dev[i].IsNeedSerial) + default: + if (1 == srdt.ms_dev[i].IsNeedSerial) + break; + srdt.ms_dev[i].IsNeedSerial = 0; break; - srdt.ms_dev[i].IsNeedSerial = 0; - break; } if (1 == srdt.ms_dev[i].IsNeedSerial) { @@ -1598,22 +1593,22 @@ void Gm_FindAllSensorsCommand() flag = -1; switch (devparam[curidx].ProtocolIdx) { - case WEATHER_PROTOCOL: /* 温湿度气压*/ - case RALLY_PROTOCOL: /* 拉力*/ - case WIND_PROTOCOL: /* 风速风向*/ - case SLANT_PROTOCOL: /* 倾角*/ - flag = FindNextShxyProtocolCommand(curidx); - break; - case RESERVE2_PROTOCOL: - break; - case RESERVE5_PROTOCOL: - break; - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - flag = FindNextCameraPhotoCommand(curidx); - break; - break; + case WEATHER_PROTOCOL: /* 温湿度气压*/ + case RALLY_PROTOCOL: /* 拉力*/ + case WIND_PROTOCOL: /* 风速风向*/ + case SLANT_PROTOCOL: /* 倾角*/ + flag = FindNextShxyProtocolCommand(curidx); + break; + case RESERVE2_PROTOCOL: + break; + case RESERVE5_PROTOCOL: + break; + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + flag = FindNextCameraPhotoCommand(curidx); + break; + break; } if (flag == -1) continue; @@ -1646,51 +1641,51 @@ void GM_IsCloseSensors() memset(buf, 0, sizeof(buf)); switch (devparam[i].ProtocolIdx) { - case WEATHER_PROTOCOL: /* 气象*/ - case RALLY_PROTOCOL: /* 拉力*/ - case WIND_PROTOCOL: /* 风速风向*/ - case SLANT_PROTOCOL: /* 倾角*/ - if ((lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 50 * 1000) || (lctime - srdt.ms_dev[i].FirstCmdTimeCnt < 0)) - { - srdt.ms_dev[i].FirstCmdTimeCnt = lctime; - break; - } - if (lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 15 * 1000) - { - srdt.ms_dev[i].IsNeedSerial = 0; - // 关闭传感器电源 - sprintf(buf, "读取装置%d数据%0.3f秒,关闭装置%d电源!", i + 1, (get_msec() - srdt.ms_dev[i].FirstCmdTimeCnt) / 1000.0, i + 1); - DebugLog(devparam[i].commid, buf, 'I'); - for (j = 0; j < MAX_DEV_VALUE_NUM; j++) + case WEATHER_PROTOCOL: /* 气象*/ + case RALLY_PROTOCOL: /* 拉力*/ + case WIND_PROTOCOL: /* 风速风向*/ + case SLANT_PROTOCOL: /* 倾角*/ + if ((lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 50 * 1000) || (lctime - srdt.ms_dev[i].FirstCmdTimeCnt < 0)) { - if (SER_STARTSAMPLE == srdt.ms_dev[i].aiValue[j].AiState) - srdt.ms_dev[i].aiValue[j].AiState = SER_SAMPLEFAIL; - else if (SER_SAMPLE == srdt.ms_dev[i].aiValue[j].AiState) - srdt.ms_dev[i].aiValue[j].AiState = SAMPLINGSUCCESS; + srdt.ms_dev[i].FirstCmdTimeCnt = lctime; + break; } - for (j = 0; j < WEATHER_DATA_NUM; j++) + if (lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 15 * 1000) { - if (SER_STARTSAMPLE == weatherpntmsg[j].AiState) - weatherpntmsg[j].AiState = SER_SAMPLEFAIL; - else if (SER_SAMPLE == weatherpntmsg[j].AiState) - weatherpntmsg[j].AiState = SAMPLINGSUCCESS; + srdt.ms_dev[i].IsNeedSerial = 0; + // 关闭传感器电源 + sprintf(buf, "读取装置%d数据%0.3f秒,关闭装置%d电源!", i + 1, (get_msec() - srdt.ms_dev[i].FirstCmdTimeCnt) / 1000.0, i + 1); + DebugLog(devparam[i].commid, buf, 'I'); + for (j = 0; j < MAX_DEV_VALUE_NUM; j++) + { + if (SER_STARTSAMPLE == srdt.ms_dev[i].aiValue[j].AiState) + srdt.ms_dev[i].aiValue[j].AiState = SER_SAMPLEFAIL; + else if (SER_SAMPLE == srdt.ms_dev[i].aiValue[j].AiState) + srdt.ms_dev[i].aiValue[j].AiState = SAMPLINGSUCCESS; + } + for (j = 0; j < WEATHER_DATA_NUM; j++) + { + if (SER_STARTSAMPLE == weatherpntmsg[j].AiState) + weatherpntmsg[j].AiState = SER_SAMPLEFAIL; + else if (SER_SAMPLE == weatherpntmsg[j].AiState) + weatherpntmsg[j].AiState = SAMPLINGSUCCESS; + } } - } - break; - case PELCO_D_PROTOCOL: /* 摄像机类型*/ - case PELCO_P_PROTOCOL: /* 摄像机类型*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - if (-1 == srdt.ms_dev[i].SerialCmdidx) - { - if ((SER_STARTSAMPLE == srdt.ms_dev[i].image.state) || (SER_SAMPLE == srdt.ms_dev[i].image.state)) - srdt.ms_dev[i].image.state = SER_SAMPLEFAIL; - else if (PHOTO_SAVE_SUCC == srdt.ms_dev[i].image.state) - srdt.ms_dev[i].image.state = SAMPLINGSUCCESS; - srdt.ms_dev[i].IsNeedSerial = 0; - sprintf(buf, "通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); - DebugLog(devparam[i].commid, buf, 'I'); - } - break; + break; + case PELCO_D_PROTOCOL: /* 摄像机类型*/ + case PELCO_P_PROTOCOL: /* 摄像机类型*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + if (-1 == srdt.ms_dev[i].SerialCmdidx) + { + if ((SER_STARTSAMPLE == srdt.ms_dev[i].image.state) || (SER_SAMPLE == srdt.ms_dev[i].image.state)) + srdt.ms_dev[i].image.state = SER_SAMPLEFAIL; + else if (PHOTO_SAVE_SUCC == srdt.ms_dev[i].image.state) + srdt.ms_dev[i].image.state = SAMPLINGSUCCESS; + srdt.ms_dev[i].IsNeedSerial = 0; + sprintf(buf, "通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel); + DebugLog(devparam[i].commid, buf, 'I'); + } + break; } } } @@ -1705,9 +1700,7 @@ void GM_IsCloseSensors() void GM_AllSerialComRecv() { int i, j, recvlen; - u_char* recvbuf = new u_char[RECVDATA_MAXLENTH]; - std::unique_ptr recvbufptr(recvbuf); - + u_char recvbuf[RECVDATA_MAXLENTH]; char buf[256]; for (j = 0; j < MAX_SERIAL_PORT_NUM; j++) @@ -1739,7 +1732,7 @@ void GM_AllSerialComRecv() int GM_CloseTimer() { int i, j, iretime; - char buf[32]; + char buf[256]; for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) { @@ -1769,19 +1762,19 @@ void SerialDataProcess(int devidx, u_char *buf, int len) switch (devparam[devidx].ProtocolIdx) { - case WEATHER_PROTOCOL: /* 气象*/ - case RALLY_PROTOCOL: /* 拉力*/ - case WIND_PROTOCOL: /* 风速风向*/ - case SLANT_PROTOCOL: /* 倾角*/ - ShxyProtocolRecvData(devidx, buf, len); - break; - case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ - break; - case PELCO_D_PROTOCOL: /* 摄像机协议*/ - case PELCO_P_PROTOCOL: /* 摄像机协议*/ - case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ - CameraRecvData(devidx, buf, len); - break; + case WEATHER_PROTOCOL: /* 气象*/ + case RALLY_PROTOCOL: /* 拉力*/ + case WIND_PROTOCOL: /* 风速风向*/ + case SLANT_PROTOCOL: /* 倾角*/ + ShxyProtocolRecvData(devidx, buf, len); + break; + case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ + break; + case PELCO_D_PROTOCOL: /* 摄像机协议*/ + case PELCO_P_PROTOCOL: /* 摄像机协议*/ + case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ + CameraRecvData(devidx, buf, len); + break; } } @@ -1792,24 +1785,24 @@ void DebugLog(int commid, char *szbuf, char flag) SaveLogTofile(commid, szbuf); switch (flag) { - case 'E': - ALOGE("%s", szbuf); - break; - case 'I': - ALOGI("%s", szbuf); - break; - case 'D': - ALOGD("%s", szbuf); - break; - case 'V': - ALOGI("%s", szbuf); - break; - case 'W': - ALOGW("%s", szbuf); - break; - default: - ALOGI("%s", szbuf); - break; + case 'E': + ALOGE("%s", szbuf); + break; + case 'I': + ALOGI("%s", szbuf); + break; + case 'D': + ALOGD("%s", szbuf); + break; + case 'V': + ALOGI("%s", szbuf); + break; + case 'W': + ALOGW("%s", szbuf); + break; + default: + ALOGI("%s", szbuf); + break; } } @@ -1817,17 +1810,7 @@ int SaveLogTofile(int commid, char *szbuf) { int status; time_t now; - - // char filename[512], filedir[512], buf[128]; - - char* filename = new char[512]; - char* filedir = new char[512]; - char* buf = new char[128]; - - std::unique_ptr fnptr(filename); - std::unique_ptr fdptr(filedir); - std::unique_ptr bufptr(buf); - + char filename[512], filedir[512], buf[128]; FILE *fp = NULL; struct tm t0; struct timeval tv; @@ -1873,7 +1856,7 @@ int SaveImageDataTofile(int devno) u_char *image = NULL, *tempphoto = NULL; int i, status; size_t len; - char szbuf[32]; + char filename[512]/*, filedir[512]*/, szbuf[128]; FILE *fp = NULL; SERIAL_DEV_DEF *pPortParam; @@ -1941,78 +1924,78 @@ void CameraRecvData(int devno, u_char *buf, int len) { switch (pPortParam->m_iRevStatus) { - case 0: // 0x68 - pPortParam->m_iRecvLen = 0; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if (0x68 == buf[i]) + case 0: // 0x68 + pPortParam->m_iRecvLen = 0; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; + break; + case 1: // len1 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 1: // len1 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus++; - break; - case 2: // len2 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus++; - pPortParam->m_iNeedRevLength = pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] * 256 + buf[i] + 5; - break; - case 3: // 0x68 - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iNeedRevLength--; - if (0x68 == buf[i]) + break; + case 2: // len2 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; pPortParam->m_iRevStatus++; - else - pPortParam->m_iRevStatus = 18; - break; - case 4: // 正确接收数据 - pPortParam->m_iNeedRevLength--; - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if (pPortParam->m_iNeedRevLength > 0) + pPortParam->m_iNeedRevLength = pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] * 256 + buf[i] + 5; break; - if (buf[i] != 0x16) - { - pPortParam->m_iRevStatus = 18; + case 3: // 0x68 + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iNeedRevLength--; + if (0x68 == buf[i]) + pPortParam->m_iRevStatus++; + else + pPortParam->m_iRevStatus = 18; break; - } + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iNeedRevLength > 0) + break; + if (buf[i] != 0x16) + { + pPortParam->m_iRevStatus = 18; + break; + } - if (pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] == - CalLpc(&pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen - 6)) - { - CameraPhotoPortDataProcess(devno); - pPortParam->m_iRevStatus = 0; - pPortParam->RevCmdFlag = 1; - } - else - { - pPortParam->m_iRevStatus = 0; - } - pPortParam->m_iRecvLen = 0; - break; - case 255:// 错误接收数据 - default: - if (buf[i] == 0x68) - { - pPortParam->m_iRevStatus = 1; - pPortParam->m_iRecvLen = 1; - pPortParam->m_au8RecvBuf[0] = buf[i]; - } - else if (buf[i] == 0x16) - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus = 0; + if (pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] == + CalLpc(&pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen - 6)) + { + CameraPhotoPortDataProcess(devno); + pPortParam->m_iRevStatus = 0; + pPortParam->RevCmdFlag = 1; + } + else + { + pPortParam->m_iRevStatus = 0; + } pPortParam->m_iRecvLen = 0; - } - else - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if (pPortParam->m_iRecvLen > 200) + break; + case 255:// 错误接收数据 + default: + if (buf[i] == 0x68) + { + pPortParam->m_iRevStatus = 1; + pPortParam->m_iRecvLen = 1; + pPortParam->m_au8RecvBuf[0] = buf[i]; + } + else if (buf[i] == 0x16) { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + pPortParam->m_iRevStatus = 0; pPortParam->m_iRecvLen = 0; } - } - break; + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; } } } @@ -2047,173 +2030,173 @@ void CameraPhotoPortDataProcess(int devno) memset(szbuf, 0, sizeof(szbuf)); switch (cmdidx) { - case 0x10: /* 拍照应答*/ - if (0xFF == rtumsg.MsgData[6]) - { - srdt.RephotographCnt++; - if (srdt.RephotographCnt > 2) + case 0x10: /* 拍照应答*/ + if (0xFF == rtumsg.MsgData[6]) { - pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); + srdt.RephotographCnt++; + if (srdt.RephotographCnt > 2) + { + pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); + DebugLog(devparam[devno].commid, szbuf, 'E'); + } + break; } + i = 6; + memset(&pPortParam->image, 0, sizeof(pPortParam->image)); + iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); + srdt.photographtime = iphototime; + pPortParam->image.phototime = iphototime; + i = 10; + img_file_size = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); + packetnum = rtumsg.MsgData[i + 5] + (rtumsg.MsgData[i + 4] << 8); + pPortParam->image.imagelen = img_file_size; + pPortParam->image.imagenum = packetnum; + srdt.imagepacketnum = packetnum; + srdt.historyimagenum[devparam[devno].CameraChannel - 1] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); + sprintf(szbuf, "有%d张历史图片!", srdt.historyimagenum[devparam[devno].CameraChannel - 1]); + DebugLog(devparam[devno].commid, szbuf, 'V'); + presetno = (int)rtumsg.MsgData[i + 8]; + pPortParam->image.presetno = presetno; + pPortParam->image.state = SER_SAMPLE; + curserial->RevCmdFlag = 1; + pPortParam->SerialCmdidx = 1; + srdt.sendphotocmdcnt = 0; break; - } - i = 6; - memset(&pPortParam->image, 0, sizeof(pPortParam->image)); - iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); - srdt.photographtime = iphototime; - pPortParam->image.phototime = iphototime; - i = 10; - img_file_size = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); - packetnum = rtumsg.MsgData[i + 5] + (rtumsg.MsgData[i + 4] << 8); - pPortParam->image.imagelen = img_file_size; - pPortParam->image.imagenum = packetnum; - srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[devno].CameraChannel - 1] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); - sprintf(szbuf, "有%d张历史图片!", srdt.historyimagenum[devparam[devno].CameraChannel - 1]); - DebugLog(devparam[devno].commid, szbuf, 'V'); - presetno = (int)rtumsg.MsgData[i + 8]; - pPortParam->image.presetno = presetno; - pPortParam->image.state = SER_SAMPLE; - curserial->RevCmdFlag = 1; - pPortParam->SerialCmdidx = 1; - srdt.sendphotocmdcnt = 0; - break; - case 0x11: /* 图片数据包*/ - i = 6; - iNo = rtumsg.MsgData[i + 1] + rtumsg.MsgData[i] * 256; - packsize = rtumsg.MsgData[i + 3] + rtumsg.MsgData[i + 2] * 256; - memmove(&pPortParam->image.buf[iNo - 1], &rtumsg.MsgData[i + 4], packsize); - pPortParam->image.ilen[iNo - 1] = packsize; - sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); - DebugLog(devparam[devno].commid, szbuf, 'V'); - curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = get_msec(); - if ((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i + 2])) - { - if (iNo == srdt.imagepacketnum) - { /* 检查是否有漏包*/ - for (pidx = 0; pidx < srdt.imagepacketnum; pidx++) + case 0x11: /* 图片数据包*/ + i = 6; + iNo = rtumsg.MsgData[i + 1] + rtumsg.MsgData[i] * 256; + packsize = rtumsg.MsgData[i + 3] + rtumsg.MsgData[i + 2] * 256; + memmove(&pPortParam->image.buf[iNo - 1], &rtumsg.MsgData[i + 4], packsize); + pPortParam->image.ilen[iNo - 1] = packsize; + sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, srdt.imagepacketnum, packsize); + DebugLog(devparam[devno].commid, szbuf, 'V'); + curserial->RevCmdFlag = 1; + pPortParam->FirstCmdTimeCnt = get_msec(); + if ((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i + 2])) + { + if (iNo == srdt.imagepacketnum) + { /* 检查是否有漏包*/ + for (pidx = 0; pidx < srdt.imagepacketnum; pidx++) + { + if (pPortParam->image.ilen[pidx] < 1) + break; + } + if (pidx < srdt.imagepacketnum) + { + iNo = pidx; + recvend = 0; + } + else + { + if ((1 == SaveImageDataTofile(devno)) && (SER_SAMPLE == pPortParam->image.state)) + pPortParam->image.state = PHOTO_SAVE_SUCC; + recvend = 1; + } + } + else + recvend = 0; + + if (packsize > MAX_PHOTO_FRAME_LEN) + recvend = 0xFF; + + if (1 == recvend) { - if (pPortParam->image.ilen[pidx] < 1) - break; + pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ + //pPortParam->image.lastlen = packsize; } - if (pidx < srdt.imagepacketnum) + else if (0xFF == recvend) { - iNo = pidx; - recvend = 0; + pPortParam->SerialCmdidx = -1; } else { - if ((1 == SaveImageDataTofile(devno)) && (SER_SAMPLE == pPortParam->image.state)) - pPortParam->image.state = PHOTO_SAVE_SUCC; - recvend = 1; + if ((iNo > srdt.imagepacketnum) || (0 >= srdt.imagepacketnum)) + { + pPortParam->SerialCmdidx = -1; + } + else + pPortParam->SerialCmdidx = iNo + 1; } + srdt.errorPhotoNoCnt = 0; + break; } - else - recvend = 0; - - if (packsize > MAX_PHOTO_FRAME_LEN) - recvend = 0xFF; - - if (1 == recvend) - { - pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ - //pPortParam->image.lastlen = packsize; - } - else if (0xFF == recvend) - { - pPortParam->SerialCmdidx = -1; - } - else + srdt.errorPhotoNoCnt++; + sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", + pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); + DebugLog(devparam[devno].commid, szbuf, 'E'); + if (srdt.errorPhotoNoCnt > 5) { - if ((iNo > srdt.imagepacketnum) || (0 >= srdt.imagepacketnum)) + pPortParam->SerialCmdidx = 0; + srdt.RephotographCnt++; + if (srdt.RephotographCnt > 2) { pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); + DebugLog(devparam[devno].commid, szbuf, 'E'); } - else - pPortParam->SerialCmdidx = iNo + 1; } - srdt.errorPhotoNoCnt = 0; break; - } - srdt.errorPhotoNoCnt++; - sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", - pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); - if (srdt.errorPhotoNoCnt > 5) - { - pPortParam->SerialCmdidx = 0; - srdt.RephotographCnt++; - if (srdt.RephotographCnt > 2) + case 0x03: + sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); + DebugLog(devparam[devno].commid, szbuf, 'D'); + pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + curserial->RevCmdFlag = 1; + pPortParam->FirstCmdTimeCnt = get_msec(); + break; + case 0x15: + if (0xFF == rtumsg.MsgData[6]) { pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt); - DebugLog(devparam[devno].commid, szbuf, 'E'); + sprintf(szbuf, "没有历史图片!结束读取图片!"); + DebugLog(devparam[devno].commid, szbuf, 'I'); + break; } - } - break; - case 0x03: - sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate); - DebugLog(devparam[devno].commid, szbuf, 'D'); - pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - curserial->RevCmdFlag = 1; - pPortParam->FirstCmdTimeCnt = get_msec(); - break; - case 0x15: - if (0xFF == rtumsg.MsgData[6]) - { - pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "没有历史图片!结束读取图片!"); + i = 6; + iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); + srdt.photographtime = iphototime; + pPortParam->image.phototime = iphototime; + i = 10; + img_file_size = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); + packetnum = rtumsg.MsgData[i + 5] + (rtumsg.MsgData[i + 4] << 8); + pPortParam->image.imagelen = img_file_size; + pPortParam->image.imagenum = packetnum; + srdt.imagepacketnum = packetnum; + srdt.historyimagenum[devparam[devno].CameraChannel - 1] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); + presetno = rtumsg.MsgData[i + 8]; + pPortParam->image.presetno = presetno; + sprintf(szbuf, "读取历史图片,还有%d张历史图片!", srdt.historyimagenum[devparam[devno].CameraChannel - 1]); DebugLog(devparam[devno].commid, szbuf, 'I'); + curserial->RevCmdFlag = 1; + pPortParam->SerialCmdidx = 1; + srdt.sendphotocmdcnt = 0; break; - } - i = 6; - iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); - srdt.photographtime = iphototime; - pPortParam->image.phototime = iphototime; - i = 10; - img_file_size = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24); - packetnum = rtumsg.MsgData[i + 5] + (rtumsg.MsgData[i + 4] << 8); - pPortParam->image.imagelen = img_file_size; - pPortParam->image.imagenum = packetnum; - srdt.imagepacketnum = packetnum; - srdt.historyimagenum[devparam[devno].CameraChannel - 1] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8); - presetno = rtumsg.MsgData[i + 8]; - pPortParam->image.presetno = presetno; - sprintf(szbuf, "读取历史图片,还有%d张历史图片!", srdt.historyimagenum[devparam[devno].CameraChannel - 1]); - DebugLog(devparam[devno].commid, szbuf, 'I'); - curserial->RevCmdFlag = 1; - pPortParam->SerialCmdidx = 1; - srdt.sendphotocmdcnt = 0; - break; - case 0x16: - if (0xFF == rtumsg.MsgData[10]) - { - pPortParam->SerialCmdidx = -1; - sprintf(szbuf, "摄像机图片保存失败!"); - DebugLog(devparam[devno].commid, szbuf, 'E'); - } - pPortParam->SerialCmdidx = -1; - if (0 == rtumsg.MsgData[10]) - { - if (0 == srdt.historyimagenum[devparam[devno].CameraChannel - 1]) + case 0x16: + if (0xFF == rtumsg.MsgData[10]) { - ; + pPortParam->SerialCmdidx = -1; + sprintf(szbuf, "摄像机图片保存失败!"); + DebugLog(devparam[devno].commid, szbuf, 'E'); } - else + pPortParam->SerialCmdidx = -1; + if (0 == rtumsg.MsgData[10]) { - pPortParam->SerialCmdidx = 10003;/* 暂时不实现*/ + if (0 == srdt.historyimagenum[devparam[devno].CameraChannel - 1]) + { + ; + } + else + { + pPortParam->SerialCmdidx = 10003;/* 暂时不实现*/ + } } - } - pPortParam->FirstCmdTimeCnt = get_msec(); - curserial->RevCmdFlag = 1; - break; - default: - curserial->RevCmdFlag = 1; - break; + pPortParam->FirstCmdTimeCnt = get_msec(); + curserial->RevCmdFlag = 1; + break; + default: + curserial->RevCmdFlag = 1; + break; } } @@ -2374,7 +2357,7 @@ int FindNextCameraPhotoCommand(int devidx) 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; + // return -1; if (-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/ return -1; channel = devparam[devidx].CameraChannel; @@ -2393,216 +2376,216 @@ int FindNextCameraPhotoCommand(int devidx) } switch (cmdno) { - case 0:/* 下发拍照指令*/ - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3800) - return -1; - if ((lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 3 * 35 * 1000) || (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 0)) - { - srdt.ms_dev[devidx].FirstCmdTimeCnt = lcurtime; - return -1; - } + case 0:/* 下发拍照指令*/ + if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3800) + return -1; + if ((lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 3 * 35 * 1000) || (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt < 0)) + { + srdt.ms_dev[devidx].FirstCmdTimeCnt = lcurtime; + return -1; + } - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35 * 1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); + if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35 * 1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); + DebugLog(devparam[devidx].commid, szbuf, 'I'); + return -1; + } + memset(szbuf, 0, sizeof(szbuf)); + sprintf(szbuf, "time=%lldms", lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt); DebugLog(devparam[devidx].commid, szbuf, 'I'); - return -1; - } - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "time=%lldms", lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt); - DebugLog(devparam[devidx].commid, szbuf, 'I'); - packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN; - srdt.sendphotocmdcnt++; - srdt.imagepacketnum = 0; - srdt.errorPhotoNoCnt = 0; - cmdidx = 0x10; - imagesize = srdt.bImageSize; - break; - - case 10000: /* 下发设置串口波特率命令*/ - switch (devparam[devidx].baudrate) - { - case B9600: - imagesize = 0x07; + packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN; + srdt.sendphotocmdcnt++; + srdt.imagepacketnum = 0; + srdt.errorPhotoNoCnt = 0; + cmdidx = 0x10; + imagesize = srdt.bImageSize; + break; + + case 10000: /* 下发设置串口波特率命令*/ + switch (devparam[devidx].baudrate) + { + case B9600: + imagesize = 0x07; + break; + case B19200: + imagesize = 0x08; + break; + case B38400: + imagesize = 0x09; + break; + default: + sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); + DebugLog(devparam[devidx].commid, szbuf, 'I'); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return -1; + } + + if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 15 * 1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); + DebugLog(devparam[devidx].commid, szbuf, 'I'); + return -1; + } + cmdidx = 0x03; + packetsize = 0xFFFF; break; - case B19200: - imagesize = 0x08; + + case 10001: /* 通知摄像机图片读取完成或存储(16H)*/ + case 10002: + cmdidx = 0x16; + if (10001 == cmdno) + packetsize = 1; + else + packetsize = 0; + imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/ break; - case B38400: - imagesize = 0x09; + + case 10003: /* 读取历史图片(15H)*/ + cmdidx = 0x15; + packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN; break; - default: - sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!"); - DebugLog(devparam[devidx].commid, szbuf, 'I'); + + case 10005: /* 关闭功能*/ + //Gm_CtrlPtzCmd(1, P_MOVE_LEFT); + //sleep(2); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; srdt.iLastGetPhotoNo = -1; - return -1; - } - - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 15 * 1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "设置串口摄像机参数时,15秒未收到摄像机应答!退出设置!"); - DebugLog(devparam[devidx].commid, szbuf, 'I'); - return -1; - } - cmdidx = 0x03; - packetsize = 0xFFFF; - break; - - case 10001: /* 通知摄像机图片读取完成或存储(16H)*/ - case 10002: - cmdidx = 0x16; - if (10001 == cmdno) - packetsize = 1; - else - packetsize = 0; - imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/ - break; - - case 10003: /* 读取历史图片(15H)*/ - cmdidx = 0x15; - packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN; - break; - - case 10005: /* 关闭功能*/ - //Gm_CtrlPtzCmd(1, P_MOVE_LEFT); - //sleep(2); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - //sleep(20); - return 1; - case 10006: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ - Gm_CtrlPtzCmd(channel, P_Auto_Scan); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10007: /* 光圈缩小(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_IRIS_CLOSE); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10008: /* 光圈放大(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_IRIS_OPEN); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10009: /* 近距离聚焦(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_FOCUS_NEAR); - usleep(100000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10010: /* 远距离聚焦(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_FOCUS_FAR); - usleep(100000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10011: /* 远离物体(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_ZOOM_WIDE); - usleep(100000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10012: /* 接近物体(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_ZOOM_TELE); - usleep(100000); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10013: /* 向下移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_DOWN); - sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10014: /* 向上移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_UP); - sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10015: /* 向左移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_LEFT); - sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10016: /* 向右移动镜头(1 有效)*/ - Gm_CtrlPtzCmd(channel, P_MOVE_RIGHT); - sleep(1); - Gm_CtrlPtzCmd(channel, Cmd_Cancel); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - case 10017: /* 调用预置点*/ - //srdt.presetno = 2; - Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO + srdt.presetno); - sleep(2); - if (0 == srdt.IsSleep) - { - srdt.ms_dev[devidx].SerialCmdidx = 10017; - srdt.IsSleep++; + //sleep(20); return 1; - } - //if(srdt.presetno > 1) - // srdt.presetno = 1; - // else - // srdt.presetno++; - //srdt.ms_dev[devidx].SerialCmdidx = -1; - //Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO+srdt.presetno); - //usleep(1000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - srdt.IsSleep = 0; - return 1; - case 10018: /* 设置预置点*/ - Gm_CtrlPtzCmd(channel, SET_PRESETNO + srdt.presetno); - usleep(100000); - srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; - srdt.iLastGetPhotoNo = -1; - return 1; - default: - imagesize = 0xFF; - packetsize = (uint16_t)srdt.ms_dev[devidx].SerialCmdidx; - cmdidx = 0x11; + case 10006: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ + Gm_CtrlPtzCmd(channel, P_Auto_Scan); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10007: /* 光圈缩小(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_IRIS_CLOSE); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10008: /* 光圈放大(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_IRIS_OPEN); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10009: /* 近距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_FOCUS_NEAR); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10010: /* 远距离聚焦(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_FOCUS_FAR); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10011: /* 远离物体(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_ZOOM_WIDE); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10012: /* 接近物体(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_ZOOM_TELE); + usleep(100000); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10013: /* 向下移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_DOWN); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10014: /* 向上移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_UP); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10015: /* 向左移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_LEFT); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10016: /* 向右移动镜头(1 有效)*/ + Gm_CtrlPtzCmd(channel, P_MOVE_RIGHT); + sleep(1); + Gm_CtrlPtzCmd(channel, Cmd_Cancel); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + case 10017: /* 调用预置点*/ + //srdt.presetno = 2; + Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO + srdt.presetno); + sleep(2); + if (0 == srdt.IsSleep) + { + srdt.ms_dev[devidx].SerialCmdidx = 10017; + srdt.IsSleep++; + return 1; + } + //if(srdt.presetno > 1) + // srdt.presetno = 1; + // else + // srdt.presetno++; + //srdt.ms_dev[devidx].SerialCmdidx = -1; + //Gm_CtrlPtzCmd(channel, MOVE_TO_PRESETNO+srdt.presetno); + //usleep(1000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + srdt.IsSleep = 0; + return 1; + case 10018: /* 设置预置点*/ + Gm_CtrlPtzCmd(channel, SET_PRESETNO + srdt.presetno); + usleep(100000); + srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; + srdt.iLastGetPhotoNo = -1; + return 1; + default: + imagesize = 0xFF; + packetsize = (uint16_t)srdt.ms_dev[devidx].SerialCmdidx; + cmdidx = 0x11; #if 0 - if (0 == srdt.IsSleep) + if (0 == srdt.IsSleep) { srdt.IsSleep++; testComm(); } #endif - if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35 * 1000) - { - srdt.ms_dev[devidx].SerialCmdidx = -1; - sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!", packetsize); - DebugLog(devparam[devidx].commid, szbuf, 'I'); - return -1; - } - break; + if (lcurtime - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35 * 1000) + { + srdt.ms_dev[devidx].SerialCmdidx = -1; + sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!", packetsize); + DebugLog(devparam[devidx].commid, szbuf, 'I'); + return -1; + } + break; } MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality, srdt.sendphototime); //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality); @@ -2633,44 +2616,44 @@ void MakeCameraPhotoCommand(int portno, uint8_t cmdidx, int OneParam, uint16_t T sendbuf[i++] = cmdidx; /* 命令字*/ switch (cmdidx) { - case 0x02: /* */ - sendbuf[i - 2] = 0xFF; - break; - case 0x03: /*设置传感器通讯参数(03H)*/ - sendbuf[i++] = 0x00; /* 波特率*/ - sendbuf[i++] = 0x00; - sendbuf[i++] = 0x00; - sendbuf[i++] = (uint8_t)OneParam; - sendbuf[i++] = 0x08; /* 数据位*/ - sendbuf[i++] = 0x00; /* 校验位*/ - sendbuf[i++] = 0x01; /* 停止位*/ - break; - case 0x010: /* 拍摄图片并指定大小分包(10H)*/ - sendbuf[i++] = OneParam; /* 图片大小(Resolution)*/ - sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ - sendbuf[i++] = LOBYTE(TwoParam); - sendbuf[i++] = HIBYTE(HIWORD(icurtime + 8 * 60 * 60));/* 请求拍摄图片时间(PhotoTime)*/ - sendbuf[i++] = LOBYTE(HIWORD(icurtime + 8 * 60 * 60)); - sendbuf[i++] = HIBYTE(LOWORD(icurtime + 8 * 60 * 60)); - sendbuf[i++] = LOBYTE(LOWORD(icurtime + 8 * 60 * 60)); - sendbuf[i++] = Threep;/*图像质量(ImageQuality)*/ - sendbuf[i++] = srdt.presetno;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ - break; - case 0x11: /* 获取指定包数据(11H)*/ - sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ - sendbuf[i++] = LOBYTE(TwoParam); - break; - case 0x15: /* 读取历史图片(15H)*/ - sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ - sendbuf[i++] = LOBYTE(TwoParam); - break; - case 0x16: /* 通知摄像机图片读取完成或存储(16H)*/ - sendbuf[i++] = HIBYTE(HIWORD(OneParam));/* 需要保存或删除的图片拍摄时间*/ - sendbuf[i++] = LOBYTE(HIWORD(OneParam)); - sendbuf[i++] = HIBYTE(LOWORD(OneParam)); - sendbuf[i++] = LOBYTE(LOWORD(OneParam)); - sendbuf[i++] = (uint8_t)TwoParam; /* 是否需要保存*/ - break; + case 0x02: /* */ + sendbuf[i - 2] = 0xFF; + break; + case 0x03: /*设置传感器通讯参数(03H)*/ + sendbuf[i++] = 0x00; /* 波特率*/ + sendbuf[i++] = 0x00; + sendbuf[i++] = 0x00; + sendbuf[i++] = (uint8_t)OneParam; + sendbuf[i++] = 0x08; /* 数据位*/ + sendbuf[i++] = 0x00; /* 校验位*/ + sendbuf[i++] = 0x01; /* 停止位*/ + break; + case 0x010: /* 拍摄图片并指定大小分包(10H)*/ + sendbuf[i++] = OneParam; /* 图片大小(Resolution)*/ + sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ + sendbuf[i++] = LOBYTE(TwoParam); + sendbuf[i++] = HIBYTE(HIWORD(icurtime + 8 * 60 * 60));/* 请求拍摄图片时间(PhotoTime)*/ + sendbuf[i++] = LOBYTE(HIWORD(icurtime + 8 * 60 * 60)); + sendbuf[i++] = HIBYTE(LOWORD(icurtime + 8 * 60 * 60)); + sendbuf[i++] = LOBYTE(LOWORD(icurtime + 8 * 60 * 60)); + sendbuf[i++] = Threep;/*图像质量(ImageQuality)*/ + sendbuf[i++] = srdt.presetno;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点(PresetNo)*/ + break; + case 0x11: /* 获取指定包数据(11H)*/ + sendbuf[i++] = HIBYTE(TwoParam);/*图片包号:(PackageNo)*/ + sendbuf[i++] = LOBYTE(TwoParam); + break; + case 0x15: /* 读取历史图片(15H)*/ + sendbuf[i++] = HIBYTE(TwoParam);/*包大小(PackageSize)*/ + sendbuf[i++] = LOBYTE(TwoParam); + break; + case 0x16: /* 通知摄像机图片读取完成或存储(16H)*/ + sendbuf[i++] = HIBYTE(HIWORD(OneParam));/* 需要保存或删除的图片拍摄时间*/ + sendbuf[i++] = LOBYTE(HIWORD(OneParam)); + sendbuf[i++] = HIBYTE(LOWORD(OneParam)); + sendbuf[i++] = LOBYTE(LOWORD(OneParam)); + sendbuf[i++] = (uint8_t)TwoParam; /* 是否需要保存*/ + break; } sendbuf[i] = CalLpc((u_char *)&sendbuf[6], i - 6); i += 1; @@ -2692,7 +2675,7 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) { if ((channel == devparam[i].CameraChannel) && ((devparam[i].ProtocolIdx == PELCO_P_PROTOCOL) - || (devparam[i].ProtocolIdx == PELCO_D_PROTOCOL))) + || (devparam[i].ProtocolIdx == PELCO_D_PROTOCOL))) break; } if (i == MAX_SERIAL_DEV_NUM) @@ -2711,31 +2694,31 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) else { #endif - sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, devparam[i].commid + 1); - DebugLog(devparam[i].commid, szbuf, 'I'); - //} - srdt.usecameradevidx = i; - // 查找串口序号 - // 1.打开串口电源 - //Gm_OpenSensorsPower(); - // 2.打开串口通讯 - //Gm_OpenSerialPort(i); + sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, devparam[i].commid + 1); + DebugLog(devparam[i].commid, szbuf, 'I'); + //} + srdt.usecameradevidx = i; + // 查找串口序号 + // 1.打开串口电源 + //Gm_OpenSensorsPower(); + // 2.打开串口通讯 + //Gm_OpenSerialPort(i); - srdt.SendStopPtzCmdTimeCnt = -1; - //return 1; - return Gm_Camera_Timer(); - //return 1; - } + srdt.SendStopPtzCmdTimeCnt = -1; + //return 1; + return Gm_Camera_Timer(); + //return 1; +} - // 发送转动摄像机云台命令定时器 - int Gm_Camera_Timer() - { - char szbuf[128]; +// 发送转动摄像机云台命令定时器 +int Gm_Camera_Timer() +{ + char szbuf[128]; - if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) + if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) + { + switch (srdt.PtzCmdType) { - switch (srdt.PtzCmdType) - { case P_Auto_Scan: srdt.PtzCmdType = D_Auto_Scan; break; @@ -2769,29 +2752,29 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) case P_MOVE_RIGHT: srdt.PtzCmdType = D_MOVE_RIGHT; break; - } } - if (srdt.SendStopPtzCmdTimeCnt == -1) - { - if (serialport[srdt.camerauseserial].cmdlen > 0) - return -1; - if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) - Gm_SendPelco_DCommand(srdt.PtzCmdType); - else - Gm_SendPelco_pCommand(srdt.PtzCmdType); + } + if (srdt.SendStopPtzCmdTimeCnt == -1) + { + if (serialport[srdt.camerauseserial].cmdlen > 0) + return -1; + if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) + Gm_SendPelco_DCommand(srdt.PtzCmdType); + else + Gm_SendPelco_pCommand(srdt.PtzCmdType); - if ((SET_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000)) - || (MOVE_TO_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000))) - { - //srdt.sampling &= 0xFD; - return 1; - } - srdt.PtzCmdType = Cmd_Cancel; - srdt.SendStopPtzCmdTimeCnt = 0; + if ((SET_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000)) + || (MOVE_TO_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000))) + { + //srdt.sampling &= 0xFD; + return 1; } - return 1; + srdt.PtzCmdType = Cmd_Cancel; + srdt.SendStopPtzCmdTimeCnt = 0; + } + return 1; #if 0 - //if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000/TIMER_CNT) + //if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000/TIMER_CNT) { if (serialport[srdt.camerauseserial].cmdlen > 0) return -1; @@ -2807,129 +2790,129 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) // srdt.SendStopPtzCmdTimeCnt ++; //return -1; #endif - } +} - /******************************************************************************** - * 生成 PELCO_P 命令 * - *********************************************************************************/ - void Gm_SendPelco_pCommand(uint32_t cmdtype) - { - int len; - uint8_t commandbuf[32]; - char buf[128]; - - len = 0; - commandbuf[len++] = (uint8_t)0xA0; - commandbuf[len++] = (uint8_t)devparam[srdt.usecameradevidx].devaddr; - commandbuf[len++] = (uint8_t)(cmdtype >> 24); - commandbuf[len++] = (uint8_t)(cmdtype >> 16); - commandbuf[len++] = (uint8_t)(cmdtype >> 8); - commandbuf[len++] = (uint8_t)(cmdtype); - commandbuf[len++] = (uint8_t)0xAF; - commandbuf[len] = (uint8_t)Gm_Pelco_pXORCheck(commandbuf, len); - len++; - serialport[srdt.camerauseserial].cmdlen = len; - Gm_SetSerialPortParam(srdt.camerauseserial); - //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16}; - //len = GM_SerialComSend(sendbuf, sizeof(sendbuf), srdt.camerauseserial); - - len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); - if (len < 1) - { - DebugLog(srdt.camerauseserial, "发送Pelco_p命令失败", 'E'); - } - else - { - sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:", +/******************************************************************************** +* 生成 PELCO_P 命令 * +*********************************************************************************/ +void Gm_SendPelco_pCommand(uint32_t cmdtype) +{ + int len; + uint8_t commandbuf[32]; + char buf[128]; + + len = 0; + commandbuf[len++] = (uint8_t)0xA0; + commandbuf[len++] = (uint8_t)devparam[srdt.usecameradevidx].devaddr; + commandbuf[len++] = (uint8_t)(cmdtype >> 24); + commandbuf[len++] = (uint8_t)(cmdtype >> 16); + commandbuf[len++] = (uint8_t)(cmdtype >> 8); + commandbuf[len++] = (uint8_t)(cmdtype); + commandbuf[len++] = (uint8_t)0xAF; + commandbuf[len] = (uint8_t)Gm_Pelco_pXORCheck(commandbuf, len); + len++; + serialport[srdt.camerauseserial].cmdlen = len; + Gm_SetSerialPortParam(srdt.camerauseserial); + //unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16}; + //len = GM_SerialComSend(sendbuf, sizeof(sendbuf), srdt.camerauseserial); + + len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); + if (len < 1) + { + DebugLog(srdt.camerauseserial, "发送Pelco_p命令失败", 'E'); + } + else + { + sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:", srdt.camerauseserial + 1, devparam[srdt.usecameradevidx].CameraChannel); - BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); - } - ClearCmdFormPollCmdBuf(srdt.camerauseserial); + BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); } + ClearCmdFormPollCmdBuf(srdt.camerauseserial); +} - uint8_t Gm_Pelco_pXORCheck(uint8_t *msg, int len) - { - int i; - uint8_t checkvalue = 0; +uint8_t Gm_Pelco_pXORCheck(uint8_t *msg, int len) +{ + int i; + uint8_t checkvalue = 0; - if (len <= 0) - return checkvalue; - checkvalue = msg[0]; - for (i = 1; i < len; i++) - checkvalue ^= msg[i]; + if (len <= 0) return checkvalue; - } + checkvalue = msg[0]; + for (i = 1; i < len; i++) + checkvalue ^= msg[i]; + return checkvalue; +} - /******************************************************************************** - * 生成 PELCO_D 命令 * - *********************************************************************************/ - void Gm_SendPelco_DCommand(uint32_t cmdtype) - { - int len; - uint8_t commandbuf[32]; - char buf[128]; +/******************************************************************************** +* 生成 PELCO_D 命令 * +*********************************************************************************/ +void Gm_SendPelco_DCommand(uint32_t cmdtype) +{ + int len; + uint8_t commandbuf[32]; + char buf[128]; - len = 0; + len = 0; #if 1 /* Pelco_D*/ - commandbuf[len++] = (uint8_t)0xFF; - commandbuf[len++] = (uint8_t)devparam[srdt.usecameradevidx].devaddr; - commandbuf[len++] = (uint8_t)(cmdtype >> 24); - commandbuf[len++] = (uint8_t)(cmdtype >> 16); - commandbuf[len++] = (uint8_t)(cmdtype >> 8); - commandbuf[len++] = (uint8_t)(cmdtype); - commandbuf[len] = (uint8_t)Gm_Pelco_DCheck(commandbuf, len); + commandbuf[len++] = (uint8_t)0xFF; + commandbuf[len++] = (uint8_t)devparam[srdt.usecameradevidx].devaddr; + commandbuf[len++] = (uint8_t)(cmdtype >> 24); + commandbuf[len++] = (uint8_t)(cmdtype >> 16); + commandbuf[len++] = (uint8_t)(cmdtype >> 8); + commandbuf[len++] = (uint8_t)(cmdtype); + commandbuf[len] = (uint8_t)Gm_Pelco_DCheck(commandbuf, len); #endif - len++; - serialport[srdt.camerauseserial].cmdlen = len; - Gm_SetSerialPortParam(srdt.camerauseserial); - len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); - if (len < 1) - { - DebugLog(srdt.camerauseserial, "发送Pelco_D命令失败", 'E'); - } - else - { - sprintf(buf, "发送串口%d 像机通道%d Pelco_D命令:", + len++; + serialport[srdt.camerauseserial].cmdlen = len; + Gm_SetSerialPortParam(srdt.camerauseserial); + len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial); + if (len < 1) + { + DebugLog(srdt.camerauseserial, "发送Pelco_D命令失败", 'E'); + } + else + { + sprintf(buf, "发送串口%d 像机通道%d Pelco_D命令:", srdt.camerauseserial + 1, devparam[srdt.usecameradevidx].CameraChannel); - BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); - } - ClearCmdFormPollCmdBuf(srdt.camerauseserial); - //serialport[srdt.camerauseserial].ForceWaitCnt = 10; - //serialport[srdt.camerauseserial].ForceWaitFlag = 1; + BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D'); } + ClearCmdFormPollCmdBuf(srdt.camerauseserial); + //serialport[srdt.camerauseserial].ForceWaitCnt = 10; + //serialport[srdt.camerauseserial].ForceWaitFlag = 1; +} - // 计算Pelco_D校验 - uint8_t Gm_Pelco_DCheck(uint8_t *msg, int len) - { - int i; - uint8_t checkvalue = 0; +// 计算Pelco_D校验 +uint8_t Gm_Pelco_DCheck(uint8_t *msg, int len) +{ + int i; + uint8_t checkvalue = 0; - if (len <= 0) - return checkvalue; - checkvalue = 0; - for (i = 1; i < len; i++) - checkvalue += msg[i]; + if (len <= 0) return checkvalue; - } + checkvalue = 0; + for (i = 1; i < len; i++) + checkvalue += msg[i]; + return checkvalue; +} - /********************************************************************************* - 寻找并生成下一条倾角命令 - **********************************************************************************/ - int FindNextShxyProtocolCommand(int devidx) - { - int cmdno = 0; +/********************************************************************************* + 寻找并生成下一条倾角命令 +**********************************************************************************/ +int FindNextShxyProtocolCommand(int devidx) +{ + int cmdno = 0; - //如果命令缓冲区仍有命令,则退出本函数 - if ((devparam[devidx].commid + 1 < 1) || (devparam[devidx].commid + 1 > MAX_SERIAL_PORT_NUM)) - return -1; - if (get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3 * 1000) - { - return -1; - } - //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - // return -1; - switch (cmdno) - { + //如果命令缓冲区仍有命令,则退出本函数 + if ((devparam[devidx].commid + 1 < 1) || (devparam[devidx].commid + 1 > MAX_SERIAL_PORT_NUM)) + return -1; + if (get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3 * 1000) + { + return -1; + } + //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + // return -1; + switch (cmdno) + { case 0: /* 正常采集数据*/ MakeShxyProtocolPollCommand(devidx, 0x09); srdt.curdevidx[devparam[devidx].commid] = devidx; @@ -2940,36 +2923,36 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) return 1; default: break; - } - return -1; } + return -1; +} - /********************************************************************************* - 生成下发命令 - **********************************************************************************/ - void MakeShxyProtocolPollCommand(int portno, uint8_t cmdidx) - { - int i, length = 0; - int newaddr = 9, baud = 9600, stopbit = 1, parity = 0; - //char buf[128]; - u_char *sendbuf; +/********************************************************************************* + 生成下发命令 +**********************************************************************************/ +void MakeShxyProtocolPollCommand(int portno, uint8_t cmdidx) +{ + int i, length = 0; + int newaddr = 9, baud = 9600, stopbit = 1, parity = 0; + //char buf[128]; + u_char *sendbuf; - sendbuf = serialport[devparam[portno].commid].PollCmd; + sendbuf = serialport[devparam[portno].commid].PollCmd; - /* 测试变量*/ - cmdidx = cmdidx; + /* 测试变量*/ + cmdidx = cmdidx; - i = 0; - sendbuf[i++] = 0x00; // 强制等待时间 - sendbuf[i++] = 0x00; // - sendbuf[i++] = 0x68; // 起始字符 - sendbuf[i++] = (uint8_t)0x00; // length - sendbuf[i++] = (uint8_t)0x00; // length - sendbuf[i++] = 0x68; - sendbuf[i++] = (uint8_t)devparam[portno].devaddr; // 传感器地址 - sendbuf[i++] = cmdidx; // 命令信息0x06 - switch (cmdidx) - { + i = 0; + sendbuf[i++] = 0x00; // 强制等待时间 + sendbuf[i++] = 0x00; // + sendbuf[i++] = 0x68; // 起始字符 + sendbuf[i++] = (uint8_t)0x00; // length + sendbuf[i++] = (uint8_t)0x00; // length + sendbuf[i++] = 0x68; + sendbuf[i++] = (uint8_t)devparam[portno].devaddr; // 传感器地址 + sendbuf[i++] = cmdidx; // 命令信息0x06 + switch (cmdidx) + { case 1: /* 设置传感器新地址*/ sendbuf[i++] = newaddr; length = 1; @@ -2989,45 +2972,45 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) break; default: break; - } - sendbuf[i] = CalLpc((u_char *)&sendbuf[6], i - 6); - i += 1; - sendbuf[3] = length; - sendbuf[4] = length; - sendbuf[i++] = 0x16; // 信息尾 - serialport[devparam[portno].commid].cmdlen = i; } + sendbuf[i] = CalLpc((u_char *)&sendbuf[6], i - 6); + i += 1; + sendbuf[3] = length; + sendbuf[4] = length; + sendbuf[i++] = 0x16; // 信息尾 + serialport[devparam[portno].commid].cmdlen = i; +} - unsigned char CalLpc(unsigned char *msg, int len) - { - int i; - u_char retval = 0; +unsigned char CalLpc(unsigned char *msg, int len) +{ + int i; + u_char retval = 0; + + for (i = 0; i < len; i++) + retval += msg[i]; + return retval; +} - for (i = 0; i < len; i++) - retval += msg[i]; - return retval; +/*************************************************************** +* 读上海欣影传感器协议数据 * +***************************************************************/ +void ShxyProtocolRecvData(int devno, u_char *buf, int len)// 规约读数据处理 +{ + int i, ictime; + //uint16_t crc, check; + //SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *pPortParam; + + if ((devno < 0) || (devno > MAX_SERIAL_DEV_NUM)) + { + return; } + pPortParam = &serialport[devparam[devno].commid]; - /*************************************************************** - * 读上海欣影传感器协议数据 * - ***************************************************************/ - void ShxyProtocolRecvData(int devno, u_char *buf, int len)// 规约读数据处理 + for (i = 0; i < len; i++) { - int i, ictime; - //uint16_t crc, check; - //SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *pPortParam; - - if ((devno < 0) || (devno > MAX_SERIAL_DEV_NUM)) - { - return; - } - pPortParam = &serialport[devparam[devno].commid]; - - for (i = 0; i < len; i++) + switch (pPortParam->m_iRevStatus) { - switch (pPortParam->m_iRevStatus) - { case 0: // 0x68 pPortParam->m_iRecvLen = 0; pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; @@ -3104,138 +3087,138 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) } } break; - } } } +} - //******************************************************************************** - // 检查检验和是否正确 - //******************************************************************************** - int CheckShxyProtocolLpcError(u_char* msg, int len) - { - int bRetval = 0; - int iCheckLen; +//******************************************************************************** +// 检查检验和是否正确 +//******************************************************************************** +int CheckShxyProtocolLpcError(u_char* msg, int len) +{ + int bRetval = 0; + int iCheckLen; + + if (0x68 == msg[0]) + { + if (msg[0] != msg[3]) + return bRetval; + if (msg[len - 1] != 0x16) + return bRetval; + if (msg[1] != msg[2]) + return bRetval; + iCheckLen = msg[1]; + if (CalLpc(&msg[4], iCheckLen + 2) != msg[len - 2]) + return bRetval; + bRetval = 1; + } + return bRetval; +} - if (0x68 == msg[0]) - { - if (msg[0] != msg[3]) - return bRetval; - if (msg[len - 1] != 0x16) - return bRetval; - if (msg[1] != msg[2]) - return bRetval; - iCheckLen = msg[1]; - if (CalLpc(&msg[4], iCheckLen + 2) != msg[len - 2]) - return bRetval; - bRetval = 1; - } - return bRetval; - } +/********************************************************************************* + 上海欣影传感器协议数据处理 +**********************************************************************************/ +void ShxyProtocolDataProcess(int devno) +{ + float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; + uint16_t uDevAddr; + uint8_t cmdidx; + int i, j, aipnt, datanum; + SERIAL_DEV_DEF *pPortParam; + SIO_PARAM_SERIAL_DEF *curserial; + char szbuf[64]; + + pPortParam = &srdt.ms_dev[devno]; + curserial = &serialport[devparam[devno].commid]; - /********************************************************************************* - 上海欣影传感器协议数据处理 - **********************************************************************************/ - void ShxyProtocolDataProcess(int devno) + //取出装置地址,开始处理地址+++ + if (0x02 == curserial->m_au8RecvBuf[5]) { - float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/; - uint16_t uDevAddr; - uint8_t cmdidx; - int i, j, aipnt, datanum; - SERIAL_DEV_DEF *pPortParam; - SIO_PARAM_SERIAL_DEF *curserial; - char szbuf[64]; + devparam[devno].devaddr = curserial->m_au8RecvBuf[4]; + return; + } - pPortParam = &srdt.ms_dev[devno]; - curserial = &serialport[devparam[devno].commid]; + cmdidx = curserial->m_au8RecvBuf[5]; + aipnt = pPortParam->SameTypeDevIdx; + uDevAddr = curserial->m_au8RecvBuf[4]; - //取出装置地址,开始处理地址+++ - if (0x02 == curserial->m_au8RecvBuf[5]) - { - devparam[devno].devaddr = curserial->m_au8RecvBuf[4]; + fvalua = &fvalue; + memset(szbuf, 0, sizeof(szbuf)); + if (0x06 == cmdidx) + { + if (0x08 != curserial->m_au8RecvBuf[1]) return; - } - - cmdidx = curserial->m_au8RecvBuf[5]; - aipnt = pPortParam->SameTypeDevIdx; - uDevAddr = curserial->m_au8RecvBuf[4]; + pPortParam->recvdatacnt++; + if (pPortParam->recvdatacnt < 2) + return; + // ++++++++++++++++++++++++++++ + //g_SelfTest.SensorsFault |= (0x800<m_au8RecvBuf[9]; + *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[8]; + *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[7]; + *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[6]; + if ((fvalue < -59) || (fvalue > 59)) { - if (0x08 != curserial->m_au8RecvBuf[1]) - return; - pPortParam->recvdatacnt++; - if (pPortParam->recvdatacnt < 2) - return; - // ++++++++++++++++++++++++++++ - //g_SelfTest.SensorsFault |= (0x800<m_au8RecvBuf[9]; - *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[8]; - *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[7]; - *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[6]; - if ((fvalue < -59) || (fvalue > 59)) - { - frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; - pPortParam->aiValue[0].EuValue *= (1 + frnb); - } - else - pPortParam->aiValue[0].EuValue = fvalue; - pPortParam->aiValue[0].AiState = SER_SAMPLE; - //slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ + frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; + pPortParam->aiValue[0].EuValue *= (1 + frnb); + } + else + pPortParam->aiValue[0].EuValue = fvalue; + pPortParam->aiValue[0].AiState = SER_SAMPLE; + //slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\ // +slantpntmsg[aipnt][0].AiParam.EuValueDelta; //slantpntmsg[aipnt][0].AiState = 1; //if ((gDisSunRain & 0x20) == 0x20) - { - sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); - //DebugLog(devparam[devno].commid, szbuf, 'V'); - } - //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; - //srdt.SectimesamplingCnt[0] += 1; - - *(uint8_t*)fvalua = curserial->m_au8RecvBuf[13]; - *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[12]; - *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[11]; - *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[10]; - //if ((gDisSunRain & 0x20) == 0x20) - { - sprintf(szbuf, "%sY =%0.3f ", szbuf, fvalue); - DebugLog(devparam[devno].commid, szbuf, 'V'); - } - if ((fvalue < -59) || (fvalue > 59)) - { - frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; - pPortParam->aiValue[1].EuValue *= (1 + frnb); - //slantpntmsg[aipnt][1].EuValue *= (1+frnb); - } - else - pPortParam->aiValue[1].EuValue = fvalue; - pPortParam->aiValue[1].AiState = SER_SAMPLE; - /*slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\ - +slantpntmsg[aipnt][1].AiParam.EuValueDelta; - slantpntmsg[aipnt][1].AiState = 1;*/ - //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; - srdt.SectimesamplingCnt[1] += 1; + { + sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue); + //DebugLog(devparam[devno].commid, szbuf, 'V'); } - datanum = curserial->m_au8RecvBuf[6]; - if ((0x08 != cmdidx) && (0x09 != cmdidx)) - return; + //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; + //srdt.SectimesamplingCnt[0] += 1; - for (i = 0, j = 7; (i < datanum) && (j < 6 + curserial->m_au8RecvBuf[1]); i++, j += 5) + *(uint8_t*)fvalua = curserial->m_au8RecvBuf[13]; + *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[12]; + *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[11]; + *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[10]; + //if ((gDisSunRain & 0x20) == 0x20) + { + sprintf(szbuf, "%sY =%0.3f ", szbuf, fvalue); + DebugLog(devparam[devno].commid, szbuf, 'V'); + } + if ((fvalue < -59) || (fvalue > 59)) + { + frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0; + pPortParam->aiValue[1].EuValue *= (1 + frnb); + //slantpntmsg[aipnt][1].EuValue *= (1+frnb); + } + else + pPortParam->aiValue[1].EuValue = fvalue; + pPortParam->aiValue[1].AiState = SER_SAMPLE; + /*slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\ + +slantpntmsg[aipnt][1].AiParam.EuValueDelta; + slantpntmsg[aipnt][1].AiState = 1;*/ + //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; + srdt.SectimesamplingCnt[1] += 1; + } + datanum = curserial->m_au8RecvBuf[6]; + if ((0x08 != cmdidx) && (0x09 != cmdidx)) + return; + + for (i = 0, j = 7; (i < datanum) && (j < 6 + curserial->m_au8RecvBuf[1]); i++, j += 5) + { + if (0x08 == cmdidx) + fvalue = (curserial->m_au8RecvBuf[j + 1] << 24) + (curserial->m_au8RecvBuf[j + 2] << 16) + + (curserial->m_au8RecvBuf[j + 3] << 8) + curserial->m_au8RecvBuf[j + 4]; + else + { + *(uint8_t*)fvalua = curserial->m_au8RecvBuf[j + 4]; + *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[j + 3]; + *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[j + 2]; + *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[j + 1]; + } + switch (curserial->m_au8RecvBuf[j]) { - if (0x08 == cmdidx) - fvalue = (curserial->m_au8RecvBuf[j + 1] << 24) + (curserial->m_au8RecvBuf[j + 2] << 16) - + (curserial->m_au8RecvBuf[j + 3] << 8) + curserial->m_au8RecvBuf[j + 4]; - else - { - *(uint8_t*)fvalua = curserial->m_au8RecvBuf[j + 4]; - *((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[j + 3]; - *((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[j + 2]; - *((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[j + 1]; - } - switch (curserial->m_au8RecvBuf[j]) - { case 1: /*温度*/ if ((fvalue < -40) || (fvalue > 85)) { @@ -3356,7 +3339,7 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) pPortParam->aiValue[0].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor\ +pPortParam->aiValue[0].AiParam.EuValueDelta;*/ - //rallypntmsg[aipnt][0].EuValue = fvalue*rallypntmsg[aipnt][0].AiParam.fFactor\ + //rallypntmsg[aipnt][0].EuValue = fvalue*rallypntmsg[aipnt][0].AiParam.fFactor\ // +rallypntmsg[aipnt][0].AiParam.EuValueDelta; pPortParam->aiValue[0].AiState = SER_SAMPLE; //rallypntmsg[aipnt][0].AiState = 1; @@ -3400,93 +3383,92 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) //slantpntmsg[aipnt][1].AiState = 1; break; - } } } +} + +void delete_old_files(const char *path, int days) +{ + struct stat file_stat; + struct tm *file_tm; + time_t now = time(NULL); + DIR *dir = opendir(path); + struct dirent *entry; + char szbuf[1024]; + char fullpath[256]; - void delete_old_files(const char *path, int days) + memset(szbuf, 0, sizeof(szbuf)); + if (!dir) { - struct stat file_stat; - struct tm *file_tm; - time_t now = time(NULL); - DIR *dir = opendir(path); - struct dirent *entry; - char* szbuf = new char[1024]; - std::unique_ptr szbufptr(szbuf); - char fullpath[256]; + sprintf(szbuf, "delete_old_files opendir %s error ", path); + DebugLog(8, szbuf, 'E'); + return; + } + while ((entry = readdir(dir))) + { memset(szbuf, 0, sizeof(szbuf)); - if (!dir) - { - sprintf(szbuf, "delete_old_files opendir %s error ", path); - DebugLog(8, szbuf, 'E'); - return; - } - - while ((entry = readdir(dir))) - { - memset(szbuf, 0, sizeof(szbuf)); - if (entry->d_type == DT_REG) - { // 只处理普通文件 - snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name); + if (entry->d_type == DT_REG) + { // 只处理普通文件 + snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name); - if (stat(fullpath, &file_stat) == -1) - { - perror("stat"); - sprintf(szbuf, "stat"); - DebugLog(8, szbuf, 'E'); - continue; - } + if (stat(fullpath, &file_stat) == -1) + { + perror("stat"); + sprintf(szbuf, "stat"); + DebugLog(8, szbuf, 'E'); + continue; + } - localtime_r(&(file_stat.st_mtime), file_tm); - //file_tm = localtime(&(file_stat.st_mtime)); + localtime_r(&(file_stat.st_mtime), file_tm); + //file_tm = localtime(&(file_stat.st_mtime)); - if (difftime(now, mktime(file_tm)) > days * 24 * 60 * 60) - { - if (unlink(fullpath) == -1) - { // 删除文件 - perror("unlink"); - } + if (difftime(now, mktime(file_tm)) > days * 24 * 60 * 60) + { + if (unlink(fullpath) == -1) + { // 删除文件 + perror("unlink"); } } } - - closedir(dir); } - /********************************************************************************* - 把16进制和10进制ASCII字符串转换成int整数 - *********************************************************************************/ - int ATOI(char *buf) - { - int i, ilen, iRetVal; - if (NULL == buf) - return 0; - ilen = strlen(buf); - if (ilen > 2) + closedir(dir); +} +/********************************************************************************* + 把16进制和10进制ASCII字符串转换成int整数 +*********************************************************************************/ +int ATOI(char *buf) +{ + int i, ilen, iRetVal; + + if (NULL == buf) + return 0; + ilen = strlen(buf); + if (ilen > 2) + { + if ((buf[0] == '0') && ((buf[1] == 'x') || (buf[1] == 'X'))) { - if ((buf[0] == '0') && ((buf[1] == 'x') || (buf[1] == 'X'))) - { - iRetVal = 0; - for (i = 2; i < ilen; i++) - { - iRetVal = (iRetVal << 4) + HexCharToInt(buf[i]); - } - } - else + iRetVal = 0; + for (i = 2; i < ilen; i++) { - iRetVal = atoi(buf); + iRetVal = (iRetVal << 4) + HexCharToInt(buf[i]); } } else { iRetVal = atoi(buf); } - return iRetVal; } + else + { + iRetVal = atoi(buf); + } + return iRetVal; +} #if 0 - // 控制关闭传感器电源 +// 控制关闭传感器电源 void Gm_CtrlCloseSensorsPower(int devidx) { if ((devidx < 0) || (devidx > MAX_SERIAL_DEV_NUM - 1)) @@ -3520,21 +3502,21 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) } #endif - int GeneratingRandomNumber(void) - { - int ictime, randomdate; - /* 生成随机数n-m -> rand()%(m-n+1)+n*/ - ictime = (int)time(NULL); - srand((uint32_t)ictime); - randomdate = rand(); - return randomdate; - } +int GeneratingRandomNumber(void) +{ + int ictime, randomdate; + /* 生成随机数n-m -> rand()%(m-n+1)+n*/ + ictime = (int)time(NULL); + srand((uint32_t)ictime); + randomdate = rand(); + return randomdate; +} - /* 串口启动接口函数 开始*/ - void Collect_sensor_data() - { +/* 串口启动接口函数 开始*/ +void Collect_sensor_data() +{ #if 0 - int i; + int i; for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) { @@ -3553,29 +3535,29 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) } #endif #if 1 - static int ideletefile = 0; - time_t now; - struct tm t0; - const char *path = "/sdcard/log"; // 指定目录路径 - int days = 15; // 删除15天前的log文件 - - now = time(NULL); - localtime_r(&now, &t0); - if ((0 == t0.tm_hour) && (0 == ideletefile)) - { - delete_old_files(path, days); - ideletefile++; - } - if (0 < t0.tm_hour) - ideletefile = 0; -#endif - GM_StartSerialComm(); - } + static int ideletefile = 0; + time_t now; + struct tm t0; + const char *path = "/sdcard/log"; // 指定目录路径 + int days = 15; // 删除15天前的log文件 - void CameraPhotoCmd(int phototime, u_char channel, int cmdidx, u_char bImageSize, u_char presetno) + now = time(NULL); + localtime_r(&now, &t0); + if ((0 == t0.tm_hour) && (0 == ideletefile)) { + delete_old_files(path, days); + ideletefile++; + } + if (0 < t0.tm_hour) + ideletefile = 0; +#endif + GM_StartSerialComm(); +} + +void CameraPhotoCmd(int phototime, u_char channel, int cmdidx, u_char bImageSize, u_char presetno) +{ #if 0 - int i; + int i; //speed_t baudrate; for (i = 0; i < MAX_SERIAL_DEV_NUM; i++) @@ -3605,188 +3587,188 @@ int Gm_CtrlPtzCmd(u_char channel, uint32_t ptzcmd) sleep(10); } #endif - srdt.bImageSize = bImageSize; - srdt.presetno = presetno; - srdt.sendphototime = phototime; - GM_StartSerialCameraPhoto(1, cmdidx); - } - /* 串口启动接口函数 结束*/ + srdt.bImageSize = bImageSize; + srdt.presetno = presetno; + srdt.sendphototime = phototime; + GM_StartSerialCameraPhoto(1, cmdidx); +} +/* 串口启动接口函数 结束*/ - /* 数据和图片采集数据返回函数 开始*/ - int GetWeatherData(Data_DEF *data, int datano) - { - int i; +/* 数据和图片采集数据返回函数 开始*/ +int GetWeatherData(Data_DEF *data, int datano) +{ + int i; - if (NULL == data) - return -1; - if ((AirTempNo > datano) || (datano > OpticalRadiationNo)) - return -1; - data->EuValue = weatherpntmsg[datano].EuValue; - data->AiState = weatherpntmsg[datano].AiState; - if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) - { - weatherpntmsg[datano].AiState = SER_IDLE; - return 2; - } - return 1; + if (NULL == data) + return -1; + if ((AirTempNo > datano) || (datano > OpticalRadiationNo)) + return -1; + data->EuValue = weatherpntmsg[datano].EuValue; + data->AiState = weatherpntmsg[datano].AiState; + if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) + { + weatherpntmsg[datano].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetAirTempData(Data_DEF *airt) +int GetAirTempData(Data_DEF *airt) +{ + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[AirTempNo].EuValue; + airt->AiState = weatherpntmsg[AirTempNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) { - if (NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[AirTempNo].EuValue; - airt->AiState = weatherpntmsg[AirTempNo].AiState; - if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) - { - weatherpntmsg[AirTempNo].AiState = SER_IDLE; - return 2; - } - return 1; + weatherpntmsg[AirTempNo].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetHumidityData(Data_DEF *airt) +int GetHumidityData(Data_DEF *airt) +{ + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[HumidityNo].EuValue; + airt->AiState = weatherpntmsg[HumidityNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) { - if (NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[HumidityNo].EuValue; - airt->AiState = weatherpntmsg[HumidityNo].AiState; - if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) - { - weatherpntmsg[HumidityNo].AiState = SER_IDLE; - return 2; - } - return 1; + weatherpntmsg[HumidityNo].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetWindSpeedData(Data_DEF *airt) +int GetWindSpeedData(Data_DEF *airt) +{ + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[WindSpeedNo].EuValue; + airt->AiState = weatherpntmsg[WindSpeedNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) { - if (NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[WindSpeedNo].EuValue; - airt->AiState = weatherpntmsg[WindSpeedNo].AiState; - if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) - { - weatherpntmsg[WindSpeedNo].AiState = SER_IDLE; - return 2; - } - return 1; + weatherpntmsg[WindSpeedNo].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetWindDirectionData(Data_DEF *airt) +int GetWindDirectionData(Data_DEF *airt) +{ + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[WindDirectionNo].EuValue; + airt->AiState = weatherpntmsg[WindDirectionNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) { - if (NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[WindDirectionNo].EuValue; - airt->AiState = weatherpntmsg[WindDirectionNo].AiState; - if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) - { - weatherpntmsg[WindDirectionNo].AiState = SER_IDLE; - return 2; - } - return 1; + weatherpntmsg[WindDirectionNo].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetRainfallData(Data_DEF *airt) +int GetRainfallData(Data_DEF *airt) +{ + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[RainfallNo].EuValue; + airt->AiState = weatherpntmsg[RainfallNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) { - if (NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[RainfallNo].EuValue; - airt->AiState = weatherpntmsg[RainfallNo].AiState; - if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) - { - weatherpntmsg[RainfallNo].AiState = SER_IDLE; - return 2; - } - return 1; + weatherpntmsg[RainfallNo].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetAtmosData(Data_DEF *airt) +int GetAtmosData(Data_DEF *airt) +{ + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[AtmosNo].EuValue; + airt->AiState = weatherpntmsg[AtmosNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) { - if (NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[AtmosNo].EuValue; - airt->AiState = weatherpntmsg[AtmosNo].AiState; - if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) - { - weatherpntmsg[AtmosNo].AiState = SER_IDLE; - return 2; - } - return 1; + weatherpntmsg[AtmosNo].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetOpticalRadiationData(Data_DEF *airt) +int GetOpticalRadiationData(Data_DEF *airt) +{ + if (NULL == airt) + return -1; + airt->EuValue = weatherpntmsg[OpticalRadiationNo].EuValue; + airt->AiState = weatherpntmsg[OpticalRadiationNo].AiState; + if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) { - if (NULL == airt) - return -1; - airt->EuValue = weatherpntmsg[OpticalRadiationNo].EuValue; - airt->AiState = weatherpntmsg[OpticalRadiationNo].AiState; - if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState)) - { - weatherpntmsg[OpticalRadiationNo].AiState = SER_IDLE; - return 2; - } - return 1; + weatherpntmsg[OpticalRadiationNo].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetPullValue(int devno, Data_DEF *data) +int GetPullValue(int devno, Data_DEF *data) +{ + if (NULL == data) + return -1; + if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) + return -1; + if (RALLY_PROTOCOL != devparam[devno].ProtocolIdx) + return -1; + data->EuValue = srdt.ms_dev[devno].aiValue[0].EuValue; + data->AiState = srdt.ms_dev[devno].aiValue[0].AiState; + if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) { - if (NULL == data) - return -1; - if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) - return -1; - if (RALLY_PROTOCOL != devparam[devno].ProtocolIdx) - return -1; - data->EuValue = srdt.ms_dev[devno].aiValue[0].EuValue; - data->AiState = srdt.ms_dev[devno].aiValue[0].AiState; - if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) - { - srdt.ms_dev[devno].aiValue[0].AiState = SER_IDLE; - return 2; - } - return 1; + srdt.ms_dev[devno].aiValue[0].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetAngleValue(int devno, Data_DEF *data, int Xy) - { - if (NULL == data) - return -1; - if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) - return -1; - if (SLANT_PROTOCOL != devparam[devno].ProtocolIdx) - return -1; - if ((0 > Xy) || (1 < Xy)) - return -1; +int GetAngleValue(int devno, Data_DEF *data, int Xy) +{ + if (NULL == data) + return -1; + if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) + return -1; + if (SLANT_PROTOCOL != devparam[devno].ProtocolIdx) + return -1; + if ((0 > Xy) || (1 < Xy)) + return -1; - data->EuValue = srdt.ms_dev[devno].aiValue[Xy].EuValue; - data->AiState = srdt.ms_dev[devno].aiValue[Xy].AiState; - if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) - { - srdt.ms_dev[devno].aiValue[Xy].AiState = SER_IDLE; - return 2; - } - return 1; + data->EuValue = srdt.ms_dev[devno].aiValue[Xy].EuValue; + data->AiState = srdt.ms_dev[devno].aiValue[Xy].AiState; + if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState)) + { + srdt.ms_dev[devno].aiValue[Xy].AiState = SER_IDLE; + return 2; } + return 1; +} - int GetImage(int devno, IMAGE_DEF *photo) +int GetImage(int devno, IMAGE_DEF *photo) +{ + if (NULL == photo) + return -1; + if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) + return -1; + if ((PELCO_D_PROTOCOL != devparam[devno].ProtocolIdx) && (PELCO_P_PROTOCOL != devparam[devno].ProtocolIdx) && (SERIALCAMERA_PROTOCOL != devparam[devno].ProtocolIdx)) + return -1; + photo->presetno = srdt.ms_dev[devno].image.presetno; + photo->phototime = srdt.ms_dev[devno].image.phototime; + memset(photo->photoname, 0, sizeof(photo->photoname)); + memmove(photo->photoname, srdt.ms_dev[devno].image.photoname, sizeof(photo->photoname)); + photo->imagelen = srdt.ms_dev[devno].image.imagelen; + photo->state = srdt.ms_dev[devno].image.state; + if ((SER_SAMPLEFAIL == photo->state) || (SAMPLINGSUCCESS == photo->state)) { - if (NULL == photo) - return -1; - if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno)) - return -1; - if ((PELCO_D_PROTOCOL != devparam[devno].ProtocolIdx) && (PELCO_P_PROTOCOL != devparam[devno].ProtocolIdx) && (SERIALCAMERA_PROTOCOL != devparam[devno].ProtocolIdx)) - return -1; - photo->presetno = srdt.ms_dev[devno].image.presetno; - photo->phototime = srdt.ms_dev[devno].image.phototime; - memset(photo->photoname, 0, sizeof(photo->photoname)); - memmove(photo->photoname, srdt.ms_dev[devno].image.photoname, sizeof(photo->photoname)); - photo->imagelen = srdt.ms_dev[devno].image.imagelen; - photo->state = srdt.ms_dev[devno].image.state; - if ((SER_SAMPLEFAIL == photo->state) || (SAMPLINGSUCCESS == photo->state)) - { - srdt.ms_dev[devno].image.state = SER_IDLE; - return 2; - } - return 1; + srdt.ms_dev[devno].image.state = SER_IDLE; + return 2; } - /* 数据和图片采集数据返回函数 结束*/ \ No newline at end of file + return 1; +} +/* 数据和图片采集数据返回函数 结束*/ \ No newline at end of file From f6d5f38bfc73e188de49f25875a89fa242e7ada7 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 20 Nov 2024 14:36:57 +0800 Subject: [PATCH 04/25] Update version to 1.1.6 Based Core Version to 1.2.4 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 54d6e114..0bd32cb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 1 -def AppBuildNumber = 5 +def AppBuildNumber = 6 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From a15a0f6ed6cd66db214b2a59f165fb98058cc25c Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Wed, 20 Nov 2024 15:31:32 +0800 Subject: [PATCH 05/25] =?UTF-8?q?=E6=8B=8D=E7=85=A7=E7=A7=BB=E5=88=B0Phone?= =?UTF-8?q?Device?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 16 ++++++++++++++++ app/src/main/cpp/PhoneDevice.h | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 4a74d909..34b36eca 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1406,6 +1406,19 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< mPath = path; mOsds = osds; + + +#ifdef USING_N938 + if (photoInfo.mediaType == 0) { + // CameraPhotoCmd(time(NULL), channel, MOVE_PRESETNO, 0, type); + // std::this_thread::sleep_for(std::chrono::seconds(2)); + time_t ts = time(NULL); + CameraPhotoCmd(ts, photoInfo.channel, 0, 6, 0); + TakePTZPhotoCb(2, photoInfo); + } + return true; +#else + NdkCamera::CAMERA_PARAMS params; memset(¶ms, 0, sizeof(params)); @@ -1558,6 +1571,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } return res; +#endif } bool CPhoneDevice::CloseCamera() @@ -3242,6 +3256,7 @@ bool CPhoneDevice::OpenSensors(int sensortype) #ifndef USING_N938 #ifndef USING_PLZ GpioControl::setInt(CMD_SET_485_EN_STATE, 1); + #else GpioControl::setInt(CMD_SET_485_ENABLE, 1); #endif @@ -3359,3 +3374,4 @@ bool CPhoneDevice::CloseSensors(int sensortype) } return 0; } + diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index c0ad2ee1..c07c807b 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -221,6 +221,7 @@ public: virtual int GetIceData(ICE_INFO *iceInfo, ICE_TAIL *icetail, SENSOR_PARAM *sensorParam); virtual bool OpenSensors(int sensortype); virtual bool CloseSensors(int sensortype); +// bool CapturePhoto(unsigned char channel, unsigned char type); bool GetNextScheduleItem(uint32_t tsBasedZero, uint32_t scheduleTime, vector& items); @@ -274,6 +275,17 @@ protected: return false; } + inline bool TakePTZPhotoCb(int result, const IDevice::PHOTO_INFO& photoInfo) const + { + if (m_listener != NULL) + { + std::vector objects; + return m_listener->OnPTZPhotoTaken(result, photoInfo); + } + + return false; + } + void QueryPowerInfo(std::map& powerInfo); std::string QueryCpuTemperature(); From 002cb79223f27109d6a8d5244e87d0ab3f877a18 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 20 Nov 2024 16:18:52 +0800 Subject: [PATCH 06/25] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 34b36eca..44c1ba07 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -498,7 +498,6 @@ void CPhoneDevice::SetListener(IListener* listener) void CPhoneDevice::SetRecognizationCfg(const IDevice::CFG_RECOGNIZATION* pRecognizationCfg) { - return; if (m_pRecognizationCfg == NULL && pRecognizationCfg != NULL && (pRecognizationCfg->enabled != 0)) { // TODO From 53cd58bbe169ad5e55f1de8d5ee42053e95f92aa Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 20 Nov 2024 16:26:57 +0800 Subject: [PATCH 07/25] Update version to 1.1.7 Based Core Version to 1.2.5 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0bd32cb2..76f6f1af 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 1 -def AppBuildNumber = 6 +def AppBuildNumber = 7 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From a71841c725951203ba9cf26514b956123f1435aa Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Wed, 20 Nov 2024 18:03:45 +0800 Subject: [PATCH 08/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9result=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 34b36eca..60218023 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -498,7 +498,6 @@ void CPhoneDevice::SetListener(IListener* listener) void CPhoneDevice::SetRecognizationCfg(const IDevice::CFG_RECOGNIZATION* pRecognizationCfg) { - return; if (m_pRecognizationCfg == NULL && pRecognizationCfg != NULL && (pRecognizationCfg->enabled != 0)) { // TODO @@ -1414,7 +1413,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< // std::this_thread::sleep_for(std::chrono::seconds(2)); time_t ts = time(NULL); CameraPhotoCmd(ts, photoInfo.channel, 0, 6, 0); - TakePTZPhotoCb(2, photoInfo); + TakePTZPhotoCb(3, photoInfo); } return true; #else From 69536dc45dfb3def87b7c2098ee35c0be8754f15 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 21 Nov 2024 20:25:28 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E6=91=84=E5=83=8F=E6=9C=BA=E7=9A=84=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/CMakeLists.txt | 5 +- app/src/main/cpp/MicroPhoto.cpp | 3 + app/src/main/cpp/PhoneDevice.cpp | 172 +++++++++++++++------- app/src/main/cpp/PhoneDevice.h | 2 +- app/src/main/cpp/netcamera/httpclient.cpp | 172 ++++++++++++++++++++++ app/src/main/cpp/netcamera/httpclient.h | 20 +++ app/src/main/cpp/netcamera/netcamera.h | 45 ++++++ 7 files changed, 364 insertions(+), 55 deletions(-) create mode 100644 app/src/main/cpp/netcamera/httpclient.cpp create mode 100644 app/src/main/cpp/netcamera/httpclient.h create mode 100644 app/src/main/cpp/netcamera/netcamera.h diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 69efa786..4b030d41 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -39,6 +39,7 @@ add_definitions(-DUSING_NRSEC_VPN) # add_definitions(-DOUTPUT_CAMERA_DBG_INFO) add_definitions(-DALIGN_HB_TIMER_TO_PHOTO) add_definitions(-DENABLE_3V3_ALWAYS) +add_definitions(-DCURL_STATICLIB) add_definitions(-DUSING_HDRPLUS) add_definitions(-DUSING_EXEC_HDRP=1) @@ -386,6 +387,8 @@ add_library( # Sets the name of the library. ncnn/yolov5ncnn.cpp + netcamera/httpclient.cpp + #serial/WeatherComm.cpp # camera2/OpenCVFont.cpp @@ -464,7 +467,7 @@ target_link_libraries( # Specifies the target library. # included in the NDK. ${log-lib} - android camera2ndk mediandk z + android camera2ndk mediandk z curl ncnn ${OpenCV_LIBS} sqlite3 ${HDRPLUS_LIBS_EMBED} diff --git a/app/src/main/cpp/MicroPhoto.cpp b/app/src/main/cpp/MicroPhoto.cpp index e147d28d..74038974 100644 --- a/app/src/main/cpp/MicroPhoto.cpp +++ b/app/src/main/cpp/MicroPhoto.cpp @@ -44,6 +44,7 @@ bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, #include #endif +#include static jmethodID mRegisterTimerMid = 0; static jmethodID mRegisterHeartbeatMid = 0; @@ -225,6 +226,8 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) env->DeleteLocalRef(clazz); #endif + curl_global_init(CURL_GLOBAL_ALL); + return result; } diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 60218023..f548d3f3 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -24,12 +24,15 @@ #include #include #include +#include #ifdef USING_HDRPLUS #include #include #endif +#include "netcamera/netcamera.h" + #include #include #include @@ -1405,8 +1408,6 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< mPath = path; mOsds = osds; - - #ifdef USING_N938 if (photoInfo.mediaType == 0) { // CameraPhotoCmd(time(NULL), channel, MOVE_PRESETNO, 0, type); @@ -1418,52 +1419,56 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< return true; #else - NdkCamera::CAMERA_PARAMS params; - memset(¶ms, 0, sizeof(params)); - - params.sceneMode = mPhotoInfo.sceneMode; - params.autoFocus = mPhotoInfo.autoFocus; - params.autoExposure = mPhotoInfo.autoExposure; - params.focusTimeout = mPhotoInfo.focusTimeout * 1000; - params.exposureTime = mPhotoInfo.exposureTime; - params.sensitivity = mPhotoInfo.sensitivity; - params.compensation = mPhotoInfo.compensation; - params.orientation = mPhotoInfo.orientation; - params.zoom = mPhotoInfo.zoom; - params.zoomRatio = mPhotoInfo.zoomRatio; - params.requestTemplate = mPhotoInfo.requestTemplate; - params.awbMode = mPhotoInfo.awbMode; - params.wait3ALocked = mPhotoInfo.wait3ALocked; - params.burstRawCapture = mPhotoInfo.usingRawFormat; - params.burstCaptures = mPhotoInfo.burstCaptures; - if (params.requestTemplate <= 0 || params.requestTemplate > 5) - { - params.requestTemplate = 2; - } - -#if 0 - if (photoInfo.ldrEnabled) - { - if (GpioControl::getLightAdc() > 1400) - { - params.autoExposure = 0; - params.exposureTime = 1200000000; - params.sensitivity = 1200; - } - } -#endif - bool res = false; - if (photoInfo.usbCamera) + if (photoInfo.cameraType == CAM_TYPE_USB || photoInfo.cameraType == CAM_TYPE_NET) { TurnOnOtg(NULL); } + if (photoInfo.cameraType == CAM_TYPE_NET) + { + GpioControl::set12VEnable(true); + } TurnOnCameraPower(NULL); res = true; - if (mPhotoInfo.mediaType == 0 && mPhotoInfo.usingSysCamera == 0) - { + if ((mPhotoInfo.mediaType == 0) && ((mPhotoInfo.cameraType == CAM_TYPE_MIPI) || (mPhotoInfo.cameraType == CAM_TYPE_USB))) + { + NdkCamera::CAMERA_PARAMS params; + memset(¶ms, 0, sizeof(params)); + + params.sceneMode = mPhotoInfo.sceneMode; + params.autoFocus = mPhotoInfo.autoFocus; + params.autoExposure = mPhotoInfo.autoExposure; + params.focusTimeout = mPhotoInfo.focusTimeout * 1000; + params.exposureTime = mPhotoInfo.exposureTime; + params.sensitivity = mPhotoInfo.sensitivity; + params.compensation = mPhotoInfo.compensation; + params.orientation = mPhotoInfo.orientation; + params.zoom = mPhotoInfo.zoom; + params.zoomRatio = mPhotoInfo.zoomRatio; + params.requestTemplate = mPhotoInfo.requestTemplate; + params.awbMode = mPhotoInfo.awbMode; + params.wait3ALocked = mPhotoInfo.wait3ALocked; + params.burstRawCapture = mPhotoInfo.usingRawFormat; + params.burstCaptures = mPhotoInfo.burstCaptures; + if (params.requestTemplate <= 0 || params.requestTemplate > 5) + { + params.requestTemplate = 2; + } + +#if 0 + if (photoInfo.ldrEnabled) + { + if (GpioControl::getLightAdc() > 1400) + { + params.autoExposure = 0; + params.exposureTime = 1200000000; + params.sensitivity = 1200; + } + } +#endif + mCamera = new CPhoneCamera(this, photoInfo.width, photoInfo.height, params); // mCamera = new CJpegCamera(this, photoInfo.width, photoInfo.height, mPath, params); if (mCamera->open(to_string(mPhotoInfo.cameraId)) == 0) @@ -1490,6 +1495,62 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< RestartApp(REBOOT_TYPE_APP, 60000, "FatalErrorOnCamera"); } } + } + else if ((mPhotoInfo.mediaType == 0) && (mPhotoInfo.cameraType == CAM_TYPE_NET)) + { + // Start Thread + CPhoneDevice* pThis = this; + + vector osds; + osds.swap(mOsds); + IDevice::PHOTO_INFO localPhotoInfo = mPhotoInfo; + + std::thread t([localPhotoInfo, path, pThis, osds]() mutable + { + NET_PHOTO_INFO netPhotoInfo = { 0 }; + strcpy(netPhotoInfo.ip, "192.168.19.107"); + strcpy(netPhotoInfo.url, "/cgi-bin/snapshot.cgi"); + strcpy(netPhotoInfo.outputPath, path.c_str()); + + std::vector img; + bool res = nc_hy::requestCapture(localPhotoInfo.channel, localPhotoInfo.preset, netPhotoInfo, img); + + if (res) + { + time_t takingTime = time(NULL); + if (localPhotoInfo.remedy != 0) + { + if ((takingTime - localPhotoInfo.scheduleTime) > 30) + { + takingTime = localPhotoInfo.scheduleTime + localPhotoInfo.channel * 2; + } + } + + localPhotoInfo.photoTime = takingTime; + // GpioControl::setOtgState(false); + GpioControl::set12VEnable(false); + + // Notify to take next photo + pThis->TakePhotoCb(1, localPhotoInfo, "", takingTime); + + cv::Mat rgb = cv::imdecode(cv::Mat(img), cv::IMREAD_COLOR); +#ifdef _DEBUG + cv::imwrite("/sdcard/com.xypower.mpapp/tmp/netimg2.jpg", rgb); +#endif + + res = pThis->PostProcessPhoto(localPhotoInfo, osds, path, "", rgb); + } + else + { + pThis->TakePhotoCb(0, localPhotoInfo, "", 0); + } + }); + + t.detach(); + } + else if (mPhotoInfo.mediaType == 0 && (mPhotoInfo.cameraType == CAM_TYPE_SERIAL)) + { + } else if (mPhotoInfo.usingSysCamera == 1) { @@ -1586,7 +1647,7 @@ bool CPhoneDevice::CloseCamera() return true; } -void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, unsigned int photoId, bool turnOffOtg) +void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, unsigned int photoId, unsigned char cameraType) { XYLOG(XYLOG_SEVERITY_DEBUG, "TP: Start CloseCamera PHOTOID=%u", photoId); // std::this_thread::sleep_for(std::chrono::milliseconds(16)); @@ -1597,11 +1658,16 @@ void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, unsigned int } XYLOG(XYLOG_SEVERITY_DEBUG, "TP: Will Turn Off Power PHOTOID=%u", photoId); - if (turnOffOtg) + if (cameraType == CAM_TYPE_NET) { - TurnOffOtg(NULL); + GpioControl::set12VEnable(false); } - TurnOffCameraPower(NULL); + + if (cameraType == CAM_TYPE_USB || cameraType == CAM_TYPE_NET) + { + GpioControl::setOtgState(false); + } + GpioControl::setCam3V3Enable(false); XYLOG(XYLOG_SEVERITY_DEBUG, "TP: End Turn Off Power PHOTOID=%u", photoId); XYLOG(XYLOG_SEVERITY_DEBUG, "TP: CloseCamera PHOTOID=%u", photoId); @@ -1682,7 +1748,7 @@ bool CPhoneDevice::onOneCapture(std::shared_ptr characteristics media_status_t mstatus; - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, photoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, photoInfo.photoId, photoInfo.cameraType); m_threadClose.swap(closeThread); if (closeThread.joinable()) { @@ -1794,7 +1860,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi CPhoneCamera* pCamera = mCamera; mCamera = NULL; - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, photoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, photoInfo.photoId, photoInfo.cameraType); m_threadClose.swap(closeThread); if (closeThread.joinable()) { @@ -2237,7 +2303,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi frames.clear(); - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, photoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, photoInfo.photoId, mPhotoInfo.cameraType); m_threadClose.swap(closeThread); if (closeThread.joinable()) { @@ -2980,7 +3046,7 @@ bool CPhoneDevice::OnCaptureReady(bool photoOrVideo, bool result, cv::Mat& mat, mCamera = NULL; bool turnOffOtg = (mPhotoInfo.usbCamera != 0); - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, mPhotoInfo.cameraType); m_threadClose.swap(closeThread); if (closeThread.joinable()) { @@ -3008,7 +3074,7 @@ bool CPhoneDevice::OnVideoReady(bool photoOrVideo, bool result, const char* path TakePhotoCb(result ? 3 : 0, mPhotoInfo, fullPath, time(NULL), objs); bool turnOffOtg = (mPhotoInfo.usbCamera != 0); - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, mPhotoInfo.cameraType); m_threadClose.swap(closeThread); } else @@ -3025,7 +3091,7 @@ bool CPhoneDevice::OnVideoReady(bool photoOrVideo, bool result, const char* path TakePhotoCb(result ? 3 : 0, mPhotoInfo, fullPath, time(NULL), objs); bool turnOffOtg = (mPhotoInfo.usbCamera != 0); - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, mPhotoInfo.cameraType); m_threadClose.swap(closeThread); } @@ -3047,7 +3113,7 @@ void CPhoneDevice::onError(const std::string& msg) TakePhotoCb(0, mPhotoInfo, mPath, 0); bool turnOffOtg = (mPhotoInfo.usbCamera != 0); - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, mPhotoInfo.cameraType); // closeThread.detach(); m_threadClose.swap(closeThread); } @@ -3066,7 +3132,7 @@ void CPhoneDevice::onDisconnected(ACameraDevice* device) TakePhotoCb(0, mPhotoInfo, mPath, 0); bool turnOffOtg = (mPhotoInfo.usbCamera != 0); - std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, mPhotoInfo.cameraType); // closeThread.detach(); m_threadClose.swap(closeThread); } @@ -3251,6 +3317,7 @@ bool CPhoneDevice::OpenSensors(int sensortype) GpioControl::set12VEnable(true); GpioControl::setCam3V3Enable(true); GpioControl::setRS485Enable(true); + GpioControl::setInt(CMD_SET_SPI_POWER, 1); // GpioControl::setInt(CMD_SET_485_EN_STATE, 1); // 打开RS485电源 #ifndef USING_N938 #ifndef USING_PLZ @@ -3263,7 +3330,6 @@ bool CPhoneDevice::OpenSensors(int sensortype) GpioControl::setInt(CMD_SPI2SERIAL_POWER_EN, 1); GpioControl::setInt(CMD_RS485_3V3_EN, 1); #endif - GpioControl::setInt(CMD_SET_SPI_POWER, 1); } if(sensortype == CAMERA_SENSOR_OPEN) { diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index c07c807b..7163d622 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -296,7 +296,7 @@ protected: void onError(const std::string& msg); void onDisconnected(ACameraDevice* device); - void CloseCamera2(CPhoneCamera* camera, unsigned int photoId, bool turnOffOtg); + void CloseCamera2(CPhoneCamera* camera, unsigned int photoId, unsigned char cameraType); static void handleSignal(int sig, siginfo_t *si, void *uc); bool RegisterHandlerForSignal(int sig); diff --git a/app/src/main/cpp/netcamera/httpclient.cpp b/app/src/main/cpp/netcamera/httpclient.cpp new file mode 100644 index 00000000..30410b1b --- /dev/null +++ b/app/src/main/cpp/netcamera/httpclient.cpp @@ -0,0 +1,172 @@ +#include "httpclient.h" +#include "netcamera.h" + +static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid) +{ + std::vector* data = (std::vector*)lpVoid; + if( NULL == data || NULL == buffer ) + { + return -1; + } + uint8_t* begin = (uint8_t *)buffer; + uint8_t* end = begin + size * nmemb; + data->insert(data->end(), begin, end); + return nmemb; +} + + +int DoGetRequest(const char* url, const char* userName, const char* password, const char* interface, std::vector& data) +{ + CURLcode nRet; + std::string auth; + + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); + curl_easy_setopt(curl, CURLOPT_URL, url); + if (userName != NULL && password != NULL && strlen(userName) > 0) + { + auth = userName; + auth += ":"; + auth += password; + curl_easy_setopt(curl, CURLOPT_USERPWD, auth.c_str()); + // DIGEST Auth + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); + } + + // 设置回调函数 + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); + // 设置回调函数的参数,获取反馈信息 + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); + // 接收数据时超时设置,如果5秒内数据未接收完,直接退出 +#ifndef NDEBUG + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); +#else + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); +#endif + // 设置重定向次数,防止重定向次数太多 + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 4); + // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); + + if (interface != NULL && strlen(interface) > 0) + { + curl_easy_setopt(curl, CURLOPT_INTERFACE , interface); + } + nRet = curl_easy_perform(curl); + if (CURLE_OK != nRet) + { + printf("GET err=%d", nRet); + } + curl_easy_cleanup(curl); + + return (0 == nRet) ? 0 : 1; +} + +int DoPutRequest(const char* url, const char* userName, const char* password, const char* interface, const char* contents, std::vector& data) +{ + std::string auth; + + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(curl, CURLOPT_URL, url); + if (userName != NULL && password != NULL && strlen(userName) > 0) + { + auth = userName; + auth += ":"; + auth += password; + curl_easy_setopt(curl, CURLOPT_USERPWD, auth.c_str()); + // DIGEST Auth + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); + } + // 设置回调函数 + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); + // 设置回调函数的参数,获取反馈信息 + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); + // 接收数据时超时设置,如果5秒内数据未接收完,直接退出 + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); + // 设置重定向次数,防止重定向次数太多 + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 4); + // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); + + if (interface != NULL && strlen(interface) > 0) + { + curl_easy_setopt(curl, CURLOPT_INTERFACE , interface); + } + CURLcode nRet = curl_easy_perform(curl); + if (CURLE_OK != nRet) + { + printf("GET err=%d", nRet); + } + curl_easy_cleanup(curl); + + return (0 == nRet) ? 0 : 1; +} + +namespace nc_hy +{ + bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo) + { + bool res = false; + std::vector data; + const char* userName = NULL; + const char* password = NULL; + if (photoInfo.authType != 0) + { + userName = photoInfo.userName; + password = photoInfo.password; + } + const char* interface = photoInfo.interface; + + std::string url = "http://"; + url += photoInfo.ip; + url += photoInfo.url; + + int nRet = DoGetRequest(url.c_str(), userName, password, interface, data); + if (0 == nRet) + { + if (!data.empty()) + { + FILE *fp = fopen(photoInfo.outputPath, "wb"); + if (fp != NULL) + { + fwrite(&data[0], data.size(), 1, fp); + fclose(fp); + res = true; + } + } + } + + return res; + } + + bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img) + { + bool res = false; + const char* userName = NULL; + const char* password = NULL; + if (photoInfo.authType != 0) + { + userName = photoInfo.userName; + password = photoInfo.password; + } + + std::string url = "http://"; + url += photoInfo.ip; + url += photoInfo.url; + + int nRet = DoGetRequest(url.c_str(), userName, password, photoInfo.interface, img); +#ifdef _DEBUG + if (0 == nRet) + { + FILE *fp = fopen("/sdcard/com.xypower.mpapp/tmp/netimg.jpg", "wb"); + if (fp != NULL) + { + fwrite(&img[0], img.size(), 1, fp); + fclose(fp); + } + } +#endif + return (0 == nRet); + } +} diff --git a/app/src/main/cpp/netcamera/httpclient.h b/app/src/main/cpp/netcamera/httpclient.h new file mode 100644 index 00000000..d09d4dbf --- /dev/null +++ b/app/src/main/cpp/netcamera/httpclient.h @@ -0,0 +1,20 @@ +#include +#include + +#include + +#include +#include +#include +#include +#include + +#ifndef __HTTP_CLIENT__ +#define __HTTP_CLIENT__ + + +bool setIPAddress(const char *if_name, const char *ip_addr, const char *net_mask, const char *gateway_addr); +int DoGetRequest(const char* url, const char* userName, const char* password, const char* interface, std::vector& data); +int DoPutRequest(const char* url, const char* userName, const char* password, const char* interface, const char* contents, std::vector& data); + +#endif // __HTTP_CLIENT__ \ No newline at end of file diff --git a/app/src/main/cpp/netcamera/netcamera.h b/app/src/main/cpp/netcamera/netcamera.h new file mode 100644 index 00000000..c15812c6 --- /dev/null +++ b/app/src/main/cpp/netcamera/netcamera.h @@ -0,0 +1,45 @@ +#include +#include + +#ifndef __NET_CAMERA__ +#define __NET_CAMERA__ + + +struct NET_PHOTO_INFO +{ + char ip[24]; + char userName[8]; + char password[16]; + char interface[16]; + char url[128]; + char outputPath[128]; + unsigned char authType; // 0, 1 + unsigned char reserved[7]; // for memory alignment +}; + + /* +struct NET_PHOTO_INFO +{ + std::string ip; + std::string userName; + std::string password; + std::string interface; + std::string url; + std::string outputPath; + unsigned char authType; // 0, 1 + unsigned char reserved[7]; // for memory alignment +}; +*/ + +namespace nc_hy +{ + bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo); + bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img); +} + +namespace nc_hk +{ + bool requestCapture(uint8_t channel); +} + +#endif // __NET_CAMERA__ \ No newline at end of file From 7bdde7b70d96310438c89451e295e279a202ac5b Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 22 Nov 2024 00:54:08 +0800 Subject: [PATCH 10/25] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E7=9A=84=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 81 ++++++++++++++++++- app/src/main/cpp/PhoneDevice.h | 15 ++++ .../com/xypower/mpapp/MicroPhotoService.java | 24 ++++++ 3 files changed, 119 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index f548d3f3..fe856631 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -391,7 +391,7 @@ std::mutex CPhoneDevice::m_powerLocker; long CPhoneDevice::mCameraPowerCount = 0; long CPhoneDevice::mOtgCount = 0; -CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPath, unsigned int netId, unsigned int versionCode, const std::string& nativeLibDir) : mVersionCode(versionCode), m_nativeLibraryDir(nativeLibDir) +CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPath, unsigned int netId, unsigned int versionCode, const std::string& nativeLibDir) : mVersionCode(versionCode), m_nativeLibraryDir(nativeLibDir), m_network(NULL) { mCamera = NULL; m_listener = NULL; @@ -410,6 +410,8 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa RegisterHandlerForSignal(SIGUSR2); + LoadNetworkInfo(); + m_vm = vm; JNIEnv* env = NULL; bool didAttachThread = false; @@ -439,6 +441,8 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa mExecHdrplusMid = env->GetMethodID(classService, "execHdrplus", "(IILjava/lang/String;Ljava/lang/String;)I"); + mSetStaticIpMid = env->GetMethodID(classService, "setStaticNetwork", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); + mCallSysCameraMid = env->GetMethodID(classService, "callSystemCamera", "(IJ)V"); env->DeleteLocalRef(classService); @@ -492,6 +496,12 @@ CPhoneDevice::~CPhoneDevice() } m_pRecognizationCfg = NULL; } + + if (m_network != NULL) + { + delete m_network; + m_network = NULL; + } } void CPhoneDevice::SetListener(IListener* listener) @@ -1507,6 +1517,10 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< std::thread t([localPhotoInfo, path, pThis, osds]() mutable { + pThis->SetStaticIp(); + + std::this_thread::sleep_for(std::chrono::milliseconds(128)); + NET_PHOTO_INFO netPhotoInfo = { 0 }; strcpy(netPhotoInfo.ip, "192.168.19.107"); strcpy(netPhotoInfo.url, "/cgi-bin/snapshot.cgi"); @@ -3243,6 +3257,33 @@ void CPhoneDevice::UpdateSimcard(const std::string& simcard) m_simcard = simcard; } +void CPhoneDevice::SetStaticIp(const std::string& iface, const std::string& ip, const std::string& netmask, const std::string& gateway) +{ + JNIEnv* env = NULL; + jboolean ret = JNI_FALSE; + bool didAttachThread = false; + bool res = GetJniEnv(m_vm, &env, didAttachThread); + if (!res) + { + ALOGE("Failed to get JNI Env"); + } + + jstring jiface = env->NewStringUTF(iface.c_str()); + jstring jip = env->NewStringUTF(ip.c_str()); + jstring jnetmask = env->NewStringUTF(netmask.c_str()); + jstring jgw = env->NewStringUTF(gateway.c_str()); + env->CallVoidMethod(m_javaService, mSetStaticIpMid, jiface, jip, jnetmask, jgw); + env->DeleteLocalRef(jgw); + env->DeleteLocalRef(jnetmask); + env->DeleteLocalRef(jip); + env->DeleteLocalRef(jiface); + + if (didAttachThread) + { + m_vm->DetachCurrentThread(); + } +} + int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceTail, SENSOR_PARAM *sensorParam) { Collect_sensor_data(); //15s @@ -3440,3 +3481,41 @@ bool CPhoneDevice::CloseSensors(int sensortype) return 0; } +bool CPhoneDevice::LoadNetworkInfo() +{ + std::vector content; + if (!readFile(m_appPath + (APP_PATH_NETWORK), content) && !content.empty()) + { + return false; + } + + Json::CharReaderBuilder builder; + std::unique_ptr reader(builder.newCharReader()); + + Json::Value jsonVal; + const char* doc = (const char*)&(content[0]); + std::string errMsg; + if (!reader->parse(doc, doc + content.size(), &jsonVal, &errMsg)) + { + return false; + } + + if (m_network == NULL) + { + m_network = new NETWORK(); + } + GetJSONValue(jsonVal, "iface", m_network->iface); + GetJSONValue(jsonVal, "ip", m_network->ip); + GetJSONValue(jsonVal, "netmask", m_network->netmask); + GetJSONValue(jsonVal, "gateway", m_network->gateway); + + return true; +} + +void CPhoneDevice::SetStaticIp() +{ + if (m_network != NULL) + { + SetStaticIp(m_network->iface, m_network->ip, m_network->netmask, m_network->gateway); + } +} diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index 7163d622..9b938b9e 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -153,6 +153,14 @@ class CPhoneDevice : public IDevice { public: + struct NETWORK + { + std::string iface; + std::string ip; + std::string netmask; + std::string gateway; + }; + class CPhoneCamera : public NdkCamera { public: @@ -223,6 +231,7 @@ public: virtual bool CloseSensors(int sensortype); // bool CapturePhoto(unsigned char channel, unsigned char type); + bool LoadNetworkInfo(); bool GetNextScheduleItem(uint32_t tsBasedZero, uint32_t scheduleTime, vector& items); void UpdatePosition(double lon, double lat, double radius, time_t ts); @@ -310,6 +319,9 @@ protected: int CallExecv(int rotation, int frontCamera, const std::string& outputPath, const std::vector& images); + void SetStaticIp(const std::string& iface, const std::string& ip, const std::string& netmask, const std::string& gateway); + void SetStaticIp(); + protected: std::mutex m_devLocker; @@ -320,6 +332,8 @@ protected: std::string m_tfCardPath; std::string m_nativeLibraryDir; + NETWORK* m_network; + jmethodID mRegisterHeartbeatMid; jmethodID mUpdateCaptureScheduleMid; jmethodID mUpdateTimeMid; @@ -335,6 +349,7 @@ protected: jmethodID mEnableGpsMid; jmethodID mRequestPositionMid; jmethodID mExecHdrplusMid; + jmethodID mSetStaticIpMid; jmethodID mCallSysCameraMid; diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index 125397c6..d0c66e33 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -1438,6 +1438,30 @@ public class MicroPhotoService extends Service { return exitCode; } + public void setStaticNetwork(String iface, String ip, String netmask, String gateway) + { + Intent intent = new Intent(); + intent.putExtra("cmd", "setnet"); + intent.putExtra("staticip", true); + intent.putExtra("iface", iface); + intent.putExtra("ip", ip); + intent.putExtra("netmask", netmask); + if (!TextUtils.isEmpty(gateway)) { + intent.putExtra("gateway", gateway); + } + // nn.putExtra("dns1", "8.8.8.8"); + // nn.putExtra("dns2", "192.168.1.1"); + sendBroadcast(getApplicationContext(), intent); + } + + public static void sendBroadcast(Context context, Intent intent) + { + intent.setAction("com.xy.xsetting.action"); + intent.setPackage("com.android.systemui"); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + context.sendBroadcast(intent); + } + /* TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); // for example value of first element From 70075a0eccf1feb48344ed58554f7d5d0c0f9b88 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 22 Nov 2024 11:49:07 +0800 Subject: [PATCH 11/25] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=91=84=E5=83=8F?= =?UTF-8?q?=E6=9C=BAip=E5=9C=B0=E5=9D=80=E7=9A=84=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index fe856631..91de8126 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1522,7 +1522,10 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< std::this_thread::sleep_for(std::chrono::milliseconds(128)); NET_PHOTO_INFO netPhotoInfo = { 0 }; - strcpy(netPhotoInfo.ip, "192.168.19.107"); + + struct in_addr addr; + addr.s_addr = localPhotoInfo.ip; + strcpy(netPhotoInfo.ip, inet_ntoa(addr)); strcpy(netPhotoInfo.url, "/cgi-bin/snapshot.cgi"); strcpy(netPhotoInfo.outputPath, path.c_str()); From 83dfd4fb7c4c363a447c9491463270c5ecfd6018 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 22 Nov 2024 16:03:09 +0800 Subject: [PATCH 12/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=A4=84=E7=90=86GPIO=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/GPIOControl.cpp | 144 +++++++++++++++++++------------ app/src/main/cpp/GPIOControl.h | 17 +++- 2 files changed, 106 insertions(+), 55 deletions(-) diff --git a/app/src/main/cpp/GPIOControl.cpp b/app/src/main/cpp/GPIOControl.cpp index b76b814c..b20d939c 100644 --- a/app/src/main/cpp/GPIOControl.cpp +++ b/app/src/main/cpp/GPIOControl.cpp @@ -20,86 +20,122 @@ #define IOT_PARAM_WRITE 0xAE #define IOT_PARAM_READ 0xAF -#define MAX_STRING_LEN 32 - -typedef struct -{ - int cmd; - int value; - int result; - long value2; - char str[MAX_STRING_LEN]; -}IOT_PARAM; - std::mutex GpioControl::m_locker; std::vector> GpioControl::m_references; -void GpioControl::setInt(int cmd, int value) +int GpioControl::turnOnImpl(const IOT_PARAM& param) { - int fd = -1; - IOT_PARAM param = { cmd, value, 0 }; - // param.cmd = cmd; - // param.value = value; + uint32_t references = 1; + std::vector >::iterator it; int res = 0; + int fd = -1; - uint32_t references = (value != 0) ? 1 : 0; + fd = open(GPIO_NODE_MP, O_RDONLY); + if( fd > 0 ) + { + res = ioctl(fd, IOT_PARAM_WRITE, ¶m); + close(fd); + // check res??? + for (it = m_references.begin(); it != m_references.end(); ++it) + { + if (it->first == param.cmd) + { + it->second++; + references = it->second; + break; + } + } + if (it == m_references.end()) + { + m_references.push_back(std::pair(cmd, references)); + } + } + + return references; +} + +int GpioControl::turnOffImpl(const IOT_PARAM& param) +{ + uint32_t references = 0; std::vector >::iterator it; + int res = 0; + int fd = -1; - if (value) + for (it = m_references.begin(); it != m_references.end(); ++it) + { + if (it->first == param.cmd) + { + if (it->second > 0) + { + it->second--; + } + references = it->second; + break; + } + } + + if (references == 0) { - m_locker.lock(); fd = open(GPIO_NODE_MP, O_RDONLY); - if( fd > 0 ) + if (fd > 0) { res = ioctl(fd, IOT_PARAM_WRITE, ¶m); #ifdef _DEBUG ALOGI("setInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); #endif close(fd); - // check res??? - for (it = m_references.begin(); it != m_references.end(); ++it) - { - if (it->first == cmd) - { - it->second++; - references = it->second; - break; - } - } - if (it == m_references.end()) - { - m_references.push_back(std::pair(cmd, references)); - } } + } + + return references; +} + +void GpioControl::setInt(int cmd, int value) +{ + IOT_PARAM param = { cmd, value, 0 }; + // param.cmd = cmd; + // param.value = value; + + if (value) + { + m_locker.lock(); + turnOnImpl(param); m_locker.unlock(); } else { m_locker.lock(); - for (it = m_references.begin(); it != m_references.end(); ++it) + turnOffImpl(param); + m_locker.unlock(); + } +} + +static void GpioControl::setInt(const std::vector& cmds, int value) +{ + IOT_PARAM param = { 0, value, 0 }; + // param.cmd = cmd; + // param.value = value; + + std::vector::const_iterator it; + + if (value) + { + m_locker.lock(); + for (it = cmds.cbegin(); it != cmds.cend(); ++it) { - if (it->first == cmd) - { - if (it->second > 0) - { - it->second--; - } - references = it->second; - break; - } + param.cmd = *it; + turnOnImpl(param); } - - if (references == 0) + m_locker.unlock(); + } + else + { + m_locker.lock(); + for (it = cmds.cbegin(); it != cmds.cend(); ++it) { - fd = open(GPIO_NODE_MP, O_RDONLY); - if (fd > 0) { - res = ioctl(fd, IOT_PARAM_WRITE, ¶m); -#ifdef _DEBUG - ALOGI("setInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); -#endif - close(fd); - } + param.cmd = *it; + turnOffImpl(param); } m_locker.unlock(); } diff --git a/app/src/main/cpp/GPIOControl.h b/app/src/main/cpp/GPIOControl.h index c7bfc084..95eca7f7 100644 --- a/app/src/main/cpp/GPIOControl.h +++ b/app/src/main/cpp/GPIOControl.h @@ -113,15 +113,30 @@ #define GPIO_NODE_MP "/dev/mtkgpioctrl" +#define MAX_STRING_LEN 32 +typedef struct +{ + int cmd; + int value; + int result; + long value2; + char str[MAX_STRING_LEN]; +}IOT_PARAM; + class GpioControl { private: static std::mutex m_locker; static std::vector> m_references; -public: +protected: + static int turnOnImpl(const IOT_PARAM& param); + static int turnOffImpl(const IOT_PARAM& param); +public: static void setInt(int cmd, int value); + static void setInt(const std::vector& cmds, int value); + static int getInt(int cmd); static void setLong(int cmd, long value); static long getLong(int cmd); From e06b9178bfbb41b7d942e6d3a13ed3cbc01a4d56 Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 25 Nov 2024 11:39:27 +0800 Subject: [PATCH 13/25] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=91=84=E5=83=8F?= =?UTF-8?q?=E5=A4=B4=E6=8B=8D=E7=85=A7=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/GPIOControl.cpp | 4 +- app/src/main/cpp/MicroPhoto.cpp | 27 +++- app/src/main/cpp/PhoneDevice.cpp | 105 ++++++++++---- app/src/main/cpp/PhoneDevice.h | 10 +- app/src/main/cpp/SensorsProtocol.cpp | 9 +- app/src/main/cpp/netcamera/httpclient.cpp | 128 ++++++++++++++---- app/src/main/cpp/netcamera/httpclient.h | 6 +- app/src/main/cpp/netcamera/netcamera.h | 19 ++- .../com/xypower/mpapp/MicroPhotoService.java | 43 +++++- 9 files changed, 270 insertions(+), 81 deletions(-) diff --git a/app/src/main/cpp/GPIOControl.cpp b/app/src/main/cpp/GPIOControl.cpp index b20d939c..f90d6838 100644 --- a/app/src/main/cpp/GPIOControl.cpp +++ b/app/src/main/cpp/GPIOControl.cpp @@ -48,7 +48,7 @@ int GpioControl::turnOnImpl(const IOT_PARAM& param) } if (it == m_references.end()) { - m_references.push_back(std::pair(cmd, references)); + m_references.push_back(std::pair(param.cmd, references)); } } @@ -111,7 +111,7 @@ void GpioControl::setInt(int cmd, int value) } } -static void GpioControl::setInt(const std::vector& cmds, int value) +void GpioControl::setInt(const std::vector& cmds, int value) { IOT_PARAM param = { 0, value, 0 }; // param.cmd = cmd; diff --git a/app/src/main/cpp/MicroPhoto.cpp b/app/src/main/cpp/MicroPhoto.cpp index 74038974..114d527f 100644 --- a/app/src/main/cpp/MicroPhoto.cpp +++ b/app/src/main/cpp/MicroPhoto.cpp @@ -292,13 +292,6 @@ Java_com_xypower_mpapp_MicroPhotoService_init( NULL, true, -1); */ - - if (netHandle != NETID_UNSET) { - net_handle_t nh = (net_handle_t)netHandle; - - android_setprocnetwork(nh); - } - char model[PROP_VALUE_MAX] = { 0 }; __system_property_get("ro.product.model", model); @@ -1390,4 +1383,24 @@ Java_com_xypower_mpapp_MicroPhotoService_exportPrivateFile( #else return JNI_FALSE; #endif +} + + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_xypower_mpapp_MicroPhotoService_updateEhernet( + JNIEnv* env, jobject pThis, jlong handle, jlong networkHandle, jboolean available) { + + CTerminal* pTerminal = reinterpret_cast(handle); + if (pTerminal == NULL) + { + return JNI_FALSE; + } + + CPhoneDevice* device = (CPhoneDevice*)pTerminal->GetDevice(); + if (device != NULL) + { + device->UpdateEthernet(static_cast(networkHandle), available != JNI_FALSE); + } + + return JNI_TRUE; } \ No newline at end of file diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 91de8126..5ce32271 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -257,7 +257,6 @@ void CPhoneDevice::CPhoneCamera::onDisconnected(ACameraDevice* device) } } - CPhoneDevice::CJpegCamera::CJpegCamera(CPhoneDevice* dev, int32_t width, int32_t height, const std::string& path, const NdkCamera::CAMERA_PARAMS& params) : CPhoneDevice::CPhoneCamera(dev, width, height, params), m_path(path) { } @@ -391,7 +390,8 @@ std::mutex CPhoneDevice::m_powerLocker; long CPhoneDevice::mCameraPowerCount = 0; long CPhoneDevice::mOtgCount = 0; -CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPath, unsigned int netId, unsigned int versionCode, const std::string& nativeLibDir) : mVersionCode(versionCode), m_nativeLibraryDir(nativeLibDir), m_network(NULL) +CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPath, unsigned int netId, unsigned int versionCode, const std::string& nativeLibDir) + : mVersionCode(versionCode), m_nativeLibraryDir(nativeLibDir), m_network(NULL), m_netHandle(NETWORK_UNSPECIFIED) { mCamera = NULL; m_listener = NULL; @@ -1418,17 +1418,6 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< mPath = path; mOsds = osds; -#ifdef USING_N938 - if (photoInfo.mediaType == 0) { - // CameraPhotoCmd(time(NULL), channel, MOVE_PRESETNO, 0, type); - // std::this_thread::sleep_for(std::chrono::seconds(2)); - time_t ts = time(NULL); - CameraPhotoCmd(ts, photoInfo.channel, 0, 6, 0); - TakePTZPhotoCb(3, photoInfo); - } - return true; -#else - bool res = false; if (photoInfo.cameraType == CAM_TYPE_USB || photoInfo.cameraType == CAM_TYPE_NET) @@ -1519,18 +1508,64 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< { pThis->SetStaticIp(); - std::this_thread::sleep_for(std::chrono::milliseconds(128)); + net_handle_t netHandle = pThis->GetNetHandle(); + + if (netHandle == 0) + { + // Wait about 10s + for (int idx = 0; idx < 84; idx++) + { + std::this_thread::sleep_for(std::chrono::milliseconds(128)); + netHandle = pThis->GetNetHandle(); + + if (netHandle != 0) + { + break; + } + } + } - NET_PHOTO_INFO netPhotoInfo = { 0 }; + if (netHandle == 0) + { + // timeout + XYLOG(XYLOG_SEVERITY_ERROR, "Ethernet not existing CH=%u PR=%X PHOTOID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.preset, photoInfo.photoId); + pThis->TakePhotoCb(0, localPhotoInfo, "", 0); + return; + } + + NET_PHOTO_INFO netPhotoInfo = { netHandle, 0 }; + if (localPhotoInfo.vendor == 1) + { + // Hai Kang + snprintf(netPhotoInfo.url, sizeof(netPhotoInfo.url), "/ISAPI/Streaming/channels/%u/picture", (uint32_t)localPhotoInfo.channel); + } + else if (localPhotoInfo.vendor == 2) + { + // Hang Yu + strcpy(netPhotoInfo.url, "/cgi-bin/snapshot.cgi"); + } + else if (localPhotoInfo.vendor == 3) + { + // Yu Shi + int streamSid = 0; // should put into config + snprintf(netPhotoInfo.url, sizeof(netPhotoInfo.url), "/LAPI/V1.0/Channels/%u/Media/Video/Streams/%d/Snapshot", (uint32_t)localPhotoInfo.channel, streamSid); + } + else + { + XYLOG(XYLOG_SEVERITY_ERROR, "Vendor(%u) not Supported CH=%u PR=%X PHOTOID=%u", (uint32_t)localPhotoInfo.vendor, (uint32_t)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); + pThis->TakePhotoCb(0, localPhotoInfo, "", 0); + return; + } struct in_addr addr; addr.s_addr = localPhotoInfo.ip; strcpy(netPhotoInfo.ip, inet_ntoa(addr)); - strcpy(netPhotoInfo.url, "/cgi-bin/snapshot.cgi"); strcpy(netPhotoInfo.outputPath, path.c_str()); + // strcpy(netPhotoInfo.interface, "eth0"); + std::vector img; - bool res = nc_hy::requestCapture(localPhotoInfo.channel, localPhotoInfo.preset, netPhotoInfo, img); + bool res = requestCapture(localPhotoInfo.channel, localPhotoInfo.preset, netPhotoInfo, img); if (res) { @@ -1552,7 +1587,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< cv::Mat rgb = cv::imdecode(cv::Mat(img), cv::IMREAD_COLOR); #ifdef _DEBUG - cv::imwrite("/sdcard/com.xypower.mpapp/tmp/netimg2.jpg", rgb); + // cv::imwrite("/sdcard/com.xypower.mpapp/tmp/netimg2.jpg", rgb); #endif res = pThis->PostProcessPhoto(localPhotoInfo, osds, path, "", rgb); @@ -1567,7 +1602,13 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } else if (mPhotoInfo.mediaType == 0 && (mPhotoInfo.cameraType == CAM_TYPE_SERIAL)) { - + // if (photoInfo.mediaType == 0) { + // CameraPhotoCmd(time(NULL), channel, MOVE_PRESETNO, 0, type); + // std::this_thread::sleep_for(std::chrono::seconds(2)); + time_t ts = time(NULL); + CameraPhotoCmd(ts, photoInfo.channel, 0, 6, 0); + TakePTZPhotoCb(3, photoInfo); + res = true; } else if (mPhotoInfo.usingSysCamera == 1) { @@ -1648,7 +1689,6 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } return res; -#endif } bool CPhoneDevice::CloseCamera() @@ -3260,6 +3300,23 @@ void CPhoneDevice::UpdateSimcard(const std::string& simcard) m_simcard = simcard; } +void CPhoneDevice::UpdateEthernet(net_handle_t nethandle, bool available) +{ + m_devLocker.lock(); + m_netHandle = available ? nethandle : NETWORK_UNSPECIFIED; + m_devLocker.unlock(); +} + +net_handle_t CPhoneDevice::GetNetHandle() const +{ + net_handle_t nethandle = NETWORK_UNSPECIFIED; + m_devLocker.lock(); + nethandle = m_netHandle; + m_devLocker.unlock(); + return nethandle; + +} + void CPhoneDevice::SetStaticIp(const std::string& iface, const std::string& ip, const std::string& netmask, const std::string& gateway) { JNIEnv* env = NULL; @@ -3276,10 +3333,10 @@ void CPhoneDevice::SetStaticIp(const std::string& iface, const std::string& ip, jstring jnetmask = env->NewStringUTF(netmask.c_str()); jstring jgw = env->NewStringUTF(gateway.c_str()); env->CallVoidMethod(m_javaService, mSetStaticIpMid, jiface, jip, jnetmask, jgw); - env->DeleteLocalRef(jgw); - env->DeleteLocalRef(jnetmask); - env->DeleteLocalRef(jip); - env->DeleteLocalRef(jiface); + // env->DeleteLocalRef(jgw); + // env->DeleteLocalRef(jnetmask); + // env->DeleteLocalRef(jip); + // env->DeleteLocalRef(jiface); if (didAttachThread) { diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index 9b938b9e..a05da140 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -27,6 +27,8 @@ #include #include +#include + #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "error", __VA_ARGS__)) #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, "debug", __VA_ARGS__)) @@ -248,6 +250,9 @@ public: mBuildTime = buildTime; } void UpdateSimcard(const std::string& simcard); + void UpdateEthernet(net_handle_t nethandle, bool available); + + net_handle_t GetNetHandle() const; static void TurnOnCameraPower(JNIEnv* env); static void TurnOffCameraPower(JNIEnv* env); @@ -324,7 +329,7 @@ protected: protected: - std::mutex m_devLocker; + mutable std::mutex m_devLocker; JavaVM* m_vm; jobject m_javaService; @@ -332,7 +337,8 @@ protected: std::string m_tfCardPath; std::string m_nativeLibraryDir; - NETWORK* m_network; + NETWORK* m_network; + net_handle_t m_netHandle; jmethodID mRegisterHeartbeatMid; jmethodID mUpdateCaptureScheduleMid; diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 63297bb7..9b2eac68 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -37,7 +38,7 @@ AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM]; static void setInt(int cmd, int value) { - int fd = open("/dev/mtkgpioctrl", O_RDONLY); + int fd = ::open("/dev/mtkgpioctrl", O_RDONLY); IOT_PARAM param; param.cmd = cmd; param.value = value; @@ -53,7 +54,7 @@ static void setInt(int cmd, int value) int getInt(int cmd) { - int fd = open("/dev/mtkgpioctrl", O_RDONLY); + int fd = ::open("/dev/mtkgpioctrl", O_RDONLY); // LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd); if (fd > 0) { @@ -713,7 +714,7 @@ void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag) strncpy(szbuf, describe, strlen(describe)); for (i = 0; i < len; i++) { - sprintf(szbuf, "%s %02X", szbuf, buf[i]); + ::sprintf(szbuf, "%s %02X", szbuf, buf[i]); } SaveLogTofile(commid, szbuf); switch (flag) @@ -750,7 +751,7 @@ void Gm_OpenSerialPort(int devidx) memset(szbuf, 0, sizeof(szbuf)); if (serialport[devparam[devidx].commid].fd <= 0) { - fd = open(devparam[devidx].pathname, O_RDWR | O_NDELAY); + fd = ::open(devparam[devidx].pathname, O_RDWR | O_NDELAY); if (fd < 0) { sprintf(szbuf, "装置%d 打开串口%d失败!fd=%d", devidx + 1, devparam[devidx].commid + 1, fd); diff --git a/app/src/main/cpp/netcamera/httpclient.cpp b/app/src/main/cpp/netcamera/httpclient.cpp index 30410b1b..1d2deaef 100644 --- a/app/src/main/cpp/netcamera/httpclient.cpp +++ b/app/src/main/cpp/netcamera/httpclient.cpp @@ -1,6 +1,8 @@ #include "httpclient.h" #include "netcamera.h" +#include + static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid) { std::vector* data = (std::vector*)lpVoid; @@ -14,8 +16,20 @@ static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid) return nmemb; } +static int SockOptCallback(void *clientp, curl_socket_t curlfd, curlsocktype purpose) +{ + net_handle_t netHandle = *((net_handle_t *)clientp); -int DoGetRequest(const char* url, const char* userName, const char* password, const char* interface, std::vector& data) + int res = android_setsocknetwork(netHandle, curlfd); + if (res == -1) + { + int errcode = errno; + printf("android_setsocknetwork errno=%d", errcode); + } + return res == 0 ? CURL_SOCKOPT_OK : CURL_SOCKOPT_ERROR; +} + +int DoGetRequest(const char* url, const char* userName, const char* password, net_handle_t netHandle, std::vector& data) { CURLcode nRet; std::string auth; @@ -33,7 +47,13 @@ int DoGetRequest(const char* url, const char* userName, const char* password, co curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); } - // 设置回调函数 + if (netHandle != NETWORK_UNSPECIFIED) + { + curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, SockOptCallback); + curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &netHandle); + } + + // curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); // 设置回调函数的参数,获取反馈信息 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); @@ -48,10 +68,6 @@ int DoGetRequest(const char* url, const char* userName, const char* password, co // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); - if (interface != NULL && strlen(interface) > 0) - { - curl_easy_setopt(curl, CURLOPT_INTERFACE , interface); - } nRet = curl_easy_perform(curl); if (CURLE_OK != nRet) { @@ -62,7 +78,7 @@ int DoGetRequest(const char* url, const char* userName, const char* password, co return (0 == nRet) ? 0 : 1; } -int DoPutRequest(const char* url, const char* userName, const char* password, const char* interface, const char* contents, std::vector& data) +int DoPutRequest(const char* url, const char* userName, const char* password, net_handle_t netHandle, const char* contents, std::vector& data) { std::string auth; @@ -78,7 +94,13 @@ int DoPutRequest(const char* url, const char* userName, const char* password, co // DIGEST Auth curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); } - // 设置回调函数 + + if (netHandle != NETWORK_UNSPECIFIED) + { + curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, SockOptCallback); + curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &netHandle); + } + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); // 设置回调函数的参数,获取反馈信息 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); @@ -89,10 +111,6 @@ int DoPutRequest(const char* url, const char* userName, const char* password, co // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); - if (interface != NULL && strlen(interface) > 0) - { - curl_easy_setopt(curl, CURLOPT_INTERFACE , interface); - } CURLcode nRet = curl_easy_perform(curl); if (CURLE_OK != nRet) { @@ -103,12 +121,64 @@ int DoPutRequest(const char* url, const char* userName, const char* password, co return (0 == nRet) ? 0 : 1; } -namespace nc_hy +bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo) { - bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo) + bool res = false; + std::vector data; + const char* userName = NULL; + const char* password = NULL; + if (photoInfo.authType != 0) + { + userName = photoInfo.userName; + password = photoInfo.password; + } + + std::string url = "http://"; + url += photoInfo.ip; + url += photoInfo.url; + + int nRet = DoGetRequest(url.c_str(), userName, password, photoInfo.netHandle, data); + if (0 == nRet) + { + if (!data.empty()) + { + FILE *fp = fopen(photoInfo.outputPath, "wb"); + if (fp != NULL) + { + fwrite(&data[0], data.size(), 1, fp); + fclose(fp); + res = true; + } + } + } + + return res; +} + +bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img) +{ + bool res = false; + const char* userName = NULL; + const char* password = NULL; + if (photoInfo.authType != 0) + { + userName = photoInfo.userName; + password = photoInfo.password; + } + + std::string url = "http://"; + url += photoInfo.ip; + url += photoInfo.url; + + int nRet = DoGetRequest(url.c_str(), userName, password, photoInfo.netHandle, img); + return (0 == nRet); +} + +namespace nc_hk +{ + bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img) { bool res = false; - std::vector data; const char* userName = NULL; const char* password = NULL; if (photoInfo.authType != 0) @@ -116,30 +186,30 @@ namespace nc_hy userName = photoInfo.userName; password = photoInfo.password; } - const char* interface = photoInfo.interface; std::string url = "http://"; url += photoInfo.ip; url += photoInfo.url; - int nRet = DoGetRequest(url.c_str(), userName, password, interface, data); + int nRet = DoGetRequest(url.c_str(), userName, password, photoInfo.netHandle, img); +#ifdef _DEBUG if (0 == nRet) { - if (!data.empty()) + FILE *fp = fopen("/sdcard/com.xypower.mpapp/tmp/netimg.jpg", "wb"); + if (fp != NULL) { - FILE *fp = fopen(photoInfo.outputPath, "wb"); - if (fp != NULL) - { - fwrite(&data[0], data.size(), 1, fp); - fclose(fp); - res = true; - } + fwrite(&img[0], img.size(), 1, fp); + fclose(fp); } } - - return res; +#endif + return (0 == nRet); } +} + +namespace nc_ys +{ bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img) { bool res = false; @@ -155,7 +225,7 @@ namespace nc_hy url += photoInfo.ip; url += photoInfo.url; - int nRet = DoGetRequest(url.c_str(), userName, password, photoInfo.interface, img); + int nRet = DoGetRequest(url.c_str(), userName, password, photoInfo.netHandle, img); #ifdef _DEBUG if (0 == nRet) { @@ -169,4 +239,4 @@ namespace nc_hy #endif return (0 == nRet); } -} +} \ No newline at end of file diff --git a/app/src/main/cpp/netcamera/httpclient.h b/app/src/main/cpp/netcamera/httpclient.h index d09d4dbf..e1cc05d9 100644 --- a/app/src/main/cpp/netcamera/httpclient.h +++ b/app/src/main/cpp/netcamera/httpclient.h @@ -9,12 +9,14 @@ #include #include +#include + #ifndef __HTTP_CLIENT__ #define __HTTP_CLIENT__ bool setIPAddress(const char *if_name, const char *ip_addr, const char *net_mask, const char *gateway_addr); -int DoGetRequest(const char* url, const char* userName, const char* password, const char* interface, std::vector& data); -int DoPutRequest(const char* url, const char* userName, const char* password, const char* interface, const char* contents, std::vector& data); +int DoGetRequest(const char* url, const char* userName, const char* password, net_handle_t netHandle, std::vector& data); +int DoPutRequest(const char* url, const char* userName, const char* password, net_handle_t netHandle, const char* contents, std::vector& data); #endif // __HTTP_CLIENT__ \ No newline at end of file diff --git a/app/src/main/cpp/netcamera/netcamera.h b/app/src/main/cpp/netcamera/netcamera.h index c15812c6..c5326734 100644 --- a/app/src/main/cpp/netcamera/netcamera.h +++ b/app/src/main/cpp/netcamera/netcamera.h @@ -1,5 +1,6 @@ #include #include +#include #ifndef __NET_CAMERA__ #define __NET_CAMERA__ @@ -7,14 +8,14 @@ struct NET_PHOTO_INFO { + net_handle_t netHandle; + unsigned char authType; // 0, 1 + unsigned char reserved[7]; // for memory alignment char ip[24]; char userName[8]; char password[16]; - char interface[16]; char url[128]; char outputPath[128]; - unsigned char authType; // 0, 1 - unsigned char reserved[7]; // for memory alignment }; /* @@ -31,15 +32,19 @@ struct NET_PHOTO_INFO }; */ -namespace nc_hy + +bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo); +bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img); + +namespace nc_hk { - bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo); bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img); } -namespace nc_hk + +namespace nc_ys { - bool requestCapture(uint8_t channel); + bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img); } #endif // __NET_CAMERA__ \ No newline at end of file diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index d0c66e33..386f3c68 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -161,6 +161,9 @@ public class MicroPhotoService extends Service { FileOutputStream mAppRunningFile; FileLock mAppLock; + private ConnectivityManager mConnectivityManager = null; + private ConnectivityManager.NetworkCallback mNetworkCallback = null; + private Runnable delayedSleep = new Runnable() { @Override public void run() { @@ -1440,6 +1443,38 @@ public class MicroPhotoService extends Service { public void setStaticNetwork(String iface, String ip, String netmask, String gateway) { + if (mConnectivityManager == null || mNetworkCallback == null) { + mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); + mNetworkCallback = new ConnectivityManager.NetworkCallback() { + + @Override + public void onLost(Network network) { + Log.d(TAG, "Network Lost " + network.toString()); + updateEhernet(mNativeHandle, network.getNetworkHandle(), false); + } + @Override + public void onAvailable(final Network network) { + Log.d(TAG, "Network Available " + network.toString()); + updateEhernet(mNativeHandle, network.getNetworkHandle(), true); + } + }; + + NetworkRequest request = new NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) + .build(); + + mConnectivityManager.registerNetworkCallback(request, mNetworkCallback); + + Network[] nws = mConnectivityManager.getAllNetworks(); + for (Network nw : nws) { + NetworkInfo ni = mConnectivityManager.getNetworkInfo(nw); + if (ni.getType() == ConnectivityManager.TYPE_ETHERNET) { + updateEhernet(mNativeHandle, nw.getNetworkHandle(), true); + } + + } + } + Intent intent = new Intent(); intent.putExtra("cmd", "setnet"); intent.putExtra("staticip", true); @@ -1449,8 +1484,8 @@ public class MicroPhotoService extends Service { if (!TextUtils.isEmpty(gateway)) { intent.putExtra("gateway", gateway); } - // nn.putExtra("dns1", "8.8.8.8"); - // nn.putExtra("dns2", "192.168.1.1"); + // intent.putExtra("dns1", "8.8.8.8"); + // intent.putExtra("dns2", "192.168.19.1"); sendBroadcast(getApplicationContext(), intent); } @@ -1482,10 +1517,12 @@ cellSignalStrengthGsm.getDbm(); protected native boolean sendHeartbeat(long handler, int signalLevel); protected native boolean reloadConfigs(long handler); protected native void updatePosition(long handler, double lon, double lat, double radius, long ts); + protected native boolean updateEhernet(long handler, long nativeNetworkHandle, boolean available); protected native boolean uninit(long handler); protected native void recordingFinished(long handler, boolean photoOrVideo, boolean result, String path, long videoId); protected native void captureFinished(long handler, boolean photoOrVideo, boolean result, Bitmap bm, long videoId); protected native void burstCaptureFinished(long handler, boolean result, int numberOfCaptures, String pathsJoinedByTab, boolean frontCamera, int rotation, long photoId); + public static native long takePhoto(int channel, int preset, boolean photoOrVideo, String configFilePath, String path); public static native void releaseDeviceHandle(long deviceHandle); public static native boolean sendExternalPhoto(long deviceHandle, String path, long photoInfo); @@ -1508,8 +1545,6 @@ cellSignalStrengthGsm.getDbm(); public static native boolean exportPublicKeyFile(int index, String outputPath); public static native boolean exportPrivateFile(int index, String outputPath); - - ////////////////////////GPS//////////////////// // private static final String GPS_LOCATION_NAME = android.location.LocationManager.GPS_PROVIDER; private LocationManager mLocationManager; From e2c0cff2e385fe9bed1eb97f495cee15518380ef Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 25 Nov 2024 11:56:51 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=91=84=E5=83=8F?= =?UTF-8?q?=E5=A4=B4=E7=94=A8=E6=88=B7=E5=90=8D=E5=92=8C=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 5ce32271..5acaeb3f 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1561,7 +1561,14 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< addr.s_addr = localPhotoInfo.ip; strcpy(netPhotoInfo.ip, inet_ntoa(addr)); strcpy(netPhotoInfo.outputPath, path.c_str()); - + if (!localPhotoInfo.userName.empty()) + { + strncpy(netPhotoInfo.userName, localPhotoInfo.userName.c_str(), std::min(sizeof(netPhotoInfo.userName) - 1, localPhotoInfo.userName.size())); + } + if (!localPhotoInfo.password.empty()) + { + strncpy(netPhotoInfo.password, localPhotoInfo.password.c_str(), std::min(sizeof(netPhotoInfo.password) - 1, localPhotoInfo.password.size())); + } // strcpy(netPhotoInfo.interface, "eth0"); std::vector img; From 1e72f8e4c4921520159447a76209822219047b79 Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 25 Nov 2024 12:28:05 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 5acaeb3f..257869ec 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1528,7 +1528,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< if (netHandle == 0) { // timeout - XYLOG(XYLOG_SEVERITY_ERROR, "Ethernet not existing CH=%u PR=%X PHOTOID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.preset, photoInfo.photoId); + XYLOG(XYLOG_SEVERITY_ERROR, "Ethernet not existing CH=%u PR=%X PHOTOID=%u", (uint32_t)localPhotoInfo.channel, (uint32_t)localPhotoInfo.preset, localPhotoInfo.photoId); pThis->TakePhotoCb(0, localPhotoInfo, "", 0); return; } @@ -1552,7 +1552,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } else { - XYLOG(XYLOG_SEVERITY_ERROR, "Vendor(%u) not Supported CH=%u PR=%X PHOTOID=%u", (uint32_t)localPhotoInfo.vendor, (uint32_t)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); + XYLOG(XYLOG_SEVERITY_ERROR, "Vendor(%u) not Supported CH=%u PR=%X PHOTOID=%u", (uint32_t)localPhotoInfo.vendor, (uint32_t)localPhotoInfo.channel, (unsigned int)localPhotoInfo.preset, localPhotoInfo.photoId); pThis->TakePhotoCb(0, localPhotoInfo, "", 0); return; } From 9617743566665f9acea3db21e4ebace0ae27dd86 Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 25 Nov 2024 12:29:36 +0800 Subject: [PATCH 16/25] Update version to 1.1.8 Based Core Version to 1.2.6 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 76f6f1af..f6a1d385 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 1 -def AppBuildNumber = 7 +def AppBuildNumber = 8 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From 140726808f18ebc8418759ffeb72a807a26e8af2 Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Mon, 25 Nov 2024 15:40:12 +0800 Subject: [PATCH 17/25] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E6=8B=8D=E7=85=A7?= =?UTF-8?q?=E7=94=B5=E6=BA=90=E8=87=AA=E5=90=AF=EF=BC=8C=E6=8B=8D=E7=85=A7?= =?UTF-8?q?=E7=94=B5=E6=BA=90=E7=A7=BB=E5=8A=A8=E8=87=B3phoneDevice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 53 ++++++++++++++++++++++++++++++-- app/src/main/cpp/PhoneDevice.h | 10 +++++- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 257869ec..cee3c79b 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -407,6 +407,9 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa m_signalLevel = 0; m_signalLevelUpdateTime = time(NULL); mBuildTime = 0; + m_cameraStatus = false; + m_sensorsStatus = false; + m_lastTime = 0; RegisterHandlerForSignal(SIGUSR2); @@ -1698,6 +1701,52 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< return res; } +bool CPhoneDevice::OpenPTZSensors(int sec) +{ + { + std::lock_guard lock(m_cameraLocker); + if (!m_cameraStatus && !m_sensorsStatus) { + m_sensorsStatus = true; + OpenSensors(MAIN_POWER_OPEN); + OpenSensors(CAMERA_SENSOR_OPEN); + } + + } + + if(m_sensorsStatus && !m_cameraStatus) + std::this_thread::sleep_for(std::chrono::seconds(sec)); + + { + std::lock_guard lock(m_cameraLocker); + if (!m_cameraStatus && m_sensorsStatus) { + m_cameraStatus = true; + } + } + + return m_cameraStatus; +} + +bool CPhoneDevice::ClosePTZSensors() +{ + std::lock_guard lock(m_cameraLocker); + CloseSensors(CAMERA_SENSOR_OPEN); + CloseSensors(MAIN_POWER_OPEN); + m_cameraStatus = false; + m_sensorsStatus = false; + return true; +} + +bool CPhoneDevice::GetPTZSensorsStatus() +{ + std::lock_guard lock(m_cameraLocker); + return m_sensorsStatus; +} +bool CPhoneDevice::GetCameraStatus() +{ + std::lock_guard lock(m_cameraLocker); + return m_cameraStatus; +} + bool CPhoneDevice::CloseCamera() { if (mCamera != NULL) @@ -3453,7 +3502,7 @@ bool CPhoneDevice::OpenSensors(int sensortype) // GpioControl::setInt(CMD_SET_CAM_3V3_EN_STATE, 1); // 打开3.3V电压 // GpioControl::setInt(CMD_SET_3V3_PWR_ENABLE, 1); } - if(sensortype == WEATHER_SENSOR_OPEN || sensortype == ICETHICK_SENSOR_OPEN) + if(sensortype == WEATHER_SENSOR_OPEN) { #ifndef USING_N938 #else @@ -3519,7 +3568,7 @@ bool CPhoneDevice::CloseSensors(int sensortype) #endif #endif } - if(sensortype == WEATHER_SENSOR_OPEN || sensortype == ICETHICK_SENSOR_OPEN) + if(sensortype == WEATHER_SENSOR_OPEN ) { #ifndef USING_N938 #else diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index a05da140..f24ca7f1 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -231,7 +231,10 @@ public: virtual int GetIceData(ICE_INFO *iceInfo, ICE_TAIL *icetail, SENSOR_PARAM *sensorParam); virtual bool OpenSensors(int sensortype); virtual bool CloseSensors(int sensortype); -// bool CapturePhoto(unsigned char channel, unsigned char type); + virtual bool OpenPTZSensors(int sec); + virtual bool ClosePTZSensors(); + virtual bool GetPTZSensorsStatus(); + virtual bool GetCameraStatus(); bool LoadNetworkInfo(); bool GetNextScheduleItem(uint32_t tsBasedZero, uint32_t scheduleTime, vector& items); @@ -389,6 +392,11 @@ protected: std::string m_simcard; + mutable std::mutex m_cameraLocker; + bool m_cameraStatus; + bool m_sensorsStatus; + time_t m_lastTime; + }; From 64b75e994d4101b9395d4498426b75d427a8257a Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 26 Nov 2024 11:57:31 +0800 Subject: [PATCH 18/25] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=91=84=E5=83=8F?= =?UTF-8?q?=E6=9C=BA=E6=8B=8D=E7=85=A7=E7=9A=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/GPIOControl.h | 4 + app/src/main/cpp/PhoneDevice.cpp | 146 +++++++++++------- app/src/main/cpp/netcamera/httpclient.cpp | 2 +- .../com/xypower/mpapp/MicroPhotoService.java | 23 ++- 4 files changed, 120 insertions(+), 55 deletions(-) diff --git a/app/src/main/cpp/GPIOControl.h b/app/src/main/cpp/GPIOControl.h index 95eca7f7..e862e2a8 100644 --- a/app/src/main/cpp/GPIOControl.h +++ b/app/src/main/cpp/GPIOControl.h @@ -108,6 +108,10 @@ #define CMD_SPI2SERIAL_POWER_EN 368 #define CMD_RS485_3V3_EN 369 +// Others +#define CMD_SET_485_EN_STATE 131 +#define CMD_SET_OTG_STATE 107 + #endif // USING_N938 diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index cee3c79b..a5351aa0 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -195,6 +195,37 @@ static inline uint32_t YUV2RGB(int nY, int nU, int nV) { return 0xff000000 | (nR << 16) | (nG << 8) | nB; } +class AutoEnv +{ +public: + AutoEnv(JavaVM* vm) + { + didAttachThread = false; + env = NULL; + m_vm = vm; + + jboolean ret = JNI_FALSE; + bool res = GetJniEnv(m_vm, &env, didAttachThread); + if (!res) + { + ALOGE("Failed to get JNI Env"); + } + } + + ~AutoEnv() + { + if (didAttachThread) + { + m_vm->DetachCurrentThread(); + } + } + +private: + JavaVM* m_vm; + JNIEnv* env; + bool didAttachThread; +}; + CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params) : NdkCamera(width, height, params), m_dev(dev) { } @@ -1430,6 +1461,10 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< if (photoInfo.cameraType == CAM_TYPE_NET) { GpioControl::set12VEnable(true); +#ifdef USING_N938 + GpioControl::setInt(CMD_SET_NETWORK_POWER_EN, 1); + GpioControl::setInt(CMD_SET_485_EN_STATE, 1); +#endif } TurnOnCameraPower(NULL); @@ -1500,16 +1535,21 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } else if ((mPhotoInfo.mediaType == 0) && (mPhotoInfo.cameraType == CAM_TYPE_NET)) { + XYLOG(XYLOG_SEVERITY_INFO, "Start TP on NET Camera CH=%u PR=%X PHOTOID=%u", (uint32_t)mPhotoInfo.channel, (uint32_t)mPhotoInfo.preset, mPhotoInfo.photoId); + // Start Thread CPhoneDevice* pThis = this; vector osds; osds.swap(mOsds); IDevice::PHOTO_INFO localPhotoInfo = mPhotoInfo; + pThis->SetStaticIp(); std::thread t([localPhotoInfo, path, pThis, osds]() mutable { - pThis->SetStaticIp(); + AutoEnv autoEnv(pThis->m_vm); + + std::this_thread::sleep_for(std::chrono::milliseconds(10240)); net_handle_t netHandle = pThis->GetNetHandle(); @@ -1533,9 +1573,19 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< // timeout XYLOG(XYLOG_SEVERITY_ERROR, "Ethernet not existing CH=%u PR=%X PHOTOID=%u", (uint32_t)localPhotoInfo.channel, (uint32_t)localPhotoInfo.preset, localPhotoInfo.photoId); pThis->TakePhotoCb(0, localPhotoInfo, "", 0); + + TurnOffOtg(NULL); + GpioControl::set12VEnable(false); +#ifdef USING_N938 + GpioControl::setInt(CMD_SET_NETWORK_POWER_EN, 0); + GpioControl::setInt(CMD_SET_485_EN_STATE, 0); +#endif return; } - + else + { + XYLOG(XYLOG_SEVERITY_INFO, "Ethernet is Available CH=%u PR=%X PHOTOID=%u", (uint32_t)localPhotoInfo.channel, (uint32_t)localPhotoInfo.preset, localPhotoInfo.photoId); + } NET_PHOTO_INFO netPhotoInfo = { netHandle, 0 }; if (localPhotoInfo.vendor == 1) { @@ -1557,6 +1607,13 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< { XYLOG(XYLOG_SEVERITY_ERROR, "Vendor(%u) not Supported CH=%u PR=%X PHOTOID=%u", (uint32_t)localPhotoInfo.vendor, (uint32_t)localPhotoInfo.channel, (unsigned int)localPhotoInfo.preset, localPhotoInfo.photoId); pThis->TakePhotoCb(0, localPhotoInfo, "", 0); + + TurnOffOtg(NULL); + GpioControl::set12VEnable(false); +#ifdef USING_N938 + GpioControl::setInt(CMD_SET_NETWORK_POWER_EN, 0); + GpioControl::setInt(CMD_SET_485_EN_STATE, 0); +#endif return; } @@ -1566,18 +1623,40 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< strcpy(netPhotoInfo.outputPath, path.c_str()); if (!localPhotoInfo.userName.empty()) { - strncpy(netPhotoInfo.userName, localPhotoInfo.userName.c_str(), std::min(sizeof(netPhotoInfo.userName) - 1, localPhotoInfo.userName.size())); + size_t len = std::min(sizeof(netPhotoInfo.userName) - 1, localPhotoInfo.userName.size()); + strncpy(netPhotoInfo.userName, localPhotoInfo.userName.c_str(), len); } if (!localPhotoInfo.password.empty()) { - strncpy(netPhotoInfo.password, localPhotoInfo.password.c_str(), std::min(sizeof(netPhotoInfo.password) - 1, localPhotoInfo.password.size())); + size_t len = std::min(sizeof(netPhotoInfo.password) - 1, localPhotoInfo.password.size()); + strncpy(netPhotoInfo.password, localPhotoInfo.password.c_str(), len); } // strcpy(netPhotoInfo.interface, "eth0"); std::vector img; - bool res = requestCapture(localPhotoInfo.channel, localPhotoInfo.preset, netPhotoInfo, img); - if (res) + bool netCaptureResult = false; + for (int idx = 0; idx < 3; idx++) + { + netHandle = pThis->GetNetHandle(); + netPhotoInfo.netHandle = netHandle; + + XYLOG(XYLOG_SEVERITY_INFO, "NetCapture %d NetHandle=%lld PHOTOID=%u", idx, netHandle, localPhotoInfo.photoId); + + netCaptureResult = requestCapture(localPhotoInfo.channel, localPhotoInfo.preset, netPhotoInfo, img); + if (netCaptureResult) + { + break; + } + } + + TurnOffOtg(NULL); + GpioControl::set12VEnable(false); +#ifdef USING_N938 + GpioControl::setInt(CMD_SET_NETWORK_POWER_EN, 0); + GpioControl::setInt(CMD_SET_485_EN_STATE, 0); +#endif + if (netCaptureResult) { time_t takingTime = time(NULL); if (localPhotoInfo.remedy != 0) @@ -1589,8 +1668,6 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } localPhotoInfo.photoTime = takingTime; - // GpioControl::setOtgState(false); - GpioControl::set12VEnable(false); // Notify to take next photo pThis->TakePhotoCb(1, localPhotoInfo, "", takingTime); @@ -1599,11 +1676,12 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< #ifdef _DEBUG // cv::imwrite("/sdcard/com.xypower.mpapp/tmp/netimg2.jpg", rgb); #endif - - res = pThis->PostProcessPhoto(localPhotoInfo, osds, path, "", rgb); + netCaptureResult = pThis->PostProcessPhoto(localPhotoInfo, osds, path, "", rgb); } else { + XYLOG(XYLOG_SEVERITY_ERROR, "Faile to TP on NET Camera CH=%u PR=%X PHOTOID=%u URL=http://%s%s", (uint32_t)localPhotoInfo.channel, (uint32_t)localPhotoInfo.preset, + localPhotoInfo.photoId, netPhotoInfo.ip, netPhotoInfo.url); pThis->TakePhotoCb(0, localPhotoInfo, "", 0); } }); @@ -3282,67 +3360,29 @@ void CPhoneDevice::UpdatePosition(double lon, double lat, double radius, time_t void CPhoneDevice::TurnOnCameraPower(JNIEnv* env) { m_powerLocker.lock(); - if (mCameraPowerCount == 0) - { - GpioControl::setCam3V3Enable(true); - } - mCameraPowerCount++; + GpioControl::setCam3V3Enable(true); m_powerLocker.unlock(); } void CPhoneDevice::TurnOffCameraPower(JNIEnv* env) { - bool turnedOff = false; m_powerLocker.lock(); - if (mCameraPowerCount > 0) - { - mCameraPowerCount--; - if (mCameraPowerCount == 0) - { - GpioControl::setCam3V3Enable(false); - turnedOff = true; - } - } + GpioControl::setCam3V3Enable(false); m_powerLocker.unlock(); - - if (turnedOff) - { - XYLOG(XYLOG_SEVERITY_INFO, "CAM PWR Turned Off"); - } } void CPhoneDevice::TurnOnOtg(JNIEnv* env) { m_powerLocker.lock(); - if (mOtgCount == 0) - { - ALOGD("setOtgState 1"); - GpioControl::setOtgState(true); - } - mOtgCount++; + GpioControl::setInt(CMD_SET_OTG_STATE, 1); m_powerLocker.unlock(); } void CPhoneDevice::TurnOffOtg(JNIEnv* env) { - bool turnedOff = false; m_powerLocker.lock(); - if (mOtgCount > 0) - { - mOtgCount--; - if (mOtgCount == 0) - { - // ALOGD("setOtgState 0"); - GpioControl::setOtgState(false); - turnedOff = true; - } - } + GpioControl::setInt(CMD_SET_OTG_STATE, 0); m_powerLocker.unlock(); - - if (turnedOff) - { - XYLOG(XYLOG_SEVERITY_INFO, "OTG PWR Turned Off"); - } } void CPhoneDevice::UpdateSignalLevel(int signalLevel) @@ -3361,6 +3401,8 @@ void CPhoneDevice::UpdateEthernet(net_handle_t nethandle, bool available) m_devLocker.lock(); m_netHandle = available ? nethandle : NETWORK_UNSPECIFIED; m_devLocker.unlock(); + + XYLOG(XYLOG_SEVERITY_WARNING, "NET Handle: %lld", available ? (uint64_t)nethandle : 0); } net_handle_t CPhoneDevice::GetNetHandle() const diff --git a/app/src/main/cpp/netcamera/httpclient.cpp b/app/src/main/cpp/netcamera/httpclient.cpp index 1d2deaef..ddb325d1 100644 --- a/app/src/main/cpp/netcamera/httpclient.cpp +++ b/app/src/main/cpp/netcamera/httpclient.cpp @@ -59,7 +59,7 @@ int DoGetRequest(const char* url, const char* userName, const char* password, ne curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); // 接收数据时超时设置,如果5秒内数据未接收完,直接退出 #ifndef NDEBUG - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); #else curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); #endif diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index 386f3c68..fba0cc2e 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -25,6 +25,8 @@ import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationProvider; import android.net.ConnectivityManager; +import android.net.LinkAddress; +import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; @@ -1449,12 +1451,29 @@ public class MicroPhotoService extends Service { @Override public void onLost(Network network) { - Log.d(TAG, "Network Lost " + network.toString()); + infoLog("Network Lost " + network.toString()); updateEhernet(mNativeHandle, network.getNetworkHandle(), false); } @Override public void onAvailable(final Network network) { - Log.d(TAG, "Network Available " + network.toString()); + String ip = ""; + try { + NetworkInfo ni = mConnectivityManager.getNetworkInfo(network); + LinkProperties lp = mConnectivityManager.getLinkProperties(network); + if (lp != null) { + List addresses = lp.getLinkAddresses(); + if (addresses != null && addresses.size() > 0) { + InetAddress inetAddress = addresses.get(0).getAddress(); + if (inetAddress != null) { + ip = inetAddress.getHostAddress(); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + infoLog("Network Available " + network.toString() + " IP=" + ip); updateEhernet(mNativeHandle, network.getNetworkHandle(), true); } }; From 80c9ed157ac4283a88a835c03a020c8f88453772 Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 26 Nov 2024 12:22:53 +0800 Subject: [PATCH 19/25] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E7=BA=BF=E7=A8=8B=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index a5351aa0..252dbc1e 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1547,7 +1547,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< std::thread t([localPhotoInfo, path, pThis, osds]() mutable { - AutoEnv autoEnv(pThis->m_vm); + // AutoEnv autoEnv(pThis->m_vm); std::this_thread::sleep_for(std::chrono::milliseconds(10240)); From c6eee571158bf79e5d07f1f2a15ea9d85f0d1d93 Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Tue, 26 Nov 2024 17:31:55 +0800 Subject: [PATCH 20/25] =?UTF-8?q?=E6=8B=8D=E7=85=A7=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E9=A2=84=E7=BD=AE=E4=BD=8D=EF=BC=8C=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E5=85=B3=E7=94=B5=E6=BA=90=E4=B8=8D=E7=AD=89=E5=BE=85?= =?UTF-8?q?=E8=87=AA=E6=A3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 57 ++++++++++++++++++++++++++------ app/src/main/cpp/PhoneDevice.h | 1 + 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index a5351aa0..cf8c3e3f 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -441,6 +441,7 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa m_cameraStatus = false; m_sensorsStatus = false; m_lastTime = 0; + m_shouldStopWaiting = false; RegisterHandlerForSignal(SIGUSR2); @@ -1690,9 +1691,11 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } else if (mPhotoInfo.mediaType == 0 && (mPhotoInfo.cameraType == CAM_TYPE_SERIAL)) { - // if (photoInfo.mediaType == 0) { - // CameraPhotoCmd(time(NULL), channel, MOVE_PRESETNO, 0, type); - // std::this_thread::sleep_for(std::chrono::seconds(2)); + if (photoInfo.preset != 0 && photoInfo.preset != 0xFF) + { + CameraPhotoCmd(time(NULL), photoInfo.channel, MOVE_PRESETNO, 0, photoInfo.preset); + std::this_thread::sleep_for(std::chrono::seconds(2)); + } time_t ts = time(NULL); CameraPhotoCmd(ts, photoInfo.channel, 0, 6, 0); TakePTZPhotoCb(3, photoInfo); @@ -1783,7 +1786,9 @@ bool CPhoneDevice::OpenPTZSensors(int sec) { { std::lock_guard lock(m_cameraLocker); - if (!m_cameraStatus && !m_sensorsStatus) { +// std::unique_lock lock(m_cameraLocker); + if (!m_cameraStatus && !m_sensorsStatus) + { m_sensorsStatus = true; OpenSensors(MAIN_POWER_OPEN); OpenSensors(CAMERA_SENSOR_OPEN); @@ -1792,25 +1797,55 @@ bool CPhoneDevice::OpenPTZSensors(int sec) } if(m_sensorsStatus && !m_cameraStatus) - std::this_thread::sleep_for(std::chrono::seconds(sec)); + { + auto start = std::chrono::steady_clock::now(); + while (std::chrono::steady_clock::now() - start < std::chrono::seconds(sec)) + { + if (m_shouldStopWaiting.load()) + { + CloseSensors(CAMERA_SENSOR_OPEN); + CloseSensors(MAIN_POWER_OPEN); + m_cameraStatus = false; + m_sensorsStatus = false; + m_shouldStopWaiting.store(false); + return false; + } + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + } + } + +// if(m_sensorsStatus && !m_cameraStatus) +// std::this_thread::sleep_for(std::chrono::seconds(sec)); { std::lock_guard lock(m_cameraLocker); - if (!m_cameraStatus && m_sensorsStatus) { +// std::unique_lock lock(m_cameraLocker); + if (!m_cameraStatus && m_sensorsStatus) + { m_cameraStatus = true; } } return m_cameraStatus; + + } bool CPhoneDevice::ClosePTZSensors() { - std::lock_guard lock(m_cameraLocker); - CloseSensors(CAMERA_SENSOR_OPEN); - CloseSensors(MAIN_POWER_OPEN); - m_cameraStatus = false; - m_sensorsStatus = false; + if(m_sensorsStatus && !m_cameraStatus) + { + m_shouldStopWaiting.store(true); + } + else + { + std::lock_guard lock(m_cameraLocker); +// std::unique_lock lock(m_cameraLocker); + CloseSensors(CAMERA_SENSOR_OPEN); + CloseSensors(MAIN_POWER_OPEN); + m_cameraStatus = false; + m_sensorsStatus = false; + } return true; } diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index f24ca7f1..367a24fc 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -396,6 +396,7 @@ protected: bool m_cameraStatus; bool m_sensorsStatus; time_t m_lastTime; + std::atomic m_shouldStopWaiting; }; From fefa90b01f31e334806e3c56fd75e31b96abfeac Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Wed, 27 Nov 2024 10:31:20 +0800 Subject: [PATCH 21/25] =?UTF-8?q?=E5=87=8F=E5=B0=91=E7=94=B5=E6=BA=90?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index cf8c3e3f..81161013 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1810,7 +1810,7 @@ bool CPhoneDevice::OpenPTZSensors(int sec) m_shouldStopWaiting.store(false); return false; } - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); } } From e7da756eec574d0f7cb0be9e864687d321989646 Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Wed, 27 Nov 2024 17:01:08 +0800 Subject: [PATCH 22/25] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B0=94=E8=B1=A1?= =?UTF-8?q?=E8=A6=86=E5=86=B0=E5=86=85=E5=AD=98=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 146 ++++++++++++++++++++++++------- app/src/main/cpp/PhoneDevice.h | 3 + 2 files changed, 119 insertions(+), 30 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 81161013..6aeba2be 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -3479,6 +3479,11 @@ void CPhoneDevice::SetStaticIp(const std::string& iface, const std::string& ip, int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceTail, SENSOR_PARAM *sensorParam) { + m_tempData.instantaneous_windspeed = 0; + m_tempData.air_temperature = 0; + m_tempData.instantaneous_winddirection = 0; + m_tempData.humidity = 0; + Collect_sensor_data(); //15s Data_DEF airt; //++等值覆冰厚度, 综合悬挂载荷, 不均衡张力差 置0 @@ -3493,54 +3498,135 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT if(sensorParam[num].SensorsType == RALLY_PROTOCOL) { GetPullValue(num, &airt); - iceInfo->t_sensor_data[pullno].original_tension = airt.EuValue; + if(airt.AiState == 2) + iceInfo->t_sensor_data[pullno].original_tension = airt.EuValue; pullno++; } else if(sensorParam[num].SensorsType == SLANT_PROTOCOL) { GetAngleValue(num, &airt, 0); - iceInfo->t_sensor_data[angleno].deflection_angle = airt.EuValue; + if(airt.AiState == 2) + iceInfo->t_sensor_data[angleno].deflection_angle = airt.EuValue; GetAngleValue(num, &airt, 1); - iceInfo->t_sensor_data[angleno].windage_yaw_angle = airt.EuValue; + if(airt.AiState == 2) + iceInfo->t_sensor_data[angleno].windage_yaw_angle = airt.EuValue; angleno++; } } - GetWindSpeedData(&airt); - iceTail->instantaneous_windspeed = airt.EuValue; - GetWindDirectionData(&airt); - iceTail->instantaneous_winddirection = airt.EuValue;//需求无符号整数给出浮点数 - GetAirTempData(&airt); - iceTail->air_temperature = airt.EuValue; - GetHumidityData(&airt); - iceTail->humidity = airt.EuValue;//需求无符号整数给出浮点数 + { + std::lock_guard lock(m_dataLocker); + GetWindSpeedData(&airt); + if(airt.AiState == 2) + { + iceTail->instantaneous_windspeed = airt.EuValue; + m_tempData.instantaneous_windspeed = iceTail->instantaneous_windspeed; + } else + { + iceTail->instantaneous_windspeed = m_tempData.instantaneous_windspeed; + m_tempData.instantaneous_windspeed = 0; + } + GetWindDirectionData(&airt); + if(airt.AiState == 2) + { + iceTail->instantaneous_winddirection = airt.EuValue; + m_tempData.instantaneous_winddirection = iceTail->instantaneous_winddirection; + } else + { + iceTail->instantaneous_winddirection = m_tempData.instantaneous_winddirection; + m_tempData.instantaneous_winddirection = 0; + } + GetAirTempData(&airt); + if(airt.AiState == 2) { + iceTail->air_temperature = airt.EuValue; + m_tempData.air_temperature = iceTail->air_temperature; + } else + { + iceTail->air_temperature = m_tempData.air_temperature; + m_tempData.air_temperature = 0; + } + GetHumidityData(&airt); + if(airt.AiState == 2) + { + iceTail->humidity = airt.EuValue; + m_tempData.humidity = iceTail->humidity; + } else + { + iceTail->humidity = m_tempData.humidity; + m_tempData.humidity = 0; + } + + } return true; } int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) { + m_tempData.instantaneous_windspeed = 0; + m_tempData.air_temperature = 0; + m_tempData.instantaneous_winddirection = 0; + m_tempData.humidity = 0; + Collect_sensor_data(); //15s Data_DEF airt; - GetWeatherData(&airt, 0); - weatherInfo->air_temperature = airt.EuValue; - GetWeatherData(&airt, 1); - weatherInfo->humidity = airt.EuValue; - GetWeatherData(&airt, 2); - weatherInfo->avg_windspeed_10min = airt.EuValue; - weatherInfo->extreme_windspeed = airt.EuValue; - weatherInfo->standard_windspeed = airt.EuValue; - GetWeatherData(&airt, 3); - weatherInfo->avg_winddirection_10min = airt.EuValue; - GetWeatherData(&airt, 4); - if(airt.AiState == 2) - weatherInfo->precipitation = airt.EuValue; - GetWeatherData(&airt, 5); - if(airt.AiState == 2) - weatherInfo->air_pressure = airt.EuValue; - GetWeatherData(&airt, 6); - if(airt.AiState == 2) - weatherInfo->radiation_intensity = airt.EuValue; + { + std::lock_guard lock(m_dataLocker); + GetWeatherData(&airt, 2); + if(airt.AiState == 2) + { + weatherInfo->avg_windspeed_10min = airt.EuValue; + weatherInfo->extreme_windspeed = airt.EuValue; + weatherInfo->standard_windspeed = airt.EuValue; + m_tempData.instantaneous_windspeed = weatherInfo->avg_windspeed_10min; + } else + { + weatherInfo->avg_windspeed_10min = m_tempData.instantaneous_windspeed; + weatherInfo->extreme_windspeed = m_tempData.instantaneous_windspeed; + weatherInfo->standard_windspeed = m_tempData.instantaneous_windspeed; + m_tempData.instantaneous_windspeed = 0; + } + GetWeatherData(&airt, 3); + if(airt.AiState == 2) + { + weatherInfo->avg_winddirection_10min = airt.EuValue; + m_tempData.instantaneous_winddirection = weatherInfo->avg_winddirection_10min; + } else + { + weatherInfo->avg_winddirection_10min = m_tempData.instantaneous_winddirection; + m_tempData.instantaneous_winddirection = 0; + } + GetWeatherData(&airt, 0); + if(airt.AiState == 2) + { + weatherInfo->air_temperature = airt.EuValue; + m_tempData.air_temperature = weatherInfo->air_temperature; + } else + { + weatherInfo->air_temperature = m_tempData.air_temperature; + m_tempData.air_temperature = 0; + } + GetWeatherData(&airt, 1); + if(airt.AiState == 2) + { + weatherInfo->humidity = airt.EuValue; + m_tempData.humidity = weatherInfo->humidity; + } else + { + weatherInfo->humidity = m_tempData.humidity; + m_tempData.humidity = 0; + } + GetWeatherData(&airt, 4); + if(airt.AiState == 2) + weatherInfo->precipitation = airt.EuValue; + GetWeatherData(&airt, 5); + if(airt.AiState == 2) + weatherInfo->air_pressure = airt.EuValue; + GetWeatherData(&airt, 6); + if(airt.AiState == 2) + weatherInfo->radiation_intensity = airt.EuValue; + } + return true; } diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index 367a24fc..bdb0d603 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -398,6 +398,9 @@ protected: time_t m_lastTime; std::atomic m_shouldStopWaiting; + IDevice::ICE_TAIL m_tempData; + mutable std::mutex m_dataLocker; + }; From d1571fad005793a7f954c9bc870e920b8b4921b4 Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Thu, 28 Nov 2024 14:39:25 +0800 Subject: [PATCH 23/25] =?UTF-8?q?=E4=B8=B2=E5=8F=A3=E6=8B=8D=E7=85=A7?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=A4=84=E7=90=86=EF=BC=9B=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E6=8B=8D=E7=85=A7=E5=89=8D=E6=9C=AA=E5=BC=80=E5=90=AF=E7=94=B5?= =?UTF-8?q?=E6=BA=90=E5=88=99=E5=BC=80=E7=94=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 1b85e0be..2848e3be 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1697,9 +1697,12 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< std::this_thread::sleep_for(std::chrono::seconds(2)); } time_t ts = time(NULL); + if(!GetPTZSensorsStatus() && !GetCameraStatus()) + { + OpenPTZSensors(120); + } CameraPhotoCmd(ts, photoInfo.channel, 0, 6, 0); - TakePTZPhotoCb(3, photoInfo); - res = true; + res = TakePTZPhotoCb(3, photoInfo); } else if (mPhotoInfo.usingSysCamera == 1) { @@ -1837,7 +1840,7 @@ bool CPhoneDevice::ClosePTZSensors() { m_shouldStopWaiting.store(true); } - else + else if(m_sensorsStatus && m_cameraStatus) { std::lock_guard lock(m_cameraLocker); // std::unique_lock lock(m_cameraLocker); From 30e9987c9eb5f3fd676cbb5bbc173d22ed8ecbe6 Mon Sep 17 00:00:00 2001 From: "XI.CHEN" Date: Thu, 28 Nov 2024 14:39:50 +0800 Subject: [PATCH 24/25] =?UTF-8?q?=E6=B0=94=E8=B1=A1=E8=A6=86=E5=86=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9C=AA=E8=AF=BB=E5=8F=96=E5=88=B0=E7=9A=84?= =?UTF-8?q?=E5=80=BC=E7=BB=9F=E4=B8=80=E4=B8=BA0xff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 44 ++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 2848e3be..48812724 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -3482,17 +3482,17 @@ void CPhoneDevice::SetStaticIp(const std::string& iface, const std::string& ip, int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceTail, SENSOR_PARAM *sensorParam) { - m_tempData.instantaneous_windspeed = 0; - m_tempData.air_temperature = 0; - m_tempData.instantaneous_winddirection = 0; - m_tempData.humidity = 0; + m_tempData.instantaneous_windspeed = 0xff; + m_tempData.air_temperature = 0xff; + m_tempData.instantaneous_winddirection = 0xff; + m_tempData.humidity = 0xff; Collect_sensor_data(); //15s Data_DEF airt; //++等值覆冰厚度, 综合悬挂载荷, 不均衡张力差 置0 - iceInfo->equal_icethickness = 0; - iceInfo->tension = 0; - iceInfo->tension_difference = 0; + iceInfo->equal_icethickness = 0xff; + iceInfo->tension = 0xff; + iceInfo->tension_difference = 0xff; int pullno = 0; int angleno = 0; @@ -3503,15 +3503,21 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT GetPullValue(num, &airt); if(airt.AiState == 2) iceInfo->t_sensor_data[pullno].original_tension = airt.EuValue; + else + iceInfo->t_sensor_data[pullno].original_tension = 0xff; pullno++; } else if(sensorParam[num].SensorsType == SLANT_PROTOCOL) { GetAngleValue(num, &airt, 0); if(airt.AiState == 2) iceInfo->t_sensor_data[angleno].deflection_angle = airt.EuValue; + else + iceInfo->t_sensor_data[angleno].deflection_angle = 0xff; GetAngleValue(num, &airt, 1); if(airt.AiState == 2) iceInfo->t_sensor_data[angleno].windage_yaw_angle = airt.EuValue; + else + iceInfo->t_sensor_data[angleno].windage_yaw_angle =0xff; angleno++; } } @@ -3526,7 +3532,7 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT } else { iceTail->instantaneous_windspeed = m_tempData.instantaneous_windspeed; - m_tempData.instantaneous_windspeed = 0; + m_tempData.instantaneous_windspeed = 0xff; } GetWindDirectionData(&airt); if(airt.AiState == 2) @@ -3536,7 +3542,7 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT } else { iceTail->instantaneous_winddirection = m_tempData.instantaneous_winddirection; - m_tempData.instantaneous_winddirection = 0; + m_tempData.instantaneous_winddirection = 0xff; } GetAirTempData(&airt); if(airt.AiState == 2) { @@ -3545,7 +3551,7 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT } else { iceTail->air_temperature = m_tempData.air_temperature; - m_tempData.air_temperature = 0; + m_tempData.air_temperature = 0xff; } GetHumidityData(&airt); if(airt.AiState == 2) @@ -3555,7 +3561,7 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT } else { iceTail->humidity = m_tempData.humidity; - m_tempData.humidity = 0; + m_tempData.humidity = 0xff; } } @@ -3565,10 +3571,10 @@ int CPhoneDevice::GetIceData(IDevice::ICE_INFO *iceInfo, IDevice::ICE_TAIL *iceT int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) { - m_tempData.instantaneous_windspeed = 0; - m_tempData.air_temperature = 0; - m_tempData.instantaneous_winddirection = 0; - m_tempData.humidity = 0; + m_tempData.instantaneous_windspeed = 0xff; + m_tempData.air_temperature = 0xff; + m_tempData.instantaneous_winddirection = 0xff; + m_tempData.humidity = 0xff; Collect_sensor_data(); //15s @@ -3587,7 +3593,7 @@ int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) weatherInfo->avg_windspeed_10min = m_tempData.instantaneous_windspeed; weatherInfo->extreme_windspeed = m_tempData.instantaneous_windspeed; weatherInfo->standard_windspeed = m_tempData.instantaneous_windspeed; - m_tempData.instantaneous_windspeed = 0; + m_tempData.instantaneous_windspeed = 0xff; } GetWeatherData(&airt, 3); if(airt.AiState == 2) @@ -3597,7 +3603,7 @@ int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) } else { weatherInfo->avg_winddirection_10min = m_tempData.instantaneous_winddirection; - m_tempData.instantaneous_winddirection = 0; + m_tempData.instantaneous_winddirection = 0xff; } GetWeatherData(&airt, 0); if(airt.AiState == 2) @@ -3607,7 +3613,7 @@ int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) } else { weatherInfo->air_temperature = m_tempData.air_temperature; - m_tempData.air_temperature = 0; + m_tempData.air_temperature = 0xff; } GetWeatherData(&airt, 1); if(airt.AiState == 2) @@ -3617,7 +3623,7 @@ int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) } else { weatherInfo->humidity = m_tempData.humidity; - m_tempData.humidity = 0; + m_tempData.humidity = 0xff; } GetWeatherData(&airt, 4); if(airt.AiState == 2) From 8cdcbc690efb72f3a0763f7e675590cc812b5dbd Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 28 Nov 2024 14:46:33 +0800 Subject: [PATCH 25/25] Update version to 1.1.9 Based Core Version to 1.2.8 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f6a1d385..88ac3ce6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 1 -def AppBuildNumber = 8 +def AppBuildNumber = 9 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber