풋 입력> Win 소프트웨어 (v0.1)> UDP 통신/에지 (Push) 검출/스페이스 키 할당
운영 환경
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];
}
}
Reference
이 문제에 관하여(풋 입력> Win 소프트웨어 (v0.1)> UDP 통신/에지 (Push) 검출/스페이스 키 할당), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/5e3fc335da77d57591fc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)