200 lines
4.6 KiB
C++
200 lines
4.6 KiB
C++
#include <Keyboard.h>
|
|
#include <algorithm>
|
|
#include <Mouse.h>
|
|
#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;
|
|
}
|
|
|