diff --git a/app/build.gradle b/app/build.gradle index 54d6e114..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 = 5 +def AppBuildNumber = 9 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 1c79f173..348e1eb7 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) @@ -390,6 +391,8 @@ add_library( # Sets the name of the library. ncnn/yolov5ncnn.cpp + netcamera/httpclient.cpp + #serial/WeatherComm.cpp # camera2/OpenCVFont.cpp @@ -468,7 +471,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/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/GPIOControl.cpp b/app/src/main/cpp/GPIOControl.cpp index 0203306f..68a5e437 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(param.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(); + } +} + +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 8f92e4c9..29313bad 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 @@ -119,15 +123,30 @@ >>>>>>> 1b0d0f421fe8db524af9afc327dce98899a13e6d #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); diff --git a/app/src/main/cpp/MicroPhoto.cpp b/app/src/main/cpp/MicroPhoto.cpp index e147d28d..114d527f 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; } @@ -289,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); @@ -1387,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 ac8c9a13..48812724 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 @@ -192,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) { } @@ -254,7 +288,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) { } @@ -388,7 +421,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) +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; @@ -404,9 +438,15 @@ 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; + m_shouldStopWaiting = false; RegisterHandlerForSignal(SIGUSR2); + LoadNetworkInfo(); + m_vm = vm; JNIEnv* env = NULL; bool didAttachThread = false; @@ -436,6 +476,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); @@ -489,6 +531,12 @@ CPhoneDevice::~CPhoneDevice() } m_pRecognizationCfg = NULL; } + + if (m_network != NULL) + { + delete m_network; + m_network = NULL; + } } void CPhoneDevice::SetListener(IListener* listener) @@ -1167,6 +1215,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); } @@ -1402,52 +1453,60 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< mPath = path; mOsds = osds; - 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); +#ifdef USING_N938 + GpioControl::setInt(CMD_SET_NETWORK_POWER_EN, 1); + GpioControl::setInt(CMD_SET_485_EN_STATE, 1); +#endif + } 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) @@ -1475,6 +1534,176 @@ 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 + { + // AutoEnv autoEnv(pThis->m_vm); + + std::this_thread::sleep_for(std::chrono::milliseconds(10240)); + + 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; + } + } + } + + if (netHandle == 0) + { + // 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) + { + // 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)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; + } + + struct in_addr addr; + addr.s_addr = localPhotoInfo.ip; + strcpy(netPhotoInfo.ip, inet_ntoa(addr)); + strcpy(netPhotoInfo.outputPath, path.c_str()); + if (!localPhotoInfo.userName.empty()) + { + size_t len = std::min(sizeof(netPhotoInfo.userName) - 1, localPhotoInfo.userName.size()); + strncpy(netPhotoInfo.userName, localPhotoInfo.userName.c_str(), len); + } + if (!localPhotoInfo.password.empty()) + { + 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 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) + { + if ((takingTime - localPhotoInfo.scheduleTime) > 30) + { + takingTime = localPhotoInfo.scheduleTime + localPhotoInfo.channel * 2; + } + } + + localPhotoInfo.photoTime = takingTime; + + // 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 + 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); + } + }); + + t.detach(); + } + else if (mPhotoInfo.mediaType == 0 && (mPhotoInfo.cameraType == CAM_TYPE_SERIAL)) + { + 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); + if(!GetPTZSensorsStatus() && !GetCameraStatus()) + { + OpenPTZSensors(120); + } + CameraPhotoCmd(ts, photoInfo.channel, 0, 6, 0); + res = TakePTZPhotoCb(3, photoInfo); + } else if (mPhotoInfo.usingSysCamera == 1) { JNIEnv* env = NULL; @@ -1556,6 +1785,84 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< return res; } +bool CPhoneDevice::OpenPTZSensors(int sec) +{ + { + std::lock_guard lock(m_cameraLocker); +// std::unique_lock lock(m_cameraLocker); + if (!m_cameraStatus && !m_sensorsStatus) + { + m_sensorsStatus = true; + OpenSensors(MAIN_POWER_OPEN); + OpenSensors(CAMERA_SENSOR_OPEN); + } + + } + + if(m_sensorsStatus && !m_cameraStatus) + { + 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(200)); + } + } + +// if(m_sensorsStatus && !m_cameraStatus) +// std::this_thread::sleep_for(std::chrono::seconds(sec)); + + { + std::lock_guard lock(m_cameraLocker); +// std::unique_lock lock(m_cameraLocker); + if (!m_cameraStatus && m_sensorsStatus) + { + m_cameraStatus = true; + } + } + + return m_cameraStatus; + + +} + +bool CPhoneDevice::ClosePTZSensors() +{ + if(m_sensorsStatus && !m_cameraStatus) + { + m_shouldStopWaiting.store(true); + } + else if(m_sensorsStatus && m_cameraStatus) + { + 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; +} + +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) @@ -1569,7 +1876,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)); @@ -1580,11 +1887,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); @@ -1665,7 +1977,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()) { @@ -1777,7 +2089,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()) { @@ -2118,7 +2430,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; @@ -2220,7 +2532,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()) { @@ -2963,7 +3275,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()) { @@ -2991,7 +3303,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 @@ -3008,7 +3320,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); } @@ -3030,7 +3342,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); } @@ -3049,7 +3361,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); } @@ -3086,67 +3398,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) @@ -3160,14 +3434,65 @@ 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(); + + XYLOG(XYLOG_SEVERITY_WARNING, "NET Handle: %lld", available ? (uint64_t)nethandle : 0); +} + +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; + 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) { + 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; @@ -3176,56 +3501,141 @@ 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; + else + iceInfo->t_sensor_data[pullno].original_tension = 0xff; 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; + else + iceInfo->t_sensor_data[angleno].deflection_angle = 0xff; 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; + else + iceInfo->t_sensor_data[angleno].windage_yaw_angle =0xff; 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 = 0xff; + } + 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 = 0xff; + } + 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 = 0xff; + } + GetHumidityData(&airt); + if(airt.AiState == 2) + { + iceTail->humidity = airt.EuValue; + m_tempData.humidity = iceTail->humidity; + } else + { + iceTail->humidity = m_tempData.humidity; + m_tempData.humidity = 0xff; + } + + } return true; } - - int CPhoneDevice::GetWData(IDevice::WEATHER_INFO *weatherInfo) { + 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; - 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 = 0xff; + } + 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 = 0xff; + } + 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 = 0xff; + } + 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 = 0xff; + } + 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; } @@ -3236,41 +3646,59 @@ 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 + 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); #endif - GpioControl::setInt(CMD_SET_SPI_POWER, 1); } 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) + if(sensortype == WEATHER_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 +3713,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 +3726,84 @@ 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) + if(sensortype == WEATHER_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; } + +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 c0ad2ee1..bdb0d603 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__)) @@ -153,6 +155,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: @@ -221,7 +231,12 @@ public: virtual int GetIceData(ICE_INFO *iceInfo, ICE_TAIL *icetail, SENSOR_PARAM *sensorParam); virtual bool OpenSensors(int sensortype); virtual bool CloseSensors(int sensortype); + 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); void UpdatePosition(double lon, double lat, double radius, time_t ts); @@ -238,6 +253,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); @@ -274,6 +292,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(); @@ -284,7 +313,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); @@ -298,9 +327,12 @@ 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; + mutable std::mutex m_devLocker; JavaVM* m_vm; jobject m_javaService; @@ -308,6 +340,9 @@ protected: std::string m_tfCardPath; std::string m_nativeLibraryDir; + NETWORK* m_network; + net_handle_t m_netHandle; + jmethodID mRegisterHeartbeatMid; jmethodID mUpdateCaptureScheduleMid; jmethodID mUpdateTimeMid; @@ -323,6 +358,7 @@ protected: jmethodID mEnableGpsMid; jmethodID mRequestPositionMid; jmethodID mExecHdrplusMid; + jmethodID mSetStaticIpMid; jmethodID mCallSysCameraMid; @@ -356,6 +392,15 @@ protected: std::string m_simcard; + mutable std::mutex m_cameraLocker; + bool m_cameraStatus; + bool m_sensorsStatus; + time_t m_lastTime; + std::atomic m_shouldStopWaiting; + + IDevice::ICE_TAIL m_tempData; + mutable std::mutex m_dataLocker; + }; diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 6508fcbe..4312018c 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) { @@ -510,38 +511,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; } } @@ -713,29 +714,29 @@ 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) { - 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; } } @@ -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); @@ -1049,36 +1050,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); @@ -1240,37 +1241,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; } } } @@ -1332,46 +1333,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 @@ -1479,44 +1480,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) { @@ -1597,22 +1598,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; @@ -1645,51 +1646,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; } } } @@ -1766,19 +1767,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; } } @@ -1789,24 +1790,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; } } @@ -1928,78 +1929,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; - } - - 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) - { + case 4: // 正确接收数据 + pPortParam->m_iNeedRevLength--; pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - pPortParam->m_iRevStatus = 0; - pPortParam->m_iRecvLen = 0; - } - else - { - pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; - if (pPortParam->m_iRecvLen > 200) + 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; pPortParam->m_iRecvLen = 0; } - } - break; + else + { + pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; + if (pPortParam->m_iRecvLen > 200) + { + pPortParam->m_iRecvLen = 0; + } + } + break; } } } @@ -2034,173 +2035,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; } } @@ -2361,7 +2362,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; @@ -2380,216 +2381,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); @@ -2620,44 +2621,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; @@ -2679,7 +2680,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) @@ -2698,31 +2699,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; @@ -2756,29 +2757,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; @@ -2794,129 +2795,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; @@ -2927,36 +2928,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; @@ -2976,45 +2977,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]; @@ -3091,138 +3092,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)) { @@ -3343,7 +3344,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; @@ -3387,92 +3388,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[1024]; - 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)) @@ -3506,21 +3507,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++) { @@ -3539,29 +3540,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++) @@ -3591,188 +3592,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 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) diff --git a/app/src/main/cpp/netcamera/httpclient.cpp b/app/src/main/cpp/netcamera/httpclient.cpp new file mode 100644 index 00000000..ddb325d1 --- /dev/null +++ b/app/src/main/cpp/netcamera/httpclient.cpp @@ -0,0 +1,242 @@ +#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; + 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; +} + +static int SockOptCallback(void *clientp, curl_socket_t curlfd, curlsocktype purpose) +{ + net_handle_t netHandle = *((net_handle_t *)clientp); + + 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; + + 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); + } + + 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); + // 接收数据时超时设置,如果5秒内数据未接收完,直接退出 +#ifndef NDEBUG + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); +#else + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); +#endif + // 设置重定向次数,防止重定向次数太多 + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 4); + // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); + + 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, net_handle_t netHandle, 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); + } + + 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); + // 接收数据时超时设置,如果5秒内数据未接收完,直接退出 + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); + // 设置重定向次数,防止重定向次数太多 + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 4); + // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); + + CURLcode nRet = curl_easy_perform(curl); + if (CURLE_OK != nRet) + { + printf("GET err=%d", nRet); + } + curl_easy_cleanup(curl); + + return (0 == nRet) ? 0 : 1; +} + +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; + 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); +#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); + } +} + + +namespace nc_ys +{ + 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); +#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); + } +} \ No newline at end of file diff --git a/app/src/main/cpp/netcamera/httpclient.h b/app/src/main/cpp/netcamera/httpclient.h new file mode 100644 index 00000000..e1cc05d9 --- /dev/null +++ b/app/src/main/cpp/netcamera/httpclient.h @@ -0,0 +1,22 @@ +#include +#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, 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 new file mode 100644 index 00000000..c5326734 --- /dev/null +++ b/app/src/main/cpp/netcamera/netcamera.h @@ -0,0 +1,50 @@ +#include +#include +#include + +#ifndef __NET_CAMERA__ +#define __NET_CAMERA__ + + +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 url[128]; + char outputPath[128]; +}; + + /* +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 +}; +*/ + + +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, std::vector& img); +} + + +namespace nc_ys +{ + 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 125397c6..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; @@ -161,6 +163,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() { @@ -1438,6 +1443,79 @@ public class MicroPhotoService extends Service { return exitCode; } + 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) { + infoLog("Network Lost " + network.toString()); + updateEhernet(mNativeHandle, network.getNetworkHandle(), false); + } + @Override + public void onAvailable(final Network network) { + 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); + } + }; + + 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); + intent.putExtra("iface", iface); + intent.putExtra("ip", ip); + intent.putExtra("netmask", netmask); + if (!TextUtils.isEmpty(gateway)) { + intent.putExtra("gateway", gateway); + } + // intent.putExtra("dns1", "8.8.8.8"); + // intent.putExtra("dns2", "192.168.19.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 @@ -1458,10 +1536,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); @@ -1484,8 +1564,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;