Paso 65: PC Software: hilo de actualización del cubo
En cube.c tenemos una función llamada cube_push(). Toma la matriz de 64 bytes y envía por la línea serie al cubo del LED.
También maneja el formato, enviar dos veces cada byte de 0xff ya 0xff es nuestro carácter de escape. 0xFF y 0 x 00 es enviado primero para restablecer el LED cubos interno x y el y contadores.
En main.c tenemos la función cube_updater(). Esta función se inicia como un subproceso independiente con pthread_create(). El subproceso principal y el hilo de la actualización de cubo comparte la rs232_cube de la zona de memoria [8] [8]. El hilo de la actualización de cubo es sólo un tiempo cierto lazo que se llama cube_push() una y otra vez.
El primer intento de una rosca de updater a crear algún parpadeo de las animaciones. Después de alguna depuración, descubrimos que Marcos se está transmitiendo antes totalmente fueron dibujados por las funciones de efecto. Generalmente hacemos un fill(0x00), luego algo de código para dibujar nuevos píxeles. Si un marco es transmitido después de una fill(0x00), el cubo parpadeará un marco vacío para ish 1/60 de segundo.
Esto no fue un problema en el código que se ejecuta en el cubo del LED, ya que tiene una tasa de refresco de más de 1000 FPS, pero a 60 FPS puede notarlo.
Para superar esto crear un búfer doble y sincronizar los dos buffers en un punto en el tiempo donde la función de efecto ha terminado de dibujar el marco. Por suerte todas las funciones de efecto utilizan la función delay_ms() para hacer una pausa entre marcos de acabado. Acaba de poner un memcpy() en el interior hay que copiar el buffer del cubo en el búfer de rs232. Esto funciona de maravilla. No más parpadeo!