C#2009/01/30 04:57
안녕하세요? Wiimote Library v1.7분석 그 두번째 시간입니다. 이번시간부터는 지난 시간에 살펴본 구조와 흐름을 바탕으로 라이브러리의 실제 코드에서는 어떻게 구현이 되어있는지에 대해서 살펴보도록 하겠습니다. 처음 총 3번의 포스팅으로 시스템에 연결된 Wiimote Controller를 검색하고, 통신하는 방법에 대해 소개하려고했었는데 생각보다 분량이 많아 엄청난 스크롤의 압박이 예상되기 때문에 원래 2회정도로 나누어 포스팅을 하도록 하겠습니다. (총 5회가 되겟네요.) 

#시스템에 연결된 Wiimote Controller를 검색해보자!

라이브러리를 설치하면 테스트용 샘플 코드를 확인 하실 수 있습니다. Wiimote를 컴퓨터에 연결된 Bluetooth와 연결한 뒤 샘플 코드를 실행하면 아래그림과 같은 결과 화면을 확인 하실 수 있습니다.




저같은 경우에는 Wii Controller로 Wii Fit을 연결했기 때문에 오른쪽 상단에 Balance Board의 데이터가 상황에 따라 변화되는것을 확인 할 수 있습니다. 그리고 화면 중앙에 잔여 배터리양도 표시가 되네요. 만약 Wiimote를 연결했다면 왼쪽 상단에 Wiimote의 데이터가 움직이게 됩니다. (만약 한번에 2개 이상의 Wii Controller를 연결했다면 새로운 탭이 추가되어 각각의 탭에서 장치에 대한 정보를 살펴 볼 수 있습니다.)

그럼 본격적인 코드를 살펴보도록 하겠습니다. 아래는 샘플코드를 실행했을때 바로 실행되는 MultipleWiimoteForm가 로드될때 발생하는 Load 이벤트의 코드 일부입니다. 소스코드에 대한 설명은 주석에 대체 했으며, 코드 설명에 불필요한 부분 (예를들어 MessageBox등..)은 분량을 줄이기 위해서 임의로 삭제 했으니, 착오없으시길바랍니다.

이번 분석에서의 주요 중점인 HID장치로 인식되는 Wiimote Controller와 통신에 대한 부분은 FindAllWiimotes()을 호출 하는 부분 부터 시작된다고 할 수 있습니다. 중간 부분에 검색된 Wiimote 장치들에 맞는 WiimoteInfo Control 생성부분은 사용자가 라이브러리를 개발할때 필요한 방식대로 적절하게 변경하여 사용하면 되는 부분이기 때문에 이번 분석의 범위에서 벗어나므로 추가 설명은 생략하도록 하겠습니다.
 
FindAllWiimotes() 메서드가 정의된 WiimoteCollection Class로 이동하면 아래와 같이 썰렁한 한줄짜리와 두줄짜리 메서드를 확인 할 수 있습니다. 첫번째 FindAllWiimotes()는 우리가 찾아온 메서드로 시스템에 연결된 모든 Wiimote Controller를 찾는 메서드고, 두번째 WiimoteFound메서드는 Wiimote Controller를 찾았을때 호출되는 메서드입니다.

FindAllWiimotes 메서드의 코드를 살펴 보면 Wiimote Class에 Static 메서드로 정의된 FindWiimote 메서드를 호출하는것을 알 수 있습니다. Wiimote Class의 FindWiimote메서드는 파라미터로 Wiimote Controller를 찾았을때 호출할 Delegate를 입력받고, Wiimote Controller가 검색되면 해당대리자를 호출 해주게됩니다. Delegate는 파라미터로 검색된 Deivce의 DevicePath를 입력받고 처리 여부를 bool형태로 반환하는 형식으로 WiimoteCollection에 정의된 WiimoteFound와 동일합니다.

따라서 WiimoteCollection에 정의된 FindWiimote를 호출하면 Wiimote Class의 FindWiimote를 호출하면서 대리자로 WiimoteCollection에 정의된 WiimoteFound 메서드를 전달하게 되고, WiimoteFound 메서드는 파라미터로 입력받은 DevicePath를 통해 Wiimote객체를 생성한뒤 Collection에 추가하게 됩니다.

자그럼 본격적인 Controller를 검색하는 부분입니다. Wiimote Class의 Findow Window메서드에 대해서 살펴보겠습니다. 


위 코드를 보면 HID 관련 API를 사용하여 시스템에 연결된 HID를 순차적으로 검색한 뒤 Product ID와 Vender ID를 검사하여 Wiimote Controller인지 여부를 판단하는걸 알 수 있습니다. 그리고 파라미터로 전달받은 Delegate를 호출할때 Delegate에서 False를 리턴하면 검색을 중지 함으로서 하나의 Wiimote를 검색하는데 활용할 수 있다는것을 알 수 있습니다.

이렇게 해서 오늘은 시스템에 연결된 wiimote Controller 장치를 검색하고 Wiimote 객체를 생성하는 부분까지 알아보았습니다. 다음시간에는 이렇게 생성한 객를 가지고 실제 wiimote와 통신하는 부분에 대해서 살펴보도록 하겠습니다. 오늘 설명한 내용중에 궁금하신 점이나 질문은 이메일이나 리플로 남겨주시면 답변드리도록 하겠습니다.


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
C#2009/01/29 05:59


여자친구와 함께 홈플러스에 갔다가 충동적으로 구입하게된 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에 접근하고 이를 활용하는지에 대해서 살펴보도록 하겠습니다. 그럼 오늘은 여기까지 하겠습니다! 질문은 리플 & 이메일로 남겨주세요!


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스