--- /dev/null
+/**************************************************************************
+
+**************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+// 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_juphoon
+
+#include "helios_gpio.h"
+
+
+
+
+#include "helios_debug.h"
+
+#include "autoconf.h"
+
+
+//////////////////////////////////////////////////////////////////////////////
+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 = 1;//佩戴状态
+#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 ;
+void HX3918_restart(void);
+#endif
+int ir_wear = 0;//红外佩戴状态
+int cap_wear = 1;//电容佩戴状态
+char is_open_sar = 0;//是否打开sar检测
+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;
+ }
+ // else
+ // HX3918_restart();
+ HX3918_test(HX3918_run_mode);
+ HX3918_jobs_mode = HX3918_run_mode;
+ HX3918_run_mode = NULL_MODE;
+ }
+ 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(is_HX3918 == 1 && is_open_HX3918 == 1)//处理Hsensor定时数据
+ {
+
+
+ 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;
+
+ // //hx3918_prox_factory_hanging_cali();
+
+ // ir_wear = hx3918_get_wear_ppg_Int_handle();
+ // #ifdef SAR_ALG_LIB
+ // cap_wear = hx3918_report_prox_status();
+ // #endif
+ // HX3918_LOG("ir_wear:%d cap_wear%d\n",ir_wear,cap_wear);
+ // if(ir_wear == 1 && cap_wear==1)
+ // {
+ // s_HX3918_wear_status = 1;
+ // }else
+ // s_HX3918_wear_status = 0;
+ // }
+
+ #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)
+{
+ if(wear_status != 1)
+ s_HX3918_wear_status = 0;
+ else
+ s_HX3918_wear_status = 1;
+ //HX3918_LOG("s_HX3918_wear_status:%d !!!!!!!!!!!!!!!!!\n\n\n",s_HX3918_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)
+{
+
+ if(timer_Gsensor_count < 65536)
+ 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);//打开中断
+ #ifdef SAR_ALG_LIB
+ hx3918_prox_init();
+ #endif
+ 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(mode <= close_MODE)
+ {
+ 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);
+ }
+ }else if(mode == 255)//活体校准功能
+ {
+ // Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_LOW);
+ // Helios_msleep(150);
+ // Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH);
+ // Helios_msleep(20);
+ // hx3918_init(WEAR_MODE);//打开佩戴检测
+ #ifdef SAR_ALG_LIB
+ hx3918_prox_factory_hanging_cali();
+ #endif
+ }
+
+
+
+
+}
+//打开心律测试
+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);
+}
+//打开测试模式
+STATIC mp_obj_t mp_HX3918_open_test(mp_obj_t self_in,mp_obj_t val1)
+{
+ HX3918_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ HX3918_run_mode = mp_obj_get_int(val1);
+ return mp_obj_new_int(1);
+}
+//设置是否打开sar模式
+STATIC mp_obj_t mp_HX3918_set_sar(mp_obj_t self_in,mp_obj_t val1)
+{
+ HX3918_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ is_open_sar = mp_obj_get_int(val1);
+ 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;
+ HX3918_restart();
+ #ifdef SAR_ALG_LIB
+ hx3918_prox_init();
+ #endif
+ hx3918_init(WEAR_MODE);//打开佩戴检测
+
+}
+void HX3918_restart(void)
+{
+ Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_LOW);
+ Helios_msleep(50);
+ Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH);
+ Helios_msleep(50);
+}
+//关闭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] = {mp_obj_new_int(s_HX3918_high_blood), mp_obj_new_int(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);
+}
+// ir_wear = hx3918_get_wear_ppg_Int_handle();
+// cap_wear = hx3918_report_prox_status();
+
+//获取佩戴状态
+STATIC mp_obj_t mp_HX3918_get_wear(mp_obj_t self_in)
+{
+ //mp_obj_t coordinate_list[1] = {mp_obj_new_int((int)s_HX3918_wear_status)};
+ //return mp_obj_new_list(1, coordinate_list);
+ 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);
+}
+
+extern factory_result_t factory_reslts;
+//FT_LEAK_LIGHT_MODE 产测漏光测试模式;
+//FT_GRAY_CARD_MODE 产测灰卡测试模式;
+//LAB_TEST_MODE 实验室模式。
+// extern uint16_t prox_factory_offset0 ;
+// extern uint16_t prox_factory_offset1 ;
+// extern int16_t prox_factory_lp[2] ;
+#ifdef SAR_ALG_LIB
+extern int16_t nv_wear_offset[2] ; // 芯片产测校准的两个通道的OFFSET值, 值记录在fash里面
+extern int16_t nv_base_data[2]; // 芯片产测校准的两个通道的对空LP值, 值记录在flash里面
+//lp[0],bl[0],lp[1],bl[1],gdiff[0]
+extern int16_t glp[2] ;
+extern int16_t gbl[2];
+extern int16_t gdiff[2];
+#else
+ int16_t nv_wear_offset[2] ; // 芯片产测校准的两个通道的OFFSET值, 值记录在fash里面
+ int16_t nv_base_data[2]; // 芯片产测校准的两个通道的对空LP值, 值记录在flash里面
+//lp[0],bl[0],lp[1],bl[1],gdiff[0]
+ int16_t glp[2] ;
+ int16_t gbl[2];
+ int16_t gdiff[2];
+#endif
+
+STATIC mp_obj_t mp_HX3918_get_test_data(mp_obj_t self_in)
+{
+ mp_obj_t coordinate_list[15] = {mp_obj_new_int((int)factory_reslts.green_data_final),mp_obj_new_int((int)factory_reslts.red_data_final),mp_obj_new_int((int)factory_reslts.ir_data_final),
+ mp_obj_new_int((int)ir_wear),mp_obj_new_int((int)cap_wear),mp_obj_new_int((int)glp[0]),mp_obj_new_int((int)gbl[0]),mp_obj_new_int((int)glp[1]),mp_obj_new_int((int)gbl[1]),
+ mp_obj_new_int((int)(gdiff[0])),mp_obj_new_int((int)(gdiff[1])),mp_obj_new_int((int)nv_wear_offset[0]),mp_obj_new_int((int)nv_wear_offset[1]),mp_obj_new_int((int)nv_base_data[0]),
+ mp_obj_new_int((int)nv_base_data[1]),
+ };
+ return mp_obj_new_list(15, 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_wear_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 MP_DEFINE_CONST_FUN_OBJ_2(mp_HX3918_open_test_obj, mp_HX3918_open_test);
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(mp_HX3918_set_sar_obj, mp_HX3918_set_sar);
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_HX3918_get_test_data_obj, mp_HX3918_get_test_data);//
+
+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_wear), MP_ROM_PTR(&mp_HX3918_get_wear_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)},
+ { MP_ROM_QSTR(MP_QSTR_open_test), MP_ROM_PTR(&mp_HX3918_open_test_obj)},
+ { MP_ROM_QSTR(MP_QSTR_set_sar), MP_ROM_PTR(&mp_HX3918_set_sar_obj)},
+ { MP_ROM_QSTR(MP_QSTR_get_test_data), MP_ROM_PTR(&mp_HX3918_get_test_data_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
+