maa samples 140->100 변경, mec/maa 수신 시 Piezo 자동 Active/Sleep
- MAA_NUM_SAMPLES 140에서 100으로 변경 (DR_ADC_ECHO_SAMPLES_MAX 제한) - 단일(mec) 및 모든 채널(maa) 에코 캡처 명령 수신 시 Piezo 자동 Active, 응답 송신 후 Sleep - Cmd_mpa 중복 호출 정리 (dr_piezo_system_init 내부에 power_on 포함) - 채널별 디버그 로그 추가 - 코드 리뷰 주석 정리 및 기타 파일 업데이트 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,36 @@
|
||||
TEST medi50 Dec 23
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* @file fstorage.c
|
||||
* @brief FDS(Flash Data Storage) 기반 설정 저장 모듈
|
||||
*
|
||||
* 외부 EEPROM을 대체하여 nRF52840 내장 플래시에 장치 설정을 저장/로드한다.
|
||||
*
|
||||
* [레코드 관리]
|
||||
* - CONFIG_FILE = 0x8010, CONFIG_REC_KEY = 0x7010 으로 단일 레코드를 관리한다.
|
||||
*
|
||||
* [config_data_t 구조체 필드]
|
||||
* - magic(4B) : 포맷 확인용 매직 넘버 (MAGIC = 0x20231226)
|
||||
* - hw_no(12B) : 하드웨어 번호 (BLE 명령으로 설정)
|
||||
* - serial_no(12B) : 시리얼 번호 (기본값: "VB026030000")
|
||||
* - passkey(6B) : BLE 페어링용 정적 패스키
|
||||
* - bond_delete(1B) : 본딩 데이터 삭제 플래그
|
||||
* - reset_status(1B) : 리셋 상태 값
|
||||
* - pd_adc_cnt : 포토다이오드 ADC 측정 횟수
|
||||
* - pd_delay_us : 포토다이오드 측정 간 지연 시간(us)
|
||||
* - life_cycle : 장치 사용 횟수
|
||||
*
|
||||
* [매직 넘버 검증]
|
||||
* - 플래시에서 로드한 데이터의 magic 값이 0x20231226과 일치하는지 확인하여
|
||||
* 유효한 설정인지 판별한다. 불일치 시 기본값으로 초기화한다.
|
||||
*
|
||||
* [FDS 이벤트 후처리]
|
||||
* - FDS 쓰기/업데이트 완료 이벤트 수신 후, 대기 중인 후처리를 수행한다:
|
||||
* 전원 OFF (go_device_power_off), 슬립 진입 (go_sleep_mode_enter),
|
||||
* 시스템 리셋 (go_NVIC_SystemReset)
|
||||
*/
|
||||
|
||||
#include "sdk_config.h"
|
||||
|
||||
#include <string.h>
|
||||
@@ -27,23 +57,29 @@
|
||||
#include "debug_print.h"
|
||||
|
||||
|
||||
/* File ID and Key used for the configuration record. */
|
||||
/* FDS 레코드 식별자: 파일 ID와 레코드 키로 단일 설정 레코드를 관리 */
|
||||
|
||||
#define CONFIG_FILE (0x8010)
|
||||
#define CONFIG_REC_KEY (0x7010)
|
||||
|
||||
/* 매직 넘버: 플래시에 저장된 데이터가 유효한 설정인지 판별하는 데 사용 */
|
||||
#define CONFIG_MAGIC_NUMBER_VALUE (0x20231226)
|
||||
|
||||
/* 전역 설정 데이터 구조체 인스턴스 */
|
||||
config_data_t m_config;
|
||||
|
||||
extern bool go_device_power_off;
|
||||
extern bool go_sleep_mode_enter;
|
||||
extern bool go_NVIC_SystemReset;
|
||||
/* FDS 쓰기 완료 후 수행할 후처리 플래그 (main.c에서 선언) */
|
||||
extern bool go_device_power_off; /* 전원 OFF 요청 */
|
||||
extern bool go_sleep_mode_enter; /* 슬립 모드 진입 요청 */
|
||||
extern bool go_NVIC_SystemReset; /* 시스템 리셋 요청 */
|
||||
|
||||
/* Flag to check fds initialization. */
|
||||
/* FDS 초기화 완료 여부 플래그 (fds_evt_handler에서 true로 설정) */
|
||||
static bool volatile m_fds_initialized;
|
||||
|
||||
/* FDS 쓰기 진행 중 플래그: true이면 쓰기 완료 대기 중 */
|
||||
bool fds_flag_write = false;
|
||||
/* A record containing dummy configuration data. */
|
||||
|
||||
/* FDS에 기록할 레코드 템플릿 (m_config 데이터를 가리킴) */
|
||||
static fds_record_t const m_dummy_record =
|
||||
{
|
||||
.file_id = CONFIG_FILE,
|
||||
@@ -54,9 +90,16 @@ static fds_record_t const m_dummy_record =
|
||||
};
|
||||
|
||||
|
||||
int8_t reset_status_dflt = 99;
|
||||
uint8_t static_passkey_dflt[6] = "123456";
|
||||
/* 기본 설정값 상수 */
|
||||
int8_t reset_status_dflt = 99; /* 리셋 상태 기본값 */
|
||||
uint8_t static_passkey_dflt[6] = "123456"; /* BLE 패스키 기본값 */
|
||||
|
||||
/**
|
||||
* @brief 기본 설정값 초기화
|
||||
*
|
||||
* m_config 구조체의 각 필드를 공장 초기값으로 설정한다.
|
||||
* 플래시에 유효한 설정이 없거나 매직 넘버가 불일치할 때 호출된다.
|
||||
*/
|
||||
void fds_default_value_set(void)
|
||||
{
|
||||
/* HW Number - empty (set via BLE command) */
|
||||
@@ -84,8 +127,19 @@ void fds_default_value_set(void)
|
||||
}
|
||||
|
||||
|
||||
/* 마지막 FDS 이벤트 ID 저장 (디버깅용) */
|
||||
static volatile uint8_t fds_last_evt = 0xFF;
|
||||
|
||||
/**
|
||||
* @brief FDS 이벤트 콜백 핸들러
|
||||
*
|
||||
* FDS 내부에서 비동기 작업이 완료될 때 호출된다.
|
||||
* - FDS_EVT_INIT : FDS 초기화 완료 → m_fds_initialized 플래그 설정
|
||||
* - FDS_EVT_WRITE : 새 레코드 쓰기 완료 → fds_flag_write 해제
|
||||
* - FDS_EVT_UPDATE : 레코드 업데이트 완료 → fds_flag_write 해제 후
|
||||
* 대기 중인 전원 OFF / 슬립 진입 / 시스템 리셋 수행
|
||||
* - FDS_EVT_DEL_RECORD / FDS_EVT_DEL_FILE / FDS_EVT_GC : 현재 미사용
|
||||
*/
|
||||
static void fds_evt_handler( fds_evt_t const *p_evt )
|
||||
{
|
||||
fds_last_evt = p_evt->id;
|
||||
@@ -140,7 +194,13 @@ static void fds_evt_handler( fds_evt_t const *p_evt )
|
||||
}
|
||||
|
||||
|
||||
/**@brief Wait for fds to initialize. */
|
||||
/**
|
||||
* @brief FDS 초기화 완료 대기
|
||||
*
|
||||
* m_fds_initialized 플래그가 true가 될 때까지 대기한다.
|
||||
* 최대 3초(3000ms) 타임아웃이 설정되어 있으며,
|
||||
* 타임아웃 시 에러 로그를 출력하고 반환한다.
|
||||
*/
|
||||
static void wait_for_fds_ready( void )
|
||||
{
|
||||
uint32_t timeout = 0;
|
||||
@@ -157,6 +217,20 @@ static void wait_for_fds_ready( void )
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief FDS에서 설정 로드
|
||||
*
|
||||
* 플래시에서 CONFIG_FILE/CONFIG_REC_KEY 레코드를 검색하여 m_config에 로드한다.
|
||||
*
|
||||
* 동작 흐름:
|
||||
* 1. fds_record_find()로 레코드 검색 (실패 시 최대 10회 재시도, 100ms 간격)
|
||||
* 2. 레코드 발견 시:
|
||||
* - fds_record_open()으로 열기 (CRC 에러 시 삭제 후 기본값으로 재생성)
|
||||
* - 데이터를 m_config로 복사
|
||||
* - 매직 넘버 불일치 시 기존 레코드 삭제 → 기본값 설정 → 재기록
|
||||
* 3. 레코드 미발견 시:
|
||||
* - 기본값으로 새 레코드 생성 후 다시 로드
|
||||
*/
|
||||
void config_load( void )
|
||||
{
|
||||
ret_code_t rc;
|
||||
@@ -264,6 +338,21 @@ void config_load( void )
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 현재 설정을 FDS에 저장
|
||||
*
|
||||
* m_config의 내용을 플래시에 기록한다.
|
||||
*
|
||||
* 동작 흐름:
|
||||
* 1. 이전 FDS 쓰기 작업이 진행 중이면 최대 3초 대기
|
||||
* 2. 매직 넘버가 올바르지 않으면 보정
|
||||
* 3. 기존 레코드가 있으면 fds_record_update()로 갱신
|
||||
* - 플래시 공간 부족 시 GC(가비지 컬렉션) 수행 후 재시도
|
||||
* 4. 기존 레코드가 없으면 fds_record_write()로 새로 생성
|
||||
*
|
||||
* 참고: 쓰기 완료는 fds_evt_handler()에서 비동기로 처리되며,
|
||||
* 완료 후 전원 OFF/슬립/리셋 등의 후처리가 수행될 수 있다.
|
||||
*/
|
||||
void config_save( void )
|
||||
{
|
||||
ret_code_t rc;
|
||||
@@ -334,11 +423,25 @@ void config_save( void )
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief config_load()의 래퍼 함수
|
||||
*
|
||||
* 외부 모듈에서 설정 로드를 요청할 때 사용한다.
|
||||
*/
|
||||
void fs_set_value(void)
|
||||
{
|
||||
config_load();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief FDS 초기화
|
||||
*
|
||||
* 부팅 시 호출되어 FDS 모듈을 초기화한다.
|
||||
* 1. fds_register()로 이벤트 핸들러 등록
|
||||
* 2. fds_init()로 FDS 초기화 시작
|
||||
* 3. wait_for_fds_ready()로 초기화 완료 대기 (최대 3초)
|
||||
* 4. fds_stat()로 플래시 상태 확인
|
||||
*/
|
||||
void fs_storage_init(void)
|
||||
{
|
||||
ret_code_t rc;
|
||||
|
||||
Reference in New Issue
Block a user