#ifdef CONFIG_OTA_UPDATE_SUPPORT\r
#include "upg.h"\r
#endif\r
-#ifdef SUPPORT_AT_HX3509\r
-#include "hx3509_at_cmd.h"\r
+#ifdef SUPPORT_AT_HX3508\r
+#include "hx3508_at_cmd.h"\r
#endif\r
#ifdef SUPPORT_AT_LQBP002TA\r
#include "lqbp_at_cmd.h"\r
at_cmd_table_t *rtc_table = get_rtc_cmd_table(&rtc_cmd_count);\r
at_cmd_add_moudle(rtc_table, rtc_cmd_count);\r
#endif\r
-#ifdef SUPPORT_AT_HX3509\r
- uint32_t hx3509_cmd_count;\r
- at_cmd_table_t *hx3509_table = get_hx3509_cmd_table(&hx3509_cmd_count);\r
- at_cmd_add_moudle(hx3509_table, hx3509_cmd_count);\r
+#ifdef SUPPORT_AT_HX3508\r
+ uint32_t hx3508_cmd_count;\r
+ at_cmd_table_t *hx3508_table = get_hx3508_cmd_table(&hx3508_cmd_count);\r
+ at_cmd_add_moudle(hx3508_table, hx3508_cmd_count);\r
#endif\r
#ifdef SUPPORT_AT_LQBP002TA\r
uint32_t lqbp002ta_cmd_count;\r
uapi_bp_service_init();\r
#endif\r
\r
+#endif\r
+\r
+#ifdef ENABLE_CUSTOM_SPI\r
+ custom_spi_init(SPI_BUS_0);\r
#endif\r
\r
/*启动蓝牙ble服务,cywee有重置 mac地址的操作,会需要把 蓝牙服务开启放在cywee服务之后*/\r
/*
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-03-25 17:31:19
- * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-12-18 15:22:38
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-10 17:04:22
* @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/include/notify/findwatch_notification.h
*/
#ifndef FIND_WATCH_NOTIFICATION_H
int FindWatchRingPlayStop(void);
int FindWatchRingPlayStart(const char *path);
int FindWatchRingPlayerInit(const char *path);
- int FindWatchRingPlayerStat(void);
+ int FindWatchRingPlayerStat(bool isLooping = true);
bool GetFindWatchNotifyFlag(void);
void SetFindWatchNotifyFlag(bool flag);
void SetVibration(void);
/*
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-03-25 17:33:47
- * @LastEditors: SnickerSun snickersun@163.com
- * @LastEditTime: 2024-12-21 15:54:46
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-10 17:43:06
* @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/src/notify/findwatch_notification.cpp
* @details:实现查找手表的功能一般需要手表和智能手机之间的配合,通常是通过手机上的应用(App)或其他设备发送指令给手表,触发手表的查找功能。
* 以下是基本的实现步骤:
/*
* @brief 准备并播放铃声
+ * @brief isLooping 是否重复播放
*/
- int FindWatchViewEventListener::FindWatchRingPlayerStat(void)
+ int FindWatchViewEventListener::FindWatchRingPlayerStat(bool isLooping)
{
/* -------------------------------- 1.检查播放器实例 ------------------------------- */
int32_t ret;
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");
return OHOS_FAILURE;
}
- playerCtr->SetVolume(300, 300); // 将左声道和右声道音量都设置为50
+ // playerCtr->SetVolume(300, 300); // 将左声道和右声道音量都设置为50
playerCtr->SetAudioSessionId(sessionId);
// 播放
playerCtr->Play();
- playerCtr->EnableSingleLooping(true); // 设置是否循环播放
+ playerCtr->EnableSingleLooping(isLooping); // 设置是否循环播放
return OHOS_SUCCESS;
}
{
FindWatchRingPlayStop(); // 如果playerCtr上音频资源没被释放,先释放
FindWatchRingPlayerInit(((path == nullptr) ? RingMusicName : path));
- FindWatchRingPlayerStat();
+ FindWatchRingPlayerStat(((path == nullptr) ? true : false));
return OHOS_SUCCESS;
}
# 'ACC_LIS2DOC',
'ENABLE_CYWEE',
'ENABLE_CUSTOM_I2C',
+ #'ENABLE_CUSTOM_SPI',
'SUPPORT_AT_CYWEE',
'MAG_MMC5603',
'ENABLE_VIBRATOR',
'TEST_GPS_UI',
'NANDFLASH_F35UQA',
'PPG_VC921X',
- 'ROTARYENCODER_HX3509',
+ 'ROTARYENCODER_HX3508',
'FACTORYTEST_SERVICE',
# 'BLE_INSTRUCT'
#endif
#ifdef ROTARYENCODER_U8
- { S_AGPIO_L12, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_FALLING_EDGE, crown_int_callback},
- { S_AGPIO_L13, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_FALLING_EDGE, crown_int_callback},
+ { S_AGPIO_L12, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE, crown_int_callback},
+ // { S_AGPIO_L13, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE, crown_int_callback},
#endif
};
extern void bp_int_callback(pin_t pin, uintptr_t param);
#endif
+#ifdef PPG_GH3X2X
+extern void ppg_int_callback(pin_t pin, uintptr_t param);
+#endif
+
/**
* @addtogroup connectivity_config_boards
* @{
// #else
{ HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_R2 VIBR_PWM 马达控制脚 兼容预留马达驱动复位脚
// #endif
- { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE }, // S_AGPIO_R3 NC
+ { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_DISABLE }, // S_AGPIO_R3 NC
{ HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_DISABLE }, // S_AGPIO_R4 tp reset
{ HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_R5 touch int
- { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_R6 PRG_INT 心率中断
+ { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_R6 PRG_INT 心率中断
{ HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_R7 GYRO_INT2
#ifdef ENABLE_GYRO
{ HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_R8 GYRO_INT1
// { S_AGPIO_L32, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
#endif
#ifdef ENABLE_BN02
- { S_AGPIO_R3, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_FALLING_EDGE, bp_int_callback },
+ { S_AGPIO_R3, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE, bp_int_callback },
+#endif
+#ifdef PPG_GH3X2X
+ // { S_AGPIO_R6, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE, ppg_int_callback},
#endif
};
/**
\r
/* Clocks M_CLKEN1 region */\r
{HAL_CLOCKS_APP_TIMER_CLK, TURN_ON}, // timer clock\r
+#if defined(ENABLE_CUSTOM_SPI) \r
+ {HAL_CLOCKS_APP_SPI0_M_CLK, TURN_ON}, // spi0 clock\r
+#else\r
{HAL_CLOCKS_APP_SPI0_M_CLK, TURN_OFF}, // spi0 clock\r
+#endif\r
{HAL_CLOCKS_APP_SPI1_MS_CLK, TURN_OFF}, // spi1 clock\r
{HAL_CLOCKS_APP_SPI2_MS_CLK, TURN_OFF}, // spi2 clock\r
{HAL_CLOCKS_APP_UART_H0_CLK, TURN_ON}, // uart h0 clock\r
PM_ID_CAT1,//Cat1 communication
PM_ID_P_TEST,//产测
PM_ID_BUTTON_GPIO,//gpio按键
+ PM_ID_BP,//血压
PM_ID_MAX,
} pm_id_t;
}
#endif
void pm_sikey_suspend(void) {
- //ÐÄÂÊ£¬Âí´ï£¬¼ÓËÙ¼ÆÍâÉèµÄI2CͨµÀ¼Ä´æÆ÷±£´æ£¬¹ØÖжÏ
+ //���ʣ�������ټ������I2Cͨ���Ĵ������棬���ж�
custom_i2c_suspend();
+#ifdef ENABLE_CUSTOM_SPI
+ custom_spi_suspend();
+#endif
//ADD alipay I2C3 suspend,
alipay_suspend();
}
void pm_sikey_resume(void){
- //ÐÄÂÊ£¬Âí´ï£¬¼ÓËÙ¼ÆÍâÉèµÄI2CͨµÀ¼Ä´æÆ÷µÄ»Ö¸´£¬¹ØÖжϣ¬ÖØÐÂÅäÖÃpinmux£¬ÖØÐ³õʼ»¯¡£
+ //���ʣ�������ټ������I2Cͨ���Ĵ����Ļָ������жϣ���������pinmux�����³�ʼ����
custom_i2c_resume();
+
+#ifdef ENABLE_CUSTOM_SPI
+ custom_spi_resume();
+#endif
+
alipay_resume();
}
void pm_core_suspend(void)
{
//.......................................................
- pm_sikey_suspend(); //ÆäËûÍâÉè¼ÓÔÚÕâÀï
+ pm_sikey_suspend(); //���������������
//.......................................................
#if (ARCH == RISCV70)
clic_suspend();
pm_misc_regs_resume();
pm_core_restore_reset_pc();
//.......................................................
- pm_sikey_resume(); //ÆäËûÍâÉè¼ÓÔÚÕâÀï
+ pm_sikey_resume(); //���������������
//.......................................................
}
* @Author: penglei 1624952103@qq.com
* @Date: 2024-06-07 11:18:25
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-07-24 11:56:54
+ * @LastEditTime: 2025-02-14 14:40:50
* @FilePath: /FD230/code/sdk/application/wearable/fd230/nativeapp/nativeui/producttest/include/testmicrophoneC.h
* @Description:
*
#endif
#endif
int32_t microhone_switch(bool isopen);
- void check_spk(bool isopen);
+ void check_spk(uint8_t isopen);
void check_mic(bool isopen);
#ifdef __cplusplus
#if __cplusplus
{
for(int j=0;j<4;j++)
{
- if(x>116*j && x<116*(j+1) && y >116*i && y<116*(i+1))
+ if(x>Screen::GetInstance().GetWidth()/4*j && x<Screen::GetInstance().GetWidth()/4*(j+1) && y >Screen::GetInstance().GetHeight()/4*i && y<Screen::GetInstance().GetHeight()/4*(i+1))
{
button[i*4+j]->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
RootView::GetInstance()->Invalidate();
testTPScrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
//testTPScrollView->SetStyle(STYLE_BORDER_RADIUS, 0);
testTPScrollView->SetViewId("TP_test");
- testTPScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+ testTPScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
testTPScrollView->SetStyle(STYLE_BORDER_COLOR, Color::Black().full);
ButtonConfig_ext_t buttonconfig;
buttonconfig.x = 0;
buttonconfig.y = 0;
- buttonconfig.w = 116;
- buttonconfig.h = 116;
+ buttonconfig.w = Screen::GetInstance().GetWidth()/4;
+ buttonconfig.h =Screen::GetInstance().GetHeight()/4;
for (int i = 0; i < 4; i++)
{
for(int j=0;j<4;j++)
{
buttonconfig.ViewId = viewid_str[i*4+j];
- buttonconfig.x=116*j;
+ buttonconfig.x=Screen::GetInstance().GetWidth()/4*j;
button[i*4+j] = SetTheButton_ext(buttonconfig, touchListener);
testTPScrollView->Add(button[i*4+j]);
}
- buttonconfig.y+=116;
+ buttonconfig.y+=Screen::GetInstance().GetHeight()/4;
}
}
}
- void check_spk(bool isopen)
+ void check_spk(uint8_t isopen)
{
- if(isopen)
+ if(isopen == 1)
{
// AlarmClockModel::GetInstance()->testPlayerStart("/user/userdata/microphone.mp3");
+ // FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/userdata/microphone.mp3");
+ // AlarmClockModel::GetInstance()->AlarmPlayerStart();
+#if defined(BOARD_FD230) || defined(BOARD_U8)
+ FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/userdata/microphone.mp3");
+#else
// FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/userdata/microphone.mp3");
AlarmClockModel::GetInstance()->AlarmPlayerStart();
+#endif
+
}
- else
+ else if(isopen == 2)
+ {
+#if defined(BOARD_FD230) || defined(BOARD_U8)
+ FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/music/20-20KHZ.mp3");
+#endif
+ }
+ else if(!isopen)
{
// AlarmClockModel::GetInstance()->AlarmPlayerStop();
- // FindWatchViewEventListener::GetInstance().PopInterCancelMusic();
+#if defined(BOARD_FD230) || defined(BOARD_U8)
+ FindWatchViewEventListener::GetInstance().PopInterCancelMusic();
+#else
AlarmClockModel::GetInstance()->AlarmPlayerStop();
+#endif
+ // AlarmClockModel::GetInstance()->AlarmPlayerStop();
}
}
${CMAKE_CURRENT_SOURCE_DIR}/bn02/bn02.c
${CMAKE_CURRENT_SOURCE_DIR}/service/bp_at_cmd.c
${CMAKE_CURRENT_SOURCE_DIR}/service/bp_service.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_ble_service.c
)
set(PUBLIC_HEADER
* @Author: penglei 1624952103@qq.com\r
* @Date: 2025-01-16 12:35:15\r
* @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-17 14:35:00\r
+ * @LastEditTime: 2025-02-14 11:37:22\r
* @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c\r
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
*/\r
#include "pinctrl_porting.h"\r
#include "hal_gpio.h"\r
#include "i2c.h"\r
+#include "pm_definition.h"\r
+#include "bp_ble_service.h"\r
\r
#define BN02_I2C_ADDR 0x05\r
#define BN02_I2C_BUS I2C_BUS_0\r
\r
bool Bn02_write_reg(uint8_t data)\r
{\r
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ if (cnt == 0) \r
+ {\r
+ uapi_pm_add_sleep_veto(PM_ID_BP);\r
+ }\r
+\r
i2c_data_t i2c_data;\r
i2c_data.send_buf = &data;\r
i2c_data.send_len = sizeof(data);\r
if (ret != ERRCODE_SUCC)\r
printf("i2c Write data write fail! ret=0x%x\n", ret);\r
\r
+ cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ if (cnt == 1) \r
+ {\r
+ uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+ }\r
+\r
return 1;\r
}\r
\r
bool Bn02_reads(uint8_t *data,int len)\r
{\r
+\r
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ if (cnt == 0) \r
+ {\r
+ uapi_pm_add_sleep_veto(PM_ID_BP);\r
+ }\r
+\r
i2c_data_t i2c_data;\r
i2c_data.send_buf = NULL;\r
i2c_data.send_len = 0;\r
if (ret != ERRCODE_SUCC) \r
printf("i2c read data fail! ret=0x%x\n", ret);\r
\r
+ cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+ if (cnt == 1) \r
+ {\r
+ uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+ }\r
+\r
return 1;\r
}\r
\r
}\r
}\r
\r
+void bn02_int_init(void)\r
+{\r
+ uapi_pin_set_ie(P_INT,HAL_PIO_IE_ENBALE);\r
+}\r
+\r
+void bn02_int_deinit(void)\r
+{\r
+ uapi_pin_set_ie(P_INT,HAL_PIO_IE_DISABLE);\r
+}\r
+\r
void bn02_int_handle(void)\r
{\r
uint8_t bn02_buf[48] = {0};\r
int i;\r
memset(bn02_buf,0,sizeof(bn02_buf));\r
Bn02_reads(bn02_buf,48);\r
- for(i = 0;i<48;i++)\r
+\r
+ if(bn02_get_ble_status())\r
+ {\r
+ bn02_replymsg(bn02_buf,sizeof(bn02_buf),1);\r
+ }\r
+\r
+\r
+ for(i = 0;i<48;i++)\r
{\r
printf("[%d]= 0x%x\n",i,bn02_buf[i]);\r
}\r
void bn02_start(void)\r
{\r
Bn02_Power_Ctrl(1);\r
+ bn02_int_init();\r
Bn02_write_reg(BN02_START_CMD);\r
}\r
\r
void bn02_stop(void)\r
{\r
+ bn02_int_deinit();\r
Bn02_write_reg(BN02_STOP_CMD);\r
Bn02_Power_Ctrl(0);\r
}\r
-\r
-\r
--- /dev/null
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-02-14 10:30:21
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-14 14:43:09
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+#include "stdint.h"
+#include "bn02.h"
+#include "custom_utils.h"
+#include "bp_service.h"
+#include "bp_ble_service.h"
+
+#define START_CODE 0x55
+#define PPG_DATA_SIZE 3
+#define PACKET_DATA_LENGTH (PPG_DATA_SIZE * 16)
+
+static uint8_t ble_status = 0;
+
+typedef struct ble_bp_data_t
+{
+ uint8_t start_code; //0x55
+ uint8_t main_func_code; //主功能码
+ uint8_t sub_func_code; //从功能码;
+ uint16_t data_length; //标识和数据的长度之和
+ uint16_t flags; //标识
+ uint8_t* data;
+ uint8_t checksum; //验内容包括起始符、功能码、数据长度、标识、数据5个部分,取其和的最后8位作为校验和
+}ble_bp_data_t;
+
+
+static ble_bp_data_t ble_bp_data = {0};
+
+uint8_t bn02_get_ble_status(void)
+{
+ uint8_t status = ble_status;
+ return status;
+}
+
+uint8_t bn02_calculate_checksum(ble_bp_data_t frame)
+{
+ uint8_t checksum = 0;
+ checksum += frame.start_code;
+ checksum += frame.main_func_code;
+ checksum += frame.sub_func_code;
+ checksum += (frame.data_length >> 8) & 0xFF; // 数据长度高字节
+ checksum += frame.data_length & 0xFF; // 数据长度低字节
+ checksum += (frame.flags >> 8) & 0xFF; // 标识高字节
+ checksum += frame.flags & 0xFF; // 标识低字节
+
+ for (uint16_t i = 0; i < frame.data_length - 2; i++) { // 数据长度包含标识
+ checksum += frame.data[i];
+ }
+ return checksum;
+}
+
+errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
+{
+ if(buf != NULL && event_size>=(1+2+2+2+1+1))
+ {
+ memset_s(ble_bp_data,0,sizeof(ble_bp_data),0);
+
+ ble_bp_data.start_code = buf[0];
+ ble_bp_data.main_func_code = buf[1];
+ ble_bp_data.sub_func_code = buf[2];
+ ble_bp_data.data_length = (buf[3] << 8) + buf[4];
+ ble_bp_data.flags = (buf[5] << 8) + buf[6];
+ ble_bp_data.data = &buf[7];
+
+ if(buf[8] != bn02_calculate_checksum(ble_bp_data))
+ return ERRCODE_FAIL;
+
+ if(!(*ble_bp_data.data))
+ {
+ do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
+ ble_status = 1;
+ }
+
+ else
+ {
+ do_bp_service_check_msg(BP_SERVICE_CMD_STOP_CHECK);
+ ble_status = 0;
+ }
+
+
+ }
+ else
+ {
+ printf("buf is null or event_size < (1+2+2+2+1+1) \n");
+ return ERRCODE_FAIL;
+ }
+ return ERRCODE_SUCC;
+}
+
+errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags)
+{
+ errcode_t ret;
+ ble_bp_data.sub_func_code += 0x80;
+ ble_bp_data.data = input_data;
+ ble_bp_data.data_length = input_len + 2;
+
+ if(ble_bp_data.flags < (1 << 14))
+ ble_bp_data.flags++;
+
+ if(flags)
+ {
+ ble_bp_data.flags |= (1 << 15);
+ }
+
+ ble_bp_data.checksum = bn02_calculate_checksum(ble_bp_data);
+
+ ret = ble_factorytest_server_send_input_report((uint8_t *)&ble_bp_data,sizeof(ble_bp_data));
+
+ return ret;
+}
--- /dev/null
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-02-14 10:30:32
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-14 11:35:06
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+#ifndef _BP_BLE_SERVICE_H_
+#define _BP_BLE_SERVICE_H_
+
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#include "stdint.h"
+#include "errcode.h"
+
+errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags);
+errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size);
+uint8_t bn02_get_ble_status(void);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
\ No newline at end of file
#define GH3020_ID (0x00)\r
#define GH3026_ID (0x01)\r
\r
+#define GH3220_ID (0x03)\r
+\r
#define GH3X2X_MP_DISABLE (0)\r
#define GH3X2X_MP_ENABLE (1)\r
\r
* @Author: penglei 1624952103@qq.com\r
* @Date: 2025-01-13 10:11:20\r
* @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-17 15:57:59\r
+ * @LastEditTime: 2025-02-17 11:32:58\r
* @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h\r
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
*/\r
#include "gh3x2x_afe_drv.h"\r
\r
\r
-#define GH3X2X_CHIP_ID GH3020_ID\r
+#define GH3X2X_CHIP_ID GH3220_ID\r
#define GH3X2X_AFE_MP_MODE GH3X2X_MP_ENABLE\r
\r
\r
/****** chip reset type config ***************************/\r
#define GH3X2X_AFE_RESET_TYPE GH3X2X_AFE_RESET_SOFTWARE\r
\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
+void hal_gh3x2x_afe_int_init(void);\r
+void hal_gh3x2x_afe_int_deinit(void);\r
\r
#endif\r
\r
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-01-13 11:45:20\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-02-12 10:50:38\r
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
#include "gh3x2x_afe_ecg.h"\r
#include "gh3x2x_afe_adt.h"\r
#include "gh3x2x_afe_agc.h"\r
\r
void GH3X2X_AFE_StartFunction(GU32 unFuncMode)\r
{\r
+ //红外佩戴检测\r
if(unFuncMode & (GH3X2X_FUNCTION_ADT))\r
{\r
- GH3x2xAdtAlgoInit();\r
+ GH3x2xAdtAlgoInit();\r
GH3X2X_AFE_WriteRegBitField(GH3X2X_AFE_REG_SLOT_EN_ADDR,GH3X2X_ADT_SLOT_NUM,GH3X2X_ADT_SLOT_NUM,1);\r
}\r
\r
+ //心电图\r
if(unFuncMode & (GH3X2X_FUNCTION_ECG))\r
{\r
GH3X2X_LeadOffDetectInit(); \r
if(unFuncMode & (GH3X2X_FUNCTION_ADT))\r
{\r
GH3X2X_AFE_WriteRegBitField(GH3X2X_AFE_REG_SLOT_EN_ADDR,GH3X2X_ADT_SLOT_NUM,GH3X2X_ADT_SLOT_NUM,0);\r
- GH3x2xAdtAlgoDeinit();\r
+ GH3x2xAdtAlgoDeinit();\r
}\r
if(unFuncMode & (GH3X2X_FUNCTION_ECG))\r
{\r
uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(GH3X2X_AFE_I2C_CMD_ADDR);\r
uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(GH3X2X_AFE_I2C_CMD_ADDR);\r
uchBuffArr[2] = uchCmd;\r
- hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 3);\r
- // custom_i2c_write_reg(GH3X2X_AFE_I2C_DEVICE_ADDR, GH3X2X_AFE_I2C_CMD_ADDR, 1 , &uchCmd, 1, GH3X2X_I2C_BUS);\r
+ hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 3);\r
}\r
\r
/**\r
uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
uchBuffArr[2] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegValue);\r
uchBuffArr[3] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegValue);\r
- hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 4);\r
- // custom_i2c_write_reg(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr, 1 , &usRegValue, szieof(usRegValue), GH3X2X_I2C_BUS);\r
+ hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 4);\r
}\r
\r
\r
\r
uchCmdBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr);\r
uchCmdBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
- hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchCmdBuffArr, 2, uchReadBuffArr, 2);\r
-\r
- // custom_i2c_read_regs(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr, 1 , uchReadBuffArr, sizeof(uchReadBuffArr), GH3X2X_I2C_BUS);\r
+ hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchCmdBuffArr, 2, uchReadBuffArr, 2);\r
\r
return GH3X2X_AFE_MAKEUP_WORD(uchReadBuffArr[0], uchReadBuffArr[1]);\r
}\r
{\r
GU8 uchBuffArr[2] = {0};\r
\r
- // uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr);\r
- // uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
-\r
- custom_i2c_read_regs(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr,1, pusRegValueArr, uchLen ,GH3X2X_I2C_BUS);\r
+ uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr);\r
+ uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
\r
- // hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 2, \\r
- // (GU8 *)pusRegValueArr, uchLen * 2);\r
+ hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 2, \\r
+ (GU8 *)pusRegValueArr, uchLen * 2);\r
GH3X2X_SwapLittleBigEndianData((GU8 *)pusRegValueArr, (GU16)uchLen * 2);\r
}\r
\r
\r
uchCmdBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(GH3X2X_AFE_FIFO_REG_ADDR);\r
uchCmdBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(GH3X2X_AFE_FIFO_REG_ADDR);\r
- hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchCmdBuffArr, 2, puchDataBuffer, usLen);\r
+ hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchCmdBuffArr, 2, puchDataBuffer, usLen);\r
}\r
\r
#endif\r
}\r
else\r
{\r
- GH3X2X_INFO_LOG("[%s]ready code reg is error !!! \r\n", __FUNCTION__);\r
+ GH3X2X_INFO_LOG("[%s]ready code reg is error !!! 0x%x\r\n", __FUNCTION__,GH3X2X_AFE_READ_REG(GH3X2X_AFE_REG_CHIP_READY_CODE_REG_ADDR));\r
while(1);\r
}\r
\r
GS8 chipd_id = GH3X2X_AFE_GetChipId();\r
if(GH3X2X_CHIP_ID != chipd_id)\r
{\r
- GH3X2X_INFO_LOG("wrong chip id!!\r\n");\r
+ GH3X2X_INFO_LOG("wrong chip id!! 0x%x\r\n",chipd_id);\r
chRet = GH3X2X_AFE_RET_GENERIC_ERROR;\r
}\r
else\r
#include "gh3x2x_demo_goodix_PLATFORM.h"\r
#else\r
\r
+\r
#include "spi.h"\r
\r
+#include "custom_utils.h"\r
+\r
#define GOODIX_PLATFORM_SPI_WRITE_ENTITY(write_buffer, length)\r
#define GOODIX_PLATFORM_SPI_READ_ENTITY()\r
#define GOODIX_PLATFORM_SPI_CS_CTRL_ENTITY()\r
#define GH3X2X_MOSI S_MGPIO1\r
#define GH3X2X_MISO S_MGPIO0\r
\r
+#define H_INT S_AGPIO_R6\r
+\r
#define GH3X2X_SPI_BUS SPI_BUS_0\r
#define GH3X2X_I2C_BUS I2C_BUS_2\r
\r
*/\r
GU8 hal_gh3x2x_afe_i2c_write(GU8 device_id, const GU8 write_buffer[], GU16 length)\r
{\r
- uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
- if (cnt == 0) \r
- {\r
- uapi_pm_add_sleep_veto(PM_ID_HEART);\r
- }\r
- uint8_t ret = 1;\r
-\r
- /* code implement by user */\r
-\r
- // GOODIX_PLATFORM_I2C_WRITE_ENTITY(device_id, write_buffer,length);\r
- i2c_data_t i2c_data;\r
- i2c_data.send_buf = write_buffer;\r
- i2c_data.send_len = length;\r
- i2c_data.receive_buf = NULL;\r
- i2c_data.receive_len = 0;\r
- // custom_i2c_write_reg(BN02_I2C_ADDR, 0x00, 1, &data, 1, BN02_I2C_BUS);\r
- errcode_t result = uapi_i2c_master_write(GH3X2X_I2C_BUS, device_id, &i2c_data);\r
- if (result != ERRCODE_SUCC) \r
- printf("i2c write data fail! ret=0x%x\n", result);\r
- // custom_i2c_read_regs(device_id, reg_addr, 1 , pBuffer, buf_size, VC9202_I2C_BUS);\r
-\r
- cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
- if (cnt == 1) \r
- {\r
- uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
- }\r
-\r
-\r
- return ret;\r
+ // custom_i2c_transfer(0x14,write_buffer, length, NULL, 0, GH3X2X_I2C_BUS);\r
+ custom_i2c_write_reg(0x14, 0, 0, write_buffer, length, GH3X2X_I2C_BUS);\r
+ return 1;\r
}\r
\r
/**\r
*/\r
GU8 hal_gh3x2x_afe_i2c_read(GU8 device_id, const GU8 write_buffer[], GU16 write_length, GU8 read_buffer[], GU16 read_length)\r
{\r
- uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
- if (cnt == 0) \r
- {\r
- uapi_pm_add_sleep_veto(PM_ID_HEART);\r
- }\r
- uint8_t ret = 1;\r
-\r
- /* code implement by user */\r
-\r
- // GOODIX_PLATFORM_I2C_READ_ENTITY(device_id, write_buffer, write_length, read_buffer, read_length);\r
-\r
- i2c_data_t i2c_data;\r
- i2c_data.send_buf = write_buffer;\r
- i2c_data.send_len = write_length;\r
- i2c_data.receive_buf = read_buffer;\r
- i2c_data.receive_len = read_length;\r
-\r
- errcode_t result = uapi_i2c_master_writeread(GH3X2X_I2C_BUS, device_id, &i2c_data);\r
- if (result != ERRCODE_SUCC) \r
- printf("i2c read data fail! ret=0x%x\n", result);\r
- // custom_i2c_read_regs(device_id, reg_addr, 1 , pBuffer, buf_size, VC9202_I2C_BUS);\r
-\r
- cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
- if (cnt == 1) \r
- {\r
- uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
- }\r
-\r
- return ret;\r
+ custom_i2c_transfer(0x14,write_buffer, write_length, read_buffer, read_length, GH3X2X_I2C_BUS);\r
+ return 1;\r
}\r
\r
#else \r
void hal_gh3x2x_afe_spi_init(void)\r
{\r
/* init spi and cs pin */\r
- // GOODIX_PLATFORM_SPI_INIT_ENTITY();\r
- spi_bus_t bus;\r
- spi_attr_t attr;\r
- bus = SPI_BUS_0;\r
- attr.is_slave = false;\r
- attr.slave_num = 1;\r
- attr.bus_clk = 40000000;\r
- attr.freq_mhz = 10;\r
- attr.clk_polarity = (uint32_t)SPI_CFG_CLK_CPOL_1;\r
- attr.clk_phase = (uint32_t)SPI_CFG_CLK_CPHA_1;\r
- attr.frame_format = SPI_CFG_FRAME_FORMAT_MOTOROLA_SPI;\r
- attr.spi_frame_format = (uint32_t)HAL_SPI_FRAME_FORMAT_STANDARD;\r
- attr.frame_size = (uint32_t)HAL_SPI_FRAME_SIZE_8;\r
- attr.tmod = HAL_SPI_TRANS_MODE_TXRX;\r
- attr.sste = SPI_CFG_SSTE_DISABLE;\r
- attr.ndf = 1;\r
-\r
- uapi_spi_init(bus,&attr,NULL);\r
+ GOODIX_PLATFORM_SPI_INIT_ENTITY();\r
}\r
\r
/**\r
*/\r
GU8 hal_gh3x2x_afe_spi_write(GU8 write_buffer[], GU16 length)\r
{\r
- GU8 ret = 1;\r
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+ if (cnt == 0) \r
+ {\r
+ uapi_pm_add_sleep_veto(PM_ID_HEART);\r
+ }\r
+\r
+ errcode_t ret;\r
\r
- \r
// GOODIX_PLATFORM_SPI_WRITE_ENTITY(write_buffer, length);\r
spi_xfer_data_t sdata ={0} ;\r
sdata.tx_buff = write_buffer;\r
sdata.rx_buff = NULL;\r
sdata.rx_bytes = 0;\r
\r
- ret = uapi_spi_master_write(GH3X2X_SPI_BUS, &sdata, 0x100);\r
+ ret = uapi_spi_master_write(GH3X2X_SPI_BUS, &sdata, 0XFF);\r
+ if (ret != ERRCODE_SUCC) \r
+ printf("spi write data fail! ret=0x%x\n", ret);\r
\r
+ cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+ if (cnt == 1) \r
+ {\r
+ uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
+ }\r
\r
- return ret;\r
+ return 1;\r
}\r
\r
\r
*/\r
GU8 hal_gh3x2x_afe_spi_read(GU8 read_buffer[], GU16 length)\r
{\r
- GU8 ret = 1;\r
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+ if (cnt == 0) \r
+ {\r
+ uapi_pm_add_sleep_veto(PM_ID_HEART);\r
+ }\r
+\r
+ errcode_t ret;\r
// GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
// GH3X2X_AFE_UNUSED_VAR(length);\r
// GOODIX_PLATFORM_SPI_READ_ENTITY();\r
sdata.rx_buff = read_buffer;\r
sdata.rx_bytes = length;\r
\r
- ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0x100);\r
+ ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0XFF);\r
+\r
+ cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+ if (cnt == 1) \r
+ {\r
+ uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
+ }\r
\r
- return ret;\r
+ return 1;\r
}\r
#elif (GH3X2X_AFE_SPI_TYPE == GH3X2X_AFE_SPI_HARDWEAR_CS)\r
/**\r
*/\r
GU8 hal_gh3x2x_afe_spi_write_F1_and_read(GU8 read_buffer[], GU16 length)\r
{\r
- GU8 ret = 1;\r
- GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
- GH3X2X_AFE_UNUSED_VAR(length);\r
- GOODIX_PLATFORM_SPI_READ_ENTITY();\r
+ // GU8 ret = 1;\r
+ // GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
+ // GH3X2X_AFE_UNUSED_VAR(length);\r
+ // GOODIX_PLATFORM_SPI_READ_ENTITY();\r
\r
- return ret;\r
+ // return ret;\r
+\r
+ errcode_t ret = 1;\r
+ // GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
+ // GH3X2X_AFE_UNUSED_VAR(length);\r
+ // GOODIX_PLATFORM_SPI_READ_ENTITY();\r
+\r
+ spi_xfer_data_t sdata ={0} ;\r
+ sdata.tx_buff = NULL;\r
+ sdata.tx_bytes = 0;\r
+ sdata.rx_buff = read_buffer;\r
+ sdata.rx_bytes = length;\r
+\r
+ ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0XFF);\r
+ if (ret != ERRCODE_SUCC) \r
+ printf("spi read data fail! ret=0x%x\n", ret);\r
+ return 1;\r
}\r
#endif\r
\r
// GH3X2X_AFE_UNUSED_VAR(cs_pin_level);\r
// GOODIX_PLATFORM_SPI_CS_CTRL_ENTITY();\r
\r
- uapi_pin_set_mode(GH3X2X_CS, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+ uapi_pin_set_mode(GH3X2X_CS, (pin_mode_t)HAL_PIO_FUNC_SPI0);\r
uapi_gpio_set_dir(GH3X2X_CS, GPIO_DIRECTION_OUTPUT);\r
uapi_gpio_set_val(GH3X2X_CS, cs_pin_level);\r
\r
\r
void hal_gh3x2x_afe_int_init(void)\r
{\r
- GOODIX_PLATFORM_INT_INIT_ENTITY();\r
+ // GOODIX_PLATFORM_INT_INIT_ENTITY();\r
+ uapi_pin_set_ie(H_INT,HAL_PIO_IE_ENBALE);\r
+}\r
+\r
+void hal_gh3x2x_afe_int_deinit(void)\r
+{\r
+ // GOODIX_PLATFORM_INT_INIT_ENTITY();\r
+ uapi_pin_set_ie(H_INT,HAL_PIO_IE_DISABLE);\r
}\r
\r
#if (GH3X2X_AFE_PRO_BY_INT == GH3X2X_AFE_PRO_TYPE)\r
GH3X2X_AFE_SetNeedWakeUpGh3x2xFlag(0); //not need wake up gh3x2x_afe when process int event\r
g_uchGh3x2xAfeIntCallBackIsCalled = 1;\r
#if GH3X2X_AFE_MP_MODE\r
- GH3X2X_MP_SET_INT_FLAG(); //gh3x2x mp test must call it\r
+ // GH3X2X_MP_SET_INT_FLAG(); //gh3x2x mp test must call it\r
#endif\r
/****************** DO NOT MODITY ****************************************************************/\r
\r
* @Author: penglei 1624952103@qq.com
* @Date: 2024-03-13 15:08:38
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-17 17:57:09
+ * @LastEditTime: 2025-02-18 14:35:27
* @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c
* @Description:
*
#include "pm_control.h"
#include "pinctrl_porting.h"
#include "hal_gpio.h"
+#include "gh3x2x_afe_user.h"
+#include "gh3x2x_afe_demo.h"
// S_AGPIO_L26 心率复位 PPG reset
#define GPIO_PIN_PRG_RESET S_AGPIO_L26
uint32_t tyhx_poweron(void)
{
-
+ uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO);
+ uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT);
+ uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_HIGH);
+ LOS_Mdelay(10);
uapi_pin_set_mode(S_AGPIO_L24, (pin_mode_t)HAL_PIO_FUNC_GPIO);
uapi_gpio_set_dir(S_AGPIO_L24, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(S_AGPIO_L24, GPIO_LEVEL_LOW);
- LOS_Mdelay(1);
+ LOS_Mdelay(10);
uapi_pin_set_mode(S_MGPIO0, (pin_mode_t)HAL_PIO_FUNC_GPIO);
uapi_gpio_set_dir(S_MGPIO0, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(S_MGPIO0, GPIO_LEVEL_LOW);
- LOS_Mdelay(1);
- uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO);
- uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT);
- uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_HIGH);
- LOS_Mdelay(1);
+ LOS_Mdelay(10);
uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO);
uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_HIGH);
-
- LOS_Mdelay(50);
+ LOS_Mdelay(10);
return 0;
}
uint32_t tyhx_poweroff(void)
{
+ hal_gh3x2x_afe_int_deinit();
+
uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO);
uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_LOW);
uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO);
uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_LOW);
- LOS_Mdelay(50);
+ LOS_Mdelay(10);
return 0;
}
void ppg_send_cmd_to_gh3x2x_driver(char* mode, uint8_t enable)
{
- // work_mode md = 1;
- // if (strcmp(mode, "hrs") == 0) {
- // md = WORK_MODE_HR;
- // } else if (strcmp(mode, "hrv") == 0) {
- // md = WORK_MODE_HRV;
- // } else if (strcmp(mode, "spo2") == 0) {
- // md = WORK_MODE_SPO2;
- // } else if (strcmp(mode, "leaklight") == 0) {
- // md = WORK_MODE_UNDEFINED;
- // } else if (strcmp(mode, "graycard") == 0) {
- // md = WORK_MODE_UNDEFINED;
- // } else if (strcmp(mode, "ledoff") == 0) {
- // md = WORK_MODE_UNDEFINED;
- // } else if (strcmp(mode, "wear") == 0) {
- // md = WORK_MODE_WEAR;
- // } else if (strcmp(mode, "single") == 0) {
- // md = WORK_MODE_UNDEFINED;
- // }else if (strcmp(mode, "factory") == 0) {
- // md = WORK_MODE_UNDEFINED;
- // }else if (strcmp(mode, "fpc") == 0) {
- // md = WORK_MODE_UNDEFINED;
- // }else if (strcmp(mode, "int") == 0) {
- // if(vc921x_device)
- // vc921x_device->ops->dev_irq_handler(0,0);
- // return;
- // }
- // if (enable == 1)
- // {
- // // ppg_service_running_stat = true;
- // uapi_pm_control(PM_APP_WAKE_NEEDED);
- // tyhx_poweron();
+ uint32_t md = 1;
+ if (strcmp(mode, "hrs") == 0) {
+ md = 0;
+ } else if (strcmp(mode, "hrv") == 0) {
+ md = 1;
+ } else if (strcmp(mode, "spo2") == 0) {
+ md = 2;
+ } else if (strcmp(mode, "leaklight") == 0) {
+ md = 4;
+ } else if (strcmp(mode, "graycard") == 0) {
+ md = 8;
+ } else if (strcmp(mode, "ledoff") == 0) {
+ md = 16;
+ } else if (strcmp(mode, "wear") == 0) {
+ md = 32;
+ } else if (strcmp(mode, "single") == 0) {
+ md = 64;
+ }else if (strcmp(mode, "factory") == 0) {
+ md = 128;
+ }else if (strcmp(mode, "fpc") == 0) {
+ // md = WORK_MODE_UNDEFINED;
+ }else if (strcmp(mode, "int") == 0) {
+ }
- // vc921x_device = get_vc921x_device();
- // if(!vc921x_device)
- // {
- // printf("get_vc921x_device failed !!!\n");
- // tyhx_poweroff();
- // return;
- // }
- // InitParamTypeDef pInit_Param = {0};
- // pInit_Param.sampling_gap_time = 400;
- // pInit_Param.work_mode = md;
- // vc921x_device->ops->dev_init(&pInit_Param);
+ if (enable == 1)
+ {
+ // ppg_service_running_stat = true;
+ uapi_pm_control(PM_APP_WAKE_NEEDED);
+ tyhx_poweron();
+ // GH3X2X_AFE_StartFunction(mode);
+ GH3X2X_AFE_Init();
+ GH3X2X_AFE_StartSampling(1);
- // } else {
+ } else {
- // uapi_pm_control(PM_APP_WAKE_NONEED);
- // vc921x_device->ops->stop_work();
- // tyhx_poweroff();
- // }
+ uapi_pm_control(PM_APP_WAKE_NONEED);
+ GH3X2X_AFE_StopSampling();
+ tyhx_poweroff();
+ }
}
\ No newline at end of file
cmd = "int";
enable = 1;
ppg_send_cmd_to_vc921x_driver(cmd,enable);
+#elif defined PPG_GH3X2X
+ hal_gh3x2x_afe_int_handler_call_back();
+ GH3X2X_AFE_ChipPro();
#endif
continue;
}
ppg_send_cmd_to_vc9202_driver(cmd,enable);
#elif defined(PPG_VC921X)
ppg_send_cmd_to_vc921x_driver(cmd,enable);
+#elif defined(PPG_GH3X2X)
+ ppg_send_cmd_to_gh3x2x_driver(cmd,enable);
#endif
if(enable == 1)
SUPPORT_AT_HX3507
)
-elseif("ROTARYENCODER_HX3509" IN_LIST DEFINES)
+elseif("ROTARYENCODER_HX3508" IN_LIST DEFINES)
set(SOURCES
- ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/tyhx_OTS_hx3509_custom.c
- ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/hx3509_hal.c
- ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/hx3509_at_cmd.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/hx3508/tyhx_OTS_hx3508_custom.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/hx3508/hx3508_hal.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/hx3508/hx3508_at_cmd.c
)
set(PUBLIC_HEADER
- ${CMAKE_CURRENT_SOURCE_DIR}/hx3509
+ ${CMAKE_CURRENT_SOURCE_DIR}/hx3508
)
set(PUBLIC_DEFINES
-SUPPORT_AT_HX3509
+SUPPORT_AT_HX3508
)
elseif("ROTARYENCODER_U8" IN_LIST DEFINES)
* @Author: penglei 1624952103@qq.com
* @Date: 2024-12-31 10:20:16
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-10 11:48:37
+ * @LastEditTime: 2025-02-18 17:52:31
* @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
{
uapi_gpio_clear_interrupt(pin);
- if(pin == PIN_TYHX_SDIO)
+ if (pin == PIN_TYHX_SDIO)
{
- if (uapi_gpio_get_val(PIN_TYHX_SCLK))
- {
- direction = 2; // 顺时针旋转
- crown_diff--;
- }
- }
- else if (pin == PIN_TYHX_SCLK)
- {
- if (uapi_gpio_get_val(PIN_TYHX_SDIO))
- {
+ gpio_level_t pin_sclk_state = uapi_gpio_get_val(PIN_TYHX_SCLK);
+ gpio_level_t pin_sdio_state = uapi_gpio_get_val(PIN_TYHX_SDIO);
+
+ if (pin_sclk_state == pin_sdio_state) {
direction = 1; // 逆时针旋转
crown_diff++;
+ } else {
+
+ direction = 2; // 顺时针旋转
+ crown_diff--;
}
}
- // PRINT("pin : %d , direction : %d , crown_diff : %d \n",pin,direction,crown_diff);
-
}
int16_t crown_get_stand_still(void)
{
uapi_pin_set_ie(PIN_TYHX_SDIO,HAL_PIO_IE_ENBALE);
uapi_pin_set_ie(PIN_TYHX_SCLK,HAL_PIO_IE_ENBALE);
- // app_timer_start(g_hx3509_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
+ // app_timer_start(g_hx3508_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
osTimerStart(g_crown_timer,50);
crown_timer_running = true;
}
else
{
stand_still = 0;
- crown_result = crown_diff * 30;
+ crown_result = crown_diff * 20;
crown_diff = 0;
// PRINT("crown_result : %d direction : %d\n",crown_result,direction);
if (g_encoder_callback != NULL)
* @Author: penglei 1624952103@qq.com
* @Date: 2024-12-18 10:23:22
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-02 16:20:33
- * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3509/hx3509_at_cmd.c
+ * @LastEditTime: 2025-02-05 09:23:52
+ * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3508/hx3508_at_cmd.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
-// #include "hx3509.h"
+// #include "hx3508.h"
#include "at_cmd_api.h"
#include "pm_control.h"
#include "debug_print.h"
-#include "tyhx_OTS_hx3509_custom.h"
+#include "tyhx_OTS_hx3508_custom.h"
#include "custom_utils.h"
#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
-#define HX3509_MAX_ARGC 8
-#define HX3509_MAX_ARGV_LEN 64
+#define HX3508_MAX_ARGC 8
+#define HX3508_MAX_ARGV_LEN 64
-#define HX3509_SUCCESS 0
-#define HX3509_FAILED (-1)
+#define HX3508_SUCCESS 0
+#define HX3508_FAILED (-1)
static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen,
- uint8_t argv[HX3509_MAX_ARGC][HX3509_MAX_ARGV_LEN], uint32_t* argc)
+ uint8_t argv[HX3508_MAX_ARGC][HX3508_MAX_ARGV_LEN], uint32_t* argc)
{
uint32_t pos = 0;
*argc = 0;
argv[*argc][pos] = '\0';
*argc += 1;
pos = 0;
- if (*argc >= HX3509_MAX_ARGC) {
- return HX3509_FAILED;
+ if (*argc >= HX3508_MAX_ARGC) {
+ return HX3508_FAILED;
}
} else {
argv[*argc][pos] = para[i];
pos++;
- if (pos >= HX3509_MAX_ARGV_LEN) {
- return HX3509_FAILED;
+ if (pos >= HX3508_MAX_ARGV_LEN) {
+ return HX3508_FAILED;
}
}
}
*argc += 1;
}
- return HX3509_SUCCESS;
+ return HX3508_SUCCESS;
}
-static uint8_t g_hx3509_test_started = 0;
-static uint32_t hx3509_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+static uint8_t g_hx3508_test_started = 0;
+static uint32_t hx3508_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
{
UNUSED(strCommonCmd);
- uint8_t argv[HX3509_MAX_ARGC][HX3509_MAX_ARGV_LEN] = { 0 };
+ uint8_t argv[HX3508_MAX_ARGC][HX3508_MAX_ARGV_LEN] = { 0 };
uint32_t argc = 0;
int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
- if (ret != HX3509_SUCCESS) {
- PRINT("HX3509TEST ATCMD Convert Command Failed\n");
+ if (ret != HX3508_SUCCESS) {
+ PRINT("HX3508TEST ATCMD Convert Command Failed\n");
return ERRCODE_FAIL;
}
if (argc != 1) {
- PRINT("HX3509TEST ATCMD Set Parameter Failed argc %d\n",argc);
+ PRINT("HX3508TEST ATCMD Set Parameter Failed argc %d\n",argc);
return ERRCODE_FAIL;
}
uint8_t start = (uint8_t)atoi((char*)argv[0]);
if (start == 1)
{
- // if (g_hx3509_test_started == 1)
+ // if (g_hx3508_test_started == 1)
// {
- // PRINT("SKIP hx3509test start, already started\r\n");
+ // PRINT("SKIP hx3508test start, already started\r\n");
// return 0;
// }
ots_init();
// ots_start();
- g_hx3509_test_started = 1;
+ g_hx3508_test_started = 1;
}else if (start == 2){
- if (g_hx3509_test_started == 0)
+ if (g_hx3508_test_started == 0)
{
- PRINT("SKIP hx3509test stop, already stopped\r\n");
+ PRINT("SKIP hx3508test stop, already stopped\r\n");
return 0;
}
ots_stop();
- g_hx3509_test_started = 0 ;
+ g_hx3508_test_started = 0 ;
}else{
custom_exit_lpm();
}
return ERRCODE_SUCC;
}
-static const at_cmd_table_t g_hx3509_cmd[] = {
- { (char *)"AT^HX3509TEST", hx3509_test, (char *)"1" },
+static const at_cmd_table_t g_hx3508_cmd[] = {
+ { (char *)"AT^HX3508TEST", hx3508_test, (char *)"1" },
};
-at_cmd_table_t *get_hx3509_cmd_table(uint32_t *cmd_count)
+at_cmd_table_t *get_hx3508_cmd_table(uint32_t *cmd_count)
{
- *cmd_count = ARRAY_COUNT(g_hx3509_cmd);
- return (at_cmd_table_t *)g_hx3509_cmd;
+ *cmd_count = ARRAY_COUNT(g_hx3508_cmd);
+ return (at_cmd_table_t *)g_hx3508_cmd;
}
* @Author: penglei 1624952103@qq.com
* @Date: 2024-12-18 10:23:22
* @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-12-18 10:32:32
- * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3509/hx3509_at_cmd.h
+ * @LastEditTime: 2025-02-05 09:25:32
+ * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3508/hx3508_at_cmd.h
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
/**
* History: \n
* 2022-07-20, Create file. \n
*/
-#ifndef HX3509_AT_PROCESS_H
-#define HX3509_AT_PROCESS_H
+#ifndef HX3508_AT_PROCESS_H
+#define HX3508_AT_PROCESS_H
#include <stdint.h>
#include <stdio.h>
#endif /* __cplusplus */
#endif /* __cplusplus */
-at_cmd_table_t *get_hx3509_cmd_table(uint32_t *cmd_count);
+at_cmd_table_t *get_hx3508_cmd_table(uint32_t *cmd_count);
#ifdef __cplusplus
#if __cplusplus
--- /dev/null
+#include "at_cmd_api.h"
+#include "pm_control.h"
+#include "tyhx_OTS_hx3508_custom.h"
+#include "rotary_encoder_def.h"
+#include "i2c.h"
+#include "debug_print.h"
+#include "hal_i2c.h"
+
+static uint8_t g_hx3508_test_started = 0;
+encoder_callback g_encoder_callback = NULL;
+uint32_t hx3508_start(void)
+{
+ if (g_hx3508_test_started == 1)
+ {
+ re_print("SKIP hx3508test start, already started\r\n");
+ return 0;
+ }
+ ots_init();
+ ots_start();
+ g_hx3508_test_started = 1;
+ return ERRCODE_SUCC;
+}
+uint32_t hx3508_stop(void)
+{
+ if (g_hx3508_test_started == 0)
+ {
+ re_print("SKIP hx3508test stop, already stopped\r\n");
+ return 0;
+ }
+ ots_stop();
+ g_hx3508_test_started = 0 ;
+ return ERRCODE_SUCC;
+}
+
+static ext_errno hx3508_encoder_init(void *attr)
+{
+ re_print("hx3508_encoder_init\r\n");
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_deinit(void)
+{
+ re_print("hx3508_encoder_deinit\r\n");
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_get_encoderinfo(uint8_t *data, uint8_t data_len)
+{
+
+ if (data_len != sizeof(re_input_event_info))
+ return EXT_ERR_NOT_SUPPORT;
+ re_input_event_info *encoder_info = (re_input_event_info*)data;
+ int16_t diff = hx3508_get_crown_result();
+ int16_t stand_still = hx3508_get_stand_still();
+ // re_print("hx3508_encoder_get_encoderinfo diff %d stand_still %d\n",diff,stand_still);
+ if (stand_still == 1 )
+ {
+ encoder_info->re_event = MC_RE_COVER;
+ }else {
+ encoder_info->re_event = MC_RE_MOVE;
+ }
+ encoder_info->re_event_info.x_axis[0] = diff;
+ encoder_info->re_event_info.y_axis[0] = diff;
+ encoder_info->re_event_info.z_axis[0] = diff;
+ encoder_info->finger_id = 0 ;
+ encoder_info->point_num = 0 ;
+ encoder_info->tv_usec = (uint32_t)uapi_tcxo_get_ms();
+ //re_print("hx3508_encoder_get_encoderinfo %s rotate %d\r\n",encoder_info->re_event == MC_RE_SLIDE_UP?"MC_RE_SLIDE_UP":"MC_RE_SLIDE_DOWN",diff);
+
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_suspend(void)
+{
+ re_print("hx3508_encoder_suspend\r\n");
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_resume(void)
+{
+ re_print("hx3508_encoder_resume\r\n");
+ hx3508_start();
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_sleep(void)
+{
+ re_print("hx3508_encoder_sleep\r\n");
+ hx3508_stop();
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_reset(void)
+{
+ re_print("hx3508_encoder_reset\r\n");
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_bus_init(void *private_data)
+{
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_register_callback(void *peri_data, encoder_callback func)
+{
+ re_print("hx3508_register_callback\r\n");
+ g_encoder_callback = func;
+ return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_unregister_callback(void *peri_data)
+{
+ re_print("hx3508_unregister_callback\r\n");
+ g_encoder_callback = NULL;
+ return EXT_ERR_SUCCESS;
+}
+
+encoder_peripheral_api g_hx3508_api = {
+ .encoder_init = hx3508_encoder_init,
+ .encoder_deinit = hx3508_encoder_deinit,
+ .encoder_get_encoderinfo = hx3508_encoder_get_encoderinfo,
+ .encoder_suspend = hx3508_encoder_suspend,
+ .encoder_resume = hx3508_encoder_resume,
+ .encoder_sleep = hx3508_encoder_sleep,
+ .encoder_reset = hx3508_encoder_reset,
+ .encoder_bus_init = hx3508_encoder_bus_init,
+ .register_callback = hx3508_register_callback,
+ .unregister_callback = hx3508_unregister_callback,
+};
+
+
+void *rotary_encoder_get_hx3508_api(void)
+{
+ return ((void *)&g_hx3508_api);
+}
+
+void *rotary_encoder_get_hx3508_peri_attr(void)
+{
+ return ((void *)NULL);
+}
\ No newline at end of file
* @Date: 2024-12-23 15:11:25
* @LastEditors: penglei 1624952103@qq.com
* @LastEditTime: 2025-01-02 19:43:35
- * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.h
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE;
*/
/**
#endif /* __cplusplus */
#endif /* __cplusplus */
-void *rotary_encoder_get_hx3509_api(void);
-void *rotary_encoder_get_hx3509_peri_attr(void);
+void *rotary_encoder_get_hx3508_api(void);
+void *rotary_encoder_get_hx3508_peri_attr(void);
#ifdef __cplusplus
#if __cplusplus
*/
/*****************************************************************************
- * @file TYHX_OTS_HX3509_CUSTOM.C
+ * @file TYHX_OTS_hx3508_CUSTOM.C
* @author TYHX team
* @product saker
* @version V0.1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
-#include "tyhx_OTS_hx3509_custom.h"
+#include "tyhx_OTS_hx3508_custom.h"
#include "cmsis_os2.h"
#include "custom_utils.h"
#include "hal_gpio.h"
#define HAISI_SDK
-#ifdef CHIP_HX3509
+#ifdef CHIP_HX3508
//下面是NORDIC平台用到的所有函数,其他平台由用户自行添加
#ifdef HAISI_SDK
-// APP_TIMER_DEF(g_hx3509_timer); //定义OTS 读写间隔定时器
+// APP_TIMER_DEF(g_hx3508_timer); //定义OTS 读写间隔定时器
void ots_timer_handler(void * p_context);
#define REPORT_MIN 2 // 这个是最小上报角度, 按照平均值预估的值, 由客户定义, 看多大的数据上报给UI处理一次
bool ots_timer_running = false; //ots定时器是否运行标志
-static osTimerId_t g_hx3509_timer = NULL;
+static osTimerId_t g_hx3508_timer = NULL;
/*--------以下为定时函数相关定义 建立/启动/停止定时器//定时中断处理-----------*/
*/
void ots_timer_creat(void)
{
- // app_timer_create(&g_hx3509_timer, APP_TIMER_MODE_REPEATED, ots_timer_handler);
- g_hx3509_timer = osTimerNew((osTimerFunc_t)ots_timer_handler, osTimerPeriodic, NULL, NULL);
+ // app_timer_create(&g_hx3508_timer, APP_TIMER_MODE_REPEATED, ots_timer_handler);
+ g_hx3508_timer = osTimerNew((osTimerFunc_t)ots_timer_handler, osTimerPeriodic, NULL, NULL);
}
/**
{
if(ots_timer_running == false)
{
- // app_timer_start(g_hx3509_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
- osTimerStart(g_hx3509_timer,50);
+ // app_timer_start(g_hx3508_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
+ osTimerStart(g_hx3508_timer,50);
ots_timer_running = true;
}
}
*/
void ots_timer_stop(void)
{
- // app_timer_stop(g_hx3509_timer);
- osTimerStop(g_hx3509_timer);
+ // app_timer_stop(g_hx3508_timer);
+ osTimerStop(g_hx3508_timer);
ots_timer_running = false;
}
/**
uint8_t data_buf = 0;
//add by user, i2c read function
// tyhx_read_regs(I2C_DEV_7ADDR,regaddr,&data_buf,1);
- // custom_i2c_read_regs(I2C_DEV_7ADDR,regaddr,1,&data_buf,1,HX3509_I2C_BUS);
+ // custom_i2c_read_regs(I2C_DEV_7ADDR,regaddr,1,&data_buf,1,hx3508_I2C_BUS);
data_buf = crown_read_reg(I2C_DEV_7ADDR,regaddr);
return data_buf; //返回读到的寄存器值
}
#if (defined(MOT_FALLINGTRI_MODE))//脉冲模式中断
if(nrf_gpio_pin_read(PIN_TYHX_MOT))//读完数据, MOT应该会恢复默认电平
{
- TYHX_LOG("ots mot is cleared\r\n");//HX3509进入sleep后关闭定时器
+ TYHX_LOG("ots mot is cleared\r\n");//hx3508进入sleep后关闭定时器
}
#endif
//如果是MOT_NO_USE_MODE , 由用户程序处理,在不需要芯片时候关闭读50ms定时器
}
if(i==10)
{
- TYHX_LOG("HX3509 communication err, please check\r\n");
+ TYHX_LOG("hx3508 communication err, please check\r\n");
return;
}
ots_mot_init();
#endif
}
-void hx3509l_calibration(void)
+void hx3508l_calibration(void)
{
uint8_t cali75,cali74;
LOS_Mdelay(2);//必须有这个delay
ots_write_reg(RA_OP_MODE,0x1d);
LOS_Mdelay(10);
ots_write_reg(RA_DEBUG_CAS0,0x43);
- hx3509l_calibration();
+ hx3508l_calibration();
#ifdef MOT_NO_USE_MODE // 如果是非中断模式, 初始后, 开启定时器;
ots_timer_start();
// }
}
-int16_t hx3509_get_stand_still(void)
+int16_t hx3508_get_stand_still(void)
{
return stand_still;
}
-int16_t hx3509_get_crown_result(void)
+int16_t hx3508_get_crown_result(void)
{
int16_t resulttemp;
resulttemp=ots_result;
*/
/***************************************************************************
- * @file TYHX_OTS_hx3509_CUSTOM.h
+ * @file TYHX_OTS_hx3508_CUSTOM.h
* @author TYHX team
* @product saker
* @version V0.1
* @date 2023-11-29;
****************************************************************************/
-#ifndef _TYHX_OTS_hx3509_CUSTOM_H_
-#define _TYHX_OTS_hx3509_CUSTOM_H_
+#ifndef _TYHX_OTS_HX3508_CUSTOM_H_
+#define _TYHX_OTS_HX3508_CUSTOM_H_
-#define CHIP_HX3509 //使用OTS芯片的定义
+#define CHIP_HX3508 //使用OTS芯片的定义
#define I2C_DEV_7ADDR 0x32 //7bit i2c device addr
//工厂测试模式
bool ots_factory_test(void);
-int16_t hx3509_get_crown_result(void);
-int16_t hx3509_get_stand_still(void);
-int32_t microhone_switch(bool isopen);
+int16_t hx3508_get_crown_result(void);
+int16_t hx3508_get_stand_still(void);
-#endif //_TYHX__OTS_hx3509_CUSTOM_H
+
+#endif //_TYHX__OTS_hx3508_CUSTOM_H
+++ /dev/null
-#include "at_cmd_api.h"
-#include "pm_control.h"
-#include "tyhx_OTS_hx3509_custom.h"
-#include "rotary_encoder_def.h"
-#include "i2c.h"
-#include "debug_print.h"
-#include "hal_i2c.h"
-
-static uint8_t g_hx3509_test_started = 0;
-encoder_callback g_encoder_callback = NULL;
-uint32_t hx3509_start(void)
-{
- if (g_hx3509_test_started == 1)
- {
- re_print("SKIP hx3509test start, already started\r\n");
- return 0;
- }
- ots_init();
- ots_start();
- g_hx3509_test_started = 1;
- return ERRCODE_SUCC;
-}
-uint32_t hx3509_stop(void)
-{
- if (g_hx3509_test_started == 0)
- {
- re_print("SKIP hx3509test stop, already stopped\r\n");
- return 0;
- }
- ots_stop();
- g_hx3509_test_started = 0 ;
- return ERRCODE_SUCC;
-}
-
-static ext_errno hx3509_encoder_init(void *attr)
-{
- re_print("hx3509_encoder_init\r\n");
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_deinit(void)
-{
- re_print("hx3509_encoder_deinit\r\n");
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_get_encoderinfo(uint8_t *data, uint8_t data_len)
-{
-
- if (data_len != sizeof(re_input_event_info))
- return EXT_ERR_NOT_SUPPORT;
- re_input_event_info *encoder_info = (re_input_event_info*)data;
- int16_t diff = hx3509_get_crown_result();
- int16_t stand_still = hx3509_get_stand_still();
- // re_print("hx3509_encoder_get_encoderinfo diff %d stand_still %d\n",diff,stand_still);
- if (stand_still == 1 )
- {
- encoder_info->re_event = MC_RE_COVER;
- }else {
- encoder_info->re_event = MC_RE_MOVE;
- }
- encoder_info->re_event_info.x_axis[0] = diff;
- encoder_info->re_event_info.y_axis[0] = diff;
- encoder_info->re_event_info.z_axis[0] = diff;
- encoder_info->finger_id = 0 ;
- encoder_info->point_num = 0 ;
- encoder_info->tv_usec = (uint32_t)uapi_tcxo_get_ms();
- //re_print("hx3509_encoder_get_encoderinfo %s rotate %d\r\n",encoder_info->re_event == MC_RE_SLIDE_UP?"MC_RE_SLIDE_UP":"MC_RE_SLIDE_DOWN",diff);
-
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_suspend(void)
-{
- re_print("hx3509_encoder_suspend\r\n");
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_resume(void)
-{
- re_print("hx3509_encoder_resume\r\n");
- hx3509_start();
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_sleep(void)
-{
- re_print("hx3509_encoder_sleep\r\n");
- hx3509_stop();
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_reset(void)
-{
- re_print("hx3509_encoder_reset\r\n");
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_bus_init(void *private_data)
-{
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_register_callback(void *peri_data, encoder_callback func)
-{
- re_print("hx3509_register_callback\r\n");
- g_encoder_callback = func;
- return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_unregister_callback(void *peri_data)
-{
- re_print("hx3509_unregister_callback\r\n");
- g_encoder_callback = NULL;
- return EXT_ERR_SUCCESS;
-}
-
-encoder_peripheral_api g_hx3509_api = {
- .encoder_init = hx3509_encoder_init,
- .encoder_deinit = hx3509_encoder_deinit,
- .encoder_get_encoderinfo = hx3509_encoder_get_encoderinfo,
- .encoder_suspend = hx3509_encoder_suspend,
- .encoder_resume = hx3509_encoder_resume,
- .encoder_sleep = hx3509_encoder_sleep,
- .encoder_reset = hx3509_encoder_reset,
- .encoder_bus_init = hx3509_encoder_bus_init,
- .register_callback = hx3509_register_callback,
- .unregister_callback = hx3509_unregister_callback,
-};
-
-
-void *rotary_encoder_get_hx3509_api(void)
-{
- return ((void *)&g_hx3509_api);
-}
-
-void *rotary_encoder_get_hx3509_peri_attr(void)
-{
- return ((void *)NULL);
-}
\ No newline at end of file
#include "hx3507_hal.h"
#endif
-#ifdef ROTARYENCODER_HX3509
-#include "hx3509_hal.h"
+#ifdef ROTARYENCODER_HX3508
+#include "hx3508_hal.h"
#endif
#ifdef ROTARYENCODER_U8
#ifdef ROTARYENCODER_HX3507
g_encoder_drv.private_data = rotary_encoder_get_hx3507_peri_attr();
g_encoder_drv.encoder_api = rotary_encoder_get_hx3507_api();
-#elif defined ROTARYENCODER_HX3509
- g_encoder_drv.private_data = rotary_encoder_get_hx3509_peri_attr();
- g_encoder_drv.encoder_api = rotary_encoder_get_hx3509_api();
+#elif defined ROTARYENCODER_HX3508
+ g_encoder_drv.private_data = rotary_encoder_get_hx3508_peri_attr();
+ g_encoder_drv.encoder_api = rotary_encoder_get_hx3508_api();
#elif defined ROTARYENCODER_U8
g_encoder_drv.private_data = rotary_encoder_get_crown_peri_attr();
g_encoder_drv.encoder_api = rotary_encoder_get_crown_api();
/**灭屏,关闭Encoder*/
#ifdef ROTARYENCODER_HX3507
encoder_ptr = rotary_encoder_get_hx3507_api();
-#elif defined ROTARYENCODER_HX3509
- encoder_ptr = rotary_encoder_get_hx3509_api();
+#elif defined ROTARYENCODER_HX3508
+ encoder_ptr = rotary_encoder_get_hx3508_api();
#elif defined ROTARYENCODER_U8
encoder_ptr = rotary_encoder_get_crown_api();
#endif
#ifdef ROTARYENCODER_HX3507
/**亮屏,恢复Encoder工作*/
encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3507_api();
-#elif defined ROTARYENCODER_HX3509
- encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3509_api();
+#elif defined ROTARYENCODER_HX3508
+ encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3508_api();
#elif defined ROTARYENCODER_U8
encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_crown_api();
#endif
float battery_percent_map[][2]={
+#ifdef BOARD_U8
+ {3.8, 100},
+ {3.782, 95},
+ {3.764, 90},
+ {3.746, 85},
+ {3.728, 80},
+ {3.71, 75},
+ {3.692, 70},
+ {3.674, 65},
+ {3.656, 60},
+ {3.638, 55},
+ {3.62, 50},
+ {3.602, 45},
+ {3.584, 40},
+ {3.566, 35},
+ {3.548, 30},
+ {3.53, 25},
+ {3.512, 20},
+ {3.494, 15},
+ {3.476, 10},
+ {3.405, 5},
+ {3.3, 0}
+#else
{4.3,100},
{4.264,95},
{4.228,90},
{3.652,10},
{3.41,5},
{3.3,0}
+#endif
};
+#ifdef BOARD_U8
+#define batteryservice_VOLTAGE_MAX (3.8f)
+#define batteryservice_VOLTAGE_MIN (3.3f)
+#else
#define batteryservice_VOLTAGE_MAX (4.3f)
#define batteryservice_VOLTAGE_MIN (3.3f)
-
+#endif
static uint32_t g_adc_sample_times = 0;
static uint32_t g_adc_sample_discard = 0;
static uint32_t g_adc_sample_stick = 0;
/**\r
* 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算\r
*/\r
-static uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)\r
-{\r
- uint8_t lrcValue = _lrcValue;\r
- if(data == NULL)\r
- {\r
- return false; \r
- }\r
- for(uint16_t i = 0; i < len; i++)\r
- {\r
- lrcValue =lrcValue+ data[i];\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);\r
- }\r
- return lrcValue;\r
-}\r
\r
\r
-/***\r
- * 根据求和后的数据计算crc 值 \r
-*/\r
-uint8_t get_crc_from_lrc(uint8_t lrcValue)\r
-{\r
- uint8_t crcbuf = 0;\r
- crcbuf = lrcValue%256;\r
- crcbuf = 256-crcbuf;\r
- crcbuf = crcbuf%256;\r
- return crcbuf;\r
-}\r
-\r
uint8_t calculate_lrc_file(char *file_path)\r
{\r
uint8_t lrcValue =0;\r
}\r
\r
\r
-static uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte\r
-{\r
- uint8_t crcbuf = 0;\r
- uint8_t lrcValue = 0x00;\r
- lrcValue = calculate_lrc(data+17,len-17,0x00);\r
- crcbuf = get_crc_from_lrc(lrcValue);\r
- return crcbuf;\r
-}\r
-\r
-static uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte\r
-{\r
- uint8_t crcbuf = 0;\r
- uint8_t lrcValue = 0x00;\r
- lrcValue = calculate_lrc(data,len,0x00);\r
- crcbuf = get_crc_from_lrc(lrcValue);\r
- return crcbuf;\r
-}\r
\r
static cJSON *cjson_json_tmp = NULL;\r
//发送ble数据\r
void watch_synchronization_time(void);
+uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len);//计算20byte
+
///////////////////////////自定义文件传输协议/////////////////////////////
#define OTA_FILE_MSG_CMD 0x0601
#define OTA_FILE_DATA_CMD 0x0602
* @Author: penglei 1624952103@qq.com\r
* @Date: 2024-06-17 14:31:08\r
* @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-16 10:01:35\r
+ * @LastEditTime: 2025-02-20 18:34:13\r
* @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
* @Description: \r
* \r
#include "NMEA0183.h"\r
static gps_data_t send_gps_data = {0};\r
#endif\r
+\r
+#ifdef ENABLE_BN02\r
+#include "bp_ble_service.h"\r
+#endif\r
+\r
#pragma pack(1)\r
typedef struct factorytest_cmd_header_t\r
{\r
ChargerEventPublish(TOPIC_EVENT_CHARGE_UNPLUG,0); //进入产测模式 关闭充电弹窗\r
uapi_dev_runtime_set_factory_test_status(1); //设置产测模式runtime\r
svr_ble_adv_factory_test_start_param(); //设置蓝牙广播 避免出现连接问题\r
-#endif\r
+ \r
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV,NULL,0);\r
+#endif \r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON,\r
BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE,\r
0x01,\r
1);\r
#ifdef FD230\r
uapi_hfp_connect_();\r
+ // uint8_t cmd = BR_HFP_CONNECT;\r
+\r
+ // cmd = BR_A2DP_CONNECT;\r
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd));\r
+ \r
LOS_Msleep(500);\r
+\r
+ // cmd = BR_A2DP_CONNECT;\r
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd));\r
uapi_a2dp_snk_connect_();\r
#endif\r
} else if (testitem == 0x02)\r
uint8_t send_data= 0;\r
// uapi_start_audio_test(30);\r
uapi_microhone_switch(1);\r
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_MIC,NULL,0);\r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
0x01,\r
uint8_t send_data= 0;\r
// uapi_stop_audio_test();\r
uapi_microhone_switch(0);\r
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_MIC,NULL,0);\r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
0x02,\r
//播放录音\r
uint8_t send_data= 0;\r
uapi_check_mic(1);\r
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_CHECK_MIC,NULL,0);\r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
0x03,\r
//停止播放\r
uint8_t send_data= 0;\r
uapi_check_mic(0);\r
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_CHECK_MIC,NULL,0);\r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
0x04,\r
0x05,\r
&send_data,\r
1);\r
+ } else if(testitem == 0x06)\r
+ {\r
+ //播放扫频文件\r
+ uint8_t send_data = 0;\r
+ uapi_check_spk(2);\r
+ factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+ BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
+ 0x06,\r
+ &send_data,\r
+ 1);\r
+ } else if(testitem == 0x07)\r
+ {\r
+ //删除扫频文件\r
+ uint8_t send_data = uapi_delete_files("/user/music/20-20KHZ.mp3");\r
+ factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+ BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
+ 0x07,\r
+ &send_data,\r
+ 1);\r
}\r
-\r
- if (testitem == 0x06)\r
+ else if (testitem == 0x08)\r
{\r
uint8_t send_data = 0x00;\r
-#ifdef FD230\r
- uapi_hfp_connect_();\r
- LOS_Msleep(500);\r
- uapi_a2dp_snk_connect_();\r
-#endif\r
+\r
+ send_data = factorytest_upload_mic_file();\r
+\r
factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
- 0x03,\r
+ 0x08,\r
&send_data,\r
1);\r
}\r
\r
+\r
+// else if (testitem == 0x08)\r
+// {\r
+// uint8_t send_data = 0x00;\r
+// #ifdef FD230\r
+// uapi_hfp_connect_();\r
+// LOS_Msleep(500);\r
+// uapi_a2dp_snk_connect_();\r
+// #endif\r
+// factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+// BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
+// 0x03,\r
+// &send_data,\r
+// 1);\r
+// }\r
+\r
break;\r
\r
case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP:\r
\r
}\r
\r
- }else{\r
+ } \r
+ else if(header.header == BLE_TEST_BN02_HEADER)\r
+ {\r
+#ifdef ENABLE_BN02\r
+ bn02_parse_frame(buf,event_size);\r
+#endif\r
+ }\r
+ else\r
+ {\r
printf("crc error!\r\n");\r
return ERRCODE_FAIL;\r
}\r
// 3、大端模式。
// 4、长耗时命令,先确认收到,执行完再返回结果。
#define BLE_TEST_PROTOCOL_HEADER 0xFD
-
+#define BLE_TEST_BN02_HEADER 0x55
//公共模式 子模式ID 模式切换
#define BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE 0x01
#endif
#ifdef SUPPORT_BLE_SERVICE
+#include "bleService.h"
#ifdef BLE_INSTRUCT
#include "bleInstruct.h"
#endif
case CUSTOM_CMD_MSG_CAT_HFP_DIS_SCO_CONNECT:
cat1_disconn_sco_();
break;
- case CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START:
+ case CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START:
cat1_start_SCO_audio_();
break;
-
-
+ case CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV:
+#ifdef SUPPORT_BLE_SERVICE
+ svr_ble_adv_factory_test_start_param();
+#endif
+ break;
+
+ case CUSTOM_CMD_MSG_START_MIC:
+ uapi_microhone_switch(1);
+ break;
+
+ case CUSTOM_CMD_MSG_STOP_MIC:
+ uapi_microhone_switch(0);
+ break;
+
+ case CUSTOM_CMD_MSG_START_CHECK_MIC:
+ uapi_check_mic(1);
+ break;
+
+ case CUSTOM_CMD_MSG_STOP_CHECK_MIC:
+ uapi_check_mic(0);
+ break;
+
default:
PRINT("Unknown CUSTOM_CMD_MSG cmd 0x%02X \r\n", mail.cmd);
break;
#ifdef TPTYPE_CST86XX
#include "cst86xx_touch1.h"
#endif
+
+#ifdef SUPPORT_BLE_SERVICE
+#include "bleEvent.h"
+#endif
+
errcode_t uapi_create_osThread_custom(app_task_definition_t *task_cfg)
{
if (task_cfg==NULL)
}
-errcode_t custom_i2c_transfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex)
+errcode_t custom_i2c_transfer(uint16_t slaveAddr,uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex)
{
+
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+ if (cnt == 0)
+ {
+ uapi_pm_add_sleep_veto(PM_ID_GSENSOR);
+ }
+
errcode_t ret;
uint32_t retry;
i2c_data_t data;
int16_t write_len = 0;
//custom_iic_init();
- write_len = regLength + writeDataSize;
+ write_len = writeDataSize;
write_data = (uint8_t *)osal_kmalloc(write_len, OSAL_GFP_KERNEL);
if (write_data == NULL) {
PRINT(" send buff malloc fail!");
goto error;
}
- if( regLength == 2)
- {
- write_data[0] = ((uint8_t*)®)[0];
- write_data[1] = ((uint8_t*)®)[1];
- }else{
- write_data[0] = (uint8_t)reg;
- }
-
- ret = (uint32_t)memcpy_s(write_data + regLength, writeDataSize, writeData, writeDataSize);
+ ret = (uint32_t)memcpy_s(write_data, writeDataSize, writeData, writeDataSize);
if (ret != EOK) {
PRINT("send_buf content copy fail! ret=0x%x\n", ret);
goto free_mem;
free_mem:
osal_kfree(write_data);
error:
+
+ cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+ if (cnt == 1)
+ {
+ uapi_pm_remove_sleep_veto(PM_ID_GSENSOR);
+ }
+
return (ret>0) ? ret*-1: ret;
}
+
+uint32_t custom_spi_suspend(void)
+{
+ spi_save_reg(SPI_BUS_0);
+ return 0;
+}
+uint32_t custom_spi_resume(void)
+{
+ spi_recovery_reg(SPI_BUS_0);
+ return 0;
+}
+
uint32_t custom_i2c_suspend(void)
{
i2c_save_reg(I2C_BUS_2);
return 0;
}
+
+errcode_t custom_spi_init(uint8_t bus_index)
+{
+ spi_bus_t bus;
+ spi_attr_t attr;
+ bus = bus_index;
+ attr.is_slave = false;
+ attr.slave_num = 1;
+ attr.bus_clk = 32000000;
+ attr.freq_mhz = 8;
+ attr.clk_polarity = (uint32_t)SPI_CFG_CLK_CPOL_1;
+ attr.clk_phase = (uint32_t)SPI_CFG_CLK_CPHA_1;
+ attr.frame_format = SPI_CFG_FRAME_FORMAT_MOTOROLA_SPI;
+ attr.spi_frame_format = (uint32_t)HAL_SPI_FRAME_FORMAT_STANDARD;
+ attr.frame_size = (uint32_t)HAL_SPI_FRAME_SIZE_8;
+ attr.tmod = HAL_SPI_TRANS_MODE_TXRX;
+ attr.sste = SPI_CFG_SSTE_ENABLE;
+ attr.ndf = 1;
+
+ errcode_t ret = uapi_spi_init(bus,&attr,NULL);
+ if (ret != ERRCODE_SUCC) {
+ PRINT("spi init fail! ret=0x%x\n", ret);
+ }
+ return ret;
+}
+
/*省电模式*/
void uapi_enter_power_saving_mode(void)
{
}
-void uapi_check_spk(bool isopen)
+void uapi_check_spk(uint8_t isopen)
{
#ifdef FD230
check_spk(isopen);
uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
}
}
+
+#ifdef SUPPORT_BLE_SERVICE
+
+void factorytest_send_big_data(ble_data_type type,char *data, uint16 datalen)
+{
+ // 动态分配内存空间,防止堆栈溢出
+ uint8_t *buf =NULL;
+ buf = malloc(17 + datalen + 1);
+ memset_s(buf,250,0,17 + datalen + 1);
+ if (buf == NULL && datalen!=0) {
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n");
+ return;
+ }
+ if(type.Packet_id>=2)
+ {
+ msleep(get_ble_interval()+5);//多包数据发送增加延迟
+ }
+ // 设置消息头部信息
+ buf[0] = 0x72; // 消息头
+ buf[1] = type.type; // 类型
+ buf[2] = type.type_id; // 类型ID
+ memcpy(buf + 3, &type.packet_total, 4); // 总包数
+ memcpy(buf + 7, &type.total, 4); // 总数据长度
+ memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID
+ memcpy(buf + 15, &datalen, 2); // 包数据长度
+
+ // 处理数据和计算CRC
+ if (data == NULL) {
+ //数据为空 按照18个字节总长度发送给app
+ buf[17] = 0x00; // 直接写0x00的校验和
+ } else {
+ memcpy(buf + 17, data, datalen); // 复制数据到缓冲区
+ buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC
+ }
+
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n");
+
+ // for(int i=0;i<17 + datalen + 1;i++)
+ // {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);
+ // }
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n");
+
+ ble_factorytest_server_send_input_report(buf, 17 + datalen + 1);
+
+
+ free(buf); // 释放内存空间
+}
+
+#endif
+
+bool factorytest_upload_mic_file(void)
+{
+ uint8_t pack_size = 200;
+ char *data= (char *)malloc(pack_size+1);
+ uint16_t read_size=0;
+ FILE *fp=fopen("/user/userdata/microphone.mp3","rb+");
+
+ uint32_t file_size = uapi_get_file_size("/user/userdata/microphone.mp3");
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size);
+
+ uint32_t pack=file_size/pack_size+1;
+ uint32_t pack_id=1;
+ if(fp==NULL)
+ {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);
+ free(data);
+ return false;
+ }
+
+ do
+ {
+ memset_s(data,pack_size+1,0,pack_size+1);
+ read_size=fread(data,1,pack_size,fp);
+ if(read_size!=0)
+ {
+#ifdef SUPPORT_BLE_SERVICE
+ ble_data_type type_={0x1b,0x08,file_size,pack,pack_id};
+ // send_big_data(type_,(char *)data,read_size);
+ factorytest_send_big_data(type_,(char *)data,read_size);
+#endif
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size);
+ }
+
+ //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);
+ pack_id++;
+
+ } while (read_size==pack_size);
+ free(data);
+ fclose(fp);
+ return true;
+}
+
+
+uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte
+{
+ uint8_t crcbuf = 0;
+ uint8_t lrcValue = 0x00;
+ lrcValue = calculate_lrc(data+17,len-17,0x00);
+ crcbuf = get_crc_from_lrc(lrcValue);
+ return crcbuf;
+}
+
+uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte
+{
+ uint8_t crcbuf = 0;
+ uint8_t lrcValue = 0x00;
+ lrcValue = calculate_lrc(data,len,0x00);
+ crcbuf = get_crc_from_lrc(lrcValue);
+ return crcbuf;
+}
+
+
+/***
+ * 根据求和后的数据计算crc 值
+*/
+uint8_t get_crc_from_lrc(uint8_t lrcValue)
+{
+ uint8_t crcbuf = 0;
+ crcbuf = lrcValue%256;
+ crcbuf = 256-crcbuf;
+ crcbuf = crcbuf%256;
+ return crcbuf;
+}
+
+uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)
+{
+ uint8_t lrcValue = _lrcValue;
+ if(data == NULL)
+ {
+ return false;
+ }
+ for(uint16_t i = 0; i < len; i++)
+ {
+ lrcValue =lrcValue+ data[i];
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);
+ }
+ return lrcValue;
+}
#define CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START 0x19
+#define CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV 0x1A
+
+#define CUSTOM_CMD_MSG_START_MIC 0x1B
+
+#define CUSTOM_CMD_MSG_STOP_MIC 0x1C
+
+#define CUSTOM_CMD_MSG_START_CHECK_MIC 0x1D
+
+#define CUSTOM_CMD_MSG_STOP_CHECK_MIC 0x1E
typedef enum {
BR_HFP_CONNECT=1,
void custom_i2c_reset(uint8_t i2cbus, uint16_t i2c_clock);
errcode_t custom_i2c_write_reg(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex);
errcode_t custom_i2c_read_regs(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex);
-errcode_t custom_i2c_transfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex);
+errcode_t custom_i2c_transfer(uint16_t slaveAddr,uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex);
errcode_t custom_i2c_test(void);
uint32_t custom_i2c_suspend(void);
int32_t uapi_microhone_switch(bool isopen);
-void uapi_check_spk(bool isopen);
+void uapi_check_spk(uint8_t isopen);
void uapi_check_mic(bool isopen);
void uapi_factorytest_set_lcd_color(int color);
void uapi_factorytest_enter_test_view(int cmd);
void start_save_file_thread(void);
void uapi_create_folder(char *dir_path);
uint32_t uapi_get_file_size(char *filepath);
+
+uint32_t custom_spi_suspend(void);
+uint32_t custom_spi_resume(void);
+
+errcode_t custom_spi_init(uint8_t bus_index);
+
/**
* 资源文件校验码保存在文件 /user/fileschecksum.txt 中
* 读出每一行,输入本函数,检测文件是否正常。
void remove_debug_vote(void);
+bool factorytest_upload_mic_file(void);
+
+uint8_t Calculate_CRC(uint8_t *data,uint16_t len);
+uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len);
+/***
+ * 根据求和后的数据计算crc 值
+*/
+uint8_t get_crc_from_lrc(uint8_t lrcValue);
+
+uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue);
+
#include "custom_utilscpp.h"