주석 정리

This commit is contained in:
2026-07-21 14:41:33 +09:00
parent d3513e3985
commit 0fc578fb50
4 changed files with 35 additions and 31 deletions
+1 -1
View File
@@ -277,7 +277,7 @@ int cmd_maa(const uint8_t *data, uint8_t data_len)
if (status == ECHO_STATUS_OK) // Piezo GPIO, power, ADC initialization/wake succeeded if (status == ECHO_STATUS_OK) // Piezo GPIO, power, ADC initialization/wake succeeded
{ {
DBG_PRINTF("[MBB] piezo sweep start\r\n"); DBG_PRINTF("[MAA] piezo sweep start\r\n");
status = piezo_measure_sweep(); status = piezo_measure_sweep();
if (status == ECHO_STATUS_OK) if (status == ECHO_STATUS_OK)
{ {
-1
View File
@@ -688,7 +688,6 @@ int imu_fifo_read_latest(uint8_t *sample_bytes,
{ {
record_count = imu_fifo_compact_records(record_count); record_count = imu_fifo_compact_records(record_count);
DBG_PRINTF("[IMU FIFO] compact %u -> %u\r\n", raw_count, record_count);
} }
if (record_count > max_samples) if (record_count > max_samples)
{ {
+33 -28
View File
@@ -1,6 +1,12 @@
/******************************************************************************* /*******************************************************************************
* @file main.c * @file main.c
* @brief VesiScan-Basic * @brief VesiScan-Basic
*
* -
* -
* - NVS
* -
* - main loop
******************************************************************************/ ******************************************************************************/
#include <zephyr/kernel.h> #include <zephyr/kernel.h>
@@ -34,15 +40,19 @@ static bool resume_without_power_button; // 리셋 후 버튼 없이 복귀
static bool dfu_confirm_pending_boot; // DFU test 이미지 확인 전 자동 복귀 static bool dfu_confirm_pending_boot; // DFU test 이미지 확인 전 자동 복귀
static bool dfu_reset_resume_request; // DFU 완료 리셋 후 자동 복귀 static bool dfu_reset_resume_request; // DFU 완료 리셋 후 자동 복귀
static uint32_t boot_reset_reason; // RESETREAS 원본 값 static uint32_t boot_reset_reason; // RESETREAS 원본 값
/* 전원 유지 (POWER_HOLD) 제어 */
/* 부팅 후 전원 유지 판단 및 모듈 초기화 순서 조립 */
static void boot_context_detect(void) static void boot_context_detect(void)
{ {
// 부팅 원인 확인 // 부팅 원인 확인
boot_reset_reason = nrf_power_resetreas_get(NRF_POWER); boot_reset_reason = nrf_power_resetreas_get(NRF_POWER);
// DFU 완료 리셋인지 확인 // DFU rest (DFU 완료 후 재부팅)
// GPREGRET은 reset 후에도 유지되는 작은 상태 표시용 레지스터
#if NRF_POWER_HAS_GPREGRET #if NRF_POWER_HAS_GPREGRET
dfu_reset_resume_request = (nrf_power_gpregret_get(NRF_POWER, DFU_RESUME_GPREGRET_REG) == DFU_RESUME_MAGIC); dfu_reset_resume_request = (nrf_power_gpregret_get(NRF_POWER, DFU_RESUME_GPREGRET_REG) == DFU_RESUME_MAGIC);
// DFU reset 표시 확인 후 다음 부팅 오판 방지를 위해 정리
if (dfu_reset_resume_request) if (dfu_reset_resume_request)
{ {
nrf_power_gpregret_set(NRF_POWER, DFU_RESUME_GPREGRET_REG, 0U); nrf_power_gpregret_set(NRF_POWER, DFU_RESUME_GPREGRET_REG, 0U);
@@ -51,23 +61,25 @@ static void boot_context_detect(void)
dfu_reset_resume_request = false; dfu_reset_resume_request = false;
#endif #endif
// 소프트 리셋 계열 자동 복귀 // soft reset 후 복귀 (전원 버튼 새 부팅 X)
resume_without_power_button = (boot_reset_reason & (NRF_POWER_RESETREAS_SREQ_MASK | NRF_POWER_RESETREAS_DOG_MASK | NRF_POWER_RESETREAS_LOCKUP_MASK | NRF_POWER_RESETREAS_RESETPIN_MASK)) != 0U; resume_without_power_button = (boot_reset_reason & (NRF_POWER_RESETREAS_SREQ_MASK | NRF_POWER_RESETREAS_DOG_MASK | NRF_POWER_RESETREAS_LOCKUP_MASK | NRF_POWER_RESETREAS_RESETPIN_MASK)) != 0U;
// 다음 부팅 오판 방지를 위해 RESETREAS 플래그 정리
if (boot_reset_reason != 0U) if (boot_reset_reason != 0U)
{ {
// RESETREAS 플래그 정리
nrf_power_resetreas_clear(NRF_POWER, boot_reset_reason); nrf_power_resetreas_clear(NRF_POWER, boot_reset_reason);
} }
} }
/* NVS 값이 없을 때 사용할 기본값 초기화 (앱 전역 상태 기본값) - NVS 값이 있는 경우 이후 NVS 값으로 덮어씀 */
static void load_default_config(void) static void load_default_config(void)
{ {
// 기본 문자열 길이 제한 // 기본 문자열 길이 계산
size_t serial_len = strlen(SERIAL_NUMBER); size_t serial_len = strlen(SERIAL_NUMBER);
size_t hw_len = strlen(HARDWARE_VERSION); size_t hw_len = strlen(HARDWARE_VERSION);
size_t passkey_len = strlen(DEFAULT_PASSKEY); size_t passkey_len = strlen(DEFAULT_PASSKEY);
// 버퍼 오버플로우 방지 - 기본 문자열 길이 제한 (긴 경우 잘라내기)
if (serial_len > SERIAL_NO_LENGTH) if (serial_len > SERIAL_NO_LENGTH)
{ {
serial_len = SERIAL_NO_LENGTH; serial_len = SERIAL_NO_LENGTH;
@@ -83,6 +95,8 @@ static void load_default_config(void)
passkey_len = PASSKEY_LENGTH; passkey_len = PASSKEY_LENGTH;
} }
// 복사할 때 버퍼를 먼저 0으로 채우고 복사 -> 문자열 종료 NUL 보장
// 기본 Serial Number 복사
memset(SERIAL_NO, 0, sizeof(SERIAL_NO)); memset(SERIAL_NO, 0, sizeof(SERIAL_NO));
memcpy(SERIAL_NO, SERIAL_NUMBER, serial_len); memcpy(SERIAL_NO, SERIAL_NUMBER, serial_len);
@@ -94,39 +108,33 @@ static void load_default_config(void)
memset(m_static_passkey, 0, sizeof(m_static_passkey)); memset(m_static_passkey, 0, sizeof(m_static_passkey));
memcpy(m_static_passkey, DEFAULT_PASSKEY, passkey_len); memcpy(m_static_passkey, DEFAULT_PASSKEY, passkey_len);
// NVS 로드 전 기본값은 변경 가능 상태 m_passkey_changed = 0U; // 패스키 변경 여부 초기화
m_passkey_changed = 0U;
// 기본 상태값 m_reset_status = 1; // 기본 reset 상태 코드 설정
m_reset_status = 1; bond_data_delete = true; // 기본 상태는 bond 삭제 완료 삭제로 초기화
bond_data_delete = true;
DBG_CORE("[INIT] Default (S/N=%s)\r\n", SERIAL_NO); DBG_CORE("[INIT] Default (S/N=%s)\r\n", SERIAL_NO);
} }
/* 메인 함수 */
int main(void) int main(void)
{ {
// 리셋/복귀 컨텍스트
boot_context_detect(); boot_context_detect();
// 하드웨어 기본 초기화
#if defined(CONFIG_BOOTLOADER_MCUBOOT) #if defined(CONFIG_BOOTLOADER_MCUBOOT)
dfu_confirm_pending_boot = dfu_is_confirm_pending_boot(); dfu_confirm_pending_boot = dfu_is_confirm_pending_boot(); // MCUboot test 이미지 상태인지 확인
#else #else
dfu_confirm_pending_boot = false; dfu_confirm_pending_boot = false;
#endif #endif
power_control_latch_init(resume_without_power_button || dfu_confirm_pending_boot || dfu_reset_resume_request); power_control_latch_init(resume_without_power_button || dfu_confirm_pending_boot || dfu_reset_resume_request);
power_control_reset_state(); power_control_reset_state();
dfu_confirm_running_image();
DBG_CORE("\r\n========================================\r\n"); DBG_CORE("\r\n========================================\r\n");
DBG_CORE(" TEST BUILD %s (Zephyr)\r\n", FIRMWARE_VERSION); DBG_CORE(" TEST BUILD %s (Zephyr)\r\n", FIRMWARE_VERSION);
DBG_CORE(" BUILD TAG: %s\r\n", CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION); DBG_CORE(" BUILD TAG: %s\r\n", CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION);
DBG_CORE("========================================\r\n"); DBG_CORE("========================================\r\n");
DBG_CORE("[INIT] HW Init\r\n"); // 각 모듈 초기화
// 기본 하드웨어/센서 초기화
power_control_init(); power_control_init();
ble_cmd_queue_init(); ble_cmd_queue_init();
dfu_manager_init(); dfu_manager_init();
@@ -137,20 +145,17 @@ int main(void)
battery_timer_init(); battery_timer_init();
imu_init(); imu_init();
piezo_config_init(); piezo_config_init();
DBG_CORE("[INIT] HW - gpio/timer/config/led/batt/imu/temp/piezo-cfg OK\r\n");
// BLE 스택 + NUS // BLE Stack/NUS 초기화 (0=성공)
DBG_CORE("[INIT] BLE Init\r\n"); if (ble_service_init(ble_cmd_queue_rx_handler) == 0) // BLE RX 콜백은 command queue로 연결
if (ble_service_init(ble_cmd_queue_rx_handler) == 0)
{ {
DBG_CORE("[INIT] BLE - ble/nus OK\r\n"); // 버튼 없이 정상 ON 상태로 복구하는 경우
// 소프트 리셋 후 서비스 복구
if (resume_without_power_button || dfu_confirm_pending_boot || dfu_reset_resume_request) if (resume_without_power_button || dfu_confirm_pending_boot || dfu_reset_resume_request)
{ {
power_control_resume_after_reset(boot_reset_reason); power_control_resume_after_reset(boot_reset_reason);
} }
// BLE 준비까지 확인한 뒤 DFU test 이미지를 확정
dfu_confirm_running_image(); dfu_confirm_running_image(); // BLE 준비까지 확인한 뒤 DFU test 이미지 확정(confirm)
} }
else else
{ {
@@ -161,10 +166,10 @@ int main(void)
DBG_CORE(" READY [%s]\r\n", SERIAL_NO); DBG_CORE(" READY [%s]\r\n", SERIAL_NO);
DBG_CORE("========================================\r\n"); DBG_CORE("========================================\r\n");
// 전원 버튼 상태머신 시작 (부팅 시 버튼이 눌려있는 상태) power_control_start(); // 전원 버튼 상태머신 시작 (부팅 시 버튼이 눌려있는 상태)
power_control_start();
// 메인 루프 - idle // main loop - idle
// callback, work queue 기반 동작 유지
for (;;) for (;;)
{ {
k_msleep(100); k_msleep(100);
+1 -1
View File
@@ -364,7 +364,7 @@ void power_control_start(void)
k_timer_start(&m_power_on_delay_timer, K_MSEC(POWER_ON_DELAY), K_NO_WAIT); k_timer_start(&m_power_on_delay_timer, K_MSEC(POWER_ON_DELAY), K_NO_WAIT);
} }
/* 소프트 리셋/DFU 리셋 후 버튼 없이 ON 상태 복구 */ /* soft reset/DFU reset/test image 부팅 시 버튼 없이 정상 ON 상태 복구 */
void power_control_resume_after_reset(uint32_t reset_reason) void power_control_resume_after_reset(uint32_t reset_reason)
{ {
device_on = true; device_on = true;