添加对SC7A21 的支持
authorsnickersun <scy@incartech.cn>
Thu, 21 May 2020 11:12:14 +0000 (19:12 +0800)
committersnickersun <scy@incartech.cn>
Thu, 21 May 2020 11:12:14 +0000 (19:12 +0800)
暂时不支持 save stepcount 和restore stepcount

app/src/main/jni/driverHal.c
app/src/main/jni/native-lib.c
app/src/main/libs/arm64-v8a/libICJniUtils.so
app/src/main/libs/armeabi-v7a/libICJniUtils.so
app/src/main/libs/x86/libICJniUtils.so
app/src/main/libs/x86_64/libICJniUtils.so

index cf6d352..078b1fb 100644 (file)
 #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(){
@@ -434,3 +492,152 @@ static int getPPGFromStr(char* buf,int* wared,int *ppg,int *spo2,int* bph,int* b
 }
 
 
+
+#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;
+}
index c607f77..24e082d 100644 (file)
 #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
+\r
 /***************计步控制************************************/\r
 /*运行此函数清除 系统计步为0*/\r
 //public static native int resetStepCount();\r
@@ -36,6 +42,17 @@ int qmax981_saveStepCount();
 //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
 /******心率,血压****************************************/\r
 /*检查 PPG硬件是否存在,返回 1 存在,0 不存在*/\r
 int isPPGavailable();\r
@@ -56,6 +73,10 @@ int getHighBloodPressure();
 int getLowBloodPressure();\r
 /*获取血氧值*/\r
 int getSPO2();\r
+\r
+\r
+\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
@@ -71,8 +92,18 @@ int getSPO2();
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_resetStepCount\r
         (JNIEnv *env, jclass jobj){\r
-\r
-    return qmax981_clearStepCount();\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_clearStepCount();\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_clearStepCount();\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
 }\r
 \r
 /*\r
@@ -82,7 +113,18 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_resetStepCount
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getStepCount\r
         (JNIEnv *env, jclass jobj){\r
-    return qmax981_getStepCount();\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_getStepCount();\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_getStepCount();\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
 }\r
 \r
 /*\r
@@ -92,7 +134,20 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getStepCount
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePedometer\r
         (JNIEnv *env, jclass jobj){\r
-    return qmax981_enable();\r
+\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_enable();\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_EnableStepCount();\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
+\r
 }\r
 \r
 \r
@@ -103,7 +158,18 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePedometer
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePedometer\r
         (JNIEnv *env, jclass jobj){\r
-    return qmax981_disable();\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_disable();\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_DisableStepCount();\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
 }\r
 \r
 /*\r
@@ -113,7 +179,18 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePedometer
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPedometerEnabled\r
         (JNIEnv *env, jclass jobj){\r
-    return qmax981_isStepCounterEnabled();\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_isStepCounterEnabled();\r
+        case SENSOR_SC7A21:\r
+            ret= sc7a21_isStepCounterEnabled();\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
 }\r
 \r
 /*\r
@@ -123,7 +200,19 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPedometerEnabled
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_saveStepCount\r
         (JNIEnv *env, jclass jobj){\r
-    return qmax981_saveStepCount();\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_saveStepCount();\r
+        case SENSOR_SC7A21:\r
+            ret= -1;\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
+\r
 }\r
 \r
 /*\r
@@ -133,7 +222,18 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_saveStepCount
  */\r
 JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_recoverStepCount\r
         (JNIEnv *env, jclass jobj){\r
-    return qmax981_recoverStepCount();\r
+    int sensorType;\r
+    int ret=0;\r
+    sensorType=getSensorType();\r
+    switch(sensorType) {\r
+        case SENSOR_QMA6981:\r
+            ret= qmax981_recoverStepCount();\r
+        case SENSOR_SC7A21:\r
+            ret= -1;\r
+        default:\r
+            break;\r
+    }\r
+    return ret;\r
 }\r
 \r
 \r
index 0210e30..baee189 100644 (file)
Binary files a/app/src/main/libs/arm64-v8a/libICJniUtils.so and b/app/src/main/libs/arm64-v8a/libICJniUtils.so differ
index 6f9fd5b..3fc7b1e 100644 (file)
Binary files a/app/src/main/libs/armeabi-v7a/libICJniUtils.so and b/app/src/main/libs/armeabi-v7a/libICJniUtils.so differ
index 59cf22e..5cbb021 100644 (file)
Binary files a/app/src/main/libs/x86/libICJniUtils.so and b/app/src/main/libs/x86/libICJniUtils.so differ
index 5a4f1b4..752b920 100644 (file)
Binary files a/app/src/main/libs/x86_64/libICJniUtils.so and b/app/src/main/libs/x86_64/libICJniUtils.so differ