feat: 06-17 신규 작업본 반영 (개발사양서/기능검토/승인원/Source 등 추가)
.claude/ 제외(.gitignore 추가). 기존 초기커밋(5a96a69) 위에 신규·수정·이동분 커밋.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -162,6 +162,8 @@ namespace DiffuserSimulator
|
||||
}
|
||||
if (totalRead < 29) continue;
|
||||
|
||||
// CRC 바이트순서 = lo-first(표준 리틀엔디안). 펌웨어 CRC16()이 표준MODBUS의
|
||||
// 바이트스왑값을 반환 + [27]=icrc>>8 배치 → 두 스왑 상쇄 → 와이어는 [27]=하위,[28]=상위.
|
||||
ushort rxCrc = (ushort)(rxBuf[27] | (rxBuf[28] << 8));
|
||||
ushort calcCrc = CalcCRC16(rxBuf, 27);
|
||||
if (rxCrc != calcCrc) { Log($"[CRC오류] 수신:0x{rxCrc:X4} 계산:0x{calcCrc:X4}"); continue; }
|
||||
@@ -192,12 +194,22 @@ namespace DiffuserSimulator
|
||||
continue;
|
||||
}
|
||||
|
||||
// Option B 패킷 구분 (250624 dump 패턴 일치):
|
||||
// byte 5 = 0x01 → 명령 (Power ON, state 적용)
|
||||
// byte 5 = 0x00 → 폴링 (상태 조회만, state 무변경)
|
||||
// 폴링에서 byte 10/11/8 = 0 을 그대로 적용하면 댐퍼/LED 가 0 으로 reset 됨.
|
||||
// 패킷 구분 : byte5 = Power. 하위비트 = 전원(0/1), 상위 0x80 = Control Cmd (dump.txt 스펙).
|
||||
// 전원 OFF(하위비트 0) : 펌웨어가 댐퍼=0·LED=0 을 보냄 → 디퓨저 닫힘·소등 (전원우선)
|
||||
// 전원 ON : 폴링/명령 모두 byte5 하위비트=1 → 댐퍼/LED 상태 적용
|
||||
// (과거 isCommand=byte5!=0 만 적용 → 전원 OFF(byte5=0) 닫힘명령을 폴링으로 오인,
|
||||
// 댐퍼 열림·LED 켜진 채 남던 문제 수정)
|
||||
bool powerOff = ((rxBuf[5] & 0x7F) == 0x00);
|
||||
bool isCommand = (rxBuf[5] != 0x00);
|
||||
if (isCommand)
|
||||
if (powerOff)
|
||||
{
|
||||
// 전원 OFF → 급기/배기 댐퍼 닫힘 + LED 소등 (수동닫기/수동LED 와 무관, 전원이 우선)
|
||||
room.Power = 0;
|
||||
room.DamperAngleSA = 0;
|
||||
room.DamperAngleEA = 0;
|
||||
room.LedBrightness = 0;
|
||||
}
|
||||
else if (isCommand)
|
||||
{
|
||||
// 마스터 명령 적용 — ID1 별로 해당 type 의 필드만 갱신.
|
||||
// ID1=0x01 (SA): damper SA 만
|
||||
@@ -347,6 +359,7 @@ namespace DiffuserSimulator
|
||||
p[11] = room.DamperAngleEA;
|
||||
// byte 12~26: 0 (RPM / Reset / 예약 등 미사용)
|
||||
ushort crc = CalcCRC16(p, 27);
|
||||
// lo-first (표준 리틀엔디안) — 와이어 [27]=하위, [28]=상위
|
||||
p[27] = (byte)(crc & 0xFF);
|
||||
p[28] = (byte)((crc >> 8) & 0xFF);
|
||||
return p;
|
||||
@@ -378,7 +391,7 @@ namespace DiffuserSimulator
|
||||
if (total < 39) return null;
|
||||
if (buf[1] != 0x01) continue; // not slave
|
||||
|
||||
ushort rxCrc = (ushort)(buf[37] | (buf[38] << 8));
|
||||
ushort rxCrc = (ushort)(buf[37] | (buf[38] << 8)); // lo-first (표준 리틀엔디안)
|
||||
ushort calc = CalcCRC16(buf, 37);
|
||||
if (rxCrc != calc) { Log($"[CRC오류] 수신:0x{rxCrc:X4} 계산:0x{calc:X4}"); return null; }
|
||||
return buf;
|
||||
@@ -402,6 +415,7 @@ namespace DiffuserSimulator
|
||||
p[33] = (byte)((room.ErrorCode >> 8) & 0xFF); p[34] = (byte)(room.ErrorCode & 0xFF);
|
||||
p[35] = room.VersionMajor; p[36] = room.VersionMinor;
|
||||
ushort crc = CalcCRC16(p, 37);
|
||||
// lo-first : 펌웨어 RX가 (Rx[37]<<8)|Rx[38] 로 읽고 CRC16()=스왑값과 비교 → lo-first로 보내야 일치
|
||||
p[37] = (byte)(crc & 0xFF); p[38] = (byte)((crc >> 8) & 0xFF);
|
||||
return p;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user