Skip to content

HID (dispositivo de interfaz humana) HID USB standard for braille displays

discapacidad5 edited this page Dec 6, 2021 · 2 revisions

Notas para desarrolladores de HID Braille

HID (dispositivo de interfaz humana)

La especificación HID estandariza la comunicación de bajo nivel con un dispositivo USB o Bluetooth, además de los tipos de controles de entrada y salida en el dispositivo. Los dispositivos de ejemplo son teclados, ratones, pantallas y ahora pantallas Braille.

Definiciones

En este documento, dispositivo significa una pieza de hardware que se conecta a una computadora a través de una conexión como USB o Bluetooth. El dispositivo puede contener uno o más controles para que un humano se comunique físicamente con el dispositivo, como botones o teclas para entrada, o LED o celdas de pines Braille elevados para salida.

También hay varios términos en HID que pueden resultar confusos para quienes recién comienzan a familiarizarse con esta tecnología.

  • Descriptores
  • Páginas de uso
  • Usos
  • Informes
  • Colecciones
  • Caps (capacidades)

Estos términos se describen en las subsecciones siguientes.

descriptores HID

En el momento de la conexión, un dispositivo HID debe exponer un bloque de datos a través de la conexión llamado descriptor. Se trata de datos legibles por máquina que describen todos los controles de entrada y salida admitidos por el dispositivo, incluido su tipo y número de elementos, etc. También define el tamaño de los bloques de datos (o informes) que se pueden escribir y leer en el dispositivo. Un descriptor puede ser leído por un humano (ya sea como valores brutos o con algún tipo de descompilador) pero desde el punto de vista de Windows, el descriptor es opaco, y se deben usar otras API de Windows de más alto nivel para comunicarse con el dispositivo. , que hará toda la verificación de tipos por usted.

Páginas de uso HID

La especificación HID agrupa los controles en categorías a las que se refiere como páginas. Cada página tiene su propio número único y se denomina Página de uso. Una página de uso puede representar un tipo de dispositivo específico, como un teclado, un joystick o una pantalla Braille, o puede ser más general, como una página de botones genérica.

Usos HID

Un uso representa un tipo de control (tecla, botón, celda braille, LED). Al uso se le asigna su propio nombre constante y un número único relativo a la página de uso particular en el estándar en el que se encuentra. Un uso define información sobre el control, como si es un botón booleano, un valor estático o dinámico, una bandera o un selector (1 de muchos). Para obtener más información sobre lo que realmente significan estos tipos (sel, dv, nary, etc.), consulte las primeras páginas de la especificación HID Usage Tables 1.22 a la que se hace referencia al final de este documento. La especificación en sí puede o no definir otros aspectos del tipo de datos, como su tamaño o número de elementos, aunque el descriptor HID que el dispositivo pone a disposición en tiempo de ejecución debe contener toda esta información. Los ID de uso también se utilizan para identificar de forma exclusiva colecciones de controles o valores.

informes HID

Un informe es un bloque de datos que se lee o escribe en el dispositivo HID. Tiene un tamaño especificado por el descriptor HID y contiene un ID de informe como primer byte. En Windows, cuando se obtiene un nuevo informe con "ReadFile" , Windows escribe automáticamente el ID del informe en el bloque de datos, y lo más probable es que el usuario desarrollador nunca deba conocerlo como otras API de Windows de alto nivel que pueden extraer datos de los informes utilizarán este byte de ID de informe internamente. Sin embargo, al escribir informes con "WriteFile" , el usuario desarrollador debe establecer el byte de ID de informe apropiado en el informe específico para los valores que el usuario desarrollador incluye en el informe. En Windows, el ID del informe se puede encontrar en la estructura HIDP_VALUE_CAPS (capacidades de valor) para ese valor, obtenido del descriptor HID con HidP_GetValueCaps .

colecciones HID

Los controles HID se agrupan en colecciones. Algunos ejemplos pueden ser todas las teclas de un teclado o todas las celdas de una línea de Braille. Cada colección definida tiene una página de uso y un ID de uso para que pueda identificarse de forma única. Todos los dispositivos HID tienen una colección de nivel superior, que es el principal punto de entrada para recopilar información sobre el dispositivo, incluida la obtención de otras colecciones. Estas otras colecciones se conocen como colecciones vinculadas.

Mayúsculas

Una abreviatura de la palabra Capacidades utilizada por estructuras y API de Windows particulares para HID. Por ejemplo, HidP_GetCaps obtiene las capacidades del dispositivo HID. Estos incluyen cosas como la cantidad de botones de entrada o valores de salida en el dispositivo, el tamaño de los informes y la página de uso y uso del dispositivo. De manera similar, HidP_GetButtonCaps obtiene las capacidades de todos los botones del dispositivo. Las capacidades de los botones y valores incluyen cosas como su Uso y Página de Uso, si representan un rango de Usos y si tienen un estado NULL, etc.

Patrón general para admitir HID en Windows

Enumeración de dispositivos HID

  • Obtenga la clase guid para dispositivos HID con HidD_GetHidGuid
  • Obtenga la información del dispositivo establecida para la máquina local con SetupDiGetClassDevs , especificando la clase HID guid como clase guid.
  • Siga llamando a SetupDiEnumDeviceInterfaces , aumentando memberIndex cada vez, para enumerar todos los dispositivos disponibles obteniendo una estructura SP_DEVICE_INTERFACE_DATA para cada uno, hasta que la función devuelva falso, lo que significa que no quedan más dispositivos por enumerar.
  • Para cada estructura de datos obtenida , llame a SetupDiGetDeviceInterfaceDetail para obtener una estructura SP_DEVICE_INTERFACE_DETAIL_DATA .
  • El miembro devicePath de la estructura SP_DEVICE_INTERFACE_DETAIL_DATA es la ruta que debe usarse para abrir el dispositivo para leer / escribir más tarde.
  • Es posible que se requieran algunas otras propiedades, como hardwareID, para identificar mejor el dispositivo, estas se pueden obtener con SetupDiGetDeviceRegistryProperty .
  • Para una implementación, vea listHidDevices en el código fuente de NVDA / hwPortUtils.py

Abriendo un dispositivo HID

  • Use CreateFile para abrir un dispositivo HID, dándole DevicePath como ruta del archivo. Tenga en cuenta que es posible una E / S superpuesta; Consulte la documentación de CreateFile .
  • Si este dispositivo puede necesitar ser abierto por otros procesos al mismo tiempo, querrá especificar FILE_SHARE_READ | FILE_SHARE_WRITE también.
  • Una vez que el asa del dispositivo abierto ya no es necesaria, se puede cerrar con CloseHandle .
  • Para una implementación, vea la clase Hid en el código fuente de NVDA / hwIo / base.py

Obteniendo atributos del dispositivo

  • Para obtener información como vendorID, productID y versionNumber, llame a HidD_GetAttributes en el identificador del dispositivo abierto.
  • Para obtener la cadena del fabricante, use HidD_GetManufacturerString dando el identificador del dispositivo abierto.
  • Para obtener la cadena del producto, use HidD_GetProductString dando el identificador del dispositivo abierto.

Obteniendo el descriptor HID

Obtener las capacidades del dispositivo, obtener datos de los informes y configurar los datos en los informes requiere el descriptor HID del dispositivo. Windows representa el descriptor HID como un valor opaco denominado datos preparados.

  • Obtenga los datos preparados del dispositivo con HidD_GetPreparsedData , dándole el identificador de dispositivo abierto. Tenga en cuenta que esto debe liberarse una vez que ya no sea necesario con HidD_FreePreparsedData .

Obteniendo capacidades del dispositivo

  • Para averiguar la página de uso, el uso, el número de valores de entrada y salida y los tamaños de los informes de una colección de nivel superior, obtenga una estructura HIDP_CAPS para el dispositivo con HidP_GetCaps , proporcionando el identificador del dispositivo abierto y los datos preparados.

Recuperar valor / capacidades de botón

La información de tipo de botones de entrada y valores y valores de salida en un dispositivo (como su ID de uso, tamaño y número de elementos) se puede encontrar a través de una estructura HIDP_VALUE_CAPS para cada uno. Se puede obtener una matriz de estas estructuras con "HidP_GetValueCaps" para los valores de entrada o salida, y "HidP_GetButtonCaps" para los botones. A veces, una estructura HIDP_VALUE_CAPS puede representar un rango de botones o valores, donde se exponen los ID de uso mínimo y máximo y los índices de datos, en lugar de un valor específico. Ejemplos de estos podrían ser la forma en que se exponen las teclas de entrada de puntos Braille. Solo hay una estructura HIDP_VALUE_CAPS , que cubre los valores de dot1 a dot8.

Leyendo datos del dispositivo

  • Utilice "ReadFile" para leer el siguiente informe de entrada disponible del dispositivo. El tamaño de los datos a leer en bytes debe ser igual a la InputReportByteLength miembro de del dispositivo HIDP_CAPS estructura.
  • Uso de las funciones tales como HidP_GetData y HidP_GetUsages para extraer el valor actual de los botones y otros valores establecidos en el informe.

Escribiendo datos en el dispositivo

Para establecer el valor de controles particulares en el dispositivo:

  • Cree un informe de salida asignando un bloque de memoria de tamaño OutputReportByteLength de la estructura HIDP_CAPS del dispositivo, usando algo como malloc .
  • Establezca el ID del informe (el primer byte) en el ID del informe que se encuentra en la estructura HIDP_VALUE_CAPS para el valor o valores que desea establecer. Obviamente, esto significa que solo puede establecer valores que compartan el mismo ID de informe en un solo informe.
  • Ajuste los datos para los valores utilizando funciones como HidP_SetUsageValue o HidP_SetUsageValuesArray .
  • Envíe el informe al dispositivo usando WriteFile . El tamaño en bytes enviados debe ser igual a la OutputReportByteLength de del dispositivo HIDP_CAPS estructura.

Especificación Braille HID

Antecedentes

Los dispositivos Braille Display permiten que los lectores de pantalla los controlen mediante una variedad de conexiones, como Serial, USB y Bluetooth. Los protocolos utilizados en estos canales han sido tradicionalmente específicos del fabricante de Braille Display. Esto ha significado que para que un lector de pantalla admita una pantalla Braille en particular, debe tener una lógica específica en el lector de pantalla que sepa cómo hablar el protocolo específico del dispositivo requerido. Además, en Windows, al menos, el usuario también debe instalar un controlador de nivel de sistema operativo proporcionado por el fabricante de Braille Display para que la computadora detecte y se comunique con el dispositivo. Con la introducción del estándar HID (Dispositivo de interfaz humana) para USB (y más tarde Bluetooth), fue posible eliminar la necesidad del controlador de dispositivo de nivel de sistema operativo requerido en Windows si el fabricante de la pantalla Braille expuso el dispositivo como un dispositivo HID personalizado , sin embargo, el lector de pantalla aún necesitaba un código específico del dispositivo, ya que el HID personalizado solo simplificaba la comunicación de bytes de bajo nivel, pero no estandarizaba lo que esos bytes realmente significaban.

En 2018, la especificación HID se amplió para definir el concepto de dispositivo Braille Display, incluida la configuración de las celdas braille y la estandarización de los botones comunes que se encuentran en las pantallas Braille, como las teclas de enrutamiento, las teclas de entrada de puntos Braille, el espacio en braille y las teclas de panorámica. Se agregó una nueva página de uso a la especificación HID: HID_USAGE_PAGE_BRAILLE (0x41). Esta página contiene nuevos ID de uso como:

  • BRAILLE_DISPLAY (0x1): el ID de uso para la colección de nivel superior del dispositivo HID.
  • Colecciones como BRAILLE_ROW (para contener celdas braille)
  • 8_dot_BRAILLE_CELL (0x3) y 6_dot_braille_cell (0x4), que es un valor de salida que representa una celda braille física en el dispositivo.
  • BRAILLE_KEYBOARD_DOT_1 a BRAILLE_KEYBOARD_DOT_8: los botones de entrada de puntos Braille para escribir caracteres braille.
  • Teclas de espacio braille izquierda, derecha y central (para escribir un espacio).
  • Botones de joystick y dpad
  • Botones de panorámica para desplazarse por la pantalla braille. los detalles sobre la cantidad de recopilaciones, usos e informes deben consultarse en tiempo de ejecución y pueden variar entre dispositivos e incluso con actualizaciones de firmware de dispositivos.

Patrón para hablar con un dispositivo braille HID

Inicialización

  • Siga las instrucciones generales para enumerar y abrir un dispositivo HID, además de buscar dispositivos y capacidades de valor como se mencionó anteriormente en este documento.
  • Asegúrese de que el dispositivo Hid sea realmente una pantalla Braille verificando que el HIDP_CAPS.UsagePage de la colección de nivel superior del dispositivo HID esté configurado en HID_USAGE_PAGE_BRAILLE (0x41).
  • Encuentre la estructura de salida correcta HIDP_VALUE_CAPS que representa la matriz de celdas braille. Es decir el ID de uso es EIGHT_DOT_BRAILLE_CELL o six_dot_braille_cell. El miembro ReportCount de esta estructura indica el número de celdas del dispositivo. Esta estructura también debe guardarse, ya que luego se necesita cuando se escribe braille en la pantalla.
  • Recoger todas las HIDP_VALUE_CAPS estructuras para los botones / valores de entrada y almacenarlos en una asignación de enchavetado por su DataIndex miembro (o un índice de datos calculado desplazamiento desde el DataIndexMin miembro si el HIDP_VALUE_CAPS representa un rango de valores) .
  • También puede ser útil almacenar un índice de cada estructura HIDP_VALUE_CAPS relativo a la primera estructura HIDP_VALUE_CAPS en la colección actual (es decir cuando el miembro LinkCollection difirió por última vez de la estructura anterior). En otras palabras, el índice dentro de su colección. esto es necesario en algunas implementaciones para determinar qué clave de enrutamiento representa un valor, ya que el ID de uso para el valor será solo ROUTING_KEY y la colección será uno de los ID de uso de la colección ROUTER_SET_ *.

Escribiendo celdas en el dispositivo

  • Cree un informe de salida HID (bloque de memoria), estableciendo el ID del informe (primer byte) al valor del miembro ReportID de la estructura de celda Braille HIDP_VALUE_CAPS que se encuentra en el momento de la construcción.
  • Llame a HidP_SetUsageValueArray para colocar los datos (patrones de puntos de celda braille) en el informe en el lugar apropiado, utilizando el ID de uso y el número de colección, etc. de la estructura de celda HIDP_VALUE_CAPS .
  • Envíe el informe a la pantalla Braille usando WriteFile . El número de bytes escritos será el valor de HIDP_CAPS.OutputReportByteLength .

Recibir entrada (pulsaciones de tecla / botón)

  • Leer un informe de entrada de tamaño InputReportByteLength con ReadFile (o una devolución de llamada IO solapado)
  • HidP_GetData se puede utilizar para extraer todas las estructuras HIDP_DATA del informe. estos representan el estado de todos los botones de entrada y otros controles.
  • Usando el miembro DataIndex de cada elemento de datos recuperado, busque la estructura original HIDP_VALUE_CAPS para ese índice de datos para encontrar su página de uso y su ID de uso. Esto denotará el botón actual presionado o el valor cambiado. Si solo necesita averiguar qué botones están presionados, pero no más datos como el valor establecido real o el índice de datos, puede llamar a HidP_GetButtons . Pero esto no sería útil para botones como las teclas de enrutamiento, ya que necesita saber específicamente qué tecla de enrutamiento se presionó.

Referencias:

Este es el protocolo que hay que implementar

HID USB standard for braille displays HID USB standard for braille displays

REFERENCIAS:

¿Qué es un dispositivo de interfaz humana (HID)?

Apple, Microsoft y Google colaboran en un nuevo estándar universal para pantallas Braille El objetivo es hacer que el uso de pantallas Braille sea un proceso simple plug-and-play https://www.theverge.com/circuitbreaker/2018/5/31/17413178/apple-microsoft-google-usb-universal-standard-braille-displays

BRLTTY es un proceso en segundo plano (demonio) que proporciona acceso a la consola Linux / Unix (cuando está en modo texto) para una persona ciega que usa una pantalla braille actualizable. Controla la pantalla braille y proporciona una función de revisión de pantalla completa. También se ha incorporado alguna capacidad de habla.

Unicode Range "Braille Patterns

USB-IF Establishes A Standard For Braille Displays

LECTORES DE PANTALLA

es importante recalcar que MVDA no dará mas soporte para controladores personalizado en el futuro es por eso que debemos adoptar el protocolo HID Braille y no necesitaremos tener controladores individuales en ningún lector de pantalla Cómo añadir soporte para una pantalla braille

Creemos que cada persona ciega + con discapacidad visual Merece el derecho a acceder libremente y fácilmente a una computadora! https://github.com/nvaccess/nvda

JAWS https://support.freedomscientific.com/Downloads/JAWS Un lector de pantalla para Windows de pago

ANDROID https://github.com/google/brailleback con talkcback

Google BrailleBack en conjunto con un lector de pantalla

LECTORES DE PANTALLA ANDROD deben trabajar en conjunto con brailleback para salida braille

talkback: se instala al instalar con el paquete Suite de Accesibilidad Android

jieshuo lector chino

Voice Assistant en el Samsung lector de pantalla de sansung viene ya preinstalada

ShinePlus

BRLTTY