'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'
typedef struct CustomSensorData {
uint32_t sensorType;
float fData[16];
- double dData[10];
+ double dData[12];
} CustomSensorData;
#endif /* __CWM_CUSTOMDATASTRUCT_H__ */
#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
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()
--- /dev/null
+/*********************/
+/*** 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
+}
+
--- /dev/null
+/*********************/
+/*** 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*) ®, 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();
+}
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)
{
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;
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
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,
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);
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;
}
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();
* @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:
*
{
#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)
{
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)
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)
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)
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);
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);
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;
}
}
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
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 *)" " },
{ (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 *)" " },
};