src/hello.c
changeset 89 1b3cea759eff
parent 88 c923295ee520
child 90 13c2deb919d1
equal deleted inserted replaced
88:c923295ee520 89:1b3cea759eff
     1 #include <avr/io.h>
       
     2 
       
     3 #include "stdlib.h"
       
     4 
       
     5 // XXX
       
     6 #include "timer.c"
       
     7 #include "serial.c"
       
     8 #include "spi.c"
       
     9 #include "led7.c"
       
    10 
       
    11 static enum state {
       
    12     START       = '\n',
       
    13     CMD_SET     = 's',
       
    14     CMD_INC     = '+',
       
    15     CMD_DEC     = '-',
       
    16     CMD_READ    = 'r',
       
    17     ARG_CHAR    = '0',
       
    18     ERROR       = '!',
       
    19 } state = START, cmd = 0;
       
    20 
       
    21 static enum {
       
    22     CMD_LED_1   = 0,
       
    23 } cmd_led = 0;
       
    24 
       
    25 static char arg_char;
       
    26 
       
    27 static unsigned char led_state = 0;
       
    28 
       
    29 int command (enum state cmd)
       
    30 {
       
    31     switch (cmd) {
       
    32         case CMD_SET:
       
    33             led_state = arg_char;
       
    34 
       
    35             return 0;
       
    36 
       
    37         case CMD_INC:
       
    38             if (led_state == 0xff)
       
    39                 return 1;
       
    40 
       
    41             led_state++;
       
    42             return 0;
       
    43 
       
    44         case CMD_DEC:
       
    45             if (!led_state)
       
    46                 return 1;
       
    47 
       
    48             led_state--;
       
    49             return 0;
       
    50 
       
    51         case CMD_READ:
       
    52             led_state = spi_rx[1]; // XXX
       
    53             return 0;
       
    54 
       
    55         default:
       
    56             return 1;
       
    57     }
       
    58 }
       
    59 
       
    60 char input (char c)
       
    61 {
       
    62     if (c == '\r') {
       
    63         char ret = '?';
       
    64 
       
    65         // command state
       
    66         switch (state) {
       
    67             case START:
       
    68                 cmd = 0;
       
    69                 break;
       
    70 
       
    71             case CMD_SET:
       
    72             case CMD_INC:
       
    73             case CMD_DEC:
       
    74                 break;
       
    75 
       
    76             case ARG_CHAR:
       
    77                 break;
       
    78 
       
    79             case ERROR:
       
    80                 cmd = 0;
       
    81                 break;
       
    82         }
       
    83 
       
    84         // command
       
    85         if (!cmd) {
       
    86             ret = ' ';
       
    87         } else if (command(cmd)) {
       
    88             ret = '!';
       
    89         } else {
       
    90             ret = '\n';
       
    91         }
       
    92         
       
    93         // return to START with response
       
    94         state = START;
       
    95         return ret;
       
    96 
       
    97     } else if (31 < c && c < 128) {
       
    98         // process input char
       
    99         switch (state) {
       
   100             case START:
       
   101                 if (c == 's') {
       
   102                     cmd = CMD_SET;
       
   103                     state = ARG_CHAR;
       
   104                     arg_char = 0;
       
   105                 } else if (c == 'S') {
       
   106                     cmd = state = CMD_SET;
       
   107                     arg_char = 255;
       
   108                 } else if (c == '+') {
       
   109                     cmd = state = CMD_INC;
       
   110                 } else if (c == '-') {
       
   111                     cmd = state = CMD_DEC;
       
   112                 } else if (c == 'r') {
       
   113                     cmd = state = CMD_READ;
       
   114                 } else {
       
   115                     break;
       
   116                 }
       
   117                 
       
   118                 return state;
       
   119             break;
       
   120 
       
   121             /* 
       
   122             case CMD_SET:
       
   123                 if (c == '1') {
       
   124                     cmd_led = CMD_LED_1;
       
   125                     state = ARG_CHAR;
       
   126                     arg_char = 0;
       
   127                 } else {
       
   128                     state = ERROR;
       
   129                 }
       
   130 
       
   131                 break;
       
   132             */
       
   133             case ARG_CHAR:
       
   134                 if (c >= '0' && c <= '9') {
       
   135                     arg_char *= 10;
       
   136                     arg_char += (c - '0');
       
   137                 } else {
       
   138                     break;
       
   139                 }
       
   140                     
       
   141                 return c;
       
   142             break;
       
   143         }
       
   144 
       
   145         // reject
       
   146         state = ERROR;
       
   147         return ERROR;
       
   148 
       
   149     } else {
       
   150         // ignore
       
   151         return ' ';
       
   152     }
       
   153 }
       
   154 
       
   155 
       
   156 #define DEBUG_DDR   DDRB
       
   157 #define DEBUG_PORT  PORTB
       
   158 #define DEBUG_LED   0
       
   159 
       
   160 int main (void)
       
   161 {
       
   162     led7_init();
       
   163     timer_init();
       
   164     serial_init();
       
   165     spi_init();
       
   166 
       
   167     // led_init();
       
   168     sbi(&DEBUG_DDR, DEBUG_LED);
       
   169 
       
   170     sei();
       
   171 
       
   172     // start
       
   173     char c;
       
   174     unsigned short timeout = 0;
       
   175         
       
   176     serial_write(state);
       
   177 
       
   178     while (true) {
       
   179         // TODO: SPI timer
       
   180         led7_update(led_state);
       
   181         spi_update();
       
   182 
       
   183         // toggle
       
   184         if (led_state == 0) {
       
   185             timeout = 0;
       
   186             cbi(&DEBUG_PORT, DEBUG_LED);
       
   187 
       
   188         } else if (led_state == 255) {
       
   189             timeout = 0;
       
   190             sbi(&DEBUG_PORT, DEBUG_LED);
       
   191 
       
   192         } else {
       
   193             // as Hz
       
   194             timeout = (16000 / led_state);
       
   195             xbi(&DEBUG_PORT, DEBUG_LED);
       
   196         }
       
   197         
       
   198         // sleep
       
   199         if (timer_sleep(timeout)) {
       
   200             c = '.';
       
   201 
       
   202         } else if ((c = serial_read())) {
       
   203             // got serial data
       
   204             c = input(c);
       
   205 
       
   206         } else {
       
   207             c = '?';
       
   208         }
       
   209         
       
   210         // output...
       
   211         serial_write(c);
       
   212     }
       
   213 }