/* Converts a key code to a brltty command according to the context */ int brl_keyToCommand(BrailleDisplay *brl, KeyTableCommandContext context, int code) { static int ctrlpressed = 0; static int altpressed = 0; static int cut = 0; static int descchar = 0; unsigned char ch; int type; ch = code & 0xff; type = code & (~ 0xff); if (code==0) return 0; if (code==EOF) return EOF; if (type==BRL_VSMSK_CHAR) { int command = ch | BRL_CMD_BLK(PASSCHAR) | altpressed | ctrlpressed; altpressed = ctrlpressed = 0; return command; } if (type==BRL_VSMSK_ROUTING) { ctrlpressed = altpressed = 0; switch (cut) { case 0: if (descchar) { descchar = 0; return ((int) ch) | BRL_CMD_BLK(DESCCHAR); } else return ((int) ch) | BRL_CMD_BLK(ROUTE); case 1: cut++; return ((int) ch) | BRL_CMD_BLK(CLIP_NEW); case 2: cut = 0; return ((int) ch) | BRL_CMD_BLK(COPY_LINE); } return EOF; /* Should not be reached */ } else if (type==BRL_VSMSK_FUNCTIONKEY) { ctrlpressed = altpressed = 0; switch (code) { case BRL_VSKEY_A1: return BRL_CMD_BLK(SWITCHVT); case BRL_VSKEY_A2: return BRL_CMD_BLK(SWITCHVT)+1; case BRL_VSKEY_A3: return BRL_CMD_BLK(SWITCHVT)+2; case BRL_VSKEY_A6: return BRL_CMD_BLK(SWITCHVT)+3; case BRL_VSKEY_A7: return BRL_CMD_BLK(SWITCHVT)+4; case BRL_VSKEY_A8: return BRL_CMD_BLK(SWITCHVT)+5; case BRL_VSKEY_B5: cut = 1; return EOF; case BRL_VSKEY_B6: return BRL_CMD_TOP_LEFT; case BRL_VSKEY_D6: return BRL_CMD_BOT_LEFT; case BRL_VSKEY_A4: return BRL_CMD_FWINLTSKIP; case BRL_VSKEY_B8: return BRL_CMD_FWINLTSKIP; case BRL_VSKEY_A5: return BRL_CMD_FWINRTSKIP; case BRL_VSKEY_D8: return BRL_CMD_FWINRTSKIP; case BRL_VSKEY_B7: return BRL_CMD_LNUP; case BRL_VSKEY_D7: return BRL_CMD_LNDN; case BRL_VSKEY_C8: return BRL_CMD_FWINRT; case BRL_VSKEY_C6: return BRL_CMD_FWINLT; case BRL_VSKEY_C7: return BRL_CMD_HOME; case BRL_VSKEY_B2: return BRL_CMD_KEY(CURSOR_UP); case BRL_VSKEY_D2: return BRL_CMD_KEY(CURSOR_DOWN); case BRL_VSKEY_C3: return BRL_CMD_KEY(CURSOR_RIGHT); case BRL_VSKEY_C1: return BRL_CMD_KEY(CURSOR_LEFT); case BRL_VSKEY_B3: return BRL_CMD_CSRVIS; case BRL_VSKEY_D1: return BRL_CMD_KEY(DELETE); case BRL_VSKEY_D3: return BRL_CMD_KEY(INSERT); case BRL_VSKEY_C5: return BRL_CMD_PASTE; case BRL_VSKEY_D5: descchar = 1; return EOF; default: return EOF; } } else if (type==BRL_VSMSK_OTHER) { /* ctrlpressed = 0; */ if ((ch>=0xe1) && (ch<=0xea)) { int flags = altpressed; ch-=0xe1; altpressed = 0; return flags | BRL_CMD_BLK(PASSKEY) | ( BRL_KEY_FUNCTION + ch); } /* altpressed = 0; */ switch (code) { case BRL_VSKEY_PLOC_LT: return BRL_CMD_SIXDOTS; case BRL_VSKEY_BACKSPACE: return BRL_CMD_KEY(BACKSPACE); case BRL_VSKEY_TAB: return BRL_CMD_KEY(TAB); case BRL_VSKEY_RETURN: return BRL_CMD_KEY(ENTER); case BRL_VSKEY_PLOC_PLOC_A: return BRL_CMD_HELP; case BRL_VSKEY_PLOC_PLOC_B: return BRL_CMD_TUNES; case BRL_VSKEY_PLOC_PLOC_C: return BRL_CMD_PREFMENU; case BRL_VSKEY_PLOC_PLOC_D: return BRL_CMD_KEY(PAGE_DOWN); case BRL_VSKEY_PLOC_PLOC_E: return BRL_CMD_KEY(END); case BRL_VSKEY_PLOC_PLOC_F: return BRL_CMD_FREEZE; case BRL_VSKEY_PLOC_PLOC_H: return BRL_CMD_KEY(HOME); case BRL_VSKEY_PLOC_PLOC_I: return BRL_CMD_INFO; case BRL_VSKEY_PLOC_PLOC_L: return BRL_CMD_LEARN; case BRL_VSKEY_PLOC_PLOC_R: return BRL_CMD_PREFLOAD; case BRL_VSKEY_PLOC_PLOC_S: return BRL_CMD_PREFSAVE; case BRL_VSKEY_PLOC_PLOC_T: return BRL_CMD_CSRTRK; case BRL_VSKEY_PLOC_PLOC_U: return BRL_CMD_KEY(PAGE_UP); case BRL_VSKEY_CONTROL: ctrlpressed = BRL_FLG_INPUT_CONTROL; return BRL_CMD_NOOP; case BRL_VSKEY_ALT: altpressed = BRL_FLG_INPUT_META; return BRL_CMD_NOOP; case BRL_VSKEY_ESCAPE: return BRL_CMD_KEY(ESCAPE); default: return EOF; } } return EOF; }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { while (1) { unsigned char packet[3]; int size = readPacket(brl, packet, sizeof(packet)); if (size == 0) break; if (size < 0) return BRL_CMD_RESTARTBRL; switch (packet[1]) { default: break; case 1: return BRL_CMD_BLK(PASSDOTS) | translateInputCell(packet[2]); case 2: { unsigned char column = packet[2]; if (column && (column <= brl->textColumns)) return BRL_CMD_BLK(ROUTE) + (column - 1); break; } case 3: switch (packet[2]) { default: break; // left rear: two columns, one row case 0X02: // ESC return BRL_CMD_LEARN; case 0X01: // M return BRL_CMD_PREFMENU; // left middle: cross case 0X06: // up return BRL_CMD_LNUP; case 0X03: // left return BRL_CMD_FWINLT; case 0X05: // right return BRL_CMD_FWINRT; case 0X04: // down return BRL_CMD_LNDN; // left front: two columns, three rows case 0X09: // ins return BRL_CMD_RETURN; case 0X0A: // E return BRL_CMD_TOP; case 0X0B: // supp return BRL_CMD_CSRTRK; case 0X0C: // L return BRL_CMD_BOT; case 0X07: // extra 1 (40s only) return BRL_CMD_CHRLT; case 0X08: // extra 2 (40s only) return BRL_CMD_CHRRT; case 0x0E: // left thumb return BRL_CMD_KEY(BACKSPACE); case 0x0F: // right thumb return BRL_CMD_BLK(PASSDOTS); case 0x3F: // both thumbs return BRL_CMD_KEY(ENTER); case 0X29: // key under dot 7 return BRL_CMD_KEY(ESCAPE); case 0X2A: // key under dot 8 return BRL_CMD_KEY(TAB); // right rear: one column, one row case 0X19: // extra 3 (40s only) return BRL_CMD_INFO; // right middle: one column, two rows case 0X1B: // extra 4 (40s only) return BRL_CMD_PRDIFLN; case 0X1A: // extra 5 (40s only) return BRL_CMD_NXDIFLN; // right front: one column, four rows case 0X2B: // slash (40s only) return BRL_CMD_FREEZE; case 0X2C: // asterisk (40s only) return BRL_CMD_DISPMD; case 0X2D: // minus (40s only) return BRL_CMD_ATTRVIS; case 0X2E: // plus (40s only) return BRL_CMD_CSRVIS; // first (top) row of numeric pad case 0X37: // seven (40s only) return BRL_CMD_KEY(HOME); case 0X38: // eight (40s only) return BRL_CMD_KEY(CURSOR_UP); case 0X39: // nine (40s only) return BRL_CMD_KEY(PAGE_UP); // second row of numeric pad case 0X34: // four (40s only) return BRL_CMD_KEY(CURSOR_LEFT); case 0X35: // five (40s only) return BRL_CMD_CSRJMP_VERT; case 0X36: // six (40s only) return BRL_CMD_KEY(CURSOR_RIGHT); // third row of numeric pad case 0X31: // one (40s only) return BRL_CMD_KEY(END); case 0X32: // two (40s only) return BRL_CMD_KEY(CURSOR_DOWN); case 0X33: // three (40s only) return BRL_CMD_KEY(PAGE_DOWN); // fourth (bottom) row of numeric pad case 0X28: // verr num (40s only) return BRL_CMD_SIXDOTS; case 0X30: // zero (40s only) return BRL_CMD_KEY(INSERT); case 0X2F: // supp (40s only) return BRL_CMD_KEY(DELETE); } break; /* When data is written to the display it acknowledges with: * 0X00 0X04 0Xxx * where xx is the number of bytes written. */ case 4: continue; } logUnexpectedPacket(packet, size); } return EOF; }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { int key = readKey(); if (context != currentContext) { logMessage(LOG_DEBUG, "Context switch: %d -> %d", currentContext, context); switch (currentContext = context) { case KTB_CTX_DEFAULT: deviceStatus = DEV_ONLINE; break; default: break; } } if (key != EOF) { switch (key) { case KEY_FUNCTION_ENTER: return BRL_CMD_KEY(ENTER); case KEY_FUNCTION_TAB: return BRL_CMD_KEY(TAB); case KEY_FUNCTION_CURSOR_UP: return BRL_CMD_KEY(CURSOR_UP); case KEY_FUNCTION_CURSOR_DOWN: return BRL_CMD_KEY(CURSOR_DOWN); case KEY_FUNCTION_CURSOR_LEFT: return BRL_CMD_KEY(CURSOR_LEFT); case KEY_FUNCTION_CURSOR_RIGHT: return BRL_CMD_KEY(CURSOR_RIGHT); case KEY_FUNCTION_CURSOR_UP_JUMP: return BRL_CMD_KEY(HOME); case KEY_FUNCTION_CURSOR_DOWN_JUMP: return BRL_CMD_KEY(END); case KEY_FUNCTION_CURSOR_LEFT_JUMP: return BRL_CMD_KEY(PAGE_UP); case KEY_FUNCTION_CURSOR_RIGHT_JUMP: return BRL_CMD_KEY(PAGE_DOWN); case KEY_FUNCTION_F1: return BRL_CMD_KFN(1); case KEY_FUNCTION_F2: return BRL_CMD_KFN(2); case KEY_FUNCTION_F3: return BRL_CMD_KFN(3); case KEY_FUNCTION_F4: return BRL_CMD_KFN(4); case KEY_FUNCTION_F5: return BRL_CMD_KFN(5); case KEY_FUNCTION_F6: return BRL_CMD_KFN(6); case KEY_FUNCTION_F7: return BRL_CMD_KFN(7); case KEY_FUNCTION_F9: return BRL_CMD_KFN(9); case KEY_FUNCTION_F10: return BRL_CMD_KFN(10); case KEY_COMMAND: { int command; while ((command = readKey()) == EOF) asyncWait(1); logMessage(LOG_DEBUG, "Received command: (0x%2.2X) 0x%4.4X", KEY_COMMAND, command); switch (command) { case KEY_COMMAND: /* pressing the escape command twice will pass it through */ return BRL_CMD_BLK(PASSDOTS) + translateInputCell(KEY_COMMAND); case KEY_COMMAND_SWITCHVT_PREV: return BRL_CMD_SWITCHVT_PREV; case KEY_COMMAND_SWITCHVT_NEXT: return BRL_CMD_SWITCHVT_NEXT; case KEY_COMMAND_SWITCHVT_1: return BRL_CMD_BLK(SWITCHVT) + 0; case KEY_COMMAND_SWITCHVT_2: return BRL_CMD_BLK(SWITCHVT) + 1; case KEY_COMMAND_SWITCHVT_3: return BRL_CMD_BLK(SWITCHVT) + 2; case KEY_COMMAND_SWITCHVT_4: return BRL_CMD_BLK(SWITCHVT) + 3; case KEY_COMMAND_SWITCHVT_5: return BRL_CMD_BLK(SWITCHVT) + 4; case KEY_COMMAND_SWITCHVT_6: return BRL_CMD_BLK(SWITCHVT) + 5; case KEY_COMMAND_SWITCHVT_7: return BRL_CMD_BLK(SWITCHVT) + 6; case KEY_COMMAND_SWITCHVT_8: return BRL_CMD_BLK(SWITCHVT) + 7; case KEY_COMMAND_SWITCHVT_9: return BRL_CMD_BLK(SWITCHVT) + 8; case KEY_COMMAND_SWITCHVT_10: return BRL_CMD_BLK(SWITCHVT) + 9; case KEY_COMMAND_PAGE_UP: return BRL_CMD_KEY(PAGE_UP); case KEY_COMMAND_PAGE_DOWN: return BRL_CMD_KEY(PAGE_DOWN); case KEY_COMMAND_PREFMENU: currentLine = 0; cursorRow = 0; cursorColumn = 31; sendCursorRow(); return BRL_CMD_PREFMENU; case KEY_COMMAND_PREFSAVE: return BRL_CMD_PREFSAVE; case KEY_COMMAND_PREFLOAD: return BRL_CMD_PREFLOAD; case KEY_COMMAND_FREEZE_ON: return BRL_CMD_FREEZE | BRL_FLG_TOGGLE_ON; case KEY_COMMAND_FREEZE_OFF: return BRL_CMD_FREEZE | BRL_FLG_TOGGLE_OFF; case KEY_COMMAND_RESTARTBRL: return BRL_CMD_RESTARTBRL; case KEY_COMMAND_DOWNLOAD: downloadFile(); break; default: logMessage(LOG_WARNING, "Unknown command: (0X%2.2X) 0X%4.4X", KEY_COMMAND, command); break; } break; } default: switch (key & KEY_MASK) { case KEY_UPDATE: handleUpdate(key >> KEY_SHIFT); break; case KEY_FUNCTION: logMessage(LOG_WARNING, "Unknown function: (0X%2.2X) 0X%4.4X", KEY_COMMAND, key>>KEY_SHIFT); break; default: { unsigned char dots = translateInputCell(key); logMessage(LOG_DEBUG, "Received character: 0X%2.2X dec=%d dots=%2.2X", key, key, dots); return BRL_CMD_BLK(PASSDOTS) + dots; } } break; } } return EOF; }