#include "helios_debug.h"
#define HX3918_ADDR 0x44
-#define HX3918_DEBUG 1
-#if HX3918_DEBUG == 1
-#define HX3918_LOG(msg, ...) custom_log("HX3918", msg, ##__VA_ARGS__)
-#endif
+
//#include "tyhx_hrs_custom.h"
#ifdef SAR_ALG_LIB
#include "hx3918_prox.h"
#include "hrv_testvec.h"
#endif
-#ifdef GSENSER_DATA
-//#include "lis3dh_drv.h"
-#endif
tyhx_hrsresult_t hrsresult;
#ifdef GSENSER_DATA
volatile int16_t gsen_fifo_x[32]; //ppg time 330ms..330/40 = 8.25
volatile int16_t gsen_fifo_y[32];
volatile int16_t gsen_fifo_z[32];
+int16_t gsen_fifo_count = 0;
#else
int16_t gen_dummy[32] = {0};
#endif
}
void hx3918_delay_us(uint32_t us)
{
-#ifdef TYHX_DEMO
- nrf_delay_us(us);
-#endif
- if(us < 1000)
- us =1000;
- Helios_msleep(us/1000);
+
+ if (us > 0) {
+ mp_hal_delay_us(us);
+ }
}
void hx3918_delay(uint32_t ms)
{
//readFifoByHrsModule();
#ifdef GSENSER_DATA
- uint8_t ii = 0;
- AxesRaw_t gsen_buf;
- if(work_mode_flag == WEAR_MODE)
+ // uint8_t ii = 0;
+ // AxesRaw_t gsen_buf;
+ // if(work_mode_flag == WEAR_MODE)
+ // {
+ // return;
+ // }
+
+ // //LIS3DH_GetAccAxesRaw(&gsen_buf);
+
+ // for(ii=0; ii<9; ii++)
+ // {
+ // gsen_fifo_x[ii] = gsen_fifo_x[ii+1];
+ // gsen_fifo_y[ii] = gsen_fifo_y[ii+1];
+ // gsen_fifo_z[ii] = gsen_fifo_z[ii+1];
+ // }
+ // gsen_fifo_x[9] = gsen_buf.AXIS_X>>1;
+ // gsen_fifo_y[9] = gsen_buf.AXIS_Y>>1;
+ // gsen_fifo_z[9] = gsen_buf.AXIS_Z>>1;
+ // //SEGGER_RTT_printf(0,"gsen_x=%d gsen_y=%d gsen_z=%d\r\n", \
+ // gsen_fifo_x[9],gsen_fifo_y[9],gsen_fifo_z[9]);
+#endif
+}
+// volatile int16_t gsen_fifo_x[32]; //ppg time 330ms..330/40 = 8.25
+// volatile int16_t gsen_fifo_y[32];
+// volatile int16_t gsen_fifo_z[32];
+void hx3918_set_gsen_fifo(short *x,short *y,short *z, int count)
+{
+
+ if(count > sizeof(gsen_fifo_y))
{
- return;
+ count = sizeof(gsen_fifo_y);
}
+ for(int i = 0;i<count;i++)
+ {
- LIS3DH_GetAccAxesRaw(&gsen_buf);
-
- for(ii=0; ii<9; ii++)
+ gsen_fifo_x[i] =x[i];
+ gsen_fifo_y[i] =y[i];
+ gsen_fifo_z[i] =z[i];
+ //HX3918_LOG("count: %d %03d gsen_fifo_x:%d gsen_fifo_y:%d gsen_fifo_z:%d\n",count,i,gsen_fifo_x[i],gsen_fifo_y[i],gsen_fifo_z[i]);
+ }
+ gsen_fifo_count = count;
+}
+void hx3918_get_gsen_fifo(short *x, short *y,short *z,int count)
+{
+ int16_t gsen_fifo_x_tmp[32]= {0};
+ int16_t gsen_fifo_y_tmp[32]= {0};
+ int16_t gsen_fifo_z_tmp[32]= {0};
+
+ if(gsen_fifo_count > sizeof(gsen_fifo_x_tmp))
+ gsen_fifo_count = sizeof(gsen_fifo_x_tmp);
+ for(int i = 0;i<gsen_fifo_count;i++)//备份
{
- gsen_fifo_x[ii] = gsen_fifo_x[ii+1];
- gsen_fifo_y[ii] = gsen_fifo_y[ii+1];
- gsen_fifo_z[ii] = gsen_fifo_z[ii+1];
+ gsen_fifo_x_tmp[i] = gsen_fifo_x[i] ;
+ gsen_fifo_y_tmp[i] = gsen_fifo_y[i];
+ gsen_fifo_z_tmp[i] = gsen_fifo_z[i];
}
- gsen_fifo_x[9] = gsen_buf.AXIS_X>>1;
- gsen_fifo_y[9] = gsen_buf.AXIS_Y>>1;
- gsen_fifo_z[9] = gsen_buf.AXIS_Z>>1;
- //SEGGER_RTT_printf(0,"gsen_x=%d gsen_y=%d gsen_z=%d\r\n", \
- gsen_fifo_x[9],gsen_fifo_y[9],gsen_fifo_z[9]);
-#endif
+ if(count > sizeof(gsen_fifo_y))
+ count = sizeof(gsen_fifo_y);
+
+ for(int i = 0;i<count;i++)//复制
+ {
+ if(i<gsen_fifo_count)
+ {
+ x[i] = gsen_fifo_x[i];
+ y[i] = gsen_fifo_y[i];
+ z[i] = gsen_fifo_z[i];
+ }else
+ {
+ x[i] = gsen_fifo_x[gsen_fifo_count-1];
+ y[i] = gsen_fifo_y[gsen_fifo_count-1];
+ z[i] = gsen_fifo_z[gsen_fifo_count-1];
+ }
+
+ }
+ if(gsen_fifo_count > count)//移位
+ {
+ for(int i = 0;i<gsen_fifo_count-count;i++)
+ {
+ gsen_fifo_x[i] = gsen_fifo_x_tmp[count+i];
+ gsen_fifo_y[i] = gsen_fifo_y_tmp[count+i];
+ gsen_fifo_z[i] = gsen_fifo_z_tmp[count+i];
+ }
+ gsen_fifo_count -= count;
+ }
+
}
-
void agc_timeout_handler(void * p_context)
{
#ifdef TIMMER_MODE
#ifndef GSEN_40MS_TIMMER
readFifoByHrsModule();
#endif
+ hx3918_get_gsen_fifo(gsen_fifo_x_send,gsen_fifo_y_send,gsen_fifo_z_send,*count);
for(ii=0; ii<*count; ii++)
{
#ifdef GSENSER_DATA
- gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];
- gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];
- gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];
+ // gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];
+ // gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];
+ // gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];
+
#endif
- //HX3918_LOG("%d %d %d %d %d %d\r\n", PPG_buf[ii],ir_buf[ii],gsen_fifo_x[ii],gsen_fifo_y[ii],gsen_fifo_z[ii],hrs_s_dat.agc_green);
+ //HX3918_LOG("ppg_Int_handle:%d %d %d %d %d %d\r\n", PPG_buf[ii],ir_buf[ii],gsen_fifo_x_send[ii],gsen_fifo_y_send[ii],gsen_fifo_z_send[ii]);
}
hrs_wear_status = hx3918_hrs_get_wear_status();
hrsresult.wearstatus = hrs_wear_status;
#ifdef CHECK_TOUCH_LIB
+uint8_t hx3918_get_wear_ppg_Int_handle(void)
+{
+ uint8_t count = 0;
+ hx3918_wear_msg_code_t hx3918_check_mode_status = MSG_NO_WEAR;
+ count = hx3918_check_touch_read(&ppg_s_dat);
+ hx3918_check_mode_status = hx3918_check_touch(ppg_s_dat.s_buf,count);
+ hrsresult.wearstatus = hx3918_check_mode_status;
+ HX3918_LOG("wearstatus:%d\n",hrsresult.wearstatus);
+ if((count)&&(hrsresult.wearstatus == 0))
+ {
+ HX3918_LOG("count = %d, ir = %d\r\n",count,ppg_s_dat.s_buf[count-1]);
+ return 0;
+ }else
+ return 1;
+}
void hx3918_wear_ppg_Int_handle(void)
{
uint8_t count = 0;
--- /dev/null
+/**************************************************************************
+ @file Hsensor_HX3918.c
+ @brief Gsensor.
+
+
+**************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+// Includes
+//////////////////////////////////////////////////////////////////////////////
+#include "autoconf.h"
+#include <stdio.h>
+#include "runtime.h"
+#include <stdlib.h>
+#include <math.h>
+#include "mphalport.h"
+#include "compile.h"
+#include "repl.h"
+#include "mperrno.h"
+#include "binary.h"
+
+#include <string.h>
+
+#if CONFIG_HX3918
+
+#include "helios_gpio.h"
+#include "helios_iic.h"
+#include "helios_lcd.h"
+#include "helios_fs.h"
+#include "helios_pin.h"
+#include "helios_timer.h"
+
+
+
+#include "helios_debug.h"
+#include "hx3918.h"
+#include "autoconf.h"
+extern void sensor_thread_entry(void * argv);
+extern Helios_ThreadAttr ThreadAttr;
+extern Helios_Thread_t sensor_thread_id ;
+#define HX3918_LOG(msg, ...) custom_log("HX3918", msg, ##__VA_ARGS__)
+//////////////////////////////////////////////////////////////////////////////
+typedef struct _HX3918_obj_t
+{
+ mp_obj_base_t base;
+
+ uint8_t i2c_no;
+ uint8_t i2c_mode;
+ uint8_t irq;
+ uint8_t power;
+
+} HX3918_obj_t;
+
+STATIC HX3918_obj_t *g_HX3918 = NULL;
+static unsigned char is_HX3918 = 0;//是否存在IC
+static unsigned char is_open_HX3918 = 0; //是否打开测试
+static unsigned char s_HX3918_heart_rate = 0x0;//心律
+static unsigned char s_HX3918_high_blood = 0x0;//血压/高压
+static unsigned char s_HX3918_low_blood = 0x0;//血压/低压
+static unsigned char s_HX3918_blood_oxygen = 0x0;//血氧
+static unsigned char s_HX3918_HRV = 0x0;//hrv
+static unsigned char s_HX3918_wear_status = 0;//佩戴状态
+#define HEART_RATE_BUFF_LEN 10
+unsigned char s_HX3918_heart_rate_buff[HEART_RATE_BUFF_LEN]={0};
+unsigned short s_HX3918_heart_rate_buff_count = 0;
+
+char HX3918_sleep_flag = 0;
+#include "helios_extint.h"
+
+int sensor_timer = 0;
+#define TIMER_TIME_MS 100 //10ms
+#define IS_CYCLICAL 1
+uint8_t HX3918_irq_flag = 0;
+uint32_t HX3918_run_mode = NULL_MODE;
+uint32_t HX3918_jobs_mode = NULL_MODE;
+#define RUN_MODE_CLOSE 0xffff
+static uint32_t timer_Gsensor_count = 0;
+#if CONFIG_SC7A20
+extern int SC7A20_init(void);
+extern signed char SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void);
+extern unsigned char Gsensor_init_flag ;
+
+#endif
+int ir_wear = 0;//红外佩戴状态
+int cap_wear = 0;//电容佩戴状态
+int wear_time = 0;
+// int test_count1 = 0;
+// int test_count2 = 0;
+void HX3918_test(uint32_t mode);
+void HX3918_close(void);
+void sensor_timerout_cb(void);
+
+void HX3918_thread_do(void)
+{
+ if(HX3918_run_mode == close_MODE)
+ {
+ HX3918_close();
+ //HX3918_LOG("HX3918_irq_cb: 1111111111111!!!!!!!!\r\n");
+ HX3918_run_mode = NULL_MODE;
+ HX3918_jobs_mode = NULL_MODE;
+ hx3918_ppg_timerout_flag = 0;
+ hx3918_agc_timerout_flag = 0;
+ return;
+ }
+ if(HX3918_run_mode != NULL_MODE )
+ {
+ if(HX3918_jobs_mode != NULL_MODE)//没关闭就打开其他模式,先关闭一次
+ {
+ HX3918_close();
+ Helios_msleep(20);
+ HX3918_jobs_mode = NULL_MODE;
+ }
+ HX3918_test(HX3918_run_mode);
+ HX3918_jobs_mode = HX3918_run_mode;
+ HX3918_run_mode = NULL_MODE;
+ }
+ if(is_HX3918 == 1 && is_open_HX3918 == 1)//处理Hsensor定时数据
+ {
+
+ if(hx3918_ppg_timerout_flag)
+ {
+ hx3918_ppg_Int_handle();
+ hx3918_ppg_timerout_flag = 0;
+ }
+ if(hx3918_agc_timerout_flag)
+ {
+ agc_timeout_handler(NULL);
+ hx3918_agc_timerout_flag =0;
+ }
+ if(timer_Gsensor_count>(500/TIMER_TIME_MS))//0.5秒定时,轮询更新Gsensor数据
+ {
+ timer_Gsensor_count = 0;
+ //Helios_msleep(5);
+ #if CONFIG_SC7A20
+ SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO();
+ #endif
+
+ }
+ }
+ else
+ {
+ // if(hx3918_ppg_timerout_flag)//测试模式
+ // {
+ // hx3918_ppg_Int_handle();
+ // hx3918_ppg_timerout_flag = 0;
+ // }
+ wear_time++;
+ if(wear_time > 3)
+ {
+ wear_time = 0;
+ ir_wear = hx3918_get_wear_ppg_Int_handle();
+ cap_wear = hx3918_report_prox_status();
+ HX3918_LOG("ir_wear:%d cap_wear%d\n",ir_wear,cap_wear);
+ }
+
+ #if CONFIG_SC7A20
+ if(ir_wear == 1 || cap_wear==1)
+ SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO();
+ #endif
+ Helios_msleep(1000);
+
+ if(HX3918_sleep_flag == 1)
+ {
+ HX3918_sleep_flag = 0;
+ Helios_msleep(3000);
+ }
+ }
+ Helios_msleep(5);
+
+}
+void HX3918_result_set_heart_rate(unsigned char heart_rate)
+{
+// s_HX3918_heart_rate_buff[HEART_RATE_BUFF_LEN]={0};
+// uint16 s_HX3918_heart_rate_buff_count = 0;
+ uint32_t i,tmp = 0;
+ s_HX3918_heart_rate_buff[s_HX3918_heart_rate_buff_count] = heart_rate;
+ s_HX3918_heart_rate_buff_count++;
+ for(i=0;i<s_HX3918_heart_rate_buff_count;i++)//算总和,取平均值
+ {
+ tmp+=s_HX3918_heart_rate_buff[i];
+ }
+ s_HX3918_heart_rate = tmp/s_HX3918_heart_rate_buff_count;//取平均值
+ //s_HX3918_heart_rate = heart_rate;
+ if(s_HX3918_heart_rate_buff_count >= HEART_RATE_BUFF_LEN)
+ s_HX3918_heart_rate_buff_count = 0;
+ s_HX3918_high_blood = (uint8_t)(heart_rate * 1.5);
+
+ s_HX3918_low_blood = (uint8_t)(heart_rate * 0.95);
+}
+void HX3918_result_set_wear_status(unsigned char wear_status)
+{
+ s_HX3918_wear_status = wear_status;
+}
+void HX3918_result_set_blood_oxygen(unsigned char blood_oxygen)
+{
+ s_HX3918_blood_oxygen = blood_oxygen;
+}
+
+void HX3918_result_set_hrv(unsigned char hrv)
+{
+ s_HX3918_HRV = hrv;
+}
+STATIC mp_obj_t mp_activate_HX3918(mp_obj_t self_in)
+{
+ HX3918_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ g_HX3918 = self;
+ return mp_const_none;
+}
+
+STATIC mp_obj_t HX3918_make_new(const mp_obj_type_t *type,
+ size_t n_args,
+ size_t n_kw,
+ const mp_obj_t *all_args)
+{
+ enum{
+ ARG_i2c_no,
+ ARG_i2c_mode,
+ ARG_irq,
+ ARG_power,
+ };
+
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_i2c_no, MP_ARG_INT, {.u_int = 0}},
+ { MP_QSTR_i2c_mode, MP_ARG_INT, {.u_int = 1}},
+ { MP_QSTR_irq, MP_ARG_INT, {.u_int = 27}},
+ { MP_QSTR_power, MP_ARG_INT, {.u_int = 30}},
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+ HX3918_obj_t *self = m_new_obj(HX3918_obj_t);
+ self->base.type = type;
+
+ self->i2c_no = args[ARG_i2c_no].u_int;
+ self->i2c_mode = args[ARG_i2c_mode].u_int;
+ self->irq = args[ARG_irq].u_int;
+
+ self->power = args[ARG_power].u_int;
+ return MP_OBJ_FROM_PTR(self);
+}
+
+STATIC mp_obj_t mp_HX3918_init(mp_obj_t self_in);
+STATIC mp_obj_t mp_HX3918_deinit(mp_obj_t self_in);
+
+
+
+
+void sensor_timerout_cb(void)
+{
+ timer_Gsensor_count++;
+}
+void HX3918_irq_cb(void)
+{
+ HX3918_irq_flag = 1;
+ //HX3918_LOG("HX3918_irq_cb: 1111111111111!!!!!!!!\r\n");
+ Helios_ExtInt_Enable(g_HX3918->irq);
+}
+/*
+**函数名:HX3918_Init
+**功能:初始化HX3918
+*/
+mp_obj_t mp_HX3918_init(mp_obj_t self_in)
+{
+ HX3918_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ g_HX3918 = self;
+ mp_activate_HX3918(self_in);
+ uint8_t index = 0;
+ uint8_t device_id = 0;
+ Helios_GPIOInitStruct gpio_struct = {0};
+ gpio_struct.dir = HELIOS_GPIO_INPUT;
+ gpio_struct.pull = HELIOS_PULL_UP;
+ gpio_struct.value = HELIOS_LVL_LOW;
+
+ // ret = Helios_GPIO_Init((Helios_GPIONum) self->irq, &gpio_struct);
+ // HX3918_LOG("cst816 irq=%d, irq ret: %d\n", self->irq, ret);
+
+ gpio_struct.pull = HELIOS_PULL_NONE;
+ gpio_struct.dir = HELIOS_GPIO_OUTPUT;
+ Helios_GPIO_Init(self->power, &gpio_struct);//ldo
+
+ gpio_struct.dir = HELIOS_GPIO_OUTPUT;
+ gpio_struct.pull = HELIOS_PULL_NONE;
+ gpio_struct.value = HELIOS_LVL_LOW;
+ //Helios_GPIO_Init(25, &gpio_struct);//体温
+ Helios_GPIO_Init(31, &gpio_struct);//复位
+
+ gpio_struct.dir = HELIOS_GPIO_INPUT;
+ gpio_struct.pull = HELIOS_PULL_NONE;
+ gpio_struct.value = HELIOS_LVL_LOW;
+ Helios_GPIO_Init(self->irq, &gpio_struct);//IRQ
+
+ Helios_ExtInt_Deinit(self->irq);//关闭中断
+ Helios_ExtIntStruct extint_struct1 = {0};
+ // Helios_TriggerMode gpio_trigger; //GPIO interrupt trigger mode (0-EDGE_TRIGGER 1-LEVEL_TRIGGER)
+ // Helios_DebounceMode gpio_debounce; //GPIO interrupt trigger debounce enable/disable (0-disable 1-enable)
+ // Helios_EdgeMode gpio_edge; //GPIO interrupt edge/level trigger configure (0-EDGE_RISING 1-EDGE_FALLING 2-EDGE_BOTH)
+ // Helios_PullMode gpio_pull; //GPIO get input pull (0-PULL_NONE 1-PULL_UP 2-PULL_DOWN)
+ // void *eint_cb; //GPIO interrupt cb
+ // void *wakeup_eint_cb; //GPIO interrupt cb_ctx
+ extint_struct1.gpio_trigger = HELIOS_EDGE_TRIGGER;
+ extint_struct1.gpio_edge = HELIOS_EDGE_RISING;
+ extint_struct1.gpio_debounce = HELIOS_DEBOUNCE_EN;
+ extint_struct1.gpio_pull = HELIOS_PULL_NONE;
+ extint_struct1.eint_cb = HX3918_irq_cb;
+ extint_struct1.wakeup_eint_cb = NULL;
+
+
+ Helios_I2C_Init((Helios_I2CEnum)self->i2c_no, HELIOS_FAST_MODE);
+ Helios_GPIO_SetLevel(self->power, HELIOS_LVL_LOW);
+ Helios_msleep(10);
+ Helios_GPIO_SetLevel(self->power, HELIOS_LVL_HIGH);
+ Helios_GPIO_SetLevel(31, HELIOS_LVL_LOW);
+ Helios_msleep(20);
+ Helios_GPIO_SetLevel(31, HELIOS_LVL_HIGH);
+
+ if(sensor_timer == 0)
+ {
+ sensor_timer = Helios_Timer_init( (void* )sensor_timerout_cb, NULL);
+ }
+ if(sensor_thread_id == 0)
+ {
+ HX3918_LOG("mp_HX3918_open_heart Helios_Thread_Create\r\n");
+ sensor_thread_id = Helios_Thread_Create(&ThreadAttr);
+ }
+
+
+ bool ret = 0;
+ ret = hx3918_chip_check();
+ if(!ret){
+ //mp_raise_ValueError("i2c init fail ");
+ HX3918_LOG("mp_HX3918_init: i2c init fail\r\n");
+ is_HX3918 = 0;
+ }else
+ {
+ HX3918_LOG("mp_HX3918_init: OK\r\n");
+ is_HX3918 = 1;
+ Helios_ExtInt_Init(self->irq, &extint_struct1);//初始化中断
+ Helios_ExtInt_Enable(self->irq);//打开中断
+ hx3918_init(WEAR_MODE);//打开佩戴检测
+ #if CONFIG_SC7A20
+ if(Gsensor_init_flag == 0)//初始化Gsensor
+ SC7A20_init();
+ #endif
+ }
+
+ return mp_obj_new_int(1);
+}
+
+STATIC mp_obj_t mp_HX3918_deinit(mp_obj_t self_in)
+{
+ HX3918_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ HX3918_close();
+ Helios_GPIO_Deinit((Helios_GPIONum)self->irq);
+ Helios_ExtInt_Deinit(self->irq);
+ // Helios_I2C_Deinit((Helios_I2CEnum) self->i2c_no);
+ Helios_GPIO_SetLevel(self->power, HELIOS_LVL_LOW);
+
+ return mp_const_none;
+}
+void HX3918_test(uint32_t mode)
+{
+ s_HX3918_heart_rate = 0x0;
+ s_HX3918_heart_rate_buff_count = 0;
+ s_HX3918_high_blood = 0x0;
+ s_HX3918_low_blood = 0x0;
+ s_HX3918_HRV = 0;
+ s_HX3918_wear_status = 0;
+ s_HX3918_blood_oxygen = 0x0;
+
+ if(hx3918_init(mode) == true)
+ {
+ is_open_HX3918 = 1;
+ if(sensor_timer== 0)
+ {
+ sensor_timer = Helios_Timer_init( (void* )sensor_timerout_cb, NULL);
+ }
+
+ Helios_Timer_Start(sensor_timer, TIMER_TIME_MS, IS_CYCLICAL);
+ }
+
+
+}
+//打开心律测试
+STATIC mp_obj_t mp_HX3918_open_heart(mp_obj_t self_in)
+{
+
+ HX3918_run_mode = HRS_MODE;
+ return mp_obj_new_int(1);
+}
+//打开血氧测试
+STATIC mp_obj_t mp_HX3918_open_blood_oxygen(mp_obj_t self_in)
+{
+ HX3918_run_mode = SPO2_MODE ;
+ return mp_obj_new_int(1);
+}
+//打开HRV测试
+STATIC mp_obj_t mp_HX3918_open_hrv(mp_obj_t self_in)
+{
+
+ //HX3918_run_mode = HRV_MODE;
+ return mp_obj_new_int(1);
+}
+void HX3918_close(void)
+{
+ if(is_open_HX3918 == 1)
+ {
+
+ //hx3918_hrs_disable
+ if(HX3918_jobs_mode == HRS_MODE)
+ {
+ hx3918_hrs_disable();
+ }else if(HX3918_jobs_mode == SPO2_MODE)
+ {
+ hx3918_spo2_disable();
+ }else if(HX3918_jobs_mode == HRV_MODE)
+ {
+ //hx3918_hrv_disable();
+ }
+ if(sensor_timer != 0)
+ {
+ Helios_Timer_Stop(sensor_timer);
+ }
+ }
+ is_open_HX3918 = 0;
+ Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_LOW);
+ Helios_msleep(5);
+ Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH);
+ Helios_msleep(20);
+ hx3918_init(WEAR_MODE);//打开佩戴检测
+
+}
+//关闭hsensor
+STATIC mp_obj_t mp_HX3918_close(mp_obj_t self_in)
+{
+ HX3918_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ HX3918_run_mode = close_MODE;
+ //Helios_GPIO_SetLevel(self->power, HELIOS_LVL_LOW);
+ return mp_obj_new_int(1);
+}
+//获取心律
+STATIC mp_obj_t mp_HX3918_get_heart(mp_obj_t self_in)
+{
+ return mp_obj_new_int(s_HX3918_heart_rate);
+}
+//获取血氧
+STATIC mp_obj_t mp_HX3918_get_blood_oxygen(mp_obj_t self_in)
+{
+ return mp_obj_new_int(s_HX3918_blood_oxygen);
+}
+//获取血压
+STATIC mp_obj_t mp_HX3918_get_blood_pressure(mp_obj_t self_in)
+{
+ mp_obj_t coordinate_list[2] = {s_HX3918_high_blood, s_HX3918_low_blood,};
+ return mp_obj_new_list(2, coordinate_list);
+}
+//获取hrv
+STATIC mp_obj_t mp_HX3918_get_hrv(mp_obj_t self_in)
+{
+ return mp_obj_new_int(s_HX3918_HRV);
+}
+//hx3918_report_prox_status();获取电容佩戴状态
+//SENSOR_ERROR_T hx3918_check_touch_enable(void);获取红外佩戴状态
+//获取佩戴状态
+STATIC mp_obj_t mp_HX3918_get_wear(mp_obj_t self_in)
+{
+
+ return mp_obj_new_int(s_HX3918_wear_status);
+}
+//获取所有数据 心律、血氧、高压、低压、HRV、佩戴状态
+STATIC mp_obj_t mp_HX3918_get_all_data(mp_obj_t self_in)
+{
+ mp_obj_t coordinate_list[6] = {mp_obj_new_int((int)s_HX3918_heart_rate),mp_obj_new_int((int)s_HX3918_blood_oxygen),\
+ mp_obj_new_int((int)s_HX3918_high_blood),mp_obj_new_int((int)s_HX3918_low_blood),\
+ mp_obj_new_int((int)s_HX3918_HRV),mp_obj_new_int((int)s_HX3918_wear_status)};
+ return mp_obj_new_list(6, coordinate_list);
+}
+//设置sleep
+STATIC mp_obj_t mp_HX3918_set_sleep(mp_obj_t self_in)
+{
+ HX3918_sleep_flag = 1;
+ HX3918_LOG("mp_HX3918_set_sleep\r\n");
+ return mp_obj_new_int(1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_init_HX3918_obj, mp_HX3918_init);//初始化
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_deinit_HX3918_obj, mp_HX3918_deinit);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_activate_HX3918_obj, mp_activate_HX3918);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_get_blood_oxygen_obj, mp_HX3918_get_blood_oxygen);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_get_heart_obj, mp_HX3918_get_heart);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_get_blood_pressure_obj, mp_HX3918_get_blood_pressure);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_get_weart_obj, mp_HX3918_get_wear);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_open_heart_obj, mp_HX3918_open_heart);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_open_blood_oxygen_obj, mp_HX3918_open_blood_oxygen);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_open_hrv_obj, mp_HX3918_open_hrv);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_get_hrv_obj, mp_HX3918_get_hrv);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_get_all_data_obj, mp_HX3918_get_all_data);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_close_obj, mp_HX3918_close);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_set_sleep_obj, mp_HX3918_set_sleep);//
+
+STATIC const mp_rom_map_elem_t HX3918_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mp_init_HX3918_obj) },
+ { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mp_deinit_HX3918_obj) },
+ { MP_ROM_QSTR(MP_QSTR_activate), MP_ROM_PTR(&mp_activate_HX3918_obj) },
+ { MP_ROM_QSTR(MP_QSTR_get_blood_oxygen), MP_ROM_PTR(&mp_HX3918_get_blood_oxygen_obj)},
+ { MP_ROM_QSTR(MP_QSTR_get_heart), MP_ROM_PTR(&mp_HX3918_get_heart_obj)},
+ { MP_ROM_QSTR(MP_QSTR_get_blood_pressure), MP_ROM_PTR(&mp_HX3918_get_blood_pressure_obj)},
+ { MP_ROM_QSTR(MP_QSTR_get_weart), MP_ROM_PTR(&mp_HX3918_get_weart_obj)},
+ { MP_ROM_QSTR(MP_QSTR_open_heart), MP_ROM_PTR(&mp_HX3918_open_heart_obj)},
+ { MP_ROM_QSTR(MP_QSTR_open_blood_oxygen), MP_ROM_PTR(&mp_HX3918_open_blood_oxygen_obj)},
+ { MP_ROM_QSTR(MP_QSTR_open_hrv), MP_ROM_PTR(&mp_HX3918_open_hrv_obj)},
+ { MP_ROM_QSTR(MP_QSTR_get_hrv), MP_ROM_PTR(&mp_HX3918_get_hrv_obj)},
+ { MP_ROM_QSTR(MP_QSTR_get_all_data), MP_ROM_PTR(&mp_HX3918_get_all_data_obj)},
+ { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_HX3918_close_obj)},
+ { MP_ROM_QSTR(MP_QSTR_set_sleep), MP_ROM_PTR(&mp_HX3918_set_sleep_obj)},
+};
+
+STATIC MP_DEFINE_CONST_DICT(HX3918_locals_dict, HX3918_locals_dict_table);
+
+const mp_obj_type_t Hsensor_HX3918_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_HX3918,
+ .make_new = HX3918_make_new,
+ .locals_dict = (mp_obj_dict_t*)&HX3918_locals_dict,
+};
+
+#endif
+