VesiScan BASIC origin: Piezo + IMU firmware initial code

- nRF52840 + SoftDevice S140 BLE firmware
- Piezo ultrasound TX driver (2MHz, 8ch MUX)
- ICM42670P IMU 6-axis driver
- Echo AFE chain (ADA2200 + ADC121S051)
- BLE NUS command parser (mpa/mpc/mdc/mec/maa/msp)
- FDS flash config storage
- pc_firm parser and ADC driver included

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Charles Kwon
2026-03-11 10:40:20 +09:00
parent 72f5eb3cd9
commit 8129f55216
47 changed files with 8459 additions and 2887 deletions

View File

@@ -1,6 +1,6 @@
/*******************************************************************************
* @file main.c
* @brief Medithings Bladder Patch Firmware
* @brief Medithings VesiScan BASIC
* @version 1.17
* @date 2025-12-09
* @author Charles KWON
@@ -93,6 +93,13 @@
#include "nrf_crypto.h"
#include <cmd_parse.h>
#include "debug_print.h"
#include "fstorage.h"
#define HARDWARE_VERSION "VB0HW0000"
#define FIRMWARE_VERSION "VB0FW0000"
#define FIRMWARE_SERIAL_NO "VB026030000"
/*==============================================================================
* BUILD CONFIGURATION
@@ -319,19 +326,71 @@ static void full_gpio_init(void)
static void load_default_config(void)
{
memset(SERIAL_NO, 0, 16);
memcpy(SERIAL_NO, "2025MEDIP0001", 13);
memcpy(SERIAL_NO, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO));
memset(m_static_passkey, 0, 16);
memcpy(m_static_passkey, "123456", 6);
m_pd_delay_us = 8000;
m_pd_adc_cnt = 8;
m_reset_status = 1;
bond_data_delete = 1;
DBG_PRINTF("[CFG] Default (S/N=%s)\r\n", SERIAL_NO);
}
/**@brief Load configuration from internal Flash (FDS) into global variables.
*
* Must be called AFTER ble_stack_init() → fs_storage_init() → config_load().
* Reads m_config (populated by config_load) and copies to runtime globals.
*/
static bool m_need_save_defaults = false;
static void load_flash_config(void)
{
m_need_save_defaults = false;
/* Hardware Number — fill default if empty */
if (m_config.hw_no[0] == 0 || m_config.hw_no[0] == (char)0xFF) {
memset(m_config.hw_no, 0, 12);
memcpy(m_config.hw_no, HARDWARE_VERSION, strlen(HARDWARE_VERSION));
DBG_PRINTF("[CFG] HW empty, set default: %s\r\n", HARDWARE_VERSION);
m_need_save_defaults = true;
}
/* Serial Number — fill default if empty */
if (m_config.serial_no[0] == 0 || m_config.serial_no[0] == (char)0xFF) {
memset(m_config.serial_no, 0, 12);
memcpy(m_config.serial_no, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO));
DBG_PRINTF("[CFG] S/N empty, set default: %s\r\n", FIRMWARE_SERIAL_NO);
m_need_save_defaults = true;
}
/* Serial Number → BLE device name */
memset(SERIAL_NO, 0, 16);
memcpy(SERIAL_NO, m_config.serial_no, 12);
/* Passkey */
memset(m_static_passkey, 0, 16);
memcpy(m_static_passkey, m_config.static_passkey, 6);
/* Bond data delete flag */
bond_data_delete = m_config.bond_data_delete;
/* Reset status */
m_reset_status = m_config.reset_status;
/* Measurement parameters (with validation) */
m_pd_adc_cnt = (m_config.pd_adc_cnt > 0 && m_config.pd_adc_cnt <= 32)
? m_config.pd_adc_cnt : 8;
m_pd_delay_us = (m_config.pd_delay_us > 0)
? m_config.pd_delay_us : 8000;
DBG_PRINTF("[CFG] HW=%.12s S/N=%s passkey=%.6s bond=%d rst=%d adc=%d delay=%u\r\n",
m_config.hw_no, SERIAL_NO, m_static_passkey, bond_data_delete,
m_reset_status, m_pd_adc_cnt, m_pd_delay_us);
}
#if !DEBUG_MINIMAL_BOOT
static void load_eeprom_config(void)
{
@@ -345,13 +404,13 @@ static void load_eeprom_config(void)
#if BLE_DEV_MODE
memset(SERIAL_NO, 0, 16);
memcpy(SERIAL_NO, "2005MEDIP001", 12);
memcpy(SERIAL_NO, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO));
DBG_PRINTF("[CFG] DEV S/N=%s\r\n", SERIAL_NO);
#else
if (!is_valid_serial_no(SERIAL_NO))
{
memset(SERIAL_NO, 0, 16);
memcpy(SERIAL_NO, "2025AAAAP000", 12);
memcpy(SERIAL_NO, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO));
}
char const init_pass[6] = "123456";
@@ -1441,23 +1500,19 @@ int main(void)
DBG_PRINTF("[2] Timers\r\n");
timers_init();
// PHASE 4: 설정
DBG_PRINTF("[3] Config\r\n");
#if DEBUG_MINIMAL_BOOT
// PHASE 4: 설정 (기본값 로드)
DBG_PRINTF("[3] Config (defaults)\r\n");
load_default_config();
#else
load_eeprom_config();
#endif
// PHASE 5: 버튼/LED
DBG_PRINTF("[4] Buttons\r\n");
buttons_leds_init(&erase_bonds_local);
#if FEATURE_SECURE_CONNECTION
erase_bonds = erase_bonds_local;
#endif
// PHASE 6: BLE
// PHASE 6: BLE 스택
DBG_PRINTF("[5] BLE\r\n");
power_management_init();
@@ -1466,6 +1521,13 @@ int main(void)
ble_stack_init();
DBG_PRINTF(" stack OK\r\n");
// PHASE 6.5: 내장 Flash (FDS) - BLE 스택 이후에 초기화해야 함
DBG_PRINTF("[5.5] FDS\r\n");
fs_storage_init();
config_load();
load_flash_config();
DBG_PRINTF(" fds OK\r\n");
gap_params_init();
DBG_PRINTF(" gap OK\r\n");
@@ -1487,6 +1549,13 @@ int main(void)
peer_manager_init();
#endif
// PHASE 7.5: FDS 기본값 저장 (advertising 이후)
if (m_need_save_defaults) {
DBG_PRINTF("[FDS] Saving defaults after ADV\r\n");
config_save();
m_need_save_defaults = false;
}
// PHASE 8: 완료
DBG_PRINTF("\r\n========================================\r\n");
DBG_PRINTF(" READY [%s]\r\n", SERIAL_NO);