Este verano me compré un reloj MetaWatch. Este reloj nace según sus creadores como una plataforma para desarrollo de manera que está documentado desde antes de venderse. La documentación la actualizan, el firmware lo actualizan y la aplicación para Android la actualizan también.
Además proporcionan el código fuente tanto de la aplicación para Android como del Firmware del mismo. Se me ocurrió hacerle una modificación, y es que cuando se pulsa el primer botón, el de arriba a la derecha, aparece mi tarjeta de visita. En este artículo explicaré de forma resumida el proceso para conseguir mi objetivo.
Lo primero es generar un qrcode en la web de zxing. Se rellena la información pertinente y se genera de tamaño S para que quepa en la pantalla de 96×96 del reloj. Aunque la imagen generada es un poco más grande aprovecharemos el hecho de que tiene un marco blanco alrededor despreciable sin pérdida de información. Una vez generado se abre con Gimp y se cambia el tamaño del lienzo a 96×96 recortando la zona blanca del alrededor tanto como sea necesario para que entre, sin redimensionar la imagen. Se guarda como BMP indexado de dos colores sin comprimir y ya tenemos la imagen preparada.
En el código fuente del firmware del reloj, las imágenes se encuentran directamente en el formato aceptado por el búfer de la pantalla, es decir, como array de bytes. Al tener la pantalla 96×96 píxeles como ya decíamos antes, se tiene un array de 96 filas con 12 bytes por fila. Doce bytes por ocho bits por byte hacen un total de 96 columnas.
Para convertir cualquier imagen BMP indexada con dos colores a array de bytes he realizado este pequeño script en python usando parte del código de PyMetaWatch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #!/usr/bin/env python import sys import Image def main(): image = Image.open(sys.argv[1]) pix = image.load() for y in range(0, 96): rowdat = "" for x in range(0,96,8): byte=0 for pindex in range(0,8): pixel=pix[x+pindex,y] if (pixel > 0): pixel = 1 byte=((byte>>1)|(pixel<<7)) rowdat="%s%s" % (rowdat,chr(byte)) myrow = "" for dat in rowdat: myrow += "0x%02x," % ord(dat) print myrow if __name__ == '__main__': main() |
Pasando como parámetro el nombre del archivo BMP devuelve un bloque de caracteres que habrá que usar en el código fuente del firmware. Lo que hice fue volcar la salida a un fichero y después copiar y pegar el resultado. Con eso es suficiente para nuestro objetivo final, no buscábamos hacer un programa de conversión sino que tan solo ha sido una herramienta intermedia.
Finalmente hay que buscar en el fichero LcdDisplay.c la definición de pBarCodeImage y sustituir su valor por el generado por el script anterior. Se compila el proyecto y se programa el nuevo firmware al reloj siguiendo las mismas instruciones que existen para la actualización oficial. Y ya está.
Gracias a draxus por encontrar la ubicación del QRCode original en el código fuente del firmware.
Un comentario en “MetaWatch Firmware”
noviembre 3rd, 2011 en 22:25
Doy fe de que queda muy buen, mejor que el que código que trae de casa. Y el firmware en C pelado del cacharro mola bastante para trastear.