uint8_t rx_fill = 0xFF;
uint8_t input[128] = { 0 };
uint8_t latch[128] = { 0 };
+uint8_t output[128] = { 0 };
uint8_t out_offset = 0;
uint8_t out_bits = 0;
uint8_t out_fill = 0;
+volatile uint8_t load_pos = 0xFF;
volatile uint8_t reset_pos = 0xFF;
uint8_t lcd_enabled = 0;
uint8_t log_row = 0;
while(1)
{
- uint8_t i;
-
check_input();
+ uint8_t i = load_pos;
+ if(i!=0xFF)
+ {
+ output[i] = latch[i];
+ if(++i>=sizeof(input))
+ i = 0xFF;
+ load_pos = i;
+ }
+
i = reset_pos;
if(i!=0xFF)
{
void check_input()
{
- uint8_t c;
if(!serial_read_available())
return;
- c = serial_read();
+ uint8_t c = serial_read();
if(rx_fill==0xFF)
{
if(c==':')
{
if(rx_fill>=4)
{
- uint16_t offset;
- uint8_t nibbles;
- uint8_t i;
-
- offset = (decode_hex(rx_buf[0])<<8) | (decode_hex(rx_buf[1])<<4) | decode_hex(rx_buf[2]);
- nibbles = (offset&3);
+ uint8_t offset = (decode_hex(rx_buf[0])<<8) | (decode_hex(rx_buf[1])<<4) | decode_hex(rx_buf[2]);
+ uint8_t nibbles = (offset&3);
offset >>= 2;
if(rx_fill>3+nibbles)
{
- for(i=0; i<=nibbles; ++i)
+ for(uint8_t i=0; i<=nibbles; ++i)
{
uint16_t j = offset+nibbles-i;
uint8_t shift = 4*(j&1);
uint8_t bits = decode_hex(rx_buf[3+i]);
input[j/2] = (input[j/2]&~(0xF<<shift)) | (bits<<shift);
- latch[j/2] = input[j/2];
+ latch[j/2] |= input[j/2];
}
if(lcd_enabled)
{
lcd_gotoxy(19-offset-nibbles, 0);
- for(i=0; i<=nibbles; ++i)
+ for(uint8_t i=0; i<=nibbles; ++i)
lcd_write(rx_buf[3+i]);
}
}
out_offset = 0;
out_bits = latch[0];
out_fill = 8;
+ load_pos = 0;
}
if(out_bits&1)
if(!--out_fill)
{
++out_offset;
- out_bits = latch[out_offset];
+ out_bits = output[out_offset];
out_fill = 8;
}