From e0a8ae3449f90a6d88ad8d597af8fd27be7cfe6c Mon Sep 17 00:00:00 2001 From: qvyuanxin <qvyuanxin@454eff88-639b-444f-9e54-f578c98de674> Date: 星期四, 13 七月 2017 18:08:08 +0800 Subject: [PATCH] --- VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.h | 66 +++++++++++ VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.cpp | 161 ++++++++++++++++++++++++++ VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp | 79 +++---------- VisitFace/RtspNativeCodec/app/src/main/cpp/CMakeLists.txt | 1 4 files changed, 247 insertions(+), 60 deletions(-) diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/CMakeLists.txt b/VisitFace/RtspNativeCodec/app/src/main/cpp/CMakeLists.txt index c9c27b9..d2dd470 100644 --- a/VisitFace/RtspNativeCodec/app/src/main/cpp/CMakeLists.txt +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/CMakeLists.txt @@ -14,6 +14,7 @@ DebugNetwork.cpp CaptureCamera.cpp serial.c + TeleWrapper.cpp "D:/workspace/proxy/RtspFace/PipeLine.cpp" "D:/workspace/proxy/RtspFace/Logger/src/logger.cc" diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp index 797c337..db1440e 100644 --- a/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp @@ -17,12 +17,8 @@ #include <stdlib.h> #include "DebugNetwork.h" +#include "TeleWrapper.h" - -extern "C" -{ -#include "serial.h" -} //#include <mediastreamer2/include/mediastreamer2/msjava.h> @@ -34,6 +30,8 @@ static std::string g_stface_license_str; CameraWrapper g_CameraWrappers[CAMERA_COUNT]; + +TeleWrapper g_TeleWrapper; CaptureCamera g_CaptureCamera; @@ -57,6 +55,7 @@ g_CameraWrappers[i].pipeLineRender = new PipeLine; //PipeLine& pipeLine(*(g_CameraWrappers[i].pipeLineDecoderDetector)); } + g_TeleWrapper.start(); } void @@ -736,55 +735,14 @@ } -int fd =-1; -#define PORT "/dev/ttyS4" -#define BAUD 2400 -static void callNum( char phone) -{ - switch (phone) - { - case '1': - serialWriteString(fd, "DA");//1 - break; - case '2': - serialWriteString(fd, "DB");//2 - break; - case '3': - serialWriteString(fd, "DC");//3 - break; - case '4': - serialWriteString(fd, "DD");//4 - break; - case '5': - serialWriteString(fd, "DE");//5 - break; - case '6': - serialWriteString(fd, "DF");//6 - break; - case '7': - serialWriteString(fd, "DG");//7 - break; - case '8': - serialWriteString(fd, "DH");//8 - break; - case '9': - serialWriteString(fd, "DI");//9 - break; - case '0': - serialWriteString(fd, "DJ");//0 - break; - } -} + bool Java_cn_com_basic_face_util_RtspFaceNative_telCall(JNIEnv *env, jclass clazz, jstring phone) { - int fd = serialOpen(PORT, BAUD); - serialWriteString(fd, "AA"); - sleep(1); - - std::string _phone; + + std::string _phone; { const char *utfFunc = env->GetStringUTFChars(phone, NULL); _phone = utfFunc; @@ -792,23 +750,24 @@ } const char *phoneNum = _phone.c_str(); - - while (*phoneNum) - { - sleep(1); - callNum(*(phoneNum++)); - } - - return false; + TeleTask task; + task.command= TeleTask::CALL; + task.param = phoneNum; + g_TeleWrapper.push(task); } void Java_cn_com_basic_face_util_RtspFaceNative_Hang(JNIEnv *env, jclass clazz) { - - serialWriteString(fd, "BA"); - serialClose(fd); + TeleTask task; + task.command =TeleTask::HANGUP; + g_TeleWrapper.push(task); } +void Java_cn_com_basic_face_util_RtspFaceNative_TelShutdown(JNIEnv *env, jclass clazz) +{ + LOG_DEBUG << "@@@ Java_cn_com_basic_face_util_RtspFaceNative_telShutdown" << LOG_ENDL; + g_TeleWrapper.stop(); +} void Java_cn_com_basic_face_util_RtspFaceNative_setFaceLabel(JNIEnv *env, jclass clazz, jint cameraIdx, jint stTrackId, jstring phoneNumber) { LOG_DEBUG << "@@@ Java_cn_com_basic_face_util_RtspFaceNative_setFaceLabel" << LOG_ENDL; diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.cpp new file mode 100644 index 0000000..c0efaf0 --- /dev/null +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.cpp @@ -0,0 +1,161 @@ +#include "TeleWrapper.h" + +bool TeleWrapper::start() +{ +LOG_INFO << "TeleWrapper::start" << LOG_ENDL; +running = true; + pthread_mutex_init(&mutex, NULL); // // 初始化互斥对象 + int ret = pthread_create(&tel_thid, NULL, TeleWrapper::tel_thd, this); + if(ret != 0) + { + LOGP(ERROR, "pthread_create: %s/n", strerror(ret)); + running = false; + return false; + } + + return true; + +} + +void TeleWrapper::stop() +{ +LOG_INFO << "TeleWrapper::stop" << LOG_ENDL; + + if (!running) + return; + + running = false; + pthread_join(tel_thid, NULL); + pthread_mutex_destroy(&mutex); +} + +void TeleWrapper::pushTask(TeleTask task) +{ + if(telQueue.empty()|| telQueue.back().command!=task.command) //队列为空 或者 放入任务和前一个任务不一致 时 + { + telQueue.push(task); //放进队列 + thread_resume(); //唤醒线程 + } + } + + void TeleWrapper::popTask() +{ + TeleTask curTask = telQueue.front(); + telQueue.pop(); + switch(curTask.command) + { + case TeleTask::CALL: //打电话 + callNum(curTask.param); + break: + case TeleTask::HANGUP: + // 挂机 + hang(); + break; + } +} + + +void TeleWrapper:: *tel_thd(void *arg) //线程函数 +{ + LOG_INFO << "TeleWrapper::tel_thd start" << LOG_ENDL; + + TeleWrapper& teleWrapper = *(TeleWrapper*)arg; + while(teleWrapper.running) + { + if(telQueue.empty()) + { + thread_pause(); + return ; + } + if(!pthread_pause) + { + popTask(); + } + } + LOG_INFO << "TeleWrapper::tel_thd stop" << LOG_ENDL; +} + +void TeleWrapper::thread_pause() +{ + if(!pthread_pause) + { + pthread_mutex_lock(&mutex); + pthread_pause = true; + LOG_INFO << "thread pause " << LOG_ENDL; + pthread_mutex_unlock(&mutex) + } +} + + +void TeleWrapper::thread_resume() +{ + if(pthread_pause) + { + pthread_mutex_lock(&mutex); + pthread_pause = false; + pthread_cond_broadcast(&cond_pause); + LOG_INFO << "thread wake " << LOG_ENDL; + pthread_mutex_unlock(&mutex) + } +} + + + +void TeleWrapper::callNum( char phone) +{ + switch (phone) + { + case '1': + serialWriteString(fd, "DA");//1 + break; + case '2': + serialWriteString(fd, "DB");//2 + break; + case '3': + serialWriteString(fd, "DC");//3 + break; + case '4': + serialWriteString(fd, "DD");//4 + break; + case '5': + serialWriteString(fd, "DE");//5 + break; + case '6': + serialWriteString(fd, "DF");//6 + break; + case '7': + serialWriteString(fd, "DG");//7 + break; + case '8': + serialWriteString(fd, "DH");//8 + break; + case '9': + serialWriteString(fd, "DI");//9 + break; + case '0': + serialWriteString(fd, "DJ");//0 + break; + } +} + +void TeleWrapper::callNum( std::string phone) +{ + fd = serialOpen(PORT, BAUD); + serialWriteString(fd, "AA");//摘机 + sleep(1); + while (*phone) + { + sleep(1); + callNum(*(phone++)); + } +} + +void TeleWrapper::hang() +{ + serialWriteString(fd, "BA"); + serialClose(fd); +} + + + + diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.h b/VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.h new file mode 100644 index 0000000..c9bc047 --- /dev/null +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/TeleWrapper.h @@ -0,0 +1,66 @@ +#ifndef __TeleWrapper_H__ +#define __TeleWrapper_H__ + +#include <queue> +#include <pthread.h> +#include <unistd.h> +#include <stdlib.h> +#include "serial.h" + + +#define PORT "/dev/ttyS4" +#define BAUD 2400 + + +typedef struct TeleTask +{ + enum Tel + { + CALL, + HANGUP + }; + Tel command; + std::string param; +}TeleTask; + +class TeleWrapper +{ +public: + TeleWrapper() {} + ~TeleWrapper() {} + + bool start(); + void stop(); + void pushTask(TeleTask task); + void popTask(); + + + void call(std::string phone); + void hang(); + + pthread_t tel_thid; + bool running; +private: + + int fd =-1; + + std::queue<TeleTask> telQueue; + void *tel_thd(void *arg) ; + + bool pthread_pause = false; + + pthread_cond_t cond_pause = PTHREAD_COND_INITIALIZER; + pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + + void thread_pause(); + void thread_resume(); + + + + void callNum( char phone); + +}; + + + +#endif -- Gitblit v1.8.0