Skip to content

Commit 131663c

Browse files
committed
V1.0.5 Add Italain and Spanish keyboard layouts other tidy ups
1 parent 0abe6c9 commit 131663c

File tree

6 files changed

+179
-100
lines changed

6 files changed

+179
-100
lines changed

examples/International/International.ino

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
September 2014 Uno and Mega 2560 September 2014 using Arduino V1.6.0
1919
January 2016 Uno, Mega 2560 and Due using Arduino 1.6.7 and Due Board
2020
Manager V1.6.6
21+
March 2020 Extend for Italian and Spanish keyboards
2122
2223
PS2KeyMap uses a default US-ASCII Map but different country
2324
mappings can be selected on the fly
@@ -28,6 +29,8 @@
2829
G for UK keyboard
2930
D for German keyboard
3031
F for French keyboard
32+
I for Italian keyboard
33+
E for Spanish keyboard
3134
3235
Defaults to US on start up
3336
@@ -96,6 +99,7 @@ Serial.println( "International Keyboard Test:" );
9699
Serial.print( "Default is US layout, type a key to change layout\n"
97100
" U for US G for GB/UK\n" );
98101
Serial.println( " D for DE F for FR\n"
102+
" I for IT E for ES\n"
99103
" All keys on keyboard echoed here" );
100104
// Start keyboard setup while outputting
101105
keyboard.begin( DATAPIN, IRQPIN );
@@ -141,6 +145,14 @@ if( code > 0 )
141145
case 'f':
142146
found = keymap.selectMap( (char *)"FR" );
143147
break;
148+
case 'E':
149+
case 'e':
150+
found = keymap.selectMap( (char *)"ES" );
151+
break;
152+
case 'I':
153+
case 'i':
154+
found = keymap.selectMap( (char *)"IT" );
155+
break;
144156
case 'G':
145157
case 'g':
146158
found = keymap.selectMap( (char *)"UK" );

examples/KeyToLCD/KeyToLCD.ino

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
September 2014 Uno and Mega 2560 September 2014 using Arduino V1.6.0
1818
January 2016 Uno, Mega 2560 and Due using Arduino 1.6.7 and Due Board
1919
Manager V1.6.6
20+
March 2020 Simplify example
2021
2122
This sketch displays text received from PS2 keyboard to LCD
2223
on same Arduino. Importantly it maps the keyboard to UTF-8
@@ -137,47 +138,16 @@ signed char rows = 0;
137138
/* messages constants */
138139
/* Key codes and strings for keys producing a string */
139140
/* three arrays in same order ( keycode, string to display, length of string ) */
140-
#if defined(PS2_REQUIRES_PROGMEM)
141-
const uint8_t codes[] PROGMEM = { PS2_KEY_SPACE, PS2_KEY_TAB, PS2_KEY_ESC, PS2_KEY_DELETE,
142-
PS2_KEY_F1, PS2_KEY_F2, PS2_KEY_F3, PS2_KEY_F4,
143-
PS2_KEY_F5, PS2_KEY_F6, PS2_KEY_F7, PS2_KEY_F8,
144-
PS2_KEY_F9, PS2_KEY_F10, PS2_KEY_F11, PS2_KEY_F12 };
145-
const char spacestr[] PROGMEM = " ";
146-
const char tabstr[] PROGMEM = "[Tab]";
147-
const char escstr[] PROGMEM = "[ESC]";
148-
const char delstr[] PROGMEM = "[Del]";
149-
const char f1str[] PROGMEM = "[F1]";
150-
const char f2str[] PROGMEM = "[F2]";
151-
const char f3str[] PROGMEM = "[F3]";
152-
const char f4str[] PROGMEM = "[F4]";
153-
const char f5str[] PROGMEM = "[F5]";
154-
const char f6str[] PROGMEM = "[F6]";
155-
const char f7str[] PROGMEM = "[F7]";
156-
const char f8str[] PROGMEM = "[F8]";
157-
const char f9str[] PROGMEM = "[F9]";
158-
const char f10str[] PROGMEM = "[F10]";
159-
const char f11str[] PROGMEM = "[F11]";
160-
const char f12str[] PROGMEM = "[F12]";
161-
162-
// Due to AVR Harvard architecture array of string pointers to actual strings
163-
const char *const keys[] PROGMEM = {
164-
spacestr, tabstr, escstr, delstr, f1str, f2str,
165-
f3str, f4str, f5str, f6str, f7str, f8str,
166-
f9str, f10str, f11str, f12str };
167-
const int8_t sizes[] PROGMEM = { 1, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
168-
char buffer[ 8 ];
169-
170-
#else
171-
const uint8_t codes[] = { PS2_KEY_SPACE, PS2_KEY_TAB, PS2_KEY_ESC,
141+
uint8_t codes[] = { PS2_KEY_SPACE, PS2_KEY_TAB, PS2_KEY_ESC,
172142
PS2_KEY_DELETE, PS2_KEY_F1, PS2_KEY_F2, PS2_KEY_F3,
173143
PS2_KEY_F4, PS2_KEY_F5, PS2_KEY_F6, PS2_KEY_F7,
174144
PS2_KEY_F8, PS2_KEY_F9, PS2_KEY_F10, PS2_KEY_F11,
175145
PS2_KEY_F12 };
176146
const char *const keys[] = { " ", "[Tab]", "[ESC]", "[Del]", "[F1]", "[F2]", "[F3]",
177147
"[F4]", "[F5]", "[F6]", "[F7]", "[F8]",
178148
"[F9]", "[F10]", "[F11]", "[F12]" };
179-
const int8_t sizes[] = { 1, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
180-
#endif
149+
int8_t sizes[] = { 1, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
150+
181151

182152
// Class initialisation/instantiation
183153
// keyboard library
@@ -320,30 +290,17 @@ if( keyboard.available() )
320290
if( base != PS2_KEY_EUROPE2 && ( base < PS2_KEY_KP0 || base >= PS2_KEY_F1 ) )
321291
{ // Non printable sort which ones we can print
322292
for( idx = 0; idx < sizeof( codes ); idx++ )
323-
#if defined(PS2_REQUIRES_PROGMEM)
324-
if( base == pgm_read_byte( codes + idx ) )
325-
#else
326293
if( base == codes[ idx ] )
327-
#endif
328294
{
329295
/* String outputs */
330296
mode = 1;
331-
#if defined(PS2_REQUIRES_PROGMEM)
332-
c = pgm_read_byte( sizes + idx );
333-
#else
334-
c = sizes[ idx ];
335-
#endif
297+
c = sizes[ idx ];
336298
cols += c - 1;
337299
check_cursor( );
338300
/* when cursor reset keep track */
339301
if( cols == 0 )
340302
cols = c;
341-
#if defined(PS2_REQUIRES_PROGMEM)
342-
strcpy_P( buffer, (char*)pgm_read_word( &( keys[ idx ] ) ) );
343-
lcd.print( buffer );
344-
#else
345303
lcd.print( keys[ idx ] );
346-
#endif
347304
cols++;
348305
check_cursor( );
349306
break;

library.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
name=PS2KeyMap
2-
version=1.0.4
2+
version=1.0.5
33
author=Paul Carpenter <[email protected]>
44
maintainer=Paul Carpenter <[email protected]>
55
sentence=PS2 keyboard codes from PS2KeyAdvanced to UTF-8 for any Latin language keyboard.
66
paragraph=Takes integer values from PS2KeyAdvanced to convert using selectable country mapping and you can add your own country mapping.
77
category=Other
88
url=https://github.com/techpaul/PS2KeyMap.git
9-
architectures=avr,sam
9+
architectures=avr,sam,samd1
1010
depends=PS2KeyAdvanced
1111
includes=PS2KeyAdvanced.h,PS2KeyMap.h
1212

src/PS2KeyData.h

Lines changed: 145 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
/* Version V1.0.4
1+
/* Version V1.0.5
22
PS2KeyMap.h - PS2KeyAdvanced library
33
Copyright (c) 2007 Free Software Foundation. All right reserved.
44
Written by Paul Carpenter, PC Services <[email protected]>
55
Created September 2014
66
Updated January 2016 - Paul Carpenter - add tested on Due and tidy ups for V1.5 Library Management
77
January 2020 - Paul Carpenter - extend library properties for V2.2 of Arduino Library Management
8+
March 2020 - Paul Carpenter - add Spanish and Italian Mappings
89
910
PRIVATE to library data and key mapping tables
1011
@@ -60,46 +61,46 @@ const uint16_t PROGMEM _US_ASCII[][ 2 ] = {
6061
#else
6162
const uint16_t _US_ASCII[][ 2 ] = {
6263
#endif
63-
{ PS2_SHIFT + PS2_KEY_1, '!' },
64-
{ PS2_SHIFT + PS2_KEY_2, '@' },
65-
{ PS2_SHIFT + PS2_KEY_3, '#' },
66-
{ PS2_SHIFT + PS2_KEY_4, '$' },
67-
{ PS2_SHIFT + PS2_KEY_5, '%' },
68-
{ PS2_SHIFT + PS2_KEY_6, '^' },
69-
{ PS2_SHIFT + PS2_KEY_7, '&' },
70-
{ PS2_SHIFT + PS2_KEY_8, '*' },
71-
{ PS2_SHIFT + PS2_KEY_9, '(' },
72-
{ PS2_SHIFT + PS2_KEY_0, ')' },
73-
{ PS2_KEY_KP_DOT, '.' },
74-
{ PS2_KEY_KP_ENTER, PS2_ENTER },
75-
{ PS2_KEY_KP_PLUS, '+' },
76-
{ PS2_KEY_KP_MINUS, '-' },
77-
{ PS2_KEY_KP_TIMES, '*' },
78-
{ PS2_KEY_KP_DIV, '/' },
79-
{ PS2_KEY_KP_COMMA, ',' },
80-
{ PS2_KEY_KP_EQUAL, '=' },
81-
{ PS2_KEY_APOS, '\'' },
82-
{ PS2_SHIFT + PS2_KEY_APOS, '"' },
83-
{ PS2_KEY_COMMA, ',' },
84-
{ PS2_SHIFT + PS2_KEY_COMMA, '<' },
85-
{ PS2_KEY_MINUS, '-' },
86-
{ PS2_SHIFT + PS2_KEY_MINUS, '_' },
87-
{ PS2_KEY_DOT, '.' },
88-
{ PS2_SHIFT + PS2_KEY_DOT, '>' },
89-
{ PS2_KEY_DIV, '/' },
90-
{ PS2_SHIFT + PS2_KEY_DIV, '?' },
91-
{ PS2_KEY_SINGLE, '`' },
92-
{ PS2_SHIFT + PS2_KEY_SINGLE, '~' },
93-
{ PS2_KEY_SEMI, ';' },
94-
{ PS2_SHIFT + PS2_KEY_SEMI, ':' },
95-
{ PS2_KEY_BACK, '\\' },
96-
{ PS2_SHIFT + PS2_KEY_BACK, '|' },
97-
{ PS2_KEY_OPEN_SQ, '[' },
98-
{ PS2_SHIFT + PS2_KEY_OPEN_SQ, '{' },
99-
{ PS2_KEY_CLOSE_SQ, ']' },
100-
{ PS2_SHIFT + PS2_KEY_CLOSE_SQ, '}' },
101-
{ PS2_KEY_EQUAL, '=' },
102-
{ PS2_SHIFT + PS2_KEY_EQUAL, '+' }
64+
{ PS2_SHIFT + PS2_KEY_1, '!' },
65+
{ PS2_SHIFT + PS2_KEY_2, '@' },
66+
{ PS2_SHIFT + PS2_KEY_3, '#' },
67+
{ PS2_SHIFT + PS2_KEY_4, '$' },
68+
{ PS2_SHIFT + PS2_KEY_5, '%' },
69+
{ PS2_SHIFT + PS2_KEY_6, '^' },
70+
{ PS2_SHIFT + PS2_KEY_7, '&' },
71+
{ PS2_SHIFT + PS2_KEY_8, '*' },
72+
{ PS2_SHIFT + PS2_KEY_9, '(' },
73+
{ PS2_SHIFT + PS2_KEY_0, ')' },
74+
{ PS2_KEY_KP_DOT, '.' },
75+
{ PS2_KEY_KP_ENTER, PS2_ENTER },
76+
{ PS2_KEY_KP_PLUS, '+' },
77+
{ PS2_KEY_KP_MINUS, '-' },
78+
{ PS2_KEY_KP_TIMES, '*' },
79+
{ PS2_KEY_KP_DIV, '/' },
80+
{ PS2_KEY_KP_COMMA, ',' },
81+
{ PS2_KEY_KP_EQUAL, '=' },
82+
{ PS2_KEY_APOS, '\'' },
83+
{ PS2_SHIFT + PS2_KEY_APOS, '"' },
84+
{ PS2_KEY_COMMA, ',' },
85+
{ PS2_SHIFT + PS2_KEY_COMMA, '<' },
86+
{ PS2_KEY_MINUS, '-' },
87+
{ PS2_SHIFT + PS2_KEY_MINUS, '_' },
88+
{ PS2_KEY_DOT, '.' },
89+
{ PS2_SHIFT + PS2_KEY_DOT, '>' },
90+
{ PS2_KEY_DIV, '/' },
91+
{ PS2_SHIFT + PS2_KEY_DIV, '?' },
92+
{ PS2_KEY_SINGLE, '`' },
93+
{ PS2_SHIFT + PS2_KEY_SINGLE, '~' },
94+
{ PS2_KEY_SEMI, ';' },
95+
{ PS2_SHIFT + PS2_KEY_SEMI, ':' },
96+
{ PS2_KEY_BACK, '\\' },
97+
{ PS2_SHIFT + PS2_KEY_BACK, '|' },
98+
{ PS2_KEY_OPEN_SQ, '[' },
99+
{ PS2_SHIFT + PS2_KEY_OPEN_SQ, '{' },
100+
{ PS2_KEY_CLOSE_SQ, ']' },
101+
{ PS2_SHIFT + PS2_KEY_CLOSE_SQ, '}' },
102+
{ PS2_KEY_EQUAL, '=' },
103+
{ PS2_SHIFT + PS2_KEY_EQUAL, '+' }
103104
};
104105

105106
#if defined(PS2_REQUIRES_PROGMEM)
@@ -272,6 +273,97 @@ const uint16_t _DEmap[][ 2 ] = {
272273
{ PS2_KEY_EUROPE2, '<' }
273274
};
274275
#endif
276+
#ifdef SPANISH
277+
#if defined(PS2_REQUIRES_PROGMEM)
278+
const uint16_t PROGMEM _ESmap[][ 2 ] = {
279+
#else
280+
const uint16_t _ESmap[][ 2 ] = {
281+
#endif
282+
{ PS2_KEY_SINGLE, PS2_MASCULINE_ORDINAL },
283+
{ PS2_SHIFT + PS2_KEY_SINGLE, PS2_FEMININE_ORDINAL },
284+
{ PS2_KEY_SINGLE + PS2_ALT_GR, '\\' },
285+
{ '1' + PS2_ALT_GR, '|' },
286+
{ PS2_SHIFT + '@', '"' },
287+
{ '2' + PS2_ALT_GR, '@' },
288+
{ PS2_SHIFT + '#', PS2_MIDDLE_DOT },
289+
{ '3' + PS2_ALT_GR, '#' },
290+
{ '4' + PS2_ALT_GR, '~' },
291+
{ PS2_SHIFT + '^', '&' },
292+
{ '6' + PS2_ALT_GR, PS2_NOT_SIGN },
293+
{ PS2_SHIFT + '&', '/' },
294+
{ PS2_SHIFT + '*', '(' },
295+
{ PS2_SHIFT + '(', ')' },
296+
{ PS2_SHIFT + ')', '=' },
297+
{ '-', '\'' },
298+
{ PS2_SHIFT + '_', '?' },
299+
{ '=', PS2_INVERTED_EXCLAMATION },
300+
{ PS2_SHIFT + '+', PS2_INVERTED_QUESTION_MARK },
301+
{ '[', '`' },
302+
{ PS2_SHIFT + '{', '^' },
303+
{ '[' + PS2_ALT_GR, '[' },
304+
{ ']', '+' },
305+
{ PS2_SHIFT + '}', '*' },
306+
{ ']' + PS2_ALT_GR, ']' },
307+
{ ';', PS2_n_TILDE },
308+
{ PS2_SHIFT + ':', PS2_N_TILDE },
309+
{ '\'', PS2_ACUTE_ACCENT },
310+
{ PS2_SHIFT + '"', PS2_DIAERESIS },
311+
{ '\'' + PS2_ALT_GR, '{' },
312+
{ '\\', PS2_c_CEDILLA },
313+
{ PS2_SHIFT + '|', PS2_C_CEDILLA },
314+
{ '\\' + PS2_ALT_GR, '}' },
315+
{ PS2_SHIFT + PS2_KEY_EUROPE2, '>' },
316+
{ PS2_KEY_EUROPE2, '<' },
317+
{ PS2_SHIFT + '<', ';' },
318+
{ PS2_SHIFT + '>', ':' },
319+
{ PS2_KEY_DIV, '-' },
320+
{ PS2_SHIFT + PS2_KEY_DIV, '+' }
321+
};
322+
#endif
323+
#ifdef ITALIAN
324+
#if defined(PS2_REQUIRES_PROGMEM)
325+
const uint16_t PROGMEM _ITmap[][ 2 ] = {
326+
#else
327+
const uint16_t _ITmap[][ 2 ] = {
328+
#endif
329+
{ PS2_KEY_SINGLE, '\\' },
330+
{ PS2_SHIFT + PS2_KEY_SINGLE, '|' },
331+
{ '@', '"' },
332+
{ PS2_SHIFT + '#', PS2_POUND_SIGN },
333+
{ '3' + PS2_ALT_GR, '#' },
334+
{ PS2_SHIFT + '^', '&' },
335+
{ PS2_SHIFT + '&', '/' },
336+
{ '7' + PS2_ALT_GR, '{' },
337+
{ PS2_SHIFT + '*', '(' },
338+
{ '8' + PS2_ALT_GR, '[' },
339+
{ PS2_SHIFT + '(', ')' },
340+
{ '9' + PS2_ALT_GR, ']' },
341+
{ PS2_SHIFT + ')', '=' },
342+
{ '0' + PS2_ALT_GR, '}' },
343+
{ '-', '\'' },
344+
{ PS2_SHIFT + '_', '?' },
345+
{ '=', PS2_i_GRAVE },
346+
{ PS2_SHIFT + '+', '^' },
347+
{ 'q' + PS2_ALT_GR, '@' },
348+
{ '[', PS2_e_GRAVE },
349+
{ PS2_SHIFT + '{', PS2_e_ACUTE },
350+
{ ']', '+' },
351+
{ PS2_SHIFT + '}', '*' },
352+
{ ']' + PS2_ALT_GR, '~' },
353+
{ ';', PS2_o_GRAVE },
354+
{ PS2_SHIFT + ':', PS2_c_CEDILLA },
355+
{ '\'', PS2_a_GRAVE },
356+
{ PS2_SHIFT + '"', PS2_DEGREE_SIGN },
357+
{ '\\', PS2_u_GRAVE },
358+
{ PS2_SHIFT + '|', PS2_SECTION_SIGN },
359+
{ PS2_SHIFT + PS2_KEY_EUROPE2, '>' },
360+
{ PS2_KEY_EUROPE2, '<' },
361+
{ PS2_SHIFT + '<', ';' },
362+
{ PS2_SHIFT + '>', ':' },
363+
{ PS2_KEY_DIV, '-' },
364+
{ PS2_SHIFT + PS2_KEY_DIV, '+' }
365+
};
366+
#endif
275367
#ifdef SPECIAL
276368
#if defined(PS2_REQUIRES_PROGMEM)
277369
const uint16_t PROGMEM _SpecialMap[][ 2 ] = {
@@ -290,21 +382,29 @@ typedef struct {
290382
} PS2Advmap;
291383

292384
// Actual map structure array ( 2 entries for GB and UK for same map
293-
// Because many people dont know ISO code for UK is GB )
294-
// Actually held in RAM but small in size
295-
const PS2Advmap _KeyMaps[] = {
385+
// Because many people don't know ISO code for UK is GB )
386+
#if defined(PS2_REQUIRES_PROGMEM)
387+
const PS2Advmap PROGMEM _KeyMaps[ ] = {
388+
#else
389+
const PS2Advmap _KeyMaps[ ] = {
390+
#endif
296391
{ "US", sizeof( _US_ASCII ) / ( 2 * sizeof( uint16_t ) ), (uint16_t *)_US_ASCII },
297392
#ifdef FRENCH
298393
{ "FR", sizeof( _FRmap ) / ( 2 * sizeof( uint16_t ) ), (uint16_t *)_FRmap },
299394
#endif
300395
#ifdef GERMAN
301396
{ "DE", sizeof( _DEmap ) / ( 2 * sizeof( uint16_t ) ), (uint16_t *)_DEmap },
302397
#endif
398+
#ifdef SPANISH
399+
{ "ES", sizeof( _ESmap ) / ( 2 * sizeof( uint16_t ) ), (uint16_t *)_ESmap },
400+
#endif
401+
#ifdef ITALIAN
402+
{ "IT", sizeof( _ITmap ) / ( 2 * sizeof( uint16_t ) ), (uint16_t *)_ITmap },
403+
#endif
303404
#ifdef SPECIAL
304405
{ "--", sizeof( _SpecialMap ) / ( 2 * sizeof( uint16_t ) ), (uint16_t* )_SpecialMap },
305406
#endif
306407
{ "UK", sizeof( _UKmap ) / ( 2 * sizeof( uint16_t ) ), (uint16_t *)_UKmap },
307408
{ "GB", sizeof( _UKmap ) / ( 2 * sizeof( uint16_t ) ), (uint16_t *)_UKmap }
308409
};
309-
310410
#endif

0 commit comments

Comments
 (0)