release V37
authorsnickersun <scy@incartech.cn>
Mon, 10 Aug 2020 11:59:53 +0000 (19:59 +0800)
committersnickersun <scy@incartech.cn>
Mon, 10 Aug 2020 11:59:53 +0000 (19:59 +0800)
1、添加 测量体温窗口
2、添加通过customname 判断H88和Q3F
3、更新最新的 ICJniUtils 接口,支持IC66,IC68等新模块
4、修改温度校准窗口逻辑。支持EM7068 温度校准

15 files changed:
app/release/FactoryMode_V37_202008101956_release.apk [new file with mode: 0644]
app/release/output.json
app/src/main/AndroidManifest.xml
app/src/main/java/com/ic/jni/ICJniUtils.java
app/src/main/java/mobile/miki/HeartRate.java
app/src/main/java/mobile/miki/TemperatureActivity.java [new file with mode: 0644]
app/src/main/java/mobile/miki/TemperatureAdjustActivity.java
app/src/main/java/mobile/miki/mainui/TestMainActivity.java
app/src/main/java/mobile/miki/util/Config.java
app/src/main/java/mobile/miki/util/FTUtils.java
app/src/main/res/layout/heartrate_layout.xml
app/src/main/res/layout/temperature_layout.xml [new file with mode: 0644]
app/src/main/res/values-zh-rCN/strings.xml
app/src/main/res/values/strings.xml
app/version_code.properties

diff --git a/app/release/FactoryMode_V37_202008101956_release.apk b/app/release/FactoryMode_V37_202008101956_release.apk
new file mode 100644 (file)
index 0000000..aacb520
Binary files /dev/null and b/app/release/FactoryMode_V37_202008101956_release.apk differ
index a1793c7..30e78aa 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":28,"versionName":"202006261247","enabled":true,"outputFile":"FactoryMode_V28_202006261247_release.apk","fullName":"release","baseName":"release"},"path":"FactoryMode_V28_202006261247_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":37,"versionName":"202008101956","enabled":true,"outputFile":"FactoryMode_V37_202008101956_release.apk","fullName":"release","baseName":"release"},"path":"FactoryMode_V37_202008101956_release.apk","properties":{}}]
\ No newline at end of file
index f835c92..42c3937 100644 (file)
                 <action android:name="com.eqc.STARTTempAdjust" />
             </intent-filter>
         </activity>
+
+        <activity
+            android:name=".TemperatureActivity"
+            android:label="@string/temperature" />
         <activity
             android:name=".SimDetectActivity"
             android:label="@string/detectSim" />
index ca48df9..9062096 100644 (file)
@@ -2,6 +2,35 @@ package com.ic.jni;
 \r
 public class ICJniUtils {\r
 \r
+    public enum GSensorType\r
+    {\r
+        GSENSOR_TYPE_NONE,\r
+        GSENSOR_TYPE_QMA7981,\r
+        GSENSOR_TYPE_SC7A21,\r
+        GSENSOR_TYPE_MAX\r
+    };\r
+\r
+    public enum TempSensorType\r
+    {\r
+        TEMPSENSOR_TYPE_NONE,\r
+        TEMPSENSOR_TYPE_NST175,\r
+        TEMPSENSOR_TYPE_IC68,\r
+        TEMPSENSOR_TYPE_EM7068,\r
+        TEMPSENSOR_TYPE_MAX\r
+    };\r
+\r
+    public enum PPG_EGC_SensorType\r
+    {\r
+        PPG_EGC_TYPE_NONE,\r
+        PPG_EGC_TYPE_EM7028,\r
+        PPG_EGC_TYPE_EM7068,\r
+        PPG_EGC_TYPE_HRS3313,\r
+        PPG_EGC_TYPE_HRS3301,\r
+        PPG_EGC_TYPE_IC66,\r
+        PPG_EGC_TYPE_PAH8002,\r
+        PPG_EGC_TYPE_MAX\r
+    };\r
+\r
     public ICJniUtils(){\r
 \r
     }\r
@@ -12,75 +41,201 @@ public class ICJniUtils {
     }\r
 \r
     /***************计步控制************************************/\r
-    /*运行此函数清除 系统计步为0*/\r
+    /***\r
+     * 运行此函数清除 系统计步为0,一版在午夜执行\r
+     * @return\r
+     */\r
     public static native int resetStepCount();\r
 \r
-    /*获取当前步数*/\r
+    /***\r
+     * 获取当前步数\r
+     * @return\r
+     */\r
     public static native int getStepCount();\r
-    /*开启计步 不必判断返回值*/\r
+\r
+    /***\r
+     * 开启计步 不必判断返回值\r
+     * @return\r
+     */\r
     public static native int enablePedometer();\r
-    /*停止计步 不必判断返回值*/\r
+\r
+    /***\r
+     * 停止计步 不必判断返回值\r
+     * @return\r
+     */\r
     public static native int disablePedometer();\r
 \r
-    /*检测计步当前是否开启  1开启,0 关闭*/\r
+    /***\r
+     * 检测计步当前是否开启\r
+     * @return\r
+     * 1开启,0 关闭\r
+     */\r
     public static native int isPedometerEnabled();\r
 \r
-    /*保存当前步数(getStepCount取得的值)到磁盘 不必判断返回值*/\r
+    /***\r
+     * 获取当前计步器(GSensor)类型 GSensorType\r
+     * @return\r
+     * 不存在返回 GSENSOR_TYPE_NONE,否则返回Gsensor类型\r
+     * 理论上此设备必选,一定存在。\r
+     */\r
+    public static native int getGsensorType();\r
+\r
+    /*保存当前步数(getStepCount取得的值)到磁盘 不必判断返回值\r
+    * 为了兼容,已经不再使用\r
+    * */\r
     public static native int saveStepCount();\r
 \r
-    /*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加 不必判断返回值*/\r
+    /*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加 不必判断返回值\r
+    * * 为了兼容,已经不再使用\r
+    * */\r
     public static native int recoverStepCount();\r
 \r
-\r
     /******心率,血压****************************************/\r
-    /*检查 PPG硬件是否存在,返回 1 存在,0 不存在*/\r
+     /***\r
+     * 检查 PPG硬件是否存在,返回PPG_EGC_SensorType\r
+     * @return\r
+      * 返回PPG_EGC_TYPE_NONE代表不存在,否则返回 传感器类型\r
+     */\r
     public static native int isPPGavailable();\r
 \r
-    /*开启心率血压检测*/\r
+     /**\r
+      * 开启心率血压检测\r
+     * @return\r
+      */\r
     public static native int enablePPG();\r
 \r
-    /*停止心率血压检测*/\r
+    /***\r
+     * 停止心率血压检测\r
+     * @return\r
+     */\r
     public static native int disablePPG();\r
-    /*返回 心率值 每分钟跳动次数, 通过这个心率>0 判断是否已经有检测结果,\r
-    有就可以直接通过getHighBloodPressure 和 getLowBloodPressure 获取血压高压低压值*/\r
-    public static native int getPPG();\r
-    /* 返回PPG 运行状态, 0 停止, 1,运行中*/\r
+\r
+\r
+    /***\r
+     * 返回PPG 运行状态, 0 停止, 1,运行中\r
+     * @return\r
+     */\r
     public static native int isPPGStarted();\r
-    /*返回是否佩戴  0 未佩戴,1 佩戴*/\r
+\r
+    /***\r
+     * 返回 心率值 每分钟跳动次数, 通过这个心率>0 判断是否已经有检测结果,\r
+     * 有就可以直接通过getHighBloodPressure 和 getLowBloodPressure 获取血压高压低压值\r
+     * @return\r
+     */\r
+    public static native int getPPG();\r
+\r
+    /***\r
+     * 返回是否佩戴  0 未佩戴,1 佩戴 。\r
+     * 请注意,此数据必须在执行 getPPG() 后才有效,否则一直为上一次的值。\r
+     * @return\r
+     */\r
     public static native int isWeared();\r
 \r
-    /*获取血压高压值*/\r
+    /***\r
+     * 获取血压高压值\r
+     * 请注意,此数据必须在执行 getPPG() 后才有效,否则一直为上一次的值。\r
+     * @return\r
+     */\r
     public static native int getHighBloodPressure();\r
 \r
-    /*获取血压低压值*/\r
+    /***\r
+     * 获取血压低压值\r
+     * 请注意,此数据必须在执行 getPPG() 后才有效,否则一直为上一次的值。\r
+     * @return\r
+     */\r
     public static native int getLowBloodPressure();\r
 \r
-    /*获取血氧值*/\r
+      /***\r
+       * 获取血氧值\r
+     *  请注意,此数据必须在执行 getPPG() 后才有效,否则一直为上一次的值。\r
+     * @return\r
+       */\r
     public static native int getSPO2();\r
 \r
 \r
-    /*获取温度校准后= getTemperatureOrigin - adjustValue */\r
+    /***\r
+     * 开始温度检测,有些sensor不需要,为了兼容,请开始前执行一次,并且sleep 1秒钟\r
+     * @return\r
+     */\r
+    public static native  int enableTemperature();\r
+\r
+    /***\r
+     * 停止温度检测,有些sensor不需要,为了兼容请结束后还是要执行一次。\r
+     * @return  返回值<0 表示失败 =>0表示成功\r
+     */\r
+    public static native int disableTemperature();\r
+\r
+    /***\r
+     * 检查体温检测设备是否开启\r
+     * @return  返回0 未开启 1 开启\r
+     */\r
+    public static native int isTemperatureDevOpened();\r
+    /***\r
+     * 执行温度校准操作,一版在整机生产时的恒温箱中执行\r
+     * @param refTemp  恒温箱的温度\r
+     * @return 返回值<0 表示失败 =>0表示成功\r
+     */\r
+    public static native int doTempCalibration(double refTemp);\r
+\r
+    /***\r
+     *  获取温度 校准后数据 单位摄氏度\r
+     * @return 返回值<=0 表示失败 >0表示成功\r
+     */\r
     public static native double getTemperature();\r
 \r
-    /*获取温度校准前*/\r
-    public static native double getTemperatureOrigin();\r
-\r
-    /*设置校准参数*/\r
-    public static native int setTemperatureAdjustValue(double value);\r
-\r
-    /*设置校准参数*/\r
-    public static native double getTemperatureAdjustValue();\r
-\r
-    /*设置当前温度标志位,实际上就是按照二进制位来定义的。\r
-    0、可以测温\r
-    第一位为1,0x1、充电超过2分钟或者充电超过2分钟后拔除5分钟内    0001\r
-    第二位为1,0x2、亮屏超过5分钟或者亮屏超过5分钟后灭屏5分钟内    0010\r
-    第三位为1,0x4、通话超过2分钟或者通话超过2分钟后挂断5分钟内    0100\r
-    所有大于0的都不能测温 */\r
+    /***\r
+     * 设置当前温度标志位,\r
+     * @param flag\r
+     * 实际上就是按照二进制位来定义的。\r
+     *     0、可以测温\r
+     *     第一位为1,0x1、充电超过2分钟或者充电超过2分钟后拔除5分钟内    0001\r
+     *     第二位为1,0x2、亮屏超过5分钟或者亮屏超过5分钟后灭屏5分钟内    0010\r
+     *     第三位为1,0x4、通话超过2分钟或者通话超过2分钟后挂断5分钟内    0100\r
+     *     所有大于0的都不能测温\r
+     * 注:暂时未启用,预留\r
+     * @return\r
+     */\r
     public static native int setTemperatureValidFlag(int flag);\r
 \r
-    /*此操作仅仅为了检查标志状态设置成功与否,标志已经在内部被使用*/\r
+     /***\r
+      * 此操作仅仅为了检查标志状态设置成功与否,标志已经在内部被使用\r
+      * 注:暂时未启用,预留\r
+     * @return\r
+      */\r
     public static native int getTemperatureValidFlag();\r
 \r
+    /***\r
+     * 根据环境参考温度和腕温换算 体温\r
+     * ic66可以直接输出体温,不需要这个公式。\r
+     * @param wrist_temp\r
+     * 腕温\r
+     * @param ref_temp\r
+     * 室外参考温度\r
+     * @return 返回值<=0 表示失败 >0表示成功\r
+     */\r
+    public static native double getBodyTempFromWristTemp(double wrist_temp,double ref_temp);\r
+\r
+\r
+     /***\r
+      * 有体温检测功能则返回 TempSensorType\r
+      * TempSensor_NONE 就表示没有体温检测功能,否则返回温度传感器类型\r
+     * @return\r
+      */\r
+    public static native int isTemperatureDevAvailable();\r
+\r
+\r
+    /*获取温度校准前\r
+    * 为了兼容已经不用\r
+    * */\r
+    public static native double getTemperatureOrigin();\r
 \r
+    /*设置校准参数\r
+    *  * 为了兼容已经不用\r
+    * */\r
+    public static native int setTemperatureAdjustValue(double value);\r
+\r
+    /*设置校准参数\r
+    *  * 为了兼容已经不用\r
+    * */\r
+    public static native double getTemperatureAdjustValue();\r
 }\r
index fa3f559..e045f88 100644 (file)
@@ -1,6 +1,10 @@
 package mobile.miki;\r
 \r
 import android.content.Intent;\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
@@ -23,65 +27,83 @@ import mobile.miki.mainui.TestMainActivity;
 import mobile.miki.util.Config;\r
 import mobile.miki.util.Logger;\r
 \r
-public class HeartRate extends BaseActivity implements View.OnClickListener {\r
+public class HeartRate extends BaseActivity implements View.OnClickListener, SensorEventListener {\r
 \r
     private ButtonViewTwo buttonView;\r
     boolean running;\r
-\r
+    public static final int TYPE_HEART_RATE = 21;\r
     Timer mTimer=null;\r
 \r
     private TextView tv_isweared;\r
     private TextView tv_ppg;\r
-    private TextView tv_temperature;\r
+    private int hrsType;\r
+    private SensorManager mSensorManager=null;\r
+    private Sensor mHeartRate=null;\r
     @Override\r
     protected void onCreate(Bundle savedInstanceState) {\r
         super.onCreate(savedInstanceState);\r
         setContentView(R.layout.heartrate_layout);\r
         initView();\r
-        int heartrate = ICJniUtils.isPPGavailable();\r
-        Log.i("dxc", "heartrate available : " + heartrate);\r
-\r
-        mTimer=new Timer();\r
-        TimerTask HRTimerTask=new TimerTask() {\r
-            @Override\r
-            public void run() {\r
-                mhandler.sendEmptyMessage(0);\r
-            }\r
-        };\r
-        mTimer.schedule(HRTimerTask,0,1000L);\r
+        int hrsType = ICJniUtils.isPPGavailable();\r
+        Log.i("dxc", "heartrate available : " + hrsType);\r
+        if (hrsType == ICJniUtils.PPG_EGC_SensorType.PPG_EGC_TYPE_IC66.ordinal()) {\r
+\r
+            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);\r
+            mHeartRate = mSensorManager.getDefaultSensor(TYPE_HEART_RATE);\r
+            boolean ret = mSensorManager.registerListener(this, mHeartRate, SensorManager.SENSOR_DELAY_UI);\r
+            Log.i( "dxc","Heart Rate PPG_EGC_TYPE_IC66 opened ret :: " + ret);\r
+\r
+        } else {\r
+            mTimer = new Timer();\r
+            TimerTask HRTimerTask = new TimerTask() {\r
+                @Override\r
+                public void run() {\r
+                    mhandler.sendEmptyMessage(0);\r
+                }\r
+            };\r
+            mTimer.schedule(HRTimerTask, 0, 1000L);\r
+        }\r
     }\r
 \r
     Handler mhandler=new Handler(new Handler.Callback() {\r
         @Override\r
         public boolean handleMessage(Message message) {\r
 \r
-            if (ICJniUtils.isPPGStarted()==0){\r
-                ICJniUtils.enablePPG();\r
+            if(ICJniUtils.isPPGavailable()>0) {\r
+                  if (ICJniUtils.isPPGStarted()==0){\r
+                     ICJniUtils.enablePPG();\r
+\r
+                }\r
+                int ppg = ICJniUtils.getPPG();\r
+                int weared = ICJniUtils.isWeared();\r
+\r
+                String wearedstr = String.valueOf(weared);\r
+                String ppgstr = String.valueOf(ppg);\r
+\r
+                tv_isweared.setText(wearedstr);\r
+                tv_ppg.setText(ppgstr);\r
 \r
+                Log.d("dxc","Weared:" + wearedstr + " PPG:" + ppgstr );\r
+            }else{\r
+                tv_isweared.setText(HeartRate.this.getResources().getString(R.string.no_heartrate));\r
+                tv_ppg.setText("");\r
             }\r
-            int ppg=ICJniUtils.getPPG();\r
-            int weared=ICJniUtils.isWeared();\r
-            double temp=ICJniUtils.getTemperature();\r
-            double adjust=ICJniUtils.getTemperatureAdjustValue();\r
-            String wearedstr=String.valueOf(weared);\r
-            String ppgstr=String.valueOf(ppg);\r
-            String tempstr=String.format("%1$.2f",temp);\r
-            tempstr=tempstr+" ("+String.format("%1$.2f",adjust)+")";\r
-            tv_isweared.setText(wearedstr);\r
-            tv_ppg.setText(ppgstr);\r
-            tv_temperature.setText(tempstr);\r
-            Logger.d("Weared:"+wearedstr+" PPG:"+ppgstr+" Temperature:"+tempstr);\r
             return false;\r
         }\r
     });\r
     @Override\r
     protected void onDestroy() {\r
         super.onDestroy();\r
-        ICJniUtils.disablePPG();\r
-        if(mTimer!=null) {\r
-\r
-            mTimer.cancel();\r
-            mTimer=null;\r
+        if ( hrsType == ICJniUtils.PPG_EGC_SensorType.PPG_EGC_TYPE_IC66.ordinal()) {\r
+            mSensorManager.unregisterListener(this);\r
+            Log.i( "dxc","Heart Rate PPG_EGC_TYPE_IC66  closed");\r
+        }else if(hrsType>0) {\r
+\r
+            ICJniUtils.disablePPG();\r
+            if(mTimer!=null) {\r
+                mTimer.cancel();\r
+                mTimer=null;\r
+            }\r
         }\r
     }\r
 \r
@@ -96,7 +118,6 @@ public class HeartRate extends BaseActivity implements View.OnClickListener {
 \r
         tv_isweared=(TextView)findViewById(R.id.tv_weared_value);\r
         tv_ppg=(TextView)findViewById(R.id.tv_ppg_value);\r
-        tv_temperature=(TextView)findViewById(R.id.tv_temperature_value);\r
 \r
     }\r
 \r
@@ -114,8 +135,7 @@ public class HeartRate extends BaseActivity implements View.OnClickListener {
                 } else {\r
                     startActivity(intent);\r
                 }\r
-                PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("heartrate", "true")\r
-                        .commit();\r
+                PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("heartrate", "true").commit();\r
                 finish();\r
                 break;\r
             case R.id.btn_two_right:\r
@@ -124,10 +144,33 @@ public class HeartRate extends BaseActivity implements View.OnClickListener {
                 } else {\r
                     startActivity(intent);\r
                 }\r
-                PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("heartrate", "false")\r
-                        .commit();\r
+                PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("heartrate", "false").commit();\r
                 finish();\r
                 break;\r
         }\r
     }\r
+\r
+    @Override\r
+    public void onSensorChanged(SensorEvent sensorEvent) {\r
+        float values[]=sensorEvent.values;\r
+        int length = values.length;\r
+        Log.i( "dxc","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
+\r
+        int PPG = (int)values[0];//调用底层函数保证状态更新。\r
+        boolean isWared = ((int)values[4] == 2);\r
+        tv_isweared.setText(isWared?1:0);\r
+        tv_ppg.setText(PPG);\r
+        /*[0]---心率;[1]---血压高压;[2]---血压低压;[3]---血氧;[4]---佩戴检测(1--脱手,2--上手);*/\r
+    }\r
+\r
+    @Override\r
+    public void onAccuracyChanged(Sensor sensor, int i) {\r
+        Log.i("dxc","onAccuracyChanged() is called "+sensor.getName()+" accuracy="+i);\r
+    }\r
 }\r
diff --git a/app/src/main/java/mobile/miki/TemperatureActivity.java b/app/src/main/java/mobile/miki/TemperatureActivity.java
new file mode 100644 (file)
index 0000000..f8dda2d
--- /dev/null
@@ -0,0 +1,132 @@
+package mobile.miki;\r
+\r
+import android.content.Intent;\r
+import android.os.Bundle;\r
+import android.os.Handler;\r
+import android.os.Message;\r
+import android.preference.PreferenceManager;\r
+import android.util.Log;\r
+import android.view.View;\r
+import android.widget.TextView;\r
+\r
+import com.ic.jni.ICJniUtils;\r
+\r
+import java.util.Timer;\r
+import java.util.TimerTask;\r
+\r
+import mobile.miki.mainui.ButtonViewTwo;\r
+import mobile.miki.mainui.TestMainActivity;\r
+import mobile.miki.util.Config;\r
+import mobile.miki.util.Logger;\r
+\r
+public class TemperatureActivity extends BaseActivity implements View.OnClickListener {\r
+\r
+    private ButtonViewTwo buttonView;\r
+    boolean running;\r
+\r
+    Timer mTimer=null;\r
+\r
+    private TextView tv_temperature;\r
+    @Override\r
+    protected void onCreate(Bundle savedInstanceState) {\r
+        super.onCreate(savedInstanceState);\r
+        setContentView(R.layout.temperature_layout);\r
+        initView();\r
+        int temper = ICJniUtils.isTemperatureDevAvailable();\r
+        Log.i("dxc", "Temperature available : " + temper);\r
+\r
+        if (temper>0){\r
+            ICJniUtils.enableTemperature();\r
+            mTimer=new Timer();\r
+            TimerTask HRTimerTask=new TimerTask() {\r
+                @Override\r
+                public void run() {\r
+                    mhandler.sendEmptyMessage(0);\r
+                }\r
+            };\r
+            mTimer.schedule(HRTimerTask,500,1000L);\r
+\r
+        }else{\r
+            this.tv_temperature.setText(this.getResources().getString(R.string.no_temperature));\r
+            Log.i("dxc","No temperature!");\r
+        }\r
+    }\r
+\r
+    Handler mhandler=new Handler(new Handler.Callback() {\r
+        @Override\r
+        public boolean handleMessage(Message message) {\r
+\r
+\r
+            double temp=ICJniUtils.getTemperature();\r
+            //double adjust=ICJniUtils.getTemperatureAdjustValue();\r
+\r
+            String tempstr=String.format("%1$.2f",temp);\r
+          //  tempstr=tempstr+" ("+String.format("%1$.2f",adjust)+")";\r
+\r
+            tv_temperature.setText(tempstr);\r
+            Logger.d("Temperature:"+tempstr);\r
+            return false;\r
+        }\r
+    });\r
+    @Override\r
+    protected void onDestroy() {\r
+        super.onDestroy();\r
+       // ICJniUtils.disablePPG();\r
+\r
+        int temper = ICJniUtils.isTemperatureDevAvailable();\r
+        Log.i("dxc", "Temperature available : " + temper);\r
+\r
+        if (temper>0) {\r
+            if(mTimer!=null) {\r
+\r
+                mTimer.cancel();\r
+                mTimer=null;\r
+            }\r
+            ICJniUtils.disableTemperature();\r
+        }else{\r
+            Log.i("dxc","No temperature!");\r
+        }\r
+\r
+    }\r
+\r
+\r
+\r
+    private void initView() {\r
+        buttonView = (ButtonViewTwo) findViewById(R.id.btn_set);\r
+        buttonView.btn_left.setOnClickListener(this);\r
+        buttonView.btn_right.setOnClickListener(this);\r
+        buttonView.setSuccessColor();\r
+        buttonView.btn_left.setClickable(true);\r
+        tv_temperature=(TextView)findViewById(R.id.tv_temperature_value);\r
+\r
+    }\r
+\r
+    @Override\r
+    public void onClick(View view) {\r
+        Intent intent =  Config.getNextTestIntent(this,this.getClass());//new Intent(this, SimDetectActivity.class);\r
+        intent.putExtra("running", true);\r
+        Intent intent1 = new Intent(this, TestMainActivity.class);\r
+        // TestResult testResult = (TestResult) getApplicationContext();\r
+        switch (view.getId()) {\r
+\r
+            case R.id.btn_two_left:\r
+                if (!running) {\r
+                    startActivity(intent1);\r
+                } else {\r
+                    startActivity(intent);\r
+                }\r
+                PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("temperature", "true").commit();\r
+                finish();\r
+                break;\r
+            case R.id.btn_two_right:\r
+                if (!running) {\r
+                    startActivity(intent1);\r
+                } else {\r
+                    startActivity(intent);\r
+                }\r
+                PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("temperature", "false").commit();\r
+                finish();\r
+                break;\r
+        }\r
+    }\r
+}\r
index de21e1d..0a01d0c 100644 (file)
@@ -1,5 +1,6 @@
 package mobile.miki;\r
 \r
+import android.app.Activity;\r
 import android.content.Context;\r
 import android.content.Intent;\r
 import android.hardware.Sensor;\r
@@ -22,14 +23,20 @@ import java.io.FileOutputStream;
 import java.io.IOException;\r
 import java.util.Timer;\r
 import java.util.TimerTask;\r
+import java.util.concurrent.TimeUnit;\r
 \r
 import mobile.miki.mainui.ButtonViewTwo;\r
 import mobile.miki.mainui.TestMainActivity;\r
 import mobile.miki.mainui.TestMainList;\r
 import mobile.miki.util.Config;\r
 import mobile.miki.util.Logger;\r
+import rx.Observable;\r
+import rx.functions.Action1;\r
 \r
-public class TemperatureAdjustActivity extends BaseActivity implements View.OnClickListener {\r
+import static android.os.PowerManager.ACQUIRE_CAUSES_WAKEUP;\r
+import static android.os.PowerManager.SCREEN_DIM_WAKE_LOCK;\r
+\r
+public class TemperatureAdjustActivity extends Activity implements View.OnClickListener {\r
 \r
     private ButtonViewTwo buttonView;\r
     boolean running;\r
@@ -48,15 +55,20 @@ public class TemperatureAdjustActivity extends BaseActivity implements View.OnCl
         setContentView(R.layout.temperature_adjust_layout);\r
         initView();\r
 \r
-        timestamp_start=System.currentTimeMillis();\r
-        mTestTimer=new Timer();\r
-        TimerTask HRTimerTask=new TimerTask() {\r
-            @Override\r
-            public void run() {\r
-                mhandler.sendEmptyMessage(0);\r
-            }\r
-        };\r
-        mTestTimer.schedule(HRTimerTask,0,1000L);\r
+        if (ICJniUtils.isTemperatureDevAvailable()>0) {\r
+            ICJniUtils.enableTemperature();\r
+            timestamp_start = System.currentTimeMillis();\r
+            mTestTimer = new Timer();\r
+            TimerTask HRTimerTask = new TimerTask() {\r
+                @Override\r
+                public void run() {\r
+                    mhandler.sendEmptyMessage(0);\r
+                }\r
+            };\r
+            mTestTimer.schedule(HRTimerTask, 500, 1000L);\r
+        }else{\r
+            Log.i("dxc","");\r
+        }\r
         //startSensor();\r
     }\r
 \r
@@ -69,7 +81,7 @@ public class TemperatureAdjustActivity extends BaseActivity implements View.OnCl
         Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);\r
 \r
         if (mSensorManager == null || mSensor == null) {\r
-            Log.d("近距离","设备不支持1");\r
+            Log.d("dxc","近距离 设备不支持1");\r
            return;\r
            //throw new UnsupportedOperationException("设备不支持");\r
         }\r
@@ -77,7 +89,7 @@ public class TemperatureAdjustActivity extends BaseActivity implements View.OnCl
         boolean isRegister = mSensorManager.registerListener(mSensorEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);\r
         if (!isRegister) {\r
             //throw new UnsupportedOperationException("设备不支持");\r
-            Log.d("近距离","设备不支持2");\r
+            Log.d("dxc","近距离 设备不支持2");\r
             return ;\r
         }\r
     }\r
@@ -86,7 +98,7 @@ public class TemperatureAdjustActivity extends BaseActivity implements View.OnCl
         @Override\r
         public void onSensorChanged(SensorEvent sensorEvent) {\r
             float proximity=sensorEvent.values[0];\r
-            Log.d("近距离", String.valueOf(proximity));\r
+            Log.d("dxc", "近距离 "+String.valueOf(proximity));\r
         }\r
 \r
         @Override\r
@@ -101,12 +113,10 @@ public class TemperatureAdjustActivity extends BaseActivity implements View.OnCl
     @Override\r
     protected  void onResume() {\r
         super.onResume();\r
-        if (screenOnWakelock==null)\r
-            screenOnWakelock = getScreenOnWakeLock(this,TemperatureAdjustActivity.class.getSimpleName());\r
 \r
     }\r
     public static PowerManager.WakeLock getScreenOnWakeLock(Context context, String tag) {\r
-        PowerManager.WakeLock wakeLock = ((PowerManager)(context.getSystemService(Context.POWER_SERVICE))).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, tag);\r
+        final PowerManager.WakeLock wakeLock = ((PowerManager)context.getSystemService(Context.POWER_SERVICE)).newWakeLock(ACQUIRE_CAUSES_WAKEUP| SCREEN_DIM_WAKE_LOCK, TemperatureAdjustActivity.class.getSimpleName());\r
         wakeLock.acquire();\r
         return wakeLock;\r
     }\r
@@ -125,22 +135,28 @@ public class TemperatureAdjustActivity extends BaseActivity implements View.OnCl
     Handler mhandler=new Handler(new Handler.Callback() {\r
         @Override\r
         public boolean handleMessage(Message message) {\r
-            double temp = ICJniUtils.getTemperatureOrigin();\r
+            double temp = ICJniUtils.getTemperature();\r
             String tempstr = String.format("%1$.2f", temp);\r
             tv_temperature.setText(tempstr);\r
-            Logger.d("Temperature:" + tempstr);\r
+            Log.d("dxc","Temperature:" + tempstr);\r
             String header = "体温校准开始,请放置在37摄氏度恒温箱中。剩余 ";\r
             String tail = "秒。。。";\r
             long time_cost = (System.currentTimeMillis() - timestamp_start) / 1000;\r
             adjust_start_seconds_left = (adjust_timeout_time - time_cost);\r
             if (adjust_start_seconds_left == 0) {\r
 \r
-                tv_mesg.setText("体温校准完毕,偏差数据"+String.format("%1$.2f",(avg_temp-37.0f))+"摄氏度!");\r
+                int ret= ICJniUtils.doTempCalibration(37.0f);\r
+                tv_mesg.setText("体温校准完毕,偏差数据"+String.format("%1$.2f",(avg_temp-37.0f))+"摄氏度!ret "+ret);\r
+\r
                 if(mTestTimer!=null) {\r
                     mTestTimer.cancel();\r
                     mTestTimer=null;\r
                 }\r
 \r
+                //检测完毕亮屏查看结果。\r
+                if (screenOnWakelock==null)\r
+                    screenOnWakelock = getScreenOnWakeLock(TemperatureAdjustActivity.this,TemperatureAdjustActivity.class.getSimpleName());\r
+\r
             }else{\r
 \r
                 if(adjust_start_seconds_left <=5 && adjust_start_seconds_left > 0) {\r
@@ -167,7 +183,6 @@ public class TemperatureAdjustActivity extends BaseActivity implements View.OnCl
     }\r
 \r
 \r
-\r
     private void initView() {\r
         buttonView = (ButtonViewTwo) findViewById(R.id.btn_set);\r
         buttonView.btn_left.setOnClickListener(this);\r
index bd11340..e6deeb2 100644 (file)
@@ -18,6 +18,7 @@ import android.widget.TextView;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
 import mobile.miki.BaseActivity;
 import mobile.miki.BatteryTestActivity;
index 803ea67..998d415 100644 (file)
@@ -24,6 +24,7 @@ import mobile.miki.R;
 import mobile.miki.RingtoneActivity;\r
 import mobile.miki.SimDetectActivity;\r
 import mobile.miki.SystemMemory;\r
+import mobile.miki.TemperatureActivity;\r
 import mobile.miki.TouchTest;\r
 import mobile.miki.UltravioletMonitorActivity;\r
 import mobile.miki.VersionActivity;\r
@@ -139,6 +140,8 @@ public class Config {
             return context.getResources().getString(R.string.dsp);\r
         }else if (ClassName.equals(HeartRate.class.getSimpleName())){\r
             return context.getResources().getString(R.string.heartrate);\r
+        }else if (ClassName.equals(TemperatureActivity.class.getSimpleName())){\r
+            return context.getResources().getString(R.string.temperature);\r
         }else {\r
 \r
             return null;\r
@@ -190,6 +193,8 @@ public class Config {
             intent = new Intent(context, DSPActivity.class);\r
         }else if (testItemName.equals(context.getResources().getString(R.string.heartrate))) {\r
             intent = new Intent(context, HeartRate.class);\r
+        }else if (testItemName.equals(context.getResources().getString(R.string.temperature))) {\r
+            intent = new Intent(context, TemperatureActivity.class);\r
         }\r
 \r
         if (intent != null) {\r
@@ -279,9 +284,11 @@ public class Config {
 \r
             //list.add(context.getString(R.string.test_keypad));\r
             list.add(context.getString(R.string.heartrate));\r
+            list.add(context.getString(R.string.temperature));\r
             list.remove(context.getString(R.string.camera));\r
             //testResultList.add("keys");\r
             testResultList.add("heartrate");\r
+            testResultList.add("temperature");\r
             testResultList.remove("camera");\r
         }\r
         stateArr = new String[testResultList.size()];\r
index 1d4fd3a..416c9d4 100644 (file)
@@ -200,14 +200,14 @@ public class FTUtils {
 \r
     public static  boolean isQ3F(){\r
 \r
-        if (getMODEL().contains("C41-QL02")||getMODEL().contains("C41S-QL02")|| SystemProperties.get("ro.product.isQ3F","").equalsIgnoreCase("true")) {\r
+        if (getMODEL().contains("C41-QL02")||getMODEL().contains("C41S-QL02")|| SystemProperties.get("ro.product.isQ3F","").equalsIgnoreCase("true") || SystemProperties.get("persist.sys.id_num","").equalsIgnoreCase("q3f")) {\r
             return true;\r
         }\r
         return false;\r
     }\r
     public static  boolean isH88(){\r
 \r
-        if (getMODEL().contains("H88")||SystemProperties.get("ro.product.isH88","").equalsIgnoreCase("true")) {\r
+        if (getMODEL().contains("H88")||SystemProperties.get("ro.product.isH88","").equalsIgnoreCase("true")  || SystemProperties.get("persist.sys.id_num","").equalsIgnoreCase("H88") ) {\r
             return true;\r
         }\r
         return false;\r
index 330b159..6ed4ef9 100644 (file)
@@ -17,7 +17,7 @@
                 android:id="@+id/tv_isweared"\r
                 android:layout_width="wrap_content"\r
                 android:layout_height="wrap_content"\r
-                android:text="佩戴    "\r
+                android:text="@string/isWeared"\r
                 android:textSize="36sp" />\r
 \r
             <TextView\r
@@ -37,7 +37,7 @@
                 android:id="@+id/tv_ppg"\r
                 android:layout_width="wrap_content"\r
                 android:layout_height="wrap_content"\r
-                android:text="心率    "\r
+                android:text="@string/heartrate"\r
                 android:textSize="36sp" />\r
 \r
             <TextView\r
                 android:textSize="36sp" />\r
         </LinearLayout>\r
 \r
-        <LinearLayout\r
-            android:layout_width="match_parent"\r
-            android:layout_height="match_parent"\r
-            android:orientation="horizontal">\r
-\r
-            <TextView\r
-                android:id="@+id/tv_temperature"\r
-                android:layout_width="wrap_content"\r
-                android:layout_height="wrap_content"\r
-                android:text="体温    "\r
-                android:textSize="36sp" />\r
-\r
-            <TextView\r
-                android:id="@+id/tv_temperature_value"\r
-                android:layout_width="wrap_content"\r
-                android:layout_height="wrap_content"\r
-                android:text="0"\r
-                android:textSize="36sp" />\r
-        </LinearLayout>\r
-\r
     </LinearLayout>\r
 \r
     <mobile.miki.mainui.ButtonViewTwo\r
diff --git a/app/src/main/res/layout/temperature_layout.xml b/app/src/main/res/layout/temperature_layout.xml
new file mode 100644 (file)
index 0000000..7cda26f
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
+    android:orientation="vertical" android:layout_width="match_parent"\r
+    android:layout_height="match_parent">\r
+\r
+    <LinearLayout\r
+        android:layout_width="match_parent"\r
+        android:layout_height="wrap_content"\r
+        android:orientation="vertical">\r
+\r
+        <LinearLayout\r
+            android:layout_width="match_parent"\r
+            android:layout_height="match_parent"\r
+            android:orientation="horizontal">\r
+\r
+            <TextView\r
+                android:id="@+id/tv_temperature"\r
+                android:layout_width="wrap_content"\r
+                android:layout_height="wrap_content"\r
+                android:text="@string/temperature"\r
+                android:textSize="36sp" />\r
+\r
+            <TextView\r
+                android:id="@+id/textView9"\r
+                android:layout_width="wrap_content"\r
+                android:layout_height="wrap_content"\r
+                android:layout_weight="1"\r
+                android:text=":" />\r
+\r
+            <TextView\r
+                android:id="@+id/tv_temperature_value"\r
+                android:layout_width="wrap_content"\r
+                android:layout_height="wrap_content"\r
+                android:text="0"\r
+                android:textSize="36sp" />\r
+        </LinearLayout>\r
+\r
+    </LinearLayout>\r
+\r
+    <mobile.miki.mainui.ButtonViewTwo\r
+        android:id="@+id/btn_set"\r
+        android:layout_width="match_parent"\r
+        android:layout_height="wrap_content"\r
+        android:layout_alignParentBottom="true"\r
+        android:layout_centerHorizontal="true" >\r
+    </mobile.miki.mainui.ButtonViewTwo>\r
+\r
+</RelativeLayout>
\ No newline at end of file
index 0db5db3..8f87ad1 100644 (file)
     <string name="more">更多设置</string>\r
     <string name="unbound">解绑</string>\r
     <string name="tempAdjust">温度校准</string>\r
+    <string name="temperature">温度测试</string>\r
+    <string name="no_temperature">没发现测温设备!</string>\r
 \r
     <string name="startRecord">开始录音</string>\r
     <string name="stopRecord">结束录音</string>\r
     <string name="bluethooth_mac_addaress">Bluetooth mac</string>\r
     <string name="barcode">barcode</string>\r
     <string name="flag_position">标志位检查</string>\r
+    <string name="isWeared">佩戴</string>\r
     <string name="heartrate">心率</string>\r
+\r
+    <string name="no_heartrate">无心率设备!</string>\r
+\r
     <!-- add end -->\r
 \r
 </resources>
\ No newline at end of file
index 5c74565..8567eb8 100644 (file)
     <string name="beiguang_new">Backlight</string>\r
     <string name="gps">GPS</string>\r
     <string name="tempAdjust">Temperature Adjust 温度校准</string>\r
+    <string name="temperature">Temperature</string>\r
+    <string name="no_temperature">No Temperature device found!</string>\r
+\r
     <string name="startRecord">Start recording</string>\r
     <string name="stopRecord">Stop recording</string>\r
     <string name="startPlay">Start playing</string>\r
     <string name="flag_position">标志位检查</string>\r
     <string name="dsp">DSP</string>\r
     <string name="change_camera">change</string>\r
+    <string name="isWeared">isWeared</string>\r
     <string name="heartrate">HeartRate</string>\r
+    <string name="no_heartrate">No HeartRate device found!</string>\r
+\r
     <string name="hall">hall</string>\r
 </resources>\r
index efd5a44..e534dad 100644 (file)
@@ -1,2 +1,2 @@
-#Tue Jul 28 05:58:09 CST 2020\r
-VERSION_CODE=33\r
+#Mon Aug 10 19:56:33 CST 2020\r
+VERSION_CODE=37\r