77 lines
1.3 KiB
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
|