commit 05f33feddb441191b61703979aeebde4967146ab Author: a4plane Date: Fri Jul 4 13:45:51 2025 +0900 뎃 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb8d824 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +Plist.h diff --git a/bitCol.h b/bitCol.h new file mode 100644 index 0000000..4857f15 --- /dev/null +++ b/bitCol.h @@ -0,0 +1,212 @@ +const uint32_t bitCol[][4] = { + { + 0x38828, + 0x82882882, + 0x88288b89, + 66 + }, + { + 0x39c28, + 0x428429c2, + 0x90290b9d, + 66 + }, + { + 0x39c28, + 0x428429c2, + 0x84284b9d, + 66 + }, + { + 0x39429, + 0x429429c2, + 0x84284b85, + 66 + }, + { + 0x39c29, + 0x29029c2, + 0x84284b9d, + 66 + }, + { + 0x39c29, + 0x29029c2, + 0x94294b9d, + 66 + }, + { + 0x39c28, + 0x42842842, + 0x84284b85, + 66 + }, + { + 0x39c29, + 0x429429c2, + 0x94294b9d, + 66 + }, + { + 0x39c29, + 0x429429c2, + 0x84284b85, + 66 + }, + { + 0x11c11, + 0x41141141, + 0x1411491d, + 66 + }, + { + 0x10810, + 0x81081081, + 0x8108909, + 66 + }, + { + 0x11c10, + 0x410411c1, + 0x1011091d, + 66 + }, + { + 0x11c10, + 0x410411c1, + 0x410491d, + 66 + }, + { + 0x11411, + 0x411411c1, + 0x4104905, + 66 + }, + { + 0x11c11, + 0x11011c1, + 0x410491d, + 66 + }, + { + 0x11c11, + 0x11011c1, + 0x1411491d, + 66 + }, + { + 0x11c10, + 0x41041041, + 0x4104905, + 66 + }, + { + 0x11c11, + 0x411411c1, + 0x1411491d, + 66 + }, + { + 0x11c11, + 0x411411c1, + 0x4104905, + 66 + }, + { + 0x39c09, + 0x40943942, + 0x14214b9d, + 66 + }, + { + 0x38808, + 0x80883882, + 0x8208b89, + 66 + }, + { + 0x39c08, + 0x408439c2, + 0x10210b9d, + 66 + }, + { + 0x39c08, + 0x408439c2, + 0x4204b9d, + 66 + }, + { + 0x39409, + 0x409439c2, + 0x4204b85, + 66 + }, + { + 0x39c09, + 0x9039c2, + 0x4204b9d, + 66 + }, + { + 0x39c09, + 0x9039c2, + 0x14214b9d, + 66 + }, + { + 0x39c08, + 0x40843842, + 0x4204b85, + 66 + }, + { + 0x39c09, + 0x409439c2, + 0x14214b9d, + 66 + }, + { + 0x39c09, + 0x409439c2, + 0x4204b85, + 66 + }, + { + 0x39c09, + 0x40943940, + 0x94094b9d, + 66 + }, + { + 0x38808, + 0x80883880, + 0x88088b89, + 66 + }, + { + 0x39c08, + 0x408439c0, + 0x90090b9d, + 66 + }, + { + 0x39c08, + 0x408439c0, + 0x84084b9d, + 66 + }, + { + 0x39409, + 0x409439c0, + 0x84084b85, + 66 + }, + { + 0x41020, + 0x81040821, + 0x4208410, + 66 + } +}; \ No newline at end of file diff --git a/sketch_sep26a.ino b/sketch_sep26a.ino new file mode 100644 index 0000000..62d1ab5 --- /dev/null +++ b/sketch_sep26a.ino @@ -0,0 +1,199 @@ +#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; +} +