#include #include #include #include "Arduino_LED_Matrix.h" #include "Plist.h" #include "bitCol.h" ArduinoLEDMatrix matrix; String korLangToEngLang(const char* utf8); int keyVal[5] = {600, 650, 700, 800, 900};//s1,s2,s3... int NumKeys = 5; int keyIn; int key = -1; int oldkey = -1; int pointer = 0; String dubeolsik; void setup() { Keyboard.begin(); Mouse.begin(); //Serial.begin(9600); matrix.begin(); matrix.loadFrame(bitCol[pointer]); } void loop() { /* 디버깅용 시리얼 통신은 서비스 종료다 if(Serial.available() > 0) { int inByte = Serial.read(); switch (inByte) { case 'a': Serial.print("aca"); ++pointer; matrix.loadFrame(bitCol[pointer]); break; case 'b': --pointer; matrix.loadFrame(bitCol[pointer]); break; case 'c': matrix.loadFrame(bitCol[pointer]); Serial.print(PlistCount); break; case 'd': dubeolsik = korLangToEngLang(Plist[pointer]); Serial.print(dubeolsik); Serial.print(Pw); break; case 'e': break; } }*/ keyIn = analogRead(0); key = getKey(keyIn); if (key != oldkey) { delay(50); keyIn = analogRead(0); key = getKey(keyIn); if(key != oldkey) { oldkey = key; if (key >= 0) { switch(key) { case 0: //s1 act as left if (pointer > 0) { --pointer; matrix.loadFrame(bitCol[pointer]); } break; case 1: //s2 break; case 2: //s3 act as right if (pointer <= PlistCount) { ++pointer; matrix.loadFrame(bitCol[pointer]); } break; case 3: //s4 act as down button? //Keyboard.end(); Mouse.click(); break; case 4: //s5 middle button dubeolsik = korLangToEngLang(Plist[pointer]); delay(50); Keyboard.print(dubeolsik); delay(100); Keyboard.write(KEY_KP_ENTER); delay(100); Keyboard.print(Pw); delay(100); Keyboard.write(KEY_KP_ENTER); break; } } } } delay(100); } int getKey(unsigned int input) { int k; for (k = 0; k < NumKeys; k++) { if (input < keyVal[k]) { return k; } } if (k >= NumKeys)k = -1; return k; } //한글을 키보드 자판그대로 영어로 침 이보다 더 완벽한 설명을 모르겠음 //해당 메서드의 존재이유는 키보드 라이브러리에서 print메서드가 아스키기반으로 동작하는지 한글 먹으면 고장나서 그럼 String korLangToEngLang(const char* utf8) { const char* choseong[19] = { "r","R","s","e","E","f","a","q","Q","t", "T","d","w","W","c","z","x","v","g" }; const char* jungseong[21] = { "k","o","i","O","j","p","u","P","h","hk", "ho","hl","y","n","nj","np","nl","b","m","ml","l" }; const char* jongseong[28] = { "","r","R","rt","s","sw","sg","e","f","fr", "fa","fq","ft","fx","fv","fg","a","q","qt", "t","T","d","w","c","z","x","v","g" }; String result = ""; //사실 이 시점에서 그냥 hid keycode document보고 직접 내가 키코드 배열로 적는게 더 쉽지않았을까 생각되면 개추 //한글 조합형 자모는 U+1100~11FF[11] 영역에 위치한다. //한글 완성형 자모는 U+3130~318F 영역에 위치한다. //한글 완성형 글자는 U+AC00~D7A3[12] 영역에 위치한다. // => 알았지 chatgpt야? 해줘 while (*utf8) { unsigned int codepoint = 0; unsigned char ch = *utf8; if (ch < 0x80) { codepoint = ch; utf8 += 1; } else if ((ch & 0xE0) == 0xC0) { codepoint = ((utf8[0] & 0x1F) << 6) | (utf8[1] & 0x3F); utf8 += 2; } else if ((ch & 0xF0) == 0xE0) { codepoint = ((utf8[0] & 0x0F) << 12) | ((utf8[1] & 0x3F) << 6) | (utf8[2] & 0x3F); utf8 += 3; } else { utf8 += 1; // skip invalid character continue; } if (codepoint >= 0xAC00 && codepoint <= 0xD7A3) { int syllableIndex = codepoint - 0xAC00; int cho = syllableIndex / (21 * 28); int jung = (syllableIndex % (21 * 28)) / 28; int jong = syllableIndex % 28; result += choseong[cho]; result += jungseong[jung]; result += jongseong[jong]; } else { result += (char)codepoint; // non-Hangul characters } } return result; }