}\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
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
<?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
\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
.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
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
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
# 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
\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
\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
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
#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
/***************计步控制************************************/\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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
--- /dev/null
+
+#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;
+}
+
+
+
-//#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
--- /dev/null
+#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
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