From: TrillGates Date: Sat, 16 Jan 2021 06:04:20 +0000 (+0800) Subject: fixed get data run on background cpu sleep issues. X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=39d78017a9c84a599edf9738adf7a977b7a21eef;p=icworkservice.git fixed get data run on background cpu sleep issues. --- diff --git a/app/IcL02WorkService/release/IcL02WorkService_V57_202101151444_release.apk b/app/IcL02WorkService/release/IcL02WorkService_V57_202101151444_release.apk new file mode 100644 index 0000000..5361343 Binary files /dev/null and b/app/IcL02WorkService/release/IcL02WorkService_V57_202101151444_release.apk differ diff --git a/app/IcL02WorkService/release/output.json b/app/IcL02WorkService/release/output.json index 6888c7a..2967bc5 100644 --- a/app/IcL02WorkService/release/output.json +++ b/app/IcL02WorkService/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.1","enabled":true,"outputFile":"IcL02WorkService_V57_202101091515_release.apk","fullName":"IcL02WorkServiceRelease","baseName":"IcL02WorkService-release"},"path":"IcL02WorkService_V57_202101091515_release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.1","enabled":true,"outputFile":"IcL02WorkService_V57_202101151444_release.apk","fullName":"IcL02WorkServiceRelease","baseName":"IcL02WorkService-release"},"path":"IcL02WorkService_V57_202101151444_release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 53a38da..6571f55 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + diff --git a/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl b/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl index 70a7dd5..aa15d55 100644 --- a/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl +++ b/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl @@ -6,5 +6,5 @@ import com.ic.work.IHeartRateSensorCallback; interface IHeartRateSensorService { void registerCallback(in IHeartRateSensorCallback callback,in String callbackTag); void unRegisterCallback(in IHeartRateSensorCallback callback); - oneway void getHeartRateInfo(int from,in String callbackTag); + void getHeartRateInfo(int from,in String callbackTag); } \ No newline at end of file diff --git a/app/src/main/aidl/com/ic/work/ITempSensorService.aidl b/app/src/main/aidl/com/ic/work/ITempSensorService.aidl index 4941edd..156a851 100644 --- a/app/src/main/aidl/com/ic/work/ITempSensorService.aidl +++ b/app/src/main/aidl/com/ic/work/ITempSensorService.aidl @@ -5,5 +5,5 @@ import com.ic.work.ITempSensorCallback; interface ITempSensorService { void registerCallback(in ITempSensorCallback callback,in String callbackTag); void unRegisterCallback(in ITempSensorCallback callback); - oneway void getTemperatureInfo(int from,in String callbackTag); + void getTemperatureInfo(int from,in String callbackTag); } \ No newline at end of file diff --git a/app/src/main/java/com/ic/work/SensorDataService.java b/app/src/main/java/com/ic/work/SensorDataService.java index a93f5c5..dfa25d4 100644 --- a/app/src/main/java/com/ic/work/SensorDataService.java +++ b/app/src/main/java/com/ic/work/SensorDataService.java @@ -3,6 +3,7 @@ package com.ic.work; import android.app.Service; import android.content.Intent; import android.os.IBinder; +import android.os.PowerManager; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; @@ -17,6 +18,7 @@ import com.ic.work.event.TestTaskEvent; import com.ic.work.hardware.BloodInfoHelper; import com.ic.work.hardware.BloodSensorManager; import com.ic.work.hardware.TemperatureHelper; +import com.ic.work.utils.ICLogger; import com.ic.work.utils.ICWorkConstants; import com.ic.work.utils.IcLog; import com.ic.work.utils.IcSystemProperty; @@ -53,7 +55,6 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp public static final String KEY_TEMP_WRIST = "wrist"; // double 腕温 public static final String KEY_TEMP_OUT = "out"; // double 腕温 private static final String HEART_ACTION = "com.ic.action.BLOOD_HEART"; - private static final String TAG = "SensorDataService"; private final LinkedBlockingDeque mTaskList = new LinkedBlockingDeque<>(); @@ -62,9 +63,9 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp //当前执行的任务 private TestTaskEvent currentTask; private BloodSensorManager bloodSensorManager; - private final Object mLock = new Object(); - + private PowerManager powerManager; + private PowerManager.WakeLock wakeLock; @Nullable @Override @@ -74,7 +75,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp //其他的进行action判断 String action = intent.getAction(); IcLog.d(TAG, "on service bind package name -- > " - + packageName + " action name is -==- > " + action); + + packageName + " action name is == > " + action); if (ACTION_BLOOD.equals(packageName) || ICWorkConstants.SensorServiceAction.ACTION_HEART_RATE.equals(action)) { return heartRateSensorService; @@ -87,10 +88,10 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp return null; } - @Override public void onCreate() { super.onCreate(); + powerManager = (PowerManager) WorkServiceApp.sContext.getSystemService(POWER_SERVICE); EventBus.getDefault().register(this); //创建一个Handler用来计算超时,如果超过这个时间,还没有执行完 //那么就取出下一个任务 @@ -98,6 +99,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(this); } + /** * 此方法已经是子线程了,不可以再开子线程,包括结果的处理。 * 这样才可以确保单一的一个任务执行,解决并发读取数据不准的问题。 @@ -108,6 +110,9 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp */ @Subscribe(threadMode = ThreadMode.BACKGROUND) public void handleTestEvent(TestTaskEvent testTaskEvent) { + //保持CPU运行 + wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ic:sensorDataService"); + wakeLock.acquire(10 * 60 * 1000L /*10 minutes*/); IcLog.d(TAG, "task == start == > " + testTaskEvent); //当结果回来的时候,如果队列里没有了,那么就false了 isRunning = true; @@ -179,6 +184,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp public void onDestroy() { super.onDestroy(); mTaskList.clear(); + powerManager = null; EventBus.getDefault().unregister(this); TemperatureHelper.getInstance().setTemperatureChangeListener(null); BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(null); @@ -192,11 +198,13 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp new IHeartRateSensorService.Stub() { @Override public void registerCallback(IHeartRateSensorCallback callback, String tag) { + ICLogger.d("heartRateSensorService registerCallback ==> " + callback); heartRateCallbacks.register(callback, tag); } @Override public void unRegisterCallback(IHeartRateSensorCallback callback) { + ICLogger.d("heartRateSensorService unRegisterCallback ==> " + callback); heartRateCallbacks.unregister(callback); } @@ -225,12 +233,14 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp private final ITempSensorService.Stub tempSensorService = new ITempSensorService.Stub() { @Override public void registerCallback(ITempSensorCallback callback, String tag) { + ICLogger.d("tempSensorService registerCallback ==> " + callback); temperatureCallbacks.register(callback, tag); } @Override public void unRegisterCallback(ITempSensorCallback callback) { temperatureCallbacks.unregister(callback); + ICLogger.d("tempSensorService unRegisterCallback ==> " + callback); } @Override @@ -242,45 +252,49 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp } }; + private final Object mTaskLock = new Object(); + private void createTask(int from, TestTaskEvent.SensorType censorType, String tag) { TestTaskEvent.From fromByValue = getFromByValue(from); if (fromByValue == null) { - IcLog.d(TAG, "from is not invalid..." + from); + IcLog.d(TAG, "from is not invalid..." + from + tag); return; } TestTaskEvent taskEvent = new TestTaskEvent(censorType, fromByValue, System.currentTimeMillis()); IcLog.d(TAG, "create new task == > " + taskEvent); - //判断队列里是否有同样的任务,如果有的话不用发了, - if (mTaskList.contains(taskEvent)) { - IcLog.d(TAG, "task contains..." + fromByValue); - //通知正在等待执行 - if (tag != null) { - dispatchWaiting(censorType, tag); + synchronized (mTaskLock) { + //判断队列里是否有同样的任务,如果有的话不用发了, + if (mTaskList.contains(taskEvent)) { + IcLog.d(TAG, "task contains..." + fromByValue); + //通知正在等待执行 + if (tag != null) { + dispatchWaiting(censorType, tag); + } + return; } - return; - } - if (taskEvent.equals(currentTask)) { - IcLog.d(TAG, "current task running..."); - //通知正在执行 - if (tag != null) { - dispatchTaskRunning(censorType, tag); + if (taskEvent.equals(currentTask)) { + IcLog.d(TAG, "current task running..."); + //通知正在执行 + if (tag != null) { + dispatchTaskRunning(censorType, tag); + } + return; } - return; - } - IcLog.d(TAG, "is running =-== > " + isRunning + " queue size == > " + mTaskList.size()); - //判断是否繁忙 - //如果没有的话则发送一下 - if (!isRunning && mTaskList.size() == 0) { - currentTask = taskEvent; - //直接运行不需要放到队列里了 - EventBus.getDefault().post(taskEvent); - } else { - IcLog.d(TAG, "new task waiting..." + taskEvent); - //要放到队列里头,提示调用者正在等待执行 - if (tag != null) { - dispatchWaiting(censorType, tag); + IcLog.d(TAG, "is running =-== > " + isRunning + " queue size == > " + mTaskList.size()); + //判断是否繁忙 + //如果没有的话则发送一下 + if (!isRunning && mTaskList.size() == 0) { + currentTask = taskEvent; + //直接运行不需要放到队列里了 + EventBus.getDefault().post(taskEvent); + } else { + IcLog.d(TAG, "new task waiting..." + taskEvent); + //要放到队列里头,提示调用者正在等待执行 + if (tag != null) { + dispatchWaiting(censorType, tag); + } + mTaskList.add(taskEvent); } - mTaskList.add(taskEvent); } } @@ -404,6 +418,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp } private void checkContinue() { + wakeLock.release(); isRunning = false; currentTask = null; int size = mTaskList.size(); diff --git a/app/src/main/java/com/ic/work/WorkServiceApp.java b/app/src/main/java/com/ic/work/WorkServiceApp.java index 9930cf9..6803877 100644 --- a/app/src/main/java/com/ic/work/WorkServiceApp.java +++ b/app/src/main/java/com/ic/work/WorkServiceApp.java @@ -1,6 +1,7 @@ package com.ic.work; import android.app.Application; +import android.content.Context; import com.ic.work.db.AppDatabase; import com.ic.work.db.PedInjection; @@ -11,6 +12,10 @@ import com.jakewharton.threetenabp.AndroidThreeTen; public class WorkServiceApp extends Application { + + public static Context sContext = null; + + @Override public void onCreate() { super.onCreate(); @@ -20,6 +25,7 @@ public class WorkServiceApp extends Application { CrashHandler crashHandler = CrashHandler.getInstance(); crashHandler.init(getApplicationContext()); + sContext = getApplicationContext(); } public AppDatabase getDatabase() { diff --git a/app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java b/app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java index b4b4b82..49c1fcd 100644 --- a/app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java +++ b/app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java @@ -1,20 +1,14 @@ package com.ic.work.hardware; -import com.ic.work.event.BloodCheckTipsEvent; -import com.ic.work.event.BloodSensorEvent; +import android.os.Handler; +import android.os.HandlerThread; + import com.ic.work.utils.HardwareUtils; +import com.ic.work.utils.ICLogger; import com.ic.work.utils.IcLog; -import org.greenrobot.eventbus.EventBus; - import java.util.Random; -import static com.ic.aidl.blood.BloodState.BLOOD_ING_CHECK; -import static com.ic.aidl.blood.BloodState.BLOOD_NOT_DEVICE; -import static com.ic.aidl.blood.BloodState.BLOOD_NULL_TIPS; -import static com.ic.aidl.blood.BloodState.BLOOD_PLEASE_QUIET; -import static com.ic.aidl.blood.BloodState.BLOOD_START_CHECK; - /** * 此工具类获取血氧,血压,心率等信息,结果通过: */ @@ -22,9 +16,14 @@ public class BloodInfoHelper { private HeartRateInfoChangeListener mListener = null; + private final Handler ppgLooper; + private long checkBloodStartTime; private BloodInfoHelper() { - + //这个Looper专门用来查询数据的 + HandlerThread handlerThread = new HandlerThread("ic:heart-rate-looper"); + handlerThread.start(); + ppgLooper = new Handler(handlerThread.getLooper()); } private static BloodInfoHelper sInstance = null; @@ -44,106 +43,145 @@ public class BloodInfoHelper { private static final String TAG = "BloodInfoHelper"; public void getBloodInfo() { + ICLogger.d("getBloodInfo..."); boolean[] deviceState = HardwareUtils.isPPGavailableIc66(); if (!deviceState[0]) { + IcLog.d(TAG, "deviceState[0] == > " + deviceState[0]); //TODO:这个后面再处理,得给我机器再去处理,没有文档,没有数据 - sendTipsEventBus(BLOOD_NULL_TIPS, BLOOD_NOT_DEVICE); + //sendTipsEventBus(BLOOD_NULL_TIPS, BLOOD_NOT_DEVICE); return; } + ICLogger.d("deviceState[1]..." + deviceState[1]); if (deviceState[1]) { //TODO:这个是走官方API的,也得有机器再进行修改代码 - sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_START_CHECK); - EventBus.getDefault().post(new BloodSensorEvent(1)); + //sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_START_CHECK); + // EventBus.getDefault().post(new BloodSensorEvent(1)); } else { //这个走JNI获取数据的,完成了 checkBloodOther(); } } - private void sendTipsEventBus(int top, int bottom) { - EventBus.getDefault().post(new BloodCheckTipsEvent(top, bottom)); - } - - - private void checkBloodOther() { - int ndkHeart = 0; - int ndkHigh = 0; - int ndkLow = 0; - int oxygen = 0; + private int ndkHeart = 0; + private int ndkHigh = 0; + private int ndkLow = 0; + private int oxygen = 0; + private int checkCount = 0; + private int noWearCount = 0; - boolean isWeared; + private boolean isWear; - int checkCount = 0; - int noWearCount = 0; - boolean isSendCheckTips = false; + private int invalidateTime = 0; + private void checkBloodOther() { + checkBloodStartTime = System.currentTimeMillis(); + IcLog.d(TAG, "start time == > " + checkBloodStartTime); + ndkHeart = 0; + ndkHigh = 0; + ndkLow = 0; + oxygen = 0; + checkCount = 0; + noWearCount = 0; + invalidateTime = 0; //开启 HardwareUtils.onNdkEnablePPG(); + //推迟1秒去测试数据 + //测试数据是一个循环,有三种情况 + //- 没有穿戴,如果超过20秒没有穿戴,那么就结束此次测试 + //- 数据测试结果为0,如果连续20个数据为0,那么就结束此次测试 + //- 有数据以后,连续测上10次,就可以返回结果了 + ppgLooper.postDelayed(this::checkWear, 1000); + } - sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_START_CHECK); - - int invalidateTime = 0; - try { - while (!Thread.currentThread().isInterrupted()) { + private void checkWear() { + IcLog.d(TAG, "checkWear..."); + //测试数据是一个循环,有三种情况 + //- 没有穿戴,如果超过20秒没有穿戴,那么就结束此次测试 + //- 20秒内有穿戴,则开始测试 + ppgLooper.post(new Runnable() { + @Override + public void run() { ndkHeart = HardwareUtils.getNdkPPGValue(); - isWeared = HardwareUtils.isWeared(); - - IcLog.i(TAG, "Get Heart Value:" + isWeared + ",ndkHeart:" + ndkHeart); - - if (!isWeared) { - //超过10连续未佩戴则认为没有佩戴 - if (noWearCount > 10) break; + isWear = HardwareUtils.isWeared(); + IcLog.d(TAG, "isWear == > " + isWear); + if (!isWear) { + //延时1秒进行检查 noWearCount++; + IcLog.d(TAG, "noWearCount == > " + noWearCount); + if (noWearCount <= 20) { + ppgLooper.postDelayed(this, 1000); + } else { + handleResult(); + } } else { - //已佩戴则noWearCount 清零重新计数 noWearCount = 0; - if (ndkHeart > 0) { - ndkHigh = HardwareUtils.getNdkHighBloodValue(); - ndkLow = HardwareUtils.getNdkLowBloodValue(); - oxygen = HardwareUtils.getNdkOxygenValue(); - if (oxygen <= 0) oxygen = randomOxygenValue(); - if (mListener != null) { - mListener.onHeartRateUpdate(ndkHigh, ndkLow, ndkHeart, oxygen); - } - //测试到数据30秒后停止测量 - if (checkCount >= 30) { - break; - } - checkCount++; + //开始去检测了 + doTest(); + } + } + }); + } + + //- 数据测试结果为0,如果连续20个数据为0,那么就结束此次测试 + //- 有数据以后,连续测上10次,就可以返回结果了 + private void doTest() { + ppgLooper.post(new Runnable() { + @Override + public void run() { + //这部分代码要做超时处理{ + long getPPGStartTime = System.currentTimeMillis(); + ndkHeart = HardwareUtils.getNdkPPGValue(); + if (ndkHeart > 0) { + ndkHigh = HardwareUtils.getNdkHighBloodValue(); + ndkLow = HardwareUtils.getNdkLowBloodValue(); + oxygen = HardwareUtils.getNdkOxygenValue(); + if (oxygen <= 0) oxygen = randomOxygenValue(); + if (mListener != null) { + IcLog.d(TAG, "ndkHigh == > " + ndkHigh + "ndkLow == > " + ndkLow + "oxygen == > " + oxygen); + mListener.onHeartRateUpdate(ndkHigh, ndkLow, ndkHeart, oxygen); + } + checkCount++; + IcLog.d(TAG, "checkCount == > " + checkCount); + if (checkCount <= 10) { + //继续测试 + ppgLooper.postDelayed(this, 1000); } else { - //如果为0的话,记录下来 - invalidateTime++; + handleResult(); } - if (!isSendCheckTips) { - //正在测量中,请稍等 - sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_ING_CHECK); - isSendCheckTips = true; + IcLog.d(TAG, "use time == > " + (System.currentTimeMillis() - getPPGStartTime)); + } else { + //如果为0的话,记录下来 + invalidateTime++; + IcLog.d(TAG, "invalidateTime == > " + invalidateTime); + if (invalidateTime <= 30) { + ppgLooper.postDelayed(this, 1000); + } else { + handleResult(); } } - Thread.sleep(1000); - if (invalidateTime > 20) { - break; - } - } - if (mListener != null) { - mListener.onHeartRateResult(ndkHigh, ndkLow, ndkHeart, oxygen); - } - if (mListener != null) { - mListener.onHeartRateTestFinished(); } - HardwareUtils.onNdkDisablePPG(); - } catch (InterruptedException e) { - IcLog.e(TAG, "Stop Get Heart Value", e); - } catch (Exception e) { - e.printStackTrace(); - } finally { + }); + } + + private void handleResult() { + if (mListener != null) { + mListener.onHeartRateResult(ndkHigh, ndkLow, ndkHeart, oxygen); + } + if (mListener != null) { + mListener.onHeartRateTestFinished(); + } + try { IcLog.d(TAG, "disable ppg.."); HardwareUtils.onNdkDisablePPG(); + } catch (Exception e) { + IcLog.e(TAG, "Stop Get Heart Value", e); } + IcLog.d(TAG, "total use time == checkBloodStartTime > " + (System.currentTimeMillis() - checkBloodStartTime)); } + private int randomOxygenValue() { int min = 95; int max = 100; diff --git a/app/src/main/java/com/ic/work/hardware/TemperatureHelper.java b/app/src/main/java/com/ic/work/hardware/TemperatureHelper.java index e6750d1..234bc54 100644 --- a/app/src/main/java/com/ic/work/hardware/TemperatureHelper.java +++ b/app/src/main/java/com/ic/work/hardware/TemperatureHelper.java @@ -2,9 +2,15 @@ package com.ic.work.hardware; import com.ic.work.domain.TemperatureItem; import com.ic.work.utils.HardwareUtils; +import com.ic.work.utils.ICLogger; import com.ic.work.utils.IcLog; import com.ic.work.utils.TemperatureUtil; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + /** * 获取温度的工具类 */ @@ -31,11 +37,17 @@ public class TemperatureHelper { return sInstance; } + private double lastTempOut = 0.0; + private double lastBodyTemp = 0.0; + private double lastWristTemp = 0.0; + private int delayTimesInSeconds = 20; + public void getTemperature() { - double lastTempOut = 0.0; - double lastBodyTemp = 0.0; - double lastWristTemp = 0.0; - int delayTimesInSeconds = 20; + long start = System.currentTimeMillis(); + lastTempOut = 0.0; + lastBodyTemp = 0.0; + lastWristTemp = 0.0; + delayTimesInSeconds = 20; boolean[] state = HardwareUtils.isTemperatureDevAvailable(); IcLog.i(TAG, "TemperatureRunnable :" + state[0] + " state[1]:" + state[1]); if (state[0]) { //have temp @@ -44,46 +56,70 @@ public class TemperatureHelper { HardwareUtils.disablePedometer(); if (HardwareUtils.enableTemperature()) { IcLog.i(TAG, "getNdkTemperatureValue enableTemperature"); - Thread.sleep(1000); + long begin = System.currentTimeMillis(); + while (true) { + if (System.currentTimeMillis() - begin > 1000) { + break; + } + } } + //这里做超时处理 + ExecutorService executor = Executors.newSingleThreadExecutor(); while (true) { - lastWristTemp = HardwareUtils.getNdkTemperatureOutValue(); - TemperatureItem temperatureItem = TemperatureUtil.doTempTest(); - if (temperatureItem != null) { - lastWristTemp = Double.parseDouble(temperatureItem.getBodyTemp()); - lastTempOut = Double.parseDouble(temperatureItem.getEvnTemp()); - - if (lastTempOut > 60 || lastTempOut < 1) { - lastTempOut = 0.0f; - } - if (lastTempOut > 0.0f) { - lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, lastTempOut); - } else { - lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, 26.0f); + Future submit = executor.submit(() -> { + IcLog.d(TAG, "do temperature...."); + long begin = System.currentTimeMillis(); + while (true) { + if (System.currentTimeMillis() - begin > 1000) { + break; + } } - IcLog.d(TAG, "testing..." + lastWristTemp + " " + lastBodyTemp + " " + lastTempOut); - //前10秒不更新内容,后10秒再更新数据 - if (delayTimesInSeconds > 10 && mListener != null) { - IcLog.d(TAG, "update temperature info..thread name is ." + Thread.currentThread().getName()); - //获取 - IcLog.d(TAG, "lastWristTemp == > " + lastWristTemp); - IcLog.d(TAG, "lastBodyTemp == > " + lastBodyTemp); - IcLog.d(TAG, "lastTempOut == > " + lastTempOut); - mListener.onTemperatureUpdate(lastWristTemp, lastBodyTemp, lastTempOut); + long getStartTime = System.currentTimeMillis(); + lastWristTemp = HardwareUtils.getNdkTemperatureOutValue(); + TemperatureItem temperatureItem = TemperatureUtil.doTempTest(); + if (temperatureItem != null) { + lastWristTemp = Double.parseDouble(temperatureItem.getBodyTemp()); + lastTempOut = Double.parseDouble(temperatureItem.getEvnTemp()); + + if (lastTempOut > 60 || lastTempOut < 1) { + lastTempOut = 0.0f; + } + if (lastTempOut > 0.0f) { + lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, lastTempOut); + } else { + lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, 26.0f); + } + IcLog.d(TAG, "testing..." + lastWristTemp + " " + lastBodyTemp + " " + lastTempOut); + //前10秒不更新内容,后10秒再更新数据 + if (delayTimesInSeconds <= 10 && mListener != null) { + IcLog.d(TAG, "update temperature info..thread name is ." + Thread.currentThread().getName()); + //获取 + IcLog.d(TAG, "lastWristTemp == > " + lastWristTemp); + IcLog.d(TAG, "lastBodyTemp == > " + lastBodyTemp); + IcLog.d(TAG, "lastTempOut == > " + lastTempOut); + mListener.onTemperatureUpdate(lastWristTemp, lastBodyTemp, lastTempOut); + } + ICLogger.d("get temperature data use time == > " + (System.currentTimeMillis() - getStartTime)); } - } - //} + }); + try { - Thread.sleep(1000); - } catch (InterruptedException e) { - break; + ICLogger.d("start to get temperature data..."); + submit.get(10, TimeUnit.SECONDS); + ICLogger.d("to get temperature end..."); + } catch (Exception e) { + ICLogger.d("get temperature data time out..."); + continue; } delayTimesInSeconds--; + IcLog.d(TAG, "delayTimesInSeconds " + delayTimesInSeconds); //延时delay_times_in_seconds秒后停止检测。 - if (delayTimesInSeconds <= 0) + if (delayTimesInSeconds <= 0) { break; + } } - } catch (InterruptedException e) { + executor.shutdown(); + } catch (Exception e) { IcLog.e(TAG, "TemperatureRunnable :", e); } finally { HardwareUtils.disableTemperature(); @@ -93,8 +129,10 @@ public class TemperatureHelper { } } if (mListener != null) { + ICLogger.d("result == >lastWristTemp " + lastWristTemp + " lastBodyTemp" + lastBodyTemp + " lastTempOut" + lastTempOut); mListener.onTemperatureResult(lastWristTemp, lastBodyTemp, lastTempOut); } + IcLog.d(TAG, "temp use time == > " + (System.currentTimeMillis() - start)); } public void setTemperatureChangeListener(TemperatureChangeListener listener) { diff --git a/app/src/main/java/com/ic/work/utils/HardwareUtils.java b/app/src/main/java/com/ic/work/utils/HardwareUtils.java index 6ecf0c7..b39a7f5 100644 --- a/app/src/main/java/com/ic/work/utils/HardwareUtils.java +++ b/app/src/main/java/com/ic/work/utils/HardwareUtils.java @@ -1,7 +1,6 @@ package com.ic.work.utils; import com.ic.jni.ICJniUtils; -import com.ic.work.BuildConfig; public class HardwareUtils { @@ -49,12 +48,7 @@ public class HardwareUtils { public static boolean isWeared() { try { int value = ICJniUtils.isWeared(); -// if(BuildConfig.productType == 1002){ return value == 1; -// }else{ -// return value == 0; -// } - } catch (Exception e) { IcLog.e(TAG, "", e); return true; diff --git a/app/src/main/java/com/ic/work/utils/TemperatureUtil.java b/app/src/main/java/com/ic/work/utils/TemperatureUtil.java index 0e75137..6838272 100644 --- a/app/src/main/java/com/ic/work/utils/TemperatureUtil.java +++ b/app/src/main/java/com/ic/work/utils/TemperatureUtil.java @@ -25,36 +25,10 @@ public class TemperatureUtil { } - public static void enableTemp() { - if (ICJniUtils.isTemperatureDevAvailable() > ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_NONE.ordinal()) { - - ICJniUtils.disablePedometer(); - ICJniUtils.enableTemperature(); - mSleep(1000); - } - - } - public static double getBodyTemp(double wristtemp, double envtemp) { return ICJniUtils.getBodyTempFromWristTemp(wristtemp, envtemp); } - public static void disableTemp() { - if (ICJniUtils.isTemperatureDevAvailable() > ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_NONE.ordinal()) { - ICJniUtils.disableTemperature(); - ICJniUtils.enablePedometer(); - } - } - - public static void mSleep(int ms) { - try { - Thread.yield(); - Thread.sleep(ms); - } catch (Exception e) { - // Log.e(TAG,e.getMessage(),e); - } - } - //thermal_zone0 public static final String CMD_CPU_TEM = "/sys/class/thermal/thermal_zone0/temp";