2016/07/26

Slither - 4 - usb mouse y encoder con edu-ciaa-nxp

Viene de  Slither - 3 - usb mouse con edu-ciaa-nxp

Ahora, hay que combinar el código del mouse [1] con el del encoder [2]. Esto está en [3].

La idea es que al llamar a Mouse_Tasks(), hay que avisarle que ha hecho el encoder.

Me imagino que la forma correcta de programarlo hubiese sido activar las interrupciones de los pines a donde conectemos el encoder y hacer la lógica correspondiente.

Sin embargo, a mi me parece que por como viene el ejemplo

   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


lo que está ocurriendo es que se habilitó la interrupción de USB y cuando __WFI() lo detecta sigue con el bucle, o sea, no se está llamando a ninguna función por la interrupción.

O sea, yo tendría que habilitar las interrupciones sin darle un handler y poner algo como:

   Encoder_Tasks();
   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


Probablemente tendría que agregar lógica en cada *_Tasks() para ver si me llamaron por mi interrupción o por otra.


Como no sé nada de interrupciones aún, voy a poner inline Encoder_Tasks() y mala suerte, ver como responde.

El código resultante es buena parte del encoder, pero tuve que modificar las firmas de Mouse_Tasks() y  Mouse_UpdateReport() para que reciban los valores del encoder.








[1] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse

[2] https://github.com/cpantel/ciaa/tree/master/slither.io/encoder

[3] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse_encoder

Slither - 3 - usb mouse con edu-ciaa-nxp

Viene de Slither - 2 - encoder con edu-ciaa-nxp


En clase recibí el trabajo de adaptación a CIAA de Pablo Ridolfi y la gente de la CIAA sobre los ejemplos de NXP para que la placa funcione como teclado[1]. Mirando fijo y buscando un poco en Internet, hallé el código necesario[2] para que funcione como mouse e hice la adaptación[3], que no hace más que decirle a la máquina "movete a la derecha un poco" cada tanto.

Hasta donde alcanzo a comprender no es un ejemplo bare metal y usa interrupciones, que no era lo que yo deseaba aún, pues me autoimpuesto terminar de agotar el recurso de NO usar interrupciones por cuestiones didácticas.

Para que no tengas que descubrirlo vos, te cuento que main() tiene un loop:

   Keyboard_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


y Keyboard_Tasks() llama a Keyboard_UpdateReport(), donde para cada tecla

if(!ciaaReadInput(#tecla#)) {
   HID_KEYBOARD_REPORT_SET_KEY_PRESS(g_keyBoard.report, 0x#letra#);


dependiendo de la #tecla# oprimida se agrega al reporte una #letra#

Para el mouse es casi igual,

   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();



y Mouse_Tasks() llama a Mouse_UpdateReport():

   setXYMouseReport(g_mouse.report, x, y);

con un x que se va incrementando, así que se va para la derecha cada vez más rápido.

Sigue en Slither - 4 - usb mouse y encoder con edu-ciaa-nxp

[1] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_keyboard

[2] https://github.com/micromint/LPCOpen-keil-lpc43xx/tree/master/applications/lpc18xx_43xx/examples/usbd_rom/usbd_rom_hid_mouse

[3] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse