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 + -
显示快捷键?