#include #include #include "adc.h" #include "led.h" #include "button.h" #include "main.h" /* Communication driver */ #define SLAVE_ENABLE_DDR DDRA #define SLAVE_ENABLE_REG PINA #define SLAVE_ENABLE_PIN 1 #include typedef struct { byte_t * buffer_start, * buffer_end; volatile byte_t * read; volatile byte_t * write; volatile byte_t count; iface_t iface; } comm_t; comm_t comm; void comm_write(iface_t * iface, byte_t byte) { if ((comm.write == comm.read) && comm.count) { // write overflow return; } *comm.write = byte; ++comm.count; // advance write pointer if ((++comm.write) >= comm.buffer_end) { comm.write = comm.buffer_start; } } inline byte_t comm_read() { if (!comm.count) return 0x00; byte_t result = *comm.read; --comm.count; if ((++comm.read) >= comm.buffer_end) { comm.read = comm.buffer_start; } return result; } byte_t comm_buffer[10]; void comm_init() { comm.buffer_start = comm_buffer; comm.buffer_end = comm_buffer + sizeof(comm_buffer); // reset buffer comm.write = comm.buffer_start; comm.read = comm.buffer_start; comm.count = 0; // TODO: setup pins DDRA |= (1< // little debug helper function // FIXME: remove when not needed void delay(uint16_t d) { while(d--) { _delay_ms(1); } } int main() { init(); while(1) { // nothing to do here, the application is interrupt-driven } }