From patchwork Fri Aug 19 02:16:21 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 110561 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 8C2D6B6F6F for ; Fri, 19 Aug 2011 12:16:35 +1000 (EST) Received: from localhost ([::1]:50616 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QuEdM-0006vE-Ei for incoming@patchwork.ozlabs.org; Thu, 18 Aug 2011 22:16:32 -0400 Received: from eggs.gnu.org ([140.186.70.92]:51594) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QuEdF-0006v2-Oa for qemu-devel@nongnu.org; Thu, 18 Aug 2011 22:16:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QuEdC-00021N-Sq for qemu-devel@nongnu.org; Thu, 18 Aug 2011 22:16:25 -0400 Received: from solo.fdn.fr ([80.67.169.19]:37734) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QuEdC-00021J-B4 for qemu-devel@nongnu.org; Thu, 18 Aug 2011 22:16:22 -0400 Received: from type.ipv6 (youpi.is-a-geek.org [80.67.176.89]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by solo.fdn.fr (Postfix) with ESMTPS id A4336443A6 for ; Fri, 19 Aug 2011 04:16:21 +0200 (CEST) Received: from samy by type.ipv6 with local (Exim 4.76) (envelope-from ) id 1QuEdB-0006ZG-6A for qemu-devel@nongnu.org; Fri, 19 Aug 2011 04:16:21 +0200 Date: Fri, 19 Aug 2011 04:16:21 +0200 From: Samuel Thibault To: qemu-devel@nongnu.org Message-ID: <20110819021621.GJ4919@type.famille.thibault.fr> References: <20110819021337.GI4919@type.famille.thibault.fr> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20110819021337.GI4919@type.famille.thibault.fr> User-Agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 80.67.169.19 Subject: Re: [Qemu-devel] [PATCH, braille] Add dots keypresses support to the baum braille device X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Oops, sorry, the previous patch had a debugging leftover, here it is again. Add dots keypresses support to the baum braille device. Signed-off-by: Samuel Thibault diff --git a/hw/baum.c b/hw/baum.c index 21326ae..0b29498 100644 --- a/hw/baum.c +++ b/hw/baum.c @@ -1,7 +1,7 @@ /* * QEMU Baum Braille Device * - * Copyright (c) 2008, 2011 Samuel Thibault + * Copyright (c) 2008, 2010-2011 Samuel Thibault * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -101,8 +101,11 @@ typedef struct { } BaumDriverState; /* Let's assume NABCC by default */ -static const uint8_t nabcc_translation[256] = { - [0] = ' ', +enum way { + DOTS2ASCII, + ASCII2DOTS +}; +static const uint8_t nabcc_translation[2][256] = { #ifndef BRLAPI_DOTS #define BRLAPI_DOTS(d1,d2,d3,d4,d5,d6,d7,d8) \ ((d1?BRLAPI_DOT1:0)|\ @@ -114,105 +117,109 @@ static const uint8_t nabcc_translation[256] = { (d7?BRLAPI_DOT7:0)|\ (d8?BRLAPI_DOT8:0)) #endif - [BRLAPI_DOTS(1,0,0,0,0,0,0,0)] = 'a', - [BRLAPI_DOTS(1,1,0,0,0,0,0,0)] = 'b', - [BRLAPI_DOTS(1,0,0,1,0,0,0,0)] = 'c', - [BRLAPI_DOTS(1,0,0,1,1,0,0,0)] = 'd', - [BRLAPI_DOTS(1,0,0,0,1,0,0,0)] = 'e', - [BRLAPI_DOTS(1,1,0,1,0,0,0,0)] = 'f', - [BRLAPI_DOTS(1,1,0,1,1,0,0,0)] = 'g', - [BRLAPI_DOTS(1,1,0,0,1,0,0,0)] = 'h', - [BRLAPI_DOTS(0,1,0,1,0,0,0,0)] = 'i', - [BRLAPI_DOTS(0,1,0,1,1,0,0,0)] = 'j', - [BRLAPI_DOTS(1,0,1,0,0,0,0,0)] = 'k', - [BRLAPI_DOTS(1,1,1,0,0,0,0,0)] = 'l', - [BRLAPI_DOTS(1,0,1,1,0,0,0,0)] = 'm', - [BRLAPI_DOTS(1,0,1,1,1,0,0,0)] = 'n', - [BRLAPI_DOTS(1,0,1,0,1,0,0,0)] = 'o', - [BRLAPI_DOTS(1,1,1,1,0,0,0,0)] = 'p', - [BRLAPI_DOTS(1,1,1,1,1,0,0,0)] = 'q', - [BRLAPI_DOTS(1,1,1,0,1,0,0,0)] = 'r', - [BRLAPI_DOTS(0,1,1,1,0,0,0,0)] = 's', - [BRLAPI_DOTS(0,1,1,1,1,0,0,0)] = 't', - [BRLAPI_DOTS(1,0,1,0,0,1,0,0)] = 'u', - [BRLAPI_DOTS(1,1,1,0,0,1,0,0)] = 'v', - [BRLAPI_DOTS(0,1,0,1,1,1,0,0)] = 'w', - [BRLAPI_DOTS(1,0,1,1,0,1,0,0)] = 'x', - [BRLAPI_DOTS(1,0,1,1,1,1,0,0)] = 'y', - [BRLAPI_DOTS(1,0,1,0,1,1,0,0)] = 'z', - - [BRLAPI_DOTS(1,0,0,0,0,0,1,0)] = 'A', - [BRLAPI_DOTS(1,1,0,0,0,0,1,0)] = 'B', - [BRLAPI_DOTS(1,0,0,1,0,0,1,0)] = 'C', - [BRLAPI_DOTS(1,0,0,1,1,0,1,0)] = 'D', - [BRLAPI_DOTS(1,0,0,0,1,0,1,0)] = 'E', - [BRLAPI_DOTS(1,1,0,1,0,0,1,0)] = 'F', - [BRLAPI_DOTS(1,1,0,1,1,0,1,0)] = 'G', - [BRLAPI_DOTS(1,1,0,0,1,0,1,0)] = 'H', - [BRLAPI_DOTS(0,1,0,1,0,0,1,0)] = 'I', - [BRLAPI_DOTS(0,1,0,1,1,0,1,0)] = 'J', - [BRLAPI_DOTS(1,0,1,0,0,0,1,0)] = 'K', - [BRLAPI_DOTS(1,1,1,0,0,0,1,0)] = 'L', - [BRLAPI_DOTS(1,0,1,1,0,0,1,0)] = 'M', - [BRLAPI_DOTS(1,0,1,1,1,0,1,0)] = 'N', - [BRLAPI_DOTS(1,0,1,0,1,0,1,0)] = 'O', - [BRLAPI_DOTS(1,1,1,1,0,0,1,0)] = 'P', - [BRLAPI_DOTS(1,1,1,1,1,0,1,0)] = 'Q', - [BRLAPI_DOTS(1,1,1,0,1,0,1,0)] = 'R', - [BRLAPI_DOTS(0,1,1,1,0,0,1,0)] = 'S', - [BRLAPI_DOTS(0,1,1,1,1,0,1,0)] = 'T', - [BRLAPI_DOTS(1,0,1,0,0,1,1,0)] = 'U', - [BRLAPI_DOTS(1,1,1,0,0,1,1,0)] = 'V', - [BRLAPI_DOTS(0,1,0,1,1,1,1,0)] = 'W', - [BRLAPI_DOTS(1,0,1,1,0,1,1,0)] = 'X', - [BRLAPI_DOTS(1,0,1,1,1,1,1,0)] = 'Y', - [BRLAPI_DOTS(1,0,1,0,1,1,1,0)] = 'Z', - - [BRLAPI_DOTS(0,0,1,0,1,1,0,0)] = '0', - [BRLAPI_DOTS(0,1,0,0,0,0,0,0)] = '1', - [BRLAPI_DOTS(0,1,1,0,0,0,0,0)] = '2', - [BRLAPI_DOTS(0,1,0,0,1,0,0,0)] = '3', - [BRLAPI_DOTS(0,1,0,0,1,1,0,0)] = '4', - [BRLAPI_DOTS(0,1,0,0,0,1,0,0)] = '5', - [BRLAPI_DOTS(0,1,1,0,1,0,0,0)] = '6', - [BRLAPI_DOTS(0,1,1,0,1,1,0,0)] = '7', - [BRLAPI_DOTS(0,1,1,0,0,1,0,0)] = '8', - [BRLAPI_DOTS(0,0,1,0,1,0,0,0)] = '9', - - [BRLAPI_DOTS(0,0,0,1,0,1,0,0)] = '.', - [BRLAPI_DOTS(0,0,1,1,0,1,0,0)] = '+', - [BRLAPI_DOTS(0,0,1,0,0,1,0,0)] = '-', - [BRLAPI_DOTS(1,0,0,0,0,1,0,0)] = '*', - [BRLAPI_DOTS(0,0,1,1,0,0,0,0)] = '/', - [BRLAPI_DOTS(1,1,1,0,1,1,0,0)] = '(', - [BRLAPI_DOTS(0,1,1,1,1,1,0,0)] = ')', - - [BRLAPI_DOTS(1,1,1,1,0,1,0,0)] = '&', - [BRLAPI_DOTS(0,0,1,1,1,1,0,0)] = '#', - - [BRLAPI_DOTS(0,0,0,0,0,1,0,0)] = ',', - [BRLAPI_DOTS(0,0,0,0,1,1,0,0)] = ';', - [BRLAPI_DOTS(1,0,0,0,1,1,0,0)] = ':', - [BRLAPI_DOTS(0,1,1,1,0,1,0,0)] = '!', - [BRLAPI_DOTS(1,0,0,1,1,1,0,0)] = '?', - [BRLAPI_DOTS(0,0,0,0,1,0,0,0)] = '"', - [BRLAPI_DOTS(0,0,1,0,0,0,0,0)] ='\'', - [BRLAPI_DOTS(0,0,0,1,0,0,0,0)] = '`', - [BRLAPI_DOTS(0,0,0,1,1,0,1,0)] = '^', - [BRLAPI_DOTS(0,0,0,1,1,0,0,0)] = '~', - [BRLAPI_DOTS(0,1,0,1,0,1,1,0)] = '[', - [BRLAPI_DOTS(1,1,0,1,1,1,1,0)] = ']', - [BRLAPI_DOTS(0,1,0,1,0,1,0,0)] = '{', - [BRLAPI_DOTS(1,1,0,1,1,1,0,0)] = '}', - [BRLAPI_DOTS(1,1,1,1,1,1,0,0)] = '=', - [BRLAPI_DOTS(1,1,0,0,0,1,0,0)] = '<', - [BRLAPI_DOTS(0,0,1,1,1,0,0,0)] = '>', - [BRLAPI_DOTS(1,1,0,1,0,1,0,0)] = '$', - [BRLAPI_DOTS(1,0,0,1,0,1,0,0)] = '%', - [BRLAPI_DOTS(0,0,0,1,0,0,1,0)] = '@', - [BRLAPI_DOTS(1,1,0,0,1,1,0,0)] = '|', - [BRLAPI_DOTS(1,1,0,0,1,1,1,0)] ='\\', - [BRLAPI_DOTS(0,0,0,1,1,1,0,0)] = '_', +#define DO(dots,ascii) \ + [DOTS2ASCII][dots] = ascii, \ + [ASCII2DOTS][ascii] = dots + DO(0, ' '), + DO(BRLAPI_DOTS(1,0,0,0,0,0,0,0), 'a'), + DO(BRLAPI_DOTS(1,1,0,0,0,0,0,0), 'b'), + DO(BRLAPI_DOTS(1,0,0,1,0,0,0,0), 'c'), + DO(BRLAPI_DOTS(1,0,0,1,1,0,0,0), 'd'), + DO(BRLAPI_DOTS(1,0,0,0,1,0,0,0), 'e'), + DO(BRLAPI_DOTS(1,1,0,1,0,0,0,0), 'f'), + DO(BRLAPI_DOTS(1,1,0,1,1,0,0,0), 'g'), + DO(BRLAPI_DOTS(1,1,0,0,1,0,0,0), 'h'), + DO(BRLAPI_DOTS(0,1,0,1,0,0,0,0), 'i'), + DO(BRLAPI_DOTS(0,1,0,1,1,0,0,0), 'j'), + DO(BRLAPI_DOTS(1,0,1,0,0,0,0,0), 'k'), + DO(BRLAPI_DOTS(1,1,1,0,0,0,0,0), 'l'), + DO(BRLAPI_DOTS(1,0,1,1,0,0,0,0), 'm'), + DO(BRLAPI_DOTS(1,0,1,1,1,0,0,0), 'n'), + DO(BRLAPI_DOTS(1,0,1,0,1,0,0,0), 'o'), + DO(BRLAPI_DOTS(1,1,1,1,0,0,0,0), 'p'), + DO(BRLAPI_DOTS(1,1,1,1,1,0,0,0), 'q'), + DO(BRLAPI_DOTS(1,1,1,0,1,0,0,0), 'r'), + DO(BRLAPI_DOTS(0,1,1,1,0,0,0,0), 's'), + DO(BRLAPI_DOTS(0,1,1,1,1,0,0,0), 't'), + DO(BRLAPI_DOTS(1,0,1,0,0,1,0,0), 'u'), + DO(BRLAPI_DOTS(1,1,1,0,0,1,0,0), 'v'), + DO(BRLAPI_DOTS(0,1,0,1,1,1,0,0), 'w'), + DO(BRLAPI_DOTS(1,0,1,1,0,1,0,0), 'x'), + DO(BRLAPI_DOTS(1,0,1,1,1,1,0,0), 'y'), + DO(BRLAPI_DOTS(1,0,1,0,1,1,0,0), 'z'), + + DO(BRLAPI_DOTS(1,0,0,0,0,0,1,0), 'A'), + DO(BRLAPI_DOTS(1,1,0,0,0,0,1,0), 'B'), + DO(BRLAPI_DOTS(1,0,0,1,0,0,1,0), 'C'), + DO(BRLAPI_DOTS(1,0,0,1,1,0,1,0), 'D'), + DO(BRLAPI_DOTS(1,0,0,0,1,0,1,0), 'E'), + DO(BRLAPI_DOTS(1,1,0,1,0,0,1,0), 'F'), + DO(BRLAPI_DOTS(1,1,0,1,1,0,1,0), 'G'), + DO(BRLAPI_DOTS(1,1,0,0,1,0,1,0), 'H'), + DO(BRLAPI_DOTS(0,1,0,1,0,0,1,0), 'I'), + DO(BRLAPI_DOTS(0,1,0,1,1,0,1,0), 'J'), + DO(BRLAPI_DOTS(1,0,1,0,0,0,1,0), 'K'), + DO(BRLAPI_DOTS(1,1,1,0,0,0,1,0), 'L'), + DO(BRLAPI_DOTS(1,0,1,1,0,0,1,0), 'M'), + DO(BRLAPI_DOTS(1,0,1,1,1,0,1,0), 'N'), + DO(BRLAPI_DOTS(1,0,1,0,1,0,1,0), 'O'), + DO(BRLAPI_DOTS(1,1,1,1,0,0,1,0), 'P'), + DO(BRLAPI_DOTS(1,1,1,1,1,0,1,0), 'Q'), + DO(BRLAPI_DOTS(1,1,1,0,1,0,1,0), 'R'), + DO(BRLAPI_DOTS(0,1,1,1,0,0,1,0), 'S'), + DO(BRLAPI_DOTS(0,1,1,1,1,0,1,0), 'T'), + DO(BRLAPI_DOTS(1,0,1,0,0,1,1,0), 'U'), + DO(BRLAPI_DOTS(1,1,1,0,0,1,1,0), 'V'), + DO(BRLAPI_DOTS(0,1,0,1,1,1,1,0), 'W'), + DO(BRLAPI_DOTS(1,0,1,1,0,1,1,0), 'X'), + DO(BRLAPI_DOTS(1,0,1,1,1,1,1,0), 'Y'), + DO(BRLAPI_DOTS(1,0,1,0,1,1,1,0), 'Z'), + + DO(BRLAPI_DOTS(0,0,1,0,1,1,0,0), '0'), + DO(BRLAPI_DOTS(0,1,0,0,0,0,0,0), '1'), + DO(BRLAPI_DOTS(0,1,1,0,0,0,0,0), '2'), + DO(BRLAPI_DOTS(0,1,0,0,1,0,0,0), '3'), + DO(BRLAPI_DOTS(0,1,0,0,1,1,0,0), '4'), + DO(BRLAPI_DOTS(0,1,0,0,0,1,0,0), '5'), + DO(BRLAPI_DOTS(0,1,1,0,1,0,0,0), '6'), + DO(BRLAPI_DOTS(0,1,1,0,1,1,0,0), '7'), + DO(BRLAPI_DOTS(0,1,1,0,0,1,0,0), '8'), + DO(BRLAPI_DOTS(0,0,1,0,1,0,0,0), '9'), + + DO(BRLAPI_DOTS(0,0,0,1,0,1,0,0), '.'), + DO(BRLAPI_DOTS(0,0,1,1,0,1,0,0), '+'), + DO(BRLAPI_DOTS(0,0,1,0,0,1,0,0), '-'), + DO(BRLAPI_DOTS(1,0,0,0,0,1,0,0), '*'), + DO(BRLAPI_DOTS(0,0,1,1,0,0,0,0), '/'), + DO(BRLAPI_DOTS(1,1,1,0,1,1,0,0), '('), + DO(BRLAPI_DOTS(0,1,1,1,1,1,0,0), ')'), + + DO(BRLAPI_DOTS(1,1,1,1,0,1,0,0), '&'), + DO(BRLAPI_DOTS(0,0,1,1,1,1,0,0), '#'), + + DO(BRLAPI_DOTS(0,0,0,0,0,1,0,0), ','), + DO(BRLAPI_DOTS(0,0,0,0,1,1,0,0), ';'), + DO(BRLAPI_DOTS(1,0,0,0,1,1,0,0), ':'), + DO(BRLAPI_DOTS(0,1,1,1,0,1,0,0), '!'), + DO(BRLAPI_DOTS(1,0,0,1,1,1,0,0), '?'), + DO(BRLAPI_DOTS(0,0,0,0,1,0,0,0), '"'), + DO(BRLAPI_DOTS(0,0,1,0,0,0,0,0),'\''), + DO(BRLAPI_DOTS(0,0,0,1,0,0,0,0), '`'), + DO(BRLAPI_DOTS(0,0,0,1,1,0,1,0), '^'), + DO(BRLAPI_DOTS(0,0,0,1,1,0,0,0), '~'), + DO(BRLAPI_DOTS(0,1,0,1,0,1,1,0), '['), + DO(BRLAPI_DOTS(1,1,0,1,1,1,1,0), ']'), + DO(BRLAPI_DOTS(0,1,0,1,0,1,0,0), '{'), + DO(BRLAPI_DOTS(1,1,0,1,1,1,0,0), '}'), + DO(BRLAPI_DOTS(1,1,1,1,1,1,0,0), '='), + DO(BRLAPI_DOTS(1,1,0,0,0,1,0,0), '<'), + DO(BRLAPI_DOTS(0,0,1,1,1,0,0,0), '>'), + DO(BRLAPI_DOTS(1,1,0,1,0,1,0,0), '$'), + DO(BRLAPI_DOTS(1,0,0,1,0,1,0,0), '%'), + DO(BRLAPI_DOTS(0,0,0,1,0,0,1,0), '@'), + DO(BRLAPI_DOTS(1,1,0,0,1,1,0,0), '|'), + DO(BRLAPI_DOTS(1,1,0,0,1,1,1,0),'\\'), + DO(BRLAPI_DOTS(0,0,0,1,1,1,0,0), '_'), }; /* The serial port can receive more of our data */ @@ -345,7 +352,7 @@ static int baum_eat_packet(BaumDriverState *baum, const uint8_t *buf, int len) cursor = i + 1; c &= ~(BRLAPI_DOT7|BRLAPI_DOT8); } - if (!(c = nabcc_translation[c])) + if (!(c = nabcc_translation[DOTS2ASCII][c])) c = '?'; text[i] = c; } @@ -489,6 +496,12 @@ static void baum_send_key(BaumDriverState *baum, uint8_t type, uint8_t value) { baum_write_packet(baum, packet, sizeof(packet)); } +static void baum_send_key2(BaumDriverState *baum, uint8_t type, uint8_t value, uint8_t value2) { + uint8_t packet[] = { type, value, value2 }; + 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) { @@ -553,7 +566,17 @@ static void baum_chr_read(void *opaque) } break; case BRLAPI_KEY_TYPE_SYM: - break; + { + brlapi_keyCode_t keysym = code & BRLAPI_KEY_CODE_MASK; + if (keysym < 0x100) { + uint8_t dots = nabcc_translation[ASCII2DOTS][keysym]; + if (dots) { + baum_send_key2(baum, BAUM_RSP_EntryKeys, 0, dots); + baum_send_key2(baum, BAUM_RSP_EntryKeys, 0, 0); + } + } + break; + } } } if (ret == -1 && (brlapi_errno != BRLAPI_ERROR_LIBCERR || errno != EINTR)) {