初版
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
#include "sdk_config.h"
|
||||
#include "sensor_driver.h"
|
||||
|
||||
#if CONFIG_SENSOR_DRIVER_ENABLE && TCFG_MMC5603_ENABLE
|
||||
|
||||
#define LOG(fmt,...) printf("[5603] %s " fmt "\n", __func__, ##__VA_ARGS__)
|
||||
|
||||
#define IIC_ADDR_W (0x30 << 1 | 0x0)
|
||||
#define IIC_ADDR_R (0x30 << 1 | 0x1)
|
||||
|
||||
static axis_data_t sensor_data[50];
|
||||
static cbuffer_t sensor_cbuffer;
|
||||
static cbuffer_child_t entry[1];//支持3个成员读取
|
||||
|
||||
static sensor_info_t sensor_info = {
|
||||
.type = SENSOR_DRV_MAGNETIC,
|
||||
.name = "mmc5603",
|
||||
.range = {2, 4, 8, 16},
|
||||
.odr = {10, 25, 50, 100},
|
||||
.cbuffer = 0,
|
||||
};
|
||||
|
||||
static s8 sensor_check(void)
|
||||
{
|
||||
u8 dev_id = 0;
|
||||
sensor_read(IIC_ADDR_R, 0x39, &dev_id, 1, 0);
|
||||
|
||||
if (sensor_info.cbuffer == NULL) {
|
||||
sensor_info.cbuffer = &sensor_cbuffer;
|
||||
cbuf_mult_read_init(sensor_info.cbuffer, sensor_data, sizeof(sensor_data), 1, entry);
|
||||
}
|
||||
LOG("dev_id=%02x cbuf=%x", dev_id, sensor_info.cbuffer);
|
||||
return ((dev_id == 0x10) && sensor_info.cbuffer) ? RET_OK : RET_ERR;
|
||||
}
|
||||
|
||||
|
||||
static s8 sensor_open(u16 range, u16 odr)
|
||||
{
|
||||
u8 register_value = 0;
|
||||
s8 ret = RET_OK;
|
||||
|
||||
/* Write 0x10 to register 0x1B, set RESET bit high */
|
||||
if (ret == RET_OK) {
|
||||
register_value = 0x10;
|
||||
ret = sensor_write(IIC_ADDR_W, 0x1B, ®ister_value, 1); //RESET
|
||||
/* Delay to finish the RESET operation */
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
/* Write reg 0x1C, Set BW<1:0> = bandwith */
|
||||
if (ret == RET_OK) {
|
||||
register_value = odr / 75;
|
||||
ret = sensor_write(IIC_ADDR_W, 0x1C, ®ister_value, 1);
|
||||
}
|
||||
|
||||
/* Write reg 0x1A, set ODR<7:0> = sampling_rate */
|
||||
if (ret == RET_OK) {
|
||||
register_value = odr;
|
||||
ret = sensor_write(IIC_ADDR_W, 0x1A, ®ister_value, 1);
|
||||
}
|
||||
|
||||
/* Write reg 0x1B */
|
||||
/* Set Auto_SR_en bit '1', Enable the function of automatic set/reset */
|
||||
/* Set Cmm_freq_en bit '1', Start the calculation of the measurement period according to the ODR*/
|
||||
if (ret == RET_OK) {
|
||||
register_value = 0x80 | 0x20;
|
||||
ret = sensor_write(IIC_ADDR_W, 0x1B, ®ister_value, 1);
|
||||
}
|
||||
|
||||
/* Write reg 0x1D */
|
||||
/* Set Cmm_en bit '1', Enter continuous mode */
|
||||
if (ret == RET_OK) {
|
||||
register_value = 0x10;
|
||||
ret = sensor_write(IIC_ADDR_W, 0x1D, ®ister_value, 1);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static s8 sensor_close(void)
|
||||
{
|
||||
u8 val = 0;
|
||||
return sensor_write(IIC_ADDR_W, 0x1D, &val, 1);
|
||||
}
|
||||
|
||||
static s8 sensor_read_single_data(void *arg, u16 *len)
|
||||
{
|
||||
u8 data_reg[6] = {0};
|
||||
axis_data_t *mag = arg;
|
||||
|
||||
sensor_read(IIC_ADDR_R, 0x00, data_reg, 6, 0);
|
||||
|
||||
mag[0].x = (s16)(data_reg[0] << 8 | data_reg[1]);
|
||||
mag[0].y = (s16)(data_reg[2] << 8 | data_reg[3]);
|
||||
mag[0].z = (s16)(data_reg[4] << 8 | data_reg[5]);
|
||||
|
||||
mag[0].x -= 32768;
|
||||
mag[0].y -= 32768;
|
||||
mag[0].z -= 32768;
|
||||
|
||||
*len = 6;
|
||||
|
||||
if ((*len > 0) && (sensor_info.cbuffer)) {
|
||||
u32 wlen = cbuf_write(sensor_info.cbuffer, arg, *len);
|
||||
LOG("cbuf wlen=%d glen=%d", wlen, *len);
|
||||
}
|
||||
LOG("mag:%d,%d,%d", mag[0].x, mag[0].y, mag[0].z);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
REGISTER_SENSOR(sensor_magnetic) = {
|
||||
.info = &sensor_info,
|
||||
.online = sensor_check,
|
||||
.open = sensor_open,
|
||||
.close = sensor_close,
|
||||
.run = sensor_read_single_data,
|
||||
};
|
||||
#endif
|
||||
@@ -0,0 +1,180 @@
|
||||
#include "sdk_config.h"
|
||||
#include "sensor_driver.h"
|
||||
|
||||
#if CONFIG_SENSOR_DRIVER_ENABLE && TCFG_SC7A20_ENABLE
|
||||
|
||||
#define LOG(fmt,...) printf("[sc7a20] " fmt "\n",##__VA_ARGS__)
|
||||
|
||||
/***使用驱动前请根据实际接线情况配置(7bit)IIC地址******/
|
||||
/**SC7A20的SDO 脚接地: 0x18****************/
|
||||
/**SC7A20的SDO 脚接电源: 0x19****************/
|
||||
#define IIC_ADDR_W (0x19U << 1 | 0x0)
|
||||
#define IIC_ADDR_R (0x19U << 1 | 0x1)
|
||||
/*******************************************************/
|
||||
static axis_data_t accel_data[50]; //accel data buffer
|
||||
static cbuffer_t accel_cbuffer;
|
||||
static cbuffer_child_t entry[3];//支持3个成员读取
|
||||
static sensor_info_t sensor_info = {
|
||||
.type = SENSOR_DRV_ACCELER,
|
||||
.name = "sc7a20",
|
||||
.range = {2, 4, 8, 16},
|
||||
.odr = {10, 25, 50, 100},
|
||||
.cbuffer = 0,
|
||||
};
|
||||
static s8 sensor_open(u16 range, u16 odr);
|
||||
static const sensor_regs_t sensor_regs_array[] = {
|
||||
{0x57, 0x00},
|
||||
{0x1f, 0x00},
|
||||
{0x20, 0x3F},
|
||||
{0x21, 0x70},
|
||||
{0x23, 0x10},
|
||||
{0x24, 0x40},
|
||||
{0x2E, 0x8F},
|
||||
{0x22, 0x00},
|
||||
};
|
||||
|
||||
|
||||
static s8 sensor_check(void)
|
||||
{
|
||||
u8 dev_id = 0;
|
||||
sensor_read(IIC_ADDR_R, 0x70, &dev_id, 1, 0);
|
||||
|
||||
if (sensor_info.cbuffer == NULL) {
|
||||
sensor_info.cbuffer = &accel_cbuffer;
|
||||
cbuf_mult_read_init(sensor_info.cbuffer, accel_data, sizeof(accel_data), 3, entry);
|
||||
}
|
||||
LOG("dev_id=%02x cbuf=%x", dev_id, (u32)sensor_info.cbuffer);
|
||||
return ((dev_id == 0x28 || dev_id == 0x11) && sensor_info.cbuffer) ? RET_OK : RET_ERR;
|
||||
}
|
||||
|
||||
static s8 sensor_read_config(void)
|
||||
{
|
||||
u8 reg_val = 0;
|
||||
for (u8 i = 0; i < sizeof(sensor_regs_array) / sizeof(sensor_regs_t); i++) {
|
||||
if (sensor_read(IIC_ADDR_R, sensor_regs_array[i].addr, ®_val, 1, 0) == RET_ERR) {
|
||||
return RET_ERR;
|
||||
}
|
||||
LOG("reg %02x = %02x", sensor_regs_array[i].addr, reg_val);
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static s8 sensor_open(u16 range, u16 odr)
|
||||
{
|
||||
const u8 config_range[4] = {0x00, 0x10, 0x20, 0x30};
|
||||
const u8 config_odr[4] = {0x2F, 0x3F, 0x4F, 0x5F};
|
||||
|
||||
u8 acc_conf_odr = 0x3F; //默认 25hz
|
||||
u8 acc_conf_range = 0x10; //默认 +-4g
|
||||
|
||||
for (u8 i = 0; i < sizeof(sensor_regs_array) / sizeof(sensor_regs_t); i++) {
|
||||
if (sensor_write(IIC_ADDR_W, sensor_regs_array[i].addr, (u8 *)&sensor_regs_array[i].value, 1) == RET_ERR) {
|
||||
return RET_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
for (u8 i = 0; i < 4; i++) {
|
||||
if (sensor_info.range[i] == range) {
|
||||
acc_conf_range = config_range[i];
|
||||
}
|
||||
if (sensor_info.odr[i] == odr) {
|
||||
acc_conf_odr = config_odr[i];
|
||||
}
|
||||
}
|
||||
|
||||
sensor_write(IIC_ADDR_W, 0x20, &acc_conf_odr, 1);
|
||||
sensor_write(IIC_ADDR_W, 0x23, &acc_conf_range, 1);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
static s8 sensor_close(void)
|
||||
{
|
||||
u8 val = 0;
|
||||
return sensor_write(IIC_ADDR_W, 0x20, &val, 1);
|
||||
}
|
||||
|
||||
static s8 sensor_read_fifo_data(void *arg, u16 *len)
|
||||
{
|
||||
u8 fifo_len = 0;
|
||||
u8 temp_arry[6];
|
||||
axis_data_t *accel = arg;
|
||||
|
||||
sensor_read(IIC_ADDR_R, 0x2f, &fifo_len, 1, 0);
|
||||
fifo_len = fifo_len & 0x1f;
|
||||
|
||||
for (u8 i = 0; i < fifo_len; i++) {
|
||||
sensor_read(IIC_ADDR_R, 0xa8, temp_arry, 6, 0);
|
||||
accel[i].x = (((s16)((s16)temp_arry[1] * 256 + temp_arry[0])) >> 3);
|
||||
accel[i].y = -(((s16)((s16)temp_arry[3] * 256 + temp_arry[2])) >> 3);
|
||||
accel[i].z = (((s16)((s16)temp_arry[5] * 256 + temp_arry[4])) >> 3);
|
||||
LOG(" xyz(%d,%d): %d %d %d", fifo_len, i, accel[i].x, accel[i].y, accel[i].z);
|
||||
}
|
||||
fifo_len *= sizeof(axis_data_t);
|
||||
|
||||
if ((fifo_len > 0) && (sensor_info.cbuffer)) {
|
||||
|
||||
if (!cbuf_is_write_able(sensor_info.cbuffer, fifo_len)) {
|
||||
cbuf_mult_read_alloc_len_updata(sensor_info.cbuffer, 0, fifo_len);
|
||||
cbuf_mult_read_alloc_len_updata(sensor_info.cbuffer, 1, fifo_len);
|
||||
}
|
||||
|
||||
u32 wlen = cbuf_write(sensor_info.cbuffer, arg, fifo_len);
|
||||
LOG("cbuf wlen=%d glen=%d", wlen, fifo_len);
|
||||
}
|
||||
*len = fifo_len;
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
#if CONFIG_SENSOR_SLEEP_ENABLE
|
||||
static const sensor_regs_t sensor_wakeup_regs_array[] = {
|
||||
{0x20, 0x47},
|
||||
{0x23, 0x88}, //+-2g
|
||||
{0x21, 0x31},
|
||||
{0x22, 0x40}, //AOI中断on int1
|
||||
{0x25, 0x00},
|
||||
{0x24, 0x00},
|
||||
{0x30, 0x2a}, //x,y,z高事件或检测
|
||||
{0x32, 0x02}, //检测门限: 1-127, 值越小, 灵敏度越高
|
||||
{0x33, 0x00},
|
||||
};
|
||||
|
||||
static s8 sensor_wakeup_enable(void)
|
||||
{
|
||||
LOG("sensor_wakeup_enable");
|
||||
for (u8 i = 0; i < sizeof(sensor_wakeup_regs_array) / sizeof(sensor_regs_t); i++) {
|
||||
if (sensor_write(IIC_ADDR_W, sensor_wakeup_regs_array[i].addr, (u8 *)&sensor_wakeup_regs_array[i].value, 1) == RET_ERR) {
|
||||
return RET_ERR;
|
||||
}
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
__attribute__((weak)) s8 driver_sc7a20_is_wake(void)
|
||||
{
|
||||
u8 reg_val = 0;
|
||||
if (sensor_read(IIC_ADDR_R, 0x31, ®_val, 1, 0) == RET_OK) {
|
||||
LOG("reg_val=%x wake=%x", reg_val, reg_val & 0x2a);
|
||||
if (reg_val & 0x2a) {
|
||||
sensor_open(4, 25);
|
||||
} else {
|
||||
return RET_ERR;
|
||||
}
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
REGISTER_SENSOR(sensor_acc) = {
|
||||
.info = &sensor_info,
|
||||
.online = sensor_check,
|
||||
.open = sensor_open,
|
||||
.close = sensor_close,
|
||||
.run = sensor_read_fifo_data,
|
||||
#if CONFIG_SENSOR_SLEEP_ENABLE
|
||||
.sleep = sensor_wakeup_enable,
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,159 @@
|
||||
|
||||
/*********************************************************************************************************
|
||||
* Copyright(c) 2018, Vcare Corporation. All rights reserved.
|
||||
**********************************************************************************************************
|
||||
* @file module_heart_vc.c
|
||||
* @brief
|
||||
* @details
|
||||
* @author
|
||||
* @date
|
||||
* @version v1.6
|
||||
*********************************************************************************************************
|
||||
*/
|
||||
#include "sdk_config.h"
|
||||
#include "sensor_driver.h"
|
||||
#include "vcHr11Hci.h"
|
||||
|
||||
#if CONFIG_SENSOR_DRIVER_ENABLE && TCFG_VCHR11S_ENABLE
|
||||
|
||||
#define LOG(fmt,...) printf("[vcHr11] " fmt "\n",##__VA_ARGS__)
|
||||
|
||||
#define IIC_ADDR_W (0x33<<1 | 0)
|
||||
#define IIC_ADDR_R (0x33<<1 | 1)
|
||||
|
||||
|
||||
const uint32_t mcuOscData = 30000; // Timer clock frequency Be used to adjust INT frequency
|
||||
const uint16_t mcuI2cClock = 400; // MCU I2C clock frequency
|
||||
|
||||
static vcHr11_t vcHr11;
|
||||
|
||||
static s16 sensor_data[50 * 2];
|
||||
static cbuffer_t sensor_cbuffer;
|
||||
static cbuffer_child_t entry[1];//支持3个成员读取
|
||||
|
||||
static sensor_info_t sensor_info = {
|
||||
.type = SENSOR_DRV_HR_SPO2,
|
||||
.name = "lc11s",
|
||||
.odr = {10, 25, 50, 100},
|
||||
.cbuffer = 0,
|
||||
};
|
||||
|
||||
|
||||
|
||||
extern u64 lptmr1_get_pass_us(void);
|
||||
extern u64 __lp_timer_get_cnt(u8 lptmr_x);
|
||||
extern u32 lrc_get_avg_freq(void);
|
||||
|
||||
u32 vcHr11GetRtcCountFromMCU(void)
|
||||
{
|
||||
static u64 cnt = 0;
|
||||
u32 pass_32bitcnt;
|
||||
|
||||
if (lrc_get_avg_freq() == 0) {
|
||||
LOG("lrc_get_avg_freq is 0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* cnt += lptmr1_get_pass_us(); */
|
||||
|
||||
cnt = lptmr1_get_pass_us();
|
||||
pass_32bitcnt = cnt / (1000000 / mcuOscData);
|
||||
pass_32bitcnt = pass_32bitcnt & (0xffffffff);
|
||||
LOG("cnt=%d %d ", pass_32bitcnt, (u32)lptmr1_get_pass_us());
|
||||
return pass_32bitcnt;
|
||||
}
|
||||
|
||||
vcHr11Ret_t vcHr11WriteRegisters(uint8_t startAddress, uint8_t *pRegisters, uint8_t len)
|
||||
{
|
||||
u8 ret = sensor_write(IIC_ADDR_W, startAddress, pRegisters, len);
|
||||
return ret == RET_OK ? VCHR11RET_ISOK : VCHR11RET_ISERR;
|
||||
}
|
||||
|
||||
|
||||
vcHr11Ret_t vcHr11ReadRegisters(uint8_t startAddress, uint8_t *pRegisters, uint8_t len)
|
||||
{
|
||||
u8 ret = sensor_read(IIC_ADDR_R, startAddress, pRegisters, len, 0);
|
||||
return ret == RET_OK ? VCHR11RET_ISOK : VCHR11RET_ISERR;
|
||||
}
|
||||
|
||||
static s8 sensor_check(void)
|
||||
{
|
||||
u8 dev_id = 0;
|
||||
u32 vcHr11_addr = (u32)(&vcHr11);
|
||||
|
||||
sensor_read(IIC_ADDR_R, VCREG0, &dev_id, 1, 0);
|
||||
|
||||
if (sensor_info.cbuffer == NULL) {
|
||||
memcpy(sensor_info.range, &vcHr11_addr, sizeof(u32));
|
||||
sensor_info.cbuffer = &sensor_cbuffer;
|
||||
cbuf_mult_read_init(sensor_info.cbuffer, sensor_data, sizeof(sensor_data), 1, entry);
|
||||
}
|
||||
LOG("dev_id=%02x cbuf=%x vcHr11_addr=%x", dev_id, (u32)sensor_info.cbuffer, vcHr11_addr);
|
||||
return ((0x21 == dev_id || 0x29 == dev_id) && sensor_info.cbuffer) ? RET_OK : RET_ERR;
|
||||
}
|
||||
|
||||
|
||||
static s8 sensor_open(u16 vcHr11WorkMode, u16 odr)
|
||||
{
|
||||
vcHr11Ret_t ret = VCHR11RET_ISOK;
|
||||
vcHr11_t *pVcHr11 = &vcHr11;
|
||||
|
||||
LOG("mode=%d", vcHr11WorkMode);
|
||||
|
||||
cbuf_clear(sensor_info.cbuffer);
|
||||
|
||||
ret = vcHr11SoftReset(pVcHr11);
|
||||
ret = vcHr11StopSample(pVcHr11);
|
||||
|
||||
if (VCWORK_MODE_POWER_OFF != vcHr11WorkMode) {
|
||||
|
||||
pVcHr11->vcSampleRate = odr;
|
||||
pVcHr11->mcuOscValue = mcuOscData;
|
||||
pVcHr11->mcuSclRate = mcuI2cClock;
|
||||
pVcHr11->workMode = vcHr11WorkMode;
|
||||
|
||||
ret = vcHr11StartSample(pVcHr11);
|
||||
}
|
||||
return ret == VCHR11RET_ISOK ? RET_OK : RET_ERR;
|
||||
}
|
||||
|
||||
static s8 sensor_close(void)
|
||||
{
|
||||
vcHr11Ret_t ret = VCHR11RET_ISOK;
|
||||
vcHr11_t *pVcHr11 = &vcHr11;
|
||||
|
||||
ret = vcHr11SoftReset(pVcHr11);
|
||||
ret = vcHr11StopSample(pVcHr11);
|
||||
return ret == VCHR11RET_ISOK ? RET_OK : RET_ERR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static s8 sensor_process(void *arg, u16 *len)
|
||||
{
|
||||
u16 buf_len = 0;
|
||||
u8 ppgLength = 0;
|
||||
|
||||
vcHr11GetSampleValues(&vcHr11, &ppgLength);
|
||||
LOG("oscFlg=%d ppgLength=%d readFlg=%d wearStatus=%d", vcHr11.oscCheckFinishFlag, ppgLength, vcHr11.vcFifoReadFlag, vcHr11.wearStatus);
|
||||
|
||||
if (vcHr11.vcFifoReadFlag && vcHr11.wearStatus) {
|
||||
vcHr11.vcFifoReadFlag = 0;
|
||||
if (ppgLength > 0) {
|
||||
cbuf_write(sensor_info.cbuffer, vcHr11.sampleData.ppgValue, ppgLength * sizeof(u16));
|
||||
}
|
||||
}
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
REGISTER_SENSOR(sensor_hr) = {
|
||||
.info = &sensor_info,
|
||||
.online = sensor_check,
|
||||
.open = sensor_open,
|
||||
.close = sensor_close,
|
||||
.run = sensor_process,
|
||||
};
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,291 @@
|
||||
|
||||
#ifndef LIB_vcHr11_HCI_vcHr11HCI_H_
|
||||
#define LIB_vcHr11_HCI_vcHr11HCI_H_
|
||||
|
||||
#include "stdint.h"
|
||||
#include "sdk_config.h"
|
||||
#include "includes.h"
|
||||
|
||||
|
||||
#define Drive_Version V_1_9_4
|
||||
|
||||
#define HW_HALVE_POWER_CAP 1 //sample config param halve & oversample double
|
||||
|
||||
/* HW_LC09A_PROJ(1), single green led
|
||||
* HW_LC09A_PROJ(0), 10A/11S project
|
||||
*/
|
||||
#define HW_LC09A_PROJ 1
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Register Address Declaration
|
||||
*
|
||||
******************************************************************************/
|
||||
/* Read Only */
|
||||
#define VCREG0 (0x00)
|
||||
#define VCREG0_SIZE (1)
|
||||
#define VCREG1 (0x01)
|
||||
#define VCREG1_SIZE (1)
|
||||
#define VCREG2 (0x02)
|
||||
#define VCREG2_SIZE (1)
|
||||
#define VCREG3 (0x03)
|
||||
#define VCREG3_SIZE (1)
|
||||
#define VCREG4 (0x04)
|
||||
#define VCREG4_SIZE (1)
|
||||
#define VCREG5 (0x05)
|
||||
#define VCREG5_SIZE (1)
|
||||
#define VCREG6 (0x06)
|
||||
#define VCREG6_SIZE (1)
|
||||
#define VCREG7 (0x07)
|
||||
#define VCREG7_SIZE (2)
|
||||
#define VCREG8 (0x09)
|
||||
#define VCREG8_SIZE (2)
|
||||
#define VCREG9 (0x80)
|
||||
#define VCREG9_SIZE (128)
|
||||
|
||||
/* Write Only */
|
||||
#define VCREG10 (0x3B)
|
||||
#define VCREG10_SIZE (1)
|
||||
|
||||
/* Read or Write */
|
||||
#define VCREG11 (0x10)
|
||||
#define VCREG11_SIZE (1)
|
||||
#define VCREG12 (0x11)
|
||||
#define VCREG12_SIZE (1)
|
||||
#define VCREG13 (0x12)
|
||||
#define VCREG13_SIZE (1)
|
||||
#define VCREG14 (0x13)
|
||||
#define VCREG14_SIZE (1)
|
||||
#define VCREG15 (0x14)
|
||||
#define VCREG15_SIZE (2)
|
||||
#define VCREG16 (0x16)
|
||||
#define VCREG16_SIZE (1)
|
||||
#define VCREG17 (0x17)
|
||||
#define VCREG17_SIZE (1)
|
||||
#define VCREG18 (0x18)
|
||||
#define VCREG18_SIZE (1)
|
||||
#define VCREG19 (0x19)
|
||||
#define VCREG19_SIZE (1)
|
||||
#define VCREG20 (0x1A)
|
||||
#define VCREG20_SIZE (1)
|
||||
#define VCREG21 (0x1B)
|
||||
#define VCREG21_SIZE (1)
|
||||
#define VCREG22 (0x1C)
|
||||
#define VCREG22_SIZE (1)
|
||||
#define VCREG23 (0x1D)
|
||||
#define VCREG23_SIZE (1)
|
||||
#define VCREG24 (0x1E)
|
||||
#define VCREG24_SIZE (1)
|
||||
#define VCREG25 (0x1F)
|
||||
#define VCREG25_SIZE (1)
|
||||
#define VCREG26 (0x20)
|
||||
#define VCREG26_SIZE (1)
|
||||
#define VCREG27 (0x21)
|
||||
#define VCREG27_SIZE (1)
|
||||
#define VCREG28 (0x22)
|
||||
#define VCREG28_SIZE (1)
|
||||
|
||||
|
||||
/* Bit fields for VCREG1s */
|
||||
#define VCREG1_CONFLICT (0x01 << 4)
|
||||
#define VCREG1_INSAMPLE (0x01 << 3)
|
||||
#define VCREG1_INTPS (0x01 << 4)
|
||||
#define VCREG1_INTOV (0x01 << 3)
|
||||
#define VCREG1_INTFIFO (0x01 << 2)
|
||||
#define VCREG1_INTENV (0x01 << 1)
|
||||
#define VCREG1_INTPPG (0x01 << 0)
|
||||
|
||||
/* Threshold Settings */
|
||||
#define VCENV_TH 8 //Causes of ENV interruption
|
||||
#define VCPPG_TH 10 //Causes of PPG interruption PPG_TH = 300
|
||||
#define VCPS_TH 4
|
||||
#define VCADJUST_INCREASE 22 // 1.4 << 4 = 22.4//1.4f
|
||||
#define VCADJUST_DECREASE 11 // 0.7 << 4 = 11.2//0.7f
|
||||
#define VCADJUST_STEP_MAX 32
|
||||
#define VCADJUST_STEP_MIN 1
|
||||
|
||||
#define VCUNWEAR_CNT 3
|
||||
#define VCISWEAR_CNT 1
|
||||
|
||||
#define SLOTCHNU 3
|
||||
|
||||
#define VCWEAR_STATUS_DETECTION_OFF 0
|
||||
#define VCWEAR_STATUS_DETECTION_ON 1
|
||||
#define VCWEAR_STATUS_DETECTION_MODE VCWEAR_STATUS_DETECTION_ON
|
||||
|
||||
#define VCWEAR_READ_FIFO_BY_TIME (0)
|
||||
#define VCWEAR_READ_FIFO_BY_INT (1)
|
||||
#if TCFG_HR_SENSOR_READ_BY_INT
|
||||
#define VCWEAR_READ_FIFO_MODE VCWEAR_READ_FIFO_BY_INT
|
||||
#else
|
||||
#define VCWEAR_READ_FIFO_MODE VCWEAR_READ_FIFO_BY_TIME
|
||||
#endif
|
||||
|
||||
#define SportMotionEn 0
|
||||
#define BiometricEn 0
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Data Type Declaration
|
||||
*
|
||||
******************************************************************************/
|
||||
typedef enum {
|
||||
VCWORK_MODE_HRWORK = 0,
|
||||
VCWORK_MODE_CROSSTALKTEST = 1,
|
||||
VCWORK_MODE_SPO2WORK = 2,
|
||||
VCWORK_MODE_GSENSORWORK = 3,
|
||||
VCWORK_MODE_TEMPWORK = 4,
|
||||
VCWORK_MODE_NOISEWORK = 5,
|
||||
VCWORK_MODE_LPDETECTION = 6,
|
||||
VCWORK_MODE_POWER_OFF = 255,
|
||||
} vcHr11Mode_t;
|
||||
|
||||
typedef enum {
|
||||
VCHR11ADJUSTDIRECTION_NULL = 0,
|
||||
VCHR11ADJUSTDIRECTION_UP = 1,
|
||||
VCHR11ADJUSTDIRECTION_DOWN = 2,
|
||||
} vcHr11AdjustDirection;
|
||||
|
||||
typedef enum {
|
||||
VERSION_A = 0,
|
||||
VERSION_B = 1,
|
||||
} vcHr11Version_t;
|
||||
|
||||
typedef struct {
|
||||
vcHr11AdjustDirection direction;
|
||||
vcHr11AdjustDirection directionLast;
|
||||
uint16_t step;
|
||||
} vcHr11AdjustInfo_t;
|
||||
|
||||
typedef enum {
|
||||
VCHR11WEARST_UNWEAR = 0,
|
||||
VCHR11WEARST_ISWEAR = 1,
|
||||
} vcHr11WearStatus_e;
|
||||
|
||||
typedef enum {
|
||||
VCHR11RET_ISOK = 0,
|
||||
VCHR11RET_ISWEARTOUNWEAR = 1,
|
||||
VCHR11RET_UNWEARTOISWEAR = 2,
|
||||
VCHR11RET_ISERR = 4,
|
||||
VCHR11RET_ISCONFLICT = 8,
|
||||
VCHR11RET_ISINSAMPLE = 16,
|
||||
VCHR11RET_SOLTISOVERLOAD = 32,
|
||||
VCHR11RET_PSISOVERLOAD = 64,
|
||||
VCHR11RET_ENVCURRENTISLARGE = 128,
|
||||
VCHR11RET_PSENVCURRENTISLARGE = 256,
|
||||
VCHR11RET_PPGCANNOTADJUSTABLE = 512,
|
||||
VCHR11RET_FIFOISOVERFLOW = 1024,
|
||||
VCHR11RET_PDRESISMAX = 2048,
|
||||
VCHR11RET_PDRESCANNOTRELEASE = 4096,
|
||||
} vcHr11Ret_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t maxLedCur;
|
||||
uint8_t pdResValue[3];
|
||||
uint8_t currentValue[3];
|
||||
uint8_t psValue; //PS Sample value.
|
||||
uint8_t preValue[2]; //Environment Sample value.
|
||||
uint8_t envValue[3]; //Environment Sample value.
|
||||
uint16_t ppgValue[128]; //PPG sample value.
|
||||
} vcHr11SampleData_t;
|
||||
|
||||
typedef struct {
|
||||
bool isRunning;
|
||||
bool vcFifoReadFlag;
|
||||
bool vcPsFlag;
|
||||
bool oscCheckFinishFlag;
|
||||
|
||||
uint8_t regConfig[17];
|
||||
uint8_t unWearCnt;
|
||||
uint8_t isWearCnt;
|
||||
uint8_t vcHr11Status;
|
||||
uint8_t intReason;
|
||||
uint8_t devId;
|
||||
vcHr11Mode_t workMode;
|
||||
vcHr11Version_t version;
|
||||
vcHr11WearStatus_e wearStatus;
|
||||
|
||||
uint16_t vcSampleRate;
|
||||
uint16_t mcuOscValue;
|
||||
uint16_t mcuSclRate;
|
||||
vcHr11AdjustInfo_t adjustInfo[2];
|
||||
vcHr11SampleData_t sampleData;
|
||||
|
||||
} vcHr11_t;
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Function Declaration
|
||||
******************************************************************************/
|
||||
/*
|
||||
* @brief
|
||||
* Get sample datas from vcHr11.
|
||||
*
|
||||
**/
|
||||
vcHr11Ret_t vcHr11GetSampleValues(vcHr11_t *pvcHr11, uint8_t *DataLen);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* Manual start sample of vcHr11.
|
||||
*
|
||||
**/
|
||||
vcHr11Ret_t vcHr11StartSample(vcHr11_t *pvcHr11);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* Manual stop sample of vcHr11.
|
||||
*
|
||||
**/
|
||||
vcHr11Ret_t vcHr11StopSample(vcHr11_t *pvcHr11);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* Manual SoftReset the vcHr11
|
||||
*
|
||||
**/
|
||||
vcHr11Ret_t vcHr11SoftReset(vcHr11_t *pvcHr11);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* init the vcHr11
|
||||
*
|
||||
**/
|
||||
extern void vcHr11Init(vcHr11_t *pVcHr11, vcHr11Mode_t vcHr11WorkMode);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
*
|
||||
**/
|
||||
extern vcHr11Ret_t vcHr11ReadRegisters(uint8_t startAddress, uint8_t *pRegisters, uint8_t len);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
*
|
||||
*
|
||||
**/
|
||||
extern vcHr11Ret_t vcHr11WriteRegisters(uint8_t startAddress, uint8_t *pRegisters, uint8_t len);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* Write Registers to vcHr11. This function needs to be implemented
|
||||
* according to the MCU.
|
||||
**/
|
||||
extern uint32_t vcHr11GetRtcCountFromMCU(void);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
*
|
||||
*
|
||||
**/
|
||||
extern void green_led_off_state_gsensor_abs_sum_diff_func(int32_t x_axis_value, int32_t y_axis_value, int32_t z_axis_value);
|
||||
|
||||
typedef vcHr11Ret_t (* vcHr11_read_cb)(uint8_t startAddress, uint8_t *pRegisters, uint8_t len);
|
||||
typedef vcHr11Ret_t (* vcHr11_write_cb)(uint8_t startAddress, uint8_t *pRegisters, uint8_t len);
|
||||
|
||||
|
||||
#define DEBUG_LOG(fmt,...) //printf("[vchr] %s " fmt "\n",__func__, ##__VA_ARGS__)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,179 @@
|
||||
#include "sensor_driver.h"
|
||||
#include "includes.h"
|
||||
#include "uart.h"
|
||||
#include "debug.h"
|
||||
#include "gpio.h"
|
||||
#include "bank_switch.h"
|
||||
#include "usr_timer.h"
|
||||
#include "iic_api.h"
|
||||
|
||||
|
||||
#if CONFIG_SENSOR_DRIVER_ENABLE
|
||||
|
||||
#define LOG(fmt,...) printf("[driver] %s " fmt "\n",__func__, ##__VA_ARGS__)
|
||||
|
||||
static u8 sensor_timer_msec = 200;
|
||||
|
||||
|
||||
u8 sensor_write(u8 iic_dev_addr, u8 register_address, u8 *buf, u8 data_len)
|
||||
{
|
||||
int ret = hw_i2c_master_write_nbytes_to_device_reg(HW_IIC_0, iic_dev_addr, ®ister_address, 1, buf, data_len);
|
||||
return ret == data_len ? RET_OK : RET_ERR;
|
||||
}
|
||||
|
||||
u8 sensor_read(u8 iic_dev_addr, u8 register_address, u8 *buf, u8 data_len, u8 ignore_len)
|
||||
{
|
||||
int ret = hw_i2c_master_read_nbytes_from_device_reg(HW_IIC_0, iic_dev_addr, ®ister_address, 1, buf, data_len);
|
||||
return ret == data_len ? RET_OK : RET_ERR;
|
||||
}
|
||||
|
||||
SENSOR_INTERFACE *sensor_driver_find(sensor_type_t type)
|
||||
{
|
||||
SENSOR_INTERFACE *sensor_driver = NULL;
|
||||
list_for_each_sensor(sensor_driver) {
|
||||
if (sensor_driver->info->type == type) {
|
||||
return sensor_driver;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void sensor_info_printf(void)
|
||||
{
|
||||
#if CONFIG_UART_DEBUG_ENABLE
|
||||
printf("\n\n******** sensor info ********\n");
|
||||
SENSOR_INTERFACE *driver = NULL;
|
||||
|
||||
list_for_each_sensor(driver) {
|
||||
printf("\nname : %s\n", driver->info->name);
|
||||
printf("type : %d\n", driver->info->type);
|
||||
printf("state : %d\n", driver->info->state);
|
||||
printf("range : +-%d +-%d +-%d +-%d\n", driver->info->range[0], driver->info->range[1], driver->info->range[2], driver->info->range[3]);
|
||||
printf("odr : %d %d %d %d\n", driver->info->odr[0], driver->info->odr[1], driver->info->odr[2], driver->info->odr[3]);
|
||||
}
|
||||
printf("\n****** sensor info end ******\n\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void sensor_driver_check(void)
|
||||
{
|
||||
SENSOR_INTERFACE *sensor_driver = NULL;
|
||||
list_for_each_sensor(sensor_driver) {
|
||||
if ((sensor_driver->online != NULL) && (sensor_driver->online() == RET_OK)) {
|
||||
sensor_driver->info->state = SENSOR_STATE_ONLINE;
|
||||
} else {
|
||||
sensor_driver->info->state = SENSOR_STATE_OFFLINE;
|
||||
}
|
||||
}
|
||||
|
||||
//发送sensor_drvier_info给大核
|
||||
int msg[3];
|
||||
msg[0] = MSG_P11_SENSOR_INFO;
|
||||
msg[1] = (int)&sensor_dev_begin;
|
||||
msg[2] = (int)&sensor_dev_end;
|
||||
int ret = p2m_post_msg(MSG_APP, 0, (u8 *)msg, sizeof(msg));
|
||||
LOG("begin=%x end=%x ret=%d", (u32)sensor_dev_begin, (u32)sensor_dev_end, ret);
|
||||
sensor_info_printf();
|
||||
}
|
||||
|
||||
static void sensor_timer_irq_handle(void *priv)
|
||||
{
|
||||
task_post_msg(NULL, 1, MSG_P11_SYS_KICK);
|
||||
}
|
||||
|
||||
|
||||
void sensor_timer_enable(u8 enable)
|
||||
{
|
||||
static u16 timer_handle = 0;
|
||||
|
||||
if (enable && timer_handle == 0) {
|
||||
timer_handle = usr_timer_add(NULL, sensor_timer_irq_handle, sensor_timer_msec, 1);
|
||||
LOG("handle=%d msec=%d", timer_handle, sensor_timer_msec);
|
||||
} else if ((!enable) && (timer_handle > 0)) {
|
||||
usr_timer_del(timer_handle);
|
||||
timer_handle = 0;
|
||||
LOG("handle=%d", timer_handle);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void sensor_timer_modify(u32 msec)
|
||||
{
|
||||
sensor_timer_msec = msec;
|
||||
sensor_timer_enable(0);
|
||||
sensor_timer_enable(1);
|
||||
}
|
||||
|
||||
void sensor_driver_sleep(u8 type, u8 enable)
|
||||
{
|
||||
SENSOR_INTERFACE *sensor_driver = sensor_driver_find(type);
|
||||
if (sensor_driver->sleep) {
|
||||
LOG("type=%d enable=%d", type, enable);
|
||||
sensor_driver->sleep();
|
||||
sensor_timer_enable(!enable);
|
||||
}
|
||||
}
|
||||
|
||||
void sensor_driver_irq_handle(void)
|
||||
{
|
||||
__attribute__((weak)) s8 driver_sc7a20_is_wake(void);
|
||||
if (driver_sc7a20_is_wake) {
|
||||
if (driver_sc7a20_is_wake() == RET_OK) {
|
||||
sensor_timer_enable(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sensor_driver_init(u8 type, u8 enable, u16 range, u8 odr)
|
||||
{
|
||||
SENSOR_INTERFACE *sensor_driver = sensor_driver_find(type);
|
||||
LOG("type=%d enable=%d range=%d odr=%d driver=%x", type, enable, range, odr, (u32)sensor_driver);
|
||||
|
||||
if ((sensor_driver != NULL) && (sensor_driver->open != NULL)) {
|
||||
if (enable) {
|
||||
if (sensor_driver->open(range, odr) == RET_OK) {
|
||||
sensor_driver->info->state = SENSOR_STATE_OPEN;
|
||||
sensor_timer_enable(1);
|
||||
LOG("type %d sucess!", type);
|
||||
} else {
|
||||
LOG("type %d failed!", type);
|
||||
}
|
||||
} else {
|
||||
if (sensor_driver->close() == RET_OK) {
|
||||
sensor_driver->info->state = SENSOR_STATE_CLOSE;
|
||||
LOG("type %d sucess!", type);
|
||||
} else {
|
||||
LOG("type %d failed!", type);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
LOG("no driver for sensor %d", type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void sensor_driver_run(void)
|
||||
{
|
||||
u16 data[30 * 3];
|
||||
u16 size = sizeof(data);
|
||||
|
||||
SENSOR_INTERFACE *sensor_driver = NULL;
|
||||
SENSOR_INTERFACE *acceler_algorithm = NULL;
|
||||
|
||||
acceler_algorithm = sensor_driver_find(SENSOR_ALGO_WRIST_TILT);
|
||||
list_for_each_sensor(sensor_driver) {
|
||||
if ((sensor_driver->info->type < SENSOR_DRV_MAX_NUM) &&
|
||||
(sensor_driver->info->state == SENSOR_STATE_OPEN) && (sensor_driver->run)) {
|
||||
sensor_driver->run(data, &size);
|
||||
|
||||
if ((sensor_driver->info->type == SENSOR_DRV_ACCELER) &&
|
||||
(acceler_algorithm != NULL) && (acceler_algorithm->run)) {
|
||||
acceler_algorithm->run(data, &size);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,92 @@
|
||||
#pragma once
|
||||
|
||||
#include "includes.h"
|
||||
#include "circular_buf.h"
|
||||
#include "main.h"
|
||||
|
||||
#define RET_OK (1)
|
||||
#define RET_ERR (0)
|
||||
|
||||
typedef enum {
|
||||
|
||||
SENSOR_DRV_ACCELER = 0x00,
|
||||
SENSOR_DRV_GYRO,
|
||||
SENSOR_DRV_MAGNETIC,
|
||||
SENSOR_DRV_HR,
|
||||
SENSOR_DRV_SPO2,
|
||||
SENSOR_DRV_HR_SPO2,
|
||||
SENSOR_DRV_WEAR_DETECTION,
|
||||
SENSOR_DRV_TEMP,
|
||||
SENSOR_DRV_MAX_NUM,
|
||||
|
||||
SENSOR_ALGO_WRIST_TILT = 0x20,
|
||||
SENSOR_ALGO_HR,
|
||||
SENSOR_ALGO_SPO2,
|
||||
SENSOR_ALGO_STEP_COUNTER,
|
||||
} sensor_type_t;
|
||||
|
||||
|
||||
typedef enum {
|
||||
SENSOR_STATE_OFFLINE = 0,
|
||||
SENSOR_STATE_ONLINE = 1,
|
||||
SENSOR_STATE_CLOSE = 1,
|
||||
SENSOR_STATE_OPEN = 2,
|
||||
} sensor_state_t;
|
||||
|
||||
typedef struct {
|
||||
u8 addr;
|
||||
u8 value;
|
||||
} sensor_regs_t;
|
||||
|
||||
typedef struct {
|
||||
u8 type;
|
||||
u8 state;
|
||||
u8 name[20];
|
||||
u8 odr[4];
|
||||
u16 range[4];
|
||||
cbuffer_t *cbuffer;
|
||||
} sensor_info_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
u8 type;
|
||||
u8 enable;
|
||||
u8 odr;
|
||||
u16 range;
|
||||
} p11_sensor_t;
|
||||
|
||||
typedef struct {
|
||||
sensor_info_t *info;
|
||||
s8(*open)(u16 range, u16 odr);
|
||||
s8(*close)(void);
|
||||
s8(*run)(void *arg, u16 *len);
|
||||
s8(*online)(void);
|
||||
s8(*sleep)(void);
|
||||
} SENSOR_INTERFACE;
|
||||
|
||||
extern SENSOR_INTERFACE sensor_dev_begin[];
|
||||
extern SENSOR_INTERFACE sensor_dev_end[];
|
||||
|
||||
#define REGISTER_SENSOR(Sensor) \
|
||||
static const SENSOR_INTERFACE Sensor SEC_USED(.sensor_dev)
|
||||
|
||||
#define list_for_each_sensor(c) \
|
||||
for (c=sensor_dev_begin; c<sensor_dev_end; c++)
|
||||
|
||||
|
||||
typedef struct {
|
||||
short x;
|
||||
short y;
|
||||
short z;
|
||||
} axis_data_t;
|
||||
|
||||
u8 sensor_write(u8 w_chip_id, u8 register_address, u8 *buf, u8 data_len);
|
||||
u8 sensor_read(u8 r_chip_id, u8 register_address, u8 *buf, u8 data_len, u8 ignore_len);
|
||||
|
||||
void sensor_timer_modify(u32 msec);
|
||||
|
||||
void sensor_driver_check(void);
|
||||
void sensor_driver_init(u8 type, u8 enable, u16 range, u8 odr);
|
||||
void sensor_driver_run(void);
|
||||
void sensor_driver_sleep(u8 type, u8 enable);
|
||||
void sensor_driver_irq_handle(void);
|
||||
@@ -0,0 +1,88 @@
|
||||
#include "sdk_config.h"
|
||||
#include "sensor_driver.h"
|
||||
#include "includes.h"
|
||||
#include "sensor_service_wrist_tilt.h"
|
||||
|
||||
|
||||
#if CONFIG_SENSOR_DRIVER_ENABLE
|
||||
|
||||
#define LOG(fmt,...) printf("[algo] %s() " fmt "\n",__func__, ##__VA_ARGS__)
|
||||
|
||||
enum {
|
||||
MSYS_STATE_NORMAL = 0,
|
||||
MSYS_STATE_PWR_DOWN,
|
||||
MSYS_STATE_PWR_OFF,
|
||||
MSYS_STATE_SOFT_PWR_OFF,
|
||||
MSYS_STATE_SOFT_PWR_OFF_KEEP_NVRAM,
|
||||
MSYS_STATE_LIGHT_PWR_DOWN,
|
||||
};
|
||||
|
||||
#define MSYS_STATE_GET() (P11_SYSTEM->P11_SYS_CON0 & 0xf)
|
||||
|
||||
|
||||
static sensor_info_t sensor_info = {
|
||||
.type = SENSOR_ALGO_WRIST_TILT,
|
||||
.name = "JL GESTURE V1.0",
|
||||
};
|
||||
|
||||
static s8 wrist_tilt_online(void)
|
||||
{
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static void wrist_tilt_event_response(u8 event)
|
||||
{
|
||||
static u8 p11_algo_event;
|
||||
|
||||
p11_algo_event = event;
|
||||
u8 low_power_mode = MSYS_STATE_GET() != MSYS_STATE_NORMAL;
|
||||
|
||||
if (p11_algo_event == ALGO_WRIST_DOWN && low_power_mode) {
|
||||
return;
|
||||
}
|
||||
LOG(" %d", event);
|
||||
|
||||
//发送 算法事件 给大核
|
||||
int msg[2];
|
||||
msg[0] = MSG_P11_ALGORITHM_EVENT;
|
||||
msg[1] = p11_algo_event;
|
||||
p2m_post_msg(MSG_APP, 0, (u8 *)msg, sizeof(msg));
|
||||
}
|
||||
|
||||
s8 wrist_tilt_run(void *arg, u16 *len)
|
||||
{
|
||||
axis_data_t *accel_data = arg;
|
||||
u8 accel_point = *len / sizeof(axis_data_t);
|
||||
|
||||
jl_gesture_event_t gesture_event = ALGO_NOTHING;
|
||||
|
||||
for (u8 i = 0; i < accel_point; i++) {
|
||||
gesture_event = sensor_jl_gesture_run(accel_data[i].x, accel_data[i].y, accel_data[i].z);
|
||||
if (sensor_info.state == SENSOR_STATE_OPEN && gesture_event != ALGO_NOTHING) {
|
||||
wrist_tilt_event_response(gesture_event);
|
||||
}
|
||||
// LOG("gesture=%d,xyz:%d,%d,%d",gesture_event,accel_data[i].x,accel_data[i].y,accel_data[i].z);
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static s8 wrist_tilt_open(u16 range, u16 odr)
|
||||
{
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static s8 wrist_tilt_close(void)
|
||||
{
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
REGISTER_SENSOR(wrist_tilt) = {
|
||||
.info = &sensor_info,
|
||||
.online = wrist_tilt_online,
|
||||
.open = wrist_tilt_open,
|
||||
.close = wrist_tilt_close,
|
||||
.run = wrist_tilt_run,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
typedef enum {
|
||||
ALGO_NOTHING, //没有相关动作
|
||||
ALGO_WRIST_UP, //抬腕动作
|
||||
ALGO_WRIST_DOWN, //落腕动作
|
||||
ALGO_DOUBLE_CLICK, //双击屏幕
|
||||
ALGO_HITTING, //击球动作
|
||||
ALGO_ON_DESK, //放置桌面
|
||||
} jl_gesture_event_t;
|
||||
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------*/
|
||||
/*
|
||||
* @brief 杰理手势算法 获取版本号
|
||||
*
|
||||
* @param [out] 10~255
|
||||
*
|
||||
*--------------------------------------------------------------------------*/
|
||||
unsigned char sensor_jl_gesture_ver(void);
|
||||
|
||||
/* --------------------------------------------------------------------------*/
|
||||
/*
|
||||
* @brief 杰理手势算法 开启debug模式
|
||||
*
|
||||
* @param [in] enable 0:关闭log打印 1:开启log打印
|
||||
*
|
||||
*--------------------------------------------------------------------------*/
|
||||
void sensor_jl_gesture_debug(char enable);
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------*/
|
||||
/*
|
||||
* @brief 杰理手势算法 设置抬腕算法的角度
|
||||
*
|
||||
* @param [in] angle [0]:翻腕角度,默认5 [1]:手腕与水平面的角度,默认<45
|
||||
*
|
||||
*--------------------------------------------------------------------------*/
|
||||
void sensor_jl_gesture_set_wrist_angle(char angle[2]);
|
||||
|
||||
/* --------------------------------------------------------------------------*/
|
||||
/*
|
||||
* @brief 杰理手势算法 运行接口
|
||||
*
|
||||
* @param [in] x accelerate x轴数据
|
||||
* @param [in] y accelerate y轴数据
|
||||
* @param [in] z accelerate z轴数据
|
||||
* @param [out] 算法输出,见 jl_gesture_event_t 定义
|
||||
*
|
||||
*--------------------------------------------------------------------------*/
|
||||
jl_gesture_event_t sensor_jl_gesture_run(short x, short y, short z);
|
||||
Reference in New Issue
Block a user