diff --git a/src/main.c b/src/main.c index 9583566..e86517e 100644 --- a/src/main.c +++ b/src/main.c @@ -7,17 +7,16 @@ #endif #include "main.h" -#include #include +#include #include - -//############################# -//Globals -//############################# +// ############################# +// Globals +// ############################# /* This line isn't really quite right.*/ -//uint8_t saved_position EEMEM; // EEPROM storage for fader position +// uint8_t saved_position EEMEM; // EEPROM storage for fader position btn_state btn1; @@ -28,16 +27,9 @@ volatile uint8_t idx; volatile uint16_t tick_count; -//############################# -//Prototypes -//############################# - -void led_blink(void); - -uint16_t readADC(void); -void motorCoast(void); -void motorMove(int direction); -uint8_t readButton(void); +// ############################# +// Prototypes +// ############################# static void InitBtn(btn_state *b, uint8_t input_pin, uint8_t output_pin); @@ -48,230 +40,209 @@ static void CheckButtonLongpress(btn_state *b); static void UpdateButtonInput(btn_state *b); static void UpdateButtonOutput(btn_state *b); +// ############################# +// MAIN +// ############################# +int main(int argc, char **argv) { + InitProg(); + uint16_t fader_pos = ReadADC() >> 2; // Scale 10-bit ADC to 8-bit (0-255) -//############################# -//MAIN -//############################# - -int main(int argc, char **argv) -{ - InitProg(); - - uint16_t fader_pos = ReadADC() >> 2; // Scale 10-bit ADC to 8-bit (0-255) - - while(1) - { - fader_pos = ReadADC() >> 2; - - /* - UpdateButtonOutput(&btn1); - UpdateButtonInput(&btn1); - */ - } - + while (1) { + fader_pos = ReadADC() >> 2; /* - while(1) { - uint16_t fader_pos = readADC() >> 2; // Scale 10-bit ADC to 8-bit (0-255) - uint8_t buttonState = readButton(); - - if (buttonState == 2) { // Long press - Save position - eeprom_update_byte(&saved_position, fader_pos); - } - else if (buttonState == 1) { // Short press - Move to saved position - uint8_t target_pos = eeprom_read_byte(&saved_position); - if (fader_pos < target_pos - 2) motorMove(1); // Move up - else if (fader_pos > target_pos + 2) motorMove(-1); // Move down - else motorCoast(); // Stop when reached position - } - else { - motorCoast(); // Default to coast mode - } - - led_blink(); - - } + UpdateButtonOutput(&btn1); + UpdateButtonInput(&btn1); */ + } - return 0; + /* + while(1) { + uint16_t fader_pos = readADC() >> 2; // Scale 10-bit ADC to 8-bit (0-255) + uint8_t buttonState = readButton(); + + if (buttonState == 2) { // Long press - Save position + eeprom_update_byte(&saved_position, fader_pos); + } + else if (buttonState == 1) { // Short press - Move to saved position + uint8_t target_pos = eeprom_read_byte(&saved_position); + if (fader_pos < target_pos - 2) motorMove(1); // Move up + else if (fader_pos > target_pos + 2) motorMove(-1); // Move down + else motorCoast(); // Stop when reached position + } + else { + motorCoast(); // Default to coast mode + } + + led_blink(); + + } + */ + + return 0; } +// ############################# +// FUNCTIONS +// ############################# -//############################# -//FUNCTIONS -//############################# +void InitProg(void) { + /*Set the debounced state to all high*/ + debounced_state = 0xFF; + init_btn(&btn1, PIN_SW1, PIN_ACTIVE1); -void InitProg(void) -{ - /*Set the debounced state to all high*/ - debounced_state = 0xFF; + /*Wait 5ms for pull-up resistors voltage to become stable.*/ + _delay_ms(5); - init_btn(&btn1, PIN_SW1, PIN_ACTIVE1); + /*check if the eeprom has info. */ + while (!eeprom_is_ready()) { + } // Blocks until eeprom is ready. - /*Wait 5ms for pull-up resistors voltage to become stable.*/ - _delay_ms(5); + // Checks against a bit pattern we defined to represent the start of data. + if (eeprom_read_byte((uint8_t *)ROM_SP_ADR) == START_PATTERN) { + // Reads the two bytes representing the two states. + btn1.is_active = eeprom_read_byte((uint8_t *)ROM_SS1_ADR); + } else { + // otherwise we write the init values for the start pattern and states. + eeprom_write_byte((uint8_t *)ROM_SP_ADR, START_PATTERN); + eeprom_write_byte((uint8_t *)ROM_SS1_ADR, 0x0); + } - /*check if the eeprom has info. */ - while(! eeprom_is_ready()) {} //Blocks until eeprom is ready. + btn1.is_pressed = ((PINB & (1 << btn1.input_pin)) == 0); - //Checks against a bit pattern we defined to represent the start of data. - if(eeprom_read_byte((uint8_t *)ROM_SP_ADR) == START_PATTERN) { - //Reads the two bytes representing the two states. - btn1.is_active = eeprom_read_byte((uint8_t *)ROM_SS1_ADR); - } - else { - //otherwise we write the init values for the start pattern and states. - eeprom_write_byte((uint8_t *)ROM_SP_ADR, START_PATTERN); - eeprom_write_byte((uint8_t *)ROM_SS1_ADR, 0x0); - } - - btn1.is_pressed = ((PINB & (1<is_long_pressed = 0; - b->is_pressed = 0; - b->is_bypassed = 0; - b->pressed_ticks = 0; - b->timer_enabled = 0; - b->input_pin = input_pin; - b->output_pin = output_pin; +static void InitBtn(btn_state *b, uint8_t input_pin, uint8_t output_pin) { + b->is_long_pressed = 0; + b->is_pressed = 0; + b->is_bypassed = 0; + b->pressed_ticks = 0; + b->timer_enabled = 0; + b->input_pin = input_pin; + b->output_pin = output_pin; - /*Configure the buttons inputs and outputs*/ - DDRB &= ~(1<input_pin); - PORTB |= (1<input_pin); - - DDRB |= (1<output_pin); - PORTB &= ~(1<output_pin); + /*Configure the buttons inputs and outputs*/ + DDRB &= ~(1 << b->input_pin); + PORTB |= (1 << b->input_pin); + + DDRB |= (1 << b->output_pin); + PORTB &= ~(1 << b->output_pin); } /*This is the fancy function to toggle output pins*/ -static void ToggleOutput(btn_state *b) -{ - if(!b->is_bypassed){ - b->is_bypassed = 1; - PORTB |= (1<output_pin); - } - else{ - b->is_bypassed = 0; - PORTB &= ~(1<output_pin); - } +static void ToggleOutput(btn_state *b) { + if (!b->is_bypassed) { + b->is_bypassed = 1; + PORTB |= (1 << b->output_pin); + } else { + b->is_bypassed = 0; + PORTB &= ~(1 << b->output_pin); + } } -static void ClearButtonTimer(btn_state *b) -{ +static void ClearButtonTimer(btn_state *b) { + b->timer_enabled = 0; + b->is_long_pressed = 0; + b->pressed_ticks = 0; +} + +static void StartButtonTimer(btn_state *b) { + ClearButtonTimer(b); + b->timer_enabled = 1; +} + +static void CheckButtonLongpress(btn_state *b) { + if (b->pressed_ticks >= LONG_PRESS_TICKS) { + b->is_long_pressed = 1; b->timer_enabled = 0; - b->is_long_pressed = 0; - b->pressed_ticks = 0; + } } -static void StartButtonTimer(btn_state *b) -{ +static void UpdateButtonInput(btn_state *b) { + /*Check from the global debounced port input*/ + + /*check for pin HIGH*/ + if (debounced_state & (1 << b->input_pin)) { + b->is_pressed = 0; + } + /*otherwise assume pin LOW*/ + else { + b->is_pressed = 1; + } +} + +static void UpdateButtonOutput(btn_state *b) { + /*If the button is actually pressed.*/ + if (b->is_pressed) { + + /*If this is a new event.*/ + if (!b->is_long_pressed && !b->timer_enabled) { + /*Then start the timer and update the output*/ + ToggleOutput(b); + StartButtonTimer(b); + return; + } + + /*If the timer is already going.*/ + else if (b->timer_enabled) { + /*Then just check if it's hit the threshold.*/ + CheckButtonLongpress(b); + return; + } + + else { + return; + } + } + + /*Else the button was realeased*/ + else if (!b->is_pressed) { + /*If the button was released on a long press.*/ + if (b->is_long_pressed) { + ToggleOutput(b); + } ClearButtonTimer(b); - b->timer_enabled = 1; + } } -static void CheckButtonLongpress(btn_state *b) -{ - if(b->pressed_ticks >= LONG_PRESS_TICKS) { - b->is_long_pressed = 1; - b->timer_enabled = 0; - } -} - -static void UpdateButtonInput(btn_state *b) -{ - /*Check from the global debounced port input*/ - - /*check for pin HIGH*/ - if(debounced_state & (1<input_pin)) { - b->is_pressed = 0; - } - /*otherwise assume pin LOW*/ - else{ - b->is_pressed = 1; - } -} - -static void UpdateButtonOutput(btn_state *b) -{ - /*If the button is actually pressed.*/ - if(b->is_pressed){ - - /*If this is a new event.*/ - if(!b->is_long_pressed && !b->timer_enabled){ - /*Then start the timer and update the output*/ - ToggleOutput(b); - StartButtonTimer(b); - return; - } - - /*If the timer is already going.*/ - else if(b->timer_enabled){ - /*Then just check if it's hit the threshold.*/ - CheckButtonLongpress(b); - return; - } - - else{ - return; - } - } - - /*Else the button was realeased*/ - else if(!b->is_pressed){ - /*If the button was released on a long press.*/ - if(b->is_long_pressed){ - ToggleOutput(b); - } - ClearButtonTimer(b); - } -} - - /* * ############################ - * DEBOUNCING CODE + * DEBOUNCING CODE * ############################ - */ + */ /* * INPUT: The port to check. @@ -279,65 +250,58 @@ static void UpdateButtonOutput(btn_state *b) * DESCRIPTION: Updates the global debounced state. This function * should be called in a ISR a set rate using the hardware timer. */ -static inline void DebounceSwitch() -{ - uint8_t i, j; - db_state[idx] = PINB & 0xFF; - idx+=1; - j = 0xff; - /*Loop through a number of checks*/ - for(i = 0; i < MAX_CHECKS; i++) { - j = j & db_state[i]; - } - debounced_state = j; +static inline void DebounceSwitch() { + uint8_t i, j; + db_state[idx] = PINB & 0xFF; + idx += 1; + j = 0xff; + /*Loop through a number of checks*/ + for (i = 0; i < MAX_CHECKS; i++) { + j = j & db_state[i]; + } + debounced_state = j; - if(idx >= MAX_CHECKS) { - idx = 0; - } + if (idx >= MAX_CHECKS) { + idx = 0; + } } - - /*Setup the timer0 on the AVR*/ -static inline void InitTimer0() -{ - /*Zero out the tick_count var*/ - tick_count = 0; +static inline void InitTimer0() { + /*Zero out the tick_count var*/ + tick_count = 0; - /*config to normal mode.*/ - TCCR0A = 0x00; //stop timer - TCCR0B = 0x00; //zero timer + /*config to normal mode.*/ + TCCR0A = 0x00; // stop timer + TCCR0B = 0x00; // zero timer - /*set prescaler*/ - //Set to div64 - TCCR0B |= (1<