chore: HERV 통합 저장소 재초기화 커밋

손상된 .git 히스토리(missing tree)로 재초기화 후 작업트리 전체 커밋.
.claude/ 만 제외(로컬 에이전트 설정). 구 저장소 백업(.git_corrupt_backup/) 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jeon
2026-06-16 09:29:03 +09:00
commit a502322188
630 changed files with 65126 additions and 0 deletions
+110
View File
@@ -0,0 +1,110 @@
# 소스 ↔ 개발사양서 비교 분석
- **작성일**: 2026-06-02
- **대상 사양서**: `각실제어시스템_개발사양서_DL_동작로직_260318.pptx` (2026.03.18, 전경선 수석)
- **대상 소스**: `d:\project\nuvoton\HERV\program\User\` (Nuvoton NANO100SE3BN, arm-gnu-gcc 빌드)
- **시스템**: 각실제어 시스템(DL) — ERV 본체 + 각실 디퓨저(거실=room1, 침실1~3=room2~4)
> 검증 방식: 핵심 불일치 항목(쾌적조리 풍량, 스마트수면, 공기질 색상등급)은 소스 직접 확인,
> 광범위 항목은 다중 탐색으로 수집 후 교차 확인.
---
## 1. 요약 (Conclusion)
| 구분 | 항목 수 | 비고 |
|------|--------|------|
| ✅ 일치 | 9 | 센서 임계값, 집중/전실 판정, 안심회복, LED 등 |
| ❌ 불일치/미반영 | 3 | 쾌적조리 풍량, 스마트수면 26.03.18 개정, 공기질 색상등급 |
| ⚠️ 확인 필요 | 2 | 팬 VSP 4단/공청 값, 센서 주기 |
---
## 2. ✅ 일치하는 항목
| 사양 항목 | 사양값 | 코드 | 위치 |
|---|---|---|---|
| 센서→풍량단계 임계값 (슬라이드5) | CO2 600/700/800/900, VOC 250/300/350/400, PM2.5 15/30/50/70 | `m_CO2/VOC/PM2_5_Level_1~4` 기본값 동일 (CO2는 히스테리시스 50 적용) | `My_Uart.c:1313-1326` |
| 3종 센서 Max로 풍량 결정 | 최대 등급 채택 | CO2\|VOC\|PM2.5 OR 비트 → 0~4단 | `My_system.c:890-935` |
| 집중/전실 판정 | [최대−2번째]≥2 → 집중 | `(vars[0].value - vars[1].value) >= 2` | `My_system.c:1080, 1108` |
| 집중모드 최소시간 | 5분 (최신) | `Focus_Mode_RunTime = 3000` (=5분, 100ms×3000) | `My_system.c:1087, 1115` |
| 풍량 최대 4단 | 4단 | `if(Tmp_Air_Volume>4)=4` | `My_system.c:1179` |
| 안심회복 모드 | 침실1 음압(급기X/배기O), 타실 급기O/배기X, **2단** | 선택실 SA=0/RA=110, 타실 SA=110/RA=0, `Set_Fan_Mode=2` | `My_system.c:732-770` |
| 디퓨저 LED | 댐퍼 1개라도 열리면 ON, 밝기 0~9 | SA\|RA≠0 → ON, `Light_Bright` 0~9 | `My_system.c:714-724` |
| 공청 시 배기팬 OFF | 공청=급기만 | 공청 1~4단 EA팬 duty=0 | `MyMotor.c:1294-1307` |
| 팬 VSP 기본값(환기 1~3단) | 슬라이드13: 1단 EA56/SA57, 2단 65/67, 3단 72/75 | `s_FAN2/1_VEN_*` 동일값 | `MyControl.c:124-152` |
### 안심회복 모드 상세 (사양 대비 정확 일치)
- 사양: 급기(SA) 거실O 침실1X 침실2O 침실3O / 배기(RA) 거실X 침실1O 침실2X 침실3X, 환기 2단
- 코드: 전실 SA=110/RA=0으로 초기화 후 `Ext_Select_Room`(침실1)만 SA=0/RA=110 역전 → 사양과 동일
---
## 3. ❌ 불일치 / 미반영 항목 (소스 직접 확인)
### 3.1 쾌적조리 모드 ERV 풍량 — 사양 3단 vs 코드 **4단**
- 사양(슬라이드9): "H-ERV 환기모드, 풍량 **3단계** (전실 급기 댐퍼 ON)"
- 코드: `Tmp_Air_Volume = 4;`**4단** (`My_system.c:1030`)
- 운전모드도 사양은 환기모드(MODE_VENTILATION)이나 코드는 `Set_Run_Mode = MODE_AUTO` (`My_system.c:1026`)
- 급기 전실 ON / 배기 전실 OFF, 후드 3단 연동(`Hood_Fan_Mode=3`)은 일치
### 3.2 스마트수면 모드 — 26.03.18 개정분 **미반영** (코드는 구버전 로직)
이력관리 "2026.03.18 자동, 수면 모드 수정(9P)" 항목이 코드에 미적용:
| 26.03.18 사양 | 코드 현재 | 위치 |
|---|---|---|
| 풍량 **1단 고정** | `if(Tmp_Air_Volume>=2) Tmp_Air_Volume-=1` (자동값 1, 구버전) | `My_system.c:1191-1200` |
| 초기 **거실 CLOSE / 침실1~3 OPEN** | 전용 댐퍼 패턴 **없음** | - |
| **1시간마다 CO2≥1000 OPEN** | 미구현 (일반 focus mode `vars 차이≥2`만 사용) | `My_system.c:1080` |
- 진입부(`Ext_Run_Mode==4`)는 `Set_Fan_Mode=1` 설정하나, 이후 PASS_VOLUME에서 매 주기 센서값 재계산 후 −1 → 실제로는 "자동−1"로 동작.
### 3.3 공기질 색상등급(슬라이드6, 26.03.18) — **전체 비활성(dead code)**
- `Air_Quality_color_process()` 시작부 `return(0);` 로 즉시 반환 → 색상/문구(좋음·보통·나쁨·매우나쁨) 로직 전부 미동작 (`My_system.c:1216`)
- 임계값도 슬라이드6(CO2 700/1000/1300)이 아니라 `m_Level`(600/700/800/900) 기준으로 작성됨 → 살리더라도 26.03.18 등급표와 불일치
---
## 4. ⚠️ 확인·주의 필요
### 4.1 팬 VSP 4단 / 공청 값
- 환기 4단: 코드 SA87/EA84 vs 슬라이드13 SA95/EA92 (단 슬라이드14·15 실측은 86/85 — "4단 250→230CMH 소음저감"(25.10.17) 반영값에 근접)
- 공청: 코드 SA 46/51/56/60 vs 사양 전압표 SA 66/70/77 → 상이
- 이 값들은 VSP 테스트모드 + EEPROM으로 **현장 튜닝**되는 값이라 컴파일 기본값과 사양 실측표 차이는 정상일 수 있음. **EEPROM 저장값 별도 확인 권장**
### 4.2 센서 주기
- 사양: "센서 주기 30초 단위"
- 코드: 분배기 폴링 1초(`InCom_polling_timer=100`×10ms) → SEN66 내부 측정주기와 폴링주기 구분 확인 필요
---
## 5. 🔗 직전 작업(CVnet 삭제)과의 연관 — DL_Sinario 처리
- 월패드→각실 시나리오 명령 `DL_Sinario_Process()`(CMD 0~5: 전실/침실 급배기 패턴)는 **CVnet 홈넷통신으로만 트리거**되던 코드.
- 2026-06-02 작업에서 CVnet 삭제 → DL_Sinario가 dead code가 되어 **`DL_Sinario_Process()` 및 관련 참조 일괄 제거 완료**.
- 제거: `My_system.c`(함수+`DL_Sinario_CMD`), `My_Uart.c`(0x61 호출부+extern), `My_define.h`(extern)
- 안심회복/쾌적조리/스마트수면(`Ext_Run_Mode`)은 룸콘 "S Mode Select" 경로라 영향 없음.
- ※ 월패드(씨브이넷) 기반 각실 제어가 사양상 필요하면 CVnet 삭제와 충돌 → 방향 재확인 필요.
---
## 6. 후속 작업 후보(TODO)
1. 쾌적조리 ERV 풍량 4단 → **3단** 수정 (`My_system.c:1030`, 운전모드 검토)
2. 스마트수면 26.03.18 로직 구현 (1단 고정 / 거실 CLOSE·침실 OPEN / 1시간마다 CO2≥1000 OPEN)
3. 공기질 색상등급(`Air_Quality_color_process`) 활성화 + 슬라이드6 임계값 반영
4. 팬 VSP 4단/공청 EEPROM 저장값 확인
5. 260520(5월판) 사양서와 추가 비교
---
## 부록. 주요 소스 위치
| 파일 | 역할 |
|------|------|
| `My_system.c` | 모드 제어(`Ext_Run_Mode`), 센서→풍량/색상, 집중/전실, 팬 duty 변환 |
| `My_Uart.c` | 센서 임계값/기본값, 분배기 파싱, VSP 테스트, PC 메뉴 |
| `MyMotor.c` | 디퓨저 댐퍼(`Diffuser_Damper_process`), 팬 속도(`Fan_Speed_*`), BLDC_SPEED_TABLE |
| `MyControl.c` | 팬 duty 기본값 / EEPROM 저장·로드 |
| `My_define.h` | 모드·핀·EEPROM 주소 정의 |
| `My_RJ2.c` | 룸콘(232) 프로토콜, VSP 모드, Set_Run/Fan_Mode |
+116
View File
@@ -0,0 +1,116 @@
# 소스 ↔ 개발사양서 비교 분석 (260520)
- **작성일**: 2026-06-02
- **대상 사양서**: `각실제어시스템_개발사양서_DL_동작로직_260520.pptx` (2026.05.20, 전경선 수석)
- **대상 소스**: `d:\project\nuvoton\HERV\program\User\` (Nuvoton NANO100SE3BN, arm-gnu-gcc 빌드)
- **시스템**: 각실제어 시스템(DL) — ERV 본체 + 각실 디퓨저(거실=room1, 침실1~3=room2~4)
- **연관 문서**: `260602_소스_개발사양서_260318.md`
> 검증 방식: 핵심 항목(자동모드 풍량 산출, 쾌적조리, 스마트수면)은 소스 직접 확인.
---
## 0. 260318 → 260520 주요 변경점
- 이력관리에 **"2026.05.20 동작로직 수정 (26.04.28 DL 자료 기반) (9~10P)"** 추가
- **자동모드 로직 전면 개편** (슬라이드9~10):
- 부하점수(Score) 기반 풍량 단수 결정
- Eco / Normal / Turbo 모드별 임계값 (3세트)
- **4종 센서** (CO2 / PM2.5 / PM10 / VOC) — PM10 추가
- **거실 가중치 및 P_max 강제보상 삭제** → 점수 기반으로 직관적 동작
- 히스테리시스(데드밴드) 모드·센서별 정의
- 용어 변경: 전실모드 → **분산모드**, 집중급기 → **집중모드**
- 배선도: 각실분배기 PBA가 휴벤ECO에 부착, AC전원 2구 필요
---
## 1. ✅ 일치 (260318과 동일 유지)
| 항목 | 사양(260520) | 코드 | 위치 |
|---|---|---|---|
| 집중/분산 판정 | dP = P_max P_2nd ≥ 2 → 집중, 아니면 분산, P_max=0 → 전체 OFF | `(vars[0].value - vars[1].value) >= 2` (qsort 내림차순) | `My_system.c:972, 1080` |
| 집중 시 댐퍼 | P_max 실만 ON(100%), 나머지 OFF | Focus_Mode 시 Focus_Room만 110, 타실 0 | `My_system.c:1126~` |
| 안심회복 | 침실1 음압(급기X/배기O), 환기 2단 | 선택실 SA=0/RA=110, 타실 SA=110/RA=0, Fan=2 | `My_system.c:732-770` |
| 공청 PM2.5 단계 | 0~14정지 / 15~29 / 30~49 / 50~69 / 70~ | `m_PM2_5_Level` 15/30/50/70 | `My_Uart.c:1323-1326` |
| 풍량 CMH | 환기 100/150/200/250, 공청 80/100/120/150, 바이패스 150 | 단계 구조 동일, 공청 EA팬 OFF | `MyMotor.c:1294-1307` |
| 디퓨저 LED | 댐퍼 1개라도 열리면 ON, 0~9 디밍, 단색 | SA\|RA≠0 → ON, `Light_Bright` 0~9 | `My_system.c:714-724` |
| 팬 VSP(환기 1~3단) | 1단 EA56/SA57, 2단 61/63, 3단 67/69 | `s_FAN*_VEN_*` 동일 | `MyControl.c:124-152` |
---
## 2. ❌ 핵심 불일치 — 자동모드 로직(26.04.28 개정) 미반영
현재 코드는 **개정 전(점수기반 이전) 로직**으로, 사양이 삭제하라고 명시한 P_max 기반 동작이 남아 있음.
### 2.1 풍량 단수 산출 방식 상이 (가장 큰 차이)
- **사양 260520**: 부하점수 Score = 4실 Level 합산(0~16) →
**0: OFF / 1~4: 1단 / 5~8: 2단 / 9~12: 3단 / 13~16: 4단**
- **코드 현재**:
- 분산: `Tmp_Air_Volume = 4실 합산``if(>=4) =4` (= min(합,4)) — `My_system.c:935, 948`
- 집중: `Tmp_Air_Volume = vars[0].value` (= P_max) — `My_system.c:1082`
| 예시 (Score) | 사양 최종단수 | 코드 최종단수 |
|---|---|---|
| 합 3 (1,1,1,0) 분산 | 1단 | **3단** |
| 합 6 (2,2,1,1) 분산 | 2단 | **4단(cap)** |
| 침실 단독 4 (집중) | 1단 | **4단(P_max)** |
| 합 16 (4,4,4,4) | 4단 | 4단 |
→ 슬라이드10 QA 진리표(7개 케이스)로 유닛 테스트 검증 필요.
### 2.2 Eco / Normal / Turbo 모드별 임계값 미구현
- 사양: 모드별 CO2/PM2.5/PM10/VOC 임계표 3세트
(예: Normal CO2 0~700 / 701~1000 / 1001~1300 / 1301~1600 / 1601~)
- 코드: 단일 임계값 `m_*_Level`(CO2 600/700/800/900) 한 세트, 모드 분기 없음
### 2.3 4종 센서 중 PM10 미사용
- 사양: CO2 / PM2.5 / PM10 / VOC **4종**으로 Level 산출
- 코드: `room_CVP_quality = CO2 | VOC | PM2.5` (3종). `SEN66_pm10p0`는 수신만 하고 Level 계산에 미사용 — `My_system.c:890`
### 2.4 히스테리시스(데드밴드) 부분 적용
- 사양: 모드·센서별 하강 데드밴드 (CO2 50, PM2.5 2, PM10 5, VOC 5/3)
- 코드: **CO2만** `CO2_Histeresys=50` 적용, PM2.5/PM10/VOC 없음 — `My_system.c:673`
---
## 3. ❌ 260318부터 이어진 미반영 (260520에서도 동일)
| 항목 | 사양 260520 | 코드 | 위치 |
|---|---|---|---|
| 쾌적조리 ERV 풍량 | **3단** (각실 급기만 ON) | `Tmp_Air_Volume = 4` (4단), `Set_Run_Mode = MODE_AUTO` | `My_system.c:1026, 1030` |
| 스마트수면 | 1단 고정 / 초기 거실 CLOSE·침실 OPEN / 1시간마다 CO2≥1000 OPEN | 구버전 "자동−1", 전용 댐퍼·CO2 1시간 로직 없음 | `My_system.c:1191-1200` |
| 공기질 색상등급 | (구성 변경) | `Air_Quality_color_process()` `return(0)` dead code | `My_system.c:1216` |
---
## 4. ⚠️ 확인 필요 (변동 없음)
- 팬 VSP 4단: 코드 SA87/EA84 vs 사양(슬라이드11·12) SA86/EA85 (실측 기반) → EEPROM 저장값 확인 권장
- 센서/제어 주기: 사양 "매 제어 주기(예 1분)" (슬라이드10) vs 코드 분배기 폴링 1초
---
## 5. 결론
260520의 핵심 개정(**자동모드 점수기반 풍량 + Eco/Normal/Turbo + PM10 + 모드별 히스테리시스**)은 현재 소스에 **거의 미반영** 상태.
다만 **집중/분산 판정(dP≥2) 및 댐퍼 개폐 패턴**은 이미 일치하므로, "풍량 단수 결정 로직"을 점수기반(Score 테이블 매핑)으로 교체하는 것이 핵심 작업.
### 후속 작업 후보(TODO)
1. 자동모드 풍량을 **Score(0~16) → 단수(0/1/2/3/4)** 테이블 매핑으로 교체 (P_max·cap 방식 제거)
2. Eco/Normal/Turbo 모드별 임계표 도입 (현재 단일 `m_*_Level` → 3세트)
3. PM10(`SEN66_pm10p0`) Level 산출 반영 (3종 → 4종)
4. PM2.5/PM10/VOC 히스테리시스 추가
5. 쾌적조리 3단 수정, 스마트수면 26.03.18 로직 구현
6. 슬라이드10 QA 진리표(7케이스) 기반 검증
---
## 부록. 주요 소스 위치
| 파일 | 역할 |
|------|------|
| `My_system.c` | 자동모드 풍량 산출(`Air_Quality_damper_process`), 집중/분산, 시나리오 모드(`Ext_Run_Mode`) |
| `My_Uart.c` | 센서 임계값/기본값, 분배기 파싱(`Diffuser_parsing`), VSP 테스트 |
| `MyMotor.c` | 디퓨저 댐퍼, 팬 속도, BLDC_SPEED_TABLE |
| `MyControl.c` | 팬 duty 기본값 / EEPROM |
| `My_define.h` | 모드·핀·EEPROM 정의 |
Binary file not shown.
+27
View File
@@ -0,0 +1,27 @@
HERV MCU PIN-MAP & CONNECTOR
MCU (STATUS_LED - PA.10)
MCU (CURRENT2 - PA.4)
CN4, WHITE, TEMP1, ADC, MCU (TEMP_ADC1 - PA.0)
CN8, BLUE, TEMP2, ADC, MCU (TEMP_ADC2 - PA.1)
CN11, WHITE, ROOM_UART, UART, MCU (ROOMCON_RX - PA.9, ROOMCON_TX - PA.8)
CN6, WHITE, HOOD, ACTIVE LOW, MCU (EX_SW - PA.11)
CN13, YELLOW, HOOD_485, 485, MCU (I485_TX - PB.1, I485_RX - PB.0, I485_DIR - PB.2)
CN17, BLACK, BUNBAGI_485, 485, MCU (E485_TX2 - PC.0, E485_RX2 - PC.1, E485_DIR2 - PC.7)
CN15, RED, HOMENET_485, 485, MCU (E485_TX - PB.5, E485_RX - PB.4, E485_DIR - PB.6)
CN13, YELLOW, UV_LED1, MCU (UV_PW_ON - PA.5 , UV_ON - XT1_OUT)
CN16, YELLOW, UV_LED2, MCU (UV_PW_ON - PA.5 , UV_ON - XT1_OUT)
CN12, BLUE, SA_FAN, MCU (BLDC_PW_ON - PB.7, VOLUME_1 - PA.2 , BLDC1_PWM_OUT - PB.11 , BLDC1_FG_IN - PE.5)
CN14, WHITE, EA_FAN, MCU (BLDC_PW_ON - PB.7, VOLUME_2 - PA.3 , BLDC2_PWM_OUT - PA.12, BLDC2_FG_IN - PA.13)
외기(OA), CN2 , GREEN, U1(15~18),MCU (PB.12,PB.13,PB.14,PB.8)
공청(AIR), CN10, YELLOW, U4 (11~14), MCU (PD.14,PD.7, PD.6,PB.3)
바이패스(BYPASS), CN5, RED, U2 (15~18), MCU (PA.6,PA.14,PA.15,PC.8)
배기(EA), CN3, BLACK, U1(11~14), MCU (PB.15,PC.14,PC.15,PC.6)
급기(SA), CN7, BLUE, U2(11~14), MCU (PC.9,PC.10,PC.11,PB.9)
환기(RA), CN9, WHITE, U4(15~18), MCU (PB.10,PC.2,PC.3,PD.15)
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

@@ -0,0 +1,112 @@
# 스마트폰에서 Claude Code 작업하기 — Remote Control 가이드
작성일: 2026-06-14
데스크톱(Windows + VS Code 확장)에서 진행 중인 Claude Code 세션을 스마트폰에서 그대로 조종하는 방법.
빌드·COM 포트·실보드 플래시 등 실제 작업은 **데스크톱에서** 실행되고, 폰은 지시·확인·승인 역할.
---
## 0. 준비물
| 항목 | 내용 |
|---|---|
| 버전 | Claude Code **v2.1.51 이상** (모바일 푸시 알림은 v2.1.110+). 확인: 터미널 `claude --version` |
| 플랜 | **Pro / Max / Team / Enterprise** (API 키 인증 불가, claude.ai 계정 로그인 필요). 로그인/확인: `claude /login` |
| OS | Windows 지원. **터미널 CLI·VS Code 확장 둘 다 가능** |
| 팀/기업 | 관리자가 관리설정에서 "Remote Control" 토글을 켜둬야 함 |
| 폰 앱 | **Claude by Anthropic** (iOS App Store / Android Play) — 데스크톱과 같은 계정 로그인 |
---
## 1. 데스크톱에서 Remote Control 시작 (택1)
### A. VS Code 확장에서 (지금 쓰는 방식 — 가장 간단)
1. Claude 채팅 입력창에 **`/remote-control`** (또는 `/rc`) 입력
2. 입력창 위 배너 → **"Open in browser"** 클릭하면 claude.ai/code로 연결
3. ⚠️ VS Code에서는 QR 미표시·이름 지정 미지원
### B. 터미널 CLI에서 (QR·이름 지원, 권장)
```powershell
cd D:\project\nuvoton\HERV
claude remote-control --name "HERV"
```
- 세션 URL 출력 + **스페이스바**를 누르면 QR 코드 표시
- 터미널은 켜둔 채 유지(**Ctrl+C 금지**). 네트워크 끊겨도 ≤10분이면 자동 재연결
**선택 플래그**
- `--name "HERV"` : 세션 제목(목록에 표시)
- `--spawn worktree` : 기기별 독립 git worktree(파일 충돌 방지, git 저장소 필요)
- `--spawn session` : 정확히 1기기만 연결 허용
- `--verbose` : 연결/도구 상세 로그
- `--sandbox` : 파일시스템/네트워크 격리
### C. 이미 진행 중인 세션을 전환
실행 중인 세션 입력창에 `/remote-control HERV` → 기존 대화 유지하며 활성화
---
## 2. 스마트폰에서 연결
1. **Claude 앱** 설치(데스크톱에서 `/mobile` 치면 다운로드 QR 표시) → 데스크톱과 **같은 계정** 로그인
2. 연결 3가지:
- **QR 스캔**: 터미널 스페이스바로 띄운 QR을 앱으로 스캔
- **세션 URL**: 터미널/배너의 URL 복사 → 폰 브라우저 붙여넣기
- **세션 목록**: 앱 하단 **"Code" 탭** → 목록에서 "HERV"(**녹색 점 컴퓨터 아이콘**) 선택
---
## 3. 폰에서 할 수 있는 것
**가능**
- 메시지 전송 / 답변·변경(diff) 확인
- **도구 권한 승인·거부** (Allow / Deny / Allow always) — 데스크톱과 실시간 동기화
- `@`로 로컬 파일경로 자동완성
- `/clear` `/compact` `/context` `/usage` `/exit`
**불가(로컬 전용)**
- `/plugin`(플러그인 선택기), `/resume`(세션 복구 대화)
**푸시 알림(선택, v2.1.110+)**
- 폰 앱 로그인 → OS 알림 허용 → 데스크톱 `/config`**"Push when Claude decides"** 켜기
- 긴 작업 완료/결정 필요 시 알림. "notify me when X finishes" 식 요청도 알림
---
## 4. 핵심 제약 (이 프로젝트 기준 중요)
- **데스크톱이 계속 켜져 있어야 함** — 절전/잠금 금지, 터미널·VS Code 종료 금지, 네트워크 유지
- 빌드(`dotnet`, `bash build.sh`), **COM 포트 통신**, **실보드 플래시(`bash build.sh flash`)** 는 전부 데스크톱 실행 → 폰은 지시·확인 역할
- 기본은 한 번에 한 기기 입력. 단절 >10분이면 세션 종료 → 재시작 필요
- 보안: 아웃바운드 443(HTTPS)만 사용(인바운드 포트 안 염), TLS 암호화·단기 자격증명
---
## 5. 연결 종료
- VS Code: 배너 X 버튼
- 터미널: Ctrl+C
- 어디서나: `/exit`
---
## 6. 문제 해결
| 증상/메시지 | 해결 |
|---|---|
| "claude.ai subscription / full-scope token 필요" | `claude /login` 재로그인 |
| "organization 정책으로 비활성" | 관리자가 claude.ai 관리설정에서 Remote Control 토글 켜기 |
| "Remote Control not yet enabled" | `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`·`DISABLE_TELEMETRY`·`CLAUDE_CODE_USE_BEDROCK` 등 환경변수 제거 |
| QR 안 보임 | 터미널 창 넓히고 스페이스바 다시 |
| 세션 목록에 없음 | 데스크톱에서 `claude remote-control` 다시 실행, 터미널 실행 중인지 확인 |
| 상세 디버깅 | `claude remote-control --verbose` |
---
## 7. 권장 사용 흐름 (이 프로젝트)
1. 평소엔 데스크톱 VS Code 확장에서 작업
2. 자리 비울 때 **`/rc` → Open in browser**(또는 터미널 `claude remote-control --name "HERV"` + QR)로 폰 연결
3. 폰에서 진행 확인·권한 승인·간단 지시(예: "다음 단계 진행해", "빌드 결과 보여줘")
4. 실보드/COM 검증은 데스크톱을 켜둔 상태로 폰에서 원격 지시
> 공식 문서: https://code.claude.com/docs/en/remote-control
@@ -0,0 +1,64 @@
# 팀 공유 · 이동 중 작업 환경 구성 (검토 메모)
작성일: 2026-06-15
## 1. 배경 / 요구사항
- 이동 중에도 지금처럼 **VS Code로 수정·저장**하는 방식을 유지하고 싶다.
- 기존 Google Drive 방식(수동 다운로드/업로드)은 번거롭고 버전 꼬임이 생겨 개선 필요.
- **다른 직원과 소스 공유**도 해야 한다.
## 2. 결론
**Git + 사내 원격 저장소(private)** 로 간다.
한 번에 세 가지를 해결:
1. 팀 공유 — 각자 clone, 수정 후 push, 누가 뭘 바꿨는지 추적
2. 이동 중 작업 — 노트북에서 clone, 또는 브라우저 웹 IDE로 편집
3. 변경 이력 — 현재 이 폴더는 git 저장소가 아니라 diff 추적 불가 → git 도입으로 영구 해결
> 폴더 동기화(Google Drive / OneDrive / Syncthing)는 여러 명이 동시에 수정하면 충돌 파일이 쌓여 **팀 공유에는 부적합**. 단독 백업 용도라면 OneDrive/Syncthing이 Drive보다 낫지만, 본 목적에는 Git 채택.
## 3. 호스팅: 회사 Synology NAS (확정)
사내에 소스가 머무르고 직원 공유가 깔끔함. 내일 NAS에 Git 설치 후 진행 예정.
### 방식 비교
| 방식 | 특징 | 추천 상황 |
|---|---|---|
| **Git Server 패키지 (추천)** | 패키지 센터에서 `Git Server` 설치, SSH로 bare repo 접근. 가볍고 간단. | 소규모 팀(현재) |
| **GitLab (패키지/Docker)** | 머지요청·이슈·권한관리·웹 편집 등 풀기능 웹 UI. 무겁고 RAM 사용 큼. | 코드리뷰/PR 문화 필요 시 |
→ 우선 **Git Server 패키지**로 시작, 필요해지면 GitLab으로 확장.
### Git Server 방식 절차 (예시)
```bash
# NAS 측 (SSH 접속 후) — bare 저장소 생성
git init --bare /volume1/git/HERV.git
# 직원 PC 측 — clone
git clone ssh://사용자@NAS주소:포트/volume1/git/HERV.git
```
## 4. 로컬 준비 (NAS 연결 전, 오늘 가능)
원격 설정만 내일 하면 되도록 로컬 git을 먼저 초기화:
1. `.gitignore` 생성 — 빌드 산출물 제외, 소스·문서·PDF만 추적
- 제외 대상: `program/build/`, C# `bin/` · `obj/`, `*.o *.d *.elf *.bin *.hex *.map`
2. `git init` + 첫 커밋 (현재 상태 스냅샷 → **이 시점부터 변경 이력 남음**)
내일 NAS 작업:
```bash
git remote add origin ssh://사용자@NAS주소:포트/volume1/git/HERV.git
git push -u origin main
```
## 5. 이동 중 작업 옵션 (참고)
- **노트북 + git clone**: 가장 일반적. 평소처럼 VS Code 편집.
- **브라우저 웹 IDE**: GitLab 도입 시 웹 편집 가능(Git Server 단독은 미지원).
- **VS Code Remote Tunnel**: 집/사무실 PC에 `code tunnel` 켜두고 원격 접속 → 그 PC의 실제 파일·빌드툴·연결된 PBA 보드까지 그대로 사용. (빌드·실보드 시험을 이동 중에도 해야 할 때 유용)
## 6. 주의 / 작업 범위
- 모든 작업은 `D:\project\nuvoton\HERV` 폴더 내부에서만 진행 (외부 `D:\project\C#\` 등은 건드리지 않음).
- 빌드 산출물은 git에 올리지 않음(.gitignore 처리) — 저장소를 소스·문서 위주로 깨끗하게 유지.
## 7. 다음 할 일
- [ ] (오늘/원하면) 로컬 `git init` + `.gitignore` + 첫 커밋
- [ ] (내일) NAS에 Git Server 패키지 설치, bare repo 생성
- [ ] NAS를 remote로 추가하고 push
- [ ] 직원 계정/접근 권한 부여 및 clone 테스트
@@ -0,0 +1,121 @@
# HERV 펌웨어 정적분석 버그 리포트
작성일: 2026-06-15
대상: `program/User/*.c`, `*.h` (펌웨어 전체)
방식: 영역별 정적분석(읽기 전용). **코드 수정 없음 — 검토용 목록**
표기: ✓ = 작성자가 직접 코드 확인 / (분석) = 분석에서 도출(미재확인) / [의심] = 추가 검증 필요
---
## 0. 우선순위 요약 (먼저 고칠 것)
| # | 위치 | 심각도 | 한줄 | 검증 |
|---|------|--------|------|------|
| 1 | My_RJ2.c:617 | High | switch case 8 `break` 누락 → 공청3단 세팅이 4단 프리셋 덮어씀 | ✓ |
| 2 | My_RJ2.c:400 | High | `Command_request_type = 0;` 로 보류비트(HOOD/예약/Homenet래치) 전멸 | ✓ |
| 3 | My_bunbaeggi.c:869 | High | 예약시간 offset 오류: `[8]` 검사하고 값은 `[7]`(풍량)에서 읽음 | ✓ |
| 4 | MyControl.c:595 | High | 필터리셋 조건에 `Filter_timer_change` 중복(`Soja_timer_change` 오타) → 소자 리셋 누락 | (분석) |
| 5 | My_bunbaeggi.c:708·898 | Med | 수신 id(`buffer[3]`) 범위검증 없이 크기7 배열 인덱싱 → OOB 쓰기 가능 | (분석) |
| 6 | My_bunbaeggi.c:280 | Med | `Light_Bright[6]` 만 크기6(형제 배열은 7) → 거실2(id_2=6) 접근 시 OOB | ✓ |
| 7 | My_RJ2.c:110 | Med | `Reservation_process()` 주석처리 → 룸컨 예약(`Reserve_timer_sec`) 카운트다운 안 함 | ✓ |
---
## 1. 통신 / 프로토콜
### My_RJ2.c (룸컨)
- **[High] My_RJ2.c:617 — `case 8` break 누락 (fall-through)** ✓
- `case 8`(공청 3단 VSP) 끝에 `break`가 없어 `case 9`(4단)로 흘러감 → 공청 3단 세팅 시 4단 프리셋(`Test_Fan*_Air_4_dan`)까지 같은 값으로 오염.
- 제안: `case 8` 끝에 `break;` 추가.
- **[High] My_RJ2.c:400 — `Command_request_type = 0;` 전체 클리어** ✓
- `if(Command_request_type & TYPE_SEND_FLAG)` 블록에서 `= 0;``&= ~TYPE_SEND_FLAG;`(죽은 코드). SEND_FLAG만 소비해야 하는데 같은 사이클에 set된 `TYPE_HOOD_STATE`/`TYPE_RESERVATION`/병합된 `Homenet_RJ_Request` 비트가 한 번에 사라져 후드·예약 변경이 룸컨에 유실.
- 비교: line 690~의 같은 패턴은 `&= ~TYPE_SEND_FLAG`만 함(불일치).
- 제안: `= 0;``&= ~TYPE_SEND_FLAG;` 로 교체, 필요한 비트만 명시적으로 클리어.
- **[Med] My_RJ2.c:712 — `Filter_Reset_Flag |= buffer[7]` 마스크 누락**
- EVENT 경로(line 462)는 `& 0x01` 마스크를 쓰는데 여기선 통째 OR → 상위비트 오염으로 의도치 않은 필터 리셋 가능. 제안: `& 0x01` 적용.
- **[Med][의심] My_RJ2.c:702-705 — AUTO 수신 시 `Fan_Mode` 미갱신**
- else 분기에서 AUTO면 `Set_Fan_Mode/Fan_Mode`를 갱신 안 한 채 line 718 `Set_Fan_Mode==Fan_Mode` 비교 → TYPE_FAN_SPEED 비트가 옛값으로 클리어/유지되어 풍량 명령 어긋남 가능. EVENT 분기(414-415)와 기준 통일 검토.
### My_bunbaeggi.c (분배기/디퓨저 마스터)
- **[High] My_bunbaeggi.c:869 — 예약시간 byte offset 오류** ✓
- `if(Rx_bunbaegi_buffer[8] & 0x80){ Set_Reserve_timer_sec = (uint32_t)(Rx_bunbaegi_buffer[7] & 0x7f)*3600; }` — 요청비트는 `[8]`에서 보고 값은 `[7]`(풍량 바이트)에서 읽음 → 예약시간이 풍량값으로 들어감. 제안: `[8]`에서 읽기.
- **[Med] My_bunbaeggi.c:708·898 (Diffuser/EachRoomCon parsing) — 수신 id 범위검증 없음** (분석)
- `id = Rx_bunbaegi_buffer[3];``SEN66_*[id]`, `Diffuser_Power[id]` 등 크기7 배열에 상한 체크 없이 인덱싱. 오염된 id(≥7)면 OOB 쓰기로 전역 손상. 제안: `if(id < 7)` 가드.
- **[Med] My_bunbaeggi.c:183/191 — RoomCon `Packet_Length`가 절대 29가 안 됨** (분석)
- case 3에서 무조건 39, case 4 RoomCon 분기도 39(주석은 `//29byte`). → case 28의 29B 완료처리 분기가 죽은 코드. 29B 응답 파싱 불가. 제안: 의도대로 case 4에서 `Packet_Length = 29;`.
- **[Low] My_bunbaeggi.c:813 — VSP 저장 트리거가 case 3(BYPASS)에만 존재** (분석)
- VEN/AIR VSP를 룸컨에서 바꾸면 `EEP_Save_Flag` 미설정 → 재부팅 후 유실 가능. 제안: case 1/2에도 동일 저장 조건.
### My_Homenet.c (PC 대시보드)
- **[Low/설계확인] My_Homenet.c:366 — CTRL_VSP u16→u8 truncation** ✓
- `(uint8_t)(((uint16_t)pl[2]<<8)|pl[3])` 는 상위바이트를 시프트 후 캐스팅으로 버려 사실상 `pl[3]`(하위)만 사용. VSP가 0~255라 실사용은 무해하나, 의도 명확화를 위해 `pl[3]`만 쓰는 게 안전. (확정 손상 아님)
- **[Low/의심] My_Homenet.c:410 — `hn_apply_cmd(cmd, pl, HN_DATA_LEN)` 로 len 항상 240** (분석)
- 모든 `if(len >= N)` 검증이 무조건 통과 → 짧은 명령 의미검증이 사실상 무력. 고정 244B 구조라 오버런은 없음. 동작 영향 낮음.
### My_Hood.c (후드)
- **[Med] My_Hood.c:64 — 헤더 불일치 바이트를 버퍼에 기록** (분석)
- case 1에서 0x11 불일치 시 `Rx_hood_Pos=0` 후에도 `Rx_Hood_Buff[Pos++]=data` 실행 → 잘못된 바이트가 buffer[0]에 들어가 프레임 한 칸 밀림. 제안: 불일치 시 `Pos=0; break;` 로 즉시 반환.
---
## 2. 시스템 / 전원 / 예약
### main.c
- **[Low] main.c:116-119 — `Process_10ms` 재장전값 3000, 본문 비어있음(데드/오타)** ✓
- `Process_5ms`/`Process_10ms` 블록 모두 카운터만 재장전하고 작업 없음(no-op). 동작 영향은 없으나 `=3000`은 명백한 leftover. 제안: 블록 제거 또는 의도값 복원.
### My_system.c
- **[Med] My_system.c (예약 카운터 이원화) — `Reserve_Remain_Sec`(HomeNet) vs `Reserve_timer_sec`(룸컨)** ✓
- main.c 1초 루프는 `Reserve_Remain_Sec`만 감산. 룸컨용 `Reserve_timer_sec`를 감산하는 `Reservation_process()`**My_RJ2.c:110에서 주석처리** → 룸컨이 설정한 예약은 카운트다운/전원OFF가 안 됨. 제안: 카운터 단일화 또는 `Reservation_process()` 호출 복원.
- **[Med] My_system.c:728 부근 `sensor_level()``T[i] - db` unsigned 언더플로** (분석)
- `uint16_t` 임계-데드밴드. 대시보드로 임계를 작게 설정하면 래핑되어 단계판정 폭주. 정상 사양값에선 미발생. 제안: 뺄셈 전 `T>=db` 가드 또는 signed 후 0 클램프.
- **[Med] My_system.c (Air_Quality_color_process 선두 `return(0)`) — 본문 도달불가(데드코드)** (분석)
- 매초 호출되나 색상/quality 계산 전체가 실행 안 됨. 의도된 비활성화인지 확인 필요(색상은 Air_Quality_damper_process가 별도 세팅).
---
## 3. 모터 / 댐퍼 / PWM (MyMotor.c)
- **[Med] MyMotor.c:893·897 — 팬 PWM 보정항 정수 오버플로/truncation** (분석)
- `BLDC_SPEED_TABLE[..]*Volum_value/1000` 이 int로 먼저 계산 → 큰 값/음수 Volum에서 오버플로·정밀손실. 제안: float 우선 캐스팅 또는 Volum 범위 클램프.
- **[Med] MyMotor.c — `BLDC_SPEED_TABLE[Fan_Speed]`(크기100), `Target_Step_Count[damper_num]`(크기7) 인덱스 미검증** (분석)
- 정상 VSP/모드값에선 안전하나 방어 없음. Fan_Speed≥100 또는 damper_num≥7 시 OOB. 제안: 접근 전 클램프/가드.
- **[Med][의심] MyMotor.c:1011 외 — `Step_Status != 0x3F` 수렴 대기 무한블록 가능**
- 특정 타이밍에 6댐퍼 전부 0x3F 미도달 시 후속(팬 목표갱신) 진입 불가. 타임아웃/완료플래그 보강 검토.
- **[Low][의심] MyMotor.c:962-979 — `Vsp_Select` if-else 체인 공백구간**
- 10~15, 0x21~0x24 등 미정의 값은 어느 분기에도 안 걸려 Target/Damper 미설정. 정상 범위면 무해. default 처리 검토.
---
## 4. 제어 / EEPROM (MyControl.c)
- **[High] MyControl.c:595 — 필터리셋 조건 `Filter_timer_change` 중복(오타)** (분석)
- `if((Filter_timer_clean==0)&&(Filter_timer_change==0)&&(Filter_timer_change==0))` 세 번째는 `Soja_timer_change==0` 이어야 함 → 소자 청소/교체 카운터 리셋 누락. 제안: 세 번째를 `Soja_timer_change`로 교정.
- **[Med] MyControl.c:659 — `Pre_Mode_Control` 부분쓰기 루프 상한이 127** (분석)
- 정전복귀 3바이트(40~42)만 필요한데 `i<EEP_SIZE`(127)까지 순회 → 히스테리시스 영역(43~127)을 RAM 미러로 재기록. 동기화 타이밍에 따라 임계 롤백 위험 + 불필요 스캔. 제안: 상한을 42로 제한.
- **[Med][의심] MyControl.c:531·536 — `Volum1/2_value` 변환식이 주석범위(-100~100) 초과(+175~-75)**
- 다운스트림에서 -100~100 가정 시 오버레인지. 계수/오프셋 재검토 또는 결과 클램프.
---
## 5. Light_Bright 배열 불일치 (교차 이슈)
- **[Med] My_bunbaeggi.c:280 / My_define.h:495 — `Light_Bright[6]` 만 크기6** ✓
- 형제 각실배열(`Diffuser_*`, `SEN66_*` 등)은 모두 `[7]`(인덱스 0~6, 거실2=6). `Light_Bright``[6]`(0~5). My_bunbaeggi.c:622/645 `Light_Bright[id_2]` 에서 id_2=6(거실2) 도달 시 OOB 읽기 → 인접 전역 오염. 제안: `Light_Bright[7]` 로 통일.
---
## 6. 점검했으나 "버그 아님" (오판 방지 기록)
- **MODE_* 중복정의(My_define.h 265-268 / 275-278)**: `#if((SPEC_MODE_INFO&0x0F)==0x03||==0x06)` 가드. 현재 `SPEC_MODE_INFO=0x16`(&0x0F=0x06) → **첫 블록만 컴파일**(VENT=0/AUTO=1/AIRCLEAN=2/BYPASS=3). 충돌 아님. 단 사양값 변경 시 BYPASS/AIRCLEAN(2↔3) 매핑이 바뀌는 잠재위험 → 프로토콜 코드값 고정 가정과 대조 필요.
- **CRC 계산범위/바이트순서(My_bunbaeggi, My_Homenet)**: 송수신 내부 일관(27B/37B 데이터 + 2B CRC). `CRC16()`이 표준MODBUS 바이트스왑값을 반환하고 `[n]=icrc>>8` 배치로 상쇄 → 와이어는 표준 리틀엔디안. 정상. (시뮬레이터는 lo-first로 일치시킴)
- **CTRL_RESERVE 곱셈(My_Homenet.c:385)**: `pl[0]*3600` int 승격으로 최대 28800 정상.
- **EEPROM 인덱스/페이지 경계(MyControl.c)**: 히스테리시스/임계 영역 최댓값 127(=EEP_SIZE-1), 페이지(128B) 침범 없음. 서명 0x55AA55AA + 별도 유효성 마커 검증 정상.
- **pwm_duty10000.c**: 룩업테이블이 아니라 표준 Nuvoton PWM 드라이버. 범위초과 없음.
---
## 참고
- 본 리포트는 분석만 수행했고 소스는 수정하지 않았습니다.
- (분석) 표기 항목은 영역별 분석에서 도출됐고 작성자 재확인 전입니다. 수정 착수 전 해당 라인을 함께 열어 확정하는 것을 권장합니다.
- 우선순위 1~4(High)는 동작 증상으로 이어질 가능성이 가장 높습니다.