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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user