|
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 } |