Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: RA8875_KeyPadDemo PUB_RA8875_Keypad IAC_Final_Monil_copy
Keypad.cpp@5:7ccb8f7386fa, 2016-11-12 (annotated)
- Committer:
- WiredHome
- Date:
- Sat Nov 12 20:09:21 2016 +0000
- Revision:
- 5:7ccb8f7386fa
- Parent:
- 4:edb5155f1b6f
- Child:
- 6:4da6fa0fe51b
Remove debug msgs.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WiredHome | 0:9b0b4ae5b47a | 1 | #include "Keypad.h" |
WiredHome | 0:9b0b4ae5b47a | 2 | |
WiredHome | 1:7feeebbd8367 | 3 | // byte pairs: size, symbol [,size, symbol [, size, symbol [...]]] |
WiredHome | 1:7feeebbd8367 | 4 | // size is a scale factor where 10 = "normal calculated size" based on the keyboard width and the # of keys, 5 is 1/2 width, etc. |
WiredHome | 1:7feeebbd8367 | 5 | // symbol is either the ASCII character to show, when leveraging the RA8875 internal fonts, or it is a special |
WiredHome | 1:7feeebbd8367 | 6 | // character [normally non-printable] that is intercepted to perform an operation (e.g. <bs>, <shift>, etc.) |
WiredHome | 1:7feeebbd8367 | 7 | // \x01: special no-key value, to leave whitespace before the next key. |
WiredHome | 2:6d05764dfde7 | 8 | const char kpd_shiftkeys[] = { |
WiredHome | 0:9b0b4ae5b47a | 9 | 5,'\x01', 8,'\x15',10,'~',10,'!',10,'@',10,'#',10,'$',10,'%',10,'^',10,'&',10,'*',10,'(',10,')',10,'_', 10,'+',10,'\x1B',0,0, |
WiredHome | 0:9b0b4ae5b47a | 10 | 5,'\x01',12,'\x1A',10,'Q',10,'W',10,'E',10,'R',10,'T',10,'Y',10,'U',10,'I',10,'O',10,'P',10,'{', 10,'}',10,'|',0,0, |
WiredHome | 0:9b0b4ae5b47a | 11 | 5,'\x01',15,' ',10,'A',10,'S',10,'D',10,'F',10,'G',10,'H',10,'J',10,'K',10,'L',10,':',10,'"', 17,'\x1C',0,0, |
WiredHome | 0:9b0b4ae5b47a | 12 | 5,'\x01',21,'\x18',10,'Z',10,'X',10,'C',10,'V',10,'B',10,'N',10,'M',10,'<',10,'>',10,'?',21,'\x18',0,0, |
WiredHome | 0:9b0b4ae5b47a | 13 | 5,'\x01',40,'\x01',55,' ',0,0, |
WiredHome | 0:9b0b4ae5b47a | 14 | 0,0 |
WiredHome | 0:9b0b4ae5b47a | 15 | }; |
WiredHome | 2:6d05764dfde7 | 16 | const char kpd_unshiftkeys[] = { |
WiredHome | 0:9b0b4ae5b47a | 17 | 5,'\x01', 8,'\x15',10,'`',10,'1',10,'2',10,'3',10,'4',10,'5',10,'6',10,'7',10,'8',10,'9',10,'0',10,'-', 10,'=',10,'\x1B',0,0, |
WiredHome | 0:9b0b4ae5b47a | 18 | 5,'\x01',12,'\x1A',10,'q',10,'w',10,'e',10,'r',10,'t',10,'y',10,'u',10,'i',10,'o',10,'p',10,'[', 10,']',10,'\\',0,0, |
WiredHome | 0:9b0b4ae5b47a | 19 | 5,'\x01',15,' ',10,'a',10,'s',10,'d',10,'f',10,'g',10,'h',10,'j',10,'k',10,'l',10,';',10,'\'', 17,'\x1C',0,0, |
WiredHome | 0:9b0b4ae5b47a | 20 | 5,'\x01',21,'\x18',10,'z',10,'x',10,'c',10,'v',10,'b',10,'n',10,'m',10,',',10,'.',10,'/',21,'\x18',0,0, |
WiredHome | 0:9b0b4ae5b47a | 21 | 5,'\x01',40,'\x01',55,' ',0,0, |
WiredHome | 0:9b0b4ae5b47a | 22 | 0,0 |
WiredHome | 0:9b0b4ae5b47a | 23 | }; |
WiredHome | 0:9b0b4ae5b47a | 24 | |
WiredHome | 1:7feeebbd8367 | 25 | const Keypad::keyboard_t internalkbd = { |
WiredHome | 1:7feeebbd8367 | 26 | 0,-1, // x,y: 0; start at left edge, -1; top is calculated from # rows |
WiredHome | 1:7feeebbd8367 | 27 | // -1 is size calculated |
WiredHome | 1:7feeebbd8367 | 28 | 0, // wi,h: width is calculated |
WiredHome | 1:7feeebbd8367 | 29 | 0, // bottom of screen justified |
WiredHome | 1:7feeebbd8367 | 30 | 5, // 5 rows |
WiredHome | 1:7feeebbd8367 | 31 | 15, // columns in the <esc>`1234...-=<bs> row |
WiredHome | 2:6d05764dfde7 | 32 | kpd_unshiftkeys, |
WiredHome | 2:6d05764dfde7 | 33 | kpd_shiftkeys |
WiredHome | 1:7feeebbd8367 | 34 | }; |
WiredHome | 1:7feeebbd8367 | 35 | |
WiredHome | 1:7feeebbd8367 | 36 | |
WiredHome | 0:9b0b4ae5b47a | 37 | |
WiredHome | 0:9b0b4ae5b47a | 38 | Keypad::Keypad(RA8875 & _ra, color_t _fore, color_t _back) : ra(_ra), fore(_fore), back(_back) { |
WiredHome | 0:9b0b4ae5b47a | 39 | shift = false; |
WiredHome | 1:7feeebbd8367 | 40 | enter_key = KYBD_SYM_ENTER; |
WiredHome | 1:7feeebbd8367 | 41 | esc_key = KYBD_SYM_ESCAPE; |
WiredHome | 4:edb5155f1b6f | 42 | user_font = NULL; |
WiredHome | 4:edb5155f1b6f | 43 | user_font_scale = 0; |
WiredHome | 0:9b0b4ae5b47a | 44 | } |
WiredHome | 0:9b0b4ae5b47a | 45 | |
WiredHome | 0:9b0b4ae5b47a | 46 | Keypad::~Keypad() { |
WiredHome | 0:9b0b4ae5b47a | 47 | } |
WiredHome | 0:9b0b4ae5b47a | 48 | |
WiredHome | 1:7feeebbd8367 | 49 | bool Keypad::SetKeyboard(const keyboard_t * _kbd, char _enter_key, char _esc_key) { |
WiredHome | 1:7feeebbd8367 | 50 | if (_kbd) |
WiredHome | 1:7feeebbd8367 | 51 | kbd = _kbd; |
WiredHome | 1:7feeebbd8367 | 52 | else |
WiredHome | 1:7feeebbd8367 | 53 | kbd = &internalkbd; |
WiredHome | 1:7feeebbd8367 | 54 | enter_key = _enter_key; |
WiredHome | 1:7feeebbd8367 | 55 | esc_key = _esc_key; |
WiredHome | 1:7feeebbd8367 | 56 | return true; |
WiredHome | 1:7feeebbd8367 | 57 | } |
WiredHome | 1:7feeebbd8367 | 58 | |
WiredHome | 4:edb5155f1b6f | 59 | bool Keypad::SetKeyboardFont(const uint8_t * _font, int _fontscale) { |
WiredHome | 4:edb5155f1b6f | 60 | if (_font) |
WiredHome | 4:edb5155f1b6f | 61 | user_font = _font; |
WiredHome | 4:edb5155f1b6f | 62 | else |
WiredHome | 4:edb5155f1b6f | 63 | user_font_scale = _fontscale; |
WiredHome | 4:edb5155f1b6f | 64 | return true; |
WiredHome | 4:edb5155f1b6f | 65 | } |
WiredHome | 4:edb5155f1b6f | 66 | |
WiredHome | 0:9b0b4ae5b47a | 67 | void Keypad::DrawKey(rect_t r, char c, bool invert) { |
WiredHome | 2:6d05764dfde7 | 68 | ra.fillroundrect(r, 2, 2, invert ? fore : back); |
WiredHome | 2:6d05764dfde7 | 69 | ra.roundrect(r, 2, 2, invert ? back : fore); |
WiredHome | 0:9b0b4ae5b47a | 70 | ra.SetTextCursor(r.p1.x+(r.p2.x-r.p1.x)/2-ra.fontwidth()/2, r.p1.y+2); |
WiredHome | 1:7feeebbd8367 | 71 | if (invert) { |
WiredHome | 1:7feeebbd8367 | 72 | ra.foreground(back); |
WiredHome | 1:7feeebbd8367 | 73 | ra.background(fore); |
WiredHome | 3:402f1126a3ec | 74 | ra.SetTextCursorControl(RA8875::NOCURSOR); |
WiredHome | 1:7feeebbd8367 | 75 | } |
WiredHome | 0:9b0b4ae5b47a | 76 | ra.putc(c); |
WiredHome | 1:7feeebbd8367 | 77 | if (invert) { |
WiredHome | 1:7feeebbd8367 | 78 | ra.foreground(fore); |
WiredHome | 1:7feeebbd8367 | 79 | ra.background(back); |
WiredHome | 1:7feeebbd8367 | 80 | } |
WiredHome | 0:9b0b4ae5b47a | 81 | } |
WiredHome | 0:9b0b4ae5b47a | 82 | |
WiredHome | 0:9b0b4ae5b47a | 83 | void Keypad::Erase(color_t c) { |
WiredHome | 0:9b0b4ae5b47a | 84 | dim_t kH = ra.fontheight() + 4; |
WiredHome | 1:7feeebbd8367 | 85 | rect_t r = ComputeKeypadRect(); |
WiredHome | 1:7feeebbd8367 | 86 | |
WiredHome | 4:edb5155f1b6f | 87 | ra.fillrect(r, c); |
WiredHome | 4:edb5155f1b6f | 88 | if (user_font) |
WiredHome | 4:edb5155f1b6f | 89 | ra.SelectUserFont(restore_font); // restore |
WiredHome | 4:edb5155f1b6f | 90 | else if (restore_hScale | restore_vScale) |
WiredHome | 4:edb5155f1b6f | 91 | ra.SetTextFontSize(restore_hScale, restore_vScale); |
WiredHome | 5:7ccb8f7386fa | 92 | //printf("Restore: font: %p, scale: %d,%d\r\n", user_font, restore_hScale, restore_vScale); |
WiredHome | 0:9b0b4ae5b47a | 93 | } |
WiredHome | 0:9b0b4ae5b47a | 94 | |
WiredHome | 0:9b0b4ae5b47a | 95 | void Keypad::DrawInputPanel(const char * prompt) { |
WiredHome | 4:edb5155f1b6f | 96 | rect_t r; |
WiredHome | 4:edb5155f1b6f | 97 | |
WiredHome | 4:edb5155f1b6f | 98 | if (user_font || user_font_scale) { |
WiredHome | 4:edb5155f1b6f | 99 | restore_font = ra.GetUserFont(); // save to later restore |
WiredHome | 4:edb5155f1b6f | 100 | ra.GetTextFontSize(&restore_hScale, &restore_vScale); |
WiredHome | 5:7ccb8f7386fa | 101 | //printf("Save : font: %p, scale: %d,%d\r\n", user_font, restore_hScale, restore_vScale); |
WiredHome | 4:edb5155f1b6f | 102 | } |
WiredHome | 4:edb5155f1b6f | 103 | if (!user_font && user_font_scale) { |
WiredHome | 4:edb5155f1b6f | 104 | ra.SetTextFontSize(user_font_scale); |
WiredHome | 4:edb5155f1b6f | 105 | } |
WiredHome | 4:edb5155f1b6f | 106 | r = ComputeKeypadRect(); |
WiredHome | 0:9b0b4ae5b47a | 107 | ra.fillrect(r, back); |
WiredHome | 0:9b0b4ae5b47a | 108 | ra.foreground(fore); |
WiredHome | 0:9b0b4ae5b47a | 109 | ra.background(back); |
WiredHome | 0:9b0b4ae5b47a | 110 | ra.SetTextCursor(r.p1.x,r.p1.y+2); |
WiredHome | 5:7ccb8f7386fa | 111 | ra.puts(prompt); ra.puts(":"); |
WiredHome | 0:9b0b4ae5b47a | 112 | userText = ra.GetTextCursor(); |
WiredHome | 0:9b0b4ae5b47a | 113 | DrawKeypad(); |
WiredHome | 0:9b0b4ae5b47a | 114 | } |
WiredHome | 0:9b0b4ae5b47a | 115 | |
WiredHome | 1:7feeebbd8367 | 116 | rect_t Keypad::ComputeKeypadRect(void) { |
WiredHome | 1:7feeebbd8367 | 117 | dim_t kH = ra.fontheight() + 4; |
WiredHome | 1:7feeebbd8367 | 118 | rect_t r; |
WiredHome | 1:7feeebbd8367 | 119 | |
WiredHome | 1:7feeebbd8367 | 120 | if (kbd->x <= 0) |
WiredHome | 1:7feeebbd8367 | 121 | r.p1.x = 0; |
WiredHome | 1:7feeebbd8367 | 122 | else |
WiredHome | 1:7feeebbd8367 | 123 | r.p1.x = kbd->x; |
WiredHome | 1:7feeebbd8367 | 124 | if (kbd->y <= 0) |
WiredHome | 1:7feeebbd8367 | 125 | r.p1.y = ra.height() - (kH * (kbd->rows+1)) - 1; |
WiredHome | 1:7feeebbd8367 | 126 | else |
WiredHome | 1:7feeebbd8367 | 127 | r.p1.y = kbd->y; |
WiredHome | 1:7feeebbd8367 | 128 | if (kbd->width == 0) |
WiredHome | 1:7feeebbd8367 | 129 | r.p2.x = ra.width() - 1; |
WiredHome | 1:7feeebbd8367 | 130 | else |
WiredHome | 1:7feeebbd8367 | 131 | r.p2.x = r.p1.x + kbd->width - 1; |
WiredHome | 1:7feeebbd8367 | 132 | if (kbd->height == 0) |
WiredHome | 1:7feeebbd8367 | 133 | r.p2.y = ra.height() - 1; |
WiredHome | 1:7feeebbd8367 | 134 | else |
WiredHome | 1:7feeebbd8367 | 135 | r.p2.y = r.p1.y + kbd->height - 1; |
WiredHome | 3:402f1126a3ec | 136 | //printf("KeypadRect (%d,%d) - (%d,%d)\r\n", r.p1.x, r.p1.y, r.p2.x, r.p2.y); |
WiredHome | 1:7feeebbd8367 | 137 | return r; |
WiredHome | 1:7feeebbd8367 | 138 | } |
WiredHome | 1:7feeebbd8367 | 139 | |
WiredHome | 0:9b0b4ae5b47a | 140 | void Keypad::DrawKeypad(void) { |
WiredHome | 4:edb5155f1b6f | 141 | dim_t fW; |
WiredHome | 4:edb5155f1b6f | 142 | dim_t fH; |
WiredHome | 4:edb5155f1b6f | 143 | dim_t kW; // key width |
WiredHome | 4:edb5155f1b6f | 144 | dim_t kH; // key Height |
WiredHome | 4:edb5155f1b6f | 145 | |
WiredHome | 4:edb5155f1b6f | 146 | fW = ra.fontwidth(); |
WiredHome | 4:edb5155f1b6f | 147 | fH = ra.fontheight(); |
WiredHome | 4:edb5155f1b6f | 148 | kH = fH + 4; |
WiredHome | 1:7feeebbd8367 | 149 | |
WiredHome | 1:7feeebbd8367 | 150 | const char * p = kbd->keydef1; |
WiredHome | 1:7feeebbd8367 | 151 | rect_t r = ComputeKeypadRect(); |
WiredHome | 1:7feeebbd8367 | 152 | rect_t ref = r; |
WiredHome | 1:7feeebbd8367 | 153 | kW = (ref.p2.x - ref.p1.x) / (kbd->cols+1); |
WiredHome | 3:402f1126a3ec | 154 | //printf("DrawKeypad kW=%d from (%d,%d) %d\r\n", kW, ref.p2.x, ref.p1.x, kbd->cols+1); |
WiredHome | 1:7feeebbd8367 | 155 | r.p1.y += kH; |
WiredHome | 0:9b0b4ae5b47a | 156 | if (shift) |
WiredHome | 1:7feeebbd8367 | 157 | p = kbd->keydef2; |
WiredHome | 0:9b0b4ae5b47a | 158 | while (*p || *(p+2)) { |
WiredHome | 0:9b0b4ae5b47a | 159 | if (*p == 0) { |
WiredHome | 1:7feeebbd8367 | 160 | r.p1.x = ref.p1.x; |
WiredHome | 0:9b0b4ae5b47a | 161 | r.p1.y += kH; |
WiredHome | 0:9b0b4ae5b47a | 162 | } else { |
WiredHome | 0:9b0b4ae5b47a | 163 | const char * symbol = p + 1; |
WiredHome | 0:9b0b4ae5b47a | 164 | if (*symbol >= 0x10) { |
WiredHome | 0:9b0b4ae5b47a | 165 | r.p2.x = r.p1.x + (kW * *p)/10; |
WiredHome | 0:9b0b4ae5b47a | 166 | r.p2.y = r.p1.y + kH; |
WiredHome | 0:9b0b4ae5b47a | 167 | DrawKey(r,*symbol); |
WiredHome | 0:9b0b4ae5b47a | 168 | } |
WiredHome | 0:9b0b4ae5b47a | 169 | r.p1.x += (kW * *p)/10; |
WiredHome | 0:9b0b4ae5b47a | 170 | } |
WiredHome | 0:9b0b4ae5b47a | 171 | p+=2; |
WiredHome | 0:9b0b4ae5b47a | 172 | } |
WiredHome | 0:9b0b4ae5b47a | 173 | } |
WiredHome | 0:9b0b4ae5b47a | 174 | |
WiredHome | 0:9b0b4ae5b47a | 175 | char Keypad::isKeyTouched(point_t * point, rect_t * rectTouched) { |
WiredHome | 1:7feeebbd8367 | 176 | dim_t kW; |
WiredHome | 0:9b0b4ae5b47a | 177 | dim_t kH = ra.fontheight() + 4; |
WiredHome | 0:9b0b4ae5b47a | 178 | |
WiredHome | 1:7feeebbd8367 | 179 | const char * p = kbd->keydef1; |
WiredHome | 1:7feeebbd8367 | 180 | rect_t r = ComputeKeypadRect(); |
WiredHome | 1:7feeebbd8367 | 181 | rect_t ref = r; |
WiredHome | 1:7feeebbd8367 | 182 | kW = (ref.p2.x - ref.p1.x) / (kbd->cols+1); |
WiredHome | 1:7feeebbd8367 | 183 | r.p1.y = r.p1.y + kH; |
WiredHome | 0:9b0b4ae5b47a | 184 | if (shift) |
WiredHome | 1:7feeebbd8367 | 185 | p = kbd->keydef2; |
WiredHome | 0:9b0b4ae5b47a | 186 | while (*p || *(p+2)) { |
WiredHome | 0:9b0b4ae5b47a | 187 | if (*p == 0) { |
WiredHome | 1:7feeebbd8367 | 188 | r.p1.x = ref.p1.x; |
WiredHome | 0:9b0b4ae5b47a | 189 | r.p1.y += kH; |
WiredHome | 0:9b0b4ae5b47a | 190 | } else { |
WiredHome | 0:9b0b4ae5b47a | 191 | const char * symbol = p + 1; |
WiredHome | 0:9b0b4ae5b47a | 192 | if (*symbol >= 0x10) { |
WiredHome | 0:9b0b4ae5b47a | 193 | r.p2.x = r.p1.x + (kW * *p)/10; |
WiredHome | 0:9b0b4ae5b47a | 194 | r.p2.y = r.p1.y + kH; |
WiredHome | 0:9b0b4ae5b47a | 195 | if (ra.Intersect(r, *point)) { |
WiredHome | 0:9b0b4ae5b47a | 196 | if (rectTouched) |
WiredHome | 0:9b0b4ae5b47a | 197 | *rectTouched = r; |
WiredHome | 0:9b0b4ae5b47a | 198 | return (*symbol); |
WiredHome | 0:9b0b4ae5b47a | 199 | } |
WiredHome | 0:9b0b4ae5b47a | 200 | } |
WiredHome | 0:9b0b4ae5b47a | 201 | r.p1.x += (kW * *p)/10; |
WiredHome | 0:9b0b4ae5b47a | 202 | } |
WiredHome | 0:9b0b4ae5b47a | 203 | p+=2; |
WiredHome | 0:9b0b4ae5b47a | 204 | } |
WiredHome | 0:9b0b4ae5b47a | 205 | return 0; |
WiredHome | 0:9b0b4ae5b47a | 206 | } |
WiredHome | 0:9b0b4ae5b47a | 207 | |
WiredHome | 0:9b0b4ae5b47a | 208 | void Keypad::ShowBufferMetrics(void) { |
WiredHome | 1:7feeebbd8367 | 209 | rect_t r = ComputeKeypadRect(); |
WiredHome | 3:402f1126a3ec | 210 | ra.SetTextCursor(r.p2.x-1-ra.fontwidth()*5, r.p1.y+2); |
WiredHome | 3:402f1126a3ec | 211 | ra.printf("%02d/%02d", pNext - pStart, bufSize); // "001/100" |
WiredHome | 1:7feeebbd8367 | 212 | //ra.SetTextCursor(ra.width()-1-ra.fontwidth()*7, ra.height()-1-ra.fontheight()); |
WiredHome | 0:9b0b4ae5b47a | 213 | ra.SetTextCursor(userText.x, userText.y); |
WiredHome | 0:9b0b4ae5b47a | 214 | ra.SetTextCursorControl(RA8875::UNDER); |
WiredHome | 0:9b0b4ae5b47a | 215 | } |
WiredHome | 0:9b0b4ae5b47a | 216 | |
WiredHome | 4:edb5155f1b6f | 217 | bool Keypad::GetString(char * buffer, size_t size, const char * prompt, char mask, bool auto_close) { |
WiredHome | 0:9b0b4ae5b47a | 218 | point_t point = {0, 0}; |
WiredHome | 4:edb5155f1b6f | 219 | bool success = false; |
WiredHome | 4:edb5155f1b6f | 220 | |
WiredHome | 0:9b0b4ae5b47a | 221 | pStart = pNext = buffer; |
WiredHome | 0:9b0b4ae5b47a | 222 | bufSize = size; |
WiredHome | 0:9b0b4ae5b47a | 223 | DrawInputPanel(prompt); |
WiredHome | 0:9b0b4ae5b47a | 224 | ShowBufferMetrics(); |
WiredHome | 0:9b0b4ae5b47a | 225 | while (1) { |
WiredHome | 0:9b0b4ae5b47a | 226 | if (touch == ra.TouchPanelReadable(&point)) { |
WiredHome | 0:9b0b4ae5b47a | 227 | rect_t touchRect; |
WiredHome | 1:7feeebbd8367 | 228 | // find out if they touched a key; |
WiredHome | 0:9b0b4ae5b47a | 229 | char key = isKeyTouched(&point, &touchRect); |
WiredHome | 0:9b0b4ae5b47a | 230 | if (key) { |
WiredHome | 0:9b0b4ae5b47a | 231 | DrawKey(touchRect, key, true); |
WiredHome | 0:9b0b4ae5b47a | 232 | wait_ms(50); |
WiredHome | 0:9b0b4ae5b47a | 233 | TouchCode_t is; |
WiredHome | 0:9b0b4ae5b47a | 234 | do { |
WiredHome | 0:9b0b4ae5b47a | 235 | is = ra.TouchPanelReadable(NULL); |
WiredHome | 5:7ccb8f7386fa | 236 | //printf("is: %d\r\n", is); |
WiredHome | 4:edb5155f1b6f | 237 | |
WiredHome | 0:9b0b4ae5b47a | 238 | } while (is != no_touch); |
WiredHome | 0:9b0b4ae5b47a | 239 | DrawKey(touchRect, key); |
WiredHome | 0:9b0b4ae5b47a | 240 | } |
WiredHome | 5:7ccb8f7386fa | 241 | //printf("Touch %02X at (%d,%d)\r\n", key, point.x, point.y); |
WiredHome | 5:7ccb8f7386fa | 242 | //printf("Touch %02X at (%d,%d)\r\n", key, point.x, point.y); |
WiredHome | 1:7feeebbd8367 | 243 | if (key == enter_key) { |
WiredHome | 0:9b0b4ae5b47a | 244 | *pNext = '\0'; |
WiredHome | 0:9b0b4ae5b47a | 245 | ra.SetTextCursorControl(); |
WiredHome | 4:edb5155f1b6f | 246 | success = true; |
WiredHome | 4:edb5155f1b6f | 247 | break; |
WiredHome | 1:7feeebbd8367 | 248 | } else if (key == esc_key) { |
WiredHome | 0:9b0b4ae5b47a | 249 | *buffer = '\0'; |
WiredHome | 0:9b0b4ae5b47a | 250 | ra.SetTextCursorControl(); |
WiredHome | 4:edb5155f1b6f | 251 | success = false; |
WiredHome | 4:edb5155f1b6f | 252 | break; |
WiredHome | 1:7feeebbd8367 | 253 | } else if (key == KYBD_SYM_BS) { |
WiredHome | 0:9b0b4ae5b47a | 254 | if (pNext > buffer) { |
WiredHome | 0:9b0b4ae5b47a | 255 | pNext--; |
WiredHome | 0:9b0b4ae5b47a | 256 | // blank the last char |
WiredHome | 0:9b0b4ae5b47a | 257 | userText.x -= ra.fontwidth(); |
WiredHome | 0:9b0b4ae5b47a | 258 | ra.SetTextCursor(userText.x, userText.y); |
WiredHome | 0:9b0b4ae5b47a | 259 | ra.putc(' '); |
WiredHome | 0:9b0b4ae5b47a | 260 | } |
WiredHome | 1:7feeebbd8367 | 261 | } else if (key == KYBD_SYM_TAB) { |
WiredHome | 0:9b0b4ae5b47a | 262 | *pNext++ = ' '; |
WiredHome | 0:9b0b4ae5b47a | 263 | ra.SetTextCursor(userText.x, userText.y); |
WiredHome | 0:9b0b4ae5b47a | 264 | ra.putc(' '); |
WiredHome | 0:9b0b4ae5b47a | 265 | userText.x += ra.fontwidth(); |
WiredHome | 1:7feeebbd8367 | 266 | } else if (key == KYBD_SYM_SHIFT) { |
WiredHome | 0:9b0b4ae5b47a | 267 | shift = !shift; |
WiredHome | 0:9b0b4ae5b47a | 268 | DrawKeypad(); |
WiredHome | 0:9b0b4ae5b47a | 269 | } else if (key) { |
WiredHome | 0:9b0b4ae5b47a | 270 | *pNext++ = key; |
WiredHome | 0:9b0b4ae5b47a | 271 | ra.SetTextCursor(userText.x, userText.y); |
WiredHome | 0:9b0b4ae5b47a | 272 | if (mask) |
WiredHome | 0:9b0b4ae5b47a | 273 | ra.putc(mask); |
WiredHome | 0:9b0b4ae5b47a | 274 | else |
WiredHome | 0:9b0b4ae5b47a | 275 | ra.putc(key); |
WiredHome | 0:9b0b4ae5b47a | 276 | userText.x += ra.fontwidth(); |
WiredHome | 0:9b0b4ae5b47a | 277 | } |
WiredHome | 0:9b0b4ae5b47a | 278 | if ((pNext - buffer) >= (size - 1)) { |
WiredHome | 0:9b0b4ae5b47a | 279 | *pNext = '\0'; |
WiredHome | 0:9b0b4ae5b47a | 280 | ra.SetTextCursorControl(); |
WiredHome | 4:edb5155f1b6f | 281 | success = true; |
WiredHome | 4:edb5155f1b6f | 282 | break; |
WiredHome | 0:9b0b4ae5b47a | 283 | } |
WiredHome | 0:9b0b4ae5b47a | 284 | ShowBufferMetrics(); |
WiredHome | 0:9b0b4ae5b47a | 285 | } |
WiredHome | 0:9b0b4ae5b47a | 286 | } |
WiredHome | 4:edb5155f1b6f | 287 | if (auto_close) |
WiredHome | 4:edb5155f1b6f | 288 | Erase(back); |
WiredHome | 4:edb5155f1b6f | 289 | return success; |
WiredHome | 0:9b0b4ae5b47a | 290 | } |