src/carboard.c
changeset 4 d0f29c45fe52
parent 3 87dd3b72b024
child 5 5c86d54080c1
equal deleted inserted replaced
3:87dd3b72b024 4:d0f29c45fe52
       
     1 #include <avr/interrupt.h>
       
     2 #include <avr/io.h>
       
     3 
       
     4 #include "stdlib.h"
       
     5 
       
     6 #define DEBUG_DDR DDRB
       
     7 #define DEBUG_PIN 5
       
     8 #define DEBUG_PORT PORTB
       
     9 
       
    10 /* Relay outputs */
       
    11 #define RELAY_DDR DDRC
       
    12 #define RELAY_PORT PORTC
       
    13 #define RELAY_PIN PINC
       
    14 #define RELAY_PINS 4
       
    15 
       
    16 #define RELAY_DOWN1 0
       
    17 #define RELAY_DOWN2 1
       
    18 #define RELAY_LEFT  2
       
    19 #define RELAY_RIGHT 3
       
    20 
       
    21 /* Switch inputs */
       
    22 static ioport_t *const SWITCH_DDR = &DDRD;
       
    23 static ioport_t *const SWITCH_PORT = &PORTD;
       
    24 static ioport_t *const SWITCH_PIN = &PIND;
       
    25 static ioport_t *const SWITCH_PCMSK = &PCMSK2;
       
    26 static const byte SWITCH_PCIE = PCIE2;
       
    27 static const byte SWITCH_PCIF = PCIF2;
       
    28 
       
    29 enum switch_bits {
       
    30     SWITCH_LEFT         = 0b00000100,
       
    31     SWITCH_RIGHT        = 0b00001000,
       
    32     SWITCH_HORN1        = 0b00010000,
       
    33     SWITCH_HORN2        = 0b00100000,
       
    34 
       
    35     SWITCH_MASK         = 0b00111100,
       
    36 };
       
    37 
       
    38 #include "debug.h"
       
    39 #include "relay.h"
       
    40 #include "serial.h"
       
    41 #include "switch.h"
       
    42 #include "timer.h"
       
    43 
       
    44 int main (void)
       
    45 {
       
    46     debug_init();
       
    47     relay_init(RELAY_PINS);
       
    48     serial_init(SERIAL_BAUD_9600, SERIAL_PARITY_N, SERIAL_STOPBITS_1);
       
    49     switch_init();
       
    50     timer_init();
       
    51 
       
    52     // init
       
    53     char c = '.';
       
    54     byte s;
       
    55     unsigned short timeout = 8000;
       
    56 
       
    57     debug_set();
       
    58     sei();
       
    59 
       
    60     // start
       
    61     while (true) {
       
    62         c = s = 0;
       
    63 
       
    64         if (timer_sleep(timeout)) {
       
    65             c = '.';
       
    66         } else if ((c = serial_read())) {
       
    67             switch (c) {
       
    68                 case 'L':       relay_open(RELAY_LEFT); break;
       
    69                 case 'R':       relay_open(RELAY_RIGHT); break;
       
    70                 case 'B':
       
    71                                 relay_open(RELAY_DOWN1);
       
    72                                 relay_open(RELAY_DOWN2);
       
    73                                 break;
       
    74 
       
    75                 case 'l':       relay_toggle(RELAY_LEFT); break;
       
    76                 case 'r':       relay_toggle(RELAY_RIGHT); break;
       
    77                 case 'b':
       
    78                                 relay_close(RELAY_DOWN1);
       
    79                                 relay_close(RELAY_DOWN2);
       
    80                                 break;
       
    81 
       
    82                 default:
       
    83                     c = '!';
       
    84                     break;
       
    85             }
       
    86         } else if (switch_read(&s)) {
       
    87             c = '*';
       
    88 
       
    89             if (s & SWITCH_LEFT)
       
    90                 c = 'l';
       
    91 
       
    92             if (s & SWITCH_RIGHT)
       
    93                 c = 'r';
       
    94 
       
    95             if (s & SWITCH_HORN1)
       
    96                 c = 'h';
       
    97 
       
    98             if (s & SWITCH_HORN2)
       
    99                 c = 'h';
       
   100 
       
   101         } else {
       
   102             // XXX: for some reason this occasionally gets stuck in an interrupt loop here after some switch events..
       
   103             c = '?';
       
   104         }
       
   105 
       
   106         // out
       
   107         debug_toggle();
       
   108 
       
   109         serial_write(c);
       
   110     }
       
   111 }