여자친구와 함께 홈플러스에 갔다가 충동적으로 구입하게된 Nintento Wii.. 처음 사고나서 몇주정도는 함께샀던 Wii Fit과 마리오파티 8을 주구장창하다가 이제는 질려버렸습니다.. -_-;; 슬슬질려가던 차에 여자친구가 베이징 올림픽을 사줬는데 다시 Wii를 TV와 연결하는게 귀찮아 서랍속에 봉인되어있네요..
거금 40만원(타이틀 값포함) 정도를 투자해서 구입한 Wii.. 이대로 썩히긴 아깝다 싶어서 게임이 아니라면 다른방법으로라도 사용해야겠다 싶어. 요즘 한창 인기있는 Wiimote(+ 기타 Wii Control)를 사용한 Application 개발에 나섰습니다. 대부분의 Wii Control은 Blutooth 방식으로 동작하기 때문에 간단히 처음에는 간단하게 장치 찾아서 시리얼 포트로 통신하면 뚝딱! 이겠구나 싶었는데 Wii Control은 별도의 시리얼통신 서비스를 제공하고 있지않아 .. 멤버십에 Wiimote를 사용하는 프로젝트를 진행중인 분께 여쭤봤더니 Wiimote를 제어 할 수 있는 오픈소스가 있다고 하네요..
냉큼 달려가 다운로드를 받아봤더니 단순히 Wiimote뿐만 아니라 Wiifit이나 Guitar와 같은 다른 Wii Controller 들도 지원을 하고 있었습니다. 이런 훌륭한 것이.. 소스를 살펴보니 주석뿐만 아니라 개발 문서까지 제공하기때문에 단순히 라이브러리를 사용하고자 하는 사람들은 별다른 코드 수정없이 샘플 프로그램을 조금만 변경해서 사용할 수 있을것 같습니다..
하지만, 저같이 이런 물건(?)은 꼭 파해쳐 보고싶어하는 악독한 심보의 사람들을 위해서, 이번시간부터 총 3번에 걸쳐서 라이브러리를 분석해보도록 하겠습니다. 분석에서는 라이브러리 자체의 사용법보다는(개발문서에서 너무 자세히 설명되어있기 때문에 굳이 설명하지 않아도 될것같습니다.) 라이브러리의 구조나, 동작방식에 촞점을 맞춰 설명할 계획입니다.
이번 분석에 사용될 라이브러리는 Brian Peek (http://www.brianpeek.com/)에 의해 개발된 Managed Library for Nintendo's Wiimote v1.7.0.0으로 2009년 1월 19일에 개발자 블로그를통해 공개된 버전입니다. 아래 주소를통해 다운 받으실 수 있습니다.
http://www.brianpeek.com/blog/archive/2009/01/19/wiimotelib-v1-7-released.aspx
첫번째 시간에서는 라이브러리의 핵심 구조에 대해서 이야기하고, 두번째 시간에서는 세부적인 동작에 대한 내용을 다룬뒤 세번째 시간에서는 라이브러리를 사용한 간단한 샘플 프로그램을 개발 해보도록 하겠습니다.
오늘은 그 첫번째 시간으로 Wiimote Library의 구조에 대해 살펴보겠습니다. 라이브러리 소스코드를 열어보면 아래와 같은 파일이 존재하는것을 확인 하실 수 있습니다. 각각 파일마다 의미하는 기능을 다음과 같습니다.
- DataType.cs : Wii Controller의 상태등을 표현하기 위한 30여가지의 DataType이 정의되어있습니다.
- Event.cs : Wii Controller의 상태가 변경되면 발생하는 이벤트를 정의하고있습니다.
- HIDImports.cs : Bluetooth 장치를 연결하면 설치되는 HID를 제어하기 위한 Win32 API가 정의되어있습니다.
- Wiimote.cs : Wiimote정보를 담고있는 Wiimote Class와 Delegate, Exception이 정의되어있습니다.
- WiimoteCollection.cs : 다수의 Wiimote를 관리하기 위한 Collection 객체입니다.
파일은 딱 5개인데 소스코드는 2500라인 정도 되는것 같네요 -_-;;; (소스코드를 열어보면 엄청난 스크롤의 압박에 시달립니다.)
Wii Controller가 PC의 Bluetooth에 접속되면 아래 그림과 같이 HID(Human Interface Device)로 추가 되게 됩니다.
Wiimote Library는 Win32 API를 래핑한 Class인 HIDImports를 사용하여 시스템에 연결된 HID장치 목록을 검사하여 VenderID로 Nintendo 사의 제품인지를 판별하고 ProductID를 통해 Wiimote를 판별한뒤 Device Path를 통해 파일을 열고 읽고/쓰는 작업을 통해 Controller와 통신하게 됩니다.
말로만 하면 이렇게 간단한 작업을 통해 가능하지만 Device Driver를 직접 제어하는 기능을 구현해야 하므로 상당히 까다로운 작업이 요구되게 됩니다. 다음시간에는 실제 소스코드를 살펴보면서 어떻게 HID에 접근하고 이를 활용하는지에 대해서 살펴보도록 하겠습니다. 그럼 오늘은 여기까지 하겠습니다! 질문은 리플 & 이메일로 남겨주세요!

