From d6fa983da52a0fa8f2eaa35c8fccf019deb60ae4 Mon Sep 17 00:00:00 2001 From: Roy_01 Date: Tue, 10 Dec 2024 10:08:04 +0800 Subject: [PATCH] feat: add the decode_start_data_char_notify() & stop_data_char_notify() function for dev_mode --- pel.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 162 insertions(+), 12 deletions(-) diff --git a/pel.c b/pel.c index 6f70d98..99d40db 100644 --- a/pel.c +++ b/pel.c @@ -21,9 +21,22 @@ typedef struct uint32_t mask; } input_pin_t; -TaskHandle_t test_gpio_task_Handle = NULL; +typedef struct +{ + uint16_t pattern_id; + uint32_t pattern; +} resistor_combination_t; -static pel_output_t output_data = { 0 }; +typedef struct __PACKED +{ + uint32_t notify_period; + uint32_t total_notify_count; +} characteristic_param_t; + +static bool data_char_notify_running; +TaskHandle_t test_gpio_task_Handle = NULL; +static pel_output_t output_data = { 0 }; +static resistor_combination_t global_resis = { 0 }; const input_pin_t input_pin_tab[] = { { 0.5, INPUT_1_PIN, PEL_0P5R_MASK}, @@ -42,7 +55,9 @@ const input_pin_t input_pin_tab[] = { static float _load_set(uint32_t mask) { - float ohms = 0; + float ohms = 0; + global_resis.pattern = mask; + for (int32_t i = COUNTOF(input_pin_tab) - 1; i >= 0; i--) { if (input_pin_tab[i].mask & mask) @@ -67,12 +82,6 @@ void set_high_z_state(void) void set_pattern_resistor(uint16_t pattern_id) { - typedef struct - { - uint16_t pattern_id; - uint32_t pattern; - } resistor_combination_t; - const resistor_combination_t pattern_tab[] = { { 1, 0b111}, { 2, 0b011}, @@ -119,6 +128,8 @@ void set_pattern_resistor(uint16_t pattern_id) {43, 0b1 << 11}, }; + global_resis.pattern_id = pattern_id; + for (int32_t i = 0; i < ARRAY_SIZE(pattern_tab); i++) { if (pattern_tab[i].pattern_id == pattern_id) @@ -278,9 +289,9 @@ pel_output_t pel_smaple_and_convt_all(uint32_t measure_out, uint32_t load_mask) #define VERSION_DATE_YEAR 24 #define VERSION_DATE_MONTH 12 -#define VERSION_DATE_DAY 4 -#define VERSION_DATE_HOUR 11 -#define VERSION_DATE_MINUTE 33 +#define VERSION_DATE_DAY 10 +#define VERSION_DATE_HOUR 10 +#define VERSION_DATE_MINUTE 8 static void cis_version(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); @@ -475,6 +486,137 @@ static void data_char_update_once(void) data.val_10_f += 0.01; } +static ret_code_t _send_data_char_notify_start_packet(void *p_buf, uint16_t p_buf_size, uint32_t loops) +{ + memset(p_buf, 0x00, sizeof(p_buf)); + + for (uint32_t i = 0; i < loops; i++) + { + ret_code_t le_data_notify(uint8_t * p_value, uint16_t len); + ret_code_t ret = le_data_notify((void *)p_buf, p_buf_size); + + if (ret != NRF_SUCCESS) + { + return ret; + } + } + + return NRF_SUCCESS; +} + +static void start_data_char_notify_task(void *p_arg) +{ + typedef struct __PACKED + { + uint8_t mem_board_id; + uint32_t notify_time; + uint8_t packet_seq; + int32_t val_1; + int32_t val_2; + int32_t val_3; + int32_t val_4; + int32_t val_5; + float val_6_f; + float val_7_f; + float val_8_f; + float val_9_f; + float val_10_f; + uint16_t pattern_id; + uint32_t pattern; + } data_char_packet_t; + + bool first_data = true; + data_char_packet_t packet_buf; + characteristic_param_t *data_char_notify_param = (characteristic_param_t *)p_arg; + data_char_notify_running = true; + + memset(&packet_buf, 0x00, sizeof(packet_buf)); + _send_data_char_notify_start_packet(&packet_buf, sizeof(packet_buf), 4); + + for (;;) + { + if (data_char_notify_running) + { + if (first_data) + { + packet_buf.mem_board_id = 5; + packet_buf.notify_time = xTaskGetTickCount(); + packet_buf.packet_seq = 0; + packet_buf.val_1 = 0; + packet_buf.val_2 = 100; + packet_buf.val_3 = 1000; + packet_buf.val_4 = 10000; + packet_buf.val_5 = 100000; + packet_buf.val_6_f = 1.0; + packet_buf.val_7_f = 5.0; + packet_buf.val_8_f = 10.0; + packet_buf.val_9_f = 15.0; + packet_buf.val_10_f = 20.0; + packet_buf.pattern_id = global_resis.pattern_id; + packet_buf.pattern = global_resis.pattern; + first_data = false; + } + else + { + packet_buf.mem_board_id = 5; + packet_buf.notify_time = xTaskGetTickCount(); + packet_buf.packet_seq += 1; + packet_buf.val_1 += 1; + packet_buf.val_2 += 1; + packet_buf.val_3 += 1; + packet_buf.val_4 += 1; + packet_buf.val_5 += 1; + packet_buf.val_6_f += 0.01; + packet_buf.val_7_f += 0.01; + packet_buf.val_8_f += 0.01; + packet_buf.val_9_f += 0.01; + packet_buf.val_10_f += 0.01; + packet_buf.pattern_id = global_resis.pattern_id; + packet_buf.pattern = global_resis.pattern; + } + + ret_code_t le_data_notify(uint8_t * p_value, uint16_t len); + ret_code_t ret = le_data_notify((void *)&packet_buf, sizeof(packet_buf)); + + { + char str[128]; + snprintf(str, sizeof(str), "{%d, %d, %d, %d, %d, %d, %d, %d, %.7f, %.7f, %.7f, %.7f, %.7f, %d, 0x%08X}", packet_buf.mem_board_id, packet_buf.notify_time, packet_buf.packet_seq, packet_buf.val_1, packet_buf.val_2, packet_buf.val_3, packet_buf.val_4, packet_buf.val_5, packet_buf.val_6_f, packet_buf.val_7_f, packet_buf.val_8_f, packet_buf.val_9_f, packet_buf.val_10_f, packet_buf.pattern_id, packet_buf.pattern); + NRF_LOG_INFO("%s", str); + } + + vTaskDelay(pdMS_TO_TICKS(data_char_notify_param->notify_period)); + } + else // stop data update process + { + free(data_char_notify_param); + vTaskDelete(NULL); + } + } +} + +static void decode_start_data_char_notify(uint8_t *param) +{ + characteristic_param_t *data_char_notify_param = malloc(sizeof(characteristic_param_t)); + + if (data_char_notify_param == NULL) + { + NRF_LOG_ERROR("Failed to allocate memory for data_char_notify_param"); + return; + } + + data_char_notify_param->notify_period = u8_to_u32(param[0], param[1], param[2], param[3]); + data_char_notify_param->total_notify_count = u8_to_u32(param[0], param[1], param[2], param[3]); + data_char_notify_param->notify_period = 100; + data_char_notify_param->total_notify_count = 5; + + xTaskCreate(start_data_char_notify_task, "start_data_char_notify_task", 2048, (void *)data_char_notify_param, 3, NULL); +} + +static void stop_data_char_notify(void) +{ + data_char_notify_running = false; +} + static void dev_mode_characteristic(uint8_t *ins) { NRF_LOG_INFO("[DEV MODE] %s", __FUNCTION__); @@ -496,6 +638,14 @@ static void dev_mode_characteristic(uint8_t *ins) data_char_update_once(); break; + case 0x01: + decode_start_data_char_notify(p_ins->param); + break; + + case 0x02: + stop_data_char_notify(); + break; + default: break; }