From: snickersun Date: Sat, 4 Jul 2020 03:12:30 +0000 (+0800) Subject: 重新整理jni代码,区分为 ppg_ecg , temperature, stepcounter 三个模块 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=73c81bdde75cdfef07d9a06385c2bc63d672121e;p=ag3335m_download_demo.git 重新整理jni代码,区分为 ppg_ecg , temperature, stepcounter 三个模块 增加 sc7a21 ,nst175 的接口。 --- diff --git a/app/EQC_G5.jks b/app/EQC_G5.jks new file mode 100644 index 0000000..2229d46 Binary files /dev/null and b/app/EQC_G5.jks differ diff --git a/app/build.gradle b/app/build.gradle index b2f0b48..c1ebbc7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,11 +17,26 @@ android { } ndk{ + //ldLibs "log", "z", "m" moduleName"ICJniUtils" //生成的so文件名字,调用C程序的代码中会用到该名字 abiFilters 'armeabi-v7a' //, 'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' } } + signingConfigs { + key { + storeFile file("EQC_G5.jks") + storePassword "123456" + keyAlias "watch_g5" + keyPassword "123456" + } + debug { + storeFile file('EQC_G5.jks') + storePassword '123456' + keyAlias = 'watch_g5' + keyPassword '123456' + } + } packagingOptions { pickFirst 'META-INF/*' } @@ -37,10 +52,10 @@ android { version "3.10.2" } } -// sourceSets.main { + // sourceSets.main { // jniLibs.srcDir 'src/main/libs' -// jni.srcDirs = [] //disable automatic ndk-build call -// } + // jni.srcDirs = [] //disable automatic ndk-build call + // } } dependencies { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 85a6079..2182b78 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,10 @@ + package="com.ic.jni" + android:allowBackup="true" + android:persistent="true" + android:screenOrientation="portrait" + android:sharedUserId="android.uid.system"> //#include -#include "jni_interface/com.ic.jni.ICJniUtils.h" +#include "jni_interface/com_ic_jni_ICJniUtils.h" //extern "C" JNIEXPORT jstring JNICALL //Java_com_ic_protocol_MainActivity_stringFromJNI( // JNIEnv *env, @@ -10,11 +10,12 @@ // return env->NewStringUTF(hello.c_str()); //} // + + #ifdef __cplusplus extern "C" { #endif - #define SENSOR_UNKNOWN 0 #define SENSOR_QMA6981 1 #define SENSOR_SC7A21 2 @@ -22,68 +23,71 @@ extern "C" { /***************计步控制************************************/ /*运行此函数清除 系统计步为0*/ //public static native int resetStepCount(); -int qmax981_clearStepCount(); +int resetStepCount(); /*获取当前步数*/ //public static native int getStepCount(); -int qmax981_getStepCount(); +int getStepCount(); /*开启计步*/ //public static native int enablePedometer(); -int qmax981_enable(); +int enablePedometer(); /*停止计步*/ //public static native int disablePedometer(); -int qmax981_disable(); +int disablePedometer(); /*检测计步当前是否开启 1开启,0 关闭*/ //public static native int isPedometerEnabled(); -int qmax981_isStepCounterEnabled(); +int isPedometerEnabled(); /*保存当前步数(getStepCount取得的值)到磁盘*/ //public static native int saveStepCount(); -int qmax981_saveStepCount(); +int saveStepCount(); /*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加*/ //public static native int recoverStepCount(); -int qmax981_recoverStepCount(); - - - - -int sc7a21_isStepCounterEnabled(); -int sc7a21_DisableStepCount(); -int sc7a21_EnableStepCount(); -int sc7a21_clearStepCount(); -int sc7a21_getStepCount(); -int getSensorType(); +int recoverStepCount(); /******心率,血压****************************************/ /*检查 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(); +/******获取体温****************************************/ +/* 返回-2 如果不支持, -1 读取失败或者超出范围 */ +double getTemperature(); +double getTemperatureOrigin(); +int setTemperatureAdjustValue(double value); -#ifdef __cplusplus -} -#endif - +double getTemperatureAdjustValue(); +int setTemperatureValidFlag(int flag); +int getTemperatureValidFlag(); +double get_bodytemp_from_wristtemp(double wrist_temp, double env_temp); /* * Class: com_ic_jni_ICJniUtils @@ -91,21 +95,9 @@ int getSPO2(); * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_resetStepCount - (JNIEnv *env, jclass jobj){ - int sensorType; - int ret=0; - sensorType=getSensorType(); - switch(sensorType) { - case SENSOR_QMA6981: - ret= qmax981_clearStepCount(); - break; - case SENSOR_SC7A21: - ret= sc7a21_clearStepCount(); - break; - default: - break; - } - return ret; + (JNIEnv *env, jclass jobj) { + + return resetStepCount(); } /* @@ -114,21 +106,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_resetStepCount * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getStepCount - (JNIEnv *env, jclass jobj){ - int sensorType; - int ret=0; - sensorType=getSensorType(); - switch(sensorType) { - case SENSOR_QMA6981: - ret= qmax981_getStepCount(); - break; - case SENSOR_SC7A21: - ret= sc7a21_getStepCount(); - break; - default: - break; - } - return ret; + (JNIEnv *env, jclass jobj) { + return getStepCount(); } /* @@ -137,22 +116,9 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getStepCount * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePedometer - (JNIEnv *env, jclass jobj){ - - int sensorType; - int ret=0; - sensorType=getSensorType(); - switch(sensorType) { - case SENSOR_QMA6981: - ret= qmax981_enable(); - break; - case SENSOR_SC7A21: - ret= sc7a21_EnableStepCount(); - break; - default: - break; - } - return ret; + (JNIEnv *env, jclass jobj) { + + return enablePedometer(); } @@ -163,21 +129,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePedometer * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePedometer - (JNIEnv *env, jclass jobj){ - int sensorType; - int ret=0; - sensorType=getSensorType(); - switch(sensorType) { - case SENSOR_QMA6981: - ret= qmax981_disable(); - break; - case SENSOR_SC7A21: - ret= sc7a21_DisableStepCount(); - break; - default: - break; - } - return ret; + (JNIEnv *env, jclass jobj) { + return disablePedometer(); } /* @@ -186,21 +139,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePedometer * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPedometerEnabled - (JNIEnv *env, jclass jobj){ - int sensorType; - int ret=0; - sensorType=getSensorType(); - switch(sensorType) { - case SENSOR_QMA6981: - ret= qmax981_isStepCounterEnabled(); - break; - case SENSOR_SC7A21: - ret= sc7a21_isStepCounterEnabled(); - break; - default: - break; - } - return ret; + (JNIEnv *env, jclass jobj) { + return isPedometerEnabled(); } /* @@ -209,21 +149,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPedometerEnabled * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_saveStepCount - (JNIEnv *env, jclass jobj){ - int sensorType; - int ret=0; - sensorType=getSensorType(); - switch(sensorType) { - case SENSOR_QMA6981: - ret= qmax981_saveStepCount(); - break; - case SENSOR_SC7A21: - ret= -1; - break; - default: - break; - } - return ret; + (JNIEnv *env, jclass jobj) { + return saveStepCount(); } @@ -233,21 +160,8 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_saveStepCount * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_recoverStepCount - (JNIEnv *env, jclass jobj){ - int sensorType; - int ret=0; - sensorType=getSensorType(); - switch(sensorType) { - case SENSOR_QMA6981: - ret= qmax981_recoverStepCount(); - break; - case SENSOR_SC7A21: - ret= -1; - break; - default: - break; - } - return ret; + (JNIEnv *env, jclass jobj) { + return recoverStepCount(); } @@ -257,7 +171,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_recoverStepCount * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGavailable - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return isPPGavailable(); } @@ -267,7 +181,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGavailable * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePPG - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return enablePPG(); } @@ -277,7 +191,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_enablePPG * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePPG - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return disablePPG(); } @@ -287,7 +201,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_disablePPG * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getPPG - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return getPPG(); } @@ -297,7 +211,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getPPG * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGStarted - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return isPPGStarted(); } @@ -307,7 +221,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isPPGStarted * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isWeared - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return isWeared(); } @@ -317,7 +231,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_isWeared * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getHighBloodPressure - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return getHighBloodPressure(); } @@ -327,7 +241,7 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getHighBloodPressure * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getLowBloodPressure - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return getLowBloodPressure(); } @@ -337,6 +251,90 @@ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getLowBloodPressure * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getSPO2 - (JNIEnv *env, jclass jobj){ + (JNIEnv *env, jclass jobj) { return getSPO2(); } + + +/* + * Class: com_ic_jni_ICJniUtils + * Method: getTemperature + * Signature: ()I + */ +JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperature + (JNIEnv *env, jclass jobj) { + + + return getTemperature(); + +} + +JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureOrigin + (JNIEnv *env, jclass jobj) { + + return getTemperatureOrigin(); +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: setTemperatureAdjustValue + * Signature: (D)I + */ +JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_setTemperatureAdjustValue + (JNIEnv *env, jclass jobj, jdouble value) { + + return setTemperatureAdjustValue(value); +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: getTemperatureAdjustValue + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureAdjustValue + (JNIEnv *env, jclass jobj) { + + return getTemperatureAdjustValue(); + +} + + + +/* + * Class: com_ic_jni_ICJniUtils + * Method: setTemperatureValidFlag + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_setTemperatureValidFlag + (JNIEnv *env, jclass jobj, jint flag) { + + return setTemperatureValidFlag(flag); +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: getTemperatureValidFlag + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_ic_jni_ICJniUtils_getTemperatureValidFlag + (JNIEnv *env, jclass jobj) { + + return getTemperatureValidFlag(); + +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: getBodyTempFromWristTemp + * Signature: (DD)D + */ +JNIEXPORT jdouble JNICALL Java_com_ic_jni_ICJniUtils_getBodyTempFromWristTemp + (JNIEnv *env, jclass jobj, jdouble wrist_temp, jdouble ref_temp){ + return get_bodytemp_from_wristtemp(wrist_temp,26.0f); +} + + +#ifdef __cplusplus +} +#endif + diff --git a/app/src/main/jni/ppg_ecg_hal.c b/app/src/main/jni/ppg_ecg_hal.c new file mode 100644 index 0000000..562e661 --- /dev/null +++ b/app/src/main/jni/ppg_ecg_hal.c @@ -0,0 +1,578 @@ + +#include + +#include +#include +#include +#include + +#include "jni.h" + +#include +#include +#include +#include + + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#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; +} + + + diff --git a/app/src/main/jni/driverHal.c b/app/src/main/jni/stepcounter_hal.c similarity index 60% rename from app/src/main/jni/driverHal.c rename to app/src/main/jni/stepcounter_hal.c index 078b1fb..9e0cf2e 100644 --- a/app/src/main/jni/driverHal.c +++ b/app/src/main/jni/stepcounter_hal.c @@ -1,643 +1,665 @@ -//#include -//#include -//#include -//#include -//#include /*�������������open() read() close() write()��*/ -#include - -//#include -#include -#include -#include -#include - -//#include "JNIHelp.h" -#include "jni.h" -//#include -//#include "android_runtime/AndroidRuntime.h" - - -#include -#include -#include -#include - - - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#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 + + +#include +#include +#include +#include + +#include +#include +#include +#include + + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#if 0 +#define ANDROID_LOG_INFO "/I" +#define ANDROID_LOG_ERROR "/E" +#define ANDROID_LOG_DEBUG "/D" +#define LOG_TAG "ParameterUtil" +#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 + +/*运行此函数清除 系统计步为0*/ +//public static native int resetStepCount(); +int resetStepCount(); +/*获取当前步数*/ +//public static native int getStepCount(); +int getStepCount(); +/*开启计步*/ +//public static native int enablePedometer(); +int enablePedometer(); +/*停止计步*/ +//public static native int disablePedometer(); +int disablePedometer(); +/*检测计步当前是否开启 1开启,0 关闭*/ +//public static native int isPedometerEnabled(); +int isPedometerEnabled(); +/*保存当前步数(getStepCount取得的值)到磁盘*/ +//public static native int saveStepCount(); +int saveStepCount(); +/*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加*/ +//public static native int recoverStepCount(); +int recoverStepCount(); + + +#define SENSOR_UNKNOWN 0 +#define SENSOR_QMA6981 1 +#define SENSOR_SC7A21 2 + +/***************计步控制************************************/ +/*运行此函数清除 系统计步为0*/ +//public static native int resetStepCount(); +int qmax981_clearStepCount(); +/*获取当前步数*/ +//public static native int getStepCount(); +int qmax981_getStepCount(); +/*开启计步*/ +//public static native int enablePedometer(); +int qmax981_enable(); +/*停止计步*/ +//public static native int disablePedometer(); +int qmax981_disable(); +/*检测计步当前是否开启 1开启,0 关闭*/ +//public static native int isPedometerEnabled(); +int qmax981_isStepCounterEnabled(); +/*保存当前步数(getStepCount取得的值)到磁盘*/ +//public static native int saveStepCount(); +int qmax981_saveStepCount(); +/*恢复保存时的步数数据,下次getStepCount会在恢复的值上增加*/ +//public static native int recoverStepCount(); +int qmax981_recoverStepCount(); + + + + +int sc7a21_isStepCounterEnabled(); +int sc7a21_DisableStepCount(); +int sc7a21_EnableStepCount(); +int sc7a21_clearStepCount(); +int sc7a21_getStepCount(); +int getSensorType(); + + +#ifdef __cplusplus +} +#endif + + + +#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 + +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 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; +} + + +/* + * Class: com_ic_jni_ICJniUtils + * Method: resetStepCount + * Signature: ()I + */ +int resetStepCount(){ + int sensorType; + int ret=0; + sensorType=getSensorType(); + switch(sensorType) { + case SENSOR_QMA6981: + ret= qmax981_clearStepCount(); + break; + case SENSOR_SC7A21: + ret= sc7a21_clearStepCount(); + break; + default: + ret = -1; + break; + } + return ret; +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: getStepCount + * Signature: ()I + */ +int getStepCount(){ + int sensorType; + int ret=0; + sensorType=getSensorType(); + switch(sensorType) { + case SENSOR_QMA6981: + ret= qmax981_getStepCount(); + break; + case SENSOR_SC7A21: + ret= sc7a21_getStepCount(); + break; + default: + ret = -1; + break; + } + return ret; +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: enablePedometer + * Signature: ()I + */ +int enablePedometer(){ + + int sensorType; + int ret=0; + sensorType=getSensorType(); + switch(sensorType) { + case SENSOR_QMA6981: + ret= qmax981_enable(); + break; + case SENSOR_SC7A21: + ret= sc7a21_EnableStepCount(); + break; + default: + ret = -1; + break; + } + return ret; + +} + + +/* + * Class: com_ic_jni_ICJniUtils + * Method: disablePedometer + * Signature: ()I + */ +int disablePedometer(){ + int sensorType; + int ret=0; + sensorType=getSensorType(); + switch(sensorType) { + case SENSOR_QMA6981: + ret= qmax981_disable(); + break; + case SENSOR_SC7A21: + ret= sc7a21_DisableStepCount(); + break; + default: + ret = -1; + break; + } + return ret; +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: isPedometerEnabled + * Signature: ()I + */ +int isPedometerEnabled(){ + int sensorType; + int ret=0; + sensorType=getSensorType(); + switch(sensorType) { + case SENSOR_QMA6981: + ret= qmax981_isStepCounterEnabled(); + break; + case SENSOR_SC7A21: + ret= sc7a21_isStepCounterEnabled(); + break; + default: + break; + } + return ret; +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: saveStepCount + * Signature: ()I + */ +int saveStepCount(){ + int sensorType; + int ret=0; + sensorType=getSensorType(); + switch(sensorType) { + case SENSOR_QMA6981: + ret= qmax981_saveStepCount(); + break; + case SENSOR_SC7A21: + ret= -1; + break; + default: + break; + } + return ret; + +} + +/* + * Class: com_ic_jni_ICJniUtils + * Method: recoverStepCount + * Signature: ()I + */ +int recoverStepCount(){ + int sensorType; + int ret=0; + sensorType=getSensorType(); + switch(sensorType) { + case SENSOR_QMA6981: + ret= qmax981_recoverStepCount(); + break; + case SENSOR_SC7A21: + ret= -1; + break; + default: + break; + } + return ret; +} diff --git a/app/src/main/jni/temperature_hal.c b/app/src/main/jni/temperature_hal.c new file mode 100644 index 0000000..4fee21f --- /dev/null +++ b/app/src/main/jni/temperature_hal.c @@ -0,0 +1,283 @@ +#include + + +#include +#include +#include +#include + +#include +#include +#include +#include + + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#if 0 +#define ANDROID_LOG_INFO "/I" +#define ANDROID_LOG_ERROR "/E" +#define ANDROID_LOG_DEBUG "/D" +#define LOG_TAG "ParameterUtil" +#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__) + +/******获取体温****************************************/ +/* 返回-2 如果不支持, -1 读取失败或者超出范围 */ +double getTemperature(); +double getTemperatureOrigin(); +int setTemperatureAdjustValue(double value); +double getTemperatureAdjustValue(); +/*设置当前温度标志位,实际上就是按照二进制位来定义的。 + 0、可以测温 + 第一位为1,0x1、充电超过2分钟或者充电超过2分钟后拔除5分钟内 0001 + 第二位为1,0x2、亮屏超过5分钟或者亮屏超过5分钟后灭屏5分钟内 0010 + 第三位为1,0x4、通话超过2分钟或者通话超过2分钟后挂断5分钟内 0100 + 所有大于0的都不能测温 */ +int setTemperatureValidFlag(int flag); + +/*此操作仅仅为了检查标志状态设置成功与否,标志已经在内部被使用*/ +int getTemperatureValidFlag(); + +#define LTR_IOCTL_MAGIC 0x1C +#define ALSPS_GET_PS_DATA _IOR(LTR_IOCTL_MAGIC, 3, unsigned char) + +#define NST175_DEV_PATH_NAME "/dev/nst175" +#define NST175_TEMP_ADJUST_FILE_PATH "/productinfo/temp_adjust_37.txt" +#define NST175_TEMP_FLAG_FILE_PATH "/productinfo/temp_flag.txt" + + +///2G 温度校准 + +#define EPSINON 0.001f + +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}; +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}; + +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}; +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}; + + + +double adjust_temp_value(double input_temp){ + double body_temp; + body_temp=input_temp; + if ((body_temp-area[1]) < -EPSINON) + { + body_temp += compensation[0]; + } + else if ((body_temp-area[2]) < -EPSINON) + { + body_temp += compensation[1]; + } + else if ((body_temp-area[3]) < -EPSINON) + { + body_temp += compensation[2]; + } + else if ((body_temp-area[4]) < -EPSINON) + { + body_temp += compensation[3]; + } + else if ((body_temp-area[5]) < -EPSINON) + { + body_temp += compensation[4]; + } + else if ((body_temp-area[6]) < -EPSINON) + { + body_temp += compensation[5]; + } + else if ((body_temp-area[7]) < -EPSINON) + { + body_temp += compensation[6]; + } + else if ((body_temp-area[8]) < -EPSINON) + { + body_temp += compensation[7]; + } + else if ((body_temp-area[9]) < -EPSINON) + { + body_temp += compensation[8]; + } + else if ((body_temp-area[10]) < -EPSINON) + { + body_temp += compensation[9]; + } + else if ((body_temp-area[11]) < -EPSINON) + { + body_temp += compensation[10]; + } + else if ((body_temp-area[12]) < -EPSINON) + { + body_temp += compensation[11]; + } + else if((body_temp-area[13]) < -EPSINON) + { + body_temp += compensation[12]; + } + else + { + body_temp += compensation[13]; + } + + return body_temp; +} + +double get_bodytemp_from_wristtemp(double wrist_temp, double env_temp){ + double environment_temp,body_temp; + environment_temp = env_temp; +// body_temp = 0.02411 * body_temp * body_temp * body_temp - 2.288 * body_temp * body_temp - 0.004356 *body_temp * body_temp * environment_temp +// + 0.2851 * body_temp * environment_temp - 4.702 * environment_temp + 72.46 * body_temp - 728.9; + body_temp = 0.02411 * wrist_temp * wrist_temp * wrist_temp - 2.288 * wrist_temp * wrist_temp - 0.004356 *wrist_temp * wrist_temp * environment_temp + + 0.2851 * wrist_temp * environment_temp - 4.702 * environment_temp + 72.46 * wrist_temp - 728.9 ; + + LOGD("input wrist_temp %.2lf , env temp %.2lf, output body temp %.2lf\n",wrist_temp,env_temp,body_temp); + return body_temp; +} +///温度校准 Ennd + +static int write_file(char* filepath,char* buf,int len); +static int read_file(char* filepath , char* buf, int buflen,int* len); + +static int write_file(char* filepath,char* buf,int len){ + int fd=open(filepath,O_WRONLY|O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); + + 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\n",buf , *len); + close(fd); + return 0; +} +int setTemperatureAdjustValue(double value) +{ + char buf[20]={0}; + int ret=-1; + ret=sprintf(buf,"%.2lf",value); + write_file(NST175_TEMP_ADJUST_FILE_PATH, buf,ret); + LOGD("set Temperature Adjust %.2lf , ret %d, buf %s\n",value, ret,buf); + return 0; +} +double getTemperatureAdjustValue(){ + + char buf[20]={0}; + int lenRead=0; + double tempd=0.0f; + int ret=-1; + read_file(NST175_TEMP_ADJUST_FILE_PATH,buf, sizeof(buf),&lenRead); + ret=sscanf(buf,"%lf",&tempd); + LOGD("get Temperature Adjust %.2lf , ret %d, readlen %d\n",tempd, ret,lenRead); + return tempd; + +} +double getTemperature() { + double dtemp = 0.0f; + double dtemp_adjust = 0.0f; + int flag = getTemperatureValidFlag(); + if (flag == 0) { + dtemp = getTemperatureOrigin(); + // dtemp_adjust = getTemperatureAdjustValue(); + dtemp_adjust=adjust_temp_value(dtemp); + LOGD("get Temperature origin %.2lf , adjusted %.2lf !\n",dtemp,dtemp_adjust); + }else{ + LOGD("get Temperature Flag 0x%x > 0 skip !\n",flag); + } + + + return dtemp_adjust; +} + + +double getTemperatureOrigin(){ + int dev_fd; + int err = 0; + int tmp =0; + double dtemp=0.0f; + dev_fd = open(NST175_DEV_PATH_NAME , O_RDWR | O_SYNC); + if (dev_fd < 0) { + fprintf(stderr, "cannot open %s\n", NST175_DEV_PATH_NAME); + return 1; + } + LOGD(" GET_STEPCOUNT_ENABLE ioctl"); + err = ioctl(dev_fd, ALSPS_GET_PS_DATA , &tmp); + + if (err != 0) { + LOGE("CLEAR_STEPCOUNT failed (%s)", strerror(errno)); + return err; + } + close(dev_fd); + + char buf[50]={0}; + sprintf(buf,"%d.%d",((char*)&tmp)[1],((char*)&tmp)[0]); + sscanf(buf,"%lf",&dtemp); + + return dtemp; +} + +/*设置当前温度标志位,实际上就是按照二进制位来定义的。 + 0、可以测温 + 第一位为1,0x1、充电超过2分钟或者充电超过2分钟后拔除5分钟内 0001 + 第二位为1,0x2、亮屏超过5分钟或者亮屏超过5分钟后灭屏5分钟内 0010 + 第三位为1,0x4、通话超过2分钟或者通话超过2分钟后挂断5分钟内 0100 + 所有大于0的都不能测温 */ +int setTemperatureValidFlag(int flag){ + + char buf[20]={0}; + int ret=-1; + ret=sprintf(buf,"%d",flag); + write_file(NST175_TEMP_FLAG_FILE_PATH, buf,ret); + LOGD("set Temperature flag 0x%02x , ret %d, buf %s\n",flag, ret,buf); + return 0; +} + +/*此操作仅仅为了检查标志状态设置成功与否,标志已经在内部被使用*/ +int getTemperatureValidFlag(){ + + + char buf[20]={0}; + int lenRead=0; + int tempd=0; + int ret=-1; + read_file(NST175_TEMP_FLAG_FILE_PATH,buf, sizeof(buf),&lenRead); + ret=sscanf(buf,"%d",&tempd); + LOGD("get Temperature flag 0x%02x , ret %d, readlen %d\n",tempd, ret,lenRead); + return tempd; + +} \ 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 index 516607a..0000000 Binary files a/app/src/main/libs/arm64-v8a/libICJniUtils.so and /dev/null differ diff --git a/app/src/main/libs/armeabi-v7a/libICJniUtils.so b/app/src/main/libs/armeabi-v7a/libICJniUtils.so index a677680..bb30186 100644 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 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 index 32bfb5a..0000000 Binary files a/app/src/main/libs/x86_64/libICJniUtils.so and /dev/null differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 85734fd..8e98ce4 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,6 +11,25 @@ android:layout_height="match_parent" android:orientation="vertical"> + + + + + + + + + - \ No newline at end of file