#include "uart.h" #include "pixel.h" #define my_uart_getc uart_getc typedef struct { uint32_t magic; uint8_t height_h; uint8_t height_l; uint8_t width_h; uint8_t width_l; uint16_t channels; uint16_t maxval; uint8_t pixels[256]; } mcuf_t; static void parse_mcuf(mcuf_t * mcuf){ if(mcuf->height_l == 8 && mcuf->width_l == 18){ uint8_t x,y; for(y=0;y<8;y++){ for(x=0;x<16;x++){ setpixel((pixel){15-x, y+4}, mcuf->pixels[y*18 + x + 1] >> 6 ); } } }else if(mcuf->height_l == 16 && mcuf->width_l == 16){ uint8_t x,y; for(y=0;y<16;y++){ for(x=0;x<16;x++){ setpixel((pixel){15-x, y}, mcuf->pixels[y*16 + x] >> 6 ); } } } } static uint8_t mcuf_magic[4] = {0x23, 0x54, 0x26, 0x66}; void mcuf_serial_mode(){ mcuf_t mcuf_packet; uint8_t c; while(1){ uint16_t count = 0; uint8_t x; uint16_t num_pixels; do{ c = my_uart_getc(); ((uint8_t*)&mcuf_packet)[count] = c; if(c == mcuf_magic[count] ){ count ++; }else{ count = 0; } }while(count != 4); for(x=0; x<4; x++){ c = my_uart_getc(); ((uint8_t*)&mcuf_packet)[count++] = c; } num_pixels = (uint16_t)mcuf_packet.width_l * mcuf_packet.height_l; if(num_pixels <= 256){ num_pixels += 4; while(num_pixels--){ c = my_uart_getc(); ((uint8_t*)&mcuf_packet)[count++] = c; } parse_mcuf(&mcuf_packet); } } }