Skip to content

Commit 576642a

Browse files
committed
Add nb_NO keyboard layout
1 parent 400a53e commit 576642a

File tree

2 files changed

+258
-2
lines changed

2 files changed

+258
-2
lines changed

BadCard.ino

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ USBHIDKeyboard Keyboard;
1818
#include "src/USBHID-Keyboard/KeyboardLayout_DK.h"
1919
#include "src/USBHID-Keyboard/KeyboardLayout_BR.h"
2020
#include "src/USBHID-Keyboard/KeyboardLayout_GB.h"
21+
#include "src/USBHID-Keyboard/KeyboardLayout_NO.h"
2122

2223
#include "keys.h"
2324

@@ -47,8 +48,8 @@ int kbLayoutsCursor = 0;
4748
const int maxFiles = 100;
4849
String sdFiles[maxFiles] = {"NEW SCRIPT", "ACTIVATE BLE", "KB LAYOUT"};
4950

50-
const int kbLayoutsLen = 12; // Needs 1 more than the amount of layouts to prevent a visual bug in the menu
51-
String kbLayouts[kbLayoutsLen] = {"en_US", "es_ES", "de_DE", "pt_PT", "fr_FR", "sv_SE", "it_IT", "hu_HU", "da_DK", "pt_BR", "en_GB"};
51+
const int kbLayoutsLen = 13; // Needs 1 more than the amount of layouts to prevent a visual bug in the menu
52+
String kbLayouts[kbLayoutsLen] = {"en_US", "es_ES", "de_DE", "pt_PT", "fr_FR", "sv_SE", "it_IT", "hu_HU", "da_DK", "pt_BR", "en_GB", "nb_NO"};
5253

5354
const int scriptOptionsAmount = 3;
5455
String scriptMenuOptions[scriptOptionsAmount] = {"Execute script", "Edit script", "Delete script"};
@@ -619,6 +620,9 @@ void setKBLayout(int layoutNum) {
619620
case 10:
620621
layout = new KeyboardLayout_GB();
621622
break;
623+
case 11:
624+
layout = new KeyboardLayout_NO();
625+
break;
622626
}
623627
}
624628

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
2+
/*
3+
* Norwegian keyboard layout.
4+
*/
5+
6+
#include "KeyboardLayout.h"
7+
8+
#pragma once
9+
10+
//================================================================================
11+
//================================================================================
12+
// Keyboard
13+
14+
// nb_NO keys
15+
#define KEY_A_RING (136+0x2f)
16+
#define KEY_UMLAUT (136+0x30)
17+
#define KEY_ACUTE_ACC (136+0x2e)
18+
#define KEY_O_STROKE (136+0x33)
19+
#define KEY_ASH (136+0x34)
20+
21+
#define AMOUNT_OF_SPECIAL_CHARS 11
22+
23+
extern const char16_t KeyboardLayout_nb_NO_special_characters[AMOUNT_OF_SPECIAL_CHARS] PROGMEM = {
24+
u'å',
25+
u'¨',
26+
u'´',
27+
u'ø',
28+
u'æ',
29+
u'Å',
30+
u'^',
31+
u'~',
32+
u'`',
33+
u'Ø',
34+
u'Æ'
35+
};
36+
37+
extern const uint16_t KeyboardLayout_nb_NO_special_keycodes[AMOUNT_OF_SPECIAL_CHARS] PROGMEM = {
38+
KEY_A_RING,
39+
KEY_UMLAUT,
40+
KEY_ACUTE_ACC | ALT_GR,
41+
KEY_O_STROKE,
42+
KEY_ASH,
43+
KEY_A_RING | U16SHIFT,
44+
KEY_UMLAUT | U16SHIFT,
45+
KEY_UMLAUT | ALT_GR,
46+
KEY_ACUTE_ACC | U16SHIFT,
47+
KEY_O_STROKE | U16SHIFT,
48+
KEY_ASH | U16SHIFT
49+
};
50+
51+
extern const uint8_t KeyboardLayout_nb_NO[128] PROGMEM =
52+
{
53+
0x00, // NUL
54+
0x00, // SOH
55+
0x00, // STX
56+
0x00, // ETX
57+
0x00, // EOT
58+
0x00, // ENQ
59+
0x00, // ACK
60+
0x00, // BEL
61+
0x2a, // BS Backspace
62+
0x2b, // TAB Tab
63+
0x28, // LF Enter
64+
0x00, // VT
65+
0x00, // FF
66+
0x00, // CR
67+
0x00, // SO
68+
0x00, // SI
69+
0x00, // DEL
70+
0x00, // DC1
71+
0x00, // DC2
72+
0x00, // DC3
73+
0x00, // DC4
74+
0x00, // NAK
75+
0x00, // SYN
76+
0x00, // ETB
77+
0x00, // CAN
78+
0x00, // EM
79+
0x00, // SUB
80+
0x00, // ESC
81+
0x00, // FS
82+
0x00, // GS
83+
0x00, // RS
84+
0x00, // US
85+
86+
0x2c, // ' '
87+
0x1e|SHIFT, // !
88+
0x1f|SHIFT, // "
89+
0x20|SHIFT, // #
90+
0x21|ALT_GR, // $
91+
0x22|SHIFT, // %
92+
0x23|SHIFT, // &
93+
0x31, // '
94+
0x25|SHIFT, // (
95+
0x26|SHIFT, // )
96+
0x31|SHIFT, // *
97+
0x2d, // +
98+
0x36, // ,
99+
0x38, // -
100+
0x37, // .
101+
0x24|SHIFT, // /
102+
0x27, // 0
103+
0x1e, // 1
104+
0x1f, // 2
105+
0x20, // 3
106+
0x21, // 4
107+
0x22, // 5
108+
0x23, // 6
109+
0x24, // 7
110+
0x25, // 8
111+
0x26, // 9
112+
0x37|SHIFT, // :
113+
0x36|SHIFT, // ;
114+
0x32, // <
115+
0x27|SHIFT, // =
116+
0x32|SHIFT, // >
117+
0x2d|SHIFT, // ?
118+
0x1f|ALT_GR, // @
119+
0x04|SHIFT, // A
120+
0x05|SHIFT, // B
121+
0x06|SHIFT, // C
122+
0x07|SHIFT, // D
123+
0x08|SHIFT, // E
124+
0x09|SHIFT, // F
125+
0x0a|SHIFT, // G
126+
0x0b|SHIFT, // H
127+
0x0c|SHIFT, // I
128+
0x0d|SHIFT, // J
129+
0x0e|SHIFT, // K
130+
0x0f|SHIFT, // L
131+
0x10|SHIFT, // M
132+
0x11|SHIFT, // N
133+
0x12|SHIFT, // O
134+
0x13|SHIFT, // P
135+
0x14|SHIFT, // Q
136+
0x15|SHIFT, // R
137+
0x16|SHIFT, // S
138+
0x17|SHIFT, // T
139+
0x18|SHIFT, // U
140+
0x19|SHIFT, // V
141+
0x1a|SHIFT, // W
142+
0x1b|SHIFT, // X
143+
0x1c|SHIFT, // Y
144+
0x1d|SHIFT, // Z
145+
0x25|ALT_GR, // [
146+
0x2e, // bslash
147+
0x26|ALT_GR, // ]
148+
0x00, // ^ not supported (requires dead key + space)
149+
0x38|SHIFT, // _
150+
0x00, // ` not supported (requires dead key + space)
151+
0x04, // a
152+
0x05, // b
153+
0x06, // c
154+
0x07, // d
155+
0x08, // e
156+
0x09, // f
157+
0x0a, // g
158+
0x0b, // h
159+
0x0c, // i
160+
0x0d, // j
161+
0x0e, // k
162+
0x0f, // l
163+
0x10, // m
164+
0x11, // n
165+
0x12, // o
166+
0x13, // p
167+
0x14, // q
168+
0x15, // r
169+
0x16, // s
170+
0x17, // t
171+
0x18, // u
172+
0x19, // v
173+
0x1a, // w
174+
0x1b, // x
175+
0x1c, // y
176+
0x1d, // z
177+
0x24|ALT_GR, // {
178+
0x35, // |
179+
0x27|ALT_GR, // }
180+
0x00, // ~ not supported (requires dead key + space)
181+
0x00 // DEL
182+
};
183+
184+
class KeyboardLayout_NO : public KeyboardLayout
185+
{
186+
public:
187+
KeyboardLayout_NO()
188+
{
189+
}
190+
~KeyboardLayout_NO(){};
191+
const uint8_t *getKeymap()
192+
{
193+
return KeyboardLayout_nb_NO;
194+
}
195+
/**
196+
* @brief Returns the keycode for the given key
197+
*
198+
* @param key Key value as string
199+
* @return Key code if possible
200+
*/
201+
uint16_t getKeycode(char16_t key)
202+
{
203+
Serial.print("Keycode");
204+
uint16_t specialKeyCode = isSpecialKey(key);
205+
206+
Serial.println(specialKeyCode);
207+
// Check if special key is in the map
208+
if (specialKeyCode != 0)
209+
{
210+
return specialKeyCode;
211+
}
212+
// No special key use the normal layout
213+
else
214+
{
215+
if (key < 128)
216+
{
217+
return KeyboardLayout_nb_NO[key];
218+
}
219+
// Could not match code
220+
return 0;
221+
}
222+
}
223+
224+
uint16_t isSpecialKey(char16_t key)
225+
{
226+
uint16_t keycode = 0;
227+
for (int i = 0; i < AMOUNT_OF_SPECIAL_CHARS; i++)
228+
{
229+
Serial.print("Searching key: ");
230+
Serial.println(key);
231+
Serial.print("Comparing with list: ");
232+
Serial.println((char16_t)KeyboardLayout_nb_NO_special_characters[i]);
233+
234+
if (key == KeyboardLayout_nb_NO_special_characters[i])
235+
{
236+
Serial.println("Compare keys");
237+
Serial.println(key);
238+
Serial.println((char16_t)KeyboardLayout_nb_NO_special_characters[i]);
239+
Serial.println((char)key);
240+
Serial.println((char)KeyboardLayout_nb_NO_special_characters[i]);
241+
242+
243+
keycode = KeyboardLayout_nb_NO_special_keycodes[i];
244+
Serial.println(keycode);
245+
break;
246+
}
247+
}
248+
return keycode;
249+
}
250+
251+
protected:
252+
};

0 commit comments

Comments
 (0)