baum.c
来自「xen虚拟机源代码安装包」· C语言 代码 · 共 644 行 · 第 1/2 页
C
644 行
} \ } \} while (0) EAT(req); switch (req) { case BAUM_REQ_DisplayData: { uint8_t cells[baum->x * baum->y], c; uint8_t text[baum->x * baum->y]; uint8_t zero[baum->x * baum->y]; int cursor = BRLAPI_CURSOR_OFF; int i; /* Allow 100ms to complete the DisplayData packet */ qemu_mod_timer(baum->cellCount_timer, qemu_get_clock(vm_clock) + ticks_per_sec / 10); for (i = 0; i < baum->x * baum->y ; i++) { EAT(c); cells[i] = c; if ((c & (BRLAPI_DOT7|BRLAPI_DOT8)) == (BRLAPI_DOT7|BRLAPI_DOT8)) { cursor = i + 1; c &= ~(BRLAPI_DOT7|BRLAPI_DOT8); } if (!(c = nabcc_translation[c])) c = '?'; text[i] = c; } qemu_del_timer(baum->cellCount_timer); memset(zero, 0, sizeof(zero)); brlapi_writeArguments_t wa = { .displayNumber = BRLAPI_DISPLAY_DEFAULT, .regionBegin = 1, .regionSize = baum->x * baum->y, .text = text, .textSize = baum->x * baum->y, .andMask = zero, .orMask = cells, .cursor = cursor, .charset = "ISO-8859-1", }; if (brlapi__write(baum->brlapi, &wa) == -1) brlapi_perror("baum brlapi_write"); break; } case BAUM_REQ_SetMode: { uint8_t mode, setting; DPRINTF("SetMode\n"); EAT(mode); EAT(setting); /* ignore */ break; } case BAUM_REQ_SetProtocol: { uint8_t protocol; DPRINTF("SetProtocol\n"); EAT(protocol); /* ignore */ break; } case BAUM_REQ_GetDeviceIdentity: { uint8_t identity[17] = { BAUM_RSP_DeviceIdentity, 'B','a','u','m',' ','V','a','r','i','o' }; DPRINTF("GetDeviceIdentity\n"); identity[11] = '0' + baum->x / 10; identity[12] = '0' + baum->x % 10; baum_write_packet(baum, identity, sizeof(identity)); break; } case BAUM_REQ_GetVersionNumber: { uint8_t version[] = { BAUM_RSP_VersionNumber, 1 }; /* ? */ DPRINTF("GetVersionNumber\n"); baum_write_packet(baum, version, sizeof(version)); break; } case BAUM_REQ_GetSerialNumber: { uint8_t serial[] = { BAUM_RSP_SerialNumber, '0','0','0','0','0','0','0','0' }; DPRINTF("GetSerialNumber\n"); baum_write_packet(baum, serial, sizeof(serial)); break; } case BAUM_REQ_GetKeys: { DPRINTF("Get%0#2x\n", req); /* ignore */ break; } default: DPRINTF("unrecognized request %0#2x\n", req); do if (!len--) return 0; while (*cur++ != ESC); cur--; break; } return cur - buf;}/* The other end is writing some data. Store it and try to interpret */static int baum_write(CharDriverState *chr, const uint8_t *buf, int len){ BaumDriverState *baum = chr->opaque; int tocopy, cur, eaten, orig_len = len; if (!len) return 0; if (!baum->brlapi) return len; while (len) { /* Complete our buffer as much as possible */ tocopy = len; if (tocopy > BUF_SIZE - baum->in_buf_used) tocopy = BUF_SIZE - baum->in_buf_used; memcpy(baum->in_buf + baum->in_buf_used, buf, tocopy); baum->in_buf_used += tocopy; buf += tocopy; len -= tocopy; /* Interpret it as much as possible */ cur = 0; while (cur < baum->in_buf_used && (eaten = baum_eat_packet(baum, baum->in_buf + cur, baum->in_buf_used - cur))) cur += eaten; /* Shift the remainder */ if (cur) { memmove(baum->in_buf, baum->in_buf + cur, baum->in_buf_used - cur); baum->in_buf_used -= cur; } /* And continue if any data left */ } return orig_len;}/* The other end sent us some event */static void baum_send_event(CharDriverState *chr, int event){ BaumDriverState *baum = chr->opaque; switch (event) { case CHR_EVENT_BREAK: break; case CHR_EVENT_RESET: /* Reset state */ baum->in_buf_used = 0; break; }}/* Send the key code to the other end */static void baum_send_key(BaumDriverState *baum, uint8_t type, uint8_t value) { uint8_t packet[] = { type, value }; DPRINTF("writing key %x %x\n", type, value); baum_write_packet(baum, packet, sizeof(packet));}/* We got some data on the BrlAPI socket */static void baum_chr_read(void *opaque){ BaumDriverState *baum = opaque; brlapi_keyCode_t code; int ret; if (!baum->brlapi) return; while ((ret = brlapi__readKey(baum->brlapi, 0, &code)) == 1) { DPRINTF("got key %"BRLAPI_PRIxKEYCODE"\n", code); /* Emulate */ switch (code & BRLAPI_KEY_TYPE_MASK) { case BRLAPI_KEY_TYPE_CMD: switch (code & BRLAPI_KEY_CMD_BLK_MASK) { case BRLAPI_KEY_CMD_ROUTE: baum_send_key(baum, BAUM_RSP_RoutingKey, (code & BRLAPI_KEY_CMD_ARG_MASK)+1); baum_send_key(baum, BAUM_RSP_RoutingKey, 0); break; case 0: switch (code & BRLAPI_KEY_CMD_ARG_MASK) { case BRLAPI_KEY_CMD_FWINLT: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_FWINRT: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR2); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_LNUP: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR1); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_LNDN: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR3); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_TOP: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL1|BAUM_TR1); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_BOT: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL3|BAUM_TR3); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_TOP_LEFT: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2|BAUM_TR1); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_BOT_LEFT: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2|BAUM_TR3); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_HOME: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2|BAUM_TR1|BAUM_TR3); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; case BRLAPI_KEY_CMD_PREFMENU: baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL1|BAUM_TL3|BAUM_TR1); baum_send_key(baum, BAUM_RSP_TopKeys, 0); break; } } break; case BRLAPI_KEY_TYPE_SYM: break; } } if (ret == -1 && (brlapi_errno != BRLAPI_ERROR_LIBCERR || errno != EINTR)) { brlapi_perror("baum: brlapi_readKey"); brlapi__closeConnection(baum->brlapi); free(baum->brlapi); baum->brlapi = NULL; }}CharDriverState *chr_baum_init(void){ BaumDriverState *baum; CharDriverState *chr; brlapi_handle_t *handle;#ifdef CONFIG_SDL SDL_SysWMinfo info;#endif int tty; baum = qemu_mallocz(sizeof(BaumDriverState)); if (!baum) return NULL; baum->chr = chr = qemu_mallocz(sizeof(CharDriverState)); if (!chr) goto fail_baum; chr->opaque = baum; chr->chr_write = baum_write; chr->chr_send_event = baum_send_event; chr->chr_accept_input = baum_accept_input; handle = qemu_mallocz(brlapi_getHandleSize()); if (!handle) goto fail_chr; baum->brlapi = handle; baum->brlapi_fd = brlapi__openConnection(handle, NULL, NULL); if (baum->brlapi_fd == -1) { brlapi_perror("baum_init: brlapi_openConnection"); goto fail_handle; } baum->cellCount_timer = qemu_new_timer(vm_clock, baum_cellCount_timer_cb, baum); if (brlapi__getDisplaySize(handle, &baum->x, &baum->y) == -1) { brlapi_perror("baum_init: brlapi_getDisplaySize"); goto fail; }#ifdef CONFIG_SDL memset(&info, 0, sizeof(info)); SDL_VERSION(&info.version); if (SDL_GetWMInfo(&info)) tty = info.info.x11.wmwindow; else#endif tty = BRLAPI_TTY_DEFAULT; if (brlapi__enterTtyMode(handle, tty, NULL) == -1) { brlapi_perror("baum_init: brlapi_enterTtyMode"); goto fail; } qemu_set_fd_handler(baum->brlapi_fd, baum_chr_read, NULL, baum); qemu_chr_reset(chr); return chr;fail: qemu_free_timer(baum->cellCount_timer); brlapi__closeConnection(handle);fail_handle: free(handle);fail_chr: free(chr);fail_baum: free(baum); return NULL;}USBDevice *usb_baum_init(void){ /* USB Product ID of Super Vario 40 */ return usb_serial_init("productid=FE72:braille");}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?