From: penglei <1624952103@qq.com> Date: Fri, 30 Aug 2024 12:53:11 +0000 (+0800) Subject: 更新cywee算法,添加MAC地址密钥激活方式,优化睡眠模式佩戴检测 X-Git-Tag: release_V1.2.70_20241020_135402~549^2~5 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=bc0b8329838bcbb0f53a2968cec07760df15ecec;p=mirrors%2FFD230.git 更新cywee算法,添加MAC地址密钥激活方式,优化睡眠模式佩戴检测 --- diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index 0d4b4a92f..6450c3ed3 100755 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -140,9 +140,10 @@ target = { 'SUPPORT_AT_CUSTOMUTILS', 'SUPPORT_BLE_SERVICE', 'FD230', - #"MEM_CHECK", + "MEM_CHECK", # 'ENABLE_WEBSOCKET', 'CYWEE_SPORT', + #'CYWEE_MAC_ACTIVE', 'SUPPORT_TCPIP', 'SUPPORT_HID_SERVICE', 'SUPPORT_BAIDU_MAP' diff --git a/code/sdk/drivers/peripheral/cywee/Inc/CWM_CustomDataStruct.h b/code/sdk/drivers/peripheral/cywee/Inc/CWM_CustomDataStruct.h index 0b9197016..533724479 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/CWM_CustomDataStruct.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/CWM_CustomDataStruct.h @@ -4,7 +4,7 @@ typedef struct CustomSensorData { uint32_t sensorType; float fData[16]; - double dData[10]; + double dData[12]; } CustomSensorData; #endif /* __CWM_CUSTOMDATASTRUCT_H__ */ diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h b/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h index 50c3087c3..e9511f6f5 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h @@ -31,7 +31,6 @@ #define SCL_CHIP_VENDOR_CONFIG 17 #define SCL_SLEEP_CONFIG 18 #define SCL_ABS_STATIC_CONFIG 19 -#define SCL_HEART_RATE_CONFIG 20 #define SCL_REQ_SWIM_EXIT 21 #define SCL_WATCH_FALL_CONFIG 22 #define SCL_AR_ALERT_CONFIG 23 @@ -61,6 +60,11 @@ #define SCL_FITNESS_INFO 49 #define SCL_SZ_BREACH_CONFIG 50 #define SCL_ACT_PAI_INFO2 51 +#define SCL_AIC_CONFIG 52 +#define SCL_AIC_INFO 53 +#define SCL_TRAJ_INFO 54 +#define SCL_PEDO_INFO 55 +#define SCL_MHR_ZONE_CONFIG 56 #define SCL_ALGO_PROC_CONFIG 100 #define SCL_INPUT_SENSOR_CONFIG 101 @@ -70,9 +74,12 @@ #define SCL_SENS_CALI_CTRL_MAG 111 #define SCL_SENS_CALI_CTRL_A 112 #define SCL_SPV_CONFIG 113 +#define SCL_FACTORY_CALI_CONFIG 113 #define SCL_SPV_MODE 114 +#define SCL_FACTORY_CALI_MODE 114 #define SCL_SENS_CALI_SET_MAG 115 #define SCL_SENS_CALI_SET_A 116 +#define SCL_SENS_CALI_CTRL_A2 117 #define SCL_SIN_HR_EXT 200 @@ -122,6 +129,7 @@ #define IDX_ONCHARGING_DETECT 18 #define IDX_ALGO_ABSOLUTE_STATIC 19 #define IDX_ALGO_SPV 20 +#define IDX_ALGO_FACTORY_CALI 20 #define IDX_ALGO_SENS_CALIBRATION 21 #define IDX_ALGO_INACTIVITY_OUTPUT 22 #define IDX_ALGO_STAND 23 diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h b/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h index b71e67019..b62bb362c 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h @@ -564,6 +564,8 @@ uint8_t cywee_get_active_state(void); uint8_t cywee_get_static_state(void); void cywee_restart_acc(void); void cywee_log_switch(int cmd); +void cywee_get_version(char *databuf,uint8_t len); + extern uint8_t hrs_mode_state; #pragma pack() diff --git a/code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.a b/code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.a index a74ed8668..5f22c2e12 100644 Binary files a/code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.a and b/code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.a differ diff --git a/code/sdk/drivers/peripheral/cywee/src/board_apollo3.c b/code/sdk/drivers/peripheral/cywee/src/board_apollo3.c new file mode 100644 index 000000000..217227327 --- /dev/null +++ b/code/sdk/drivers/peripheral/cywee/src/board_apollo3.c @@ -0,0 +1,319 @@ +/*********************/ +/*** Include Files ***/ +/*********************/ +#include +#include +#include "am_mcu_apollo.h" +#include "am_bsp.h" +#include "am_util.h" +#include "am_devices_i2c.h" +#include "cwm_lib.h" +#include "config.h" + +/*********************/ +/*** Macro Defines ***/ +/*********************/ +#define CLOCK_FREQ 1000 //It is clock frequency setting. +#define IOM_MODULE_NUMBER 0 +#define IOM_IRQn ((IRQn_Type)(IOMSTR0_IRQn + IOM_MODULE_NUMBER)) + +// +// Take over the interrupt handler for whichever IOM we're using. +// +#define iom_isr \ + am_iom_isr1(IOM_MODULE_NUMBER) +#define am_iom_isr1(n) \ + am_iom_isr(n) +#define am_iom_isr(n) \ + am_iomaster ## n ## _isr + + +/*************************/ +/*** Variables Defines ***/ +/*************************/ +uint32_t DMATCBBuffer[256]; +void *g_pIOMHandle; + +am_hal_iom_config_t g_sIomCfg = +{ + .eInterfaceMode = AM_HAL_IOM_I2C_MODE, + .ui32ClockFreq = AM_HAL_IOM_100KHZ, +}; + +static uint32_t m_tickLast = 0; +static uint64_t m_elpsedTime_us = 0; + + +/************************/ +/*** Function Defines ***/ +/************************/ +int CWM_OS_dbgPrintf(const char * format,...); + + +/********************************/ +/*** Function Implementations ***/ +/********************************/ +void iom_isr(void) +{ + uint32_t ui32Status; + + if (!am_hal_iom_interrupt_status_get(g_pIOMHandle, true, &ui32Status)) + { + if ( ui32Status ) + { + am_hal_iom_interrupt_clear(g_pIOMHandle, ui32Status); + am_hal_iom_interrupt_service(g_pIOMHandle, ui32Status); + } + } +} + +static void I2C_init(void) +{ + g_sIomCfg.ui32NBTxnBufLength = sizeof(DMATCBBuffer) / 4; + g_sIomCfg.pNBTxnBuf = &DMATCBBuffer[0]; + + am_devices_i2c_init(IOM_MODULE_NUMBER, &g_sIomCfg, &g_pIOMHandle); + + return; +} + +static void am_i2c_setting(void) +{ + I2C_init(); + NVIC_EnableIRQ(IOM_IRQn); +} + +static void am_i2c_deinit(void) +{ + am_devices_i2c_term(0); + NVIC_DisableIRQ(IOM_IRQn); +} + +static void APOLLO_I2C_Reset(void) +{ + am_i2c_deinit(); + am_util_delay_ms(20); + am_i2c_setting(); +} + +static void stimer_init(void) +{ + am_hal_stimer_int_enable(AM_HAL_STIMER_INT_COMPAREA); + NVIC_EnableIRQ(STIMER_CMPR0_IRQn); + am_hal_stimer_config(AM_HAL_STIMER_CFG_CLEAR | AM_HAL_STIMER_CFG_FREEZE); + am_hal_stimer_compare_delta_set(0, CLOCK_FREQ);//1 second timer + am_hal_stimer_config(AM_HAL_STIMER_LFRC_1KHZ | + AM_HAL_STIMER_CFG_COMPARE_A_ENABLE); + m_tickLast = am_hal_stimer_counter_get(); +} + +static uint64_t platsystickTicksToUs(uint64_t tick) { + return (uint64_t)(tick * 1000000/CLOCK_FREQ); +} + +static inline uint64_t calcElapsedTicks(uint64_t tickNow, uint64_t tickLast) +{ + if(tickNow >= tickLast) + return tickNow - tickLast; + else + return 0xFFFFFFFF - tickLast + tickNow; +} + +static void systickUpdate(void) +{ + //To implement the CWM_OS_GetTimeNs(), this function needs to be triggered every second + uint64_t tickNow; + uint64_t delta_ticks; + + tickNow = am_hal_stimer_counter_get(); + delta_ticks = calcElapsedTicks(tickNow, m_tickLast); + m_elpsedTime_us += platsystickTicksToUs(delta_ticks); + + m_tickLast = tickNow; +} + +void am_stimer_cmpr0_isr(void) +{ + //To implement the CWM_OS_GetTimeNs(), this function needs to be triggered every second + systickUpdate(); + + am_hal_stimer_int_clear(AM_HAL_STIMER_INT_COMPAREA); + am_hal_stimer_compare_delta_set(0, CLOCK_FREQ);//1 second timer +} + +#define BUS_RETRY_TIMES 3 +#define BUS_RECOVER_TIMES 1 + +int CWM_OS_i2cRead(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int argument) +{ + int res; + int rty = BUS_RETRY_TIMES; + int rcovery = BUS_RECOVER_TIMES; + + do{ + res = am_devices_i2c_blocking_read(slaveAddr, reg, readData, readDataSize); + + if(res == 0) + break; + + rty --; + if(rcovery > 0) + { + if(rty == 0) + { + rty = BUS_RETRY_TIMES; + rcovery --; + APOLLO_I2C_Reset(); + } + } + }while(rty > 0); + + + return (res>0) ? res*-1: res; +} + +int CWM_OS_i2cWrite(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int argument) +{ + int res; + int rty = BUS_RETRY_TIMES; + int rcovery = BUS_RECOVER_TIMES; + + do{ + res = am_devices_i2c_blocking_write(slaveAddr, reg, writeData, writeDataSize); + + if(res == 0) + break; + + rty --; + if(rcovery > 0) + { + if(rty == 0) + { + rty = BUS_RETRY_TIMES; + rcovery --; + APOLLO_I2C_Reset(); + } + } + }while(rty > 0); + + return (res>0) ? res*-1: res; +} + +int CWM_OS_i2cTransfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int argument) +{ + am_hal_iom_transfer_t desc; + memset(&desc, 0, sizeof(am_hal_iom_transfer_t)); + + desc.ui32InstrLen = regLength; + desc.ui32Instr = reg; + desc.uPeerInfo.ui32I2CDevAddr = slaveAddr >> 1; + desc.ui8RepeatCount = 0; + desc.ui32PauseCondition = 0; + desc.ui32StatusSetClr = 0; + desc.bContinue = false; + + if (readDataSize == 0) { + if (writeDataSize == 0 || writeData == NULL) + return -1; + + // write mode + desc.eDirection = AM_HAL_IOM_TX; + desc.ui32NumBytes = writeDataSize; + desc.pui32TxBuffer = (uint32_t *) writeData; + } + else { + if (readData == NULL) + return -1; + + // read mode + desc.eDirection = AM_HAL_IOM_RX; + desc.ui32NumBytes = readDataSize; + desc.pui32RxBuffer = (uint32_t *) readData; + } + + return am_hal_iom_blocking_transfer(g_pIOMHandle, &desc); +} + +void CWM_OS_uSleep(uint32_t time) +{ + uint32_t ms = time / 1000; + + if (ms == 0) + ms = 1; + am_util_delay_ms(ms); +} + +uint64_t CWM_OS_GetTimeNs(void) +{ + uint64_t tickNow; + uint64_t delta_ticks; + uint64_t timeNow_us; + + tickNow = am_hal_stimer_counter_get(); + delta_ticks = calcElapsedTicks(tickNow, m_tickLast); + timeNow_us = m_elpsedTime_us + platsystickTicksToUs(delta_ticks); + + return timeNow_us * 1000; +} + +void* CWM_OS_malloc(int size) +{ + if (size == 0) + size = 1; + return malloc(size); +} + +void CWM_OS_free(void *ptr) +{ + if (ptr == NULL) + return; + + free(ptr); +} + +int CWM_OS_dbgOutput(const char * format) +{ + am_util_stdio_printf("%s", format); + return 0; +} + +int CWM_OS_dbgOutput_checkLog(const char * format) +{ + static int s_sn = 0; + + am_util_stdio_printf("#_#|%d|%s", s_sn, format); + s_sn ++; + return 0; +} + +int CWM_OS_dbgPrintf(const char * format,...) +{ + char InputBuff[255]; + va_list args; + + va_start(args, format); + am_util_stdio_vsprintf(InputBuff, format, args); + va_end(args); + CWM_OS_dbgOutput(InputBuff); + return 0; +} + +void board_init(void) +{ + am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 0); //Set the clock frequency. + am_hal_cachectrl_config(&am_hal_cachectrl_defaults); //default cache configuration + am_hal_cachectrl_enable(); + am_bsp_low_power_init(); //Configure the board for low power operation. + +#ifdef PRINTF_FROM_UART + am_bsp_uart_printf_enable(); //Enable the UART print interface. +#else + am_bsp_itm_printf_enable(); //Enable the ITM print interface. Using "SWO Viewer" to show log +#endif + am_util_stdio_terminal_clear(); //Clear the terminal and print the banner. + am_i2c_setting(); + am_hal_interrupt_master_enable(); + + stimer_init(); //Timer Init +} + diff --git a/code/sdk/drivers/peripheral/cywee/src/board_nordic.c b/code/sdk/drivers/peripheral/cywee/src/board_nordic.c new file mode 100644 index 000000000..1e1373eff --- /dev/null +++ b/code/sdk/drivers/peripheral/cywee/src/board_nordic.c @@ -0,0 +1,479 @@ +/*********************/ +/*** Include Files ***/ +/*********************/ +#include +#include "boards.h" +#include "app_util_platform.h" +#include "nrf_delay.h" +#include "nrf_drv_timer.h" +#include "nrf_log.h" +#include "nrf_log_ctrl.h" +#include "nrf_log_default_backends.h" +#include "nrf_drv_twi.h" +#include "pca10040.h" +#include "cwm_lib.h" +#include "config.h" +#include "nrf_drv_clock.h" +#include "app_timer.h" +#include "nrf_drv_gpiote.h" + + +/*********************/ +/*** Macro Defines ***/ +/*********************/ +#define PCA10040_PIN_25 25 +#define PCA10040_PIN_28 28 +#define BUS_RETRY_TIMES 3 +#define BUS_RECOVER_TIMES 1 +#define TWI_INSTANCE_ID 0 +#define TIMER_PERIOD_1_SEC APP_TIMER_TICKS(1000) + +/*************************/ +/*** Variables Defines ***/ +/*************************/ +nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID); + +static uint64_t m_tickLast = 0; +static uint64_t m_elpsedTime_us = 0; +APP_TIMER_DEF(m_one_sec_timer); + +typedef struct +{ + uint16_t sensorType; + uint16_t sensorPin; + uint16_t mcuPin; + uint16_t mcu_int_method; + uint16_t mcu_int_connect; + PFN_IRQHANDLE callback; +} irq_item; + +typedef struct +{ + uint16_t sensorType; + uint16_t sensorPin; +} irq_argument; + +static irq_item m_irqHandler[] = +{ + { + .sensorType = CUSTOM_ACC, + .sensorPin = PIN_INT1, + .mcuPin = PCA10040_PIN_25, + .mcu_int_method = INT_TRIGGER_TYPE_FALLING, + .mcu_int_connect = INT_RESISTOR_NOPULL, + .callback = NULL, + }, + { + .sensorType = CUSTOM_ACC, + .sensorPin = PIN_INT2, + .mcuPin = PCA10040_PIN_28, + .mcu_int_method = INT_TRIGGER_TYPE_RISING, + .mcu_int_connect = INT_RESISTOR_PULLDOWN, + .callback = NULL, + }, +}; + + +/************************/ +/*** Function Defines ***/ +/************************/ +int CWM_OS_dbgPrintf(const char * format,...); + + +/********************************/ +/*** Function Implementations ***/ +/********************************/ +static void I2C_Init_Nordic(void) +{ + const nrf_drv_twi_config_t twi_config = { + .scl = ARDUINO_SCL_PIN, + .sda = ARDUINO_SDA_PIN, + .frequency = NRF_DRV_TWI_FREQ_400K, + .interrupt_priority = APP_IRQ_PRIORITY_HIGH, + .clear_bus_init = false + }; + + nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL); + nrf_drv_twi_enable(&m_twi); +} + +static void I2C_Uninit_Nordic(void) +{ + nrf_drv_twi_uninit(&m_twi); + *(volatile uint32_t *)0x40003FFC = 0; + *(volatile uint32_t *)0x40003FFC; + *(volatile uint32_t *)0x40003FFC = 1; +} + +static void I2C_Reset_Nordic(void) +{ + I2C_Uninit_Nordic(); + I2C_Init_Nordic(); +} + +static inline uint64_t calcElapsedTicks(uint64_t tickNow, uint64_t tickLast) +{ + if(tickNow >= tickLast) + return tickNow - tickLast; + else + return APP_TIMER_MAX_CNT_VAL - tickLast + tickNow; //Nordic RTC resolution is 24 bit, APP_TIMER_MAX_CNT_VAL = 0x00FFFFFF +} + +static uint64_t platsystickTicksToUs(uint64_t tick) { + return (uint64_t)(tick * 1000000 / APP_TIMER_CLOCK_FREQ); +} + +static void systickUpdate() +{ + //To implement the CWM_OS_GetTimeNs(), this function needs to be triggered every second + uint64_t tickNow; + uint64_t delta_ticks; + + tickNow = app_timer_cnt_get(); + delta_ticks = calcElapsedTicks(tickNow, m_tickLast); + m_elpsedTime_us += platsystickTicksToUs(delta_ticks); + m_tickLast = tickNow; +} + +static void one_sec_timer_handle(void * p_context) +{ + //To implement the CWM_OS_GetTimeNs(), this function needs to be triggered every second + systickUpdate(); +} + +static void timer_init(void) +{ + ret_code_t ret; + + ret = nrf_drv_clock_init(); + APP_ERROR_CHECK(ret); + + nrf_drv_clock_lfclk_request(NULL); + + ret = app_timer_init(); + APP_ERROR_CHECK(ret); + + ret = app_timer_create(&m_one_sec_timer, APP_TIMER_MODE_REPEATED, one_sec_timer_handle); + APP_ERROR_CHECK(ret); + + ret = app_timer_start(m_one_sec_timer, TIMER_PERIOD_1_SEC, NULL);//1 second timer + APP_ERROR_CHECK(ret); +} + +static void nordic_system_init(void) +{ + bsp_board_init(BSP_INIT_NONE); + APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); + NRF_LOG_DEFAULT_BACKENDS_INIT(); + I2C_Init_Nordic(); +} + +void Irq_callback(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action) +{ + for (int i=0; i> 1, (uint8_t*) ®, regLength, true); + if (res == NRF_SUCCESS) { + nrf_drv_twi_rx(&m_twi, slaveAddr >> 1, readData, readDataSize); + } + + if(res != 0) + break; + + rty --; + if(rcovery > 0) + { + if(rty == 0) + { + rty = BUS_RETRY_TIMES; + rcovery --; + I2C_Reset_Nordic(); + } + } + }while(rty > 0); + + + return (res>0) ? res*-1: res; +} + +int CWM_OS_i2cWrite(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int argument) +{ + int res; + int rty = BUS_RETRY_TIMES; + int rcovery = BUS_RECOVER_TIMES; + + do{ + uint8_t data[20]; + memset(data, 0, sizeof(data)); + + if (writeDataSize + 1 > sizeof(data)) { + return -1; + } + + memcpy(data, ®, regLength); + memcpy(&data[regLength], writeData, writeDataSize); + res = nrf_drv_twi_tx(&m_twi, slaveAddr >> 1, data, writeDataSize + regLength, false); + + if(res != 0) + break; + + rty --; + if(rcovery > 0) + { + if(rty == 0) + { + rty = BUS_RETRY_TIMES; + rcovery --; + I2C_Reset_Nordic(); + } + } + }while(rty > 0); + + return (res>0) ? res*-1: res; +} + +int CWM_OS_i2cTransfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int argument) +{ + uint8_t writeBuf[20]; + memset(writeBuf, 0, sizeof(writeBuf)); + + nrf_drv_twi_xfer_desc_t desc; + memset(&desc, 0, sizeof(nrf_drv_twi_xfer_desc_t)); + + desc.address = slaveAddr >> 1; + memcpy(writeBuf, ®, regLength); + desc.primary_length = regLength; + + if (readDataSize == 0) { + if (writeDataSize == 0 || writeData == NULL) + return -1; + + // write mode + memcpy(writeBuf + regLength, writeData, writeDataSize); + desc.primary_length += writeDataSize; + desc.type = NRF_DRV_TWI_XFER_TX; + } else { + if (readData == NULL) + return -1; + + // read mode + desc.type = NRF_DRV_TWI_XFER_TXRX; + } + + desc.p_primary_buf = writeBuf; + desc.secondary_length = readDataSize; + desc.p_secondary_buf = readData; + + return nrf_drv_twi_xfer(&m_twi, &desc, 0); +} + +void CWM_OS_uSleep(uint32_t time) +{ + uint32_t ms = time / 1000; + + if (ms == 0) + ms = 1; + nrf_delay_ms(ms); +} + +uint64_t CWM_OS_GetTimeNs(void) +{ + uint64_t tick; + uint64_t delta_ticks; + uint64_t timeNow_us; + + tick = app_timer_cnt_get(); + delta_ticks = calcElapsedTicks(tick, m_tickLast); + timeNow_us = m_elpsedTime_us + platsystickTicksToUs(delta_ticks); + + return timeNow_us * 1000; +} + +void* CWM_OS_malloc(int size) +{ + if (size == 0) + size = 1; + return malloc(size); +} + +void CWM_OS_free(void *ptr) +{ + if (ptr == NULL) + return; + + free(ptr); +} + +int CWM_OS_dbgOutput(const char * format) +{ + NRF_LOG_INFO("%s", format); + NRF_LOG_FLUSH(); + + return 0; +} + +int CWM_OS_dbgOutput_checkLog(const char * format) +{ + static int s_sn = 0; + + NRF_LOG_INFO("#_#|%d|%s", s_sn, format); + s_sn ++; + NRF_LOG_FLUSH(); + + return 0; +} + +int CWM_OS_dbgPrintf(const char * format,...) +{ + char InputBuff[255]; + va_list args; + + va_start(args, format); + + vsprintf(InputBuff, format, args); + + va_end(args); + CWM_OS_dbgOutput(InputBuff); + return 0; +} + +void board_init(void) +{ + nordic_system_init(); + timer_init(); +} diff --git a/code/sdk/drivers/peripheral/cywee/src/main_dml.c b/code/sdk/drivers/peripheral/cywee/src/main_dml.c index f8d173e19..83ede1d48 100644 --- a/code/sdk/drivers/peripheral/cywee/src/main_dml.c +++ b/code/sdk/drivers/peripheral/cywee/src/main_dml.c @@ -80,9 +80,19 @@ uint8_t cywee_ble_service_flag = 0; static uint8_t is_abs_static_state = 0; -int cm__hs1__init(void); +static char cywee_version[20] = {0}; + +#ifdef CYWEE_MAC_ACTIVE +int cm__hs1__mac_c0_init(void); +int cm__hs1__mac_c0r_init(void); int cm__hs1__deinit(void); +uint8_t SEC_FILE_ADDR[78] = {0}; + +#else +int cm__hs1__init(void); +int cm__hs1__deinit(void); +#endif void cywee_set_abs_static(void) { @@ -168,6 +178,11 @@ void cywee_get_chipinfo(char *databuf,uint8_t len) memcpy_s(databuf,len,chipInfo,strlen(chipInfo)); } +void cywee_get_version(char *databuf,uint8_t len) +{ + memcpy_s(databuf,len,cywee_version,strlen(cywee_version)); +} + void cywee_save_data(void) { stepcount+=history_step; @@ -748,7 +763,7 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { if((int)sensorEVT->fData[1] == CUSTOM_OFFBODY_DETECT) { CWM_OS_dbgPrintf("CUSTOM_OFFBODY_DETECT !!! \r\n"); -#if 0 +#if 1 if((int)sensorEVT->fData[2] == 1) send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_WEAR_MODE_TEST); else @@ -991,12 +1006,16 @@ int cywee_main_dml(void) cywee_installized = 1; +#ifdef CYWEE_MAC_ACTIVE + uapi_cywee_get_mac_key(SEC_FILE_ADDR,78); +#endif int i; memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; CWM_SettingControl(SCL_GET_LIB_INFO, &scl); CWM_OS_dbgPrintf("version:%d.%d.%d.%d product:%d model:%d\n", scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4], scl.iData[5], scl.iData[6]); CWM_OS_dbgPrintf("[DBG] ach: %d\n", scl.iData[7]); + sprintf(cywee_version,"%d.%d.%d.%d",scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4]); #if USE_P813 os_api api = { .GetTimeNs = CWM_OS_GetTimeNs, @@ -1049,13 +1068,19 @@ int cywee_main_dml(void) memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; scl.iData[1] = 31010100; +#ifdef CYWEE_MAC_ACTIVE + scl.iData[5] = (int)SEC_FILE_ADDR; +#endif CWM_SettingControl(SCL_CHIP_VENDOR_CONFIG, &scl); - //1.Init data uint32_t irqMask = 0; irqMask = osal_irq_lock(); +#ifdef CYWEE_MAC_ACTIVE + //cm__hs1__mac_c0_init();//若mac_address的排列為正相時呼叫的api + cm__hs1__mac_c0r_init();//若mac_address的排列為反相時呼叫的api +#else cm__hs1__init(); - +#endif //2.Init CWM lib // uint8_t buffer[80] = {0}; // uapi_efuse_read_buffer(buffer, 0x100, 80); @@ -1084,7 +1109,7 @@ int cywee_main_dml(void) CWM_OS_dbgPrintf("have_security = %d.%d ret_buff_size = %d chipInfo = %s\n", scl.iData[5], scl.iData[6], scl.iData[4], chipInfo); CWM_OS_dbgPrintf("chip_settings = %d, %d, %d\n", scl.iData[9], scl.iData[10], scl.iData[11]); //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); - if(scl.iData[5] == 1 && scl.iData[6] == 31010100) + if(scl.iData[5] == 1) { cywee_is_active = 1; } @@ -1220,7 +1245,7 @@ int cywee_main_dml(void) CWM_Sensor_Enable(IDX_ALGO_NO_MOTION); //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); // CWM_Sensor_Enable(IDX_ALGO_ANY_MOTIOIN); - CWM_Sensor_Enable(IDX_ALGO_ABSOLUTE_STATIC); + //CWM_Sensor_Enable(IDX_ALGO_ABSOLUTE_STATIC); //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); cywee_restoreData(); diff --git a/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c b/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c index 1d1690049..a0f4d1787 100644 --- a/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c +++ b/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-03-13 15:08:38 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2024-08-21 11:07:20 + * @LastEditTime: 2024-08-30 11:36:03 * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c * @Description: * @@ -76,7 +76,10 @@ void ppg_send_cmd_to_driver(char* mode, uint8_t enable) { #ifdef HRS_ALG_LIB hx3695_hrs_disable(); - hx3695_wearstatus_update(); + if(md == HRS_MODE && enable == 0) + { + hx3695_wearstatus_update(); + } #endif }else if(md == HRV_MODE) { diff --git a/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp b/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp index 672d27e17..dc6c63ded 100644 --- a/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp +++ b/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp @@ -68,7 +68,7 @@ static bool ppg_service_running_stat = false; static bool ppg_sensor_exist = false; static uint8_t wear_mode_state = 0; -static uint8_t keep_in_wear_det_mod = 0; //持续坚持 佩戴检测模式 +static uint8_t keep_in_wear_det_mod = 1; //持续坚持 佩戴检测模式 void set_keep_in_wear_det_mode(uint8_t mod) diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.c b/code/sdk/drivers/peripheral/utils/custom_utils.c index d4b0c333d..9e01c37bd 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils.c @@ -177,7 +177,7 @@ void uapi_save_time_of_day(void) struct tm* timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); - uapi_save_file_data("user/userdata/timestamp_of_day.bin",&timeinfo->tm_mday,1); + uapi_save_file_data("user/userdata/timestamp_of_day.bin",&timeinfo->tm_mday,1,"wb"); } void shutdown_reboot_prejobs_task(void) @@ -2382,6 +2382,11 @@ void uapi_cywee_get_chipinfo(char *databuf,uint8_t len) cywee_get_chipinfo(databuf,len); } +void uapi_cywee_get_version(char *databuf,uint8_t len) +{ + cywee_get_version(databuf,len); +} + #ifdef SUPPORT_ALIPAY_SEC #include "alipay_feature.h" int custom_exit_lpm(void) @@ -2544,12 +2549,12 @@ uint8_t uapi_get_cywee_active_state(void) return cywee_get_active_state(); } -void uapi_get_file_data(char *path,uint8_t *data,uint8_t len) +void uapi_get_file_data(char *path,uint8_t *data,uint16_t len) { FILE * fp = fopen(path,"rb"); if(fp==NULL) { - PRINT("open %s failed\n",path); + PRINT("read open %s failed\n",path); return; } int ret = fread(data,1,len,fp); @@ -2560,12 +2565,12 @@ void uapi_get_file_data(char *path,uint8_t *data,uint8_t len) fclose(fp); } -void uapi_save_file_data(char *path,uint8_t *data,uint8_t len) +void uapi_save_file_data(char *path,uint8_t *data,uint16_t len,char *mode) { - FILE * fp = fopen(path,"wb"); + FILE * fp = fopen(path,mode); if(fp==NULL) { - PRINT("open %s failed\n",path); + PRINT("write open %s failed\n",path); return; } int ret = fwrite(data,1,len,fp); @@ -2659,7 +2664,7 @@ void uapi_aging_test(uint32_t test_time) aging_test_data[2] = microhone_error; aging_test_data[3] = ppg_error; - uapi_save_file_data("user/userdata/aging_test.bin",aging_test_data,4); + uapi_save_file_data("user/userdata/aging_test.bin",aging_test_data,4,"wb"); return; } } @@ -2690,6 +2695,39 @@ uint8_t uapi_get_cywee_static_state(void) return cywee_get_static_state(); } +#ifdef CYWEE_MAC_ACTIVE +#define CYWEE_MAC_KEY_PATH "/system/cywee_mac_key.bin" +#endif + + +void uapi_cywee_save_mac_key(const uint8_t *key_data,uint16_t len) +{ +#ifdef CYWEE_MAC_ACTIVE + uapi_save_file_data(CYWEE_MAC_KEY_PATH,key_data,len,"ab"); +#endif +} + +#ifdef CYWEE_MAC_ACTIVE + +uint8_t DEFAULT_MAC_KEY[78] = { + 0x23, 0x20, 0x86, 0xae, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x01, 0x23, 0x99, 0xb1, 0x5a, + 0xc4, 0xc7, 0xa3, 0x43, 0x00, 0xa6, 0x4c, 0x53, 0x2a, 0xbe, 0x62, 0x1c, 0x48, 0x31, 0x78, 0x5e, + 0x56, 0x49, 0x2e, 0x1f, 0xbe, 0xb0, 0xa7, 0xee, 0x3d, 0x6b, 0x6d, 0x36, 0x56, 0xe0, 0x04, 0x35, + 0x4f, 0x5e, 0x4a, 0xa7, 0x74, 0xa7, 0x91, 0x75, 0x0b, 0x8a, 0x8b, 0x69, 0xeb, 0x51, 0x0c, 0x12, + 0x92, 0x6a, 0x8c, 0xe9, 0x45, 0x70, 0x00, 0x62, 0xc9, 0x21, 0xef, 0x8b, 0x26, 0xdf, +}; +#endif +void uapi_cywee_get_mac_key(uint8_t *key_data,uint16_t len) +{ +#ifdef CYWEE_MAC_ACTIVE + if(access(CYWEE_MAC_KEY_PATH, F_OK) == -1) + { + uapi_save_file_data(CYWEE_MAC_KEY_PATH,DEFAULT_MAC_KEY,sizeof(DEFAULT_MAC_KEY),"ab"); + } + uapi_get_file_data(CYWEE_MAC_KEY_PATH,key_data,len); +#endif +} + void uapi_get_a5133_rxdata(uint8_t *databuf,uint8_t len) { #ifdef SUPPORT_A5133_SERVICE diff --git a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c index 5aaec82c5..b5aea4591 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c @@ -1135,6 +1135,32 @@ static uint32_t custom_volume_test(uint8_t *para, uint32_t paraLen, char *strCom return ERRCODE_SUCC; } +static uint32_t custom_cywee_save_mac_key(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + + UNUSED(strCommonCmd); + uint8_t argv[CUSTOM_UTILS_MAX_ARGC][CUSTOM_UTILS_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + uint8_t send_data[8] = {0}; + + + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != CUSTOM_UTILS_SUCCESS) { + wstp_print("CUSTOM_UTILSTEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + + if (argc != 2) { + wstp_print("CUSTOM_UTILSTEST power_test ATCMD Set Parameter Failed argc %d\r\nPM_DSP_POWER_UP_AND_RUN=2 PM_DSP_POWER_OFF=3\r\n",argc); + return ERRCODE_FAIL; + } + int16_t len = atol((char*)argv[1]); + + uapi_cywee_save_mac_key(argv[0],len); + + return ERRCODE_SUCC; +} + static const at_cmd_table_t g_custom_utils_cmd[] = { { (char *)"AT^CUSTOM_SN", custom_utils_setsn, (char *)"123456789ABCDEF2345678" }, { (char *)"AT^CUSTOM_SN_REQ", custom_utils_getsn, (char *)" " }, @@ -1213,6 +1239,7 @@ static const at_cmd_table_t g_custom_utils_cmd[] = { { (char *)"AT^PBAP_LS", PBAP_LS, (char *)" " }, { (char *)"AT^BLE_TEST", BLE_TEST, (char *)" " }, { (char *)"AT^SETVOLUME", custom_volume_test, (char *)" " }, + { (char *)"AT^CYWEESAVEKEY", custom_cywee_save_mac_key, (char *)" " }, };