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 전용 규칙서를 코드로 옮긴 파일이다
오직 송신(TX) : 의미 -> 비트
수신(RX) : 비트 -> 의미
변환 역할만 함
sol1, sol2, sol3, sol4 ... => byte ucDio 변환
led1~4를 끄고 켜 같은 사람 의미를 => 보드가 이해하는 ucDio 비트로 바꿈
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;