제가 알고 있기로 위모트는 최대 4개의 좌표값을 잡을 수 있다고 합니다.
근데..희안한거는 첫번째 좌표값이 받고 두번째 좌표값을 잡고 있는 상태가 계속되면 현재 좌표값이
몇번 좌표값인지 그 인덱스값을 파악할 수 있지만 만일 첫번째 좌표값을 잠깐 잃게 된다면 두번째였던 좌표값이
첫번째 좌표값으로 바뀌게 됩니다. 머..하드웨어 입장에서 보면 당연할 수 있지만 그걸 이용해서 프로그램을
만드는 입장에서 문제가 생길 수 있더군요. 스틱에 진동센서를 두어 가상으로 드럼을 쳤을 때 진동이 오게끔
했습니다. 지그비를 썻죠...
근데 지그비 프로토콜을 각 스틱마다 따로 줬기 때문에 위에서 처럼 위모트에서 좌표값의 인덱스가 두번째였다가
첫번째로 바뀌게 되면 엉뚱한 스틱에 진동이 오게 되는 문제점이 발생했습니다..
역시나~~하드웨어와 소프트웨어중 어느쪽을 고칠지 고민중에 하드웨어 한 팀원이 해외연수를..ㅡㅡ 두둥!!!!!
하는 수 없이 어떻게 소프트웨어적으로 해야 했죠..ㅎㅎ
좌표값을 이용하는 것입니다. 일단 환경적 조건을 주었습니다. 스틱1,2이 두어 쥐어야 하는 손이 결정되어 있는 거
죠.....어처구니없는 경우가..ㅜㅁㅜ
그리고 두개의 스틱이 크로스 되면 좌표X값의 크기가 서로 바뀌기 때문에 진동정보을 전달하기 위한 정보 또한
바꾸어 주었습니다. 일단 크로스 문제가 해결되니 좌표값 하나가 사라졌다 나왔다해도 문제 없이 진동이
전달 되었습니다. 근데 이것들이 서로 물고 또 물어져서 결국에는 완벽하게 구현할려면 하드웨어적으로 스틱의
위치가 서로 바뀌어도 관계없도록 만들어야지 완벽한 사용이 가능했습니다..
마지막으로 걸리는 문제는
하나의 스틱만 있는데 2번스틱을 사용하면 진동은 1번 스틱으로 오는 거였죠. 결국 하드웨어적인 문제...
하나의 좌표값으로는 소프트웨어적으로 도저히 알 수 있는 방법이 없습니다..위모트는 순수한 좌표값만
던져주니까요..
허무하네요..ㅎㅎ 소프트웨어 코딩하는 입장에서 이런 문제로 고민을 하니...^^
그래도 재밌는 노다가 였습니다.
flag값 만들고 나니 생각보다 깔끔해서 올려 봅니다.
#define STICK_NOCROSS_CNT 1 // 일반적인 상태에서 계속 유지
#define STICK_CROSS_CHANGE_CROSS 2 // 초기크로스 상태에서 크로스됨
#define STICK_NOCROSS_CHANGE_CROSS 3 // 일반적인 상태에서 크로스 됨
#define STICK_CROSS_CNT 4 // 초기크로스 상태 계속 유지
if( g_nStickCnt == 2 )
{
// 크로스 되지 않은 상태에서 연주 시작 - 두개의 스틱좌표x값 비교
if( nLeftStickX <= nRightStickX )
{
if( g_bCurCrossFlag == false && g_bFirstFlag == false )
{
g_bCurCrossFlag = true; // 도중부터 크로스 상태임
g_bFirstFlag = true;
}
if( g_bCurCrossFlag == true ) // 일반적인 상태에서 계속 유지
{
g_nStateNum = STICK_NOCROSS_CNT;
}
else if( g_bStartCrossFlag == true ) // 초기크로스 상태에서 크로스됨
{
g_nStateNum = STICK_CROSS_CHANGE_CROSS;
}
}
else if( nLeftStickX > nRightStickX )
{ // 크로스 된 상태에서 연주 시작 - 두개의 스틱좌표x값 비교
if( g_bStartCrossFlag == false && g_bFirstFlag == false )
{
g_bStartCrossFlag = true; // 처음부터 크로스 상태임
g_bFirstFlag = true;
}
if( g_bCurCrossFlag == true ) // 일반적인 상태에서 크로스 됨
{
g_nStateNum = STICK_NOCROSS_CHANGE_CROSS;
}
else if( g_bStartCrossFlag == true ) // 초기크로스 상태 계속 유지
{
g_nStateNum = STICK_CROSS_CNT;
}
}
}