拍照参数从配置文件中读取

serial
BlueMatthew 2 years ago
parent 9782a10e32
commit f67c8857fe

@ -52,11 +52,13 @@
android:exported="true"
>
<intent-filter android:priority="90000">
<action android:name="com.xypower.mpapp.MicroPhotoService" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.SCREEN_ON"/>
<action android:name="android.intent.action.USER_PRESENT"/>
<action android:name="android.intent.action.USER_UNLOCKED"/>
<category android:name="android.intent.category.default" />
</intent-filter>
</service>
@ -68,10 +70,14 @@
</receiver>
<receiver android:name=".BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
<category android:name="android.intent.category.LAUNCHER" />
<receiver android:name=".BootBroadcastReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter android:priority="90000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.REBOOT" />
<category android:name="android.intent.category.default" />
</intent-filter>
</receiver>

@ -290,6 +290,7 @@ 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}/SpecData_NW.cpp
${TERM_CORE_ROOT}/Timer.cpp
${TERM_CORE_ROOT}/TimerThread.cpp
${TERM_CORE_ROOT}/Template.cpp
@ -302,6 +303,7 @@ add_library( # Sets the name of the library.
${TERM_CORE_ROOT}/Client/Terminal_HEN.cpp
${TERM_CORE_ROOT}/Client/Terminal_SHX.cpp
${TERM_CORE_ROOT}/Client/Terminal_JS.cpp
${TERM_CORE_ROOT}/Client/Terminal_NW.cpp
${TERM_CORE_ROOT}/Client/UpgradeReceiver.cpp
)

@ -136,7 +136,7 @@ static inline uint32_t YUV2RGB(int nY, int nU, int nV) {
return 0xff000000 | (nR << 16) | (nG << 8) | nB;
}
CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height) : NdkCamera(width, height), m_dev(dev)
CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params) : NdkCamera(width, height, params), m_dev(dev)
{
}
@ -606,8 +606,16 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector<
mPath = path;
mOsds = osds;
mCamera = new CPhoneCamera(this, photoInfo.width, photoInfo.height);
if (mCamera->open(to_string(photoInfo.channel - 1).c_str()) == 0)
NdkCamera::CAMERA_PARAMS params;
params.hdrMode = mPhotoInfo.hdrMode;
params.nightMode = mPhotoInfo.nightMode;
params.autoFocus = mPhotoInfo.autoFocus;
params.autoExposure = mPhotoInfo.autoExposure;
params.exposureTime = mPhotoInfo.exposureTime;
params.sensibility = mPhotoInfo.sensibility;
mCamera = new CPhoneCamera(this, photoInfo.width, photoInfo.height, params);
if (mCamera->open(to_string(mPhotoInfo.cameraId).c_str()) == 0)
{
}
else
@ -654,7 +662,7 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat)
int thickness2 = 1 * ratio;
if (thickness2 == 0) thickness2 = 1;
int thickness1 = thickness2 + 3;
int thickness1 = thickness2 + 2;
cv::Scalar scalar1(0, 0, 0); // black
cv::Scalar scalar2(255, 255, 255); // white
@ -666,8 +674,8 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat)
{
continue;
}
textSize = cv::getTextSize(it->text, cv::FONT_HERSHEY_SIMPLEX, fontScale, thickness1, &baseline);
textSize2 = cv::getTextSize(it->text, cv::FONT_HERSHEY_SIMPLEX, fontScale, thickness2, &baseline);
textSize = cv::getTextSize(it->text, cv::FONT_HERSHEY_TRIPLEX, fontScale, thickness1, &baseline);
textSize2 = cv::getTextSize(it->text, cv::FONT_HERSHEY_TRIPLEX, fontScale, thickness2, &baseline);
if (it->alignment == OSD_ALIGNMENT_TOP_LEFT)
{
@ -700,8 +708,8 @@ bool CPhoneDevice::OnImageReady(const cv::Mat& mat)
ALOGE("putText: fontScale=%f w1=%d w2=%d tn=%d/%d", fontScale, textSize.width, textSize2.width, thickness1, thickness2);
cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_COMPLEX, fontScale, scalar1, thickness1,cv::LINE_AA);
cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_COMPLEX, fontScale, scalar2, thickness2,cv::LINE_AA);
cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_TRIPLEX, fontScale, scalar1, thickness1,cv::LINE_AA);
cv::putText(mat, it->text, pt1, cv::FONT_HERSHEY_TRIPLEX, fontScale, scalar2, thickness2,cv::LINE_AA);
}

@ -31,7 +31,7 @@ public:
class CPhoneCamera : public NdkCamera {
public:
CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height);
CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params);
virtual bool on_image(const cv::Mat& rgb);
virtual void on_error(const std::string& msg);

@ -74,11 +74,12 @@ void onCaptureCompleted(void* context, ACameraCaptureSession* session, ACaptureR
((NdkCamera*)context)->onCaptureCompleted(session, request, result);
}
NdkCamera::NdkCamera(int32_t width, int32_t height)
NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params)
{
camera_facing = 0;
camera_orientation = 0;
m_params = params;
m_firstFrame = true;
mWidth = width;
mHeight = height;
@ -344,43 +345,49 @@ int NdkCamera::open(const char* cameraId) {
int32_t fpsRange[2] = {10,30};
res = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_CONTROL_AE_TARGET_FPS_RANGE,2,fpsRange);
bool usingAE = true;
if (usingAE) {
if (m_params.autoExposure) {
uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_ON;
res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_MODE, 1, &aeMode);
// ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity_);
uint8_t aeLockOff = ACAMERA_CONTROL_AE_LOCK_OFF;
// ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_LOCK, 1, &aeLockOff);
} else {
uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_OFF;
res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_MODE, 1, &aeMode);
if (hdrSupported && m_params.hdrMode) {
uint8_t hdrMode = ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10; // ACAMERA_CONTROL_SCENE_MODE_HDR
res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1, &hdrMode);
int32_t sensitivity = sensitivityRange.value(2);
res = ACaptureRequest_setEntry_i32(capture_request,ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity);
int64_t exposureTime = exposureRange.value(5);
res = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime);
// res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1,&hdrMode);
}
if (m_params.sensibility > 0) {
int32_t sensitivity = m_params.sensibility;
res = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1,
&sensitivity);
}
if (m_params.exposureTime > 0) {
int64_t exposureTime = m_params.exposureTime * 1000000;
res = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1,
&exposureTime);
}
}
if (afSupported && m_params.autoFocus) {
// uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_VIDEO;
uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_MODE, 1, &afMode);
}
uint8_t awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO;
// res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AWB_MODE, 1, &awbMode);
if (hdrSupported) {
if (hdrSupported && m_params.hdrMode) {
// uint8_t hdrMode = ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10; // ACAMERA_CONTROL_SCENE_MODE_HDR
uint8_t hdrMode = ACAMERA_CONTROL_SCENE_MODE_HDR; // ACAMERA_CONTROL_SCENE_MODE_HDR
// res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1, &hdrMode);
res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE, 1, &hdrMode);
res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_HDR, 1,&hdrMode);
}
if (m_params.nightMode) {
if (nightModeSupported) {
uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR
// res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT, 1, &modeEnabled);
@ -389,6 +396,7 @@ int NdkCamera::open(const char* cameraId) {
uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR
// res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, 1, &modeEnabled);
}
}
res = ACameraOutputTarget_create(image_reader_surface, &image_reader_target);
res = ACaptureRequest_addTarget(capture_request, image_reader_target);
@ -622,7 +630,6 @@ void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_hei
rotate_type = camera_facing == 0 ? 7 : 8;
}
cv::Mat nv21_rotated(h + h / 2, w, CV_8UC1);
ncnn::kanna_rotate_yuv420sp(nv21, nv21_width, nv21_height, nv21_rotated.data, w, h, rotate_type);

@ -37,8 +37,16 @@ class NdkCamera
{
public:
struct CAMERA_PARAMS {
unsigned int hdrMode : 1;
unsigned int nightMode : 1;
unsigned int autoFocus : 1;
unsigned int autoExposure : 1;
unsigned int exposureTime; // ms
unsigned int sensibility;
};
NdkCamera(int32_t width, int32_t height);
NdkCamera(int32_t width, int32_t height, const CAMERA_PARAMS& params);
virtual ~NdkCamera();
// facing 0=front 1=back
@ -55,6 +63,7 @@ public:
public:
CAMERA_PARAMS m_params;
int camera_facing;
int camera_orientation;
bool m_firstFrame;

@ -0,0 +1,93 @@
package com.xypower.mpapp;
import static android.content.Context.ALARM_SERVICE;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.text.format.DateFormat;
import android.util.Log;
import java.util.Date;
import java.util.List;
public class AlarmUtil {
public final static String TAG = "MPLOG";
public final static long MASK_CHANNEL = 0xFF00L;
public final static long MASK_PRESET = 0xFF0000L;
public final static long MASK_SCHEDULE_TIME = 0xFFFFFF000000L;
public final static int SHIFT_CHANNEL = 8;
public final static int SHIFT_PRESET = 16;
public final static int SHIFT_SCHEDULE_TIME = 24;
private static final String ACTION_TAKE_PHOTO = "ACT_TP";
private static final String EXTRA_PARAM_CHANNEL = "Channel";
private static final String EXTRA_PARAM_PRESET = "Preset";
private static final String EXTRA_PARAM_PHOTO_OR_VIDEO = "PhotoOrVideo";
private static final String EXTRA_PARAM_SCHEDULES = "Schedules";
private static final String EXTRA_PARAM_SCHEDULE = "Schedule_";
private static final String EXTRA_PARAM_TIME = "Time";
public static void registerPhotoTimer(Context context, int channel, int preset, long ts, long timeout, List<Long> schedules) {
// 创建延迟意图
Intent alarmIntent = new Intent();
alarmIntent.setAction(ACTION_TAKE_PHOTO);
int cnt = schedules.size();
alarmIntent.putExtra(EXTRA_PARAM_SCHEDULES, cnt);
String channelStr = "";
for (int idx = 0; idx < cnt; idx++) {
long val = schedules.get(idx).longValue();
alarmIntent.putExtra(EXTRA_PARAM_SCHEDULE + idx, schedules.get(idx).longValue());
channelStr += "CH=" + ((val & 0XFF0000) >> 16) + "-PR=" + ((val & 0XFF00) >> 8) + " ";
}
alarmIntent.putExtra(EXTRA_PARAM_TIME, ts);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
long currentTimeMillis = System.currentTimeMillis();
Date date = new Date(currentTimeMillis + timeout);
String dateStr = (String) DateFormat.format("MM-dd kk:mm:ss", date);
Log.d(TAG, "PhotoTimer Reg: " + dateStr + " currentTimeMillis=" + currentTimeMillis + " timeout=" + timeout + " Channels=" + channelStr);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeout, pendingIntent);
}
public static boolean parseTakingPhotoAlarm(Intent intent) {
long ts = intent.getLongExtra(EXTRA_PARAM_TIME, 0);
int cnt = intent.getIntExtra(EXTRA_PARAM_SCHEDULES, 0);
if (cnt > 0) {
for (int idx = 0; idx < cnt; idx++) {
long val = intent.getLongExtra(EXTRA_PARAM_SCHEDULE + idx, 0);
int channel = (int) ((val & 0xFF0000L) >> 16);
int preset = (int) ((val & 0xFF00L) >> 8);
Log.i(TAG, "PhotoTimer Fired: CH=" + channel + " PR=" + preset);
// mService.notifyToTakePhoto(mService.mNativeHandle, channel, preset, ts, mService.buildPhotoDir(mService.getApplicationContext(), channel), mService.buildPhotoFileName(channel, preset, ts), true);
}
}
// Register Next Photo Timer
Date date = new Date();
long nowTs = date.getTime() / 1000;
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
long startTime = date.getTime() / 1000;
long baseTime = nowTs - startTime;
return true;
}
}

@ -11,13 +11,11 @@ public class BootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Log.e("接收广播", "onReceive: ");
// Log.e("接收广播", "onReceive: " + intent.getAction());
//开机启动
Log.i("BootBroadcastReceiver", intent.getAction());
if (ACTION.equals(intent.getAction())) {
// Log.e("接收广播", "onReceive: 启动了。。。");
Log.i("BootBroadcastReceiver", "Start MainActivity");
/*
Intent mainIntent = new Intent(context, MainActivity.class);
@ -31,6 +29,10 @@ public class BootBroadcastReceiver extends BroadcastReceiver {
}
*/
MainActivity.AppConfig appConfig = MainActivity.getAppConfig(context);
MainActivity.startMicroPhotoService(context, appConfig);
/*
Intent mainIntent = new Intent(context, MainActivity.class);
mainIntent.putExtra("reboot", 1);
//Intent.FLAG_ACTIVITY_NEW_TASK
@ -38,7 +40,7 @@ public class BootBroadcastReceiver extends BroadcastReceiver {
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
// context.startService(mainIntent);
*/
}
}
}

@ -113,15 +113,8 @@ public class MainActivity extends AppCompatActivity {
}
@Override
protected void onDestroy() {
if (mLogFileObserver != null) {
mLogFileObserver.stopWatching();
}
super.onDestroy();
}
protected class AppConfig {
public static class AppConfig {
public String cmdid;
public String server;
public int port;
@ -144,7 +137,7 @@ public class MainActivity extends AppCompatActivity {
binding.logs.setText("");
binding.logs.setMovementMethod(ScrollingMovementMethod.getInstance());
binding.logs.setScrollbarFadingEnabled(false);
// binding.logs.setMaxLines(16);
mHandler = new Handler(Looper.myLooper()) {
@Override
@ -200,11 +193,6 @@ public class MainActivity extends AppCompatActivity {
};
mMessenger = new Messenger(new Handler());
String logFilePath = MicroPhotoService.buildAppDir(this.getApplicationContext());
logFilePath += "logs/log.txt";
mLogFileObserver = new LogFileObserver(logFilePath);
mLogFileObserver.startWatching();
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Display defaultDisplay = windowManager.getDefaultDisplay();
int width = defaultDisplay.getWidth();
@ -260,29 +248,9 @@ public class MainActivity extends AppCompatActivity {
return;
}
int channel = 2;
String path = buildPhotoDir(channel);
String fileName = buildPhotoFileName(channel, 255);
AppConfig curAppConfig = retrieveAndSaveAppConfig();
if (TextUtils.isEmpty(curAppConfig.cmdid) || TextUtils.isEmpty(curAppConfig.server) || curAppConfig.port == 0) {
return;
}
Intent intent = new Intent(MainActivity.this, MicroPhotoService.class);
intent.setAction(MicroPhotoService.ACTION_START);
intent.putExtra("cmdid", curAppConfig.cmdid);
intent.putExtra("server", curAppConfig.server);
intent.putExtra("port", curAppConfig.port);
intent.putExtra("protocol", curAppConfig.protocol);
intent.putExtra("networkProtocol", curAppConfig.networkProtocol);
intent.putExtra("messenger", mMessenger);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
MainActivity.this.startForegroundService(intent);
} else {
MainActivity.this.startService(intent);
}
startMicroPhotoService(MainActivity.this, appConfig);
binding.startServBtn.setEnabled(false);
binding.stopServBtn.setEnabled(true);
@ -478,6 +446,57 @@ public class MainActivity extends AppCompatActivity {
}
public static void startMicroPhotoService(Context context, AppConfig curAppConfig) {
if (TextUtils.isEmpty(curAppConfig.cmdid) || TextUtils.isEmpty(curAppConfig.server) || curAppConfig.port == 0) {
return;
}
Intent intent = new Intent(context, MicroPhotoService.class);
intent.setAction(MicroPhotoService.ACTION_START);
intent.putExtra("cmdid", curAppConfig.cmdid);
intent.putExtra("server", curAppConfig.server);
intent.putExtra("port", curAppConfig.port);
intent.putExtra("protocol", curAppConfig.protocol);
intent.putExtra("networkProtocol", curAppConfig.networkProtocol);
// intent.putExtra("messenger", mMessenger);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
} else {
context.startService(intent);
}
}
@Override
protected void onStart() {
// call the superclass method first
super.onStart();
String logFilePath = MicroPhotoService.buildAppDir(this.getApplicationContext());
logFilePath += "logs/log.txt";
mLogFileObserver = new LogFileObserver(logFilePath);
mLogFileObserver.startWatching();
}
@Override
protected void onStop() {
// call the superclass method first
super.onStop();
if (mLogFileObserver != null) {
mLogFileObserver.stopWatching();
mLogFileObserver = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private void setDefaultDataSubId(int subId) {
SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
try {
@ -512,10 +531,14 @@ public class MainActivity extends AppCompatActivity {
}
private AppConfig getAppConfig() {
return getAppConfig(this.getApplicationContext());
}
public static AppConfig getAppConfig(Context context) {
AppConfig appConfig = new AppConfig();
String appPath = MicroPhotoService.buildAppDir(this.getApplicationContext());
String appPath = MicroPhotoService.buildAppDir(context);
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;

@ -69,6 +69,7 @@ public class MicroPhotoService extends Service {
private static final String ALARM_EVENT = "com.xinyingpower.mp.MicroPhotoService.AlarmReceiver";
public static final int NOTIFICATION_ID_FOREGROUND_SERVICE = 8466503;
// public static final int NOTIFICATION_ID_FOREGROUND_SERVICE = 0;
public static final String ACTION_START = "ACT_START";
public static final String ACTION_STOP = "ACT_STOP";
public static final String ACTION_MAIN = "ACT_MAIN";
@ -180,6 +181,8 @@ public class MicroPhotoService extends Service {
mStateService = STATE_SERVICE.NOT_CONNECTED;
Log.w(TAG, "MicroPhotoService::onDestroy called");
uninit(mNativeHandle);
mNativeHandle = 0;
@ -512,7 +515,9 @@ public class MicroPhotoService extends Service {
connect();
registerReceiver(mScreenaAtionReceiver, mScreenaAtionReceiver.getFilter());
if (intent.hasExtra("messenger")) {
mMessenger = intent.getParcelableExtra("messenger");
}
String appPath = buildAppDir(this.getApplicationContext());

Loading…
Cancel
Save