풋 입력> Win 소프트웨어 (v0.1)> UDP 통신/에지 (Push) 검출/스페이스 키 할당

관련 ぃ tp // m / 7, f9 / ms / c5, 39, 8c08 또는 7, 6, 5, f6

운영 환경
C++ Builder XE4

RPi 소프트웨어 ぃ tp // 이 m / 7 ~ f9 / ms / 후아 2 627443 ~ f137c84
반대로 UDP 통신을 통해 입력 정보를 얻는 Win 소프트웨어의 구현.

코드 v0.1



처리의 주요 부분.

Main.cpp

/*
v0.1 2016 Apr 24
    - recognize rising edge (push)
    - receive inputs through UDP
*/

static const int kNumInput = 6;

static bool sIns[kNumInput] = { 0 };

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Timer1->Enabled = false;

    IdUDPClient1->Host = L"192.168.10.6";
    IdUDPClient1->Port = 7002;
    IdUDPClient1->Active = true;

    IdUDPClient1->Send("foot\r\n");

    Sleep(10);
    Application->ProcessMessages();

    AnsiString res = IdUDPClient1->ReceiveString(200);

    procInput(res);

    IdUDPClient1->Active = false;
    Timer1->Enabled = true;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::procInput(String res)
{
    if(res.Length() == 0) {
        return;
    }

    std::unique_ptr<TStringList> line(new TStringList);

    line->CommaText = res;

    bool ins[kNumInput];
    try {
        for(int idx=0; idx < kNumInput; idx++) {
            ins[idx] = !( (bool)line->Strings[idx+1].ToInt() );
        }
    } catch (...) {
    }

    CheckBox1->Checked = ins[0];
    CheckBox2->Checked = ins[1];
    CheckBox3->Checked = ins[2];
    CheckBox4->Checked = ins[3];
    CheckBox5->Checked = ins[4];
    CheckBox6->Checked = ins[5];

    for(int idx=0; idx < kNumInput; idx++) {
        if (sIns[idx] == ins[idx]) {
            continue;
        }
        if (ins[idx]) {
            String msg = L"SW" + IntToStr(idx+1) + L" > pushed";
            Memo1->Lines->Add(msg);
        }
        sIns[idx] = ins[idx];
    }
}

Timer1: 300msec로 설정.

300msec마다 UDP 통신을 하여 현재의 키 상태를 취득.
이전 키의 상태와 비교하여 false에서 true로 변경 시(에지)에서 키가 눌렸다고 판단한다.

실행



차례로 발로 눌러 보았다.



스페이스 키를 누르십시오.



procInput()의 처리의 일부를 이하와 같이 했다.
SW4를 밟았을 때 SPACE 키를 누르게 된다.
        if (ins[idx]) {
            String msg = L"SW" + IntToStr(idx+1) + L" > pushed";
            Memo1->Lines->Add(msg);

            if (idx== 3) { // SW4
                keybd_event(VK_SPACE, 0, 0, 0);
            }
        }


이것으로 움직인 곳, 브라우저 열람시에 SW4를 눌러 스크롤되게 되었다. 스페이스 키를 눌렀다.

발로 누르고 나서 실제로 키 입력이 될 때까지의 응답성은 좋지 않다. 500msec 기다리는 느낌이다. 조정하여 좋아질까?

Shift keydown/keyup



Shift 키를 눌렀다 놓은 것을 SW1로 구현.
notepad에서 대문자/소문자 혼합 문장을 입력할 수 있었다.
void __fastcall TForm1::procInput(String res)
{
    if(res.Length() == 0) {
        return;
    }

    std::unique_ptr<TStringList> line(new TStringList);

    line->CommaText = res;

    bool ins[kNumInput];
    try {
        for(int idx=0; idx < kNumInput; idx++) {
            ins[idx] = !( (bool)line->Strings[idx+1].ToInt() );
        }
    } catch (...) {
    }

    CheckBox1->Checked = ins[0];
    CheckBox2->Checked = ins[1];
    CheckBox3->Checked = ins[2];
    CheckBox4->Checked = ins[3];
    CheckBox5->Checked = ins[4];
    CheckBox6->Checked = ins[5];

    for(int idx=0; idx < kNumInput; idx++) {
        if (sIns[idx] == ins[idx]) {
            continue;
        }
        if (ins[idx]) {
            String msg = L"SW" + IntToStr(idx+1) + L" > pushed";
            Memo1->Lines->Add(msg);

            if (idx== 3) { // SW4
                keybd_event(VK_SPACE, 0, 0, 0);
            }

        }

        if (idx == 0) {
            if(ins[idx]) { // key down
                keybd_event(VK_SHIFT, 0, 0, 0);
            } else { // key up
                keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
            }
        }
        sIns[idx] = ins[idx];
    }
}

좋은 웹페이지 즐겨찾기