更新cywee算法,添加MAC地址密钥激活方式,优化睡眠模式佩戴检测
authorpenglei <1624952103@qq.com>
Fri, 30 Aug 2024 12:53:11 +0000 (20:53 +0800)
committerpenglei <1624952103@qq.com>
Fri, 30 Aug 2024 12:53:11 +0000 (20:53 +0800)
12 files changed:
code/sdk/build/config/target_config/brandy/config.py
code/sdk/drivers/peripheral/cywee/Inc/CWM_CustomDataStruct.h
code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h
code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h
code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.a
code/sdk/drivers/peripheral/cywee/src/board_apollo3.c [new file with mode: 0644]
code/sdk/drivers/peripheral/cywee/src/board_nordic.c [new file with mode: 0644]
code/sdk/drivers/peripheral/cywee/src/main_dml.c
code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c
code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp
code/sdk/drivers/peripheral/utils/custom_utils.c
code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c

index 0d4b4a9..6450c3e 100755 (executable)
@@ -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'
index 0b91970..5337244 100644 (file)
@@ -4,7 +4,7 @@
 typedef struct CustomSensorData {
     uint32_t sensorType;
     float fData[16];
-    double dData[10];
+    double dData[12];
 } CustomSensorData;
 
 #endif /* __CWM_CUSTOMDATASTRUCT_H__ */
index 50c3087..e9511f6 100644 (file)
@@ -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
 #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
 #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
 
 #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
index b71e670..b62bb36 100644 (file)
@@ -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()
index a74ed86..5f22c2e 100644 (file)
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 (file)
index 0000000..2172273
--- /dev/null
@@ -0,0 +1,319 @@
+/*********************/
+/*** Include Files ***/
+/*********************/
+#include <stdlib.h>
+#include <string.h>
+#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 (file)
index 0000000..1e1373e
--- /dev/null
@@ -0,0 +1,479 @@
+/*********************/
+/*** Include Files ***/
+/*********************/
+#include <stdarg.h>
+#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<ARRAY_SIZE(m_irqHandler); i++)
+    {
+        if (m_irqHandler[i].mcuPin == pin && m_irqHandler[i].callback != NULL)
+        {
+            irq_argument arg;
+            arg.sensorType = m_irqHandler[i].sensorType;
+            arg.sensorPin = m_irqHandler[i].sensorPin;
+
+            m_irqHandler[i].callback((void*) &arg);
+            return;
+        }
+    }
+}
+
+// To Implement CWM_enableGpioIRQ & CWM_disableGpioIRQ,
+// convert_int_pullMode_cwm_to_nRF() api should be implemented as well
+// It would convert gpio pull mode define from CWM to nRF52
+static nrf_gpio_pin_pull_t convert_int_pullMode_cwm_to_nRF(uint16_t int_connect)
+{
+    switch(int_connect)
+    {
+        case INT_RESISTOR_PULLUP:
+            return NRF_GPIO_PIN_PULLUP;
+
+        case INT_RESISTOR_PULLDOWN:
+            return NRF_GPIO_PIN_PULLDOWN;
+
+        default:
+            return NRF_GPIO_PIN_NOPULL;
+    }
+}
+
+// To Implement CWM_enableGpioIRQ & CWM_disableGpioIRQ,
+// convert_int_edgeMode_cwm_to_nRF() api should be implemented as well
+// It would convert edge mode define from CWM to nRF52
+static nrf_gpiote_polarity_t convert_int_edgeMode_cwm_to_nRF(uint16_t int_method)
+{
+    switch(int_method)
+    {
+        case INT_TRIGGER_TYPE_RISING:
+            return NRF_GPIOTE_POLARITY_LOTOHI;
+
+        case INT_TRIGGER_TYPE_FALLING:
+            return NRF_GPIOTE_POLARITY_HITOLO;
+
+        default:
+            return NRF_GPIOTE_POLARITY_TOGGLE;
+    }
+}
+
+//In order to make Nordic SDK GPIOTE functions work, defines in Nordic/vendor_sdk/other/sdk_config.h
+//must be enabled. Open the file and edit GPIOTE related defines.
+static void nRF_SetGpioIRQ(uint16_t mcuPin, uint16_t int_method, uint16_t int_connect)
+{
+    uint32_t err_code;
+
+    nrf_drv_gpiote_in_config_t io_cfg = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false);
+    if(!nrf_drv_gpiote_is_init())
+    {
+        err_code = nrf_drv_gpiote_init();
+        APP_ERROR_CHECK(err_code);
+    }
+    switch(mcuPin)
+    {
+        case PCA10040_PIN_28:
+            io_cfg.sense = convert_int_edgeMode_cwm_to_nRF(int_method);
+            io_cfg.pull = convert_int_pullMode_cwm_to_nRF(int_connect);
+            nrf_drv_gpiote_in_init(PCA10040_PIN_28, &io_cfg, Irq_callback);
+            nrf_drv_gpiote_in_event_enable(PCA10040_PIN_28, true);
+            break;
+        case PCA10040_PIN_25:
+            io_cfg.sense = convert_int_edgeMode_cwm_to_nRF(int_method);
+            io_cfg.pull = convert_int_pullMode_cwm_to_nRF(int_connect);
+            nrf_drv_gpiote_in_init(PCA10040_PIN_25, &io_cfg, Irq_callback);
+            nrf_drv_gpiote_in_event_enable(PCA10040_PIN_25, true);
+            break;
+        default:
+            break;
+    }
+}
+
+//In order to make Nordic SDK GPIOTE functions work, defines in Nordic/vendor_sdk/other/sdk_config.h
+//must be enabled. Open the file and edit GPIOTE related defines.
+static void nRF_UnsetGpioIRQ(uint16_t mcuPin)
+{
+    switch(mcuPin)
+    {
+        case PCA10040_PIN_28:
+            nrf_drv_gpiote_in_event_disable(PCA10040_PIN_28);
+            break;
+        case PCA10040_PIN_25:
+            nrf_drv_gpiote_in_event_disable(PCA10040_PIN_25);
+            break;
+        default:
+            break;
+    }
+}
+
+int CWM_enableGpioIRQ(uint16_t sensorType, uint16_t sensorPin, PFN_IRQHANDLE callback)
+{
+    for (int i=0; i<ARRAY_SIZE(m_irqHandler); i++)
+    {
+        if (sensorType == m_irqHandler[i].sensorType && sensorPin == m_irqHandler[i].sensorPin)
+        {
+            m_irqHandler[i].callback = callback;
+            nRF_SetGpioIRQ(m_irqHandler[i].mcuPin,
+                          m_irqHandler[i].mcu_int_method,
+                          m_irqHandler[i].mcu_int_connect);
+
+            return 0;
+        }
+    }
+    return 1;
+}
+
+int CWM_disableGpioIRQ(uint16_t sensorType, uint16_t sensorPin)
+{
+    for (int i=0; i<ARRAY_SIZE(m_irqHandler); i++)
+    {
+        if (sensorType == m_irqHandler[i].sensorType && sensorPin == m_irqHandler[i].sensorPin)
+        {
+            m_irqHandler[i].callback = NULL;
+            nRF_UnsetGpioIRQ(m_irqHandler[i].mcuPin);
+
+            return 0;
+        }
+    }
+    return 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 = nrf_drv_twi_tx(&m_twi, slaveAddr >> 1, (uint8_t*) &reg, 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, &reg, 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, &reg, 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();
+}
index f8d173e..83ede1d 100644 (file)
@@ -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();
 
index 1d16900..a0f4d17 100644 (file)
@@ -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)
         {
index 672d27e..dc6c63d 100644 (file)
@@ -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)
index d4b0c33..9e01c37 100644 (file)
@@ -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
index 5aaec82..b5aea45 100644 (file)
@@ -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 *)" " },
 };