package com.ic.work;
import android.app.Service;
-import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import com.ic.work.domain.HeartRate;
import com.ic.work.domain.Temperature;
import com.ic.work.event.AkBloodCheckResultEvent;
-import com.ic.work.event.BloodCheckResultEvent;
-import com.ic.work.event.BloodCheckTempEvent;
import com.ic.work.event.BloodSensorEvent;
-import com.ic.work.event.TemperatureResultCompleteEvent;
-import com.ic.work.event.TemperatureResultEvent;
import com.ic.work.event.TestTaskEvent;
import com.ic.work.hardware.BloodInfoHelper;
import com.ic.work.hardware.BloodSensorManager;
import java.util.concurrent.LinkedBlockingDeque;
-import static com.ic.work.utils.ICWorkConstants.Jx.*;
-import static com.ic.work.utils.ICWorkConstants.ServiceType.*;
+import static com.ic.work.utils.ICWorkConstants.Jx.ACTION_AEE_HEART_RATE;
+import static com.ic.work.utils.ICWorkConstants.Jx.ACTION_AEE_TEMPERATURE;
+import static com.ic.work.utils.ICWorkConstants.Jx.ACTION_GET_HEART_RATE;
+import static com.ic.work.utils.ICWorkConstants.Jx.ACTION_GET_TEMPERATURE;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_HEART_BLOOD_OXYGEN;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_HEART_BLOOD_PRESS_H;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_HEART_BLOOD_PRESS_L;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_HEART_RATE;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_HEART_TEMPERATURE;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_HEART_TEMPERATURE_TYPE;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_MODE;
+import static com.ic.work.utils.ICWorkConstants.Jx.JX_KEY_RESULT;
+import static com.ic.work.utils.ICWorkConstants.ServiceType.ACTION_BLOOD;
+import static com.ic.work.utils.ICWorkConstants.ServiceType.ACTION_IC_TEMP;
/**
* 传感器数据服务,要获取传感器数据的,来绑定这个服务吧。
* 比如说这个心率,这个温度,以后还有其他的传感器,可以往这里添加。
*/
-public class SensorDataService extends Service {
+public class SensorDataService extends Service implements TemperatureHelper.TemperatureChangeListener, BloodInfoHelper.HeartRateInfoChangeListener {
public static final String ACTION_TEMP_RESULT = "com.ic.action.temp_result";
public static final String KEY_TEMP_BODY = "body"; // double 体温
private TestTaskEvent currentTask;
private BloodSensorManager bloodSensorManager;
+ private final Object mLock = new Object();
+
+
@Nullable
@Override
public IBinder onBind(Intent intent) {
EventBus.getDefault().register(this);
//创建一个Handler用来计算超时,如果超过这个时间,还没有执行完
//那么就取出下一个任务
- //TODO:
+ TemperatureHelper.getInstance().setTemperatureChangeListener(this);
+ BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(this);
}
/**
}
}
-
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void onMessageEvent(TemperatureResultCompleteEvent event) {
- IcLog.d(TAG, "lastWristTemp == > " + event.value);
- IcLog.d(TAG, "bodyTemp == > " + event.animal);
- IcLog.d(TAG, "envTemp == > " + event.tempOut);
- IcLog.d(TAG, "on temperature test end...");
- handleTemperature(event.value, event.animal, event.tempOut);
- sendTempBroadcast(event.value, event.animal, event.tempOut);
- //判断是否要执行新的任务
- checkContinue();
- }
-
- /**
- * 温度消息更新的事件
- *
- * @param event
- */
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void onMessageEvent(TemperatureResultEvent event) {
- //处理温度
- handleTemperature(event.value, event.animal, event.tempOut);
- }
-
- private void handleTemperature(double value, double animal, double tempOut) {
- Temperature temperature = new Temperature(value, animal, tempOut);
+ private void handleTemperature(double wristTemp, double bodyTemp, double envTemp) {
+ Temperature temperature = new Temperature(bodyTemp, wristTemp, envTemp);
//分发出去
dispatchTemperatureResult(temperature);
//处理温度测量数据给掌育的
if (jxTempMode != -1) {
- sendTemperatureBroadcast2Jx(true, value, animal);
+ sendTemperatureBroadcast2Jx(true, wristTemp, bodyTemp);
jxTempMode = -1;
}
-
- sendTempBroadcast(value, animal, tempOut);
-
+ sendTempBroadcast(wristTemp, bodyTemp, envTemp);
}
/**
* @param temperature
*/
private void dispatchTemperatureResult(Temperature temperature) {
- int i = temperatureCallbacks.beginBroadcast();
- while (i < 0) {
- i--;
- try {
- temperatureCallbacks.getBroadcastItem(i).onTemperatureGet(temperature);
- } catch (RemoteException e) {
- e.printStackTrace();
+ synchronized (mLock) {
+ int i = temperatureCallbacks.beginBroadcast();
+ IcLog.d(TAG, "temperature callback size == > " + i + " temperature is " + temperature);
+ while (i > 0) {
+ i--;
+ try {
+ temperatureCallbacks.getBroadcastItem(i).onTemperatureGet(temperature);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
}
+ temperatureCallbacks.finishBroadcast();
}
- temperatureCallbacks.finishBroadcast();
}
/**
* 获取温度相关的信息
*/
private void getTemperatureInfo() {
- IcLog.d(TAG, "getTemperatureInfo...");
+ IcLog.d(TAG, "getTemperatureInfo..." + Thread.currentThread().getName());
TemperatureHelper.getInstance().getTemperature();
}
//获取心率,这里要完成整个过程
private void getHeartInfo() {
- IcLog.d(TAG, "getHeartInfo...");
+ IcLog.d(TAG, "getHeartInfo..." + Thread.currentThread().getName());
BloodInfoHelper.getInstance().getBloodInfo();
}
super.onDestroy();
mTaskList.clear();
EventBus.getDefault().unregister(this);
+ TemperatureHelper.getInstance().setTemperatureChangeListener(null);
+ BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(null);
}
private final RemoteCallbackList<IHeartRateSensorCallback> heartRateCallbacks
= new RemoteCallbackList<>();
- private final IHeartRateSensorService.Stub heartRateSensorService = new IHeartRateSensorService.Stub() {
- @Override
- public void registerCallback(IHeartRateSensorCallback callback) {
- heartRateCallbacks.register(callback);
- }
+ private final IHeartRateSensorService.Stub heartRateSensorService =
+ new IHeartRateSensorService.Stub() {
+ @Override
+ public void registerCallback(IHeartRateSensorCallback callback, String tag) {
+ heartRateCallbacks.register(callback, tag);
+ }
- @Override
- public void unRegisterCallback(IHeartRateSensorCallback callback) {
- heartRateCallbacks.unregister(callback);
- }
+ @Override
+ public void unRegisterCallback(IHeartRateSensorCallback callback) {
+ heartRateCallbacks.unregister(callback);
+ }
- @Override
- public void getHeartRateInfo(int from) {
- IcLog.d(TAG, "getHeartRateInfo..." + from);
- createTask(from, TestTaskEvent.SensorType.HEART_RATE);
- }
- };
+ @Override
+ public void getHeartRateInfo(int from, String tag) {
+ IcLog.d(TAG, "getHeartRateInfo..." + from);
+ createTask(from, TestTaskEvent.SensorType.HEART_RATE, tag);
+ }
+ };
private TestTaskEvent.From getFromByValue(int value) {
for (TestTaskEvent.From item : TestTaskEvent.From.values()) {
private final ITempSensorService.Stub tempSensorService = new ITempSensorService.Stub() {
@Override
- public void registerCallback(ITempSensorCallback callback) {
- temperatureCallbacks.register(callback);
+ public void registerCallback(ITempSensorCallback callback, String tag) {
+ temperatureCallbacks.register(callback, tag);
}
@Override
}
@Override
- public void getTemperatureInfo(int from) {
+ public void getTemperatureInfo(int from, String tag) {
IcLog.d(TAG, "getTemperatureInfo..." + from);
TestTaskEvent.SensorType censorType = TestTaskEvent.SensorType.TEMPERATURE;
- createTask(from, censorType);
+ createTask(from, censorType, tag);
}
};
- private void createTask(int from, TestTaskEvent.SensorType censorType) {
+ private void createTask(int from, TestTaskEvent.SensorType censorType, String tag) {
TestTaskEvent.From fromByValue = getFromByValue(from);
if (fromByValue == null) {
IcLog.d(TAG, "from is not invalid..." + from);
);
IcLog.d(TAG, "create new task == > " + taskEvent);
//判断队列里是否有同样的任务,如果有的话不用发了,
- if (mTaskList.contains(taskEvent) || taskEvent.equals(currentTask)) {
+ if (mTaskList.contains(taskEvent)) {
IcLog.d(TAG, "task contains..." + fromByValue);
+ //通知正在等待执行
+ if (tag != null) {
+ dispatchWaiting(censorType, tag);
+ }
return;
}
+
+ if (taskEvent.equals(currentTask)) {
+ //通知正在执行
+ if (tag != null) {
+ dispatchTaskRunning(censorType, tag);
+ }
+ return;
+ }
+
IcLog.d(TAG, "is running =-== > " + isRunning +
" queue size == > " + mTaskList.size());
//判断是否繁忙
EventBus.getDefault().post(taskEvent);
} else {
IcLog.d(TAG, "new task waiting..." + taskEvent);
- //需要等待,要放到队列里头
+ //要放到队列里头,提示调用者正在等待执行
+ if (tag != null) {
+ dispatchWaiting(censorType, tag);
+ }
mTaskList.add(taskEvent);
}
}
+ private void dispatchWaiting(TestTaskEvent.SensorType censorType, String tag) {
+ if (censorType == TestTaskEvent.SensorType.TEMPERATURE) {
+ //温度的
+ synchronized (mLock) {
+ try {
+ int i = temperatureCallbacks.beginBroadcast();
+ while (i > 0) {
+ i--;
+ String callbackTag = (String) temperatureCallbacks.getBroadcastCookie(i);
+ if (callbackTag != null && callbackTag.equals(tag)) {
+ temperatureCallbacks.getBroadcastItem(i).onWaiting();
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ temperatureCallbacks.finishBroadcast();
+ }
+ }
+ } else if (censorType == TestTaskEvent.SensorType.HEART_RATE) {
+ //心率的
+ synchronized (mLock) {
+ try {
+ int i = heartRateCallbacks.beginBroadcast();
+ while (i > 0) {
+ i--;
+ String callbackTag = (String) heartRateCallbacks.getBroadcastCookie(i);
+ if (callbackTag != null && callbackTag.equals(tag)) {
+ heartRateCallbacks.getBroadcastItem(i).onWaiting();
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ heartRateCallbacks.finishBroadcast();
+ }
+ }
+ }
+ }
+
+ /**
+ * 通知对应的回调,任务正在运行
+ *
+ * @param censorType
+ * @param tag
+ */
+ private void dispatchTaskRunning(TestTaskEvent.SensorType censorType, String tag) {
+ if (censorType == TestTaskEvent.SensorType.TEMPERATURE) {
+ //温度的
+ synchronized (mLock) {
+ try {
+ int i = temperatureCallbacks.beginBroadcast();
+ while (i > 0) {
+ i--;
+ String callbackTag = (String) temperatureCallbacks.getBroadcastCookie(i);
+ if (callbackTag != null && callbackTag.equals(tag)) {
+ temperatureCallbacks.getBroadcastItem(i).onGettingData();
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ temperatureCallbacks.finishBroadcast();
+ }
+ }
+ } else if (censorType == TestTaskEvent.SensorType.HEART_RATE) {
+ //心率的
+ synchronized (mLock) {
+ try {
+ int i = heartRateCallbacks.beginBroadcast();
+ while (i > 0) {
+ i--;
+ String callbackTag = (String) heartRateCallbacks.getBroadcastCookie(i);
+ if (callbackTag != null && callbackTag.equals(tag)) {
+ heartRateCallbacks.getBroadcastItem(i).onGettingData();
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ heartRateCallbacks.finishBroadcast();
+ }
+ }
+ }
+ }
- @Subscribe(threadMode = ThreadMode.MAIN)
+
+ @Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessageEvent(BloodSensorEvent event) {
switch (event.type) {
case 1:
}
}
- @Subscribe(threadMode = ThreadMode.MAIN)
+ @Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessageEvent(AkBloodCheckResultEvent event) {
- int[] deviation = getPPG_ECG_adjustValue(this);
+ int[] deviation = getPPG_ECG_adjustValue();
event.heart = event.heart + deviation[0];
event.high = event.high + deviation[1];
event.low = event.low + deviation[2];
if (ACTION_GET_HEART_RATE.equals(action)) {
jxHeartRateMode = intent.getIntExtra(JX_KEY_MODE, -1);
//创建测试心率的任务
- createTask(jxHeartRateMode, TestTaskEvent.SensorType.HEART_RATE);
+ createTask(jxHeartRateMode, TestTaskEvent.SensorType.HEART_RATE, null);
} else if (ACTION_GET_TEMPERATURE.equals(action)) {
jxTempMode = intent.getIntExtra(JX_KEY_MODE, -1);
//创建测试温度的任务
- createTask(jxTempMode, TestTaskEvent.SensorType.TEMPERATURE);
+ createTask(jxTempMode, TestTaskEvent.SensorType.TEMPERATURE, null);
}
return super.onStartCommand(intent, flags, startId);
}
- /**
- * 这个是最终结果
- *
- * @param event
- */
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void onMessageEvent(BloodCheckResultEvent event) {
- //处理心率测量数据给掌育的
- //发广播给掌育,如果不为-1,说明有掌育的份
- IcLog.d(TAG, "jxHeartRateMode..." + jxHeartRateMode);
- if (jxHeartRateMode != -1) {
- sendHeartRateBroadcast2Jx(true, event.getHigh(),
- event.getLow(), event.getHeart(), event.getOxygen());
- }
- //reset data.
- handleBloodResult(event.getHigh(), event.getLow(), event.getHeart(), event.getOxygen());
- IcLog.d(TAG, "on blood test end...");
- checkContinue();
- }
-
- /**
- * 这个是更新结果
- *
- * @param event
- */
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void onMessageEvent(BloodCheckTempEvent event) {
- handleBloodResult(event.getHigh(),
- event.getLow(), event.getHeart(), event.getOxygen());
+ private void dispatchHeartRateUpdate(int high, int low, int heart, int oxygen) {
+ //更新一下数据
+ HeartRate heartRate = new HeartRate(high, low, heart, oxygen);
+ synchronized (mLock) {
+ int i = heartRateCallbacks.beginBroadcast();
+ try {
+ while (i > 0) {
+ i--;
+ heartRateCallbacks.getBroadcastItem(i).onHeartRateUpdate(heartRate);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ heartRateCallbacks.finishBroadcast();
+ }
}
/**
* @param heartRate
*/
private void dispatchHeartRateResult(HeartRate heartRate) {
- int i = heartRateCallbacks.beginBroadcast();
- while (i < 0) {
- i--;
- try {
- heartRateCallbacks.getBroadcastItem(i).onHeartRateGet(heartRate);
- } catch (RemoteException e) {
- e.printStackTrace();
+ synchronized (mLock) {
+ int i = heartRateCallbacks.beginBroadcast();
+ IcLog.d(TAG, "heart rate callback size == > " + i);
+ while (i > 0) {
+ i--;
+ try {
+ heartRateCallbacks.getBroadcastItem(i).onHeartRateGet(heartRate);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
}
+ heartRateCallbacks.finishBroadcast();
}
- heartRateCallbacks.finishBroadcast();
}
private void sendHeartBroadcast(int count, int spo2) {
}
- public int[] getPPG_ECG_adjustValue(Context context) {
+ public int[] getPPG_ECG_adjustValue() {
String value = IcSystemProperty.getSystemProperties("persist.sys.PpgEcgAdjust", "0,0,0,0");
IcLog.i(TAG, "getPPG_ECG_adjustValue:" + value);
String[] result = value.split(",");
sendBroadcast(intent);
}
+ private void dispatchTemperatureUpdate(Temperature temperature) {
+ synchronized (mLock) {
+ int i = temperatureCallbacks.beginBroadcast();
+ IcLog.d(TAG, "dispatch temperature update == > " + temperature);
+ try {
+ while (i > 1) {
+ i--;
+ temperatureCallbacks.getBroadcastItem(i).onTemperatureUpdating(temperature);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (i > 0) {
+ temperatureCallbacks.finishBroadcast();
+ }
+ }
+ }
+
/**
* 发送体温数据给掌育
*/
private void sendTemperatureBroadcast2Jx(boolean isSuccess, double value, double animal) {
IcLog.d(TAG, "sendTemperatureBroadcast2Jx -- > " +
- isSuccess + " value == > " + value
- + "animal == > " + animal);
+ isSuccess + " wrist == > " + value
+ + "body == > " + animal);
Intent intent = new Intent();
intent.setAction(ACTION_AEE_TEMPERATURE);
intent.putExtra(JX_KEY_RESULT, isSuccess ? "1" : "0");
intent.putExtra(JX_KEY_MODE, jxTempMode);
- intent.putExtra(JX_KEY_HEART_TEMPERATURE, value);
+ intent.putExtra(JX_KEY_HEART_TEMPERATURE, animal);
//类型0:手腕模式 1:额头模式
intent.putExtra(JX_KEY_HEART_TEMPERATURE_TYPE, "1");
sendBroadcast(intent);
}
- private void sendTempBroadcast(double value, double animal, double tempOut) {
+ private void sendTempBroadcast(double wristTemp, double bodyTemp, double envTemp) {
Intent pedIntent = new Intent();
pedIntent.setAction(ACTION_TEMP_RESULT);
- pedIntent.putExtra(KEY_TEMP_WRIST, value);
- pedIntent.putExtra(KEY_TEMP_BODY, animal);
- pedIntent.putExtra(KEY_TEMP_OUT, tempOut);
+ pedIntent.putExtra(KEY_TEMP_WRIST, wristTemp);
+ pedIntent.putExtra(KEY_TEMP_BODY, bodyTemp);
+ pedIntent.putExtra(KEY_TEMP_OUT, envTemp);
sendBroadcast(pedIntent);
IcLog.d(TAG, " sendTempBroadcast...");
}
+
+ @Override
+ public void onTemperatureUpdate(double wristTemp, double bodyTemp, double envTemp) {
+ Temperature temperature = new Temperature(bodyTemp, wristTemp, envTemp);
+ //处理温度
+ dispatchTemperatureUpdate(temperature);
+ }
+
+ @Override
+ public void onTemperatureResult(double wristTemp, double bodyTemp, double envTemp) {
+ IcLog.d(TAG, "lastWristTemp == > " + wristTemp);
+ IcLog.d(TAG, "bodyTemp == > " + bodyTemp);
+ IcLog.d(TAG, "envTemp == > " + envTemp);
+ IcLog.d(TAG, "on temperature test end...");
+ handleTemperature(wristTemp, bodyTemp, envTemp);
+ //判断是否要执行新的任务
+ checkContinue();
+ }
+
+ @Override
+ public void onHeartRateUpdate(int high, int low, int heart, int oxygen) {
+ //更新
+ dispatchHeartRateUpdate(high, low, heart, oxygen);
+ }
+
+ @Override
+ public void onHeartRateResult(int high, int low, int heart, int oxygen) {
+ //处理心率测量数据给掌育的
+ //发广播给掌育,如果不为-1,说明有掌育的份
+ IcLog.d(TAG, "jxHeartRateMode..." + jxHeartRateMode);
+ if (jxHeartRateMode != -1) {
+ sendHeartRateBroadcast2Jx(true, high,
+ low, heart, oxygen);
+ }
+ //reset data.
+ handleBloodResult(high, low, heart, oxygen);
+ IcLog.d(TAG, "on blood test end...");
+ //checkContinue();
+ // 心率有一个方去结束
+ }
+
+ @Override
+ public void onHeartRateTestFinished() {
+ checkContinue();
+ }
}