重新整理jni代码,区分为 ppg_ecg , temperature, stepcounter 三个模块
authorsnickersun <scy@incartech.cn>
Sat, 4 Jul 2020 03:12:30 +0000 (11:12 +0800)
committersnickersun <scy@incartech.cn>
Sat, 4 Jul 2020 03:12:30 +0000 (11:12 +0800)
增加 sc7a21 ,nst175 的接口。

17 files changed:
app/EQC_G5.jks [new file with mode: 0644]
app/build.gradle
app/src/main/AndroidManifest.xml
app/src/main/java/com/ic/jni/ICJniUtils.java
app/src/main/java/com/ic/jni/MainActivity.java
app/src/main/jni/Android.mk
app/src/main/jni/CMakeLists.txt
app/src/main/jni/jni_interface/com_ic_jni_ICJniUtils.h [moved from app/src/main/jni/jni_interface/com.ic.jni.ICJniUtils.h with 63% similarity]
app/src/main/jni/native-lib.c
app/src/main/jni/ppg_ecg_hal.c [new file with mode: 0644]
app/src/main/jni/stepcounter_hal.c [moved from app/src/main/jni/driverHal.c with 60% similarity]
app/src/main/jni/temperature_hal.c [new file with mode: 0644]
app/src/main/libs/arm64-v8a/libICJniUtils.so [deleted file]
app/src/main/libs/armeabi-v7a/libICJniUtils.so
app/src/main/libs/x86/libICJniUtils.so [deleted file]
app/src/main/libs/x86_64/libICJniUtils.so [deleted file]
app/src/main/res/layout/activity_main.xml

diff --git a/app/EQC_G5.jks b/app/EQC_G5.jks
new file mode 100644 (file)
index 0000000..2229d46
Binary files /dev/null and b/app/EQC_G5.jks differ
index b2f0b48..c1ebbc7 100644 (file)
@@ -17,11 +17,26 @@ android {
         }\r
         ndk{\r
 \r
+            //ldLibs "log", "z", "m"\r
             moduleName"ICJniUtils"       //生成的so文件名字,调用C程序的代码中会用到该名字\r
             abiFilters 'armeabi-v7a' //, 'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'\r
         }\r
 \r
     }\r
+    signingConfigs {\r
+        key {\r
+            storeFile file("EQC_G5.jks")\r
+            storePassword "123456"\r
+            keyAlias "watch_g5"\r
+            keyPassword "123456"\r
+        }\r
+        debug {\r
+            storeFile file('EQC_G5.jks')\r
+            storePassword '123456'\r
+            keyAlias = 'watch_g5'\r
+            keyPassword '123456'\r
+        }\r
+    }\r
     packagingOptions {\r
         pickFirst 'META-INF/*'\r
     }\r
@@ -37,10 +52,10 @@ android {
             version "3.10.2"\r
         }\r
     }\r
-//    sourceSets.main {\r
+  //  sourceSets.main {\r
 //        jniLibs.srcDir 'src/main/libs'\r
-//        jni.srcDirs = [] //disable automatic ndk-build call\r
-//    }\r
+  //      jni.srcDirs = [] //disable automatic ndk-build call\r
+  //  }\r
 }\r
 \r
 dependencies {\r
index 85a6079..2182b78 100644 (file)
@@ -1,6 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>\r
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"\r
-    package="com.ic.jni">\r
+    package="com.ic.jni"\r
+    android:allowBackup="true"\r
+    android:persistent="true"\r
+    android:screenOrientation="portrait"\r
+    android:sharedUserId="android.uid.system">\r
 \r
     <application\r
         android:allowBackup="true"\r
index 997d234..338a64c 100644 (file)
@@ -57,4 +57,32 @@ public class ICJniUtils {
 \r
     /*获取血氧值*/\r
     public static native int getSPO2();\r
+\r
+\r
+    /*获取温度校准后= getTemperatureOrigin - adjustValue */\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
+    public static native int setTemperatureValidFlag(int flag);\r
+\r
+    /*此操作仅仅为了检查标志状态设置成功与否,标志已经在内部被使用*/\r
+    public static native int getTemperatureValidFlag();\r
+\r
+    /*根据环境参考温度和腕温换算 体温*/\r
+    public static native double getBodyTempFromWristTemp(double wrist_temp,double ref_temp);\r
+\r
 }\r
index 17c1fbc..f0f944f 100644 (file)
@@ -40,6 +40,9 @@ public class MainActivity extends AppCompatActivity {
                     .append(" getLowBloodPressure ").append(ICJniUtils.getLowBloodPressure())\r
                     .append(" getSPO2 ").append(ICJniUtils.getSPO2())\r
                     .append(" StepCount ").append(ICJniUtils.getStepCount())\r
+                    .append(" getTemp ").append(ICJniUtils.getTemperature())\r
+                    .append(" getTempOrigin ").append(ICJniUtils.getTemperatureOrigin())\r
+                    .append(" getBodayTemp ").append(ICJniUtils.getBodyTempFromWristTemp(35.0f,23.0f))\r
                     .toString();\r
             tv.setText(txt);\r
             return false;\r
@@ -115,14 +118,17 @@ public class MainActivity extends AppCompatActivity {
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\r
                 if (isChecked){\r
 \r
-//                    ICJniUtils.enablePPG();\r
-//                    ICJniUtils.enablePedometer();\r
-\r
+                    ICJniUtils.enablePPG();\r
+                    ICJniUtils.enablePedometer();\r
+                    ICJniUtils.setTemperatureAdjustValue(0.03f);\r
+                    ICJniUtils.setTemperatureValidFlag(0);\r
                 }else{\r
 \r
-                    SendBroadcast();\r
+                    //SendBroadcast();\r
                     ICJniUtils.disablePPG();\r
                     ICJniUtils.disablePedometer();\r
+                    ICJniUtils.setTemperatureAdjustValue(0.5f);\r
+                    ICJniUtils.setTemperatureValidFlag(0x1|0x4);\r
                 }\r
             }\r
         });\r
index 4cc6225..52f9820 100644 (file)
@@ -1,8 +1,11 @@
 LOCAL_PATH :=$(call my-dir)\r
 include $(CLEAR_VARS)\r
-LOCAL_MODULE :=ICJniUtils\r
-LOCAL_SRC_FILES := \\r
-                native-lib.c \\r
-                driverHal.c\r
-\r
+LOCAL_MODULE := libICJniUtils\r
+#LOCAL_ALLOW_UNDEFINED_SYMBOLS := true\r
+LOCAL_SRC_FILES :=  ppg_ecg_hal.c stepcounter_hal.c native-lib.c temperature_hal.c\r
+LOCAL_MODULE_TAGS := optional\r
+LOCAL_SHARED_LIBRARIES := liblog\r
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include $(LOCAL_PATH)/kernel-headers\r
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include $(LOCAL_PATH)/kernel-headers\r
+#LOCAL_CFLAGS := -Werror\r
 include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file
index fd5cc23..5f13615 100644 (file)
@@ -9,6 +9,7 @@ cmake_minimum_required(VERSION 3.4.1)
 # or SHARED, and provides the relative paths to its source code.\r
 # You can define multiple libraries, and CMake builds them for you.\r
 # Gradle automatically packages shared libraries with your APK.\r
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libs/${ANDROID_ABI})\r
 \r
 add_library( # Sets the name of the library.\r
         ICJniUtils\r
@@ -18,7 +19,9 @@ add_library( # Sets the name of the library.
 \r
         # Provides a relative path to your source file(s).\r
         native-lib.c\r
-        driverHal.c)\r
+        ppg_ecg_hal.c\r
+        stepcounter_hal.c\r
+        temperature_hal.c)\r
 \r
 # Searches for a specified prebuilt library and stores the path as a\r
 # variable. Because CMake includes system libraries in the search path by\r
@@ -81,10 +81,10 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePPG
 \r
 /*\r
  * Class:     com_ic_jni_ICJniUtils\r
- * Method:    disalePPG\r
+ * Method:    disablePPG\r
  * Signature: ()I\r
  */\r
-JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disalePPG\r
+JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePPG\r
   (JNIEnv *, jclass);\r
 \r
 /*\r
@@ -135,6 +135,62 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getLowBloodPressure
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getSPO2\r
   (JNIEnv *, jclass);\r
 \r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getTemperature\r
+ * Signature: ()D\r
+ */\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperature\r
+  (JNIEnv *, jclass);\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getTemperatureOrigin\r
+ * Signature: ()D\r
+ */\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureOrigin\r
+  (JNIEnv *, jclass);\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    setTemperatureAdjustValue\r
+ * Signature: (D)I\r
+ */\r
+JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_setTemperatureAdjustValue\r
+  (JNIEnv *, jclass, jdouble);\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getTemperatureAdjustValue\r
+ * Signature: ()D\r
+ */\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureAdjustValue\r
+  (JNIEnv *, jclass);\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    setTemperatureValidFlag\r
+ * Signature: (I)I\r
+ */\r
+JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_setTemperatureValidFlag\r
+  (JNIEnv *, jclass, jint);\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getTemperatureValidFlag\r
+ * Signature: ()I\r
+ */\r
+JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureValidFlag\r
+  (JNIEnv *, jclass);\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getBodyTempFromWristTemp\r
+ * Signature: (DD)D\r
+ */\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getBodyTempFromWristTemp\r
+  (JNIEnv *, jclass, jdouble, jdouble);\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 94b41ba..916c824 100644 (file)
@@ -1,7 +1,7 @@
 #include <jni.h>\r
 //#include <string>\r
 \r
-#include "jni_interface/com.ic.jni.ICJniUtils.h"\r
+#include "jni_interface/com_ic_jni_ICJniUtils.h"\r
 //extern "C" JNIEXPORT jstring JNICALL\r
 //Java_com_ic_protocol_MainActivity_stringFromJNI(\r
 //        JNIEnv *env,\r
 //    return env->NewStringUTF(hello.c_str());\r
 //}\r
 //\r
+\r
+\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
 \r
-\r
 #define SENSOR_UNKNOWN 0\r
 #define SENSOR_QMA6981 1\r
 #define SENSOR_SC7A21 2\r
@@ -22,68 +23,71 @@ extern "C" {
 /***************计步控制************************************/\r
 /*运行此函数清除 系统计步为0*/\r
 //public static native int resetStepCount();\r
-int qmax981_clearStepCount();\r
+int resetStepCount();\r
 /*获取当前步数*/\r
 //public static native int getStepCount();\r
-int qmax981_getStepCount();\r
+int getStepCount();\r
 /*开启计步*/\r
 //public static native int enablePedometer();\r
-int qmax981_enable();\r
+int enablePedometer();\r
 /*停止计步*/\r
 //public static native int disablePedometer();\r
-int qmax981_disable();\r
+int disablePedometer();\r
 /*检测计步当前是否开启  1开启,0 关闭*/\r
 //public static native int isPedometerEnabled();\r
-int qmax981_isStepCounterEnabled();\r
+int isPedometerEnabled();\r
 /*保存当前步数(getStepCount取得的值)到磁盘*/\r
 //public static native int saveStepCount();\r
-int qmax981_saveStepCount();\r
+int saveStepCount();\r
 /*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加*/\r
 //public static native int recoverStepCount();\r
-int qmax981_recoverStepCount();\r
-\r
-\r
-\r
-\r
-int sc7a21_isStepCounterEnabled();\r
-int sc7a21_DisableStepCount();\r
-int sc7a21_EnableStepCount();\r
-int sc7a21_clearStepCount();\r
-int sc7a21_getStepCount();\r
-int getSensorType();\r
+int recoverStepCount();\r
 \r
 \r
 /******心率,血压****************************************/\r
 /*检查 PPG硬件是否存在,返回 1 存在,0 不存在*/\r
 int isPPGavailable();\r
+\r
 /*开启心率血压检测*/\r
 int enablePPG();\r
+\r
 /*停止心率血压检测*/\r
 int disablePPG();\r
+\r
 /*返回 心率值 每分钟跳动次数, 通过这个心率>0 判断是否已经有检测结果,\r
 有就可以直接通过getHighBloodPressure 和 getLowBloodPressure 获取血压高压低压值*/\r
 int getPPG();\r
+\r
 /* 返回PPG 运行状态, 0 停止, 1,运行中*/\r
 int isPPGStarted();\r
+\r
 /*返回是否佩戴  0 未佩戴,1 佩戴*/\r
 int isWeared();\r
+\r
 /*获取血压高压值*/\r
 int getHighBloodPressure();\r
+\r
 /*获取血压低压值*/\r
 int getLowBloodPressure();\r
+\r
 /*获取血氧值*/\r
 int getSPO2();\r
 \r
+/******获取体温****************************************/\r
+/* 返回-2 如果不支持, -1 读取失败或者超出范围 */\r
+double getTemperature();\r
 \r
+double getTemperatureOrigin();\r
 \r
+int setTemperatureAdjustValue(double value);\r
 \r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
+double getTemperatureAdjustValue();\r
 \r
+int setTemperatureValidFlag(int flag);\r
 \r
+int getTemperatureValidFlag();\r
 \r
+double get_bodytemp_from_wristtemp(double wrist_temp, double env_temp);\r
 \r
 /*\r
  * Class:     com_ic_jni_ICJniUtils\r
@@ -91,21 +95,9 @@ int getSPO2();
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_resetStepCount\r
-        (JNIEnv *env, jclass jobj){\r
-    int sensorType;\r
-    int ret=0;\r
-    sensorType=getSensorType();\r
-    switch(sensorType) {\r
-        case SENSOR_QMA6981:\r
-            ret= qmax981_clearStepCount();\r
-            break;\r
-        case SENSOR_SC7A21:\r
-            ret= sc7a21_clearStepCount();\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-    return ret;\r
+        (JNIEnv *env, jclass jobj) {\r
+\r
+    return resetStepCount();\r
 }\r
 \r
 /*\r
@@ -114,21 +106,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_resetStepCount
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getStepCount\r
-        (JNIEnv *env, jclass jobj){\r
-    int sensorType;\r
-    int ret=0;\r
-    sensorType=getSensorType();\r
-    switch(sensorType) {\r
-        case SENSOR_QMA6981:\r
-            ret= qmax981_getStepCount();\r
-            break;\r
-        case SENSOR_SC7A21:\r
-            ret= sc7a21_getStepCount();\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-    return ret;\r
+        (JNIEnv *env, jclass jobj) {\r
+    return getStepCount();\r
 }\r
 \r
 /*\r
@@ -137,22 +116,9 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getStepCount
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePedometer\r
-        (JNIEnv *env, jclass jobj){\r
-\r
-    int sensorType;\r
-    int ret=0;\r
-    sensorType=getSensorType();\r
-    switch(sensorType) {\r
-        case SENSOR_QMA6981:\r
-            ret= qmax981_enable();\r
-            break;\r
-        case SENSOR_SC7A21:\r
-            ret= sc7a21_EnableStepCount();\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-    return ret;\r
+        (JNIEnv *env, jclass jobj) {\r
+\r
+    return enablePedometer();\r
 \r
 }\r
 \r
@@ -163,21 +129,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePedometer
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePedometer\r
-        (JNIEnv *env, jclass jobj){\r
-    int sensorType;\r
-    int ret=0;\r
-    sensorType=getSensorType();\r
-    switch(sensorType) {\r
-        case SENSOR_QMA6981:\r
-            ret= qmax981_disable();\r
-            break;\r
-        case SENSOR_SC7A21:\r
-            ret= sc7a21_DisableStepCount();\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-    return ret;\r
+        (JNIEnv *env, jclass jobj) {\r
+    return disablePedometer();\r
 }\r
 \r
 /*\r
@@ -186,21 +139,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePedometer
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPedometerEnabled\r
-        (JNIEnv *env, jclass jobj){\r
-    int sensorType;\r
-    int ret=0;\r
-    sensorType=getSensorType();\r
-    switch(sensorType) {\r
-        case SENSOR_QMA6981:\r
-            ret= qmax981_isStepCounterEnabled();\r
-            break;\r
-        case SENSOR_SC7A21:\r
-            ret= sc7a21_isStepCounterEnabled();\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-    return ret;\r
+        (JNIEnv *env, jclass jobj) {\r
+    return isPedometerEnabled();\r
 }\r
 \r
 /*\r
@@ -209,21 +149,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPedometerEnabled
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_saveStepCount\r
-        (JNIEnv *env, jclass jobj){\r
-    int sensorType;\r
-    int ret=0;\r
-    sensorType=getSensorType();\r
-    switch(sensorType) {\r
-        case SENSOR_QMA6981:\r
-            ret= qmax981_saveStepCount();\r
-            break;\r
-        case SENSOR_SC7A21:\r
-            ret= -1;\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-    return ret;\r
+        (JNIEnv *env, jclass jobj) {\r
+    return saveStepCount();\r
 \r
 }\r
 \r
@@ -233,21 +160,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_saveStepCount
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_recoverStepCount\r
-        (JNIEnv *env, jclass jobj){\r
-    int sensorType;\r
-    int ret=0;\r
-    sensorType=getSensorType();\r
-    switch(sensorType) {\r
-        case SENSOR_QMA6981:\r
-            ret= qmax981_recoverStepCount();\r
-            break;\r
-        case SENSOR_SC7A21:\r
-            ret= -1;\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-    return ret;\r
+        (JNIEnv *env, jclass jobj) {\r
+    return recoverStepCount();\r
 }\r
 \r
 \r
@@ -257,7 +171,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_recoverStepCount
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGavailable\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return isPPGavailable();\r
 }\r
 \r
@@ -267,7 +181,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGavailable
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePPG\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return enablePPG();\r
 }\r
 \r
@@ -277,7 +191,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePPG
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePPG\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return disablePPG();\r
 }\r
 \r
@@ -287,7 +201,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePPG
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getPPG\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return getPPG();\r
 }\r
 \r
@@ -297,7 +211,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getPPG
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGStarted\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return isPPGStarted();\r
 }\r
 \r
@@ -307,7 +221,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGStarted
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isWeared\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return isWeared();\r
 }\r
 \r
@@ -317,7 +231,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isWeared
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getHighBloodPressure\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return getHighBloodPressure();\r
 }\r
 \r
@@ -327,7 +241,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getHighBloodPressure
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getLowBloodPressure\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return getLowBloodPressure();\r
 }\r
 \r
@@ -337,6 +251,90 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getLowBloodPressure
  * Signature: ()I\r
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getSPO2\r
-        (JNIEnv *env, jclass jobj){\r
+        (JNIEnv *env, jclass jobj) {\r
     return getSPO2();\r
 }\r
+\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getTemperature\r
+ * Signature: ()I\r
+ */\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperature\r
+        (JNIEnv *env, jclass jobj) {\r
+\r
+\r
+    return getTemperature();\r
+\r
+}\r
+\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureOrigin\r
+        (JNIEnv *env, jclass jobj) {\r
+\r
+    return getTemperatureOrigin();\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    setTemperatureAdjustValue\r
+ * Signature: (D)I\r
+ */\r
+JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_setTemperatureAdjustValue\r
+        (JNIEnv *env, jclass jobj, jdouble value) {\r
+\r
+    return setTemperatureAdjustValue(value);\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getTemperatureAdjustValue\r
+ * Signature: ()D\r
+ */\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureAdjustValue\r
+        (JNIEnv *env, jclass jobj) {\r
+\r
+    return getTemperatureAdjustValue();\r
+\r
+}\r
+\r
+\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    setTemperatureValidFlag\r
+ * Signature: (I)I\r
+ */\r
+JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_setTemperatureValidFlag\r
+        (JNIEnv *env, jclass jobj, jint flag) {\r
+\r
+    return setTemperatureValidFlag(flag);\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getTemperatureValidFlag\r
+ * Signature: ()I\r
+ */\r
+JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureValidFlag\r
+        (JNIEnv *env, jclass jobj) {\r
+\r
+    return getTemperatureValidFlag();\r
+\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getBodyTempFromWristTemp\r
+ * Signature: (DD)D\r
+ */\r
+JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getBodyTempFromWristTemp\r
+        (JNIEnv *env, jclass jobj, jdouble wrist_temp, jdouble ref_temp){\r
+    return get_bodytemp_from_wristtemp(wrist_temp,26.0f);\r
+}\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
diff --git a/app/src/main/jni/ppg_ecg_hal.c b/app/src/main/jni/ppg_ecg_hal.c
new file mode 100644 (file)
index 0000000..562e661
--- /dev/null
@@ -0,0 +1,578 @@
+
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <linux/ioctl.h>
+#include <fcntl.h>
+
+#include "jni.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <assert.h>
+
+
+
+#include <sys/ioctl.h>
+#include <termios.h>
+
+#include <stdint.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <string.h>
+#include <linux/kd.h>
+#include <linux/vt.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include <math.h>
+#include <poll.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/select.h>
+
+#include <linux/input.h>
+
+#if 0
+#define  ANDROID_LOG_INFO    "/I"
+#define  ANDROID_LOG_ERROR    "/E"
+#define  ANDROID_LOG_DEBUG    "/D"
+
+#define  __android_log_print ;
+#endif
+
+//#define DEBUG_MODE
+#define NDK
+
+
+#define DEV_LOG_TAG "ICJniUtils"
+
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,DEV_LOG_TAG,__VA_ARGS__)
+#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,DEV_LOG_TAG,__VA_ARGS__)
+//#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,DEV_LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,DEV_LOG_TAG,__VA_ARGS__)
+//#define  LOGF(...)  __android_log_print(ANDROID_LOG_FTAL,DEV_LOG_TAG,__VA_ARGS__)
+
+
+#define __FUNCTION__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static int checkfile(char* filepath);
+static int write_file(char* filepath,char* buf,int len);
+static int read_file(char* filepath , char** buf, int buflen,int* len);
+static int wared,ppg,spo2,bph, bpl;
+int checkfile(char* filepath){
+    int fd;
+    fd=open(filepath,O_RDWR);
+    if (fd<0) return 0;
+    close(fd);
+    return 1;
+}
+
+static int write_file(char* filepath,char* buf,int len){
+    int fd=open(filepath,O_WRONLY);
+
+    if (fd<0) return -1;
+    int wlen=write(fd,buf,len);
+    close(fd);
+    return wlen;
+}
+
+static int read_file(char* filepath , char** buf, int buflen,int* len){
+    int fd;
+    fd=open(filepath,O_RDONLY);
+    if (fd<0) return -1;
+
+    *len=read(fd,*buf,buflen);
+    LOGD("The content is %s , len %d",* buf , *len);
+    close(fd);
+    return 0;
+}
+#define PPG_TYPE_UNKNOWN 0
+#define PPG_TYPE_EM7028 1
+#define PPG_TYPE_HRS33XX 2
+
+
+/******心率,血压****************************************/
+/*检查 PPG硬件是否存在,返回 1 存在,0 不存在*/
+int isPPGavailable();
+/*开启心率血压检测*/
+int enablePPG();
+/*停止心率血压检测*/
+int disablePPG();
+/*返回 心率值 每分钟跳动次数, 通过这个心率>0 判断是否已经有检测结果,
+有就可以直接通过getHighBloodPressure 和 getLowBloodPressure 获取血压高压低压值*/
+int getPPG();
+/* 返回PPG 运行状态, 0 停止, 1,运行中*/
+int isPPGStarted();
+/*返回是否佩戴  0 未佩戴,1 佩戴*/
+int isWeared();
+/*获取血压高压值*/
+int getHighBloodPressure();
+/*获取血压低压值*/
+int getLowBloodPressure();
+/*获取血氧值*/
+int getSPO2();
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/*HRS3300*/
+#define LTR_IOCTL_MAGIC         0x1C
+#define ALSPS_SET_PS_MODE     _IOW(LTR_IOCTL_MAGIC, 1, int)
+#define ALSPS_GET_PS_MODE     _IOR(LTR_IOCTL_MAGIC, 2, int)
+#define ALSPS_GET_PS_DATA     _IOR(LTR_IOCTL_MAGIC, 3, unsigned char)
+#define ALSPS_GET_PS_RAW_DATA      _IOR(LTR_IOCTL_MAGIC, 4, unsigned char)
+
+
+#define HRS3300_DEV_PATH_NAME    "/dev/hrs3300"
+#define HRS3313_DEV_PATH_NAME    "/dev/hrs3313"
+
+/* portable 8-bit unsigned integer */
+typedef unsigned char           uint8_t;
+/* portable 8-bit signed integer */
+typedef signed char             int8_t;
+/* portable 16-bit unsigned integer */
+typedef unsigned short int      uint16_t;
+/* portable 16-bit signed integer */
+typedef signed short int        int16_t;
+/* portable 32-bit unsigned integer */
+typedef unsigned int            uint32_t;
+/* portable 32-bit signed integer */
+typedef signed int              int32_t;
+
+
+#ifndef  true
+#define  true  1
+#endif
+#ifndef  false
+#define  false  0
+#endif
+
+#ifndef bool
+#define bool unsigned char
+#endif
+
+
+typedef enum {
+    MSG_ALG_NOT_OPEN = 0x01,
+    MSG_NO_TOUCH = 0x02,
+    MSG_PPG_LEN_TOO_SHORT = 0x03,
+    MSG_HR_READY = 0x04,
+    MSG_ALG_TIMEOUT = 0x05,
+    MSG_SETTLE = 0x06
+} hrs3313_msg_code_t;
+
+typedef enum {
+    MSG_BP_ALG_NOT_OPEN = 0x01,
+    MSG_BP_NO_TOUCH = 0x02,
+    MSG_BP_PPG_LEN_TOO_SHORT = 0x03,
+    MSG_BP_READY = 0x04,
+    MSG_BP_ALG_TIMEOUT = 0x05,
+    MSG_BP_SETTLE = 0x06
+} hrs3313_bp_msg_code_t;
+
+typedef enum {
+    DEFAULT_MOTION = 0,
+    STATIC_MOTION = 1,
+    WALKING_MOTION = 2,
+    RUNING_MOTION = 3,
+    CYCLING_MOTION = 4,
+    SWINMING_MOTION = 5,
+    TENNIS_MOTION = 6
+} MOIION_STATUS;
+
+typedef struct {
+    hrs3313_msg_code_t alg_status;
+    uint32_t           data_cnt;
+    uint8_t            hr_result;
+    uint8_t            hr_result_qual; // ericy add20170111
+    bool               object_flg;
+} hrs3313_results_t;
+
+
+typedef struct {
+    hrs3313_bp_msg_code_t bp_alg_status;
+    uint8_t            sbp;
+    uint8_t            dbp;
+    uint32_t           data_cnt;
+    uint8_t            hr_result; //20170614 ericy
+    bool               object_flg;
+} hrs3313_bp_results_t;
+
+int is_hrs3300_available(){
+    if (checkfile(HRS3300_DEV_PATH_NAME)==0){
+        return  checkfile(HRS3313_DEV_PATH_NAME);
+    }else{
+        return 1;
+    }
+}
+
+int hrs3300_ppgEnable(){
+    int dev_fd;
+    int err = 0;
+    int tmp =1;
+    dev_fd = open(HRS3300_DEV_PATH_NAME, O_RDWR | O_SYNC);
+    if (dev_fd < 0) {
+        fprintf(stderr, "cannot open %s\n", HRS3300_DEV_PATH_NAME);
+        dev_fd = open(HRS3313_DEV_PATH_NAME, O_RDWR | O_SYNC);
+        if (dev_fd < 0) {
+            fprintf(stderr, "cannot open %s\n", HRS3313_DEV_PATH_NAME);
+
+            return -1;
+        }
+
+    }
+    LOGD(" Start HRS3300/3313 Test ioctl");
+    err = ioctl(dev_fd, ALSPS_SET_PS_MODE,
+                &tmp);
+
+    if (err != 0) {
+        LOGE("hrs3300/3313 failed (%s)", strerror(errno));
+        return err;
+    }
+    close(dev_fd);
+    return tmp;
+}
+int hrs3300_ppgStop(){
+    int dev_fd;
+    int err = 0;
+    int tmp =0;
+    dev_fd = open(HRS3300_DEV_PATH_NAME, O_RDWR | O_SYNC);
+    if (dev_fd < 0) {
+        fprintf(stderr, "cannot open %s\n", HRS3300_DEV_PATH_NAME);
+        dev_fd = open(HRS3313_DEV_PATH_NAME, O_RDWR | O_SYNC);
+        if (dev_fd < 0) {
+            fprintf(stderr, "cannot open %s\n", HRS3313_DEV_PATH_NAME);
+
+            return -1;
+        }
+    }
+    LOGD(" Start HRS3300/3313 Test ioctl");
+    err = ioctl(dev_fd,ALSPS_SET_PS_MODE,
+                &tmp);
+
+    if (err != 0) {
+        LOGE("start HRS3300/3313 failed (%s)", strerror(errno));
+        return err;
+    }
+    close(dev_fd);
+    return tmp;
+}
+
+
+int hrs3300_isEnabled(){
+    int dev_fd;
+    int err = 0;
+    int tmp =0;
+    dev_fd = open(HRS3300_DEV_PATH_NAME, O_RDWR | O_SYNC);
+    if (dev_fd < 0) {
+        fprintf(stderr, "cannot open %s\n", HRS3300_DEV_PATH_NAME);
+        dev_fd = open(HRS3313_DEV_PATH_NAME, O_RDWR | O_SYNC);
+        if (dev_fd < 0) {
+            fprintf(stderr, "cannot open %s\n", HRS3313_DEV_PATH_NAME);
+
+            return -1;
+        }
+    }
+    LOGD(" Start HRS3300/3313 Test ioctl");
+    err = ioctl(dev_fd,ALSPS_GET_PS_MODE,
+                &tmp);
+
+    if (err != 0) {
+        LOGE("start HRS3300/3313 failed (%s)", strerror(errno));
+        return err;
+    }
+    close(dev_fd);
+    return tmp;
+}
+
+
+hrs3313_bp_results_t hrs_bp_data;
+hrs3313_results_t hrs_data;
+
+int hrs3300_getPPG_Data(){
+    int dev_fd;
+    int err = 0;
+    int tmp =0;
+    dev_fd = open(HRS3300_DEV_PATH_NAME, O_RDWR | O_SYNC);
+    if (dev_fd < 0) {
+        fprintf(stderr, "cannot open %s\n", HRS3300_DEV_PATH_NAME);
+        dev_fd = open(HRS3313_DEV_PATH_NAME, O_RDWR | O_SYNC);
+        if (dev_fd < 0) {
+            fprintf(stderr, "cannot open %s\n", HRS3313_DEV_PATH_NAME);
+
+            return -1;
+        }
+    }
+    LOGD(" Start HRS3300/3313 Test ioctl");
+    err = ioctl(dev_fd,ALSPS_GET_PS_DATA,
+                &hrs_data);
+
+    if (err != 0) {
+        LOGE("start HRS3300/3313 failed (%s)", strerror(errno));
+        return err;
+    }
+    err = ioctl(dev_fd,ALSPS_GET_PS_RAW_DATA,
+                &hrs_bp_data);
+
+    if (err != 0) {
+        LOGE("start HRS3300/3313 failed (%s)", strerror(errno));
+        return err;
+    }
+    LOGD("alg_status 0x%02X,",hrs_data.alg_status);
+    LOGD("bp_alg sbp %d, dbp %d, hr %d ",hrs_bp_data.sbp,hrs_bp_data.dbp,hrs_bp_data.hr_result);
+/*
+ *  static int wared,ppg,spo2,bph, bpl;
+
+    MSG_ALG_NOT_OPEN = 0x01,
+    MSG_NO_TOUCH = 0x02,
+    MSG_PPG_LEN_TOO_SHORT = 0x03,
+    MSG_HR_READY = 0x04,
+    */
+    if (hrs_data.alg_status <= MSG_NO_TOUCH){
+        wared=0;
+    }else{
+        wared=1;
+    }
+    if ((hrs_data.alg_status ==MSG_HR_READY ) && (hrs_bp_data.hr_result>0) && (hrs_bp_data.sbp > 0))
+    {
+               
+        ppg=hrs_bp_data.hr_result;
+        spo2=0;
+        bph=hrs_bp_data.sbp;
+        bpl=hrs_bp_data.dbp;
+    }else{
+        ppg=bph=bpl=spo2=0;
+    }
+    close(dev_fd);
+    return ppg;
+
+}
+
+
+/*****************心率血压检测控制*************************************/
+#define PPG_WORKING_STR  "em7028 Resume\n"
+#define PPG_STOP_STR   "em7028 Suspend\n"
+#define PPG_CTL_PATH  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input4/em7028als/enable"
+#define PPG_DEV  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input4/em7028als/em7028dev"
+
+#define PPG_CTL_PATH2  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input2/em7028als/enable"
+#define PPG_DEV2  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input2/em7028als/em7028dev"
+
+/*return -1 if open failed! */
+
+static int getPPGFromStr(char* buf,int* wared,int *ppg,int *spo2,int* ph,int* pl);
+static int readData(char* filepath);
+
+
+int isEM7028available(){
+    if (checkfile(PPG_CTL_PATH)==0){
+        return  checkfile(PPG_CTL_PATH2);
+    }else{
+        return 1;
+    }
+}
+
+int enableEM7028(){
+    if (write_file(PPG_CTL_PATH,"1",sizeof("1"))==-1){
+        if (write_file(PPG_CTL_PATH2,"1",sizeof("1"))==-1)
+        {
+            return -1;
+        }
+    }
+    return 0;
+}
+int disableEM7028(){
+
+    if (write_file(PPG_CTL_PATH, "0", sizeof("1")) == -1) {
+        if(write_file(PPG_CTL_PATH2, "0", sizeof("1")) == -1) {
+            return -1;
+        }
+    }
+    return 0;
+
+}
+
+int getPPG_EM7028(){
+    if( readData(PPG_DEV)== -1){
+        readData(PPG_DEV2);
+    }
+    return ppg;
+}
+int isPPG_EM7028_STARTED(){
+
+    char buf[20]={0};
+    int redlen;
+
+    int fd;
+    fd=open(PPG_CTL_PATH,O_RDWR);
+    if (fd<0) {
+
+        fd=open(PPG_CTL_PATH2,O_RDWR);
+        if (fd<0)
+            return -1;
+    }
+
+    redlen=read(fd,buf,sizeof(buf));
+    LOGD("The content is %s , len %d", buf , redlen);
+    close(fd);
+
+    if (redlen >= sizeof(PPG_WORKING_STR) && strncasecmp(buf,PPG_WORKING_STR,sizeof(PPG_WORKING_STR))==0){
+        return 1;
+    }else if (redlen >= sizeof(PPG_STOP_STR) && strncasecmp(buf,PPG_STOP_STR,sizeof(PPG_STOP_STR))==0){
+        return 0;
+    }
+    return 0;
+}
+int readData(char* filepath){
+    char buf[20] ={0};
+    int redlen=0;
+
+    int fd;
+    fd=open(filepath,O_RDWR);
+    if (fd<0) return -1;
+
+    redlen=read(fd,buf,sizeof(buf));
+    LOGD("The content is %s , len %d", buf , redlen);
+    close(fd);
+
+    getPPGFromStr(buf,&wared,&ppg,&spo2,&bph,&bpl);
+    LOGD(" read string %s \n",buf);
+    LOGD(" is wared  %d , ppg %d , spo2 %d , bph %d , bpl %d\n",wared,ppg,spo2,bph,bpl);
+    return 0;
+}
+
+
+//luxValue,bpm,spo2,bloodh,bloodl
+static int getPPGFromStr(char* buf,int* wared,int *ppg,int *spo2,int* bph,int* bpl){
+
+    //luxValue,bpm,spo2,bloodh,bloodl
+    int ret=-1;
+    ret=sscanf(buf,"%d %d %d %d %d",wared,ppg,spo2,bph,bpl);
+    //驱动返回1表示未佩戴
+    *wared= (*wared==1?0:1);
+    return ret;
+
+}
+
+static int g_ppg_type=PPG_TYPE_UNKNOWN;
+/*=============================================================================*/
+/*检查 PPG硬件是否存在,返回 1 存在,0 不存在*/
+int isPPGavailable(){
+
+  if (  is_hrs3300_available())
+      g_ppg_type=PPG_TYPE_HRS33XX;
+
+  if (isEM7028available())
+      g_ppg_type=PPG_TYPE_EM7028;
+
+  return g_ppg_type;
+}
+/*开启心率血压检测*/
+  int enablePPG(){
+    g_ppg_type=isPPGavailable();
+    int ret=-1;
+      switch(g_ppg_type){
+
+          case PPG_TYPE_EM7028:
+            ret=enableEM7028();
+              break;
+
+          case PPG_TYPE_HRS33XX:
+            ret=hrs3300_ppgEnable();
+              break;
+          case PPG_TYPE_UNKNOWN:
+          default:
+              break;
+      }
+      return ret;
+}
+/*停止心率血压检测*/
+  int disablePPG() {
+    g_ppg_type=isPPGavailable();
+    int ret=-1;
+    switch(g_ppg_type){
+
+        case PPG_TYPE_EM7028:
+            ret=disableEM7028();
+            break;
+
+        case PPG_TYPE_HRS33XX:
+            ret=hrs3300_ppgStop();
+            break;
+        case PPG_TYPE_UNKNOWN:
+        default:
+            break;
+    }
+    return ret;
+}
+/*返回 心率值 每分钟跳动次数, 通过这个心率>0 判断是否已经有检测结果,
+有就可以直接通过getHighBloodPressure 和 getLowBloodPressure 获取血压高压低压值*/
+  int getPPG(){
+
+    int ret=-1;
+    switch(g_ppg_type){
+
+        case PPG_TYPE_EM7028:
+            ret=getPPG_EM7028();
+            break;
+
+        case PPG_TYPE_HRS33XX:
+            ret=hrs3300_getPPG_Data();
+            break;
+        case PPG_TYPE_UNKNOWN:
+        default:
+            break;
+    }
+    return ret;
+}
+/* 返回PPG 运行状态, 0 停止, 1,运行中*/
+  int isPPGStarted(){
+    g_ppg_type=isPPGavailable();
+    int ret=-1;
+    switch(g_ppg_type){
+
+        case PPG_TYPE_EM7028:
+            ret=isPPG_EM7028_STARTED();
+            break;
+
+        case PPG_TYPE_HRS33XX:
+            ret=hrs3300_isEnabled();
+            break;
+        case PPG_TYPE_UNKNOWN:
+        default:
+            break;
+    }
+    return ret;
+}
+/*返回是否佩戴  0 未佩戴,1 佩戴*/
+  int isWeared(){
+    //驱动返回1表示未佩戴
+    return wared;
+}
+/*获取血压高压值*/
+  int getHighBloodPressure(){
+    return bph;
+}
+/*获取血压低压值*/
+ int getLowBloodPressure(){
+    return bpl;
+}
+ int getSPO2(){
+    return spo2;
+}
+
+
+
similarity index 60%
rename from app/src/main/jni/driverHal.c
rename to app/src/main/jni/stepcounter_hal.c
index 078b1fb..9e0cf2e 100644 (file)
-//#include <string.h>
-//#include <stdlib.h>
-//#include <stdio.h>
-//#include <jni.h>
-//#include <fcntl.h> /*�����ļ���������open() read() close() write()��*/
-#include <android/log.h>
-
-//#include <utils/Log.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <linux/ioctl.h>
-#include <fcntl.h>
-
-//#include "JNIHelp.h"
-#include "jni.h"
-//#include <utils/Log.h>
-//#include "android_runtime/AndroidRuntime.h"
-
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-
-
-
-#include <sys/ioctl.h>
-#include <termios.h>
-
-#include <stdint.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <string.h>
-#include <linux/kd.h>
-#include <linux/vt.h>
-#include <errno.h>
-#include <pthread.h>
-
-#include <math.h>
-#include <poll.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/select.h>
-
-#include <linux/input.h>
-
-#define  ANDROID_LOG_INFO    "/I"
-#define  ANDROID_LOG_ERROR    "/E"
-#define  ANDROID_LOG_DEBUG    "/D"
-#define  LOG_TAG    "ParameterUtil"
-#define  __android_log_print ;
-
-//#define DEBUG_MODE
-#define NDK
-
-
-#define DEV_LOG_TAG "QmaPedometer"
-
-#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,DEV_LOG_TAG,__VA_ARGS__)
-#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,DEV_LOG_TAG,__VA_ARGS__)
-//#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,DEV_LOG_TAG,__VA_ARGS__)
-#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,DEV_LOG_TAG,__VA_ARGS__)
-//#define  LOGF(...)  __android_log_print(ANDROID_LOG_FTAL,DEV_LOG_TAG,__VA_ARGS__)
-
-
-#define __FUNCTION__
-
-
-
-
-
-#define QMAX981_HAL_DRIVER_USING_IOCTL
-
-#define QMAX981_ACC_DEV_PATH_NAME    "/dev/qmax981"
-#define QMAX981_ACC_INPUT_NAME  "accelerometer"
-#define QMAX981_STEP_INPUT_NAME  "step_counter"
-
-#define QMAX981_ACC_IOCTL_BASE                   77
-/** The following define the IOCTL command values via the ioctl macros */
-#define QMAX981_ACC_IOCTL_SET_DELAY              _IOW(QMAX981_ACC_IOCTL_BASE, 0, int)
-#define QMAX981_ACC_IOCTL_GET_DELAY              _IOR(QMAX981_ACC_IOCTL_BASE, 1, int)
-#define QMAX981_ACC_IOCTL_SET_ENABLE             _IOW(QMAX981_ACC_IOCTL_BASE, 2, int)
-#define QMAX981_ACC_IOCTL_GET_ENABLE             _IOR(QMAX981_ACC_IOCTL_BASE, 3, int)
-
-
-#define QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE         _IOW(QMAX981_ACC_IOCTL_BASE,5,int)
-#define QMAX981_ACC_IOCTL_GET_STEPCOUNT_ENABLE         _IOR(QMAX981_ACC_IOCTL_BASE,6,int)
-
-#define QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE      _IOW(QMAX981_ACC_IOCTL_BASE,5,int)
-#define QMAX981_ACC_IOCTL_GET_STEPCOUNT_ENABLE      _IOR(QMAX981_ACC_IOCTL_BASE,6,int)
-#define QMAX981_ACC_IOCTL_CLEAR_STEPCOUNT       _IOR(QMAX981_ACC_IOCTL_BASE,7,int)
-#define QMAX981_ACC_IOCTL_GET_STEPCOUNT                 _IOR(QMAX981_ACC_IOCTL_BASE,8,int)
-#define QMAX981_ACC_IOCTL_SAVE_STEPCOUNT                _IOR(QMAX981_ACC_IOCTL_BASE,9,int) //save step count to file while power off
-#define QMAX981_ACC_IOCTL_RECOVERY_STEPCOUNT            _IOR(QMAX981_ACC_IOCTL_BASE,10,int) //recovery step count to file while power on
-
-#define ACC_UNIT_CONVERSION(value) ((value) * GRAVITY_EARTH / (1024.0f))
-
-
-#define SENSOR_UNKNOWN 0
-#define SENSOR_QMA6981 1
-#define SENSOR_SC7A21 2
-
-static int g_sensor_type=0; //0 no sensor, 1 QMA6981, 2 SC7A21
-
-
-/*HRS3300*/
-#define LTR_IOCTL_MAGIC         0x1C
-#define LTR_IOCTL_GET_PFLAG     _IOR(LTR_IOCTL_MAGIC, 1, int)
-#define LTR_IOCTL_GET_LFLAG     _IOR(LTR_IOCTL_MAGIC, 2, int)
-#define LTR_IOCTL_SET_PFLAG     _IOW(LTR_IOCTL_MAGIC, 3, int)
-#define LTR_IOCTL_SET_LFLAG     _IOW(LTR_IOCTL_MAGIC, 4, int)
-#define LTR_IOCTL_GET_DATA      _IOW(LTR_IOCTL_MAGIC, 5, unsigned char)
-#define LTR_IOCTL_GET_CHIPINFO  _IOR(LTR_IOCTL_MAGIC, 6, char)
-
-#define HRS3300_DEV_PATH_NAME    "/dev/hrs3300"
-#define HRS3300_INPUT_NAME  "hrs3300"
-
-int hrs3300_startTest(){
-    int dev_fd;
-    int err = 0;
-    int tmp =1;
-    dev_fd = open(HRS3300_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", HRS3300_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" Start HRS3300 Test ioctl");
-    err = ioctl(dev_fd, LTR_IOCTL_SET_LFLAG,
-                &tmp);
-
-    if (err != 0) {
-        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));
-        return err;
-    }
-    close(dev_fd);
-    return tmp;
-}
-int hrs3300_stopTest(){
-    int dev_fd;
-    int err = 0;
-    int tmp =0;
-    dev_fd = open(HRS3300_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", HRS3300_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" Start HRS3300 Test ioctl");
-    err = ioctl(dev_fd, LTR_IOCTL_SET_LFLAG,
-                &tmp);
-
-    if (err != 0) {
-        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));
-        return err;
-    }
-    close(dev_fd);
-    return tmp;
-}
-
-
-int qmax981_enable(){
-    int dev_fd;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    int err = 0;
-    int enabled =1;
-    int ms;
-    {// enable step counter
-
-        LOGD("ACC_SET_ENABLE ioctl");
-        err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_ENABLE,
-                  &enabled);
-
-        LOGD("ACC_SET_ENABLE done");
-
-        if (err != 0) {
-                    LOGE("ACC_SET_ENABLE failed (%s)", strerror(errno));
-                    return err;
-        }
-
-         LOGD("SET_STEPCOUNT_ENABLE ioctl");
-        err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE,
-                  &enabled);
-
-        LOGD("SET_STEPCOUNT_ENABLE done");
-
-        if (err != 0) {
-                LOGE("SET_STEPCOUNT_ENABLE failed (%s)", strerror(errno));
-                return err;
-        }
-        }// enable step counter end
-        { // set delay
-
-        ms = 0;
-        if (ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_DELAY, &ms)) {
-                return -errno;
-        }
-
-         LOGD("SET_DELAY : delay = %d", ms);
-
-        }// set delay end
-        close(dev_fd);
-        return 0;
-}
-
-int qmax981_disable(){
-    int dev_fd;
-    int err = 0;
-    int enabled =0;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD("SET_STEPCOUNT_ENABLE ioctl ");
-    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE,
-              &enabled);
-
-    if (err != 0) {
-            LOGE("SET_STEPCOUNT_ENABLE failed (%s)", strerror(errno));
-            return err;
-    }
-/*
-    LOGD("AccSensor:enable Acc ioctl false");
-    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_ENABLE,
-              &enabled);
-
-    if (err != 0) {
-            LOGE("AccSensor: IOCTL failed (%s)", strerror(errno));
-            return err;
-    }
-*/
-    close(dev_fd);
-    return 0;
-}
-
-int qmax981_getStepCount(){
-
-    int dev_fd;
-    int err = 0;
-    int stepcount =0;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" GET_STEPCOUNT ioctl ");
-    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_GET_STEPCOUNT,
-              &stepcount);
-
-    if (err != 0) {
-            LOGE("GET_STEPCOUNT failed (%s)", strerror(errno));
-            return err;
-    }
-    close(dev_fd);
-
-    return stepcount;
-}
-
-int qmax981_saveStepCount(){
-
-    int dev_fd;
-    int err = 0;
-    int tmp =0;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" SAVE_STEPCOUNT  %d",tmp);
-    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SAVE_STEPCOUNT,
-              &tmp);
-
-    if (err != 0) {
-            LOGE("SAVE_STEPCOUNT failed (%s)", strerror(errno));
-            return err;
-    }
-    close(dev_fd);
-    return 0;
-
-}
-
-int qmax981_recoverStepCount(){
-    int dev_fd;
-    int err = 0;
-    int stepcount =0;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" RECOVERY_STEPCOUNT ioctl ");
-    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_RECOVERY_STEPCOUNT,
-              &stepcount);
-
-    if (err != 0) {
-            LOGE("RECOVERY_STEPCOUNT failed (%s)", strerror(errno));
-            return err;
-    }
-    close(dev_fd);
-    return stepcount;
-    return 0;
-}
-
-int qmax981_clearStepCount(){
-
-    int dev_fd;
-    int err = 0;
-    int tmp =0;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" CLEAR_STEPCOUNT ioctl ");
-    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_CLEAR_STEPCOUNT,
-              &tmp);
-
-    if (err != 0) {
-            LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));
-            return err;
-    }
-    close(dev_fd);
-    return 0;
-}
-
-
-int qmax981_isStepCounterEnabled(){
-
-    int dev_fd;
-    int err = 0;
-    int tmp =0;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        return 0;
-    }
-    LOGD(" GET_STEPCOUNT_ENABLE ioctl");
-    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_GET_STEPCOUNT_ENABLE,
-              &tmp);
-
-    if (err != 0) {
-            LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));
-            return err;
-    }
-    close(dev_fd);
-    return tmp;
-}
-
-/*****************心率血压检测控制*************************************/
-#define PPG_WORKING_STR  "em7028 Resume\n"
-#define PPG_STOP_STR   "em7028 Suspend\n"
-#define PPG_CTL_PATH  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input4/em7028als/enable"
-#define PPG_DEV  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input4/em7028als/em7028dev"
-
-#define PPG_CTL_PATH2  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input2/em7028als/enable"
-#define PPG_DEV2  "/sys/devices/platform/soc/soc:ap-apb/70700000.i2c/i2c-2/2-0024/input/input2/em7028als/em7028dev"
-
-/*return -1 if open failed! */
-static int checkfile(char* filepath);
-static int write_file(char* filepath,char* buf,int len);
-static int read_file(char* filepath , char** buf, int buflen,int* len);
-static int getPPGFromStr(char* buf,int* wared,int *ppg,int *spo2,int* ph,int* pl);
-static int readData(char* filepath);
-static int wared,ppg,spo2,bph, bpl;
-/*检查 PPG硬件是否存在,返回 1 存在,0 不存在*/
-  int isPPGavailable(){
-      if (checkfile(PPG_CTL_PATH)==0){
-          return  checkfile(PPG_CTL_PATH2);
-      }else{
-          return 1;
-      }
-
-}
-/*开启心率血压检测*/
-  int enablePPG(){
-    if (write_file(PPG_CTL_PATH,"1",sizeof("1"))==-1){
-        write_file(PPG_CTL_PATH2,"1",sizeof("1"));
-    }
-    return 0;
-}
-/*停止心率血压检测*/
-  int disablePPG() {
-    if (write_file(PPG_CTL_PATH, "0", sizeof("1")) == -1) {
-        write_file(PPG_CTL_PATH2, "0", sizeof("1"));
-    }
-    return 0;
-}
-/*返回 心率值 每分钟跳动次数, 通过这个心率>0 判断是否已经有检测结果,
-有就可以直接通过getHighBloodPressure 和 getLowBloodPressure 获取血压高压低压值*/
-  int getPPG(){
-    if( readData(PPG_DEV)== -1){
-        readData(PPG_DEV2);
-    }
-    return ppg;
-}
-/* 返回PPG 运行状态, 0 停止, 1,运行中*/
-  int isPPGStarted(){
-    char buf[20]={0};
-    int redlen;
-
-    int fd;
-    fd=open(PPG_CTL_PATH,O_RDWR);
-    if (fd<0) {
-
-        fd=open(PPG_CTL_PATH2,O_RDWR);
-        if (fd<0)
-            return -1;
-    }
-
-    redlen=read(fd,buf,sizeof(buf));
-    LOGD("The content is %s , len %d", buf , redlen);
-    close(fd);
-
-    if (redlen >= sizeof(PPG_WORKING_STR) && strncasecmp(buf,PPG_WORKING_STR,sizeof(PPG_WORKING_STR))==0){
-        return 1;
-    }else if (redlen >= sizeof(PPG_STOP_STR) && strncasecmp(buf,PPG_STOP_STR,sizeof(PPG_STOP_STR))==0){
-        return 0;
-    }
-    return 0;
-}
-/*返回是否佩戴  0 未佩戴,1 佩戴*/
-  int isWeared(){
-    //驱动返回1表示未佩戴
-    return wared==1?0:1;
-}
-/*获取血压高压值*/
-  int getHighBloodPressure(){
-    return bph;
-}
-/*获取血压低压值*/
- int getLowBloodPressure(){
-    return bpl;
-}
- int getSPO2(){
-    return spo2;
-}
-
-int readData(char* filepath){
-    char buf[20] ={0};
-    int redlen=0;
-
-    int fd;
-    fd=open(filepath,O_RDWR);
-    if (fd<0) return -1;
-
-     redlen=read(fd,buf,sizeof(buf));
-    LOGD("The content is %s , len %d", buf , redlen);
-    close(fd);
-
-     getPPGFromStr(buf,&wared,&ppg,&spo2,&bph,&bpl);
-    LOGD(" read string %s \n",buf);
-    LOGD(" is wared  %d , ppg %d , spo2 %d , bph %d , bpl%d\n",wared,ppg,spo2,bph,bpl);
-    return 0;
-}
-int checkfile(char* filepath){
-    int fd;
-    fd=open(filepath,O_RDWR);
-    if (fd<0) return 0;
-    close(fd);
-   return 1;
-}
-
-int write_file(char* filepath,char* buf,int len){
-    int fd=open(filepath,O_WRONLY);
-
-    if (fd<0) return -1;
-    int wlen=write(fd,buf,len);
-    close(fd);
-    return wlen;
-}
-
-static int read_file(char* filepath , char** buf, int buflen,int* len){
-    int fd;
-    fd=open(filepath,O_RDONLY);
-    if (fd<0) return -1;
-
-    *len=read(fd,*buf,buflen);
-    LOGD("The content is %s , len %d",* buf , *len);
-    close(fd);
-    return 0;
-}
-
-//luxValue,bpm,spo2,bloodh,bloodl
-static int getPPGFromStr(char* buf,int* wared,int *ppg,int *spo2,int* bph,int* bpl){
-
-    //luxValue,bpm,spo2,bloodh,bloodl
-   return  sscanf(buf,"%d %d %d %d %d",wared,ppg,spo2,bph,bpl);
-
-}
-
-
-
-#define SC7A21_ACC_IOCTL_BASE                          77 //0x1D
-#define SC7A21_ACC_IOCTL_SET_DELAY             _IOW(SC7A21_ACC_IOCTL_BASE,0,int)
-#define SC7A21_ACC_IOCTL_GET_DELAY             _IOR(SC7A21_ACC_IOCTL_BASE,1,int)
-#define SC7A21_ACC_IOCTL_SET_ENABLE            _IOW(SC7A21_ACC_IOCTL_BASE,2,int)
-#define SC7A21_ACC_IOCTL_GET_ENABLE            _IOR(SC7A21_ACC_IOCTL_BASE,3,int)
-#define SC7A21_ACC_IOCTL_CALIBRATION   _IOW(SC7A21_ACC_IOCTL_BASE,4,int)
-#define SC7A21_ACC_IOCTL_SET_STEPCOUNT_ENABLE          _IOW(SC7A21_ACC_IOCTL_BASE,5,int)
-#define SC7A21_ACC_IOCTL_GET_STEPCOUNT_ENABLE          _IOR(SC7A21_ACC_IOCTL_BASE,6,int)
-#define SC7A21_ACC_IOCTL_GET_STEPCOUNT         _IOR(SC7A21_ACC_IOCTL_BASE,7,int)
-#define SC7A21_ACC_IOCTL_CLEAR_STEPCOUNT               _IOR(SC7A21_ACC_IOCTL_BASE,8,int)
-
-#define SC7A21_ACC_DEV_PATH_NAME "/dev/sc7a21"
-
-
-int sc7a21_isStepCounterEnabled(){
-
-    int dev_fd;
-    int err = 0;
-    int tmp =0;
-    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" GET_STEPCOUNT_ENABLE ioctl");
-    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_GET_ENABLE,
-                &tmp);
-
-    if (err != 0) {
-        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));
-        return err;
-    }
-    close(dev_fd);
-    return tmp;
-}
-
-
-int sc7a21_DisableStepCount(){
-
-    int dev_fd;
-    int err = 0;
-    int tmp =0;
-    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" SC7A21_ACC_IOCTL_SET_ENABLE ioctl ");
-    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_SET_ENABLE,
-                &tmp);
-
-    if (err != 0) {
-        LOGE("SC7A21_ACC_IOCTL_SET_ENABLE failed (%s)", strerror(errno));
-        return err;
-    }
-    close(dev_fd);
-    return 0;
-}
-
-
-int sc7a21_EnableStepCount(){
-
-    int dev_fd;
-    int err = 0;
-    int tmp =1;
-    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" SC7A21_ACC_IOCTL_SET_ENABLE ioctl ");
-    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_SET_ENABLE,
-                &tmp);
-
-    if (err != 0) {
-        LOGE("SC7A21_ACC_IOCTL_SET_ENABLE failed (%s)", strerror(errno));
-        return err;
-    }
-    close(dev_fd);
-    return 0;
-}
-
-int sc7a21_clearStepCount(){
-
-    int dev_fd;
-    int err = 0;
-    int tmp =0;
-    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" CLEAR_STEPCOUNT ioctl ");
-    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_CLEAR_STEPCOUNT,
-                &tmp);
-
-    if (err != 0) {
-        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));
-        return err;
-    }
-    close(dev_fd);
-    return 0;
-}
-
-
-int sc7a21_getStepCount(){
-
-    int dev_fd;
-    int err = 0;
-    int stepcount =0;
-    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);
-    if (dev_fd < 0) {
-        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);
-        return 1;
-    }
-    LOGD(" GET_STEPCOUNT ioctl ");
-    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_GET_STEPCOUNT,
-                &stepcount);
-
-    if (err != 0) {
-        LOGE("GET_STEPCOUNT failed (%s)", strerror(errno));
-        return err;
-    }
-    close(dev_fd);
-
-    return stepcount;
-}
-
-int getSensorType(){
-    int tmp=SENSOR_UNKNOWN;
-
-    int dev_fd;
-    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDONLY);
-    if (dev_fd > 0) {
-        // fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);
-        tmp=SENSOR_QMA6981;
-        close(dev_fd);
-    }else{
-
-        dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDONLY);
-        if (dev_fd > 0) {
-            // fprintf(std, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);
-            tmp=SENSOR_SC7A21;
-            close(dev_fd);
-        }
-    }
-    return tmp;
-}
+#include <android/log.h>\r
+\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <linux/ioctl.h>\r
+#include <fcntl.h>\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+#include <assert.h>\r
+\r
+\r
+\r
+#include <sys/ioctl.h>\r
+#include <termios.h>\r
+\r
+#include <stdint.h>\r
+#include <fcntl.h>\r
+#include <getopt.h>\r
+#include <string.h>\r
+#include <linux/kd.h>\r
+#include <linux/vt.h>\r
+#include <errno.h>\r
+#include <pthread.h>\r
+\r
+#include <math.h>\r
+#include <poll.h>\r
+#include <unistd.h>\r
+#include <dirent.h>\r
+#include <sys/select.h>\r
+\r
+#include <linux/input.h>\r
+#if 0\r
+#define  ANDROID_LOG_INFO    "/I"\r
+#define  ANDROID_LOG_ERROR    "/E"\r
+#define  ANDROID_LOG_DEBUG    "/D"\r
+#define  LOG_TAG    "ParameterUtil"\r
+#define  __android_log_print ;\r
+#endif\r
+//#define DEBUG_MODE\r
+#define NDK\r
+\r
+\r
+#define DEV_LOG_TAG "ICJniUtils"\r
+\r
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,DEV_LOG_TAG,__VA_ARGS__)\r
+#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,DEV_LOG_TAG,__VA_ARGS__)\r
+//#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,DEV_LOG_TAG,__VA_ARGS__)\r
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,DEV_LOG_TAG,__VA_ARGS__)\r
+//#define  LOGF(...)  __android_log_print(ANDROID_LOG_FTAL,DEV_LOG_TAG,__VA_ARGS__)\r
+\r
+\r
+#define __FUNCTION__\r
+\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*运行此函数清除 系统计步为0*/\r
+//public static native int resetStepCount();\r
+int resetStepCount();\r
+/*获取当前步数*/\r
+//public static native int getStepCount();\r
+int getStepCount();\r
+/*开启计步*/\r
+//public static native int enablePedometer();\r
+int enablePedometer();\r
+/*停止计步*/\r
+//public static native int disablePedometer();\r
+int disablePedometer();\r
+/*检测计步当前是否开启  1开启,0 关闭*/\r
+//public static native int isPedometerEnabled();\r
+int isPedometerEnabled();\r
+/*保存当前步数(getStepCount取得的值)到磁盘*/\r
+//public static native int saveStepCount();\r
+int saveStepCount();\r
+/*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加*/\r
+//public static native int recoverStepCount();\r
+int recoverStepCount();\r
+\r
+\r
+#define SENSOR_UNKNOWN 0\r
+#define SENSOR_QMA6981 1\r
+#define SENSOR_SC7A21 2\r
+\r
+/***************计步控制************************************/\r
+/*运行此函数清除 系统计步为0*/\r
+//public static native int resetStepCount();\r
+int qmax981_clearStepCount();\r
+/*获取当前步数*/\r
+//public static native int getStepCount();\r
+int qmax981_getStepCount();\r
+/*开启计步*/\r
+//public static native int enablePedometer();\r
+int qmax981_enable();\r
+/*停止计步*/\r
+//public static native int disablePedometer();\r
+int qmax981_disable();\r
+/*检测计步当前是否开启  1开启,0 关闭*/\r
+//public static native int isPedometerEnabled();\r
+int qmax981_isStepCounterEnabled();\r
+/*保存当前步数(getStepCount取得的值)到磁盘*/\r
+//public static native int saveStepCount();\r
+int qmax981_saveStepCount();\r
+/*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加*/\r
+//public static native int recoverStepCount();\r
+int qmax981_recoverStepCount();\r
+\r
+\r
+\r
+\r
+int sc7a21_isStepCounterEnabled();\r
+int sc7a21_DisableStepCount();\r
+int sc7a21_EnableStepCount();\r
+int sc7a21_clearStepCount();\r
+int sc7a21_getStepCount();\r
+int getSensorType();\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+\r
+#define QMAX981_HAL_DRIVER_USING_IOCTL\r
+\r
+#define QMAX981_ACC_DEV_PATH_NAME    "/dev/qmax981"\r
+#define QMAX981_ACC_INPUT_NAME  "accelerometer"\r
+#define QMAX981_STEP_INPUT_NAME  "step_counter"\r
+\r
+#define QMAX981_ACC_IOCTL_BASE                   77\r
+/** The following define the IOCTL command values via the ioctl macros */\r
+#define QMAX981_ACC_IOCTL_SET_DELAY              _IOW(QMAX981_ACC_IOCTL_BASE, 0, int)\r
+#define QMAX981_ACC_IOCTL_GET_DELAY              _IOR(QMAX981_ACC_IOCTL_BASE, 1, int)\r
+#define QMAX981_ACC_IOCTL_SET_ENABLE             _IOW(QMAX981_ACC_IOCTL_BASE, 2, int)\r
+#define QMAX981_ACC_IOCTL_GET_ENABLE             _IOR(QMAX981_ACC_IOCTL_BASE, 3, int)\r
+\r
+\r
+#define QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE         _IOW(QMAX981_ACC_IOCTL_BASE,5,int)\r
+#define QMAX981_ACC_IOCTL_GET_STEPCOUNT_ENABLE         _IOR(QMAX981_ACC_IOCTL_BASE,6,int)\r
+\r
+#define QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE      _IOW(QMAX981_ACC_IOCTL_BASE,5,int)\r
+#define QMAX981_ACC_IOCTL_GET_STEPCOUNT_ENABLE      _IOR(QMAX981_ACC_IOCTL_BASE,6,int)\r
+#define QMAX981_ACC_IOCTL_CLEAR_STEPCOUNT       _IOR(QMAX981_ACC_IOCTL_BASE,7,int)\r
+#define QMAX981_ACC_IOCTL_GET_STEPCOUNT                 _IOR(QMAX981_ACC_IOCTL_BASE,8,int)\r
+#define QMAX981_ACC_IOCTL_SAVE_STEPCOUNT                _IOR(QMAX981_ACC_IOCTL_BASE,9,int) //save step count to file while power off\r
+#define QMAX981_ACC_IOCTL_RECOVERY_STEPCOUNT            _IOR(QMAX981_ACC_IOCTL_BASE,10,int) //recovery step count to file while power on\r
+\r
+#define ACC_UNIT_CONVERSION(value) ((value) * GRAVITY_EARTH / (1024.0f))\r
+\r
+\r
+#define SENSOR_UNKNOWN 0\r
+#define SENSOR_QMA6981 1\r
+#define SENSOR_SC7A21 2\r
+\r
+static int g_sensor_type=0; //0 no sensor, 1 QMA6981, 2 SC7A21\r
+\r
+int qmax981_enable(){\r
+    int dev_fd;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    int err = 0;\r
+    int enabled =1;\r
+    int ms;\r
+    {// enable step counter\r
+\r
+        LOGD("ACC_SET_ENABLE ioctl");\r
+        err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_ENABLE,\r
+        &enabled);\r
+\r
+        LOGD("ACC_SET_ENABLE done");\r
+\r
+        if (err != 0) {\r
+            LOGE("ACC_SET_ENABLE failed (%s)", strerror(errno));\r
+            return err;\r
+        }\r
+\r
+        LOGD("SET_STEPCOUNT_ENABLE ioctl");\r
+        err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE,\r
+        &enabled);\r
+\r
+        LOGD("SET_STEPCOUNT_ENABLE done");\r
+\r
+        if (err != 0) {\r
+            LOGE("SET_STEPCOUNT_ENABLE failed (%s)", strerror(errno));\r
+            return err;\r
+        }\r
+    }// enable step counter end\r
+    { // set delay\r
+\r
+        ms = 0;\r
+        if (ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_DELAY, &ms)) {\r
+            return -errno;\r
+        }\r
+\r
+        LOGD("SET_DELAY : delay = %d", ms);\r
+\r
+    }// set delay end\r
+    close(dev_fd);\r
+    return 0;\r
+}\r
+\r
+int qmax981_disable(){\r
+    int dev_fd;\r
+    int err = 0;\r
+    int enabled =0;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD("SET_STEPCOUNT_ENABLE ioctl ");\r
+    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_STEPCOUNT_ENABLE,\r
+    &enabled);\r
+\r
+    if (err != 0) {\r
+        LOGE("SET_STEPCOUNT_ENABLE failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+/*\r
+    LOGD("AccSensor:enable Acc ioctl false");\r
+    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SET_ENABLE,\r
+              &enabled);\r
+\r
+    if (err != 0) {\r
+            LOGE("AccSensor: IOCTL failed (%s)", strerror(errno));\r
+            return err;\r
+    }\r
+*/\r
+    close(dev_fd);\r
+    return 0;\r
+}\r
+\r
+int qmax981_getStepCount(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int stepcount =0;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" GET_STEPCOUNT ioctl ");\r
+    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_GET_STEPCOUNT,\r
+    &stepcount);\r
+\r
+    if (err != 0) {\r
+        LOGE("GET_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+\r
+    return stepcount;\r
+}\r
+\r
+int qmax981_saveStepCount(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =0;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" SAVE_STEPCOUNT  %d",tmp);\r
+    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_SAVE_STEPCOUNT,\r
+    &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("SAVE_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return 0;\r
+\r
+}\r
+\r
+int qmax981_recoverStepCount(){\r
+    int dev_fd;\r
+    int err = 0;\r
+    int stepcount =0;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" RECOVERY_STEPCOUNT ioctl ");\r
+    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_RECOVERY_STEPCOUNT,\r
+    &stepcount);\r
+\r
+    if (err != 0) {\r
+        LOGE("RECOVERY_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return stepcount;\r
+    return 0;\r
+}\r
+\r
+int qmax981_clearStepCount(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =0;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" CLEAR_STEPCOUNT ioctl ");\r
+    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_CLEAR_STEPCOUNT,\r
+    &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return 0;\r
+}\r
+\r
+\r
+int qmax981_isStepCounterEnabled(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =0;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        return 0;\r
+    }\r
+    LOGD(" GET_STEPCOUNT_ENABLE ioctl");\r
+    err = ioctl(dev_fd, QMAX981_ACC_IOCTL_GET_STEPCOUNT_ENABLE,\r
+    &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return tmp;\r
+}\r
+\r
+\r
+#define SC7A21_ACC_IOCTL_BASE                          77 //0x1D\r
+#define SC7A21_ACC_IOCTL_SET_DELAY             _IOW(SC7A21_ACC_IOCTL_BASE,0,int)\r
+#define SC7A21_ACC_IOCTL_GET_DELAY             _IOR(SC7A21_ACC_IOCTL_BASE,1,int)\r
+#define SC7A21_ACC_IOCTL_SET_ENABLE            _IOW(SC7A21_ACC_IOCTL_BASE,2,int)\r
+#define SC7A21_ACC_IOCTL_GET_ENABLE            _IOR(SC7A21_ACC_IOCTL_BASE,3,int)\r
+#define SC7A21_ACC_IOCTL_CALIBRATION   _IOW(SC7A21_ACC_IOCTL_BASE,4,int)\r
+#define SC7A21_ACC_IOCTL_SET_STEPCOUNT_ENABLE          _IOW(SC7A21_ACC_IOCTL_BASE,5,int)\r
+#define SC7A21_ACC_IOCTL_GET_STEPCOUNT_ENABLE          _IOR(SC7A21_ACC_IOCTL_BASE,6,int)\r
+#define SC7A21_ACC_IOCTL_GET_STEPCOUNT         _IOR(SC7A21_ACC_IOCTL_BASE,7,int)\r
+#define SC7A21_ACC_IOCTL_CLEAR_STEPCOUNT               _IOR(SC7A21_ACC_IOCTL_BASE,8,int)\r
+\r
+#define SC7A21_ACC_DEV_PATH_NAME "/dev/sc7a21"\r
+\r
+\r
+int sc7a21_isStepCounterEnabled(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =0;\r
+    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" GET_STEPCOUNT_ENABLE ioctl");\r
+    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_GET_ENABLE,\r
+    &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return tmp;\r
+}\r
+\r
+\r
+int sc7a21_DisableStepCount(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =0;\r
+    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" SC7A21_ACC_IOCTL_SET_ENABLE ioctl ");\r
+    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_SET_ENABLE,\r
+    &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("SC7A21_ACC_IOCTL_SET_ENABLE failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return 0;\r
+}\r
+\r
+\r
+int sc7a21_EnableStepCount(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =1;\r
+    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" SC7A21_ACC_IOCTL_SET_ENABLE ioctl ");\r
+    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_SET_ENABLE,\r
+    &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("SC7A21_ACC_IOCTL_SET_ENABLE failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return 0;\r
+}\r
+\r
+int sc7a21_clearStepCount(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =0;\r
+    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" CLEAR_STEPCOUNT ioctl ");\r
+    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_CLEAR_STEPCOUNT,\r
+    &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+    return 0;\r
+}\r
+\r
+\r
+int sc7a21_getStepCount(){\r
+\r
+    int dev_fd;\r
+    int err = 0;\r
+    int stepcount =0;\r
+    dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+        fprintf(stderr, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" GET_STEPCOUNT ioctl ");\r
+    err = ioctl(dev_fd, SC7A21_ACC_IOCTL_GET_STEPCOUNT,\r
+    &stepcount);\r
+\r
+    if (err != 0) {\r
+        LOGE("GET_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+\r
+    return stepcount;\r
+}\r
+\r
+int getSensorType(){\r
+    int tmp=SENSOR_UNKNOWN;\r
+\r
+    int dev_fd;\r
+    dev_fd = open(QMAX981_ACC_DEV_PATH_NAME, O_RDONLY);\r
+    if (dev_fd > 0) {\r
+        // fprintf(stderr, "cannot open %s\n", QMAX981_ACC_DEV_PATH_NAME);\r
+        tmp=SENSOR_QMA6981;\r
+        close(dev_fd);\r
+    }else{\r
+\r
+        dev_fd = open(SC7A21_ACC_DEV_PATH_NAME, O_RDONLY);\r
+        if (dev_fd > 0) {\r
+            // fprintf(std, "cannot open %s\n", SC7A21_ACC_DEV_PATH_NAME);\r
+            tmp=SENSOR_SC7A21;\r
+            close(dev_fd);\r
+        }\r
+    }\r
+    return tmp;\r
+}\r
+\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    resetStepCount\r
+ * Signature: ()I\r
+ */\r
+int resetStepCount(){\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_clearStepCount();\r
+            break;\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_clearStepCount();\r
+            break;\r
+        default:\r
+            ret = -1;\r
+            break;\r
+    }\r
+    return ret;\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    getStepCount\r
+ * Signature: ()I\r
+ */\r
+int getStepCount(){\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_getStepCount();\r
+            break;\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_getStepCount();\r
+            break;\r
+        default:\r
+            ret = -1;\r
+            break;\r
+    }\r
+    return ret;\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    enablePedometer\r
+ * Signature: ()I\r
+ */\r
+int enablePedometer(){\r
+\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_enable();\r
+            break;\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_EnableStepCount();\r
+            break;\r
+        default:\r
+            ret = -1;\r
+            break;\r
+    }\r
+    return ret;\r
+\r
+}\r
+\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    disablePedometer\r
+ * Signature: ()I\r
+ */\r
+int disablePedometer(){\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_disable();\r
+            break;\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_DisableStepCount();\r
+            break;\r
+        default:\r
+            ret = -1;\r
+            break;\r
+    }\r
+    return ret;\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    isPedometerEnabled\r
+ * Signature: ()I\r
+ */\r
+int isPedometerEnabled(){\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_isStepCounterEnabled();\r
+            break;\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_isStepCounterEnabled();\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    saveStepCount\r
+ * Signature: ()I\r
+ */\r
+int saveStepCount(){\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_saveStepCount();\r
+            break;\r
+        case SENSOR_SC7A21:\r
+            ret= -1;\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
+\r
+}\r
+\r
+/*\r
+ * Class:     com_ic_jni_ICJniUtils\r
+ * Method:    recoverStepCount\r
+ * Signature: ()I\r
+ */\r
+int recoverStepCount(){\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_recoverStepCount();\r
+            break;\r
+        case SENSOR_SC7A21:\r
+            ret= -1;\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
+}\r
diff --git a/app/src/main/jni/temperature_hal.c b/app/src/main/jni/temperature_hal.c
new file mode 100644 (file)
index 0000000..4fee21f
--- /dev/null
@@ -0,0 +1,283 @@
+#include <android/log.h>\r
+\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <linux/ioctl.h>\r
+#include <fcntl.h>\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+#include <assert.h>\r
+\r
+\r
+\r
+#include <sys/ioctl.h>\r
+#include <termios.h>\r
+\r
+#include <stdint.h>\r
+#include <fcntl.h>\r
+#include <getopt.h>\r
+#include <string.h>\r
+#include <linux/kd.h>\r
+#include <linux/vt.h>\r
+#include <errno.h>\r
+#include <pthread.h>\r
+\r
+#include <math.h>\r
+#include <poll.h>\r
+#include <unistd.h>\r
+#include <dirent.h>\r
+#include <sys/select.h>\r
+#include <sys/stat.h>\r
+#include <linux/input.h>\r
+#if 0\r
+#define  ANDROID_LOG_INFO    "/I"\r
+#define  ANDROID_LOG_ERROR    "/E"\r
+#define  ANDROID_LOG_DEBUG    "/D"\r
+#define  LOG_TAG    "ParameterUtil"\r
+#define  __android_log_print ;\r
+#endif\r
+//#define DEBUG_MODE\r
+#define NDK\r
+\r
+\r
+#define DEV_LOG_TAG "ICJniUtils"\r
+\r
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,DEV_LOG_TAG,__VA_ARGS__)\r
+#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,DEV_LOG_TAG,__VA_ARGS__)\r
+//#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,DEV_LOG_TAG,__VA_ARGS__)\r
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,DEV_LOG_TAG,__VA_ARGS__)\r
+//#define  LOGF(...)  __android_log_print(ANDROID_LOG_FTAL,DEV_LOG_TAG,__VA_ARGS__)\r
+\r
+/******获取体温****************************************/\r
+/* 返回-2 如果不支持, -1 读取失败或者超出范围 */\r
+double getTemperature();\r
+double getTemperatureOrigin();\r
+int setTemperatureAdjustValue(double value);\r
+double getTemperatureAdjustValue();\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
+int setTemperatureValidFlag(int flag);\r
+\r
+/*此操作仅仅为了检查标志状态设置成功与否,标志已经在内部被使用*/\r
+int getTemperatureValidFlag();\r
+\r
+#define LTR_IOCTL_MAGIC         0x1C\r
+#define ALSPS_GET_PS_DATA     _IOR(LTR_IOCTL_MAGIC, 3, unsigned char) \r
+\r
+#define NST175_DEV_PATH_NAME "/dev/nst175"\r
+#define NST175_TEMP_ADJUST_FILE_PATH "/productinfo/temp_adjust_37.txt"\r
+#define NST175_TEMP_FLAG_FILE_PATH "/productinfo/temp_flag.txt"\r
+\r
+\r
+///2G 温度校准\r
+\r
+#define EPSINON 0.001f\r
+\r
+double area[] =                        {1.0,26.0,27.5,28.5,29.5,30.5,31.5,32.6,33.6,34.8,36.4,37.2,40.0,50.0};\r
+double compensation[] =        {-2.0,1.8,1.5,1.3,0.9,0.6,0.1,0.1,0.1,0.1,-0.2,0.0,0.0,3.0};\r
+\r
+double area2[] =               {1.0,29.0,31.5,32,32.5,33,34,35,36.2,37.2,38.2,39.2,40.0,42};\r
+double compensation2[] ={1.5,1.3,1.1,0.9,0.7,0.5,0.3,0.1,0.2,0.2,-0.1,-1.0,-2,0};\r
+\r
+\r
+\r
+double adjust_temp_value(double input_temp){\r
+    double body_temp;\r
+    body_temp=input_temp;\r
+    if ((body_temp-area[1]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[0];\r
+    }\r
+    else if ((body_temp-area[2]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[1];\r
+    }\r
+    else if ((body_temp-area[3]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[2];\r
+    }\r
+    else if ((body_temp-area[4]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[3];\r
+    }\r
+    else if ((body_temp-area[5]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[4];\r
+    }\r
+    else if ((body_temp-area[6]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[5];\r
+    }\r
+    else if ((body_temp-area[7]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[6];\r
+    }\r
+    else if ((body_temp-area[8]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[7];\r
+    }\r
+    else if ((body_temp-area[9]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[8];\r
+    }\r
+    else if ((body_temp-area[10]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[9];\r
+    }\r
+    else if ((body_temp-area[11]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[10];\r
+    }\r
+    else if ((body_temp-area[12]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[11];\r
+    }\r
+    else if((body_temp-area[13]) < -EPSINON)\r
+    {\r
+        body_temp += compensation[12];\r
+    }\r
+    else\r
+    {\r
+        body_temp += compensation[13];\r
+    }\r
+\r
+    return body_temp;\r
+}\r
+\r
+double get_bodytemp_from_wristtemp(double wrist_temp, double env_temp){\r
+    double environment_temp,body_temp;\r
+    environment_temp = env_temp;\r
+//    body_temp = 0.02411 * body_temp * body_temp * body_temp - 2.288 * body_temp * body_temp - 0.004356 *body_temp * body_temp * environment_temp\r
+//                + 0.2851 * body_temp * environment_temp - 4.702 * environment_temp + 72.46 * body_temp - 728.9;\r
+    body_temp = 0.02411 * wrist_temp * wrist_temp * wrist_temp - 2.288 * wrist_temp * wrist_temp - 0.004356 *wrist_temp * wrist_temp * environment_temp\r
+                + 0.2851 * wrist_temp * environment_temp - 4.702 * environment_temp + 72.46 * wrist_temp - 728.9 ;\r
+\r
+    LOGD("input wrist_temp %.2lf , env temp %.2lf, output body temp %.2lf\n",wrist_temp,env_temp,body_temp);\r
+    return body_temp;\r
+}\r
+///温度校准 Ennd\r
+\r
+static int write_file(char* filepath,char* buf,int len);\r
+static int read_file(char* filepath , char* buf, int buflen,int* len);\r
+\r
+static int write_file(char* filepath,char* buf,int len){\r
+    int fd=open(filepath,O_WRONLY|O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);\r
+\r
+    if (fd<0) return -1;\r
+    int wlen=write(fd,buf,len);\r
+    close(fd);\r
+    return wlen;\r
+}\r
+\r
+static int read_file(char* filepath , char* buf, int buflen,int* len){\r
+    int fd;\r
+    fd=open(filepath,O_RDONLY);\r
+    if (fd<0) return -1;\r
+\r
+    *len=read(fd,buf,buflen);\r
+    LOGD("The content is %s , len %d\n",buf , *len);\r
+    close(fd);\r
+    return 0;\r
+}\r
+int setTemperatureAdjustValue(double value)\r
+{\r
+       char buf[20]={0};\r
+       int ret=-1;\r
+       ret=sprintf(buf,"%.2lf",value);\r
+       write_file(NST175_TEMP_ADJUST_FILE_PATH, buf,ret);\r
+       LOGD("set Temperature Adjust  %.2lf , ret %d, buf %s\n",value, ret,buf);\r
+       return 0;\r
+}\r
+double getTemperatureAdjustValue(){\r
+\r
+    char buf[20]={0};\r
+       int lenRead=0;\r
+       double tempd=0.0f;\r
+       int ret=-1;\r
+       read_file(NST175_TEMP_ADJUST_FILE_PATH,buf, sizeof(buf),&lenRead);\r
+       ret=sscanf(buf,"%lf",&tempd);\r
+       LOGD("get Temperature Adjust  %.2lf , ret %d, readlen %d\n",tempd, ret,lenRead);\r
+    return tempd;\r
+\r
+}\r
+double getTemperature() {\r
+    double dtemp = 0.0f;\r
+    double dtemp_adjust = 0.0f;\r
+    int flag = getTemperatureValidFlag();\r
+    if (flag == 0) {\r
+        dtemp = getTemperatureOrigin();\r
+    //    dtemp_adjust = getTemperatureAdjustValue();\r
+        dtemp_adjust=adjust_temp_value(dtemp);\r
+        LOGD("get Temperature origin %.2lf , adjusted %.2lf !\n",dtemp,dtemp_adjust);\r
+    }else{\r
+               LOGD("get Temperature Flag  0x%x > 0 skip !\n",flag);\r
+       }\r
+\r
+\r
+       return dtemp_adjust;\r
+}\r
+\r
+\r
+double getTemperatureOrigin(){\r
+    int dev_fd;\r
+    int err = 0;\r
+    int tmp =0;\r
+    double dtemp=0.0f;\r
+    dev_fd = open(NST175_DEV_PATH_NAME , O_RDWR | O_SYNC);\r
+    if (dev_fd < 0) {\r
+               fprintf(stderr, "cannot open %s\n", NST175_DEV_PATH_NAME);\r
+        return 1;\r
+    }\r
+    LOGD(" GET_STEPCOUNT_ENABLE ioctl");\r
+    err = ioctl(dev_fd, ALSPS_GET_PS_DATA , &tmp);\r
+\r
+    if (err != 0) {\r
+        LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno));\r
+        return err;\r
+    }\r
+    close(dev_fd);\r
+\r
+    char buf[50]={0};\r
+       sprintf(buf,"%d.%d",((char*)&tmp)[1],((char*)&tmp)[0]);\r
+    sscanf(buf,"%lf",&dtemp);\r
+\r
+    return dtemp;\r
+}\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
+int setTemperatureValidFlag(int flag){\r
+\r
+    char buf[20]={0};\r
+    int ret=-1;\r
+    ret=sprintf(buf,"%d",flag);\r
+    write_file(NST175_TEMP_FLAG_FILE_PATH, buf,ret);\r
+    LOGD("set Temperature flag  0x%02x , ret %d, buf %s\n",flag, ret,buf);\r
+    return 0;\r
+}\r
+\r
+/*此操作仅仅为了检查标志状态设置成功与否,标志已经在内部被使用*/\r
+int getTemperatureValidFlag(){\r
+\r
+\r
+    char buf[20]={0};\r
+    int lenRead=0;\r
+    int tempd=0;\r
+    int ret=-1;\r
+    read_file(NST175_TEMP_FLAG_FILE_PATH,buf, sizeof(buf),&lenRead);\r
+    ret=sscanf(buf,"%d",&tempd);\r
+    LOGD("get Temperature flag  0x%02x , ret %d, readlen %d\n",tempd, ret,lenRead);\r
+    return tempd;\r
+\r
+}
\ No newline at end of file
diff --git a/app/src/main/libs/arm64-v8a/libICJniUtils.so b/app/src/main/libs/arm64-v8a/libICJniUtils.so
deleted file mode 100644 (file)
index 516607a..0000000
Binary files a/app/src/main/libs/arm64-v8a/libICJniUtils.so and /dev/null differ
index a677680..bb30186 100644 (file)
Binary files a/app/src/main/libs/armeabi-v7a/libICJniUtils.so and b/app/src/main/libs/armeabi-v7a/libICJniUtils.so differ
diff --git a/app/src/main/libs/x86/libICJniUtils.so b/app/src/main/libs/x86/libICJniUtils.so
deleted file mode 100644 (file)
index dbc7192..0000000
Binary files a/app/src/main/libs/x86/libICJniUtils.so and /dev/null differ
diff --git a/app/src/main/libs/x86_64/libICJniUtils.so b/app/src/main/libs/x86_64/libICJniUtils.so
deleted file mode 100644 (file)
index 32bfb5a..0000000
Binary files a/app/src/main/libs/x86_64/libICJniUtils.so and /dev/null differ
index 85734fd..8e98ce4 100644 (file)
         android:layout_height="match_parent"\r
         android:orientation="vertical">\r
 \r
+        <ScrollView\r
+            android:layout_width="match_parent"\r
+            android:layout_height="match_parent"\r
+            android:layout_weight="1">\r
+\r
+            <LinearLayout\r
+                android:layout_width="match_parent"\r
+                android:layout_height="wrap_content"\r
+                android:orientation="vertical">\r
+\r
+                <TextView\r
+                    android:id="@+id/sample_text"\r
+                    android:layout_width="wrap_content"\r
+                    android:layout_height="wrap_content"\r
+                    android:text="Hello World!"\r
+                    android:textSize="24sp" />\r
+            </LinearLayout>\r
+        </ScrollView>\r
+\r
         <LinearLayout\r
             android:layout_width="match_parent"\r
             android:layout_height="wrap_content"\r
                 android:text="ToggleButton"\r
                 android:textOff="SimOff"\r
                 android:textOn="SimOn" />\r
+\r
         </LinearLayout>\r
 \r
-        <TextView\r
-            android:id="@+id/sample_text"\r
-            android:layout_width="wrap_content"\r
-            android:layout_height="wrap_content"\r
-            android:text="Hello World!"\r
-            android:textSize="24sp" />\r
     </LinearLayout>\r
 \r
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file