Compare commits
3 Commits
ed3a8d7acd
...
dd3bce4f94
| Author | SHA1 | Date | |
|---|---|---|---|
| dd3bce4f94 | |||
| 9580bffa65 | |||
| e461f59a5f |
@@ -1,569 +0,0 @@
|
||||
# VesiScan-Basic 코드 리뷰 현황 보고서
|
||||
|
||||
작성일: 2026-03-17
|
||||
대상: VesiScan BASIC 펌웨어 전체 (nRF52840 + S140 SoftDevice)
|
||||
기준 문서: CODE_REVIEW.pdf (2026-03-15)
|
||||
현재 빌드: DEBUG_MINIMAL_BOOT=1, BLE_DEV_MODE=1
|
||||
|
||||
## 목차
|
||||
|
||||
1. 삭제 대상: 미사용 하드웨어 드라이버
|
||||
2. 삭제 대상: 미사용 코드
|
||||
3. DEBUG_MINIMAL_BOOT 조건부 컴파일 정리
|
||||
4. Keil 프로젝트 파일 정리
|
||||
5. 버그 및 오류 수정
|
||||
6. 저전력 최적화
|
||||
7. 코드 품질 개선
|
||||
8. 작업 우선순위 요약
|
||||
|
||||
---
|
||||
|
||||
## 1. 삭제 대상: 미사용 하드웨어 드라이버
|
||||
|
||||
### 1.1 회로 기반 분석
|
||||
|
||||
변경 없음. VB0HW0100 회로 기준 IC 목록은 CODE_REVIEW.pdf 1.1절과 동일.
|
||||
|
||||
### 1.2 회로에 없는 IC의 드라이버 (삭제 대상)
|
||||
|
||||
| 파일 | IC/기능 | 판정 | 현재 상태 |
|
||||
|------|--------|------|----------|
|
||||
| ad5272_i2c.c/h | AD5272 디지털 포텐시오미터 | 삭제 | **완료** |
|
||||
| ada2200_spi.c/h | ADA2200 동기 복조기 | 삭제 | **완료** |
|
||||
| mcp4725_i2c.c/h | MCP4725 DAC | 삭제 | **완료** |
|
||||
| mcp4725_adc.c/h | MCP4725 ADC 피드백 | 삭제 | **완료** |
|
||||
| ir_i2c.c/h | IR LED 센서 (0x50~0x57) | 삭제 | **완료** |
|
||||
| LED_Parse.c/h | LED ROM 파싱 | 삭제 | **완료** |
|
||||
|
||||
### 1.3 기능적으로 미사용인 드라이버 (삭제 대상)
|
||||
|
||||
| 파일 | 기능 | 판정 | 현재 상태 |
|
||||
|------|------|------|----------|
|
||||
| measurements.c/h | 레거시 측정 루프 | 삭제 | **완료** |
|
||||
| measurements_20.c/h | 20-샘플 측정 변형 | 삭제 | **완료** |
|
||||
| meas_pd_imm.c/h | 즉시 PD 측정 | 삭제 | **완료** |
|
||||
| meas_pd_buff.c/h | 버퍼드 PD 측정 | 삭제 | **완료** |
|
||||
| meas_pd_voltage_simple.c/h | 단순 전압 측정 | 삭제 | **완료** |
|
||||
| meas_pd_voltage_half.c/h | 반파 전압 측정 | 삭제 | **완료** |
|
||||
| meas_pd_voltage_full.c/h | 전파 전압 측정 | 삭제 | **완료** |
|
||||
| meas_pd_voltage_custom.c/h | 커스텀 전압 측정 | 삭제 | **완료** |
|
||||
| full_agc.c/h | 자동 이득 제어 | 삭제 | **완료** |
|
||||
| debuf_print.h | 오타 파일 | 삭제 | **완료** |
|
||||
|
||||
### 1.4 삭제 시 의존성 영향
|
||||
|
||||
cmd_parse.h에서 제거할 include 목록:
|
||||
|
||||
| include | 현재 상태 |
|
||||
|---------|----------|
|
||||
| #include "ir_i2c.h" | **완료** (제거됨) |
|
||||
| #include "ad5272_i2c.h" | **완료** (제거됨) |
|
||||
| #include "ada2200_spi.h" | **완료** (제거됨) |
|
||||
| #include "mcp4725_i2c.h" | **완료** (제거됨) |
|
||||
| #include "measurements.h" | **완료** (제거됨) |
|
||||
| #include "meas_pd_voltage_simple.h" | **완료** (제거됨) |
|
||||
| #include "meas_pd_voltage_half.h" | **완료** (제거됨) |
|
||||
| #include "meas_pd_voltage_full.h" | **완료** (제거됨) |
|
||||
| #include "full_agc.h" | **완료** (제거됨) |
|
||||
| #include "meas_pd_imm.h" | **완료** (제거됨) |
|
||||
|
||||
### 1.5 cat_interface.c (EEPROM 드라이버) 삭제 분석
|
||||
|
||||
#### 1.5.1 결론: EEPROM 삭제 완료, TWI는 i2c_manager.c로 통합
|
||||
|
||||
현재 상태: **완료** - jhChun 26.03.16
|
||||
|
||||
cat_interface.c 삭제(EEPROM/AES 코드 전체 삭제). TWI 인스턴스(m_twi) 및 초기화/해제 함수는 i2c_manager.c로 통합.
|
||||
|
||||
|
||||
#### 1.5.2 cat_interface.c가 제공하는 것
|
||||
|
||||
| 기능 | 판정 | 현재 상태 |
|
||||
|------|------|----------|
|
||||
| m_eeprom TWI 인스턴스 | i2c_manager.c로 이동, m_twi로 리네이밍 | **완료** |
|
||||
| eeprom_initialize() / uninitialize() | i2c_manager.c로 이동, twi_initialize/uninitialize로 리네이밍 (static) | **완료** |
|
||||
| eeprom_read/write_byte/word/page/bytes | 삭제 | **완료** |
|
||||
| eeprom_read/write_uint16_array | 삭제 | **완료** |
|
||||
| eeprom_read/write_uint32 | 삭제 | **완료** |
|
||||
| eeprom_write_encrypted() / read_decrypted() | 삭제 | **완료** |
|
||||
| encrypt_data() / decrypt_data() | 삭제 | **완료** |
|
||||
| aes_key[16], aes_iv[16] | 삭제 | **완료** |
|
||||
|
||||
#### 1.5.3 권장 작업
|
||||
|
||||
| # | 작업 | 현재 상태 |
|
||||
|---|------|----------|
|
||||
| 1 | TWI 인스턴스/init/uninit → i2c_manager.c로 통합 | **완료** |
|
||||
| 2 | m_eeprom → m_twi 리네이밍 | **완료** |
|
||||
| 3 | EEPROM read/write 전체 삭제, AES 전체 삭제 | **완료** |
|
||||
| 4 | cmd_parse.c EEPROM 호출 -> FDS 전환 | **완료** |
|
||||
| 5 | main.c 버튼 롱프레스 리셋: EEPROM -> FDS | **완료** |
|
||||
| 6 | power_control.c: cat_interface.h include 제거 | **완료** |
|
||||
|
||||
#### 1.5.4 cmd_parse.c EEPROM -> FDS 전환 목록
|
||||
|
||||
| EEPROM 호출 | 위치 | FDS 대체 방법 | 현재 상태 |
|
||||
|------------|------|------------|----------|
|
||||
| eeprom_init_values_read() | cmd_parse.c | 삭제 (FDS config_load 대체) | **완료** |
|
||||
| eeprom_write_byte(0x0070, m_pd_adc_cnt) | cmd_parse.c | m_config.pd_adc_cnt = val; config_save(); | **완료** |
|
||||
| eeprom_write_word(0x0080, m_pd_delay_us) | cmd_parse.c | m_config.pd_delay_us = val; config_save(); | **완료** |
|
||||
| eeprom_write_byte(0x0060, bond_data_delete) | cmd_parse.c | m_config.bond_data_delete = val; config_save(); | **완료** |
|
||||
| eeprom_write_byte(0x0065, m_reset_status) | cmd_parse.c | m_config.reset_status = val; config_save(); | **완료** |
|
||||
| eeprom_write_encrypted(0x0020, passkey, 6) | cmd_parse.c | memcpy(m_config.static_passkey, val, 6); config_save(); | **완료** |
|
||||
| eeprom_read_decrypted(0x0020, passkey, 6) | cmd_parse.c | memcpy(buf, m_config.static_passkey, 6); | **완료** |
|
||||
| eeprom_write_uint32(0x0090, m_life_cycle) | cmd_parse.c | m_config.life_cycle = val; config_save(); (FDS 필드 추가 완료) | **완료** |
|
||||
| eeprom_read_uint32(0x0090, &m_life_cycle) | cmd_parse.c | m_life_cycle = m_config.life_cycle; | **완료** |
|
||||
| eeprom_write/read_uint16_array(0x0480, ...) | cmd_parse.c | AGC gain — HW 제거됨, 명령 비활성화 | **완료** |
|
||||
|
||||
---
|
||||
|
||||
## 2. 삭제 대상: 미사용 코드
|
||||
|
||||
### 2.1 AES 암호화 (cat_interface.c)
|
||||
|
||||
판정 변경: 전체 삭제
|
||||
|
||||
| 항목 | 위치 | 판정 | 현재 상태 |
|
||||
|------|------|------|----------|
|
||||
| aes_key[16] 하드코딩 | cat_interface.c | 삭제 | **완료** |
|
||||
| aes_iv[16] (고정 IV = 0) | cat_interface.c | 삭제 | **완료** |
|
||||
| encrypt_data() | cat_interface.c | 삭제 | **완료** |
|
||||
| decrypt_data() | cat_interface.c | 삭제 | **완료** |
|
||||
| eeprom_write_encrypted() | cat_interface.c | 삭제 | **완료** |
|
||||
| eeprom_read_decrypted() | cat_interface.c | 삭제 | **완료** |
|
||||
|
||||
### 2.2 Serial Number / Passkey / HW Version 중복 선언 분석
|
||||
|
||||
| 데이터 | 전역 변수 (런타임) | FDS (내장 Flash) | EEPROM (외부, 제거됨) | 현재 상태 |
|
||||
|--------|----------------|----------------|-------------------|----------|
|
||||
| Serial Number | SERIAL_NO[12] | m_config.serial_no[12] | ~~addr 0x0030~~ | **EEPROM 경로 삭제 완료** |
|
||||
| Passkey | m_static_passkey[6] | m_config.static_passkey[6] | ~~addr 0x0020~~ | **EEPROM 경로 삭제 완료** |
|
||||
| HW Version | HW_NO[12] | m_config.hw_no[12] | ~~addr 0x0010~~ | **HW_NO 미삭제** |
|
||||
|
||||
권장 작업 현황:
|
||||
|
||||
| # | 작업 | 현재 상태 |
|
||||
|---|------|----------|
|
||||
| 1 | EEPROM 경로 삭제 -> eeprom_init_values_read() 삭제 | **완료** |
|
||||
| 2 | HW_NO[12] 삭제 -> m_config.hw_no 직접 사용 | **미완료** |
|
||||
| 3 | SERIAL_NO, m_static_passkey 유지 (BLE 스택 필요) | 해당없음 |
|
||||
| 4 | 데이터 흐름 단순화: FDS -> 전역변수 -> BLE 스택 | **미완료** |
|
||||
|
||||
### 2.3 미사용 전역 변수
|
||||
|
||||
| 변수 | 위치 | 판정 | 현재 상태 |
|
||||
|------|------|------|----------|
|
||||
| roles_str[] | main.c:189 | 삭제 | **미완료** |
|
||||
| m_encrypted_text[16] | main.c:194 | 삭제 | **미완료** |
|
||||
| m_encrypted_text2[16] | main.c:195 | 삭제 | **미완료** |
|
||||
| m_decrypted_text[16] | main.c:196 | 삭제 | **미완료** |
|
||||
| DEVICE_NAME | cmd_parse.c | 삭제 | **완료** (cmd_parse.c 삭제됨) |
|
||||
| HW_NO[12] | cmd_parse.c | 삭제 | **완료** (cmd_parse.c 삭제됨) |
|
||||
| AES_KEY_SIZE | main.c:154 | 삭제 | **미완료** |
|
||||
| AES_BLOCK_SIZE | main.c:155 | 삭제 | **미완료** |
|
||||
| suppress_unused_warnings() | main.c:239 | 삭제 | **미완료** |
|
||||
| c_addr[6] | main.c:187 | 삭제 | **미완료** |
|
||||
| led_pd_dac_v[LED_NUM] | 참조 다수 | 삭제 | 확인 필요 |
|
||||
|
||||
### 2.3.1 cmd_parse.c → parser.c 통합 현황
|
||||
|
||||
현재 구조: main.c → `dr_cmd_parser()` [parser.c] (cmd_parse.c 삭제 완료)
|
||||
|
||||
#### parser.c 명령어 테이블 (g_cmd_table)
|
||||
|
||||
| 태그 | 핸들러 | enabled | 기능 | 비고 |
|
||||
|------|--------|---------|------|------|
|
||||
| `cmd?` | Cmd_cmd | true | 핀 테스트 (sudo) | parser.c 신규 |
|
||||
| `mpa?` | Cmd_mpa | true | Piezo 활성화 | parser.c 신규 |
|
||||
| `mpb?` | Cmd_mpb | true | Piezo 비활성화 | parser.c 신규 |
|
||||
| `mpc?` | Cmd_mpc | true | Piezo Cycles 제어 | parser.c 신규 |
|
||||
| `mdc?` | Cmd_mdc | true | Piezo burst + Echo (12-bit) | parser.c 신규 |
|
||||
| `mec?` | Cmd_mec | true | Piezo burst + Echo (16-bit) | parser.c 신규 |
|
||||
| `maa?` | Cmd_maa | true | 8채널 전체 캡처 | parser.c 신규 |
|
||||
| `msp?` | Cmd_msp | true | IMU 6축 raw data | parser.c 신규 |
|
||||
| `mwh?` | Cmd_mwh | true | HW번호 쓰기 (FDS) | shz? 대체 |
|
||||
| `mws?` | Cmd_mws | true | 시리얼번호 쓰기 (FDS) | ssz? 대체 |
|
||||
| `mrh?` | Cmd_mrh | true | HW번호 읽기 (FDS) | siz? 대체 |
|
||||
| `mrs?` | Cmd_mrs | true | 시리얼번호 읽기 (FDS) | srz? 대체 |
|
||||
| `mpz?` | Cmd_mpz | true | 패스키 쓰기 (FDS) | **신규 추가** (spz? 대체) |
|
||||
| `mqz?` | Cmd_mqz | true | 패스키 읽기 | **신규 추가** (sqz? 대체) |
|
||||
| `mxz?` | Cmd_mxz | true | life_cycle 쓰기 (FDS) | **신규 추가** (sxz? 대체) |
|
||||
| `myz?` | Cmd_myz | true | life_cycle 읽기 | **신규 추가** (syz? 대체) |
|
||||
| `mta?` | Cmd_mta | true | 디바이스 상태 | sta? 리네이밍 |
|
||||
| `sta?` | Cmd_sta | true | 디바이스 활성화/슬립 | 레거시 호환 |
|
||||
| `str?` | Cmd_str | false | 디바이스 상태 읽기 | 미완성 (TODO) |
|
||||
| `mcj?` | Cmd_mcj | true | PD-ADC 풀 측정 | parser.c 신규 |
|
||||
| `scj?` | Cmd_mcj | true | mcj 호환 | 레거시 호환 |
|
||||
| `sej?` | Cmd_sej | true | PD-ADC 측정 | 레거시 호환 |
|
||||
| `ssj?` | Cmd_ssj | false | PD-ADC 측정 | 비활성 |
|
||||
| `msn?` | Cmd_msn | true | 배터리 측정 | ssn? 리네이밍 |
|
||||
| `ssn?` | Cmd_msn | true | 배터리 측정 | 레거시 호환 |
|
||||
| `spn?` | Cmd_spn | false | 압력 센서 측정 | 비활성 |
|
||||
| `sso?` | Cmd_sso | false | 온도 센서 측정 | 비활성 |
|
||||
| `ssp?` | Cmd_ssp | true | 모션 센서 raw data | 레거시 호환 |
|
||||
| `ssq?` | Cmd_ssq | false | 전원 OFF | 비활성 |
|
||||
| `ssr?` | Cmd_ssr | false | 본딩 삭제+리셋 | 비활성 |
|
||||
| `sss?` | Cmd_sss | false | 디바이스 리셋 | 비활성 |
|
||||
| `sst?` | Cmd_sst | false | Ready 응답 | 비활성 |
|
||||
| `mfv?` | Cmd_mfv | true | 펌웨어 버전 읽기 | ssv? 대체 |
|
||||
|
||||
#### cmd_parse.c 레거시 명령어 → parser.c 이전 완료
|
||||
|
||||
| 태그 | 기능 | 비고 |
|
||||
|------|------|------|
|
||||
| `spz?` | 패스키 쓰기 | → parser.c `mpz?`로 대체 완료 |
|
||||
| `sqz?` | 패스키 읽기 | → parser.c `mqz?`로 대체 완료 |
|
||||
| `sxz?` | life_cycle 쓰기 | → parser.c `mxz?`로 대체 완료 |
|
||||
| `syz?` | life_cycle 읽기 | → parser.c `myz?`로 대체 완료 |
|
||||
| `sez?` | AGC gain (stub) | cmd_parse.c와 함께 삭제 |
|
||||
| `sfz?` | AGC gain (stub) | cmd_parse.c와 함께 삭제 |
|
||||
| `ssv?` | 펌웨어 버전 | → parser.c `mfv?`로 대체됨 |
|
||||
| `ssz?` | 시리얼번호 쓰기 | → parser.c `mws?`로 대체됨 |
|
||||
| `srz?` | 시리얼번호 읽기 | → parser.c `mrs?`로 대체됨 |
|
||||
| `siz?` | HW번호 읽기 | → parser.c `mrh?`로 대체됨 |
|
||||
| `shz?` | HW번호 쓰기 | → parser.c `mwh?`로 대체됨 |
|
||||
|
||||
#### 통합 작업 현황
|
||||
|
||||
| # | 작업 | 현재 상태 |
|
||||
|---|------|----------|
|
||||
| 1 | parser.c에 누락 명령어 추가 (mpz/mqz/mxz/myz) | **완료** |
|
||||
| 2 | received_command_process() 래퍼를 main.c로 이동 | **완료** (cmd_parse.c 삭제됨) |
|
||||
| 3 | 전역 변수 (SERIAL_NO, m_static_passkey 등) main.c로 이동 | **완료** (cmd_parse.c 삭제됨) |
|
||||
| 4 | cmd_parse.h include 정리 (7개 파일) | **완료** (cmd_parse.h 삭제됨) |
|
||||
| 5 | cmd_parse.c / cmd_parse.h 삭제 | **완료** |
|
||||
| 6 | Keil 프로젝트 파일 업데이트 | **완료** |
|
||||
|
||||
### 2.4 주석 처리된 코드
|
||||
|
||||
| 위치 | 내용 | 판정 | 현재 상태 |
|
||||
|------|------|------|----------|
|
||||
| main_timer.c:37-88 | FEATURE_DETAIL_VALUE_FULL 주석 블록 | 삭제 | **미완료** |
|
||||
| cmd_parse.c:282-317 | serial_to_passkey_hash, test_eeprom_page_rw | 삭제 | **완료** (cmd_parse.c 삭제됨) |
|
||||
| cmd_parse.c:87-88 | pd_adc_half/full_a_start extern | 삭제 | **완료** (cmd_parse.c 삭제됨) |
|
||||
| battery_saadc.c:22 | //#include "fstorage.h" | 삭제 | **미완료** |
|
||||
|
||||
---
|
||||
|
||||
## 3. DEBUG_MINIMAL_BOOT 조건부 컴파일 정리
|
||||
|
||||
현재 DEBUG_MINIMAL_BOOT=1로 MINIMAL 모드만 사용. Full boot 경로는 실행되지 않음.
|
||||
|
||||
### 3.1 제거 대상 #if 블록
|
||||
|
||||
| 파일 | 블록 | 판정 | 현재 상태 |
|
||||
|------|------|------|----------|
|
||||
| main.c:280-281 | #if !DEBUG_MINIMAL_BOOT full_gpio_init() | 삭제 (함수 전체) | **미완료** |
|
||||
| main.c:354-355 | #if !DEBUG_MINIMAL_BOOT load_eeprom_config() | 삭제 (함수 전체, EEPROM 제거 완료) | **완료** (함수 삭제됨) |
|
||||
| main.c:1437-1439 | Full boot 경로 (ada2200_init, mcp4725_init 등) | 삭제 | **미완료** |
|
||||
| main.c GPIO init 분기 | GPIO init 분기 | MINIMAL 코드만 유지 | **미완료** |
|
||||
| power_control.c | Full boot power sequence | 삭제 (minimal 경로만 유지) | **미완료** |
|
||||
|
||||
### 3.3 DEBUG_MINIMAL_BOOT 제거 시 함께 정리
|
||||
|
||||
| 항목 | 현재 상태 |
|
||||
|------|----------|
|
||||
| #define DEBUG_MINIMAL_BOOT 1 삭제 (main.c:96) | **미완료** (여전히 활성) |
|
||||
| 모든 #if 조건 제거, MINIMAL 코드만 유지 | **미완료** |
|
||||
| BLE_DEV_MODE define 유지 | 해당없음 |
|
||||
|
||||
---
|
||||
|
||||
## 4. Keil 프로젝트 파일 정리
|
||||
|
||||
### 4.1 삭제할 소스 참조 (uvprojx)
|
||||
|
||||
현재 상태: **정리 불필요**
|
||||
|
||||
ble_app_bladder_patch_s140.uvprojx 확인 결과, 아래 삭제 대상 파일들은 이미 프로젝트에 등록되어 있지 않음:
|
||||
|
||||
- ad5272_i2c.c, ada2200_spi.c, mcp4725_i2c.c, mcp4725_adc.c
|
||||
- ir_i2c.c, LED_Parse.c, measurements.c, measurements_20.c
|
||||
- full_agc.c, meas_pd_voltage_custom.c, cat_interface.c
|
||||
|
||||
uvprojx 수정 작업 없음.
|
||||
|
||||
---
|
||||
|
||||
## 5. 버그 및 오류 수정
|
||||
|
||||
### 5.1 심각도 높음 (HIGH)
|
||||
|
||||
#### B1: BLE TX 큐 풀 시 APP_ERROR_CHECK로 인한 시스템 먹통 현상
|
||||
|
||||
파일: main.c (구 binary_tx_handler)
|
||||
|
||||
현재 상태: **완료**
|
||||
|
||||
- `binary_tx_handler()` 함수 본체 삭제
|
||||
- 모든 호출처를 `dr_binary_tx_safe()`로 교체 완료
|
||||
- parser.c (17곳)
|
||||
- battery_saadc.c (2곳)
|
||||
- app_raw.c (2곳)
|
||||
- tmp235_q1.c (1곳)
|
||||
- cmd_parse.c (22곳) → 이후 cmd_parse.c 삭제됨
|
||||
- main.h 선언 제거, dr_util.c/dr_adc121s051.c의 옛날 extern 선언 제거
|
||||
- `dr_binary_tx_safe()`는 NRF_ERROR_RESOURCES 시 최대 100회 재시도 후 패킷 드롭, 연결 에러 시 graceful 리턴
|
||||
- `data_tx_handler()`의 APP_ERROR_CHECK도 DBG_PRINTF로 교체 — 예상치 못한 에러 시에도 패킷 드롭 후 정상 동작 유지
|
||||
|
||||
#### B2: nrf_delay_ms(10) 블로킹 대기 (BLE TX)
|
||||
|
||||
파일: main.c:1221-1228
|
||||
|
||||
현재 상태: **완료**
|
||||
|
||||
조건문 로직이 정상 수정됨. NRF_ERROR_RESOURCES가 아닌 경우에만 delay 실행.
|
||||
|
||||
#### B3: extern + 초기화 동시 사용
|
||||
|
||||
파일: cmd_parse.c (삭제됨)
|
||||
|
||||
현재 상태: **완료**
|
||||
|
||||
`extern int8_t pd_adc_counts[4] = {8, 16, 24, 32};` 선언이 제거됨. 이후 cmd_parse.c 삭제.
|
||||
|
||||
#### B4: memset/memcpy 버퍼 크기 불일치 및 매직 넘버
|
||||
|
||||
파일: main.c config_apply_to_globals()
|
||||
|
||||
현재 상태: **완료**
|
||||
|
||||
- memset 오버런 수정: 하드코딩 `16` → `sizeof(SERIAL_NO)`, `PASSKEY_LENGTH` 사용
|
||||
- memcpy 매직 넘버 수정: 하드코딩 `12` → `sizeof(m_config.hw_no)`, `sizeof(m_config.serial_no)`, `sizeof(SERIAL_NO)` 등으로 교체
|
||||
- m_static_passkey memset/memcpy: `PASSKEY_LENGTH` define 활용
|
||||
|
||||
스택/힙 오버플로우로 인한 메모리 손상 가능성이 있는 심각한 버그.
|
||||
|
||||
#### B5: maa? 명령 err=2 (MAA_NUM_SAMPLES 초과)
|
||||
|
||||
파일: parser.c, dr_adc121s051.c
|
||||
|
||||
현재 상태: **완료** — jhChun 26.03.17
|
||||
|
||||
MAA_NUM_SAMPLES(140)이 DR_ADC_ECHO_SAMPLES_MAX(100)보다 커서 maa_async_start()에서 무조건 DR_ADC_ERR_INVALID_PARAM(err=2) 반환. MAA_NUM_SAMPLES를 100으로 변경하여 해결.
|
||||
|
||||
#### B5-2: mec/maa 명령 시 Piezo 전원 미관리
|
||||
|
||||
파일: parser.c, dr_adc121s051.c
|
||||
|
||||
현재 상태: **완료** — jhChun 26.03.17
|
||||
|
||||
- mec?, maa? 수신 시 `dr_piezo_is_power_on()` 확인 후 꺼져있으면 자동 `dr_piezo_system_init()` (Active)
|
||||
- mec: 응답 송신 후 즉시 `dr_piezo_power_off()` (Sleep)
|
||||
- maa: 비동기 완료 콜백에서 `dr_piezo_power_off()` (Sleep)
|
||||
- `dr_piezo_is_power_on()` 함수 신규 추가 (dr_piezo.c/h)
|
||||
|
||||
#### B5-3: Cmd_mpa dr_piezo_power_on() 중복 호출
|
||||
|
||||
파일: parser.c
|
||||
|
||||
현재 상태: **완료** — jhChun 26.03.17
|
||||
|
||||
`dr_piezo_power_on()` + `dr_piezo_system_init()` 둘 다 호출하고 있었으나, `dr_piezo_system_init()` 내부에 이미 `dr_piezo_power_on()`이 포함되어 있어 중복 제거.
|
||||
|
||||
### 5.2 심각도 중간 (MEDIUM)
|
||||
|
||||
#### B6: battery_event_handler에서 floating-point 연산
|
||||
|
||||
파일: battery_saadc.c:167
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
여전히 부동소수점 연산 사용 중:
|
||||
```c
|
||||
batt_lvl_in_milli_volt_1 = (batt_lvl_in_milli_volt_0) *1.42;
|
||||
```
|
||||
|
||||
수정 필요:
|
||||
```c
|
||||
batt_lvl_in_milli_volt_1 = (batt_lvl_in_milli_volt_0 * 142) / 100;
|
||||
```
|
||||
|
||||
#### B7: main_timer 단발 모드 문제
|
||||
|
||||
현재 상태: **해당없음** (의도적 설계로 판단)
|
||||
|
||||
#### B8: processing_start_tick 미사용
|
||||
|
||||
파일: cmd_parse.c:57
|
||||
|
||||
현재 상태: **완료** (cmd_parse.c 삭제됨)
|
||||
|
||||
#### B9: config_load() goto 기반 흐름
|
||||
|
||||
파일: fstorage.c:157-261
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
`goto cfg_load_start` 패턴이 여전히 존재. 3개의 goto 문과 2개의 레이블로 복잡한 흐름 유지 중. FDS 초기화 실패 시 무한 루프 가능성 여전.
|
||||
|
||||
### 5.3 심각도 낮음 (LOW)
|
||||
|
||||
#### B11: debuf_print.h 파일명 오타
|
||||
|
||||
현재 상태: **완료** (파일 삭제)
|
||||
|
||||
#### B12: 함수 중복 선언
|
||||
|
||||
파일: main.h:44-54
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
static 함수 프로토타입 6개가 헤더에 여전히 선언됨:
|
||||
- advertising_start (FEATURE_SECURE_CONNECTION 내)
|
||||
- t_power_off_timeout_handler
|
||||
- power_control_handler
|
||||
- main_s
|
||||
- PM_s
|
||||
- main_routine_handler
|
||||
|
||||
#### B13: LED_ALLOFF, PD_ALLOFF 매크로 정의 위치
|
||||
|
||||
현재 상태: 확인 필요
|
||||
|
||||
---
|
||||
|
||||
## 6. 저전력 최적화
|
||||
|
||||
### 6.1 현재 전력 구조 분석
|
||||
|
||||
변경 없음. CODE_REVIEW.pdf 6.1절과 동일.
|
||||
|
||||
### 6.2 개선 항목
|
||||
|
||||
#### P1: UART 비활성화 (가장 큰 절약 -- 예상 ~1mA 절감)
|
||||
|
||||
파일: main.c:1427
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
`uart_init()`이 무조건 호출됨. `#if BLE_DEV_MODE` 조건으로 감싸져 있지 않음.
|
||||
|
||||
수정 필요:
|
||||
```c
|
||||
#if BLE_DEV_MODE
|
||||
uart_init();
|
||||
#endif
|
||||
```
|
||||
|
||||
#### P2: SEGGER RTT 비활성화 (프로덕션)
|
||||
|
||||
파일: debug_print.h
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
`ENABLE_PRINTF`가 `1`로 하드코딩되어 있음. `BLE_DEV_MODE`와 연동되지 않음.
|
||||
|
||||
수정 필요:
|
||||
```c
|
||||
#if BLE_DEV_MODE
|
||||
#define ENABLE_PRINTF 1
|
||||
#else
|
||||
#define ENABLE_PRINTF 0
|
||||
#endif
|
||||
```
|
||||
|
||||
#### P3: 배터리 타이머 주기 최적화
|
||||
|
||||
파일: battery_saadc.c:48
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
`BATTERY_LOOP_INTERVAL = 5000ms` 고정. 동적 조절 로직 없음.
|
||||
|
||||
#### P4: IMU 타이머 조건부 시작
|
||||
|
||||
파일: main.c BLE 이벤트 핸들러
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
BLE_GAP_EVT_CONNECTED/DISCONNECTED 핸들러에 IMU 타이머 start/stop 로직 없음. BLE 미연결 시에도 IMU를 읽을 수 있는 상태.
|
||||
|
||||
#### P5: main_loop() 타이머 폴링 효율화
|
||||
|
||||
현재 상태: **미완료**
|
||||
|
||||
플래그 기반 폴링 패턴 그대로 유지 중.
|
||||
|
||||
#### P6: NRF_LOG 비활성화 고려
|
||||
|
||||
현재 상태: **미완료** (확인 필요)
|
||||
|
||||
### 6.3 예상 절감 효과
|
||||
|
||||
| 최적화 | 예상 절감 | 난이도 | 현재 상태 |
|
||||
|--------|----------|--------|----------|
|
||||
| P1: UART 비활성화 | ~1mA | 쉬움 | **미완료** |
|
||||
| P2: RTT 비활성화 | ~0.1-0.5mA | 쉬움 | **미완료** |
|
||||
| P4: IMU 타이머 조건부 시작 | ~41uA (미연결 시) | 쉬움 | **미완료** |
|
||||
| P3: 배터리 타이머 동적 | ~5uA | 보통 | **미완료** |
|
||||
| P5-A: 단발->직접호출 | 응답 개선 | 쉬움 | **미완료** |
|
||||
| P5-B: app_scheduler | 코드 품질 + 확장성 | 보통 | **미완료** |
|
||||
| P5-C: IMU FIFO+인터럽트 | 연속측정 시 ~50uA | 어려움 | **미완료** |
|
||||
| P6: NRF_LOG 비활성화 | ~10uA | 쉬움 | **미완료** |
|
||||
|
||||
---
|
||||
|
||||
## 7. 코드 품질 개선
|
||||
|
||||
### 7.1 구조 개선
|
||||
|
||||
| # | 항목 | 현재 상태 |
|
||||
|---|------|----------|
|
||||
| Q1 | main.h에서 static 함수 선언 제거 | **미완료** (6개 잔존) |
|
||||
| Q2 | cat_interface.c -> i2c_manager.c로 TWI 통합 | **완료** |
|
||||
| Q3 | extern 변수 과다 사용 | **미완료** (30개 이상) |
|
||||
| Q4 | main_timer.c main_loop() 플래그 기반 폴링 | **미완료** |
|
||||
| Q5 | 매직 넘버 제거 | **미완료** |
|
||||
|
||||
### 7.2 코딩 스타일
|
||||
|
||||
변경 없음. CODE_REVIEW.pdf 7.2절과 동일.
|
||||
|
||||
---
|
||||
|
||||
## 8. 작업 우선순위 요약
|
||||
|
||||
### 즉시 수정 (안전/안정성)
|
||||
|
||||
| # | 항목 | 심각도 | 현재 상태 |
|
||||
|---|------|--------|----------|
|
||||
| 1 | B4: memset/memcpy 버퍼 크기 불일치 및 매직 넘버 | CRITICAL | **완료** |
|
||||
| 2 | B1: BLE TX 큐 풀 시 시스템 먹통 (binary_tx_handler → dr_binary_tx_safe 교체) | HIGH | **완료** |
|
||||
| 3 | B2: BLE TX 에러 핸들링 로직 반전 | HIGH | **완료** |
|
||||
| 4 | B3: extern + 초기화 동시 사용 | HIGH | **완료** |
|
||||
| 5 | B5: maa? err=2 (MAA_NUM_SAMPLES > DR_ADC_ECHO_SAMPLES_MAX) | HIGH | **완료** |
|
||||
| 6 | B5-2: mec/maa Piezo 자동 전원 관리 | MEDIUM | **완료** |
|
||||
| 7 | B5-3: Cmd_mpa dr_piezo_power_on 중복 호출 | LOW | **완료** |
|
||||
|
||||
### 1차 정리 (미사용 코드/EEPROM 삭제)
|
||||
|
||||
| # | 항목 | 현재 상태 |
|
||||
|---|------|----------|
|
||||
| 5 | 미사용 HW 드라이버 삭제 (1.2절) | **완료** |
|
||||
| 6 | cat_interface.c EEPROM 기능 삭제 + TWI를 i2c_manager.c로 통합 (1.5절) | **완료** |
|
||||
| 7 | cmd_parse.c EEPROM 호출 -> FDS 전환 (1.5.4절) | **완료** |
|
||||
| 8 | cmd_parse.c → parser.c 통합 (2.3.1절) | **완료** |
|
||||
| 9 | 미사용 전역변수 + HW_NO 삭제 (2.2-2.3절) | **미완료** |
|
||||
| 10 | DEBUG_MINIMAL_BOOT 조건 제거 (3절) | **미완료** |
|
||||
| 11 | Keil uvprojx 소스 참조 제거 (4절) | 확인 필요 |
|
||||
| 12 | 주석 처리된 코드 삭제 (2.4절) | **미완료** |
|
||||
|
||||
### 2차 정리 (저전력 최적화)
|
||||
|
||||
| # | 항목 | 예상 절감 | 현재 상태 |
|
||||
|---|------|----------|----------|
|
||||
| 12 | P1: UART 비활성화 | ~1mA | **미완료** |
|
||||
| 13 | P2: RTT 비활성화 | ~0.1-0.5mA | **미완료** |
|
||||
| 14 | P4: IMU 타이머 BLE 연결 시에만 동작 | ~41uA | **미완료** |
|
||||
| 15 | P5-A: main_loop 단발 이벤트 직접 호출로 전환 | 응답 개선 | **미완료** |
|
||||
| 16 | P5-B: app_scheduler 도입 (선택) | 코드 품질 | **미완료** |
|
||||
| 17 | P3: 배터리 타이머 동적 조절 | ~5uA | **미완료** |
|
||||
|
||||
### 3차 정리 (코드 품질)
|
||||
|
||||
| # | 항목 | 현재 상태 |
|
||||
|---|------|----------|
|
||||
| 18 | Q1: main.h static 함수 제거 | **미완료** |
|
||||
| 19 | Q5: 매직 넘버 define화 | **미완료** |
|
||||
| 20 | B9: config_load() goto 제거 | **미완료** |
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -472,7 +472,10 @@ extern const nrfx_twi_t m_twi_icm42670;
|
||||
#define IMU_I2C_ADDR 0x68
|
||||
#define REG_ACCEL_X1 0x0B /* ACCEL_DATA_X1 — 가속도 X축 상위 바이트 레지스터 */
|
||||
|
||||
/* Direct IMU register read — raw I2C, no DRDY, sends rsp: via BLE */
|
||||
/* --------------------------------------------------------------------------------------
|
||||
* Direct IMU register read — raw I2C, no DRDY, sends rsp: via BLE
|
||||
* 직접 I2C로 레지스터 읽는 방식 (인터럽트 X, IMU 드라이버 API X)
|
||||
* -------------------------------------------------------------------------------------- */
|
||||
int imu_read_direct(void)
|
||||
{
|
||||
uint8_t raw[12]; /* 가속도 6바이트 + 자이로 6바이트 */
|
||||
@@ -512,12 +515,17 @@ int imu_read_direct(void)
|
||||
/* ACCEL_DATA_X1(0x0B)부터 12바이트 연속 읽기 (0x0B~0x16) */
|
||||
reg = REG_ACCEL_X1;
|
||||
ret = icm42670_twi_tx(IMU_I2C_ADDR, ®, 1, true); /* 레지스터 주소 전송 (STOP 없음) */
|
||||
if (ret) {
|
||||
|
||||
if (ret)
|
||||
{
|
||||
DBG_PRINTF("[IMU] tx FAIL %u\r\n", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = icm42670_twi_rx(IMU_I2C_ADDR, raw, 12); /* 12바이트 데이터 수신 */
|
||||
if (ret) {
|
||||
|
||||
if (ret)
|
||||
{
|
||||
DBG_PRINTF("[IMU] rx FAIL %u\r\n", ret);
|
||||
return -2;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,13 @@
|
||||
* @brief
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
* 2026.03.26 jhChun
|
||||
* 현재 이 파일은 실제 런타임에 실행되지 않고 있음
|
||||
* 인터럽트 방식 대신 app_raw.c imu_read_direct()에서 직접 레지스터 읽는 방식 사용 중
|
||||
* 추후 필요 여부에 따라 정리 예정
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
* [모듈 개요] ICM42670P 메인 초기화 및 폴링 루프
|
||||
*
|
||||
@@ -196,8 +203,7 @@ int icm42670_init(void)
|
||||
* 3) 플래그가 세팅되어 있으면 센서 데이터 읽기 (get_imu_data)
|
||||
* 4) 데이터 읽기 완료 후 플래그 클리어
|
||||
*
|
||||
* 참고: 인터럽트 기반 폴링 방식으로, ISR에서는 플래그만 세팅하고
|
||||
* 실제 I2C 통신은 메인 컨텍스트에서 수행한다.
|
||||
* 참고: 인터럽트 기반 폴링 방식으로, ISR에서는 플래그만 세팅하고 실제 I2C 통신은 메인 컨텍스트에서 수행한다.
|
||||
*/
|
||||
void icm42670_main(void)
|
||||
{
|
||||
|
||||
@@ -17,17 +17,12 @@
|
||||
* - 전원: POWER_HOLD(P0.8) 자가유지 회로, POWER_BUTTON(P1.8) 입력
|
||||
*
|
||||
* [소프트웨어 부트 시퀀스 — main() 함수]
|
||||
* Phase 0: 전원 유지 (power_hold_init → P0.8 HIGH)
|
||||
* Phase 1: UART 초기화 (1Mbps), 로그 초기화
|
||||
* Phase 2: GPIO 초기화 (DEBUG_MINIMAL_BOOT에 따라 분기)
|
||||
* Phase 3: 타이머 초기화 (app_timer, 배터리, 전원 시퀀스)
|
||||
* Phase 4: 설정 로드 (기본값 → FDS에서 덮어쓰기)
|
||||
* Phase 5: 버튼/LED BSP 초기화
|
||||
* Phase 6: BLE 스택 (SoftDevice → GAP → GATT → NUS → Advertising)
|
||||
* Phase 6.5: FDS(Flash Data Storage) 초기화 및 설정 로드
|
||||
* Phase 7: BLE 보안 (Peer Manager, LESC/정적 패스키)
|
||||
* Phase 8: 부트 완료 → 전원 버튼 상태머신(main_s) 시작
|
||||
* Phase 9: idle 루프 (nrf_pwr_mgmt_run)
|
||||
* Phase 1: 하드웨어 기본 (전원유지, 로그, GPIO, 타이머, 설정, 버튼/LED)
|
||||
* Phase 2: BLE 스택 (SoftDevice, 전원관리, DC-DC)
|
||||
* Phase 3: FDS + 설정 로드
|
||||
* Phase 4: BLE 프로토콜 (GAP, GATT, NUS, Advertising, 보안)
|
||||
* Phase 5: 애플리케이션 (파서, 피에조)
|
||||
* Boot 완료 → 전원 버튼 상태머신(main_s) → idle 루프
|
||||
*
|
||||
* [전원 버튼 상태머신 — main_s() 콜백, 5ms 간격]
|
||||
* - 짧은 눌림 (<1.5초, cnt_s<150): 전원 OFF
|
||||
@@ -42,8 +37,6 @@
|
||||
* 5. dr_binary_tx_safe()로 CRC16 추가 후 BLE 전송 (최대 100회 재시도)
|
||||
*
|
||||
* [빌드 모드]
|
||||
* DEBUG_MINIMAL_BOOT = 1 : 전원+BLE만 (센서/EEPROM 초기화 생략, 개발용)
|
||||
* DEBUG_MINIMAL_BOOT = 0 : 전체 초기화 (양산용)
|
||||
* BLE_DEV_MODE = 1 : 보안 없음 (빠른 페어링, 개발용)
|
||||
* BLE_DEV_MODE = 0 : 정적 패스키 + MITM 보호 (양산용)
|
||||
******************************************************************************/
|
||||
@@ -130,9 +123,9 @@
|
||||
|
||||
/*==============================================================================
|
||||
* 빌드 설정
|
||||
* DEBUG_MINIMAL_BOOT 삭제 26.03.26 jhChun
|
||||
*============================================================================*/
|
||||
#define BLE_DEV_MODE 1 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */
|
||||
#define DEBUG_MINIMAL_BOOT 1 /* 1: 최소 부팅 (전원+BLE만), 0: 전체 부팅 (센서 포함) */
|
||||
|
||||
/*==============================================================================
|
||||
* 하드웨어 핀 정의
|
||||
@@ -340,38 +333,20 @@ static void power_control_handler(on_off_cont_t device_power_st)
|
||||
*============================================================================*/
|
||||
|
||||
/**
|
||||
* @brief 최소 GPIO 초기화 (DEBUG_MINIMAL_BOOT 모드용)
|
||||
* @brief GPIO 초기화
|
||||
*
|
||||
* 전원 버튼 입력과 전원 유지 핀만 설정
|
||||
* 센서 관련 GPIO는 초기화하지 않음
|
||||
*/
|
||||
static void minimal_gpio_init(void)
|
||||
static void gpio_init(void)
|
||||
{
|
||||
nrf_gpio_cfg_input(POWER_BUTTON, NRF_GPIO_PIN_NOPULL);
|
||||
nrf_gpio_cfg_output(POWER_HOLD);
|
||||
nrf_gpio_pin_set(POWER_HOLD);
|
||||
power_gpio_init();
|
||||
|
||||
DBG_PRINTF("[GPIO] Minimal OK (BTN=%d)\r\n", nrf_gpio_pin_read(POWER_BUTTON));
|
||||
DBG_PRINTF("[GPIO] OK (BTN=%d)\r\n", nrf_gpio_pin_read(POWER_BUTTON));
|
||||
}
|
||||
|
||||
#if !DEBUG_MINIMAL_BOOT
|
||||
/**
|
||||
* @brief 전체 GPIO 초기화 (양산 모드, DEBUG_MINIMAL_BOOT=0)
|
||||
*
|
||||
* minimal_gpio_init()를 먼저 호출한 뒤, EEPROM 전원을 OFF하여
|
||||
* 불필요한 전력 소모를 방지한다.
|
||||
*/
|
||||
static void full_gpio_init(void)
|
||||
{
|
||||
minimal_gpio_init();
|
||||
|
||||
eeprom_control(OFF);
|
||||
|
||||
DBG_PRINTF("[GPIO] Full OK\r\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/*==============================================================================
|
||||
* 설정 로드
|
||||
* FDS(Flash Data Storage)에서 설정을 읽기 전에 기본값을 먼저 로드
|
||||
@@ -1085,9 +1060,6 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
|
||||
err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
|
||||
APP_ERROR_CHECK(err_code);
|
||||
|
||||
#if DEBUG_MINIMAL_BOOT
|
||||
DBG_PRINTF("[BLE] Minimal mode\r\n");
|
||||
#endif
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
|
||||
@@ -1647,30 +1619,12 @@ static void main_s(void * p_context)
|
||||
power_control_handler(ON);
|
||||
battery_timer_start();
|
||||
|
||||
#if DEBUG_MINIMAL_BOOT
|
||||
DBG_PRINTF("[BOOT] Minimal\r\n");
|
||||
#if FEATURE_SECURE_CONNECTION
|
||||
advertising_start(erase_bonds);
|
||||
#else
|
||||
advertising_start();
|
||||
#endif
|
||||
DBG_PRINTF("[BOOT] ADV started\r\n");
|
||||
#else
|
||||
DBG_PRINTF("[BOOT] Full\r\n");
|
||||
icm42670_init();
|
||||
nrf_delay_ms(2);
|
||||
|
||||
#if FEATURE_SECURE_CONNECTION
|
||||
advertising_start(erase_bonds);
|
||||
#else
|
||||
advertising_start();
|
||||
#endif
|
||||
|
||||
|
||||
m_reset_status = 1;
|
||||
m_config.reset_status = m_reset_status;
|
||||
config_save();
|
||||
#endif
|
||||
m_reset_status = 1;
|
||||
DBG_PRINTF("[BOOT] Ready\r\n");
|
||||
}
|
||||
@@ -1700,113 +1654,88 @@ int main(void)
|
||||
{
|
||||
bool erase_bonds_local = false;
|
||||
|
||||
// PHASE 0: 전원 유지
|
||||
/*──────────────────────────────────────────────────────────────
|
||||
* Phase 1: 하드웨어 기본 초기화 (BLE 무관)
|
||||
*────────────────────────────────────────────────────────────*/
|
||||
power_hold_init();
|
||||
|
||||
// PHASE 1: 기본 시스템
|
||||
if (power_off_duble_prohibit) return 0;
|
||||
cnt_s = 0;
|
||||
|
||||
//uart_init(); UART 비활성화
|
||||
log_init();
|
||||
|
||||
DBG_PRINTF("\r\n========================================\r\n");
|
||||
DBG_PRINTF(" Medithings v1.17 [%s]\r\n", DEBUG_MINIMAL_BOOT ? "MIN" : "FULL");
|
||||
DBG_PRINTF(" Medithings v1.17\r\n");
|
||||
DBG_PRINTF("========================================\r\n");
|
||||
DBG_PRINTF("[0] PWR_HOLD\r\n");
|
||||
|
||||
// PHASE 2: GPIO
|
||||
DBG_PRINTF("[1] GPIO\r\n");
|
||||
#if DEBUG_MINIMAL_BOOT
|
||||
minimal_gpio_init();
|
||||
#else
|
||||
full_gpio_init();
|
||||
#endif
|
||||
|
||||
DBG_PRINTF("[1] HW Init\r\n");
|
||||
gpio_init();
|
||||
info4 = false;
|
||||
|
||||
// PHASE 3: 타이머
|
||||
DBG_PRINTF("[2] Timers\r\n");
|
||||
timers_init();
|
||||
|
||||
// PHASE 4: 설정 (기본값 로드)
|
||||
DBG_PRINTF("[3] Config (defaults)\r\n");
|
||||
load_default_config();
|
||||
|
||||
// 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
|
||||
DBG_PRINTF(" gpio/timer/config/btn OK\r\n");
|
||||
|
||||
// PHASE 6: BLE 스택
|
||||
DBG_PRINTF("[5] BLE\r\n");
|
||||
|
||||
/*──────────────────────────────────────────────────────────────
|
||||
* Phase 2: BLE 스택 초기화
|
||||
*────────────────────────────────────────────────────────────*/
|
||||
DBG_PRINTF("[2] BLE Stack\r\n");
|
||||
power_management_init();
|
||||
DBG_PRINTF(" pwr OK\r\n");
|
||||
|
||||
ble_stack_init();
|
||||
DBG_PRINTF(" stack OK\r\n");
|
||||
APP_ERROR_CHECK(sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE)); /* DC-DC: SD 이후 필수 */
|
||||
DBG_PRINTF(" pwr/stack/dcdc OK\r\n");
|
||||
|
||||
/* nRF52840 내장 DC-DC 활성화 — SoftDevice 초기화 후 호출 필수 */
|
||||
APP_ERROR_CHECK(sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE));
|
||||
DBG_PRINTF(" dcdc OK\r\n");
|
||||
|
||||
// PHASE 6.5: 내장 Flash (FDS) - BLE 스택 이후에 초기화해야 함
|
||||
DBG_PRINTF("[5.5] FDS\r\n");
|
||||
/*──────────────────────────────────────────────────────────────
|
||||
* Phase 3: FDS + 설정 로드 (BLE 스택 이후에 초기화해야 함)
|
||||
*────────────────────────────────────────────────────────────*/
|
||||
DBG_PRINTF("[3] FDS\r\n");
|
||||
fs_storage_init();
|
||||
config_load();
|
||||
load_flash_config();
|
||||
DBG_PRINTF(" fds OK\r\n");
|
||||
|
||||
/*──────────────────────────────────────────────────────────────
|
||||
* Phase 4: BLE 프로토콜 (GAP/GATT/NUS/Advertising/보안)
|
||||
*────────────────────────────────────────────────────────────*/
|
||||
DBG_PRINTF("[4] BLE Protocol\r\n");
|
||||
gap_params_init();
|
||||
DBG_PRINTF(" gap OK\r\n");
|
||||
|
||||
gatt_init();
|
||||
DBG_PRINTF(" gatt OK\r\n");
|
||||
|
||||
services_init();
|
||||
DBG_PRINTF(" svc OK\r\n");
|
||||
|
||||
advertising_init();
|
||||
DBG_PRINTF(" adv OK\r\n");
|
||||
|
||||
conn_params_init();
|
||||
DBG_PRINTF(" conn OK\r\n");
|
||||
|
||||
// PHASE 7: 보안
|
||||
DBG_PRINTF("[6] Security\r\n");
|
||||
#if FEATURE_SECURE_CONNECTION
|
||||
peer_manager_init();
|
||||
#endif
|
||||
DBG_PRINTF(" gap/gatt/svc/adv/conn/sec OK\r\n");
|
||||
|
||||
// PHASE 7.5: FDS 기본값 저장 (advertising 이후)
|
||||
/* FDS 기본값 저장 (advertising 이후) */
|
||||
if (m_need_save_defaults) {
|
||||
DBG_PRINTF("[FDS] Saving defaults after ADV\r\n");
|
||||
config_save();
|
||||
m_need_save_defaults = false;
|
||||
DBG_PRINTF(" fds defaults saved\r\n");
|
||||
}
|
||||
|
||||
// PHASE 7.6: 새 파서(dr_cmd_parser) 초기화
|
||||
/*──────────────────────────────────────────────────────────────
|
||||
* Phase 5: 애플리케이션 초기화
|
||||
*────────────────────────────────────────────────────────────*/
|
||||
DBG_PRINTF("[5] App\r\n");
|
||||
g_plat.log = log_printf;
|
||||
g_plat.tx_bin = dr_binary_tx_safe;
|
||||
g_plat.crc_check = true;
|
||||
g_log_enable = true;
|
||||
DBG_PRINTF(" parser OK\r\n");
|
||||
dr_piezo_init();
|
||||
DBG_PRINTF(" parser/piezo OK\r\n");
|
||||
|
||||
// PHASE 7.7: 피에조 드라이버 초기화 (GPIO/GPIOTE/Timer/PPI + 전원)
|
||||
//dr_piezo_system_init();
|
||||
dr_piezo_init(); // Piezo 초기화 (Active X)
|
||||
DBG_PRINTF(" piezo OK\r\n");
|
||||
|
||||
// PHASE 8: 완료
|
||||
/*──────────────────────────────────────────────────────────────
|
||||
* Boot 완료 → 전원 버튼 상태머신 시작
|
||||
*────────────────────────────────────────────────────────────*/
|
||||
DBG_PRINTF("\r\n========================================\r\n");
|
||||
DBG_PRINTF(" READY [%s]\r\n", SERIAL_NO);
|
||||
DBG_PRINTF("========================================\r\n\r\n");
|
||||
|
||||
// PHASE 9: 시작
|
||||
timers_start();
|
||||
|
||||
// MAIN LOOP
|
||||
|
||||
@@ -101,7 +101,6 @@ void eeprom_control(on_off_cont_t eeprom_st)
|
||||
*/
|
||||
int device_sleep_mode(void){
|
||||
int rc = 0;
|
||||
eeprom_control(OFF); /* EEPROM 쓰기 보호 활성화 */
|
||||
nrf_delay_ms(2);
|
||||
DBG_PRINTF("Device_Sleep_Mode OK!\r\n");
|
||||
nrf_delay_ms(10);
|
||||
@@ -124,7 +123,6 @@ int device_activated(void){
|
||||
p_order = 0; /* 상태머신 시작 단계 (Step 0: I2C 초기화) */
|
||||
lock_check =true; /* 전원 시퀀스 진행 중 잠금 */
|
||||
power_timer_start(); /* 20ms 후 power_loop() 첫 호출 */
|
||||
eeprom_control(OFF); /* EEPROM OFF 상태로 시작 */
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -149,8 +147,7 @@ int device_activated(void){
|
||||
* 3) p_order < 2이면 다음 단계로 진행하고 타이머 재시작
|
||||
* 4) p_order == 2이면 전원 시퀀스 완료
|
||||
*
|
||||
* [DEBUG_MINIMAL_BOOT 모드]
|
||||
* 센서 초기화를 건너뛰고 즉시 완료 단계(Step 2)로 점프
|
||||
* 센서 초기화 불필요 — imu_read_direct()가 매 측정 시 자체 처리
|
||||
*/
|
||||
void power_loop(void *p_context)
|
||||
{
|
||||
@@ -158,39 +155,9 @@ void power_loop(void *p_context)
|
||||
|
||||
power_timer_stop(); /* 현재 타이머 정지 (싱글샷 → 수동 재시작 필요) */
|
||||
|
||||
#if DEBUG_MINIMAL_BOOT
|
||||
/* Minimal Boot: Skip sensor initialization */
|
||||
/* 미니멀 부트 모드: 센서 초기화 생략하고 바로 완료 */
|
||||
DBG_PRINTF("[PWR] Minimal mode - skipping sensor init\r\n");
|
||||
p_order = 2; // Jump to complete
|
||||
#else
|
||||
/* Full Boot: Execute power sequence */
|
||||
/* 풀 부트 모드: 전원 시퀀스 단계별 실행 */
|
||||
switch (p_order) {
|
||||
/* Step 0: I2C Initialize */
|
||||
/* 단계 0: I2C 버스를 SW 모드로 초기화 (레거시 흐름) */
|
||||
case 0:
|
||||
sw_i2c_init_once(); /* SW I2C 초기화 (TWI 해제 → 비트뱅 모드) */
|
||||
nrf_delay_ms(10); /* I2C 버스 안정화 대기 */
|
||||
DBG_PRINTF("[PWR] Step %d: I2C Init\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 1: Reserved */
|
||||
/* 단계 1: 예약 (추후 센서 초기화 등 추가 가능) */
|
||||
case 1:
|
||||
DBG_PRINTF("[PWR] Step %d: (reserved)\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 2: Complete */
|
||||
/* 단계 2: 전원 시퀀스 완료 → 디바이스 사용 준비 완료 */
|
||||
case 2:
|
||||
DBG_PRINTF("[PWR] Step %d: Sequence Complete\r\n", p_order);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
/* 센서 초기화 불필요 — imu_read_direct()가 매 측정 시 자체 처리 */
|
||||
/* 추후 전원 시퀀스 단계가 필요하면 여기에 switch(p_order) 추가 */
|
||||
p_order = 2;
|
||||
|
||||
/* Advance to next step or finish */
|
||||
/* 다음 단계로 진행하거나, 시퀀스 완료 처리 */
|
||||
|
||||
Reference in New Issue
Block a user