지난번의 TEST code에서 기본적으로 Signal Interrupt를 사용하여 reader로부터 오는 신호를 문자열로 출력하는 기능까지는 구현이 되었다. 문제는 그다음이었는데 "들어온 값을 가지고 어떻게 변환을 하여 원하는 ID 값을 얻어내는가?" 였다.

정말로 중요한 Format 정보를 알지 못한다는 것이었다. 며칠을 고민하고 자료를 뒤적거리던중 내가 모시는 분으로 부터 중요한 정보를 획득.....다음단계로 진입이 가능하였다.


먼저 내가 사용한 Reader는 GE Security의 Transition Series Multi-Technology Readers 중의 하나를 사용하였다.

이 리더의 Wiegand Format의 경우 40bit 값을 출력하여 12자리의 Badge ID를 얻어 내게 된다.


Format은 다음과 같다.


Data : PBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBP (bit1~bit40)-->P: Parity, B: Badge ID

Parity1 : EEEEEEEEEEEEEEEEEEEE -------------->(bit1~bit20 EVEN)

Parity2 : OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO---->(bit1~bit40 ODD)


참고로 

Parity1(Even)의 경우 Bit2 부터 Bit20 까지 1의 개수가 짝수이면 0, 홀수이면 1 이 된다.또한

Parity2(Odd)의 경우 Bit1 부터 Bit39 까지 1의 개수가 짝수이면 1, 홀수이면 0 으로 만들어 홀수개수를 맞춘다.


위와 같은 Format을 유지하고 있으며 Badge ID로 사용하고 있는 38Bit의 Binary값을 Decimal로 바꾸면 12자리의 ID 값을 얻을 수 있다. (위 내용을 몰라 일주일을 무지막지하게 스트레스 받으며 지냈다.)


현재 내가 가지고 있는 Badge의 경우를 예로 들자면 다음과 같다.

내 카드에서 들어온 신호는


0100 0111 0011 1110 0001 0011 0010 1000 1011 0101

Parity1을 검사해보면 20비트까지 1의 개수가 10개 이므로 Parity1의 0이 맞으며

Parity2를 검사해보면 39비트까지 1의 개수가 18개 이므로 Parity2의 경우 1이 된다.

parity 검사가 끝이 나면 Badge ID를 검출 하는데 Parity bit를 제외하고 나머지 38Bit값을 가지고 처리 한다.

양쪽 끝의 Parity를 빼고 나면 다음과 같으며

100 0111 0011 1110 0001 0011 0010 1000 1011 010 값을 10진수로 변환 하면  152992060506 이란 ID를 얻게 된다..


아마도 다른 형태의 Format들도 위와 비슷한 연산을 거치게 될 것이라 생각한다.



이젠 직접 코딩작업을 들어가야 하는데 막상 작업을 진행하고 보니 막히는 부분이 다시 생기기 시작을 했다.

문제는 12자리의 값을 얻는데서 문제가 생겼다. 작업중 C언어의 경우에서 12자리 숫자를 처리하는 방법을 몰라 프로그램 지식이 없는 나로서는 무척이나 헤메게 만드는 과정이 되어 버렸다. 엄밀히 말하자만 현재 사용하고 있는 AVR Studio5 버젼에서 코딩을 해보니 많은 고수들이 해놓은 방법이 잘 먹히지 않는 경우가 발생했다.(지식이 짧은 나로선....어찌해결해야 할지 막막 했다...


그래서 결국 나만의 빨래줄 코드로 진행 할 수 밖에 없었다..