src/hello.c
changeset 54 ec42f36d8614
parent 53 dfe67409fbcd
child 55 04c625712e35
equal deleted inserted replaced
53:dfe67409fbcd 54:ec42f36d8614
     2 
     2 
     3 #include "stdlib.h"
     3 #include "stdlib.h"
     4 #include "timer.c" // XXX
     4 #include "timer.c" // XXX
     5 #include "serial.c" // XXX
     5 #include "serial.c" // XXX
     6 
     6 
       
     7 static enum state {
       
     8     START       = '\n',
       
     9     CMD_SET     = 's',
       
    10     ARG_CHAR    = '0',
       
    11     ERROR       = '!',
       
    12 } state = START, cmd = 0;
       
    13 
       
    14 static enum {
       
    15     CMD_LED_1   = 0,
       
    16 } cmd_led = 0;
       
    17 
       
    18 static char arg_char;
       
    19 
       
    20 static unsigned char led_state = 0;
       
    21 
       
    22 int command (enum state cmd)
       
    23 {
       
    24     switch (cmd) {
       
    25         case CMD_SET:
       
    26             led_state = arg_char;
       
    27 
       
    28             return 0;
       
    29 
       
    30         default:
       
    31             return 1;
       
    32     }
       
    33 }
       
    34 
       
    35 char input (char c)
       
    36 {
       
    37     if (c == '\r') {
       
    38         char ret = '?';
       
    39 
       
    40         // command state
       
    41         switch (state) {
       
    42             case START:
       
    43                 cmd = 0;
       
    44                 break;
       
    45 
       
    46             case CMD_SET:
       
    47                 break;
       
    48 
       
    49             case ARG_CHAR:
       
    50                 break;
       
    51 
       
    52             case ERROR:
       
    53                 cmd = 0;
       
    54                 break;
       
    55         }
       
    56 
       
    57         // command
       
    58         if (!cmd) {
       
    59             ret = ' ';
       
    60         } else if (command(cmd)) {
       
    61             ret = '!';
       
    62         } else {
       
    63             ret = '\n';
       
    64         }
       
    65         
       
    66         // return to START with response
       
    67         state = START;
       
    68         return ret;
       
    69 
       
    70     } else if (31 < c && c < 128) {
       
    71         // process input char
       
    72         switch (state) {
       
    73             case START:
       
    74                 if (c == 's') {
       
    75                     cmd = CMD_SET;
       
    76                     state = ARG_CHAR;
       
    77                     arg_char = 0;
       
    78                     return state;
       
    79 
       
    80                 } else if (c == 'S') {
       
    81                     cmd = state = CMD_SET;
       
    82                     arg_char = 255;
       
    83                     return state;
       
    84                 }
       
    85             break;
       
    86 
       
    87             /* 
       
    88             case CMD_SET:
       
    89                 if (c == '1') {
       
    90                     cmd_led = CMD_LED_1;
       
    91                     state = ARG_CHAR;
       
    92                     arg_char = 0;
       
    93                 } else {
       
    94                     state = ERROR;
       
    95                 }
       
    96 
       
    97                 break;
       
    98             */
       
    99             case ARG_CHAR:
       
   100                 if (c >= '0' && c <= '9') {
       
   101                     arg_char *= 10;
       
   102                     arg_char += (c - '0');
       
   103 
       
   104                     return c;
       
   105                 }
       
   106             break;
       
   107         }
       
   108 
       
   109         // reject
       
   110         state = ERROR;
       
   111         return ERROR;
       
   112 
       
   113     } else {
       
   114         // ignore
       
   115         return ' ';
       
   116     }
       
   117 }
       
   118 
     7 int main (void)
   119 int main (void)
     8 {
   120 {
     9     timer_init();
   121     timer_init();
    10     serial_init();
   122     serial_init();
    11 
   123 
    12     // LED
   124     // led_init();
    13     sbi(&DDRB, DDB5);
   125     sbi(&DDRB, DDB5);
    14 
   126 
    15     sei();
   127     sei();
    16 
   128 
    17     // blink
   129     // start
    18     char c = 'X';
   130     char c;
    19     short timeout = 8000;
   131     unsigned short timeout = 0;
    20     short delta = 10;
   132         
       
   133     serial_write(state);
    21 
   134 
    22     while (true) {
   135     while (true) {
    23         // toggle
   136         // toggle
    24         xbi(&PORTB, PORTB5);
   137         if (led_state == 0) {
       
   138             timeout = 0;
       
   139             cbi(&PORTB, PORTB5);
       
   140 
       
   141         } else if (led_state == 255) {
       
   142             timeout = 0;
       
   143             sbi(&PORTB, PORTB5);
       
   144 
       
   145         } else {
       
   146             // as Hz
       
   147             timeout = (16000 / led_state);
       
   148             xbi(&PORTB, PORTB5);
       
   149         }
    25         
   150         
    26         // sleep
   151         // sleep
    27         if (timer_sleep(timeout)) {
   152         if (timer_sleep(timeout)) {
    28             c = '.';
   153             c = '.';
    29 
   154 
    30         } else if ((c = serial_read())) {
   155         } else if ((c = serial_read())) {
    31             // got serial data
   156             // got serial data
       
   157             c = input(c);
       
   158 
    32         } else {
   159         } else {
    33             c = '?';
   160             c = '?';
    34         }
   161         }
    35         
   162         
    36         // output...
   163         // output...