Realice los eventos independientes de los tres botones físicos de S1, S2 y User-down (DTButton-V0.0.3)

Para obtener más información, visite:

La comunidad tecnológica de Hongmeng establecida conjuntamente por la cooperación estratégica oficial 51CTO y Huawei

https://harmonyos.51cto.com/#bkwz


En la publicación anterior "Implementación de eventos independientes de los tres botones físicos S1, S2 y User-Up (análisis de soluciones)" , los tres botones físicos S1, S2 y User se distinguieron con éxito al leer el valor ADC en HI_ADC_CHANNEL_2 .

La impresión en la imagen de arriba es el efecto de presionar Usuario, S1, S2 respectivamente, lo que parece satisfacer completamente nuestras necesidades para distinguir botones, pero. . .

 

¿Pero que? ¿Alguna pregunta?

 

Lo que quiero decir es, pero el problema es muy obvio: presionar cualquiera de estas tres teclas activará eventos clave varias veces (el experimento en la figura anterior responde a los eventos clave imprimiendo). Por lo tanto, solo distinguir S1, S2, User no es suficiente y no puede satisfacer las necesidades del desarrollo real. Por lo tanto, debe mejorarse aún más para que solo se active un evento cada vez que se presione el botón.

 

Al ver esto, creo que todos pensaron en el anterior marco universal de botones de código abierto DTButton. En la versión V0.0.2, se pueden distinguir y activar varios eventos de clave GPIO, pero S1, S2, Usuario no solo se pueden distinguir. Sin embargo, ahora hay un esquema para distinguir S1, S2 y User, ¿no es perfecto para integrar este esquema en el marco DTButton? ? ! !

 

¡Okay! ¡Simplemente hazlo!

 

Lo siguiente que debe hacer es:

  1. Integre GetSSU () en el marco para que el marco admita tres eventos de S1, S2, Usuario (Pressed, LongPressed, Released)
  2. No cambie la interfaz externa del marco (no cambie el método de llamada del marco, no agregue nuevas funciones de interfaz)
  3. No afecta las funciones originales del framework V0.0.2

 

Para realizar las tres tareas anteriores, debe revisar el diseño principal del marco DTButton:

 

El botón GPIO marca la ocurrencia de un evento en la rutina del servicio de interrupción y luego llama a la función de devolución de llamada del evento a través de la marca en el hilo de procesamiento de eventos (¡solo una vez)!

Nota: La marca de evento debe borrarse inmediatamente después de que se active el evento para evitar múltiples llamadas a la función de devolución de llamada.

 

Por lo tanto, el método de integración más simple es marcar el evento cuando se presiona una tecla en S1, S2, Usuario, y luego llamar a la función de devolución de llamada correspondiente a través de la marca de evento (borrar la marca de evento después de regresar).

 

El proceso es el siguiente:

La siguiente pregunta a considerar es: ¿Cómo construir el evento de prensa y el evento de lanzamiento de S1, S2, Usuario?

 

Para resolver este problema, puede consultar el modo de activación de eventos del botón GPIO general: activación de borde ascendente y activación de borde descendente . Sin embargo, creo que también se ha dado cuenta de que S1, S2 y User se distinguen por detectar el valor de ADC y no pueden capturar de manera directa y precisa los bordes ascendentes y descendentes como el botón GPIO. ¿Cómo hacerlo? ? ? Directo no es posible, puede ser indirecto: el evento de lanzamiento y el evento de prensa se construyen simulando flancos ascendentes y descendentes.

 

El método específico es el siguiente:

A nivel de código, la variable preKey puede usarse para registrar el último estado de clave obtenido a través de GetSSU () y compararlo con el estado de clave obtenido al llamar a GetSSU (). El resultado de la comparación puede determinar si se construye un evento de clave.

Con el análisis anterior, puede escribir el siguiente código a mano.

Después de eso, todo el marco maneja los eventos clave de una manera unificada, ya sean claves S1, S2, Usuario o GPIO, cualquier evento desencadenado se procesará en EventHandler ().

 

¡En este punto, el diseño del botón marco universal versión V0.0.3 está completo! La implementación del código específico ha sido de código abierto (descarga adjunta al final del artículo), lista para usar de inmediato.

 

Los ejemplos de uso son los siguientes:

La misma interfaz, la misma forma, la misma experiencia, el único extra es el soporte de distinción para los tres botones físicos S1, S2 y Usuario.


Para obtener más información, visite:

La comunidad tecnológica de Hongmeng establecida conjuntamente por la cooperación estratégica oficial 51CTO y Huawei

https://harmonyos.51cto.com/#bkwz


Supongo que te gusta

Origin blog.51cto.com/14901125/2551932
Recomendado
Clasificación