You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

351 lines
17 KiB

1 year ago
/*
Copyright (c) 2017 Silan MEMS. All Rights Reserved.
*/
#ifndef SL_Watch_PEDO_KCAL_WRIST_SLEEP_SWAY_ALGO_DRV__H__
#define SL_Watch_PEDO_KCAL_WRIST_SLEEP_SWAY_ALGO_DRV__H__
#define SL_Sensor_Algo_Release_Enable 0x01
//0x00: for debug
//0x01: release version
/***使用驱动前请根据实际接线情况配置******/
/**SC7A20的SDO 脚接地: 0****************/
/**SC7A20的SDO 脚接电源:1****************/
#define SL_SC7A20_SDO_VDD_GND 1
/*****************************************/
/***使用驱动前请根据实际IIC情况进行配置***/
/**SC7A20的IIC 接口地址类型 7bits: 0****/
/**SC7A20的IIC 接口地址类型 8bits: 1****/
#define SL_SC7A20_IIC_7BITS_8BITS 1
/*****************************************/
#if SL_SC7A20_SDO_VDD_GND==0
#define SL_SC7A20_IIC_7BITS_ADDR 0x18
#define SL_SC7A20_IIC_8BITS_WRITE_ADDR 0x30
#define SL_SC7A20_IIC_8BITS_READ_ADDR 0x31
#else
#define SL_SC7A20_IIC_7BITS_ADDR 0x19
#define SL_SC7A20_IIC_8BITS_WRITE_ADDR 0x32
#define SL_SC7A20_IIC_8BITS_READ_ADDR 0x33
#endif
#if SL_SC7A20_IIC_7BITS_8BITS==0
#define SL_SC7A20_IIC_ADDRESS SL_SC7A20_IIC_7BITS_ADDR
#else
#define SL_SC7A20_IIC_WRITE_ADDRESS SL_SC7A20_IIC_8BITS_WRITE_ADDR
#define SL_SC7A20_IIC_READ_ADDRESS SL_SC7A20_IIC_8BITS_READ_ADDR
#endif
#define SL_SC7A20_CHIP_ID_ADDR (unsigned char)0x0F
#define SL_SC7A20_CHIP_ID_VALUE (unsigned char)0x11
#define SL_SC7A20_VERSION_ADDR (unsigned char)0x70
#define SL_SC7A20_VERSION_VALUE (unsigned char)0x11
#define SL_SC7A20E_VERSION_VALUE (unsigned char)0x26
typedef enum {FALSE = 0,TRUE = !FALSE} bool;
/********客户需要进行的IIC接口封包函数****************/
extern unsigned char SL_SC7A20_I2c_Spi_Write(bool sl_spi_iic,unsigned char reg, unsigned char dat);
extern unsigned char SL_SC7A20_I2c_Spi_Read(bool sl_spi_iic,unsigned char reg, unsigned char len, unsigned char *buf);
/**SL_SC7A20_I2c_Spi_Write 函数中, sl_spi_iic:0=spi 1=i2c Reg:寄存器地址 dat:寄存器的配置值*******************/
/**SL_SC7A20_I2c_Spi_Write 函数 是一个单次写的函数*******************************************************************/
/***SL_SC7A20_I2c_Spi_Read 函数中, sl_spi_iic:0=spi 1=i2c Reg 同上,len:读取数据长度,buf:存储数据首地址(指针)***/
/***SL_SC7A20_I2c_Spi_Read 函数 是可以进行单次读或多次连续读取的函数*************************************************/
/*************驱动初始化函数**************/
signed char SL_SC7A20_Driver_Init(bool Sl_spi_iic_init,unsigned char Sl_pull_up_mode);
/***输入参数:1,Sl_spi_iic_init:0-1***2,PULL_UP_MODE:0x00 0x08 0x04 0x0c********/
/****Sl_spi_iic_init=0:SPI MODE, Sl_pull_up_mode config failed****************/
/****Sl_spi_iic_init=1:IIC MODE***********************************************/
/****Sl_pull_up_mode=0x00: SDO I2C pull up***********************************/
/****Sl_pull_up_mode=0x08: I2C pull up and SDO open drain*******************/
/****Sl_pull_up_mode=0x04: SDO pull up and I2C open drain*******************/
/****Sl_pull_up_mode=0x0C: SDO I2C open drain********************************/
/****SDO脚接地,推荐关闭SDO内部上拉电阻****************************************/
/****SPI通讯,推荐关闭SDA,SCL内部上拉电阻,SDO内部上拉电阻会自动关闭**********/
/*************返回数据情况如下*****************/
/**return : 0x11/0x26 表示CHIP ID 正常*********/
/**return : 0 表示读取异常*************/
/**return :-1; SPI 通信问题*************/
/**return :-2; IIC 通信问题*************/
/**return :-3; 连续读取 通信问题********/
/***************执行算法前需要读取FIFO数据*****/
/***************FIFO数据读取后,FIFO会清空*****/
/***************所以FIFO只能定时读取一次*******/
unsigned char SL_SC7A20_Read_FIFO(void);
/**return : FIFO_LEN 表示数组长度***********/
/****说明:该函数需要定时执行,从而保证算法执行到位**/
/***************执行算法获取计步结果***************/
unsigned int SL_Watch_Kcal_Pedo_Algo(bool sl_music_motor_en);
/***sl_music_motor_en=0: 马达电机和音乐功能未打开**/
/***sl_music_motor_en=1: 马达电机和音乐功能已打开**/
/**************获取当天的当前计步值****************/
/*************输出数据为:计步值(步)***************/
/***************获取三轴原始数据***************/
unsigned char SL_SC7A20_GET_FIFO_Buf(signed short *sl_x_buf,signed short *sl_y_buf,signed short *sl_z_buf,bool filter_en);
/****************执行算法后执行该命令**********/
/**x_buf y_buf z_buf : 长度32的数组首地址****/
/**filter_en:0 低通滤波禁止 1:低通滤波使能***/
/****************返回数据情况如下**************/
/**return : FIFO_LEN 表示数组长度***********/
/******************复位计步值************************/
void SL_Pedo_Kcal_ResetStepCount(void);
/**********输入数据为:无******输出数据为:无********/
/*使用方法: 系统时间到第二天时,调用该函数清除计步值*/
/*******************计步状态复位**********************/
void SL_Pedo_WorkMode_Reset(void);
/******************输入参数:无***********************/
/******************输出值参数:无*********************/
/******************升级后,设置计步值,距离,热量************************/
/******************升级后,请在初始化函数后,增加该函数****************/
void SL_Pedo_StepCount_Set(unsigned int sl_pedo_value,unsigned int sl_dis_value,unsigned int sl_kcal_value);
/**********输入数据为:sl_pedo_value 计步值*****/
/**********输入数据为:sl_dis_value 距离值*****/
/**********输入数据为:sl_kcal_value 热量值*****/
/******************计步灵敏度设置********************/
void SL_PEDO_TH_SET(unsigned char sl_pedo_amp,unsigned char sl_pedo_th,unsigned char sl_pedo_weak,unsigned char sl_zcr_lel,unsigned char sl_scope_lel);
/******sl_pedo_amp>4&&sl_pedo_amp<201**************************/
/******sl_pedo_amp:越小灵敏度越高,越容易计步******************/
/******sl_pedo_amp:越大灵敏度越高,越难计步********************/
/******sl_pedo_amp:默认值26,不设置就是26**********************/
/******sl_pedo_th>5&&sl_pedo_th<50*****************************/
/******sl_pedo_th:越小灵敏度越高,越容易计步*******************/
/******sl_pedo_th:越大灵敏度越高,越难计步*********************/
/******sl_pedo_th:默认值10,不设置就是10***********************/
/******sl_pedo_weak>=0&&sl_pedo_weak<6*************************/
/******sl_pedo_th:0,不打开轻微走路计步功能*********************/
/******sl_pedo_th:1,打开轻微走路计步功能***********************/
/******sl_pedo_th:2,打开轻微走路计步功能***********************/
/******sl_pedo_th:3,打开轻微走路计步功能***********************/
/******sl_pedo_th:4,打开轻微走路计步功能***********************/
/******sl_pedo_th:5,打开轻微走路计步功能***********************/
/******sl_pedo_th:默认值0,设置的值越大,检测计步的越灵敏*******/
/*****sl_zcr_lel>=0&&sl_zcr_lel<=255***************************/
/*****sl_zcr_lel:默认值=20,设置的值越小,越容易屏蔽喇叭震动****/
/*****一定时间内的过零率计算***********************************/
/*****sl_scope_lel>=0&&sl_scope_lel<=255***********************/
/*****整体数据幅度阈值*****************************************/
/*******计步主轴设置****************/
void SL_PEDO_SET_AXIS(unsigned char sl_xyz);
/***sl_xyz:0 x轴*******************/
/***sl_xyz:1 y轴*******************/
/***sl_xyz:2 z轴*******************/
/***sl_xyz:3 算法决定**************/
/*设置运动检测幅度阈值和时间阈值****/
void SL_PEDO_INT_SET(unsigned char V_TH,unsigned char T_TH,bool INT_EN);
/***V_TH:0 0-127************************************/
/***T_TH:1 0-127************************************/
/***INT_EN:0 关闭中断功能,1,打开中断状态监测功能***/
/***USE AOI2 INT*************************************/
/*设置运动状态读取******************/
bool SL_INT_STATUS_READ(void);
/*0: 没有运动*********************/
/*1: 有运动***********************/
/*关闭中断功能情况下,一直输出1*****/
/***********关闭IIC设备**************/
/***********Power down 函数**********/
/********不使用该设备情况下**********/
/****如需重启,使用驱动初始化函数****/
bool SL_SC7A20_Power_Down(void);
/*************输入参数:无************/
/**********返回参数情况说明**********/
/**return 1: Power Down Success*****/
/**return 0: Power Down Fail********/
/*************初始化个人参数*************/
/**参数初始化,用于热量,距离计算********/
void SL_Pedo_Person_Inf_Init(unsigned char *Person_Inf_Init);
/*********输入指针参数分别是:身高 体重 年龄 性别***举例:178,60,26 1*********/
/**身高范围: 30cm ~ 250cm ***********/
/**体重范围: 10Kg ~ 200Kg ***********/
/**年龄范围: 3岁 ~ 150岁 ***********/
/**性别范围: 0 ~ 1 0:女 1:男 ****/
/*********************获取运动状态值**********************/
unsigned char SL_Pedo_GetMotion_Status(void);
/**********输入数据为:无*********************************/
/**********输出数据为:0 ~ 3 *****************************/
/**输出数据为:0 *静止或静坐**********/
/**输出数据为:1 *慢走或散步**********/
/**输出数据为:2 *正常走路************/
/**输出数据为:3 *跑步或剧烈运动******/
/**************获取截止当前当天的行走距离*****************/
unsigned int SL_Pedo_Step_Get_Distance(void);
/*******************输入数据为:无************************/
/*******************输出数据为:当天行走距离 *************/
/*******************单位: 分米(dm)******************/
/**************获取截止当前当天的热量消耗*****************/
unsigned int SL_Pedo_Step_Get_KCal(void);
/*******************输入数据为:无************************/
/*******************输出数据为:当天热量消耗值 ***********/
/*********单位: 大卡 1个单位=0.1大卡******************/
/**************获取最近一段时间的走路平均幅度*************/
unsigned short SL_Pedo_Step_Get_Avg_Amp(void);
/********************输入数据为:无***********************/
/***********************1LSB≈XXXmg************************/
/***********************获取当前走路平均步频**************/
unsigned char SL_Pedo_Step_Get_Step_Per_Min(void);
/********************输入数据为:无***********************/
/********************输出数据为:XXX步/分钟 **************/
/***********************获取当前的运动等级****************/
unsigned char SL_Pedo_Step_Get_Motion_Degree(void);
/********************输入数据为:无***********************/
/********************输出数据为:0-25 ********************/
/**********抬手亮屏算法**********/
/*****************抬手亮屏算法初始化函数****************/
void SL_Turn_Wrist_Init(unsigned char *SL_Turn_Wrist_Para);
/************输入参数:*************/
/******SL_Turn_Wrist_Para[0]:加速度计贴片位置设置 0--7********/
/******SL_Turn_Wrist_Para[1]:抬手亮屏灵敏度设置 1--5********/
/******SL_Turn_Wrist_Para[2]:水平抬手亮屏使能控制位0--1********/
/*************三轴加速度计贴片位置设置*************************/
/***SL_Turn_Wrist_Para[0]:设定值的范围为: 0 ~ 7 **************/
/***请参考文档:Silan_MEMS_手环算法说明书_V1.1.pdf**************/
/***SL_Turn_Wrist_Para[1]:设定值的范围为: 1 ~ 5 **/
/*********默认值为:3 中等灵敏度****************/
/*********设定值为:1 最低灵敏度****************/
/*********默认值为:5 最高灵敏度****************/
/*********设定值为:1(最迟钝)~5(最灵敏)***********/
/******SL_Turn_Wrist_Para[2]:水平抬手亮屏使能控制位0--1*******/
/******0:禁止水平抬手功能********/
/******1:使能水平抬手功能********/
/*****************抬手亮屏状态获取函数****************/
signed char SL_Watch_Wrist_Algo(void);
/***********输入参数:无***********/
/***********返回参数情况说明*******/
/**Return: 2 备注说明:屏幕点亮后需要关闭*********/
/**Return: 1 备注说明:屏幕需要点亮***************/
/**Return: 0 备注说明:屏幕不需要点亮*************/
/**Return: -1 备注说明:未初始化或初始化失败*******/
/*****************抬手亮屏状态复位********************/
//void SL_Turn_Wrist_WorkMode_Reset(void);
/******************输入参数:无***********************/
/******************输出值参数:无*********************/
//3-12
//1-10
//0-10
/******************睡眠参数设置********************/
void SL_Sleep_Para(unsigned char adom_time_th,unsigned char sleep_vpp_th,unsigned char sleep_time_th);
/**************************佩戴检测的时长***********************/
/******adom_time_th:0-255 min***********************************/
/******adom_time_th:未活动的时间,大于设置阈值才能认为未佩戴****/
/******adom_time_th:设置值越小,越容易出现未佩戴情况************/
/**************************睡眠中间点阈值***********************/
/******sleep_vpp_th:越小灵敏度越高,越容易睡眠状态切换**********/
/******sleep_vpp_th:越大灵敏度越低,越难睡眠状态切换************/
/******sleep_vpp_th:默认值10,不设置就是10**********************/
/**************************状态切换最小时间*********************/
/******sleep_time_th:该值越小,睡眠状态切换的所需时间就越短*****/
/******sleep_time_th:该值越大,睡眠状态切换的所需时间就越长*****/
/******sleep_time_th:默认值1,不设置就是1***********************/
/***************获取当前的睡眠状态*****************/
unsigned char SL_Sleep_GetStatus(unsigned char SL_Sys_Time);
/*******SL_Sys_Time:当前的时间,以小时为单位******/
/*******全天的输入时间范围为:0-23 ****************/
/***************输出数据范围:0-7******************/
/***************0:清醒状态************************/
/***************7:深度睡眠************************/
/***************获取当前的活动等级*****************/
unsigned char SL_Sleep_Active_Degree(unsigned char mode);
/***************mode:0 定时器0.5s中调用***********/
/***************mode:1 定时器1min中调用***********/
/***************输出数据范围:0-255****************/
/***************0:静止****************************/
/*************255:运动****************************/
unsigned char SL_Sleep_Get_Active_Degree(void);
/***************mode:0 定时器0.5s中调用***********/
/***************mode:1 定时器1min中调用***********/
/***************输出数据范围:0-255****************/
/***************0:静止****************************/
/*************255:运动****************************/
/***************获取当前的佩戴的情况***************/
unsigned char SL_Adom_GetStatus(void);
/***************0:未佩戴**************************/
/***************1:已佩戴**************************/
/***************获取当前的佩戴的情况***************/
unsigned char SL_In_Sleep_Status(void);
/***************0:out sleep**********************/
/***************1:in sleep***********************/
/**************************翻转功能************************/
bool SL_Get_Clock_Status(bool open_close);
/***********输入参数:sensor_pos***********/
/****sensor_pos:1 open 检测是否要关闭时输入 1*************/
/****sensor_pos:0 close 关闭闹铃时时 输入 0*************/
/*********************返回参数情况说明*********************/
/***********************翻转功能检测***********************/
/**Return: 1 备注说明:屏幕已翻转,关闭闹钟************/
/**Return: 0 备注说明:屏幕未翻转,不关闭闹钟**********/
/**************************摇晃功能************************/
bool SL_Get_Phone_Answer_Status(unsigned char Sway_Degree,unsigned char Sway_Num);
/***********输入参数:摇晃等级0--10 摇晃数量0--10***********************/
/***摇晃等级:设置值越小,需要摇晃的幅度越小,越容易触发接听动作*********/
/***摇晃数量:设置值越小,需要摇晃的次数越少,越容易触发接听动作*********/
/***********返回参数情况说明*******************************/
/**Return: 1 备注说明:摇晃动作成立,接听电话**********/
/**Return: 0 备注说明:摇晃动作不成立,不接听电话******/
/************加测项目客户端测试***********/
/***初始化的时候调用用于判断FIFO是否正常**/
bool SL_SC7A20_FIFO_TEST(void);
/*************输入参数:无*****************/
/*************返回数据情况如下************/
/**return :1 FIFO 异常*******************/
/**return :0 FIFO 正常*******************/
#endif/****SL_Watch_ALGO_DRV__H__*********/