add different test type.
authorTrillGates <williamtrillgates@gmail.com>
Mon, 21 Jun 2021 12:43:33 +0000 (20:43 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Mon, 21 Jun 2021 12:43:33 +0000 (20:43 +0800)
app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl
app/src/main/java/com/ic/work/SensorDataService.java
app/src/main/java/com/ic/work/event/TestTaskEvent.java
app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java

index 9afcc4f..006912a 100644 (file)
@@ -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
index ef9be7d..638e8ee 100644 (file)
@@ -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<IHeartRateSensorCallback> 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);
             //创建测试温度的任务
index 45f7f22..3786869 100644 (file)
@@ -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;
 
index 9330fd5..01c7880 100644 (file)
@@ -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]);