int enqueueKey (unsigned char set, unsigned char key) { if (enqueueKeyEvent(set, key, 1)) if (enqueueKeyEvent(set, key, 0)) return 1; return 0; }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { ResponsePacket packet; int size; while ((size = getPacket(&packet))) { switch (packet.data.code) { case BN_RSP_ROUTE: enqueueKey(BN_SET_RoutingKeys, packet.data.values.routingKey); break; case BN_RSP_DISPLAY: doVisualDisplay(); break; default: { unsigned char set = BN_SET_NavigationKeys; unsigned char keys = packet.data.values.dotKeys & 0X3F; unsigned char base = BN_KEY_Dot1; unsigned char modifier = 0; switch (packet.data.code) { case BN_RSP_CHARACTER: if (keys) break; case BN_RSP_SPACE: modifier = BN_KEY_Space; break; case BN_RSP_BACKSPACE: modifier = BN_KEY_Backspace; break; case BN_RSP_ENTER: modifier = BN_KEY_Enter; break; case BN_RSP_THUMB: keys = packet.data.values.thumbKeys & 0X0F; base = BN_KEY_Previous; break; default: logUnexpectedPacket(packet.bytes, size); continue; } if (modifier) enqueueKeyEvent(set, modifier, 1); enqueueKeys(keys, set, base); if (modifier) enqueueKeyEvent(set, modifier, 0); break; } } } return (errno == EAGAIN)? EOF: BRL_CMD_RESTARTBRL; }
static void handleRoutingKeyEvent (BrailleDisplay *brl, unsigned char key, int press) { if (key != MT_ROUTING_KEYS_NONE) { KeyGroup group; { KeyGroup routing; KeyGroup status; if (key < MT_ROUTING_KEYS_SECONDARY) { routing = MT_GRP_RoutingKeys1; status = MT_GRP_StatusKeys1; } else { key -= MT_ROUTING_KEYS_SECONDARY; routing = MT_GRP_RoutingKeys2; status = MT_GRP_StatusKeys2; } if (key < brl->data->statusCount) { group = status; } else if ((key -= brl->data->statusCount) < brl->data->textCount) { group = routing; } else { return; } } enqueueKeyEvent(brl, group, key, press); } }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { #ifdef KEYBOARD_DEVICE_NAME struct input_event event; ssize_t length; while ((length = read(brl->data->keyboardDevice, &event, sizeof(event))) != -1) { if (length < sizeof(event)) continue; if (event.type != EV_KEY) continue; { KeyGroup group; KeyNumber number; int press; if ((event.code >= BG_KEY_ROUTE) && (event.code < (BG_KEY_ROUTE + brl->textColumns))) { group = BG_GRP_RoutingKeys; number = event.code - BG_KEY_ROUTE; } else { group = BG_KEY_GROUP(event.code); number = BG_KEY_NUMBER(event.code); } switch (event.value) { case 0: press = 0; break; case 1: press = 1; break; default: continue; } if ((event.code >= BG_KEY_ROUTE) && (event.code < (BG_KEY_ROUTE + brl->textColumns))) { group = 2; number = event.code - BG_KEY_ROUTE; } else { group = BG_KEY_GROUP(event.code); number = BG_KEY_NUMBER(event.code); } enqueueKeyEvent(brl, group, number, press); } } if (errno != EAGAIN) { logSystemError("keyboard input error"); return BRL_CMD_RESTARTBRL; } #endif /* KEYBOARD_DEVICE_NAME */ return EOF; }
int enqueueKeys (uint32_t bits, unsigned char set, unsigned char key) { unsigned char stack[0X20]; unsigned char count = 0; while (bits) { if (bits & 0X1) { if (!enqueueKeyEvent(set, key, 1)) return 0; stack[count++] = key; } bits >>= 1; key += 1; } while (count) if (!enqueueKeyEvent(set, stack[--count], 0)) return 0; return 1; }
static int interpretKeyCode_ProfiLine (BrailleDisplay *brl, unsigned char code) { const unsigned char release = 0X80; int press = !(code & release); unsigned char key = code & ~release; KeyGroup group; if (key < brl->data->model->firstRoutingKey) { group = HD_GRP_NavigationKeys; } else if (key < (brl->data->model->firstRoutingKey + brl->textColumns)) { group = HD_GRP_RoutingKeys; key -= brl->data->model->firstRoutingKey; } else { return 0; } enqueueKeyEvent(brl, group, key, press); return 1; }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { unsigned char packet[MAXIMUM_RESPONSE_SIZE]; size_t size; while ((size = readPacket(brl, packet, sizeof(packet)))) { switch (packet[0]) { case 0XFD: switch (packet[1]) { case 0X2F: continue; default: break; } break; case 0XFC: { unsigned int key = packet[1]; if ((key >= NP_KEY_ROUTING_MIN) && (key <= NP_KEY_ROUTING_MAX)) { enqueueKey(brl, NP_GRP_RoutingKeys, (key - NP_KEY_ROUTING_MIN)); continue; } else { int press = !!(key & NP_KEY_NAVIGATION_PRESS); if (press) key &= ~NP_KEY_NAVIGATION_PRESS; enqueueKeyEvent(brl, NP_GRP_NavigationKeys, key, press); continue; } break; } } logUnexpectedPacket(packet, size); } return (errno == EAGAIN)? EOF: BRL_CMD_RESTARTBRL; }
static void updateKeys (BrailleDisplay *brl, const unsigned char *packet) { Keys currentKeys; unsigned char navigationPresses[0X10]; int navigationPressCount = 0; unsigned char routingPresses[6]; int routingPressCount = 0; initializeKeys(); memset(¤tKeys, 0, sizeof(currentKeys)); currentKeys.navigation = (packet[1] << 8) | packet[0]; { unsigned char key = 0; uint16_t bit = 0X1; while (key < 0X10) { if ((pressedKeys.navigation & bit) && !(currentKeys.navigation & bit)) { enqueueKeyEvent(brl, VO_GRP_NavigationKeys, key, 0); } else if (!(pressedKeys.navigation & bit) && (currentKeys.navigation & bit)) { navigationPresses[navigationPressCount++] = key; } bit <<= 1; key += 1; } } { int i; for (i=2; i<8; i+=1) { unsigned char key = packet[i]; if (!key) break; if ((key < 1) || (key > cellCount)) { logMessage(LOG_NOTICE, "invalid routing key number: %u", key); continue; } key -= 1; currentKeys.routing[key] = 1; if (!pressedKeys.routing[key]) routingPresses[routingPressCount++] = key; } } { unsigned char key; for (key=0; key<cellCount; key+=1) if (pressedKeys.routing[key] && !currentKeys.routing[key]) enqueueKeyEvent(brl, VO_GRP_RoutingKeys, key, 0); } while (navigationPressCount) enqueueKeyEvent(brl, VO_GRP_NavigationKeys, navigationPresses[--navigationPressCount], 1); while (routingPressCount) enqueueKeyEvent(brl, VO_GRP_RoutingKeys, routingPresses[--routingPressCount], 1); pressedKeys = currentKeys; }