From: TrillGates Date: Mon, 21 Jun 2021 12:43:33 +0000 (+0800) Subject: add different test type. X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=cdd6db38730a372fc7c4813fe48435191ffaacec;p=icworkservice.git add different test type. --- diff --git a/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl b/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl index 9afcc4f..006912a 100644 --- a/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl +++ b/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl @@ -7,4 +7,7 @@ interface IHeartRateSensorService { void registerCallback(in IHeartRateSensorCallback callback,in String callbackTag); void unRegisterCallback(in IHeartRateSensorCallback callback); oneway void getHeartRateInfo(in int from,in String callbackTag); + oneway void getJustOxygenInfo(in int from,in String callbackTag); + oneway void getJustHeartRateInfo(in int from,in String callbackTag); + oneway void stopCurrentWork(in 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 ef9be7d..638e8ee 100644 --- a/app/src/main/java/com/ic/work/SensorDataService.java +++ b/app/src/main/java/com/ic/work/SensorDataService.java @@ -145,10 +145,9 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp boolean isActiveValue = Boolean.parseBoolean(isActive); //判断是否活跃 ICLogger.d("isActiveValue == > " + isActiveValue); + handler.removeCallbacks(checkPetCountTask); if (isActiveValue) { handler.post(checkPetCountTask); - } else { - handler.removeCallbacks(checkPetCountTask); } } } catch (Exception e) { @@ -170,7 +169,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp getContentResolver().insert( Uri.parse(SensorDataService.SETTINGS), contentValues ); - //ICLogger.d("count == > " + count); + ICLogger.d("count == > " + count); //更新卡路里 BigDecimal bg = new BigDecimal(PedUtil.calcConsumeEnergy(SPUtils.getPedHeightSP(getBaseContext()), SPUtils.getPedWighttSP(getBaseContext()), count)); @@ -181,7 +180,8 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp contentValuesCalorie.put("s_value", value); getContentResolver().insert(Uri.parse(SensorDataService.SETTINGS), contentValues); //获取步数,然后入库 - handler.postDelayed(this, 2000); + handler.removeCallbacks(this); + handler.postDelayed(this, 1000 * 5); } }; @@ -203,19 +203,40 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp isRunning = true; //这里处理指令,不可以开启子线程 switch (testTaskEvent.sensorType) { - case HEART_RATE: + case HEART_RATE_AND_OXYGEN: //获取心率内容 getHeartInfo(); break; case TEMPERATURE: getTemperatureInfo(); break; + case JUST_OXYGEN: + justGetOxygen(); + break; + case JUST_HEART_RATE: + justGetHeartRate(); + break; default: - IcLog.d(TAG, "not support sensor..or you can add new one by coding.."); + IcLog.d(TAG, "not support sensor..or" + + " you can add new one by coding.."); break; } } + private void justGetHeartRate() { + if (!isOxygenOrHeartRateStop) { + BloodInfoHelper instance = BloodInfoHelper.getInstance(); + instance.doGh301Test(BloodInfoHelper.DELAY_TIME_FOR_PPG_TEST); + } + } + + private void justGetOxygen() { + if (!isOxygenOrHeartRateStop) { + BloodInfoHelper instance = BloodInfoHelper.getInstance(); + instance.doGh301Test(BloodInfoHelper.DELAY_TIME_FOR_SPO2_TEST); + } + } + private void handleTemperature(double wristTemp, double bodyTemp, double envTemp) { Temperature temperature = new Temperature(bodyTemp, wristTemp, envTemp); //分发出去 @@ -293,8 +314,10 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp //获取心率,这里要完成整个过程 private void getHeartInfo() { - IcLog.d(TAG, "getHeartInfo..." + Thread.currentThread().getName()); - BloodInfoHelper.getInstance().getBloodInfo(); + if (!isOxygenOrHeartRateStop) { + IcLog.d(TAG, "getHeartInfo..." + Thread.currentThread().getName()); + BloodInfoHelper.getInstance().getBloodInfo(); + } } @Override @@ -313,6 +336,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp private final RemoteCallbackList heartRateCallbacks = new RemoteCallbackList<>(); + private boolean isOxygenOrHeartRateStop = false; private final IHeartRateSensorService.Stub heartRateSensorService = new IHeartRateSensorService.Stub() { @Override @@ -329,9 +353,38 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp @Override public void getHeartRateInfo(int from, String tag) { + isOxygenOrHeartRateStop = false; jxHeartRateMode = 2; IcLog.d(TAG, "getHeartRateInfo..." + from + " tag == > " + tag); - createTask(from, TestTaskEvent.SensorType.HEART_RATE, tag); + createTask(from, TestTaskEvent.SensorType.HEART_RATE_AND_OXYGEN, tag); + } + + @Override + public void getJustOxygenInfo(int from, String callbackTag) { + isOxygenOrHeartRateStop = false; + //只获取血氧 + IcLog.d(TAG, "getJustOxygenInfo..." + from + " tag == > " + callbackTag); + createTask(from, TestTaskEvent.SensorType.JUST_OXYGEN, callbackTag); + } + + @Override + public void getJustHeartRateInfo(int from, String callbackTag) { + isOxygenOrHeartRateStop = false; + //只获取心率 + IcLog.d(TAG, "getJustHeartRateInfo..." + from + " tag == > " + callbackTag); + createTask(from, TestTaskEvent.SensorType.JUST_HEART_RATE, callbackTag); + } + + @Override + public void stopCurrentWork(int from, String callbackTag) { + //结束当前的心率/血氧测试任务 + //判断当前的任务是啥?如果是心率或者血氧的,并且是来自UI的测试,那么就停止 + //如果是来自后台的不会停止 + //如果队列里的任务是来自UI的心率/血氧,移除任务 + if (from == TestTaskEvent.From.CLIENT_CMD.getValue()) { + BloodInfoHelper.getInstance().stopTest(); + isOxygenOrHeartRateStop = true; + } } }; @@ -437,7 +490,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp temperatureCallbacks.finishBroadcast(); } } - } else if (censorType == TestTaskEvent.SensorType.HEART_RATE) { + } else if (censorType == TestTaskEvent.SensorType.HEART_RATE_AND_OXYGEN) { //心率的 synchronized (mLock) { try { @@ -485,7 +538,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp temperatureCallbacks.finishBroadcast(); } } - } else if (censorType == TestTaskEvent.SensorType.HEART_RATE) { + } else if (censorType == TestTaskEvent.SensorType.HEART_RATE_AND_OXYGEN) { //心率的 synchronized (mLock) { try { @@ -582,7 +635,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp if (ACTION_GET_HEART_RATE.equals(action)) { jxHeartRateMode = intent.getIntExtra(JX_KEY_MODE, -1); //创建测试心率的任务 - createTask(jxHeartRateMode, TestTaskEvent.SensorType.HEART_RATE, null); + createTask(jxHeartRateMode, TestTaskEvent.SensorType.HEART_RATE_AND_OXYGEN, null); } else if (ACTION_GET_TEMPERATURE.equals(action)) { jxTempMode = intent.getIntExtra(JX_KEY_MODE, -1); //创建测试温度的任务 diff --git a/app/src/main/java/com/ic/work/event/TestTaskEvent.java b/app/src/main/java/com/ic/work/event/TestTaskEvent.java index 45f7f22..3786869 100644 --- a/app/src/main/java/com/ic/work/event/TestTaskEvent.java +++ b/app/src/main/java/com/ic/work/event/TestTaskEvent.java @@ -17,7 +17,10 @@ public class TestTaskEvent { //传感器类型 public enum SensorType { TEMPERATURE(0), - HEART_RATE(1); + HEART_RATE_AND_OXYGEN(1), + JUST_OXYGEN(2), + JUST_HEART_RATE(3); + private final int mValue; 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 9330fd5..01c7880 100644 --- a/app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java +++ b/app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java @@ -51,10 +51,17 @@ public class BloodInfoHelper implements SensorEventListener { private static final String TAG = "BloodInfoHelper"; + public void stopTest() { + //停止当前的测试 + // 有两种,一种是走JNI的测试 + // 一种是走官方API的测试 + //JNI的测试也可以停止 + continueTest = false; + } + public void getBloodInfo() { ICLogger.d("getBloodInfo..."); boolean[] deviceState = HardwareUtils.isPPGavailableIc66(); - if (!deviceState[0]) { IcLog.d(TAG, "deviceState[0] == > false"); //TODO:这个后面再处理,得给我机器再去处理,没有文档,没有数据 @@ -65,31 +72,40 @@ public class BloodInfoHelper implements SensorEventListener { } return; } - ICLogger.d("deviceState[1]..." + deviceState[1]); if (deviceState[1]) { - mSensorManager = (SensorManager) WorkServiceApp.sContext.getSystemService(SENSOR_SERVICE); - mHeartRate = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); - boolean ret = mSensorManager.registerListener(this, mHeartRate, SensorManager.SENSOR_DELAY_FASTEST); - Log.d(TAG, "ret == > " + ret); - isWear = false; - ndkHeart = 0; - ndkHigh = 0; - ndkLow = 0; - oxygen = 0; - checkCount = 0; - noWearCount = 0; - invalidateTime = 0; - //加一个超时处理,如果超过30秒没有数据返回 - //那么就会干掉当前的任务,并且取消监听,重置数据 - //如果有数据回来,那么就重新设置下一次超时 - ppgLooper.postDelayed(mTask, TIME_OUT_VALUE); + doGh301Test(DELAY_TIME_FOR_SPO2_TEST); } else { //这个走JNI获取数据的,完成了 checkBloodOther(); } } + + public final static int DELAY_TIME_FOR_SPO2_TEST = SensorManager.SENSOR_DELAY_FASTEST; + public final static int DELAY_TIME_FOR_PPG_TEST = SensorManager.SENSOR_DELAY_NORMAL; + + public void doGh301Test(int type) { + ICLogger.d("doGh301Test..." + type); + continueTest = true; + mSensorManager = (SensorManager) WorkServiceApp.sContext.getSystemService(SENSOR_SERVICE); + mHeartRate = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); + boolean ret = mSensorManager.registerListener(this, mHeartRate, type); + Log.d(TAG, "ret == > " + ret); + isWear = false; + ndkHeart = 0; + ndkHigh = 0; + ndkLow = 0; + oxygen = 0; + checkCount = 0; + noWearCount = 0; + invalidateTime = 0; + //加一个超时处理,如果超过30秒没有数据返回 + //那么就会干掉当前的任务,并且取消监听,重置数据 + //如果有数据回来,那么就重新设置下一次超时 + ppgLooper.postDelayed(mTask, TIME_OUT_VALUE); + } + //10秒还没有数据回来,那么就结束测试 public static final int TIME_OUT_VALUE = 10 * 1000; @@ -119,7 +135,10 @@ public class BloodInfoHelper implements SensorEventListener { private int invalidateTime = 0; + private boolean continueTest = true; + private void checkBloodOther() { + continueTest = true; checkBloodStartTime = System.currentTimeMillis(); IcLog.d(TAG, "start time == > " + checkBloodStartTime); ndkHeart = 0; @@ -136,7 +155,7 @@ public class BloodInfoHelper implements SensorEventListener { //- 没有穿戴,如果超过20秒没有穿戴,那么就结束此次测试 //- 数据测试结果为0,如果连续20个数据为0,那么就结束此次测试 //- 有数据以后,连续测上10次,就可以返回结果了 - ppgLooper.postDelayed(this::checkWear, 1000); + ppgLooper.post(this::checkWear); } private void checkWear() { @@ -183,7 +202,7 @@ public class BloodInfoHelper implements SensorEventListener { + (System.currentTimeMillis() - checkBloodStartTime)); } - private void doPPGtest() { + private void dispatchPPG() { if (ndkHeart > 0) { if (oxygen <= 0) oxygen = randomOxygenValue(); if (mListener != null) { @@ -211,12 +230,16 @@ public class BloodInfoHelper implements SensorEventListener { ndkHigh = HardwareUtils.getNdkHighBloodValue(); ndkLow = HardwareUtils.getNdkLowBloodValue(); oxygen = HardwareUtils.getNdkOxygenValue(); - doPPGtest(); + dispatchPPG(); if (checkCount > 10 || invalidateTime > 30) { handleResultOtherBlood(); } else { - //继续测试 - ppgLooper.postDelayed(this, 1000); + if (!continueTest) { + handleResultOtherBlood(); + } else { + //继续测试 + ppgLooper.postDelayed(this, 1000); + } } IcLog.d(TAG, "use time == > " + (System.currentTimeMillis() - getPPGStartTime)); } @@ -288,15 +311,20 @@ public class BloodInfoHelper implements SensorEventListener { oxygen = (int) values[3]; isWear = ((int) values[4] == 2); // isPPGTesting = true;// (ICJniUtils.isPPGStarted() == 1); - doPPGtest(); + dispatchPPG(); /*[0]---心率;[1]---血压高压;[2]---血压低压;[3]---血氧;[4]---佩戴检测(1--脱手,2--上手);*/ if (checkCount > 10 || invalidateTime > 30) { //结束了,干掉超时任务 ppgLooper.removeCallbacks(mTask); handleResult(); } else { - ppgLooper.removeCallbacks(mTask); - ppgLooper.postDelayed(mTask, TIME_OUT_VALUE); + if (!continueTest) { + ppgLooper.removeCallbacks(mTask); + handleResult(); + } else { + ppgLooper.removeCallbacks(mTask); + ppgLooper.postDelayed(mTask, TIME_OUT_VALUE); + } } } else { Log.d(TAG, "on sensor change == > PPG= " + values[0]);