--- a/src/hello.c Fri Apr 04 01:04:41 2014 +0300
+++ b/src/hello.c Fri Apr 04 13:14:04 2014 +0300
@@ -1,13 +1,19 @@
#include <avr/io.h>
#include "stdlib.h"
-#include "timer.c" // XXX
-#include "serial.c" // XXX
-#include "spi.c" // XXX
+
+// XXX
+#include "timer.c"
+#include "serial.c"
+#include "spi.c"
+#include "led7.c"
static enum state {
START = '\n',
CMD_SET = 's',
+ CMD_INC = '+',
+ CMD_DEC = '-',
+ CMD_READ = 'r',
ARG_CHAR = '0',
ERROR = '!',
} state = START, cmd = 0;
@@ -28,6 +34,24 @@
return 0;
+ case CMD_INC:
+ if (led_state == 0xff)
+ return 1;
+
+ led_state++;
+ return 0;
+
+ case CMD_DEC:
+ if (!led_state)
+ return 1;
+
+ led_state--;
+ return 0;
+
+ case CMD_READ:
+ led_state = spi_rx[1]; // XXX
+ return 0;
+
default:
return 1;
}
@@ -45,6 +69,8 @@
break;
case CMD_SET:
+ case CMD_INC:
+ case CMD_DEC:
break;
case ARG_CHAR:
@@ -76,13 +102,20 @@
cmd = CMD_SET;
state = ARG_CHAR;
arg_char = 0;
- return state;
-
} else if (c == 'S') {
cmd = state = CMD_SET;
arg_char = 255;
- return state;
+ } else if (c == '+') {
+ cmd = state = CMD_INC;
+ } else if (c == '-') {
+ cmd = state = CMD_DEC;
+ } else if (c == 'r') {
+ cmd = state = CMD_READ;
+ } else {
+ break;
}
+
+ return state;
break;
/*
@@ -101,9 +134,11 @@
if (c >= '0' && c <= '9') {
arg_char *= 10;
arg_char += (c - '0');
-
- return c;
+ } else {
+ break;
}
+
+ return c;
break;
}
@@ -117,82 +152,6 @@
}
}
-#define LED7_DDR DDRB
-#define LED7_PORT PORTB
-#define LED7_OE PORTB1
-
-// common anode?
-#define LED7_ANODE 0
-
-#define LED7_OFFSET 0
-#define LED7_COUNT 2
-
-static const uint8_t LED7SEG_FONT[] = {
- 0b00111111, // 0
- 0b00000110, // 1
- 0b01011011, // 2
- 0b01001111, // 3
- 0b01100110, // 4
- 0b01101101, // 5
- 0b01111101, // 6
- 0b00000111, // 7
- 0b01111111, // 8
- 0b01100111, // 9
- 0b01110111, // A
- 0b01111100, // B
- 0b00111001, // C
- 0b01011110, // D
- 0b01111001, // E
- 0b01110001, // F
-};
-
-enum {
- LED7SEG_DOT = 0b10000000,
-};
-
-void led7_init (void)
-{
- sbi(&LED7_PORT, LED7_OE); // disabled (low)
- sbi(&LED7_DDR, LED7_OE); // out
-}
-
-/*
- * Update external IO.
- */
-void led7_update_raw (uint8_t *led7, char count)
-{
- int i;
-
- for (i = 0; i < count; i++) {
- char raw = LED7SEG_FONT[led7[i]];
-
- spi_tx[LED7_OFFSET + i] = LED7_ANODE ? ~raw : raw;
- }
-}
-
-void led7_update_hex (unsigned char c)
-{
- uint8_t led7[2];
-
- led7[0] = c >> 4;
- led7[1] = c & 0xF;
-
- return led7_update_raw(led7, sizeof(led7));
-}
-
-void led7_update ()
-{
- static unsigned char i = 0;
-
- if (i) {
- // enable display
- cbi(&LED7_PORT, LED7_OE);
- }
-
- led7_update_hex(led_state);
-
- i++;
-}
#define DEBUG_DDR DDRB
#define DEBUG_PORT PORTB
@@ -218,7 +177,7 @@
while (true) {
// TODO: SPI timer
- led7_update();
+ led7_update(led_state);
spi_update();
// toggle