release V477
authorsnickersun <snickersun@qq.com>
Thu, 6 Aug 2020 01:45:52 +0000 (09:45 +0800)
committersnickersun <snickersun@qq.com>
Thu, 6 Aug 2020 01:45:52 +0000 (09:45 +0800)
添加IC66的心率检测功能。

app/libs/frameworks-full-debug.jar
app/release/ICSer_V477_2008060943_release.apk [moved from app/release/ICSer_V476_2008060319_release.apk with 79% similarity]
app/src/main/java/com/enqualcomm/support/service/HeartRateManager.java
app/version_code.properties

index 898dad3..8b3dde7 100644 (file)
Binary files a/app/libs/frameworks-full-debug.jar and b/app/libs/frameworks-full-debug.jar differ
similarity index 79%
rename from app/release/ICSer_V476_2008060319_release.apk
rename to app/release/ICSer_V477_2008060943_release.apk
index 2649724..57e7ca6 100644 (file)
Binary files a/app/release/ICSer_V476_2008060319_release.apk and b/app/release/ICSer_V477_2008060943_release.apk differ
index fd0b17b..b1977ee 100644 (file)
@@ -4,6 +4,10 @@ import android.content.BroadcastReceiver;
 import android.content.Context;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
+import android.hardware.Sensor;\r
+import android.hardware.SensorEvent;\r
+import android.hardware.SensorEventListener;\r
+import android.hardware.SensorManager;\r
 import android.os.Bundle;\r
 import android.os.Handler;\r
 import android.os.Message;\r
@@ -28,6 +32,7 @@ import java.util.Random;
 import java.util.concurrent.ScheduledThreadPoolExecutor;\r
 import java.util.concurrent.TimeUnit;\r
 \r
+import static android.content.Context.SENSOR_SERVICE;\r
 import static com.enqualcomm.support.Constants.ACTION_BROADCAST_PPG;\r
 import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
 import static com.enqualcomm.support.Constants.MSG_WHAT_PPG;\r
@@ -36,7 +41,7 @@ import static com.enqualcomm.support.Constants.key_bpl;
 import static com.enqualcomm.support.Constants.key_ppg;\r
 import static com.enqualcomm.support.Constants.key_spo2;\r
 \r
-public class HeartRateManager extends AbstractInvokeHandlerService {\r
+public class HeartRateManager extends AbstractInvokeHandlerService implements SensorEventListener {\r
   private int mNetworkType;\r
 \r
   private SimSignalUtil mSignalUtil;\r
@@ -53,6 +58,9 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
     connection=_connection;\r
     currentStat= heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_CLOSED;\r
     isTimerStarted=false;\r
+    mSensorManager = (SensorManager) runtime.getContextProxy().context.getSystemService(SENSOR_SERVICE);\r
+    mHeartRate = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);\r
+\r
     mHandler=new Handler(new Handler.Callback() {\r
       @Override\r
       public boolean handleMessage(Message message) {\r
@@ -142,7 +150,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
   public void unRegReceiver(){\r
     runtime.getContextProxy().context.unregisterReceiver(PPGStartReceiver);\r
   }\r
-\r
+  private SensorManager mSensorManager;\r
+  private Sensor mHeartRate;\r
   int PPG;\r
   int BPH;\r
   int BPL;\r
@@ -158,12 +167,18 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
 \r
 \r
   public void doPPGtest(){\r
-    PPG= ICJniUtils.getPPG();//调用底层函数保证状态更新。\r
-    BPH=ICJniUtils.getHighBloodPressure();\r
-    BPL=ICJniUtils.getLowBloodPressure();\r
-    SPo2=ICJniUtils.getSPO2();\r
-    isWared = (ICJniUtils.isWeared()==1);\r
-    isPPGTesting = (ICJniUtils.isPPGStarted()==1 );\r
+\r
+    int hrsType=ICJniUtils.isPPGavailable();\r
+    if (hrsType>0 && hrsType != ICJniUtils.PPG_EGC_SensorType.PPG_EGC_TYPE_IC66.ordinal()) {\r
+      PPG = ICJniUtils.getPPG();//调用底层函数保证状态更新。\r
+      BPH = ICJniUtils.getHighBloodPressure();\r
+      BPL = ICJniUtils.getLowBloodPressure();\r
+      SPo2 = ICJniUtils.getSPO2();\r
+      isWared = (ICJniUtils.isWeared() == 1);\r
+      isPPGTesting = (ICJniUtils.isPPGStarted() == 1);\r
+    }else{\r
+      isPPGTesting=true;\r
+    }\r
     ICLogger.i("PPG TESTING="+isPPGTesting+", isWared="+isWared+", PPG="+PPG+", BPH="+BPH+", BPL="+BPL+", SPo2="+SPo2);\r
     if (isPPGTesting){\r
       if (isWared ) {\r
@@ -230,31 +245,47 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
     mWakeLock=null;\r
   }\r
   public void startPPG(){\r
-    if (ICJniUtils.isPPGavailable()>0 && isTimerStarted==false) {\r
-      currentStat=heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_OPEN;\r
-      delayCount=4;//检测成功后4秒发送数据\r
-      notWaredCount=5; //初始化没有佩戴的检测次数5,连续5秒没有佩戴则取消检测\r
-      testCount=MAX_TESTTIMES;//测试MAX_TESTTIMES后没有结果也要强制退出\r
-      isTimerStarted=true;\r
-      ICJniUtils.enablePPG();\r
+\r
+    int hrsType=ICJniUtils.isPPGavailable();\r
+    if ( hrsType > 0  && (isTimerStarted == false) ) {\r
+      currentStat = heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_OPEN;\r
+      delayCount = 4;//检测成功后4秒发送数据\r
+      notWaredCount = 5; //初始化没有佩戴的检测次数5,连续5秒没有佩戴则取消检测\r
+      testCount = MAX_TESTTIMES;//测试MAX_TESTTIMES后没有结果也要强制退出\r
+      isTimerStarted = true;\r
       getPPGWakeLock();\r
+      if (hrsType == ICJniUtils.PPG_EGC_SensorType.PPG_EGC_TYPE_IC66.ordinal()) {\r
 \r
-      timerPPG = new ScheduledThreadPoolExecutor(10);\r
-      timerPPG.scheduleAtFixedRate(new Runnable() {\r
-        @Override\r
-        public void run() {\r
-          doPPGtest();\r
-        }\r
-      }, 0, 1000, TimeUnit.MILLISECONDS); //1 秒更新一次数据\r
+        boolean ret = mSensorManager.registerListener(this, mHeartRate, SensorManager.SENSOR_DELAY_UI);\r
+        ICLogger.i( "Heart Rate PPG_EGC_TYPE_IC66 opened ret :: " + ret);\r
 \r
+      } else {\r
+\r
+        ICJniUtils.enablePPG();\r
+        timerPPG = new ScheduledThreadPoolExecutor(10);\r
+        timerPPG.scheduleAtFixedRate(new Runnable() {\r
+          @Override\r
+          public void run() {\r
+            doPPGtest();\r
+          }\r
+        }, 0, 1000, TimeUnit.MILLISECONDS); //1 秒更新一次数据\r
+\r
+      }\r
     }\r
   }\r
 \r
   public void stopPPG(){\r
     if( isTimerStarted )\r
     {\r
-      timerPPG.shutdownNow();\r
-      timerPPG.purge();\r
+\r
+      int hrsType=ICJniUtils.isPPGavailable();\r
+      if (hrsType == ICJniUtils.PPG_EGC_SensorType.PPG_EGC_TYPE_IC66.ordinal()) {\r
+        mSensorManager.unregisterListener(this);\r
+        ICLogger.i( "Heart Rate PPG_EGC_TYPE_IC66  closed");\r
+      }else {\r
+        timerPPG.shutdownNow();\r
+        timerPPG.purge();\r
+      }\r
       isTimerStarted=false;\r
     }\r
     ICJniUtils.disablePPG();\r
@@ -363,5 +394,31 @@ public static void triggerPPGtest(){
 \r
     return true;\r
   }\r
+\r
+  @Override\r
+  public void onSensorChanged(SensorEvent sensorEvent) {\r
+    float values[]=sensorEvent.values;\r
+    int length = values.length;\r
+    ICLogger.i( "onSensorChanged() is called "+length\r
+            +" PPG = "+values[0]\r
+            +", BPH = "+values[1]\r
+            +", BPL = "+values[2]\r
+            +", spo2 = "+values[3]\r
+            +" , Weared = "+values[4]\r
+    );\r
+    PPG = (int)values[0];//调用底层函数保证状态更新。\r
+    BPH = (int)values[1];\r
+    BPL = (int)values[2];\r
+    SPo2 = (int)values[3];\r
+    isWared = ((int)values[4] == 2);\r
+    isPPGTesting = true;// (ICJniUtils.isPPGStarted() == 1);\r
+    doPPGtest();\r
+    /*[0]---心率;[1]---血压高压;[2]---血压低压;[3]---血氧;[4]---佩戴检测(1--脱手,2--上手);*/\r
+  }\r
+\r
+  @Override\r
+  public void onAccuracyChanged(Sensor sensor, int i) {\r
+    ICLogger.i("onAccuracyChanged() is called "+sensor.getName()+" accuracy="+i);\r
+  }\r
 }\r
 \r
index f7f253b..bb13cba 100644 (file)
@@ -1,2 +1,2 @@
-#Thu Aug 06 03:19:06 CST 2020\r
-VERSION_CODE=476\r
+#Thu Aug 06 09:43:31 CST 2020\r
+VERSION_CODE=477\r