terom@0: #include terom@0: #include terom@0: terom@3: #include "stdlib.h" terom@3: terom@0: #define DEBUG_DDR DDRB terom@0: #define DEBUG_PIN 5 terom@0: #define DEBUG_PORT PORTB terom@0: terom@3: /* Relay outputs */ terom@2: #define RELAY_DDR DDRC terom@2: #define RELAY_PORT PORTC terom@2: #define RELAY_PIN PINC terom@2: #define RELAY_PINS 4 terom@2: terom@2: #define RELAY_DOWN1 0 terom@2: #define RELAY_DOWN2 1 terom@2: #define RELAY_LEFT 2 terom@2: #define RELAY_RIGHT 3 terom@2: terom@3: /* Switch inputs */ terom@3: static ioport_t *const SWITCH_DDR = &DDRD; terom@3: static ioport_t *const SWITCH_PORT = &PORTD; terom@3: static ioport_t *const SWITCH_PIN = &PIND; terom@3: static ioport_t *const SWITCH_PCMSK = &PCMSK2; terom@3: static const byte SWITCH_PCIE = PCIE2; terom@3: static const byte SWITCH_PCIF = PCIF2; terom@3: terom@3: enum switch_bits { terom@3: SWITCH_LEFT = 0b00000100, terom@3: SWITCH_RIGHT = 0b00001000, terom@3: SWITCH_HORN1 = 0b00010000, terom@3: SWITCH_HORN2 = 0b00100000, terom@3: terom@3: SWITCH_MASK = 0b00111100, terom@3: }; terom@3: terom@5: #include "adxl345.h" terom@0: #include "debug.h" terom@2: #include "relay.h" terom@1: #include "serial.h" terom@5: #include "spi.h" terom@3: #include "switch.h" terom@0: #include "timer.h" terom@0: terom@0: int main (void) terom@0: { terom@5: adxl345_init(); terom@0: debug_init(); terom@2: relay_init(RELAY_PINS); terom@1: serial_init(SERIAL_BAUD_9600, SERIAL_PARITY_N, SERIAL_STOPBITS_1); terom@5: spi_init(); terom@3: switch_init(); terom@0: timer_init(); terom@0: terom@0: // init terom@5: unsigned char c = '.'; terom@3: byte s; terom@1: unsigned short timeout = 8000; terom@5: int16_t adxl; terom@1: terom@0: debug_set(); terom@0: sei(); terom@0: terom@5: adxl345_setup(); terom@5: terom@0: // start terom@0: while (true) { terom@3: c = s = 0; terom@5: adxl = 0; terom@3: terom@1: if (timer_sleep(timeout)) { terom@5: c = 0; terom@1: } else if ((c = serial_read())) { terom@3: switch (c) { terom@3: case 'L': relay_open(RELAY_LEFT); break; terom@3: case 'R': relay_open(RELAY_RIGHT); break; terom@3: case 'B': terom@3: relay_open(RELAY_DOWN1); terom@3: relay_open(RELAY_DOWN2); terom@3: break; terom@3: terom@3: case 'l': relay_toggle(RELAY_LEFT); break; terom@3: case 'r': relay_toggle(RELAY_RIGHT); break; terom@3: case 'b': terom@3: relay_close(RELAY_DOWN1); terom@3: relay_close(RELAY_DOWN2); terom@3: break; terom@3: terom@5: case 'd': c = adxl345_read_devid(); break; terom@5: case 'x': adxl = adxl345_read_x(); break; terom@5: case 'y': adxl = adxl345_read_y(); break; terom@5: case 'z': adxl = adxl345_read_z(); break; terom@5: terom@3: default: terom@3: c = '!'; terom@3: break; terom@3: } terom@3: } else if (switch_read(&s)) { terom@3: c = '*'; terom@3: terom@3: if (s & SWITCH_LEFT) terom@3: c = 'l'; terom@3: terom@3: if (s & SWITCH_RIGHT) terom@3: c = 'r'; terom@3: terom@3: if (s & SWITCH_HORN1) terom@3: c = 'h'; terom@3: terom@3: if (s & SWITCH_HORN2) terom@3: c = 'h'; terom@1: terom@1: } else { terom@3: // XXX: for some reason this occasionally gets stuck in an interrupt loop here after some switch events.. terom@1: c = '?'; terom@1: } terom@1: terom@3: // out terom@0: debug_toggle(); terom@1: terom@5: if (c == 'x' || c == 'y' || c == 'z') { terom@5: int8_t v = adxl / 255; terom@5: terom@5: /* terom@5: if (adxl > 0) terom@5: serial_write('+'); terom@5: else if (adxl < 0) terom@5: serial_write('-'); terom@5: else terom@5: serial_write(' '); terom@5: */ terom@5: serial_write(v); terom@5: } else if (c) { terom@5: serial_write(c); terom@5: } terom@0: } terom@0: }