boolean isActiveValue = Boolean.parseBoolean(isActive);
//判断是否活跃
ICLogger.d("isActiveValue == > " + isActiveValue);
+ handler.removeCallbacks(checkPetCountTask);
if (isActiveValue) {
handler.post(checkPetCountTask);
- } else {
- handler.removeCallbacks(checkPetCountTask);
}
}
} catch (Exception e) {
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));
contentValuesCalorie.put("s_value", value);
getContentResolver().insert(Uri.parse(SensorDataService.SETTINGS), contentValues);
//获取步数,然后入库
- handler.postDelayed(this, 2000);
+ handler.removeCallbacks(this);
+ handler.postDelayed(this, 1000 * 5);
}
};
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);
//分发出去
//获取心率,这里要完成整个过程
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
private final RemoteCallbackList<IHeartRateSensorCallback> heartRateCallbacks
= new RemoteCallbackList<>();
+ private boolean isOxygenOrHeartRateStop = false;
private final IHeartRateSensorService.Stub heartRateSensorService =
new IHeartRateSensorService.Stub() {
@Override
@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;
+ }
}
};
temperatureCallbacks.finishBroadcast();
}
}
- } else if (censorType == TestTaskEvent.SensorType.HEART_RATE) {
+ } else if (censorType == TestTaskEvent.SensorType.HEART_RATE_AND_OXYGEN) {
//心率的
synchronized (mLock) {
try {
temperatureCallbacks.finishBroadcast();
}
}
- } else if (censorType == TestTaskEvent.SensorType.HEART_RATE) {
+ } else if (censorType == TestTaskEvent.SensorType.HEART_RATE_AND_OXYGEN) {
//心率的
synchronized (mLock) {
try {
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);
//创建测试温度的任务
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:这个后面再处理,得给我机器再去处理,没有文档,没有数据
}
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;
private int invalidateTime = 0;
+ private boolean continueTest = true;
+
private void checkBloodOther() {
+ continueTest = true;
checkBloodStartTime = System.currentTimeMillis();
IcLog.d(TAG, "start time == > " + checkBloodStartTime);
ndkHeart = 0;
//- 没有穿戴,如果超过20秒没有穿戴,那么就结束此次测试
//- 数据测试结果为0,如果连续20个数据为0,那么就结束此次测试
//- 有数据以后,连续测上10次,就可以返回结果了
- ppgLooper.postDelayed(this::checkWear, 1000);
+ ppgLooper.post(this::checkWear);
}
private void checkWear() {
+ (System.currentTimeMillis() - checkBloodStartTime));
}
- private void doPPGtest() {
+ private void dispatchPPG() {
if (ndkHeart > 0) {
if (oxygen <= 0) oxygen = randomOxygenValue();
if (mListener != null) {
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));
}
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]);