diff --git a/firmware/slider/CMakeLists.txt b/firmware/slider/CMakeLists.txt index c59228a..caade73 100644 --- a/firmware/slider/CMakeLists.txt +++ b/firmware/slider/CMakeLists.txt @@ -7,5 +7,5 @@ project(slider_firmware C) add_subdirectory(SliderCommunication) -add_avr_executable(slider_firmware led.c main.c adc.c ) +add_avr_executable(slider_firmware led.c main.c adc.c button.c) target_link_libraries(slider_firmware DSPLAB_SliderCommunication) diff --git a/firmware/slider/SliderCommunication b/firmware/slider/SliderCommunication index 36d759d..3141a62 160000 --- a/firmware/slider/SliderCommunication +++ b/firmware/slider/SliderCommunication @@ -1 +1 @@ -Subproject commit 36d759d94c6fa9166de35624989858811a73861f +Subproject commit 3141a62e62012dee60192e6ad1c95ee5b63fc8ce diff --git a/firmware/slider/adc.c b/firmware/slider/adc.c index 2d420b3..0f108dc 100644 --- a/firmware/slider/adc.c +++ b/firmware/slider/adc.c @@ -6,11 +6,11 @@ */ #include "adc.h" +#include "main.h" + #include #include -#include "led.h" - // global adc instance volatile adc_t adc; @@ -21,8 +21,12 @@ static inline void adc_next() { if (!adc.current_channel) { adc.current_sample = adc.buffer.ptr-1; - if (adc.interrupt) - adc.interrupt(&adc.buffer); + // update app state (remap channels) + app.state.state.slider = adc.buffer.ptr[4]; + app.state.state.poti[0] = adc.buffer.ptr[3]; + app.state.state.poti[1] = adc.buffer.ptr[2]; + app.state.state.poti[2] = adc.buffer.ptr[0]; + app.state.state.poti[3] = adc.buffer.ptr[1]; } } while(!(adc.channel_mask & (1< + +void button_init() +{ + led_init(); + + // enable pullup on button pin + BUTTON_DDR &= ~(1< 0; +} + +ISR(PCINT1_vect) { + if(!(BUTTON_REG&(1< + +/* button driver */ +#define BUTTON_DDR DDRB +#define BUTTON_PORT PORTB +#define BUTTON_REG PINB +#define BUTTON_PIN 1 + +typedef enum { + BUTTON_RELEASED = 0, + BUTTON_PRESSED = 1 +} button_state_t; + +void button_init(); +button_state_t button_is_pressed(); + + +#endif // BUTTON_H_ \ No newline at end of file diff --git a/firmware/slider/main.c b/firmware/slider/main.c index d91a3da..ef07a18 100644 --- a/firmware/slider/main.c +++ b/firmware/slider/main.c @@ -2,36 +2,8 @@ #include #include "adc.h" #include "led.h" - - -/* button driver */ -// TODO: make interrupt driven -#define BUTTON_DDR DDRB -#define BUTTON_PORT PORTB -#define BUTTON_REG PINB -#define BUTTON_PIN 1 - -enum { - BUTTON_RELEASED, - BUTTON_PRESSED -} button_state; - -void button_init() { - led_init(); - - BUTTON_DDR &= ~(1< +typedef struct { + iface_t iface; +} comm_t; + +comm_t comm; void comm_write(iface_t * iface, byte_t byte) { - // disable interrupt + // disable interrupt (temporarily) uint8_t temp = USICR; USICR &= ~(1< - void on_read(iface_t * sender, byte_t b) { if (!IS_EOM(b)) { sender->write(sender, b); @@ -98,56 +65,55 @@ void on_read(iface_t * sender, byte_t b) { sender->write(sender, b&0x7F); } -struct { - volatile message_t buffer; - adc_sample_t adc_buffer[5]; -} app = {}; +#include "main.h" +// the public instance of the app buffer +struct app app = {}; -ISR(PCINT1_vect) { - if(BUTTON_REG&(1<ptr[4]; - - app.buffer.poti[0] = buf->ptr[3]; - app.buffer.poti[1] = buf->ptr[2]; - app.buffer.poti[2] = buf->ptr[0]; - app.buffer.poti[3] = buf->ptr[1]; -} - int main() { init(); - adc_on_done(adc_int); - // start relevant perephials + // start relevant periphials adc_start(); while(1) { - delay(app.buffer.poti[0]>>4); + // nothing to do here, the application is interrupt-driven } } diff --git a/firmware/slider/main.h b/firmware/slider/main.h new file mode 100644 index 0000000..143a2a5 --- /dev/null +++ b/firmware/slider/main.h @@ -0,0 +1,16 @@ + +#ifndef APP_H__ +#define APP_H__ + +#include +#include "adc.h" +#include + +struct app { + slave_t state; + adc_sample_t adc_buffer[5]; +}; + +extern struct app app; + +#endif \ No newline at end of file