This repository has been archived on 2025-07-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Huim_OLD/sketch_sep26a.ino
2025-07-04 13:45:51 +09:00

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;
}