From 68d41e4e6d5b6591697fb6cbef44ffb00bcffa05 Mon Sep 17 00:00:00 2001 From: SnickerSun Date: Sat, 23 Mar 2024 15:32:04 +0800 Subject: [PATCH] cywee using p813 version lib, can report step no-move and some other event now --- .../drivers/peripheral/cywee/CMakeLists.txt | 12 +- code/sdk/drivers/peripheral/cywee/Inc/OsApi.h | 15 +- .../drivers/peripheral/cywee/Inc/cwm_lib.bk.h | 264 ---------- .../drivers/peripheral/cywee/Inc/cwm_lib.h | 132 +++-- .../peripheral/cywee/Inc/cwm_lib_dml.h | 96 ++++ .../drivers/peripheral/cywee/Inc/cywee_hal.h | 415 +++++++++++++++ .../sdk/drivers/peripheral/cywee/Inc/os_api.h | 18 - ...ng_riscv.bk.a => CWM_LIB_clang_riscv.p3.a} | Bin 1641408 -> 1639400 bytes ...ang_riscv.a => CWM_LIB_clang_riscv.p813.a} | Bin .../peripheral/cywee/service/cywee_service.c | 4 +- .../peripheral/cywee/src/board_apollo3.c | 319 ------------ .../peripheral/cywee/src/board_nordic.c | 479 ------------------ .../peripheral/cywee/src/board_yh601s.c | 42 +- code/sdk/drivers/peripheral/cywee/src/main.c | 407 +++------------ .../drivers/peripheral/cywee/src/main_dml.c | 223 +++++++- 15 files changed, 912 insertions(+), 1514 deletions(-) delete mode 100644 code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.bk.h delete mode 100644 code/sdk/drivers/peripheral/cywee/Inc/os_api.h rename code/sdk/drivers/peripheral/cywee/Lib/{CWM_LIB_clang_riscv.bk.a => CWM_LIB_clang_riscv.p3.a} (85%) rename code/sdk/drivers/peripheral/cywee/Lib/{CWM_LIB_clang_riscv.a => CWM_LIB_clang_riscv.p813.a} (100%) delete mode 100644 code/sdk/drivers/peripheral/cywee/src/board_apollo3.c delete mode 100644 code/sdk/drivers/peripheral/cywee/src/board_nordic.c diff --git a/code/sdk/drivers/peripheral/cywee/CMakeLists.txt b/code/sdk/drivers/peripheral/cywee/CMakeLists.txt index 72d1eb933..bde9d556c 100644 --- a/code/sdk/drivers/peripheral/cywee/CMakeLists.txt +++ b/code/sdk/drivers/peripheral/cywee/CMakeLists.txt @@ -5,22 +5,22 @@ set(COMPONENT_NAME "cywee") set(SOURCES ${SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c + # ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c ${CMAKE_CURRENT_SOURCE_DIR}/src/main_dml.c ${CMAKE_CURRENT_SOURCE_DIR}/src/test_api.c ${CMAKE_CURRENT_SOURCE_DIR}/src/board_yh601s.c ${CMAKE_CURRENT_SOURCE_DIR}/service/cywee_service.c ${CMAKE_CURRENT_SOURCE_DIR}/service/cywee_at_cmd.c - ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC/examples/lis2doc_read_data_single.c - ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC/lis2doc_porting.c + # ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC/examples/lis2doc_read_data_single.c + # ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC/lis2doc_porting.c ) set(PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/Inc ) set(PRIVATE_HEADER - ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC/driver - ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC + # ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC/driver + # ${CMAKE_CURRENT_SOURCE_DIR}/../acc/lis2doc_STdC ) set(PRIVATE_DEFINES @@ -49,7 +49,7 @@ set(MAIN_COMPONENT if("SUPPORT_AT_CYWEE" IN_LIST DEFINES) find_library(LIB_PATH_CWM_LIB_DML Lib/CWM_LIB_DML_clang_riscv.a ${CMAKE_CURRENT_SOURCE_DIR}) - find_library(LIB_PATH_CWM_LIB Lib/CWM_LIB_clang_riscv.a ${CMAKE_CURRENT_SOURCE_DIR}) + find_library(LIB_PATH_CWM_LIB Lib/CWM_LIB_clang_riscv.p813.a ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(${TARGET_NAME} PRIVATE -Wl,--whole-archive ${LIB_PATH_CWM_LIB_DML} ${LIB_PATH_CWM_LIB} PRIVATE -Wl,--whole-archive) endif() diff --git a/code/sdk/drivers/peripheral/cywee/Inc/OsApi.h b/code/sdk/drivers/peripheral/cywee/Inc/OsApi.h index 28edf6d0b..753b23057 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/OsApi.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/OsApi.h @@ -26,6 +26,19 @@ typedef struct{ int (*spiWrite)(uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); } OsAPI, *pOsAPI; -typedef OsAPI os_api; + +typedef struct{ + int (*dbgOutput)(const char*); + uint64_t (*GetTimeNs)(void); + void (*uSleep)(uint32_t); + int (*i2cRead)(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex); + int (*i2cWrite)(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); + void *(*malloc)(int size); + void (*free)(void* ptr); + int (*spiRead)(uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex); + int (*spiWrite)(uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); +} os_api; + +// typedef OsAPI os_api; #endif /* __OS_API_H__ */ diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.bk.h b/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.bk.h deleted file mode 100644 index 173a4775f..000000000 --- a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.bk.h +++ /dev/null @@ -1,264 +0,0 @@ -#ifndef __CWM_LIB_H__ -#define __CWM_LIB_H__ - -#include "CWM_EventStructure.h" -#include "OsApi.h" -#include "CWM_CustomDataStruct.h" - -/** - * @brief Setting Control control ID - * @api CWM_SettingControl - * @param CtrId - */ -#define SCL_LOG 0 -#define SCL_USER_INFO 1 -#define SCL_DATE_TIME 2 -#define SCL_SEDENTARY 3 -#define SCL_PEDO_RESET 4 // old -#define SCL_RESET_DAILY_INFO 4 // new -#define SCL_REQ_SLEEPING_DATA 5 -#define SCL_LOW_POWER_MODE 6 -#define SCL_SET_ACTIVITY_MODE 7 -#define SCL_GET_CHIP_INFO 8 -#define SCL_ACTIVITY_CONFIG 9 -#define SCL_LIB_DEBUG 10 -#define SCL_PEDO_CONFIG 11 -#define SCL_GET_LIB_INFO 12 -#define SCL_SWIM_CONFIG 13 -#define SCL_BIKING_CONFIG 14 -#define SCL_ACTIVITY_PAUSE 15 -#define SCL_HAND_UPDOWN_CONFIG 16 -#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_WM_CONFIG 25 -#define SCL_INACTIVITY_CONFIG 26 -#define SCL_SET_INACTIVITY_MODE 27 -#define SCL_STAND_CONFIG 28 -#define SCL_SS_CONFIG 29 -#define SCL_ACT_INFO_CONFIG 30 -#define SCL_REQ_ACTIVITY_EXIT 31 -#define SCL_ACT_PAI_INFO 33 -#define SCL_ACT_INTSY_INFO 35 -#define SCL_DUMP_WI_INFO 36 -#define SCL_ACT_ZONE_TIME 37 -#define SCL_ACT_TRAINING_INFO 38 -#define SCL_WATCH_INTF_RESET 40 -#define SCL_PEDO_CONFIG2 42 -#define SCL_HG_INTF_CONFIG 43 -#define SCL_ACT_AUTO_PAUSE_CFG 44 -#define SCL_AR_ALERT2_CONFIG 45 -#define SCL_WI_SENS_REQ_CFG 46 -#define SCL_ACT_SA_METR_INFO 47 -#define SCL_SLEEP_ALARM_CFG 48 -#define SCL_FITNESS_INFO 49 -#define SCL_SZ_BREACH_CONFIG 50 -#define SCL_ACT_PAI_INFO2 51 - -#define SCL_ALGO_PROC_CONFIG 100 -#define SCL_INPUT_SENSOR_CONFIG 101 -#define SCL_INPUT_DT_CONFIG 102 -#define SCL_SENS_RANGE_DETECT_CONFIG 103 -#define SCL_SENS_CALI_CONFIG 110 -#define SCL_SENS_CALI_CTRL_MAG 111 -#define SCL_SENS_CALI_CTRL_A 112 -#define SCL_SPV_CONFIG 113 -#define SCL_SPV_MODE 114 -#define SCL_SENS_CALI_SET_MAG 115 -#define SCL_SENS_CALI_SET_A 116 - -#define SCL_SIN_HR_EXT 200 - -/** - * @brief Custom Sensor Input sensorId - * @api CWM_CustomSensorInput - * @param CustomSensorData.sensorType extSensorId - * @ - * @api CWM_CustomSensorInput_Fifo_Start CWM_CustomSensorInput_Fifo_End - * @param extSensorId - */ -#define CUSTOM_ACC 0 -#define CUSTOM_GYRO 1 -#define CUSTOM_MAG 2 -#define CUSTOM_BARO 3 -#define CUSTOM_TEMP 4 -#define CUSTOM_HEARTRATE 5 -#define CUSTOM_GNSS 6 -#define CUSTOM_OFFBODY_DETECT 7 -#define CUSTOM_ON_CHARGING 8 -#define CUSTOM_ACC_ANY_MOTION 9 -#define CUSTOM_SENS1 10 - - -/** - * @brief sensor enable/disable - * @api CWM_Sensor_Enable CWM_Sensor_Disable - * @param sensorId - */ -#define IDX_ACCEL 0 -#define IDX_GYRO 1 -#define IDX_MAG 2 -#define IDX_BARO 3 -#define IDX_TEMP 4 -#define IDX_HEARTRATE 5 -#define IDX_GNSS 6 -#define IDX_OFFBODY_DETECT 7 -#define IDX_ALGO_SEDENTARY 8 -#define IDX_ALGO_WATCH_HANDUP 9 -#define IDX_ALGO_SLEEP 10 -#define IDX_REQUEST_SENSOR 11 -#define IDX_ALGO_SHAKE 13 -#define IDX_ALGO_ACTIVITY_OUTPUT 14 -#define IDX_ALGO_ANY_MOTION 15 -#define IDX_ALGO_NO_MOTION 16 -#define IDX_ALGO_FALLING 17 -#define IDX_ONCHARGING_DETECT 18 -#define IDX_ALGO_ABSOLUTE_STATIC 19 -#define IDX_ALGO_SPV 20 -#define IDX_ALGO_SENS_CALIBRATION 21 -#define IDX_ALGO_INACTIVITY_OUTPUT 22 -#define IDX_ALGO_STAND 23 -#define IDX_ALGO_SENS_RANGE_DETECT 24 - -/** - * @brief activity mode setting - * @api CWM_SettingControl - * @param SCL_SET_ACTIVITY_MODE - */ -#define ACTIVITY_MODE_NORMAL 1001 - -typedef struct { - int iData[16]; -} SettingControl_t; - -typedef void (*FN_SENSOR_LISTEN)(pSensorEVT_t); - - -#define LOS_DATA_TYPE_INT 0 -#define LOS_DATA_TYPE_STR 1 - -/** - * @brief - * @param dataType: cmd data type indicater - * 0 (LOS_DATA_TYPE_INT): int type data, dataInt accessible - * 1 (LOS_DATA_TYPE_STR): string type data, *dataStr and dataStr_length accessible - */ -typedef struct { - const char *optionString; - const char *sectionName; - const char *apiName; - int cmdId; - int dataType; - int dataInt[16]; - const char *dataStr; - int dataStr_length; -} los_cmd_data_t; - -typedef void (*FN_LOS_CMD_EXECUTE)(los_cmd_data_t *); - -/** - * @brief CyweeMotion internal process Initial - */ -void CWM_LibPreInit(OsAPI *api); - -/** - * @brief Sensor Event register callback, when sensor event is triggered, - * this function will be called to notify - */ -void CWM_LibPostInit(FN_SENSOR_LISTEN pfn); - -/** - * @brief lib deinit for special case. Not any situation can be used normally - */ -void CWM_LibDeinit(void); - -/** - * @brief Sensor enable based on sensor index provided - * @param sensorId: sensor register handle, if not setup this handle don't care - * @retval 0 is success, otherwise is failed - */ -int CWM_Sensor_Enable(uint32_t sensorId); - -/** - * @brief Sensor disable based on sensor index provided - * @param sensorId: sensor register handle, if not setup this handle don't care - * @retval 0 is success, otherwise is failed - */ -int CWM_Sensor_Disable(uint32_t sensorId); - -/** - * @brief Read sensor data and output through sensor call-back function - * @retval 0 is no data to process, mcu can enter low power mode, - otherwise has some data needs process this function again. - */ -int CWM_process(void); - -/** - * @brief Read sensor data and output through sensor call-back function - */ -int CWM_process2(int dt_us); - -/** - * @brief Get how many event in CyweeMotion Library to be processed - * @retval 0 is no data to process, mcu can enter low power mode, - otherwise has some data - */ -int CWM_IsReadyForProcess(void); - -/** - * @brief Put custom sensor data. - * @param SensorDataInput: sensor data input handle, input format as below: - * sensorType= CustomSensorDataIndex - * fData = sensor raw data - * @retval 0 is success, otherwise is failed - */ -int CWM_CustomSensorInput(CustomSensorData *SensorDataInput); - -/** - * @brief Get the duration time of the next event - * @retval the duration time (unit nanosecond) - */ -int64_t CWM_GetNextActionDuration_ns(void); - -/** - * @brief set lib config - * @param Control ID - * @param Setting control array - * @retval 0 is success, otherwise is failed - */ -int CWM_SettingControl(int CtrId, SettingControl_t *pData); - -/** - * @brief Fifo initial - * @param max recored number of acc fifo - */ -void CWM_CustomSensorInput_Fifo_Init(int maxRecords_Acc); - -/** - * @brief setting lib can start input fifo - * @param sensor ID - * @param timestamp that interrupt trigger to read hw fifo data - * @param fifo delta_time - * @retval 0 is success, otherwise is failed - */ -int CWM_CustomSensorInput_Fifo_Start(uint32_t extSensorId, uint64_t triggerFifoRead_timeStamp_ns, uint64_t dt_ns); - -/** - * @brief setting lib to stop input fifo - * @param sensor ID - */ -void CWM_CustomSensorInput_Fifo_End(uint32_t extSensorId); - -/** - * @brief Execute option string - * @param optionString - * @param sectionString section execute order - * @param custCallbackFunc custom option string execute function - * @param skipExeDefault don't execute default command - */ -void CWM_LoadOptionString(const char *optionString, const char *sectionString, FN_LOS_CMD_EXECUTE custCallbackFunc, int skipExeDefault); -#endif diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h b/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h index 14a6137bf..266e87656 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib.h @@ -1,16 +1,21 @@ -#ifndef ___CWM_LIB__H_ -#define ___CWM_LIB__H_ - +#ifndef __CWM_LIB_H__ +#define __CWM_LIB_H__ #include -#include "os_api.h" +#include "OsApi.h" #include "CWM_EventStructure.h" #include "CWM_CustomDataStruct.h" +/** + * @brief Setting Control control ID + * @api CWM_SettingControl + * @param CtrId + */ #define SCL_LOG 0 #define SCL_USER_INFO 1 #define SCL_DATE_TIME 2 #define SCL_SEDENTARY 3 -#define SCL_PEDO_RESET 4 +#define SCL_PEDO_RESET 4 // old +#define SCL_RESET_DAILY_INFO 4 // new #define SCL_REQ_SLEEPING_DATA 5 #define SCL_LOW_POWER_MODE 6 #define SCL_SET_ACTIVITY_MODE 7 @@ -30,7 +35,6 @@ #define SCL_REQ_SWIM_EXIT 21 #define SCL_WATCH_FALL_CONFIG 22 #define SCL_AR_ALERT_CONFIG 23 -#define SCL_ACT_PAUSE_DETECT 24 #define SCL_WM_CONFIG 25 #define SCL_INACTIVITY_CONFIG 26 #define SCL_SET_INACTIVITY_MODE 27 @@ -38,16 +42,12 @@ #define SCL_SS_CONFIG 29 #define SCL_ACT_INFO_CONFIG 30 #define SCL_REQ_ACTIVITY_EXIT 31 -#define SCL_TAP_CONFIG 32 #define SCL_ACT_PAI_INFO 33 -#define SCL_HAND_WRIST_CONFIG 34 #define SCL_ACT_INTSY_INFO 35 #define SCL_DUMP_WI_INFO 36 #define SCL_ACT_ZONE_TIME 37 #define SCL_ACT_TRAINING_INFO 38 -#define SCL_HAND_SHAKE_CONFIG 39 #define SCL_WATCH_INTF_RESET 40 -#define SCL_HAND_RUB_CONFIG 41 #define SCL_PEDO_CONFIG2 42 #define SCL_HG_INTF_CONFIG 43 #define SCL_ACT_AUTO_PAUSE_CFG 44 @@ -62,52 +62,24 @@ #define SCL_ALGO_PROC_CONFIG 100 #define SCL_INPUT_SENSOR_CONFIG 101 #define SCL_INPUT_DT_CONFIG 102 -#define SCL_SENS_RANGE_DETECT_CONFIG 103 +#define SCL_SENS_RANGE_DETECT_CONFIG 103 #define SCL_SENS_CALI_CONFIG 110 #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_GET_HEAP_INFO 120 -#define SCL_SEC_VERIFY_CLIENT 150 -#define SCL_SEC_VERIFY_SERVER 151 #define SCL_SIN_HR_EXT 200 -#define SCL_HS_ORIEN_CONFIG 300 -#define SCL_HS_ORIEN_CTRL_EXC 301 -#define SCL_HS_ORIEN_RESET 302 -#define SCL_HS_PHONE_CONFIG 303 -#define SCL_EAR_FALL_CONFIG 304 -#define SCL_HS_PHONE_CONFIG2 305 -#define SCL_HS_RUN_INIT_ANGLE 306 -#define SCL_HS_INTF_CONFIG 307 -#define SCL_HS_INTF_RESTART 308 -#define SCL_HS_GESTURE_CONFIG 309 -#define SCL_HS_NECK_HT_CONFIG 310 -#define SCL_HS_ORIEN_CTRL_SYNC 311 - -#define SCL_FUSION_MOUSE_CONFIG 501 -#define SCL_PEDO_POD_CONFIG 502 -#define SCL_PEDO_POD_TR_CALI 503 -#define SCL_PEDO_POD_RUN_CMD 504 - -#define SCL_GLASSES_MOT_CONFIG 510 -#define SCL_GLASSES_MOT_LEVEL 511 -#define SCL_GLASSES_MOT_CALI_CTRL 512 -#define SCL_GLASSES_MOT_CMD 513 - /** * @brief Custom Sensor Input sensorId * @api CWM_CustomSensorInput * @param CustomSensorData.sensorType extSensorId * @ + * @api CWM_CustomSensorInput_Fifo_Start CWM_CustomSensorInput_Fifo_End + * @param extSensorId */ #define CUSTOM_ACC 0 #define CUSTOM_GYRO 1 @@ -135,21 +107,34 @@ #define IDX_HEARTRATE 5 #define IDX_GNSS 6 #define IDX_OFFBODY_DETECT 7 +#define IDX_ALGO_SEDENTARY 8 +#define IDX_ALGO_WATCH_HANDUP 9 +#define IDX_ALGO_SLEEP 10 #define IDX_REQUEST_SENSOR 11 +#define IDX_ALGO_SHAKE 13 +#define IDX_ALGO_ACTIVITY_OUTPUT 14 #define IDX_ALGO_ANY_MOTION 15 #define IDX_ALGO_NO_MOTION 16 +#define IDX_ALGO_FALLING 17 #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 #define IDX_ALGO_SENS_RANGE_DETECT 24 +/** + * @brief activity mode setting + * @api CWM_SettingControl + * @param SCL_SET_ACTIVITY_MODE + */ +#define ACTIVITY_MODE_NORMAL 1001 + typedef struct { int iData[16]; } SettingControl_t; - typedef void (*FN_SENSOR_LISTEN)(pSensorEVT_t); @@ -175,18 +160,22 @@ typedef struct { typedef void (*FN_LOS_CMD_EXECUTE)(los_cmd_data_t *); - /** * @brief CyweeMotion internal process Initial */ -void CWM_LibPreInit(os_api *api); +void CWM_LibPreInit(OsAPI *api); /** - * @brief Sensor Event register callback, when sensor event is triggered, + * @brief Sensor Event register callback, when sensor event is triggered, * this function will be called to notify */ void CWM_LibPostInit(FN_SENSOR_LISTEN pfn); +/** + * @brief lib deinit for special case. Not any situation can be used normally + */ +void CWM_LibDeinit(void); + /** * @brief Sensor enable based on sensor index provided * @param sensorId: sensor register handle, if not setup this handle don't care @@ -201,11 +190,25 @@ int CWM_Sensor_Enable(uint32_t sensorId); */ int CWM_Sensor_Disable(uint32_t sensorId); +/** + * @brief Read sensor data and output through sensor call-back function + * @retval 0 is no data to process, mcu can enter low power mode, + otherwise has some data needs process this function again. + */ +int CWM_process(void); + /** * @brief Read sensor data and output through sensor call-back function */ int CWM_process2(int dt_us); +/** + * @brief Get how many event in CyweeMotion Library to be processed + * @retval 0 is no data to process, mcu can enter low power mode, + otherwise has some data + */ +int CWM_IsReadyForProcess(void); + /** * @brief Put custom sensor data. * @param SensorDataInput: sensor data input handle, input format as below: @@ -216,13 +219,40 @@ int CWM_process2(int dt_us); int CWM_CustomSensorInput(CustomSensorData *SensorDataInput); /** - * @brief Switch log output by input parameters + * @brief Get the duration time of the next event + * @retval the duration time (unit nanosecond) + */ +int64_t CWM_GetNextActionDuration_ns(void); + +/** + * @brief set lib config * @param Control ID * @param Setting control array * @retval 0 is success, otherwise is failed */ int CWM_SettingControl(int CtrId, SettingControl_t *pData); +/** + * @brief Fifo initial + * @param max recored number of acc fifo + */ +void CWM_CustomSensorInput_Fifo_Init(int maxRecords_Acc); + +/** + * @brief setting lib can start input fifo + * @param sensor ID + * @param timestamp that interrupt trigger to read hw fifo data + * @param fifo delta_time + * @retval 0 is success, otherwise is failed + */ +int CWM_CustomSensorInput_Fifo_Start(uint32_t extSensorId, uint64_t triggerFifoRead_timeStamp_ns, uint64_t dt_ns); + +/** + * @brief setting lib to stop input fifo + * @param sensor ID + */ +void CWM_CustomSensorInput_Fifo_End(uint32_t extSensorId); + /** * @brief Execute option string * @param optionString @@ -230,9 +260,5 @@ int CWM_SettingControl(int CtrId, SettingControl_t *pData); * @param custCallbackFunc custom option string execute function * @param skipExeDefault don't execute default command */ -void CWM_LoadOptionString(const char *optionString, \ - const char *sectionString, \ - FN_LOS_CMD_EXECUTE custCallbackFunc, \ - int skipExeDefault); - -#endif //___CWM_LIB__H_ +void CWM_LoadOptionString(const char *optionString, const char *sectionString, FN_LOS_CMD_EXECUTE custCallbackFunc, int skipExeDefault); +#endif diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib_dml.h b/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib_dml.h index ca7a5b806..4704973b0 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib_dml.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/cwm_lib_dml.h @@ -1,11 +1,107 @@ #ifndef __CWM_LIB_DML_H__ #define __CWM_LIB_DML_H__ + + +/** + * @param int[0] =1 + * @param int[1] = [in/out] enable_method (default: manual_enable) + * (0: default, 1: manual_enable, 2: auto_enable, -1: 取得參數值) + * @param int[2] = [in/out] manual_enable_sensorData (default: all_off) + * ( bit control 0: manual_all_off, 1: acc, 2: gyro, 4: mag, 8: acc_temp) + * @param int[3] = [out] 取得手動或自動模式的enable_sensorData設定值 + * ( bit control 0: all_off, 1: acc, 2: gyro, 4: mag, 16: acc_temp) + * @param int[4] = [in/out] manual_enable_embdedFeature (default: all_off) + * ( bit control 0: manual_all_off, 1: acc_any_motion) + * @param int[5] = [out] 取得手動或自動模式的enable_embdedFeature設定值 + * ( bit control 0: all_off, 1: acc_any_motion) + * +*/ #define SCL_DML_DRV_ENABLE 400 +/** + * @param int[0] = 1 + * @param int[1] = [in/out] lib_process_method (default: auto) + * (0: default, -1: 取得所有指令參數值, 1: auto, 2: CWM_process, 3: CWM_process2) + * @param int[2] = [out] 找到硬體的數量 + * (-1: 未初始化, 0: 失敗, 1 - 8) + * @param int[3] = [in/out] enable_function (default: 0) + * (bit control, 0:default, 1: enable_reg_access_cmd) +*/ #define SCL_DML_DRV_INIT 401 + + +/** + * @brief 注册硬件 + * @param int[0] = 1 + * @param int[1] = register_type (default: all_hardware) + * (0: default, 1: all_hardware, 2: select_hardware) + * @param int[2] = all_hardware_attr (屬性)(default: 依照driver的實現) + * (bit control, 0: default + * 1: primary, 2: aux + * 4: i2c_address_0, 8: i2c_address_1, + * 16: i2c_address_2, 32: i2c_address_3, + * 64: bus_0, 128: bus_1, + * 256: bus_2, 512: bus_3 + * 1024: interface_i2c, 2048: interface_spi_4w) + * @param int[3] = 0 + * @param int[4] = 0 + * @param int[5] = 0 + * @param int[6] = 1_hw_id (型號) + * @param int[7] = 1_hw_attr (屬性)(default: 依照driver的實現) + * @param int[8] = 2_hw_id + * @param int[9] = 2_hw_attr + * @param int[10] = 3_hw_id + * @param int[11] = 3_hw_attr + * @param int[12] = 4_hw_id + * @param int[13] = 4_hw_attr + * @param int[14] = 5_hw_id + * @param int[15] = 5_hw_attr +*/ #define SCL_DML_DRV_HW_CONFIG 402 +/** + * @brief SCL_DML_DRV_AG_CONFIG + * @param int[0] = 1 + * @param int[1] = 設定或取得參數值(default: 設定參數值) + * (0: default, 1: 設定參數值, 2: 取得參數值) + * @param int[2] = 多顆同樣硬體時設定對象 (default: primary) + * (0: default, 1: primary(主要), 2: aux(輔助)) + * @param int[3] = [in/out] get_data_mode (有支援才會生效)(default: polling) + * (0: default, 1: polling, 2: fifo) + * @param int[4] = [in/out] get_data_period (default: any_time) + * (0: default, 1: any_time, 2: dt_or_fifo_max, 3: custom_data_period) + * @param int[5] = [in/out] custom_data_period (default: 0) + * (0: default, 1 - 1000000000) + * @param int[6] = [in/out] fifo_max_count (default: 1) + * (0: default, 1 - 25) + * @param int[7] = [in/out] axis mode (default: 1) + * (0: default, 1-24: axis_mode) + * @param int[8] = [in/out] sensorData_ODR (default: 52) + * (0: default, 1 - 10000) + * @param int[9] = [in/out] acc range (default: 16) + * (0: default, 1 - 64) + * @param int[10] = [in/out] gyro range (default: 2000) + * (0: default, 1 - 8000) + * @param int[11] = [in/out] interrupt_mode_pin1 (有支援才會生效)(default: nothing) + * (bit control, 0: nothing, 1: data_ready_acc, 2: any_motion) + * @param int[12] = [in/out] interrupt_mode_pin2 (有支援才會生效)(default: nothing) + * (bit control, 0: nothing, 1: data_ready_acc, 2: any_motion) + * @param int[13] = [in/out] only_embedFeature_ODR (default: 26) + * (0: default, 1 - 10000) + * @param int[14] = [in/out] only_embedFeature_acc range (default: 2) + * (0: default, 1 - 64) +*/ #define SCL_DML_DRV_AG_CONFIG 403 #define SCL_DML_DRV_M_CONFIG 404 +/** + * @brief SCL_DML_DEBUG config data + * @param int[0] =1 + * @param int[1] = log_option + * (bit control 0: no_log, 1: mgr_flow, 2: si_data, 4: i2c_spi_data, 8: si_api, 16: dml_proc, 32: get_data_enter, 64: get_data_ok, 128: uSleep) + * @param int[2] = skip_option + * (bit control 0: no_skip, 1: skip_dml_proc, 2: skip_cwm_proc, 4: skip_cwm_proc2, 8: skip_get_data) + * @param int[3] = skip_sensorData (筆數)(defalt: 驅動預設值) + * (0: default, -2: 不略過, -1: 驅動預設值, 1-10000) +*/ #define SCL_DML_DEBUG 405 #define SCL_DML_GET_LIB_INFO 406 #define SCL_DML_GET_INITED_LIST 407 diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h b/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h index 0905eed2f..979346879 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h @@ -19,6 +19,421 @@ extern "C" { #include "stdint.h" #include "errcode.h" +extern uint64_t CWM_OS_GetTimeNs(void); +extern int CWM_OS_dbgOutput(const char * format); +extern int CWM_OS_dbgPrintf(const char * format,...); +extern void CWM_OS_uSleep(unsigned int udelay); +extern void CWM_OS_uSleep(uint32_t time); +extern uint64_t CWM_OS_GetTimeNs(void); +extern int CWM_OS_i2cRead(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex); +extern int CWM_OS_i2cWrite(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); +extern int CWM_OS_i2cTransfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex); +extern void* CWM_OS_malloc(int size); +extern void CWM_OS_free(void *ptr); +extern void CWM_OS_saveData(uint8_t* data, uint32_t len); +extern void CWM_OS_restoreData(uint8_t* data, uint32_t len); +/********************CYWEE LIB*************************/ + +#define SPORT_ACTIVE_MODE_NORMAL 1001 // 一般模式(生活模式) normal(base) 1001 +#define SPORT_ACTIVE_MODE_TREADMILL 1002 // 跑步機 treadmill 1002 +#define SPORT_ACTIVE_MODE_OUTDORR_RUNNING 1003 // 戶外跑步 outdoor running 1003 +#define SPORT_ACTIVE_MODE_INDOR_RUNNING 1006 // 室內跑步 indoor running 1006 +#define SPORT_ACTIVE_MODE_FITNESS_PEDOMETERR 1008 // 防誤觸計步 fitness_pedometer 1008 +#define SPORT_ACTIVE_MODE_FREE_TRAINING 5001 // 自由運動 FreeTraining 5001 +#define SPORT_ACTIVE_MODE_AR_ALERT 1001 // 長時間動作偵測 AR alert 1001 + +#pragma pack(1) + +/** + * @brief user_info_t define + * @param header int[0] = 1 + * @param age int[1] = age (年紀)(default: 30) (1 - 99) +*/ +typedef struct +{ + int header;// = 1; //int[0] = 1 + int age;//int[1] = age (年紀)(default: 30) (1 - 99) + int gender;//int[2] = gender (性別)(default: 男性) (0:女性, 1:男性) + int weight;// int[3] = weight (kg)(體重)(default: 70)(10 - 300) + int height;// int[4] = height (cm)(身高)(default: 175) (30 - 300) + int Wearing_method;//int[5] = Wearing method (配戴方式) (default: 左手) (0: 左手 1: 右手) +}user_info_t; +typedef struct +{ + int header ;// int[0] = 1 + int header2 ;// int[1] = 0 + int one_line_max_length;// int[2] = one_line_max_length (default: 160) (0: defalut, 1 - 256) + int amh;// int[3] = amh (default: 0) (bit control, 0: turn off, 1: dlog, 2: dlog_sens_high_accuracy, 4:disable_dlog_zk, 8:aglog 16:enable_dlog_one_line_multi-log, 32: dlog_sens_low_accuracy, 64: dlog_low_sn_dt, 128: rlog) + int aml_hub;// int[4] = aml,hub (default: 0) (bit control, 0: turn off, 1: control API, 2: custom_input_sensor, 4: output_sensor_report, 8: cwm_process, 16: drv_input_sensor, 32: high_accuracy_custom_input_sensor, 64: high_accuracy_output_sensor_report) + int dlog_enable_special_output;// int[5] = dlog_enable_special_output (default: 0) (bit control, 0:default, 1:V_acc_uncalibration, 2:Y_gyro_uncalibration, 4:N_mag_uncalibration, 8:D_time_second, 16: DTO_dt_original) + int dlog_disable_output;// int[6] = dlog_disable_output (default: 0) (bit control, 0:default, 1:tag, 2:sn, 4:ts, 8:dt, 16:A_acc, 32:G_gyro, 64:M_mag, 128:P_baro, 256:T_temp, 512:H_hr_bpm, 1024:I_hr_range, 2048:S_gps, 4096:X_gps_info, 8192:B_off_body, 16384:C_on_charging, 32768:Z_cust_sens1) + int aglog_option;// int[7] = aglog_option (default: 0) + int accuracy_and_column_option;// int[8] = accuracy_and_column_option (defalut: 0) + int csi_disable_output;// int[9] = csi_disable_output (default: 0) (bit control, 0:default, 1:acc, 2:gyro, 4:mag, 8:baro, 16:Temp, 32:Heart_Rate, 64:GNSS, 128:off_body, 256:on_charging, 512:acc_any_motion, 1024:sens1) +}log_control_t; +typedef struct +{ + int header;// int[0] = 1 + int year ;// int[1] = year (1900 - 2100) + int month;// int[2] = month (1 - 12) + int day;// int[3] = day (1 - 31) + int hour;// int[4] = hour (0 - 23) + int minute;// int[5] = minute (0 - 59) + int second;// int[6] = second (0 - 59) +}date_time_t; + +typedef struct +{ + int header;// int[0] = 1 + int reserved;// int[1] = reserved + int is_reminder_on;// int[2] = is_reminder_on (提醒功能)(default: turn_off) (0: default, 1: turn on, 2: turn off) + int reminder_time;// int[3] = reminder_time (minutes)(提醒時間)(default: 5) (0:default, 1 - 10) + int release_level;// int[4] = release_level (解除久坐狀態的等級)(default: 3) (0:default, 1:容易解除, 2, 3, 4, 5:不容易解除) + int release_mode;// int[5] = release_mode (解除久坐的算法模式)(default: 行走模式) (0: default, 1: 行走模式, 2: 活動量模式) +}sedentary_t; + +typedef struct +{ + int header ;// int[0] = 1 + int terminate_sleep_and_output_result ;// int[1] = terminate_sleep (0: 立刻輸出狀態,但不中止此段睡眠偵測, 1: 立刻輸出狀態,並中止此段睡眠偵測 ) +}req_output_sleeping_data_t; +typedef struct +{ + int header ;// int[0] = 1 + int mode_number;// int[1] = mode_number (需填值) + // 一般模式(生活模式) normal(base) 1001 + // 跑步機 treadmill 1002 + // 戶外跑步 outdoor running 1003 + // 室內跑步 indoor running 1006 + // 防誤觸計步 fitness_pedometer 1008 + // 自由運動 FreeTraining 5001 + // 特別輸出功能 info mode_number + // 長時間動作偵測 AR alert 1001 + int sub_mode_number;// int[2] = sub_mode_number (預設: 0) +}set_activity_mode_t; + +#if 1 + +/** +* @brief get_chip_info_t +* @param int[0] = 1 +* @param int[1] = 1 +* @param int[2] = [in/out]output buffer address (buffer的位址,用來接收CHIP_INFO字串) +* @param int[3] = output buffer size (buffer的最大長度) +* @param int[4] = [out] return buffer length (回傳buffer的使用長度) +* @param int[5] = [out] return security_code_verify_status +* ( +* 0: this chip_model not supprt security_code (這個晶片不支援此api,標示為不合法晶片), +* 1: existing security_code (合法的security_code), +* 2: not existing security_code (晶片未寫入security_code,標示為不合法晶片), +* 3: invalid_security_code (晶片有寫入security_code,但驗證後不合法), +* 4: skip_security_check(略過security_code的驗證,標示為不合法晶片), +* 5: invalid_security_file_address(有輸入認證檔的位址,但是檔案不合法,) +* 6: id_not_in_security_file(有輸入認證檔的位址,但是uid/mac不在認證檔的清單裡面), +* ) +* @param int[6] = [out] security_code_type (for cyweeMotion debug) +* @param int[7] = [out] security_file_id (認證檔的號碼)(for cyweeMotion debug) +* @param int[8] = reserved +* @param int[9] = [out] chip_vendor +* @param int[10] = [out] cust_id_1 +* @param int[11] = [out] cust_id_2 +*/ +typedef struct get_chip_info_t +{ + + int header ; + int header2 ; + int output_buffer_address; + int output_buffer_size; + int return_buffer_length; + int return_security_code_verify_status; + int security_code_type; + int security_file_id; + int reserved; + int chip_vendor; + int cust_id_1; + int cust_id_2; +}get_chip_info_t; +#else +typedef struct get_chip_info_t +{ + + int header = 1; //( int[0] = 1 + int header2 = 1; // int[1] = 1 + int output_buffer_address; // int[2] = [in/out]output buffer address (buffer的位址,用來接收CHIP_INFO字串) + int output_buffer_size; // int[3] = output buffer size (buffer的最大長度) + int return_buffer_length; + // int[4] = [out] return buffer length (回傳buffer的使用長度) + int return_security_code_verify_status; + // int[5] = [out] return security_code_verify_status ) + // ( + // 0: this chip_model not supprt security_code (這個晶片不支援此api,標示為不合法晶片), + // 1: existing security_code (合法的security_code), + // 2: not existing security_code (晶片未寫入security_code,標示為不合法晶片), + // 3: invalid_security_code (晶片有寫入security_code,但驗證後不合法), + // 4: skip_security_check(略過security_code的驗證,標示為不合法晶片), + // 5: invalid_security_file_address(有輸入認證檔的位址,但是檔案不合法,) + // 6: id_not_in_security_file(有輸入認證檔的位址,但是uid/mac不在認證檔的清單裡面), + // ) + int security_code_type; // int[6] = [out] security_code_type (for cyweeMotion debug) + int security_file_id; // int[7] = [out] security_file_id (認證檔的號碼)(for cyweeMotion debug) + int reserved; // int[8] = reserved + int chip_vendor; // int[9] = [out] chip_vendor + int cust_id_1; // int[10] = [out] cust_id_1 + int cust_id_2; // int[11] = [out] cust_id_2 +}get_chip_info_t; +#endif +/** + * @struct activity_config_t + * +*/ +typedef struct +{ + int header ;// int[0] = 1 + int include_base_calorie;// int[1] = 卡路里計算是否包含基礎卡路里 (default: 不包含基礎卡路里) (0: default, 1:包含基礎卡路里, 2:不包含基礎卡路里) + int use_hrs_calc_calorie;// int[2] = 一般模式1001是否使用心率來計算卡路里 (default: 不使用心率) (0: default, 1: 使用心率, 2:不使用心率) + int calc_calorie_in_static_exercise;// int[3] = 靜態運動時是否持續計算卡路里 (default: 停止計算) (0: default, 1: 持續計算, 2: 停止計算) + int calc_calorie_unwear;// int[4] = 運動模式(包含一般模式1001)時,脫錶後是否持續計算卡路里 (default: 持續計算) (0: default, 1: 持續計算, 2: 停止計算) + int ar_model;// int[5] = ar_model (default: on) (0: default, 1: on, 2: off) + int ar_pedo_mode;// int[6] = ar_pedo_mode (default: 平衡) (0: 平衡, 1: 計步優先, 2: 防誤觸優先) + int calc_calorie_still;// int[7] = 靜止時是否持續計算卡路里 (default: 持續計算) (0: default, 1: 持續計算, 2: 停止計算) + int motionSensScale ;// int[8] = motionSensScale活動量的靈敏度 (default: 4) (0: default, 1: 最靈敏, 2, 3, 4, 5, 6, 7: 最不靈敏) + int axial_direction_judgement ;// int[9] = 軸向判斷 (default: 有軸向判斷) (0: default, 1: 無軸向判斷, 2: 有軸向判斷) + int sensor_noise_level ;// int[10] = 感測器雜訊度等級 (default: 低雜訊) (0: 低雜訊, 1: 高雜訊A, 2 - 4, 5: 高雜訊E) +}activity_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int Lib_Porting_debug ;// int[1] = Lib Porting debug (default: turn_off) (bit control, 0: turn_off, 1: show_heap_malloc_max_used_size, 2: show_stack_max_used_size, 4: skip_custom_input_sensor, 8: skip_output_sensor_callback, 16: skip_drv_input_sensor, 32: skip_other_output_sensor_callback) + int Lib_infomation;// int[2] = Lib infomation (default: turn_off) (bit control, 0: turn off, 1: show_mem_action, 2: show_sensorRegister, 4: show_tid, 8: show_timer) + int Lib_Custom_Option;// int[3] = Lib Custom Option (default: turn_off) (bit control, 0: trun_off, 1: timer_expired_no_catch_up) + int sal_lib_disable_external_user_malloc_api ;// int[4] = sal_lib disable external user malloc api (default: turn_off) (0: turn_off, 1: turn_on) + int reserved;// int[5] = reserved + +}library_debug_control_t; + +typedef struct +{ + int header ;// int[0] = 1 + int floor_Height ;// int[1] = floor_Height (cm)(設定樓層高度)(default: 380cm = 3.8m) (0: default, 150 - 1000) + int Anti_misoperation;// int[2] = Anti-misoperation (一般模式時的防誤計步等級) (default: 4) (0: default, 1: 最容易誤計步, 2, 3, 4:預設等級, 5, 6, 7: 最不容易誤計步) + int distance_pace_step_adjust ;// int[3] = 戶外跑步和一般模式時距離、配速和步距的調整 (default: 4) (0: default, 1: 距離最短, 2, 3, 4:預設, 5, 6, 7:距離最長) + int enable_extra_packet ;// int[4] = enable_extra_packet (default: 不發送) (0: default, 1: 發送, 2: 不發送) + int Treadmill__steps;// int[5] = Treadmill__steps (跑步機校正參數)(steps) (default: 不校正) (0: 不校正) + int Treadmill__average_step_frequency ;// int[6] = Treadmill__average_step_frequency (跑步機校正參數) (steps/minute) (default: 不校正) (0: 不校正) + int Treadmill__uncalibration_distanc;// int[7] = Treadmill__uncalibration_distance (跑步機校正參數)(meters) (default: 不校正) (0: 不校正) + int Treadmill__ground_truth_distance;// int[8] = Treadmill__ground_truth_distance (跑步機校正參數: 真實的跑步距離)(meters) (default: 不校正) (0: 不校正) + int floor_sensitivity;// int[9] = floor_sensitivity (樓層計算嚴謹度)(default: 3) (0: default, 1:寬容, 2, 3, 4, 5, 7: 嚴格) + int avoid_hi_freq_mistouch;// int[10] = 防高頻誤觸 (default: 開啟) (0: default, 1: 開啟, 2: 關閉) + int hi_pace_adjust ;// int[11] = 高步頻走路步距修正 (default: 開啟) (0: default, 1: 開啟, 2: 關閉) + int mid_active_pace_threshold ;// int[12] = 活動程度區間的中度活動步頻 (default: 60) (0: default, 60 - 270) + int hi_active_pace_threshold ;// int[13] = 活動程度區間的高度活動步頻 (default: 120) (0: default, 60 - 270) +}pedometer_config_t; +typedef struct +{ + int header ;// int[0] = 1 + int version1;// int[1] = [out] version1 + int version2;// int[2] = [out] version2 + int version3;// int[3] = [out] version3 + int version4;// int[4] = [out] version4 + int product;// int[5] = [out] product + int model;// int[6] = [out] model + int arch;// int[7] = [out] arch (0: unknown, 1: aml, 2: sal) +}get_lib_version_t; + +typedef struct +{ + int header ;// int[0] = 1 + int ctl_activity_mode;// int[1] = pause/resume activity mode (0: resume, 1: pause) +}activity_pause_t; + +typedef struct +{ + int header ;// int[0] = 1 + int up_range ;// int[1] = up_range (抬手反應範圍)(default: 5) (0: default, 3: 範圍大, 4, 5, 6: 範圍小) + int down_range ;// int[2] = down_range (放手反應範圍)(default: 5) (0: default, 3: 範圍大, 4, 5, 6: 範圍小) + int sensitivity ;// int[3] = sensitivity (反應速度)(default: 5) (0: default, 3: 反應速度快, 4, 5, 6: 反應速度慢) + int horizontal_range ;// int[4] = horizontal_range (亮屏手肘傾斜範圍)(default: 5) (0: default, 1: 範圍大, 2, 3, 4, 5, 6, 7, 8, 9: 範圍小) +}watch_hand_up_down_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int chip_vendor ;// int[1] = chip_vendor (default: auto_detect) (0: default, 1: auto_detect 2: skip_auto_detect) + int cust_id_1 ;// int[2] = cust_id_1 (default: 0) + int cust_id_2 ;// int[3] = cust_id_2 (default: 0) + int reserved;// int[4] = reserved + int security_file_address;// int[5] = security_file_address (驗證檔的記憶體位址) +}chip_vendor_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int reserved;// int[1] = reserved + int use_hrs_judge_sleep_status ;// int[2] = 是否使用心率來判斷睡眠狀態 (default: 不使用心率)(0: default, 1: 使用心率, 2: 不使用心率) + int difficulty_for_falling_asleep ;// int[3] = 入睡難易度 (default: 4)(0: default, 1:不容易入睡, 2, 3, 4:標準, 5, 6, 7:容易入睡) + int difficulty_for_wakeup ;// int[4] = 出睡難易度 (default: 4)(0: default, 1:不容易出睡, 2, 3, 4:標準, 5, 6, 7:容易出睡) + int reserved1;// int[5] = reserved + int difficulty_for_sober ;// int[6] = 清醒難易度 (default: 4)(0: default, 1:不容易清醒, 2, 3, 4:標準, 5, 6, 7:容易清醒) + int hw_sig_level ;// int[7] = 硬體訊號等級 (default: 1) (0: default, 1: 低雜訊, 2, 3, 4, 5, 6, 7: 高雜訊) + int reserved2;// int[8] = reserved + int sleep_interval ;// int[9] = 睡眠間距 (default: 60) (0: default, 1 - 180) + int output_REM_without_hrs;// int[10] = 無心率時是否輸出REM (default: 會輸出REM) (0: default, 1: 禁止輸出REM, 2: 會輸出REM) + int long_nap ;// int[11] = 長時間小睡 (default: turn_off) (0: default, 1: turn_on, 2: turn_off) + int static_active_angle_sensitive;// int[12] = 靜態活動角度靈敏度 (default: 13) (0: default, 1: 較難入睡 - 30: 容易入睡) +}sleep_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int absolute_still_time ;// int[1] = 絕對靜止時間 (seconds) (default: 60) (0: default, 5 - 28800) + int sensitive_level ;// int[2] = 靈敏度等級 (default: 3) (0: default, 1:不容易觸發 - 50:容易觸發) + int AOI_mode_level ;// int[3] = AOI_模式等級 (default: disable) (0: disable, 1 - 30) + int AOI_sensitive_level ;// int[4] = AOI_靈敏度等級 (default: 3) (0: default, 1:不容易觸發 - 50:容易觸發) + int spike_blokcer_cnt ;// int[5] = spike_blokcer_cnt (default: 1)(雜訊屏蔽時間) (0: default, 1:雜訊屏蔽時間短 - 5:雜訊屏蔽時間長) + int spike_blokcer_level ;// int[6] = spike_blokcer_level (default: 1)(雜訊屏蔽等級) (0: default, 1:雜訊屏蔽效果弱 - 99:雜訊屏蔽效果強) +}absolute_static_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int hrs_get_set_flag ;// int[1] = 設定或取得心率極值(default: 設定心率極值) (0: default, 1: 設定心率極值, 2: 取得心率極值) + int max_bpm ;// int[2] = [in/out] 心率最大值(bpm) (default: 不設定) (0: default, 30 - 220) + int min_bpm ;// int[3] = [in/out] 心率最小值(bpm) (default: 不設定) (0: default, 30 - 220) +}heart_rate_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int notify_sport_mode ;// int[1] = 開關動作類型通知功能 (default: turn_off) (0: default, 1: turn on, 2: turn off) + int reserved;// int[2] = reserved + int reserved1;// int[3] = reserved + int alert_ride_time ;// int[4] = alert_ride_time (mintues)(default: 10) (0: default, 5 - 15) + int reserved2;// int[5] = reserved + int reserved3;// int[6] = reserved + int reserved4;// int[7] = reserved + int reserved5;// int[8] = reserved +}ar_alert_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int enable_extra_info_packet;// int[1] = enable_extra_info_packet (default: 不發送) (0: default, 1: 發送, 2: 不發送) + int reserved;// int[2] = reserved + int freq_curve_smooth_grade;// int[3] = 頻率曲線平滑等級 (default: 5) (0: default, 1: 最不平滑, 2, 3, 4, 5, 6, 7, 8, 9, 10: 最平滑) +}workout_machine_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int sensor_noise_level;// int[1] = 感測器雜訊度等級 (default: 低雜訊) (0: 低雜訊, 1: 高雜訊) +}inactivity_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int mode_number;// int[1] = mode_number (需填值) + int auto_time_sleep_on_sed_off;// int[2] = auto_time_sleep_on_sed_off (hours) (0: disable, 1 - 24) + int auto_time_sleep_off_sed_on;// int[3] = auto_time_sleep_off_sed_on (hours) (0: disable, 1 - 24) + int auto_time_sed_off_nap_on;// int[4] = auto_time_sed_off_nap_on (hours) (0: disable, 1 - 24) + int auto_time_nap_off_sed_on;// int[5] = auto_time_nap_off_sed_on (hours) (0: disable, 1 - 24) +}set_inactivity_mode_t; + +typedef struct +{ + int header ; +}activity_exit_t; + +typedef struct +{ + int header ;// int[0] = 1 + int input_odr ;// int[1] = [in/out] 感測器輸入ODR (Hz)(input_odr)(default: 50) (0: default, ODR: 25 - 10000) + int restart_sampling_stage ;// int[2] = 啟用重新取樣流程 (default: turn_on) (0: default, 1: turn_on, 2: turn_off) + int reset_sampling_ODR;// int[3] = [in/out] 重新取樣後ODR (Hz)(default: 依算法而不同) (0: default, ODR: 25 , 50, 100) + int force_restart_sampling ;// int[4] = 強制使用重新取樣 (default: turn_off) (0: default, 1: turn_on, 2: turn_off) + int setting_flag ;// int[5] = 設定欄位 (default: 全部) (bit control 0: default, -1: 全部, 1: input_odr, 2: resample) +}algo_proc_config_t; + +typedef struct +{ + int header ;// int[0] = 1 + int sensor_calibarion_ctl;// int[1] = 啟用感測器校正流程 (default: turn_on) (0: default, 1: turn_on, 2: turn_off) + int sensor_enable_calibration;// int[2] = 感測器強制校正 (default: default_fow) (bit control 0: default_flow, 1: acc, 2:gyro, 4:mag) + int sensor_disable_calibraion;// int[3] = 感測器取消校正 (default: default_fow) (bit control 0: default_flow, 1: acc, 2:gyro, 4:mag) +}sensor_calibration_flow_config_t; + + +typedef struct +{ + int header ;// int[0] =1 + int calibration_data_set_get_flag;// int[1] = 設定或取得校正值(default: 取得校正值) (0: default, 1: 取得校正值, 2: 設定校正值) + int acc_calvalue_x;// int[2] = [in/out] acc_calvalue_x + int acc_calvalue_y;// int[3] = [in/out] acc_calvalue_y + int acc_calvalue_z;// int[4] = [in/out] acc_calvalue_z + int gyro_calvalue_x;// int[5] = [in/out] gyro_calvalue_x + int gyro_calvalue_y;// int[6] = [in/out] gyro_calvalue_y + int gyro_calvalue_z;// int[7] = [in/out] gyro_calvalue_z +}sensor_calibration_control_a_t; + + +typedef struct +{ + int header ;// int[0] = 1 + int setting_flag ;// int[1] = 設定欄位 (default: 全部) (bit control 0: default, -1: 全部, 1: noise_bias_batch, 2: LSB_DPS, 4: stlLevel) + int reserved1 ;// int[2] = 0 + int reserved2 ;// int[3] = 0 + int gyro_Lsb_Dps;// int[4] = gyro_Lsb_Dps (default: 16383750) (0: default, 1 - 1000000000) + int acc_noise;// int[5] = acc_noise (default: 2600) (0: default, 1 - 1000000000) + int gyr_noise;// int[6] = gyr_noise (default: 150000) (0: default, 1 - 1000000000) + int acc_bias;// int[7] = acc_bias (default: 200000) (0: default, 1 - 1000000000) + int gyr_bias;// int[8] = gyr_bias (default: 20000000) (0: default, 1 - 1000000000) + int acc_min_batch_ms;// int[9] = acc_min_batch_ms (default: 1000) (0: default, 1 - 100000) + int gyr_min_batch_ms;// int[10] = gyr_min_batch_ms (default: 4000) (0: default, 1 - 100000) + int acc_stl_level;// int[11] = acc_stl_level (default: 6000000) (0: default, 1 - 1000000000) + int gyr_stl_level;// int[12] = gyr_stl_level (default: 3000000) (0: default, 1 - 1000000000) +}sensor_calibration_set_a_t; + + +typedef struct +{ + int header ;// int[0] =1 + int adjust_value_set_get_flag;// int[1] = 設定或取得校正值(default: 取得校正值) (0: default, 1: 取得校正值, 2: 設定校正值) + int gyro_sens_0;// int[2] = [in/out] gyro_sens_0 + int gyro_sens_1;// int[3] = [in/out] gyro_sens_1 + int gyro_sens_2;// int[4] = [in/out] gyro_sens_2 + int gyro_sens_3;// int[5] = [in/out] gyro_sens_3 + int gyro_sens_4;// int[6] = [in/out] gyro_sens_4 + int gyro_sens_5;// int[7] = [in/out] gyro_sens_5 + int gyro_sens_6;// int[8] = [in/out] gyro_sens_6 + int gyro_sens_7;// int[9] = [in/out] gyro_sens_7 + int gyro_sens_8;// int[10] = [in/out] gyro_sens_8 +}sensor_calibration_control_a2_t; + +typedef struct +{ + int header ;// int[0] =1 + int acc_axis_setting;// int[1] = acc_axis setting (0: default, 1-24: axis_mode) + int mag_axis_setting;// int[2] = mag_axis setting (0: default, 1-24: axis_mode) +}input_sensor_config_t; + +#pragma pack() + + + + + + +/********************CYWEE DML*********************/ + + + + + + + + + int cywee_main_dml(void); void cywee_int_handler(void); diff --git a/code/sdk/drivers/peripheral/cywee/Inc/os_api.h b/code/sdk/drivers/peripheral/cywee/Inc/os_api.h deleted file mode 100644 index 8bdd926e7..000000000 --- a/code/sdk/drivers/peripheral/cywee/Inc/os_api.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __OS_API_H__ -#define __OS_API_H__ - -typedef struct{ - int (*dbgOutput)(const char*); - uint64_t (*GetTimeNs)(void); - void (*uSleep)(uint32_t); - int (*i2cRead)(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex); - int (*i2cWrite)(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); - void *(*malloc)(int size); - void (*free)(void* ptr); - int (*spiRead)(uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex); - int (*spiWrite)(uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); -} os_api; - -typedef os_api OsAPI; - -#endif /* __OS_API_H__ */ diff --git a/code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.bk.a b/code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.p3.a similarity index 85% rename from code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.bk.a rename to code/sdk/drivers/peripheral/cywee/Lib/CWM_LIB_clang_riscv.p3.a index 689b04914269e2bbe69cc5a5e75ee1ed3750bd88..4275ca2fb7e8df61d71bcb3a743056e34785f837 100644 GIT binary patch delta 156848 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 G@xK7?nsgli delta 157844 zcmcef3w%}8nfBK{mk?qIhm$Mk#1O(&Jc;3AOew`k0FhEeqzpwwKtx1DM2eIm2N400 zB65(0h!_wpQi_O3C`F7EDN<#S4=q(n(IO(H6dB4#9m;&qv)6jVs^e`sGvE5LIRE!~ z-*wsdz1P0v*zA#YdgS_iFS%N&SN@0cq0LJDS99|71&*&(>I<^xWhy_1S1ZrWSN2h! zc9aJ82lK*|9{Cbu0B>$fp<$aTU8g+klPJU@X;I8v3Fm?Yo%X1O? zPvzu4Tks#t1;d+FuyL=i&+SI4pqrCol&@7mH+NpIf^P1O20ou}8n1%0H=6vDMJmX= zsPc>Rig_yN=5?7Wh@1>=nxleS&X`=cO9j6uzok@A@_sbR{9bpHKPXf|=8sSZ^Pl^f ze7Z^nna`n9U!IdH^zF%Cp8qAGLSK@@IXUVpbLnao{;K@KeieQp$^ZW6b6VOC^^J1! zn+AS9u6K<}lYISJmFDIZT~yjP%*k&W_`ejF{Kh@~-|0Z|o6oBMl@27o;d1)lXuQFu znJU>}%R%)I`GaEB;QwDveqm$jzuBz(e5{{J|6k3?|J*>vr6*Lzptk?xIkR1*%Divc zKj!4;g)gxi?R--;djHhd=B&(B>KoB>(%;+##W|zAlefD(j!m$$u>TYL3d< zx$*yFPF`%Rad?pW#(6+@)%XXQs_`8yRpTi`zB(^Epc;QJN2VWEeohLc#;eFbnVXCo zslGP<@|=o>D*sbXev$Z}w71_>(RWAwmveUS11kIWPG6OiU*-II--Y!mr^%rIMoxaN zaMwO6=by==�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%0DPtmpX;4kqW7Tth>W`>SdynRsRsIyBk?|t1Dpb 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%0D!ht9fS@j06>SWc~iK-sVs7%jKsddOi zaR*hMthur7nsl=2F{6`JuP{1Ubsk7u`Kj;$Ty@koJ3O-L9A{~R$f~b1I$8By;J6!w zl2zXWPB@+1^!p+YRgv22$-QJ--objI%eR%NHFJs-?yC}X4Ky&k+@5qo~=PzSLap&G>-275gWQZ5M_FSu| zW7N0WLd_R$6)#4EHd&Q`$u1<}J)9JxpZH))z|6O`_AC?|7179#)f1 z-)MN3;bVqVmyD5(txhwS817@3UA@LkGF(TlKw(H*$nISEWpJ6}qttsz%vtKXe+9wIK1Qfa z>oIA}X0nUfO6KtmX&WYu*+F(OyT}FjgR}>e#vC9^Oe%amn%|Bg@-7PvItg0~I!!Lb zAEdLGH0A=?Rd$KYLpsuBOd4~Q>|#7@bUsH@NEzfdT>eP8G+aN_mxiWgBoO{=s;{nQ0rTaRpkaXjLA5bMjcm&|s#u!1-5 zDeS^e{mjSy2_dW=VV`)$vJtDci}T65#9JSLbO?Jtv$m-J0L8AxDv?u}g(qUY!dK<4 zeXLu-M(lOyZNt5h4-pr5k;Xrth`o^Bc;L6OuIa(j-^TbcFU-(DPQhChv6Vr^ZoF%I z_3vU+eT=(3WtUP61ygFD}jwQrFbzPmd& z_y7h@a9X<962$u9NEzT#I?C$k{CPpy)tsU)4#<@8yi}Eqr}EIXA)Fl!huAN|aTi$q zuB7l^I*K0)M=dONAdH`Z1u!4nJ@C6_7xrxB-G>63Q>OQYf3UN>&%tKlk}?|~JQr*0 zr#^0(1Gw^1ULyj| zHwzx0_pwjO@({a;{e75xkB`eNGjhk|gaGSBCaRnrwA3lco) zo8NBRxx-W{u2`~W=c!5L?qJpB*yH}_Ao3?HpLW5u-?l4Cx#Q<@tXd6T1CD%2iY2T5 z3iW$MC#%jEuSC8qI$8Bo-~z5TB(myPz4Y&hW7VK5Kp}|h?i~9;$BzK;<3Rd z{7a3KsHG-qJy>5UO4i&Qa_hT8?eKd$<8jtO z^Gswd=rRj(I$3pgnp!bgbslfEVzTNHaAcB{PlkS1Xz^-L#O>;2%`lic&-0PUs^3k0 zvgl;h$5DSU=r9yN>TrKYnqu73z=_;o*ih^?1#b1sGyd>VzbGH|`>Y!|Ej8ZN;KctYpoaihr*HH|Qg)z5uL`OOjRJ4US9?i}A>+9|!YBJEr5A!MT=g^HK?C zpE7YA(#73~maO?RzzH4c8apLfA;vwC+1&h+H5jek4y%@Uog`FJeQH=1`RUneoW z$nKnnJD|R5Y7g~}5_81xHF8O)j}FfUoDsf)Pq_#BUwwrWNBU)@VTSMmwZ83{w#1A z*8oxpb;nb{H8;!7F(yw30j!c|}FAn^>Q=2OCp$h;1Nv=m(CF7z%p3~V~6kabgK_rilpuqT?4 z-@6N}g7Nr+MAj%S&d3C+IN89YdNDZJFIe+-VNuZY@3D&8+{IrG&wLle7{3aCkV-JA z&hq`+@dt_93|=?C=I^na{QkkgzsG*qdO+xqd$wx6xukuOKaeM$^Mh}lXi@mT{}HTp z_#@cPEcp@a!{E+w1>uiinY{C`jz2yXu4JW{xHy>T>8IzPjhFoP1O1juaX`<5?~d>! zav^r?1;L%aj&{B!ABUz(INY>`lZ9kpg6Y*euEzf`b;iLDz&JUJY&iweV&rKZ+<79_ NG4mrVi2q=N{x8` -#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 deleted file mode 100644 index 1e1373eff..000000000 --- a/code/sdk/drivers/peripheral/cywee/src/board_nordic.c +++ /dev/null @@ -1,479 +0,0 @@ -/*********************/ -/*** 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/board_yh601s.c b/code/sdk/drivers/peripheral/cywee/src/board_yh601s.c index e2802261a..495c3848b 100644 --- a/code/sdk/drivers/peripheral/cywee/src/board_yh601s.c +++ b/code/sdk/drivers/peripheral/cywee/src/board_yh601s.c @@ -63,13 +63,13 @@ int gpio_int_pin_init(void) if ((uapi_pin_set_mode(G_INT1_PIN, (pin_mode_t)HAL_PIO_FUNC_GPIO) != ERRCODE_SUCC) || (uapi_pin_set_pull(G_INT1_PIN, (pin_pull_t)HAL_PIO_PULL_UP) != ERRCODE_SUCC) || (uapi_gpio_set_dir(G_INT1_PIN, GPIO_DIRECTION_INPUT) != ERRCODE_SUCC)) { - PRINT_ERR("gpio G_INT1_PIN config failed\r\n"); + CWM_OS_dbgPrintf("gpio G_INT1_PIN config failed\r\n"); return ERRCODE_FAIL; } if ((uapi_pin_set_mode(G_INT2_PIN, (pin_mode_t)HAL_PIO_FUNC_GPIO) != ERRCODE_SUCC) || (uapi_pin_set_pull(G_INT2_PIN, (pin_pull_t)HAL_PIO_PULL_UP) != ERRCODE_SUCC) || (uapi_gpio_set_dir(G_INT2_PIN, GPIO_DIRECTION_INPUT) != ERRCODE_SUCC)) { - PRINT_ERR("gpio G_INT2_PIN config failed\r\n"); + CWM_OS_dbgPrintf("gpio G_INT2_PIN config failed\r\n"); return ERRCODE_FAIL; } return ERRCODE_SUCC; @@ -95,15 +95,19 @@ static errcode_t cywee_i2c_init(void) errcode_t result; /* init i2c */ if ( g_cywee_installed == 1 ) + { + // CWM_OS_dbgPrintf("cywee cywee_i2c_init already installed \n"); return ERRCODE_SUCC; + } + result = uapi_i2c_master_init(CYWEE_I2C_BUS, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */ if (result != ERRCODE_SUCC) { - PRINT_ERR("cywee i2c init fail! ret=0x%x", result); + CWM_OS_dbgPrintf("cywee i2c init fail! ret=0x%x\n", result); return ERRCODE_FAIL; } - PRINT_DEBUG("cywee:i2c_id = %d i2c_speed = %d \r\n", CYWEE_I2C_BUS, 400000); + CWM_OS_dbgPrintf("cywee:i2c_id = %d i2c_speed = %d \r\n", CYWEE_I2C_BUS, 400000); g_cywee_installed = 1; @@ -120,7 +124,7 @@ int CWM_OS_i2cRead(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *rea write_data = (uint8_t *)osal_kmalloc(regLength, OSAL_GFP_KERNEL); if (write_data == NULL) { - PRINT_ERR("cywee send buff malloc fail!"); + CWM_OS_dbgPrintf("cywee send buff malloc fail! %d\n",regLength); goto error; } @@ -139,13 +143,13 @@ int CWM_OS_i2cRead(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *rea data.receive_len = readDataSize; for (retry = 0; retry < CYWEE_I2C_RETRY_TIME_MAX; retry++) { - ret = uapi_i2c_master_writeread(CYWEE_I2C_BUS, CYWEE_I2C_RETRY_TIME_MAX, &data); + ret = uapi_i2c_master_writeread(CYWEE_I2C_BUS, slaveAddr, &data); if (ret == ERRCODE_SUCC) { break; } } if (ret != ERRCODE_SUCC) { - PRINT_ERR("cywee data read fail! ret=0x%x", ret); + CWM_OS_dbgPrintf("CWM_OS_i2cRead cywee data read fail! busIndex %d, slaveAddr 0x%x, regaddr 0x%X,reglength %d, ret=0x%x\n",busIndex, slaveAddr,reg,regLength, ret); } osal_kfree(write_data); error: @@ -166,7 +170,7 @@ int CWM_OS_i2cWrite(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *wr send_len = data_len + regLength; write_data = (uint8_t *)osal_kmalloc(send_len, OSAL_GFP_KERNEL); if (write_data == NULL) { - PRINT_ERR("cywee send buff malloc fail!"); + CWM_OS_dbgPrintf("cywee CWM_OS_i2cWrite send buff malloc fail %d!\n",send_len); goto error; } @@ -179,7 +183,7 @@ int CWM_OS_i2cWrite(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *wr } ret = (uint32_t)memcpy_s(write_data + regLength, send_len - regLength, data_buf, data_len); if (ret != EOK) { - PRINT_ERR("cywee send_buf content copy fail! ret=0x%x", ret); + CWM_OS_dbgPrintf("cywee send_buf content copy fail! ret=0x%x\n", ret); goto free_mem; } @@ -195,7 +199,7 @@ int CWM_OS_i2cWrite(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *wr } } if (ret != ERRCODE_SUCC) { - PRINT_ERR("cywee data write fail! ret=0x%x", ret); + CWM_OS_dbgPrintf("CWM_OS_i2cWrite cywee data write fail! ret=0x%x\n", ret); } free_mem: osal_kfree(write_data); @@ -229,7 +233,7 @@ int CWM_OS_i2cTransfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t ret = (uint32_t)memcpy_s(write_data + regLength, writeDataSize, writeData, writeDataSize); if (ret != EOK) { - PRINT_ERR("cywee send_buf content copy fail! ret=0x%x", ret); + CWM_OS_dbgPrintf("cywee send_buf content copy fail! ret=0x%x\n", ret); goto free_mem; } data.send_buf = write_data; @@ -238,13 +242,13 @@ int CWM_OS_i2cTransfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t data.receive_len = readDataSize; for (retry = 0; retry < CYWEE_I2C_RETRY_TIME_MAX; retry++) { - ret = uapi_i2c_master_writeread(CYWEE_I2C_BUS, CYWEE_I2C_RETRY_TIME_MAX, &data); + ret = uapi_i2c_master_writeread(CYWEE_I2C_BUS, slaveAddr, &data); if (ret == ERRCODE_SUCC) { break; } } if (ret != ERRCODE_SUCC) { - PRINT_ERR("cywee data read fail! ret=0x%x", ret); + CWM_OS_dbgPrintf("CWM_OS_i2cTransfer cywee data read fail! ret=0x%x\n", ret); } free_mem: @@ -311,13 +315,9 @@ int CWM_OS_dbgPrintf(const char * format,...) return 0; } -int CWM_OS_spiRead(uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex) { - uint8_t ret; - return ret; -} - -int CWM_OS_spiWrite(uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex) { - uint8_t ret; +void CWM_OS_saveData(uint8_t* data, uint32_t len){ - return ret; } +void CWM_OS_restoreData(uint8_t* data, uint32_t len){ + +} \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/cywee/src/main.c b/code/sdk/drivers/peripheral/cywee/src/main.c index f465b6cf7..d2528c48a 100644 --- a/code/sdk/drivers/peripheral/cywee/src/main.c +++ b/code/sdk/drivers/peripheral/cywee/src/main.c @@ -1,184 +1,56 @@ -/*********************/ -/*** Include Files ***/ -/*********************/ - - -#if 1 - -#include "cwm_lib.h" -#include "CWM_EventStructure.h" -#include "CWM_CustomDataStruct.h" -#include "os_api.h" -#include -#include -#include - -/*********************/ -/*** Macro Defines ***/ -/*********************/ - - -/*************************/ -/*** Variables Defines ***/ -/*************************/ - - -/************************/ -/*** Function Defines ***/ -/************************/ -extern int CWM_OS_dbgOutput(const char * format); -extern int CWM_OS_dbgPrintf(const char * format,...); -#define IDX_ALGO_ACTIVITY_OUTPUT 14 - -extern void CWM_AP_SensorListen(SensorEVT_t *sensorEVT) ; - -void CWM_lib_init(void) { - os_api api = { - .dbgOutput = CWM_OS_dbgOutput, - }; - CWM_LibPreInit(&api); - - - SettingControl_t scl; - - memset(&scl, 0, sizeof(scl)); - scl.iData[0] = 1; - // scl.iData[3] = 1; - scl.iData[4] = 1 + 4; - CWM_SettingControl(SCL_LOG, &scl); - - - memset(&scl, 0, sizeof(scl)); - scl.iData[0] = 1; - CWM_SettingControl(SCL_GET_LIB_INFO, &scl); - printf("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]); - - printf("[DBG] ach: %d\n", scl.iData[7]); - - memset(&scl, 0, sizeof(scl)); - scl.iData[0] = 1; - scl.iData[1] = 2; //chip vendor, 0:defualt auto detect, 1:auto detect, 2:skip auto detect - CWM_SettingControl(SCL_CHIP_VENDOR_CONFIG, &scl); - - CWM_LibPostInit(CWM_AP_SensorListen); - // CWM_LibPostInit(NULL); - - CWM_Sensor_Enable(IDX_REQUEST_SENSOR); - CWM_Sensor_Enable(IDX_ACCEL); - CWM_Sensor_Enable(IDX_GYRO); - CWM_Sensor_Enable(IDX_ALGO_ACTIVITY_OUTPUT); - - memset(&scl, 0, sizeof(scl)); - scl.iData[0] = 1; - scl.iData[1] = 1001; - CWM_SettingControl(SCL_SET_ACTIVITY_MODE, &scl); -} - - - -#else - +#include #include -#include #include +#include #include "cwm_lib.h" -#include "config.h" -#ifdef SIGNAL_SIMULATE_PROCESS -#include "simulate_signal.h" -#endif - - -/*************************/ -/*** Variables Defines ***/ -/*************************/ +int CWM_OS_dbgOutput(const char * format) { + printf("%s", format); + return 0; +} -static const char* REQ_SENS_NAME[] = {"acc", "gyro", "mag", "baro", "temp", "hr", "gnss", "ob", "oc", "accany"}; -static int m_req_sensor_state = 0; +int CWM_OS_dbgPrintf(const char * format,...) { + va_list argList; + int size = 0; + static char tBuffer[256]; + va_start(argList, format); + size = vsnprintf(tBuffer, sizeof(tBuffer), format, argList); + va_end(argList); + //strcat(tBuffer, "\n"); + CWM_OS_dbgOutput(tBuffer); + return size; +} -/************************/ -/*** Function Defines ***/ -/************************/ +uint64_t CWM_OS_GetTimeNs(void) { + uint64_t timeNow_us; -extern void board_init(void); -extern void CWM_OS_uSleep(uint32_t time); -extern uint64_t CWM_OS_GetTimeNs(void); -extern void* CWM_OS_malloc(int size); -extern void CWM_OS_free(void *ptr); -extern int CWM_OS_dbgOutput(const char * format); -extern int CWM_OS_dbgOutput_checkLog(const char * format); -extern int CWM_OS_dbgPrintf(const char * format,...); -extern void test_api(void); + timeNow_us = 0; -/********************************/ -/*** Function Implementations ***/ -/********************************/ -int getReqSensor(int index) { - if (m_req_sensor_state & (1<sensorType) { - case IDX_REQUEST_SENSOR: - if (sensorEVT->fData[2] != 0) - m_req_sensor_state |= (1<<(int)sensorEVT->fData[1]); - else - m_req_sensor_state &= ~(1<<(int)sensorEVT->fData[1]); - - CWM_OS_dbgPrintf("req_sensor input_sensor: %s(%.1f), switch: %.1f\n",\ - REQ_SENS_NAME[(int)sensorEVT->fData[1]], sensorEVT->fData[1], sensorEVT->fData[2]); - CWM_OS_dbgPrintf("input_sensor now: acc=%d gyro=%d mag=%d baro=%d temp=%d hr=%d gnss=%d ob=%d oc=%d accany=%d\n",\ - getReqSensor(0), getReqSensor(1), getReqSensor(2), getReqSensor(3), getReqSensor(4),\ - getReqSensor(5), getReqSensor(6), getReqSensor(7), getReqSensor(8), getReqSensor(9)); - break; - - case IDX_ACCEL: - CWM_OS_dbgPrintf("%s: %.4f, %.4f, %.4f\n", "accel", + case 0: + CWM_OS_dbgPrintf("acc: x=%.3f, y=%.3f, z=%.3f\n", sensorEVT->fData[0], sensorEVT->fData[1], - sensorEVT->fData[2]); - break; + sensorEVT->fData[2] + ); + break; - case IDX_ALGO_ACTIVITY_OUTPUT: - CWM_OS_dbgPrintf("%s: %.4f, %.4f, %.4f, %.4f, "\ - "%.4f, %.4f, %.4f, %.4f, "\ - "%.4f, %.4f, %.4f, %.4f, "\ - "%.4f, %.4f, %.4f, %.4f\n", "activity output", + case 1: + CWM_OS_dbgPrintf("gyro: x=%.3f, y=%.3f, z=%.3f\n", sensorEVT->fData[0], sensorEVT->fData[1], - sensorEVT->fData[2], - sensorEVT->fData[3], - sensorEVT->fData[4], - sensorEVT->fData[5], - sensorEVT->fData[6], - sensorEVT->fData[7], - sensorEVT->fData[8], - sensorEVT->fData[9], - sensorEVT->fData[10], - sensorEVT->fData[11], - sensorEVT->fData[12], - sensorEVT->fData[13], - sensorEVT->fData[14], - sensorEVT->fData[15]); - break; + sensorEVT->fData[2] + ); + break; default: - CWM_OS_dbgPrintf("%d: %.4f, %.4f, %.4f, %.4f, "\ - "%.4f, %.4f, %.4f, %.4f, "\ - "%.4f, %.4f, %.4f, %.4f, "\ - "%.4f, %.4f, %.4f, %.4f", sensorEVT->sensorType, + CWM_OS_dbgPrintf("IDX[%d]: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", sensorEVT->sensorType, sensorEVT->fData[0], sensorEVT->fData[1], sensorEVT->fData[2], @@ -186,137 +58,32 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { sensorEVT->fData[4], sensorEVT->fData[5], sensorEVT->fData[6], - sensorEVT->fData[7], - sensorEVT->fData[8], - sensorEVT->fData[9], - sensorEVT->fData[10], - sensorEVT->fData[11], - sensorEVT->fData[12], - sensorEVT->fData[13], - sensorEVT->fData[14], - sensorEVT->fData[15]); - break; + sensorEVT->fData[7] + ); } } -#ifdef SIGNAL_SIMULATE_PROCESS -#define SIGNAL_SIMULATE_FIFO_COUNT 10 - -static void sample_fifo_input_data(time_axis_data *taxis) { - int i; - float acc[3]; - CWM_CustomSensorInput_Fifo_Start(CUSTOM_ACC, - simulate_fake_get_time_ns(), - 20 * 1000000); - - for (i=0; i 0) { - /* Do Low power process here - */ - - CWM_OS_uSleep(next_duration / 1000); + scl.iData[3] = 3; + scl.iData[4] = 15 + 64; + //scl.iData[6] = 64 + 128 + 256 + 512 + 1024 + 2048 + 4096 + 8192 + 16384; + //CWM_SettingControl(SCL_LOG, &scl); + + CWM_Sensor_Enable(0); //IDX_ACCEL + CWM_Sensor_Enable(1); //IDX_GYRO + +/* + CWM_Sensor_Disable(0); + CWM_Sensor_Disable(1); +*/ + + for (loopIndex = 0; loopIndex < 101; loopIndex ++) { + int dt_us; + + dt_us = 20000; + + CustomSensorData csd; + + memset(&csd, 0, sizeof(CustomSensorData)); + csd.sensorType = CUSTOM_ACC; + csd.fData[0] = 0; + csd.fData[1] = 0; + csd.fData[2] = 9.80665; + CWM_CustomSensorInput(&csd); + + memset(&csd, 0, sizeof(CustomSensorData)); + csd.sensorType = CUSTOM_GYRO; + csd.fData[0] = 0; + csd.fData[1] = 0; + csd.fData[2] = -3.1415926; + CWM_CustomSensorInput(&csd); + + ret = CWM_process2(dt_us); + if (ret < 0) { + CWM_OS_dbgPrintf("FATAL ERROR! ret=%d\n", ret); } - - CWM_process(); } + + return 0; } -#endif diff --git a/code/sdk/drivers/peripheral/cywee/src/main_dml.c b/code/sdk/drivers/peripheral/cywee/src/main_dml.c index e71c3e729..3015059e7 100644 --- a/code/sdk/drivers/peripheral/cywee/src/main_dml.c +++ b/code/sdk/drivers/peripheral/cywee/src/main_dml.c @@ -4,37 +4,149 @@ #include #include #include - +#include "cywee_hal.h" #define AP_ENABLE_DML_SDO_LISTEN -extern uint64_t CWM_OS_GetTimeNs(void); -extern int CWM_OS_dbgOutput(const char * format); -extern int CWM_OS_dbgPrintf(const char * format,...); -extern void CWM_OS_uSleep(unsigned int udelay); -extern int CWM_OS_i2cRead(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex); -extern int CWM_OS_i2cWrite(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); -extern int CWM_OS_spiRead(uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex); -extern int CWM_OS_spiWrite(uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex); void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { switch (sensorEVT->sensorType) { - case 0: + case IDX_ACCEL: + #if 0 CWM_OS_dbgPrintf("acc: x=%.3f, y=%.3f, z=%.3f\n", sensorEVT->fData[0], sensorEVT->fData[1], sensorEVT->fData[2] ); + #endif break; - case 1: + case IDX_GYRO: CWM_OS_dbgPrintf("gyro: x=%.3f, y=%.3f, z=%.3f\n", sensorEVT->fData[0], sensorEVT->fData[1], sensorEVT->fData[2] ); break; + case IDX_MAG: + CWM_OS_dbgPrintf("mag:x=%.3f , y=%.3f, z=%.3f, accuracy=%.3f\n",sensorEVT->fData[0], + sensorEVT->fData[1], + sensorEVT->fData[2], + sensorEVT->fData[3]); + + break; + case IDX_HEARTRATE: + CWM_OS_dbgPrintf("IDX_HEARTRATE\n"); + break; + case IDX_OFFBODY_DETECT: + CWM_OS_dbgPrintf("IDX_OFFBODY_DETECT\n"); + break; + case IDX_ALGO_SEDENTARY: + CWM_OS_dbgPrintf("IDX_ALGO_SEDENTARY\n"); + + break; + case IDX_ALGO_WATCH_HANDUP: + CWM_OS_dbgPrintf("HANDUP_DOWN MSG [%d]\n",(int)sensorEVT->fData[1]); + + break; + case IDX_ALGO_SLEEP: + CWM_OS_dbgPrintf("IDX_ALGO_SLEEP\n"); + break; + case IDX_REQUEST_SENSOR: + CWM_OS_dbgPrintf("IDX_REQUEST_SENSOR input_sensor[%d][%s] (0: acc, 1: gyro, 2: mag, 3: baro, 4: temperature, 5: heart_rate, 6: GNSS(GPS), 7: off-body detect 8: on-charging detect 9: acc_any_motion)\n", + (int)sensorEVT->fData[1], + (int)sensorEVT->fData[2]==0?"off":"on"); + CustomSensorData csd; + if((int)sensorEVT->fData[1] == CUSTOM_OFFBODY_DETECT) + { + // [0] = off-body state +// (0: device is off-body(未戴身上) , 1: device is on-body(戴在身上)) + memset(&csd, 0, sizeof(CustomSensorData)); + csd.sensorType = CUSTOM_OFFBODY_DETECT; + csd.fData[0] = 1; + CWM_CustomSensorInput(&csd); + } + if((int)sensorEVT->fData[1] == CUSTOM_ON_CHARGING) + { + // [0] = On-Charging state +// (0: 裝置未連接充電裝置, 1: 裝置連接充電裝置) + memset(&csd, 0, sizeof(CustomSensorData)); + csd.sensorType = CUSTOM_ON_CHARGING; + csd.fData[0] = 0; + CWM_CustomSensorInput(&csd); + } + + break; + case IDX_ALGO_SHAKE: + CWM_OS_dbgPrintf("IDX_ALGO_SHAKE\n"); + break; + case IDX_ALGO_ACTIVITY_OUTPUT: + if((int)sensorEVT->fData[0] == 100) + { + CWM_OS_dbgPrintf("average step frequency[%d], average step length[%d], average pace[%d], max step frequency[%d], max pace[%d]\n", + (int)sensorEVT->fData[1], + (int)sensorEVT->fData[2], + (int)sensorEVT->fData[3], + (int)sensorEVT->fData[4], + (int)sensorEVT->fData[5]); + }else{ + CWM_OS_dbgPrintf("activity_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%d], pace[%d], BMR calories[%d], is_pause[%d]\n", + (int)sensorEVT->fData[0], + (int)sensorEVT->fData[1], + (int)sensorEVT->fData[2], + (int)sensorEVT->fData[3], + (int)sensorEVT->fData[5], + (int)sensorEVT->fData[6], + (int)sensorEVT->fData[7], + (int)sensorEVT->fData[8], + (int)sensorEVT->fData[14]); + } + +// [0] = activity_mode (1001~1xxx) +// [1] = steps (steps)(步數) +// [2] = distance (meters)(距離) +// [3] = calories (Kcal)(卡路里) +// [4] = reserved +// [5] = step frequency (steps/minute)(步頻) +// [6] = step length (meters)(步長)(步幅) +// [7] = pace (minutes/Km)(配速) +// [8] = BMR calories (Kcal)(基礎卡路里) +// [9] = current elevation (meters) (海拔高度,需要氣壓計) +// [10] = floors up (floors) (爬升樓層,需要氣壓計) +// [11] = floors down (floors) (下降樓層,需要氣壓計) +// [12] = elevation up (meters) (爬升高度,需要氣壓計) +// [13] = elevation down (meters) (下降高度,需要氣壓計) +// [14] = is_pause (是否暫停活動) +// (0: 活動中, 1: 暫停活動) + break; + case IDX_ALGO_ANY_MOTION: + CWM_OS_dbgPrintf("IDX_ALGO_ANY_MOTION\n"); + break; + case IDX_ALGO_NO_MOTION: + CWM_OS_dbgPrintf("IDX_ALGO_NO_MOTION\n"); + break; + case IDX_ALGO_FALLING: + CWM_OS_dbgPrintf("IDX_ALGO_FALLING\n"); + break; + case IDX_ONCHARGING_DETECT: + CWM_OS_dbgPrintf("IDX_ONCHARGING_DETECT\n"); + break; + case IDX_ALGO_ABSOLUTE_STATIC: + CWM_OS_dbgPrintf("IDX_ALGO_ABSOLUTE_STATIC\n"); + break; + case IDX_ALGO_SPV: + CWM_OS_dbgPrintf("IDX_ALGO_SPV\n"); + break; + case IDX_ALGO_SENS_CALIBRATION: + CWM_OS_dbgPrintf("IDX_ALGO_SENS_CALIBRATION\n"); + break; + case IDX_ALGO_STAND: + CWM_OS_dbgPrintf("IDX_ALGO_STAND\n"); + break; + case IDX_ALGO_SENS_RANGE_DETECT: + CWM_OS_dbgPrintf("IDX_ALGO_SENS_RANGE_DETECT\n"); + break; default: CWM_OS_dbgPrintf("IDX[%d]: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", sensorEVT->sensorType, sensorEVT->fData[0], @@ -53,10 +165,10 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { void CWM_AP_dmlSensorDataOutput_listen(const dml_sensorData_t * pSdo) { if (pSdo->validData & DML_SENSOR_DATA_VALID_DT) - CWM_OS_dbgPrintf("dt: %d us\n", pSdo->dt_us); + CWM_OS_dbgPrintf("==dt: %d us\n", pSdo->dt_us); if (pSdo->validData & DML_SENSOR_DATA_VALID_ACC) - CWM_OS_dbgPrintf("acc: x=%.3f, y=%.3f, z=%.3f\n", pSdo->acc_data[0], pSdo->acc_data[1], pSdo->acc_data[2]); + CWM_OS_dbgPrintf("==acc: x=%.3f, y=%.3f, z=%.3f\n", pSdo->acc_data[0], pSdo->acc_data[1], pSdo->acc_data[2]); } #endif static int cywee_installized = 0 ; @@ -76,28 +188,53 @@ int cywee_main_dml(void) { 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]); os_api api = { .GetTimeNs = CWM_OS_GetTimeNs, .dbgOutput = CWM_OS_dbgOutput, .i2cRead = CWM_OS_i2cRead, .i2cWrite = CWM_OS_i2cWrite, - .spiRead = CWM_OS_spiRead, - .spiWrite = CWM_OS_spiWrite, .uSleep = CWM_OS_uSleep, + .free = CWM_OS_free, + .malloc = CWM_OS_malloc, + .spiRead = NULL, + .spiWrite = NULL, + }; + OsAPI apiOS = { + .GetTimeNs = CWM_OS_GetTimeNs, + .dbgOutput = CWM_OS_dbgOutput, + .i2cRead = CWM_OS_i2cRead, + .i2cWrite = CWM_OS_i2cWrite, + .uSleep = CWM_OS_uSleep, + .free = CWM_OS_free, + .malloc = CWM_OS_malloc, + .i2cTransfer = CWM_OS_i2cTransfer, + .restoreData = CWM_OS_restoreData, + .saveData = CWM_OS_saveData, + .spiRead = NULL, + .spiWrite = NULL, + .securityCodeWrite = NULL, + .setGpio = NULL, + .enableGpioIRQ = NULL, + .disableGpioIRQ = NULL, }; - CWM_LibPreInit(&api); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); //set mcu_chip information, must call this before CWM_LibPostInit() + memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; scl.iData[1] = 2; // 0: mcu_auto_detect 2: skip_mcu_auto_detect CWM_SettingControl(SCL_CHIP_VENDOR_CONFIG, &scl); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); + CWM_LibPostInit(CWM_AP_SensorListen); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); //get chip information + char chipInfo[64]; memset(&scl, 0, sizeof(scl)); @@ -111,10 +248,10 @@ int cywee_main_dml(void) { CWM_SettingControl(SCL_GET_CHIP_INFO, &scl); 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__); CWM_Dml_LibInit(); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); #ifdef AP_ENABLE_DML_SDO_LISTEN // This API allows customers to develop custom features. @@ -122,17 +259,19 @@ int cywee_main_dml(void) { // No need to enable or implement this function for general usage. CWM_Dml_sensorDataOutput_register(CWM_AP_dmlSensorDataOutput_listen); #endif + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; CWM_SettingControl(SCL_DML_GET_LIB_INFO, &scl); CWM_OS_dbgPrintf("dml 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] %s %d\n", __func__,__LINE__); memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; - scl.iData[1] = 1; - //CWM_SettingControl(SCL_DML_DEBUG, &scl); + scl.iData[1] = 18; //00000000000000000000000000010010 高位在前 + // CWM_SettingControl(SCL_DML_DEBUG, &scl); memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; @@ -140,17 +279,27 @@ int cywee_main_dml(void) { scl.iData[4] = 2; scl.iData[8] = 52; // for st sensor(52Hz) CWM_SettingControl(SCL_DML_DRV_AG_CONFIG, &scl); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); + + + memset(&scl, 0, sizeof(scl)); + scl.iData[0] = 1; + scl.iData[1] = 2; + scl.iData[6] = 3002502; + scl.iData[7] = (0|1|8|256|1024); + CWM_SettingControl(SCL_DML_DRV_HW_CONFIG, &scl); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; scl.iData[1] = 1; CWM_SettingControl(SCL_DML_DRV_INIT, &scl); - CWM_OS_dbgPrintf("DML device=%d\n", scl.iData[2]); memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; CWM_SettingControl(SCL_DML_GET_INITED_LIST, &scl); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); for (i = 0; i < scl.iData[2]; i ++) { @@ -160,17 +309,39 @@ int cywee_main_dml(void) { memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; scl.iData[1] = 1; - scl.iData[2] = 3; + scl.iData[2] = 1; CWM_SettingControl(SCL_DML_DRV_ENABLE, &scl); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; scl.iData[3] = 3; scl.iData[4] = 5; - CWM_SettingControl(SCL_LOG, &scl); + // CWM_SettingControl(SCL_LOG, &scl); + + + CWM_Sensor_Enable(IDX_REQUEST_SENSOR); + // //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); - CWM_Sensor_Enable(CUSTOM_ACC); - // CWM_Sensor_Enable(CUSTOM_GYRO); + CWM_Sensor_Enable(IDX_ALGO_INACTIVITY_OUTPUT); + + CWM_Sensor_Enable(IDX_ALGO_ACTIVITY_OUTPUT); + + CWM_Sensor_Enable(IDX_ACCEL); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); + // CWM_Sensor_Enable(IDX_GYRO); + 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_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); + + memset(&scl, 0, sizeof(scl)); + scl.iData[0] = 1; + scl.iData[1] = SPORT_ACTIVE_MODE_NORMAL; //ACTIVITY_MODE_NORMAL 1001 + CWM_SettingControl(SCL_SET_ACTIVITY_MODE, &scl); + // CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl); + //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__); return 0; } -- 2.17.1