interface IExInfoCallback {
//获取主板温度的回调方法
- void onBoardTemperatureLoaded(in float tempearture);
+ void onBoardTemperatureLoaded(in double tempearture);
//高温警告的回调方法
- void onBoardTemperatureTooHigh(in float limit);
+ void onBoardTemperatureTooHigh(in double limit);
}
\ No newline at end of file
// IExInfoService.aidl
package com.ic.work;
+import com.ic.work.IExInfoCallback;
+
interface IExInfoService {
//获取主板温度
- void getBoardTemperature();
+ oneway void getBoardTemperature();
//设置主办温度的阀值和测试周期
//如果没有设置测试周期,越接近阀值温度,测试越频繁,离阀值温度越远
//测试不那么频繁
- void setBoardTempCheckCycle(in int second);
+ oneway void setBoardTempCheckCycle(in int second);
//如果没有设置,默认是50度
- void setBoardTempTopLimit(in float temp);
+ oneway void setBoardTempTopLimit(in float temp);
+ //开启主板温度监听
+ oneway void triggerBoardTempListener(in boolean isListener);
+ //注册接口
+ oneway void registerCallback(in IExInfoCallback callback);
+ //取消接口注册
+ oneway void unregisterCallback(in IExInfoCallback callback);
}
\ No newline at end of file
import android.app.Service;
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import com.ic.work.hardware.BloodInfoHelper;
import com.ic.work.hardware.BloodSensorManager;
import com.ic.work.hardware.TemperatureHelper;
+import com.ic.work.utils.AlarmManagerUtil;
import com.ic.work.utils.ICLogger;
import com.ic.work.utils.ICWorkConstants;
import com.ic.work.utils.IcLog;
import com.ic.work.utils.IcSystemProperty;
+import com.ic.work.utils.TemperatureUtil;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.util.concurrent.LinkedBlockingDeque;
+import static com.ic.work.utils.ICWorkConstants.ACTION_EX_INFO;
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;
private PowerManager.WakeLock wakeLock;
private HandlerThread handlerThread;
private Handler handler;
+ private IExInfoCallback mExInfoCallback;
+ private SharedPreferences exInfoValueSp;
+ //主板温度检测周期
+ private int mBoardCheckCycle;
+ //主板温度上限阀值
+ private int mBoardTopLimit;
// 有效值的最大出现次数
@Nullable
+ packageName + " action name is == > " + action);
if (ICWorkConstants.SensorServiceAction.ACTION_HEART_RATE.equals(action)) {
return heartRateSensorService;
- }
-
- if (ICWorkConstants.SensorServiceAction.ACTION_TEMPERATURE.equals(action)) {
+ } else if (ICWorkConstants.SensorServiceAction.ACTION_TEMPERATURE.equals(action)) {
return tempSensorService;
+ } else if (ACTION_EX_INFO.equals(action)) {
+ return exInfoService;
}
+
return null;
}
handlerThread = new HandlerThread("ic:sensor:handler");
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
+ exInfoValueSp = getSharedPreferences("ex_info_value", Context.MODE_PRIVATE);
+ mBoardCheckCycle = exInfoValueSp.getInt("check_cycle", 60 * 5);
+ mBoardTopLimit = exInfoValueSp.getInt("top_limit", 50);
}
return null;
}
+ private final IExInfoService.Stub exInfoService = new IExInfoService.Stub() {
+
+ @Override
+ public void getBoardTemperature() {
+ //获取主板的温度
+ double boardTemperature = TemperatureUtil.getBoardTemperature();
+ if (mExInfoCallback != null) {
+ try {
+ mExInfoCallback.onBoardTemperatureLoaded(boardTemperature);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void setBoardTempCheckCycle(int second) {
+ exInfoValueSp.edit().putInt("check_cycle", second).apply();
+ //设置主板温度的测试周期
+ mBoardCheckCycle = exInfoValueSp.getInt("check_cycle", 60 * 5);
+ }
+
+ @Override
+ public void setBoardTempTopLimit(float temp) {
+ //设置温度的上限阀值
+ exInfoValueSp.edit().putFloat("top_limit", temp).apply();
+ mBoardTopLimit = exInfoValueSp.getInt("top_limit", 50);
+ }
+
+ @Override
+ public void triggerBoardTempListener(boolean isListener) {
+ //开关
+ if (isListener) {
+ //设置alarm
+ int nextDistance = mBoardCheckCycle * 1000;
+ Intent intent = new Intent();
+ intent.setAction(AlarmManagerUtil.ALARM_ACTION);
+ intent.putExtra("id", AlarmManagerUtil.DEFAULT_ALARM_ID);
+ intent.putExtra("intervalMillis", nextDistance);
+ AlarmManagerUtil.setAlarmTime(SensorDataService.this,
+ nextDistance,
+ intent);
+ } else {
+ //取消alarm
+ AlarmManagerUtil.cancelAlarm(SensorDataService.this, AlarmManagerUtil.ALARM_ACTION,
+ AlarmManagerUtil.DEFAULT_ALARM_ID);
+ }
+ }
+
+ @Override
+ public void registerCallback(IExInfoCallback callback) {
+ //注册回调接,目前只有一个地方,直接保存为成员吧
+ mExInfoCallback = callback;
+ }
+
+ @Override
+ public void unregisterCallback(IExInfoCallback callback) {
+ //取消接口注册
+ mExInfoCallback = null;
+ }
+ };
+
//这个是温度通知的,如果任务已经在队列里了,那么就不再发送任务了,但是会被通知到的。
private final RemoteCallbackList<ITempSensorCallback> temperatureCallbacks =
//创建测试温度的任务
createTask(jxTempMode, TestTaskEvent.SensorType.TEMPERATURE, null);
}
+
return super.onStartCommand(intent, flags, startId);
}
+++ /dev/null
-package com.ic.work;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * 这个是监听获取 温度的周期Alarm
- */
-public class TemperatureListenerReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- //TODO:
- }
-}
public class AlarmManagerUtil {
public static final String ALARM_ACTION = "com.ic.alarm.action.BOARD_TEMPERATURE_CHECK";
+ public static final int DEFAULT_ALARM_ID = 98133;
public static void setAlarmTime(Context context, long timeInMillis, Intent intent) {
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- PendingIntent sender = PendingIntent.getBroadcast(context, intent.getIntExtra("id", 0),
+ PendingIntent sender = PendingIntent.getService(context, intent.getIntExtra("id", DEFAULT_ALARM_ID),
intent, PendingIntent.FLAG_CANCEL_CURRENT);
int interval = (int) intent.getLongExtra("intervalMillis", 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
String ACTION_HEART_RATE = "com.ic.sensor.data.action.HEART_RATE";
}
+ String ACTION_EX_INFO = "com.ic.action.EX_INFO";
+
interface Jx {
//虽然对方单词写错了,但是也不能改
//心率检测结果广播通知给laucnher
public static final String CMD_BOARD_TEM = "/sys/class/thermal/thermal_zone4/temp";
public static final String CMD_BOARD_TYPE = "/sys/class/thermal/thermal_zone4/type";
+ public static double getBoardTemperature() {
+ double boardTemp/*主板的温度*/ = 0.0f;
+ try {
+ String boardTempStr = TempFileUtils.readFile(CMD_BOARD_TEM);
+ boardTemp = Integer.parseInt(boardTempStr) / 1000.0f;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return boardTemp;
+ }
/**
* 这里获取到CPU温度,主板温度,体温,外温的数据,然后写到log里,后面转成数据表,再转成函数表达式。
*/
public static TemperatureItem doTempTest() throws AlgorithmUtils.TempValueException {
if (ICJniUtils.isTemperatureDevAvailable() > ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_NONE.ordinal()) {
- double bodyTemp/*体温*/ = 0.0f;
+ double wristTemp/*腕温*/ = 0.0f;
double cpuTemp/*cpu温度*/ = 0.0f;
double evnTemp/*环境温度*/ = 0.0f;
double gpuTemp/*gpu温度*/ = 0.0f;
//no crash is okay.
}
evnTemp = get_tempOut_value_origin();
- bodyTemp = get_temp_value_adjusted();
+ wristTemp = get_temp_value_adjusted();
String property = Utils.getSystemProperties("persist.sys.id_num", null);
double resultEnvTemp = -100;
- double resultBodyTemp = 0;
+ double resultWristTemp = 0;
ICLogger.d("property == > " + property);
double lastBodyTemp = 0.0;
if ("l004pt".equals(property)) {
- double bodyTempResult = AlgorithmUtils.l004Pt(bodyTemp, evnTemp);
+ double bodyTempResult = AlgorithmUtils.l004Pt(wristTemp, evnTemp);
ICLogger.d("bodyTempResult == > " + bodyTempResult);
//这个是换算后的腕温
- bodyTemp = bodyTempResult;
if (bodyTempResult != -1) {
//越接近34.1越准确
ICLogger.d("bodyTempResult == > " + bodyTempResult);
}
} else if ("q3ft".equals(property)) {
resultEnvTemp = AlgorithmUtils.s123GetEnvData(evnTemp, boardTemp);
- resultBodyTemp = AlgorithmUtils.s123GetBodyTemp(bodyTemp, boardTemp);
+ resultWristTemp = AlgorithmUtils.s123GetBodyTemp(wristTemp, boardTemp);
if (resultEnvTemp > 0.0f) {
- lastBodyTemp = TemperatureUtil.getBodyTemp(resultBodyTemp, resultEnvTemp);
+ lastBodyTemp = TemperatureUtil.getBodyTemp(resultWristTemp, resultEnvTemp);
} else {
- lastBodyTemp = TemperatureUtil.getBodyTemp(resultBodyTemp, 26.0f);
+ lastBodyTemp = TemperatureUtil.getBodyTemp(resultWristTemp, 26.0f);
}
IcLog.d(TAG, "evnTemp == > " + evnTemp + " resultEnvTemp = > " + resultEnvTemp);
- IcLog.d(TAG, "bodyTemp == > " + bodyTemp + " resultBodyTemp = > " + lastBodyTemp);
+ IcLog.d(TAG, "bodyTemp == > " + wristTemp + " resultWristTemp = > " + lastBodyTemp);
} else if ("L56A".equals(property)) {
- double bodyTempResult = AlgorithmUtils.l56A(bodyTemp, evnTemp);
- bodyTemp = bodyTempResult;
+ double bodyTempResult = AlgorithmUtils.l56A(wristTemp, evnTemp);
+ wristTemp = bodyTempResult;
ICLogger.d("bodyTempResult == > " + bodyTempResult);
if (bodyTempResult != -1) {
//越接近34.1越准确
ICLogger.d("final wrist temp == > " + bodyTempResult);
}
} else if ("MW13C".equals(property)) {
- bodyTemp = AlgorithmUtils.getInstance(WorkServiceApp.sContext).MW13C(bodyTemp, boardTemp);
- if (bodyTemp == 0) {
+ wristTemp = AlgorithmUtils.getInstance(WorkServiceApp.sContext).MW13C(wristTemp, boardTemp);
+ if (wristTemp == 0) {
return null;
}
- lastBodyTemp = getBodyTemp(bodyTemp, 26.1f);
+ lastBodyTemp = getBodyTemp(wristTemp, 26.1f);
} else {
// double bodyTempResult = AlgorithmUtils.l004Pt(bodyTemp, evnTemp);
- ICLogger.d("wrist TempResult == > " + bodyTemp);
- if (bodyTemp != -1) {
+ ICLogger.d("wrist TempResult == > " + wristTemp);
+ if (wristTemp != -1) {
//越接近34.1越准确
- lastBodyTemp = getBodyTemp(bodyTemp, 26.1f);
+ lastBodyTemp = getBodyTemp(wristTemp, 26.1f);
ICLogger.d("final body temp == > " + lastBodyTemp);
}
}
try {
//发送消息给launcher显示
TemperatureItem temperatureItem = new TemperatureItem(
- String.format("%.01f", bodyTemp),
+ String.format("%.01f", resultWristTemp),
String.format("%.01f", lastBodyTemp),
String.format("%.01f", cpuTemp),
String.format("%.01f", resultEnvTemp),