WPF C# - CMD Mapper

wsung·2026년 2월 6일
namespace ICT_WPF.Services
{
    /// <summary>
    /// CMD 0x0E : 범용 IO 출력제어 및 입력상태 읽기
    ///
    /// [TX] ST_CMDOE_TX_T
    ///  unsigned char ucDIO;
    ///   B0 SOL1
    ///   B1 SOL2
    ///   B2 SOL3
    ///   B3 SOL4
    ///   B4 BUZ_EN (RED)
    ///   B5 LED_EN (GREEN)
    ///   B6 ONBOARD_BUZZER_EN
    ///
    /// [RX] ST_CMDOE_RX_T
    ///  payload[0] : ResultCode ('0','1','9')
    ///  payload[1] : ucDIO
    ///   B0 SW_IN1
    ///   B1 SW_IN2
    ///   B2 SW_IN3
    ///   B3 SW_IN4
    ///   B4 AREA_SENS1
    ///   B5 SENS_IN1
    /// </summary>
    public static class IctCmd0EMapper
    {
        public const byte Cmd = 0x0E;

        /// <summary>
        /// 1
        /// </summary>
        public static byte BuildTxUcDio(
            bool sol1, bool sol2, bool sol3, bool sol4,
            bool buzRed, bool ledGreen, bool onboardBuzzer)
        {
            byte v = 0;

            if (sol1) v |= (1 << 0);
            if (sol2) v |= (1 << 1);
            if (sol3) v |= (1 << 2);
            if (sol4) v |= (1 << 3);
            if (buzRed) v |= (1 << 4);
            if (ledGreen) v |= (1 << 5);
            if (onboardBuzzer) v |= (1 << 6);

            return v;
        }

        /// <summary>
        /// RX payload 파싱
        /// </summary>
        public static bool TryParseRx(
            byte[] payload,
            out bool sw1, out bool sw2, out bool sw3, out bool sw4)
        {
            sw1 = sw2 = sw3 = sw4 = false;

            if (payload == null || payload.Length < 2)
                return false;

            // ResultCode 체크 (ASCII '0' = OK)
            if (payload[0] != (byte)'0')
                return false;

            byte ucDio = payload[1];

            sw1 = (ucDio & (1 << 0)) == 0;
            sw2 = (ucDio & (1 << 1)) == 0;
            sw3 = (ucDio & (1 << 2)) == 0;
            sw4 = (ucDio & (1 << 3)) == 0;

            return true;
        }
    }
}


// 보드에서 보낸 값을 bool 값으로 만드는 과정

의미

ICT 프로그램에 UDP 통신을 위해서 반드시 필요한 파일이다
파일의 이름은 IctCmd0EMapper.cs
CMD(0x0E)하나에 대해서 의미 <-> 비트를 변환해주는 전용 매퍼 파일이다.

좀 더 자세히 말해보면
CMD 0x0E 전용 규칙서를 코드로 옮긴 파일이다

  • UDP 소켓 모름
  • STX / ETX 모름
  • 패킷 길이 모름
  • UI 모름

오직 송신(TX) : 의미 -> 비트
수신(RX) : 비트 -> 의미
변환 역할만 함

1. 송신(TX)

sol1, sol2, sol3, sol4 ... => byte ucDio 변환
led1~4를 끄고 켜 같은 사람 의미를 => 보드가 이해하는 ucDio 비트로 바꿈

2. 수신(RX)

byte ucDio -> bool sw1, sw2, sw3 ,sw4
보드가 보낸 ucDio비트를 => UI에서 쓰기 좋은 bool 값으로 바꿈

CMD 0x0E의 DATA 구조체 (ST_CMDOE_TX_T / RX_T)를 코드로 구현한 파일이다.

코드 분석

BuildTxUcDio (TX)
led를 pc에서 조작하여 보드로 값을 전달해주도록 매핑해주는 함수
byte v = 0;
만약 led 1, 2를 켰을때
if (sol1) v |= (1 << 0);
if (sol2) v |= (1 << 1);
if (sol3) v |= (1 << 2);
if (sol4) v |= (1 << 3);
sol1,2 만 T값을 가지게되어
sol1 : v : 0000 | 0001 => 0001
sol2 : v : 0001 | 0010 => 0011 비트값을 전달 가능하게 됨

TryParseRx(RX)
보드의 sw1~4를 조작하여 pc의 sw변화를 확인할 수 있도록 비트값을 의미로 매핑해주는 함수
여기서 매개변수 out bool sw1 를 잘보자 처음보는 'out'은 return 값이 true일때 같이 반환해주는 값이라고 생각하면 될 것 같다.

또 중요한 payload는 길이가 2로 존재하는데 payload[0]은 ResultCode로 값이 정상적으로 들어있다면 0으로 존재하고 그 이외면 값이 정상적이지 않다는 뜻이다.
payload[1]은 현재 sw의 상태가 byte로 담겨져있는데

sw1, sw2가 눌린 상태면 ( 참고로 active low로 설정됨 : 0일때 활성화 된다는 뜻)

sw1 = (ucDio & (1 << 0) == 0;

  • ucDio(1100) & (0001) : 0 == 0 : T
    sw2 = (ucDio & (1 << 1) == 0;
  • ucDio(1100) & (0010) : 0 == 0 : T
    나머지 F
    그럼 / sw1 = T / sw2 = T / sw3 = F / sw4 = F /
    out 으로 값 반환
profile
0부터 시작하는 백엔드

0개의 댓글