diff --git a/app/build.gradle b/app/build.gradle
index 9a631f74..ee18033e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,8 +2,8 @@ plugins {
id 'com.android.application'
}
-def AppVersionName = "1.0.0"
-def AppVersionCode = ((1 * 100 + 1) * 100 + 0) * 10 + 0
+def AppVersionName = "1.0.7"
+def AppVersionCode = ((1 * 100 + 1) * 100 + 0) * 10 + 7
android {
namespace 'com.xinyingpower.microphoto'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 55d5f811..bc51bfd4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -31,9 +31,8 @@
-
-
+
+
diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt
index 7de857a9..ec3c6dba 100644
--- a/app/src/main/cpp/CMakeLists.txt
+++ b/app/src/main/cpp/CMakeLists.txt
@@ -34,6 +34,8 @@ set(OPENCV_EXTRA_MODULES_PATH D:/Workspace/Github/opencv_contrib/modules)
project("microphoto")
+# message(FATAL_ERROR "OpenCV ${OpenCV_DIR}")
+
find_package(OpenCV REQUIRED core imgproc highgui)
if(OpenCV_FOUND)
include_directories(${OpenCV_INCLUDE_DIRS})
@@ -281,12 +283,13 @@ add_library( # Sets the name of the library.
${TERM_CORE_ROOT}/SpecData_I1_SHX.cpp
${TERM_CORE_ROOT}/SpecData_XY.cpp
${TERM_CORE_ROOT}/SpecData_ZJ.cpp
- ${TERM_CORE_ROOT}/TermClient.cpp
${TERM_CORE_ROOT}/Timer.cpp
${TERM_CORE_ROOT}/TimerThread.cpp
${TERM_CORE_ROOT}/Utils.cpp
+ ${TERM_CORE_ROOT}/Client/TerminalService.cpp
${TERM_CORE_ROOT}/Client/Terminal.cpp
${TERM_CORE_ROOT}/Client/Terminal_HN.cpp
+ ${TERM_CORE_ROOT}/Client/Terminal_AH.cpp
${TERM_CORE_ROOT}/Client/Terminal_HEN_ZZ.cpp
${TERM_CORE_ROOT}/Client/Terminal_HEN.cpp
${TERM_CORE_ROOT}/Client/Terminal_SHX.cpp
diff --git a/app/src/main/cpp/Camera.cpp b/app/src/main/cpp/Camera.cpp
index 5684aeca..c65d1ead 100644
--- a/app/src/main/cpp/Camera.cpp
+++ b/app/src/main/cpp/Camera.cpp
@@ -21,10 +21,7 @@
#include "Camera.h"
#include
-
-#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
-#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
+#include
CCamera::CCamera()
{
diff --git a/app/src/main/cpp/MicroPhoto.cpp b/app/src/main/cpp/MicroPhoto.cpp
index fcc42eeb..b11e375e 100644
--- a/app/src/main/cpp/MicroPhoto.cpp
+++ b/app/src/main/cpp/MicroPhoto.cpp
@@ -1,6 +1,7 @@
#include
#include
-#include
+#include
+#include
#include "TerminalDevice.h"
#include "PhoneDevice.h"
#include "PhoneDevice2.h"
@@ -15,17 +16,17 @@
#include "Camera.h"
#include "Camera2Reader.h"
-
-bool GetJniEnv(JavaVM *vm, JNIEnv **env)
+bool GetJniEnv(JavaVM *vm, JNIEnv **env, bool& didAttachThread)
{
- bool did_attach_thread = false;
+ didAttachThread = false;
*env = nullptr;
// Check if the current thread is attached to the VM
auto get_env_result = vm->GetEnv((void**)env, JNI_VERSION_1_6);
if (get_env_result == JNI_EDETACHED)
{
- if (vm->AttachCurrentThread(env, NULL) == JNI_OK) {
- did_attach_thread = true;
+ get_env_result = vm->AttachCurrentThread(env, NULL);
+ if (get_env_result == JNI_OK) {
+ didAttachThread = true;
} else {
// Failed to attach thread. Throw an exception if you want to.
}
@@ -34,10 +35,9 @@ bool GetJniEnv(JavaVM *vm, JNIEnv **env)
// Unsupported JNI version. Throw an exception if you want to.
}
- return did_attach_thread;
+ return get_env_result == JNI_OK;
}
-
// #include "client/linux/handler/exception_handler.h"
// #include "client/linux/handler/minidump_descriptor.h"
@@ -74,7 +74,6 @@ Java_com_xinyingpower_microphoto_MainActivity_takePhoto(
unsigned char id = (unsigned char)channel - 1;
-
Camera2Reader *camera = new Camera2Reader(id);
const char *pathStr = env->GetStringUTFChars(path, 0);
const char *fileNameStr = env->GetStringUTFChars(fileName, 0);
@@ -88,10 +87,10 @@ Java_com_xinyingpower_microphoto_MainActivity_takePhoto(
return JNI_TRUE;
}
-extern "C" JNIEXPORT jboolean JNICALL
+extern "C" JNIEXPORT jlong JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_init(
JNIEnv* env,
- jobject pThis, jstring appPath, jstring ip, jint port, jstring cmdid) {
+ jobject pThis, jstring appPath, jstring ip, jint port, jstring cmdid, jint protocol) {
/*
google_breakpad::MinidumpDescriptor descriptor(".");
@@ -107,35 +106,48 @@ Java_com_xinyingpower_microphoto_MicroPhotoService_init(
JavaVM* vm = NULL;
jint ret = env->GetJavaVM(&vm);
// const string& appPath, const string& termId, const string& server, unsigned short port, const string& bindIp
- CTermClient& service = CTermClient::GetService();
+ // CTerminal* pTerminal = reinterpret_cast(handler);
// CTerminalDevice* device = new CTerminalDevice(vm, pThis);
// CPhoneDevice2* device = new CPhoneDevice2(vm, pThis);
+
+ CTerminal* pTerminal = NewTerminal(GetCurrentProtocol());
+
CPhoneDevice* device = new CPhoneDevice(vm, pThis);
- bool res = service.InitService(appPathStr, cmdidStr, ipStr, (unsigned short)port, "", device);
+ device->SetListener(pTerminal);
+
+ pTerminal->InitServerInfo(appPathStr, cmdidStr, ipStr, port);
+ pTerminal->SetPacketSize(1 * 1024); // 1K
+ bool res = pTerminal->Startup(device);
env->ReleaseStringUTFChars(appPath, appPathStr);
env->ReleaseStringUTFChars(ip, ipStr);
env->ReleaseStringUTFChars(cmdid, cmdidStr);
- return res ? JNI_TRUE : JNI_FALSE;
+ if (!res)
+ {
+ delete pTerminal;
+ pTerminal = NULL;
+ }
+
+ return reinterpret_cast(pTerminal);
}
extern "C" JNIEXPORT jboolean JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_notifyToTakePhoto(
JNIEnv* env,
- jobject pThis, jint channel, jint preset, jlong scheduleTime, jstring path, jstring fileName, jboolean sendToCma) {
+ jobject pThis, jlong handler, jint channel, jint preset, jlong scheduleTime, jstring path, jstring fileName, jboolean sendToCma) {
if (channel < 1 || channel > 0xFF)
{
return JNI_FALSE;
}
- CTerminal* pTerminal = CTermClient::GetService().GetTerminal();
+ CTerminal* pTerminal = reinterpret_cast(handler);
if (pTerminal == NULL)
{
return JNI_FALSE;
}
- pTerminal->NotifyToTakePhoto((unsigned int)channel, (unsigned int)preset, 0, (unsigned long)scheduleTime);
+ pTerminal->RequestCapture((unsigned int)channel, (unsigned int)preset, 0, (unsigned long)scheduleTime);
return JNI_TRUE;
}
@@ -144,9 +156,10 @@ Java_com_xinyingpower_microphoto_MicroPhotoService_notifyToTakePhoto(
extern "C" JNIEXPORT jboolean JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_sendHeartbeat(
JNIEnv* env,
- jobject pThis) {
+ jobject pThis,
+ jlong handler) {
- CTerminal* pTerminal = CTermClient::GetService().GetTerminal();
+ CTerminal* pTerminal = reinterpret_cast(handler);
if (pTerminal == NULL)
{
return JNI_FALSE;
@@ -161,45 +174,58 @@ Java_com_xinyingpower_microphoto_MicroPhotoService_sendHeartbeat(
extern "C" JNIEXPORT jboolean JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_fireTimeout(
JNIEnv* env,
- jobject pThis, jlong uid) {
+ jobject pThis, jlong handler, jlong uid, jlong times) {
- IDevice* dev = CTermClient::GetService().GetDevice();
+ CTerminal* pTerminal = reinterpret_cast(handler);
+ IDevice* dev = pTerminal->GetDevice();
if (dev == NULL)
{
return JNI_FALSE;
}
CPhoneDevice* phoneDevice = (CPhoneDevice *)dev;
- return phoneDevice->FireTimer((IDevice::timer_uid_t)uid) ? JNI_TRUE : JNI_FALSE;
+ return phoneDevice->FireTimer((IDevice::timer_uid_t)uid, static_cast(times)) ? JNI_TRUE : JNI_FALSE;
}
extern "C" JNIEXPORT jboolean JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_uninit(
JNIEnv* env,
- jobject pThis) {
+ jobject pThis, jlong handler) {
- CTermClient::GetService().ExitService();
+ CTerminal* pTerminal = reinterpret_cast(handler);
+ if (pTerminal == NULL)
+ {
+ return JNI_FALSE;
+ }
+
+ pTerminal->SignalExit();
+ pTerminal->Shutdown();
+
+ delete pTerminal;
return JNI_TRUE;
}
-
extern "C" JNIEXPORT jlong JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_getHeartbeatDuration(
JNIEnv* env,
- jobject pThis) {
+ jobject pThis, jlong handler) {
- // CTermClient::GetService().ExitService();
+ CTerminal* pTerminal = reinterpret_cast(handler);
+ if (pTerminal == NULL)
+ {
+ return DEFAULT_HEARTBEAT_DURATION;
+ }
- return 60000;
+ return pTerminal->GetHeartbeatDuration();
}
extern "C" JNIEXPORT jlongArray JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_getPhotoTimeData(
JNIEnv* env,
- jobject pThis) {
+ jobject pThis, jlong handler) {
- CTerminal* pTerminal = CTermClient::GetService().GetTerminal();
+ CTerminal* pTerminal = reinterpret_cast(handler);
if (pTerminal == NULL)
{
return NULL;
@@ -259,13 +285,13 @@ Java_com_xinyingpower_microphoto_MicroPhotoService_getPhotoTimeData(
return data;
}
-
+/*
extern "C" JNIEXPORT jlongArray JNICALL
Java_com_xinyingpower_microphoto_MicroPhotoService_getNextScheduleItem(
JNIEnv* env,
- jobject pThis) {
+ jobject pThis, jlong handler) {
- CTerminal* pTerminal = CTermClient::GetService().GetTerminal();
+ CTerminal* pTerminal = reinterpret_cast(handler);
if (pTerminal == NULL)
{
return NULL;
@@ -324,3 +350,4 @@ Java_com_xinyingpower_microphoto_MicroPhotoService_getNextScheduleItem(
return data;
}
+ */
diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp
index 86f0ea36..3257f845 100644
--- a/app/src/main/cpp/PhoneDevice.cpp
+++ b/app/src/main/cpp/PhoneDevice.cpp
@@ -17,9 +17,8 @@
*/
#define LOG_TAG "CameraTestHelpers"
-
+#include
#include "PhoneDevice.h"
-#include "TermClient.h"
#include
#include
@@ -34,17 +33,10 @@
#include
#include
-#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
-#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
-#define ASSERT(cond, fmt, ...) \
- if (!(cond)) { \
- __android_log_assert(#cond, LOG_TAG, fmt, ##__VA_ARGS__); \
- }
-
-extern bool GetJniEnv(JavaVM *vm, JNIEnv **env);
+extern bool GetJniEnv(JavaVM *vm, JNIEnv **env, bool& didAttachThread);
+#define WAKELOCK_NAME "NDK_WK_"
// This value is 2 ^ 18 - 1, and is used to clamp the RGB values before their
// ranges
// are normalized to eight bits.
@@ -143,46 +135,73 @@ CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32
{
}
-void CPhoneDevice::CPhoneCamera::on_image(const cv::Mat& rgb) const
+bool CPhoneDevice::CPhoneCamera::on_image(const cv::Mat& rgb) const
{
if (m_dev != NULL)
{
- m_dev->OnImageReady(rgb);
+ return m_dev->OnImageReady(rgb);
+ }
+
+ return false;
+}
+
+void CPhoneDevice::CPhoneCamera::on_error(const std::string& msg) const
+{
+ if (m_dev != NULL)
+ {
+ m_dev->onError(msg);
}
}
CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service)
{
+ mCamera = NULL;
+ m_listener = NULL;
+ mHeartbeatStartTime = 0;
+ mHeartbeatDuration = 0;
+ m_javaService = NULL;
+
m_vm = vm;
JNIEnv* env = NULL;
- bool attached = GetJniEnv(m_vm, &env);
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ }
m_javaService = env->NewGlobalRef(service);
- mHeartbeatStartTime = 0;
- mHeartbeatDuration = 0;
-
jclass classService = env->GetObjectClass(m_javaService);
- mRegisterTimerMid = env->GetMethodID(classService, "registerTimer", "(JI)Z");
+ mRegisterTimerMid = env->GetMethodID(classService, "registerTimer", "(JIJ)Z");
mRegisterHeartbeatMid = env->GetMethodID(classService, "registerHeartbeatTimer", "(I)V");
mUnregisterTimerMid = env->GetMethodID(classService, "unregisterTimer", "(J)Z");
mUpdateTimeMid = env->GetMethodID(classService, "updateTime", "(J)Z");
+ mRequestWakelockMid = env->GetMethodID(classService, "requestWakelock", "(Ljava/lang/String;J)V");
+ mReleaseWakelockMid = env->GetMethodID(classService, "releaseWakelock", "(Ljava/lang/String;)V");
+
env->DeleteLocalRef(classService);
- if (attached)
+ if (didAttachThread)
{
vm->DetachCurrentThread();
}
- m_timerUidFeed = time(NULL);
+ m_timerUidFeed = time(NULL) * 1000;
+ m_wakelockIdFeed = (unsigned long)m_timerUidFeed;
}
CPhoneDevice::~CPhoneDevice()
{
JNIEnv* env = NULL;
- bool attached = GetJniEnv(m_vm, &env);
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ }
env->DeleteGlobalRef(m_javaService);
- if (attached)
+ if (didAttachThread)
{
m_vm->DetachCurrentThread();
}
@@ -198,17 +217,27 @@ bool CPhoneDevice::UpdateTime(time_t ts)
{
JNIEnv* env = NULL;
jboolean ret = JNI_FALSE;
- bool attached = GetJniEnv(m_vm, &env);
- if (attached)
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ }
+ jlong timeInMillis = ((jlong)ts) * 1000;
+ ret = env->CallBooleanMethod(m_javaService, mUpdateTimeMid, timeInMillis);
+ if (didAttachThread)
{
- jlong timeInMillis = ((jlong)ts) * 1000;
- ret = env->CallBooleanMethod(m_javaService, mUpdateTimeMid, timeInMillis);
m_vm->DetachCurrentThread();
}
return (ret == JNI_TRUE);
}
+bool CPhoneDevice::UpdateSchedules()
+{
+ return true;
+}
+
bool CPhoneDevice::QuerySystemProperties(map& properties)
{
char value[PROP_VALUE_MAX] = { 0 };
@@ -220,11 +249,9 @@ bool CPhoneDevice::QuerySystemProperties(map& properties)
__system_property_get("ro.product.model", value);
properties[PROP_MODEL] = value;
-
__system_property_get("ro.product.manufacturer", value);
properties[PROP_BS_MANU] = value;
-
properties[PROP_BS_ID] = "SHXY";
__system_property_get("ro.build.version.release", value);
@@ -239,7 +266,6 @@ bool CPhoneDevice::QuerySystemProperties(map& properties)
__system_property_get("phone.imei", value);
properties[PROP_IMEI] = value;
-
return true;
}
@@ -254,18 +280,23 @@ bool CPhoneDevice::Reboot()
return false;
}
-IDevice::timer_uid_t CPhoneDevice::RegisterTimer(unsigned int timerType, unsigned int timeout)
+IDevice::timer_uid_t CPhoneDevice::RegisterTimer(unsigned int timerType, unsigned int timeout, unsigned long times/* = 0*/)
{
IDevice::timer_uid_t uid = m_timerUidFeed.fetch_add(1);
ALOGI("NDK RegTimer: uid=%lld Type=%u timeout=%u", uid, timerType, timeout);
JNIEnv* env = NULL;
- jboolean ret = JNI_FALSE;
- bool attached = GetJniEnv(m_vm, &env);
- if (attached)
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ return 0;
+ }
+ jboolean ret = env->CallBooleanMethod(m_javaService, mRegisterTimerMid, (jlong)uid, (jint)timeout, (jlong)times);
+ if (didAttachThread)
{
- ret = env->CallBooleanMethod(m_javaService, mRegisterTimerMid, (jlong)uid, (jint)timeout);
m_vm->DetachCurrentThread();
}
@@ -280,12 +311,18 @@ IDevice::timer_uid_t CPhoneDevice::RegisterTimer(unsigned int timerType, unsigne
bool CPhoneDevice::UnregisterTimer(IDevice::timer_uid_t uid)
{
- JNIEnv* env = NULL;
jboolean ret = JNI_FALSE;
- bool attached = GetJniEnv(m_vm, &env);
- if (attached)
+ JNIEnv* env = NULL;
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ return false;
+ }
+ ret = env->CallBooleanMethod(m_javaService, mUnregisterTimerMid, (jlong)uid);
+ if (didAttachThread)
{
- ret = env->CallBooleanMethod(m_javaService, mUnregisterTimerMid, (jlong)uid);
m_vm->DetachCurrentThread();
}
@@ -297,7 +334,67 @@ bool CPhoneDevice::UnregisterTimer(IDevice::timer_uid_t uid)
return false;
}
-bool CPhoneDevice::FireTimer(timer_uid_t uid)
+unsigned long CPhoneDevice::RequestWakelock(unsigned long timeout)
+{
+ unsigned long wakelockId = m_wakelockIdFeed.fetch_add(1);
+ std::string name = WAKELOCK_NAME;
+ name += to_string(wakelockId);
+
+ ALOGI("RequestWakelock=%lld",wakelockId);
+
+ jboolean ret = JNI_FALSE;
+ JNIEnv* env = NULL;
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ return 0;
+ }
+ jstring jname = env->NewStringUTF(name.c_str());
+ jlong jtimeout = (jlong)timeout;
+
+ env->CallVoidMethod(m_javaService, mRequestWakelockMid, jname, jtimeout);
+ // env->ReleaseStringUTFChars(jname, name.c_str());
+ env->DeleteLocalRef(jname);
+
+ if (didAttachThread)
+ {
+ m_vm->DetachCurrentThread();
+ }
+
+ return wakelockId;
+}
+
+bool CPhoneDevice::ReleaseWakelock(unsigned long wakelock)
+{
+ ALOGI("ReleaseWakelock=%lld", wakelock);
+ std::string name = WAKELOCK_NAME;
+ name += to_string(wakelock);
+
+ jboolean ret = JNI_FALSE;
+ JNIEnv* env = NULL;
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ return false;
+ }
+ jstring jname = env->NewStringUTF(name.c_str());
+
+ env->CallVoidMethod(m_javaService, mReleaseWakelockMid, jname);
+ env->DeleteLocalRef(jname);
+ // env->ReleaseStringUTFChars(jname, name.c_str());
+ if (didAttachThread)
+ {
+ m_vm->DetachCurrentThread();
+ }
+
+ return true;
+}
+
+bool CPhoneDevice::FireTimer(timer_uid_t uid, unsigned long times)
{
std::map::iterator it = mTimers.find(uid);
if (it == mTimers.end())
@@ -306,21 +403,21 @@ bool CPhoneDevice::FireTimer(timer_uid_t uid)
}
unsigned long timerType = it->second & 0xFFFFFFFF;
- unsigned long times = (it->second & 0xFFFFFFFF00000000) >> 32;
- times++;
+ unsigned long ntimes = (it->second & 0xFFFFFFFF00000000) >> 32;
+ ntimes++;
if (timerType != 100)
{
int aa = 0;
}
- it->second = timerType | (times << 32);
+ it->second = timerType | (ntimes << 32);
if (m_listener == NULL)
{
return false;
}
- m_listener->OnTimeout(uid, timerType, times);
+ m_listener->OnTimeout(uid, timerType, ntimes);
return true;
}
@@ -332,10 +429,16 @@ IDevice::timer_uid_t CPhoneDevice::RegisterHeartbeat(unsigned int timerType, uns
IDevice::timer_uid_t uid = m_timerUidFeed.fetch_add(1);
- JNIEnv* env = NULL;
jboolean ret = JNI_FALSE;
- bool attached = GetJniEnv(m_vm, &env);
- if (attached)
+ JNIEnv* env = NULL;
+ bool didAttachThread = false;
+ bool res = GetJniEnv(m_vm, &env, didAttachThread);
+ if (!res)
+ {
+ ALOGE("Failed to get JNI Env");
+ return 0;
+ }
+ if (didAttachThread)
{
env->CallVoidMethod(m_javaService, mRegisterHeartbeatMid, (jint)timeout);
m_vm->DetachCurrentThread();
@@ -346,43 +449,100 @@ IDevice::timer_uid_t CPhoneDevice::RegisterHeartbeat(unsigned int timerType, uns
bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector& osds, const string& path)
{
- LOGI("TAKE_PHOTO: CH=%u PR=%u\n", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset);
+ if (mCamera != NULL)
+ {
+ delete mCamera;
+ mCamera = NULL;
+ }
+
+ ALOGI("TAKE_PHOTO: CH=%u PR=%u\n", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset);
mPhotoInfo = photoInfo;
mPath = path;
mOsds = osds;
mCamera = new CPhoneCamera(this, photoInfo.width, photoInfo.height);
- mCamera->open(to_string(photoInfo.channel - 1).c_str());
+ if (mCamera->open(to_string(photoInfo.channel - 1).c_str()) == 0)
+ {
+ }
+ else
+ {
+ delete mCamera;
+ mCamera = NULL;
+ return false;
+ }
return true;
}
-void CPhoneDevice::OnImageReady(const cv::Mat& mat) const
+bool CPhoneDevice::CloseCamera()
{
+ if (mCamera != NULL)
+ {
+ delete mCamera;
+ mCamera = NULL;
+ }
+ return true;
+}
+bool CPhoneDevice::OnImageReady(const cv::Mat& mat) const
+{
int baseline = 0;
cv::Size textSize, textSize2;
+ double fontScale = 1; // base 1024
+ double height = mat.size().height;
+ double width = mat.size().width;
+ double ratio = std::min(height / 1024, width / 1920);
+ fontScale = fontScale * ratio;
+ double thickness1 = 4 * ratio;
+ double thickness2 = 2 * ratio;
for (vector::const_iterator it = mOsds.cbegin(); it != mOsds.cend(); ++it)
{
// getTextSize(value, font, scale, 1, &bottom);
- textSize = cv::getTextSize(it->text, cv::FONT_HERSHEY_COMPLEX, 1, 4, &baseline);
- cv::Point pt(it->x, it->y + textSize.height);
- putText(mat, it->text, pt, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 0, 0), 4,cv::LINE_AA);
- textSize2 = cv::getTextSize(it->text, cv::FONT_HERSHEY_COMPLEX, 1, 2, &baseline);
+ textSize = cv::getTextSize(it->text, cv::FONT_HERSHEY_COMPLEX, fontScale, thickness1, &baseline);
+ cv::Point pt(it->x * ratio, it->y * ratio + textSize.height);
+ putText(mat, it->text, pt, cv::FONT_HERSHEY_COMPLEX, fontScale, cv::Scalar(0, 0, 0), thickness1,cv::LINE_AA);
+ textSize2 = cv::getTextSize(it->text, cv::FONT_HERSHEY_COMPLEX, fontScale, thickness2, &baseline);
pt.y -= (textSize.height - textSize2.height) / 2;
- putText(mat, it->text, pt, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255), 2,cv::LINE_AA);
+ putText(mat, it->text, pt, cv::FONT_HERSHEY_COMPLEX, fontScale, cv::Scalar(255, 255, 255), thickness2,cv::LINE_AA);
}
vector compression_params;
compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
- compression_params.push_back(80);
+ compression_params.push_back(mPhotoInfo.quality);
- bool res = cv::imwrite(mPath.c_str(), mat, compression_params);
+ if (!std::filesystem::exists(std::filesystem::path(mPath)))
+ {
+ bool res = cv::imwrite(mPath.c_str(), mat, compression_params);
+ if (!res)
+ {
+ ALOGE("Failed to write photo: %s", mPath.c_str());
+ }
+ else
+ {
+ ALOGI("Succeeded to write photo: %s", mPath.c_str());
+ }
+ TakePhotoCb(res, mPhotoInfo, mPath, time(NULL));
+ return res;
+ }
+ else
+ {
+ ALOGI("Photo file exists: %s", mPath.c_str());
+ }
+ // mCamera->close();
+ // delete mCamera;
+ // mCamera = NULL;
+ return true;
+}
+
+void CPhoneDevice::onError(const std::string& msg) const
+{
+ // XFLOG(XFLOG_SEVERITY_ERROR, "Failed to Take Photo: %s", msg.c_str());
- TakePhotoCb(res, mPhotoInfo, mPath, time(NULL));
+ ALOGE("Failed to Take Photo: %s", msg.c_str());
- delete mCamera;
- mCamera = NULL;
+ // mCamera->close();
+
+ TakePhotoCb(false, mPhotoInfo, mPath, 0);
}
std::string CPhoneDevice::GetFileName() const
diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h
index 62bfb2cd..0a828862 100644
--- a/app/src/main/cpp/PhoneDevice.h
+++ b/app/src/main/cpp/PhoneDevice.h
@@ -11,21 +11,17 @@
#include