# VivaMyo - BLE NIRS Firmware

nRF52840 기반 BLE 의료기기 펌웨어. 방광 모니터링을 위한 NIRS(Near-Infrared Spectroscopy) 장치.

## 주요 사양

| 항목 | 사양 |
|------|------|
| MCU | Nordic nRF52840 |
| SoftDevice | s140 v7.2.0 |
| 통신 | BLE 5.0 (Nordic UART Service) |
| 보안 | LESC 페어링, Static Passkey |
| 센서 | LED x48, Photodetector, IMU (ICM42670P), 온도 (TMP235), 압력 |
| 저장 | 내장 Flash (FDS) + 외장 Flash (W25Q32RV) |
| IDE | Keil uVision 5 (ARM Compiler 5) |

## 디렉토리 구조

```
mt_VivaMayo/
│
├── project/ble_peripheral/ble_app_vivaMayo/    # 메인 펌웨어 소스
│   ├── main.c                                   # 엔트리 포인트
│   ├── main.h
│   ├── main_timer.c/h                           # 타이머 관리
│   ├── fstorage.c/h                             # FDS 내장 Flash 저장
│   ├── cmd_parse.c/h                            # 명령어 파서 래퍼
│   ├── cmd/
│   │   ├── cmd.c                                # BLE 명령어 핸들러 (mr*/mw* 포함)
│   │   └── cmd.h
│   ├── ble/                                     # BLE 코어, 데이터 전송, 보안
│   │   ├── ble_core.c/h
│   │   ├── ble_data_tx.c/h
│   │   ├── ble_security.c/h
│   │   └── ble_services.c/h
│   ├── storage/                                 # 메모리 추상화 API
│   │   ├── dr_mem.c/h                           # 이름 기반 메모리 읽기/쓰기
│   │   └── mem_*.c/h                            # 메모리 HAL
│   ├── config/
│   │   ├── device_config.c/h                    # 부팅 시 디바이스 설정 로드
│   │   └── sdk_config.h                         # (pca10056/s140/config/)
│   ├── drivers/w25q32/                          # W25Q32 외장 Flash SPI 드라이버
│   ├── power/                                   # 전원 제어, 슬립 모드
│   ├── peripheral/                              # UART 핸들러
│   ├── icm42670p/                               # IMU 센서 드라이버 (InvenSense)
│   ├── docs/                                    # 기술 문서
│   │   ├── PROGRAM_ARCHITECTURE.md
│   │   ├── FDS_INTERNAL_FLASH.md
│   │   ├── FDS_MODULE_PORTING_GUIDE.md
│   │   ├── W25Q32RV_FLASH_MEMORY.md
│   │   └── W25Q32RV_INITIALIZATION.md
│   └── pca10056/s140/arm5_no_packs/             # Keil 프로젝트
│       └── ble_app_VivaMayo.uvprojx
│
├── project/dfu/                                 # DFU 부트로더
│   ├── private_key.c
│   └── secure_bootloader/
│
├── lib/pc_firm/                                 # 공용 라이브러리 (pc_firm)
│   ├── parser.c/h                               # 명령어 파서 코어
│   ├── dr_util/                                 # BLE 응답 유틸 (dr_ble_return_*)
│   ├── dr_adc121s051/                           # ADC 드라이버
│   ├── ble_security/                            # BLE 보안 (quick pairing)
│   └── storage/                                 # 메모리 추상화 (EEPROM/Flash HAL)
│
├── components/                                  # Nordic SDK - BLE, 라이브러리
├── modules/                                     # Nordic SDK - nrfx 드라이버
├── external/                                    # Nordic SDK - 외부 라이브러리
├── integration/                                 # Nordic SDK - nrfx 통합
│
├── pads/                                        # PCB 패드 파일
├── sch/                                         # 회로도
└── README.md
```

## 빌드 방법

1. 이 저장소 clone
2. Keil uVision 5에서 `project/ble_peripheral/ble_app_vivaMayo/pca10056/s140/arm5_no_packs/ble_app_VivaMayo.uvprojx` 열기
3. Keil Include Path에서 `mt_parser` 경로를 `lib/pc_firm`으로 변경 (필요 시)
4. Build (F7)

> **Note**: Nordic SDK (components, modules, external, integration)와 pc_firm 라이브러리가 모두 포함되어 있어 clone만으로 빌드 가능합니다.

## 부팅 순서

```
GPIO/Timer 초기화
    → BLE Stack (SoftDevice)
    → FDS 초기화 (fs_storage_init)
    → Config 로드 (config_load + load_device_configuration)
    → GAP/GATT/Services
    → Advertising 시작
    → Main Loop (idle)
```

## BLE 명령어 (메모리 읽기/쓰기)

| 읽기 | 쓰기 | 대상 | 저장소 |
|------|------|------|--------|
| `mrh?` | `mwh?` | HW 번호 (12B) | FDS |
| `mrs?` | `mws?` | 시리얼 번호 (12B) | FDS |
| `mrp?` | `mwp?` | 패스키 (6B) | FDS |
| `mrb?` | `mwb?` | 본딩 삭제 플래그 | FDS |
| `mrr?` | `mwr?` | 리셋 상태 | FDS |
| `mrc?` | `mwc?` | ADC 카운트 | FDS |
| `mrd?` | `mwd?` | PD 딜레이 | FDS |
| `mrg?` | `mwg?` | AGC 게인 (48ch) | W25Q32 |
| `mrl?` | `mwl?` | 사용 횟수 | W25Q32 |

## 기술 문서

- [프로그램 아키텍처](project/ble_peripheral/ble_app_vivaMayo/docs/PROGRAM_ARCHITECTURE.md)
- [FDS 내장 Flash 사용법](project/ble_peripheral/ble_app_vivaMayo/docs/FDS_INTERNAL_FLASH.md)
- [FDS 모듈 이식 가이드](project/ble_peripheral/ble_app_vivaMayo/docs/FDS_MODULE_PORTING_GUIDE.md)
- [W25Q32 외장 Flash](project/ble_peripheral/ble_app_vivaMayo/docs/W25Q32RV_FLASH_MEMORY.md)
- [W25Q32 초기화](project/ble_peripheral/ble_app_vivaMayo/docs/W25Q32RV_INITIALIZATION.md)

## 라이선스

Copyright (c) 2025 Medithings Inc. All rights reserved.
