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
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
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
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
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
\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
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
\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