borgware-2d/src/mcuf/mcuf.c

77 lines
1.3 KiB
C

#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);
}
}
}