src/hello.c
changeset 57 ee412c5be8b1
parent 56 3b837eaf1b6d
--- 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