Added long press for on/off
This commit is contained in:
parent
2c6865643e
commit
9312665dfa
@ -12,6 +12,10 @@
|
|||||||
// Port A7 -> Enable Output
|
// Port A7 -> Enable Output
|
||||||
// Port B2 -> Button Input (Pulled-Up)
|
// Port B2 -> Button Input (Pulled-Up)
|
||||||
|
|
||||||
|
// Button Press Times
|
||||||
|
#define BTN_LONG_PRESS_MS 1000
|
||||||
|
#define BTN_DEBOUNCE_MS 50
|
||||||
|
|
||||||
// Size of each strip
|
// Size of each strip
|
||||||
#define LED0_COUNT 12
|
#define LED0_COUNT 12
|
||||||
#define LED1_COUNT 12
|
#define LED1_COUNT 12
|
||||||
@ -87,6 +91,9 @@ void show_leds();
|
|||||||
// Hardware Init
|
// Hardware Init
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
|
// Function to switch states
|
||||||
|
void state_switch(uint8_t is_onoff);
|
||||||
|
|
||||||
#ifdef ENABLE_OLED
|
#ifdef ENABLE_OLED
|
||||||
// I2C Display Funcs
|
// I2C Display Funcs
|
||||||
void init_display();
|
void init_display();
|
||||||
@ -103,7 +110,7 @@ void clock_no_bg(uint8_t count, uint8_t* idx, uint8_t colour, uint8_t led);
|
|||||||
void loading(uint8_t count, uint8_t* idx, uint8_t colour, uint8_t led);
|
void loading(uint8_t count, uint8_t* idx, uint8_t colour, uint8_t led);
|
||||||
void off(uint8_t count, uint8_t* idx, uint8_t colour, uint8_t led);
|
void off(uint8_t count, uint8_t* idx, uint8_t colour, uint8_t led);
|
||||||
|
|
||||||
void (*func_list[5])(uint8_t, uint8_t*, uint8_t, uint8_t) =
|
void (*func_list[4])(uint8_t, uint8_t*, uint8_t, uint8_t) =
|
||||||
{
|
{
|
||||||
sun_and_moon, clock_no_bg, loading, off
|
sun_and_moon, clock_no_bg, loading, off
|
||||||
};
|
};
|
||||||
@ -119,8 +126,7 @@ enum states
|
|||||||
STATE_CLOCK_NO1,
|
STATE_CLOCK_NO1,
|
||||||
STATE_CLOCK_NO2,
|
STATE_CLOCK_NO2,
|
||||||
STATE_LOADING,
|
STATE_LOADING,
|
||||||
STATE_PC,
|
STATE_PC
|
||||||
STATE_OFF
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t led0_idx = 0;
|
uint8_t led0_idx = 0;
|
||||||
@ -129,9 +135,11 @@ uint8_t led2_idx = 0;
|
|||||||
uint8_t led3_idx = 0;
|
uint8_t led3_idx = 0;
|
||||||
uint8_t colour = 0;
|
uint8_t colour = 0;
|
||||||
uint8_t func_idx = 0;
|
uint8_t func_idx = 0;
|
||||||
|
uint8_t backup_func_idx = sizeof(func_list) / sizeof(func_list[0]) - 1;
|
||||||
uint8_t btn_old_state = 0;
|
uint8_t btn_old_state = 0;
|
||||||
uint8_t colour_state = STATE_SUN_MOON;
|
uint8_t colour_state = STATE_SUN_MOON;
|
||||||
uint8_t current_state;
|
uint8_t current_state;
|
||||||
|
uint64_t btn_down = -1;
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
@ -188,47 +196,26 @@ while(1)
|
|||||||
current_state = PINB & 0x04;
|
current_state = PINB & 0x04;
|
||||||
if (btn_old_state && !current_state)
|
if (btn_old_state && !current_state)
|
||||||
{
|
{
|
||||||
switch (colour_state)
|
btn_down = ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Button Unpress
|
||||||
|
if (!btn_old_state && current_state)
|
||||||
|
{
|
||||||
|
if (ms - BTN_DEBOUNCE_MS >= btn_down)
|
||||||
{
|
{
|
||||||
case STATE_SUN_MOON:
|
btn_down = -1;
|
||||||
func_idx = 1;
|
state_switch(0);
|
||||||
colour_state = STATE_CLOCK_NO1;
|
|
||||||
colour = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_CLOCK_NO1:
|
|
||||||
colour_state = STATE_CLOCK_NO2;
|
|
||||||
colour = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_CLOCK_NO2:
|
|
||||||
func_idx = 2;
|
|
||||||
colour_state = STATE_LOADING;
|
|
||||||
colour = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_LOADING:
|
|
||||||
func_idx = 3;
|
|
||||||
PORTA ^= 0x20;
|
|
||||||
colour_state = STATE_PC;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_PC:
|
|
||||||
PORTA ^= 0x20;
|
|
||||||
colour_state = STATE_OFF;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_OFF:
|
|
||||||
func_idx = 0;
|
|
||||||
colour_state = STATE_SUN_MOON;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
led0_idx = 0;
|
|
||||||
led1_idx = 0;
|
|
||||||
led2_idx = 0;
|
|
||||||
led3_idx = 0;
|
|
||||||
}
|
}
|
||||||
btn_old_state = current_state;
|
btn_old_state = current_state;
|
||||||
|
|
||||||
|
// Long Press Time Has Passed
|
||||||
|
if (ms - BTN_LONG_PRESS_MS >= btn_down)
|
||||||
|
{
|
||||||
|
btn_down = -1;
|
||||||
|
state_switch(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,6 +438,55 @@ void init()
|
|||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void state_switch(uint8_t is_onoff)
|
||||||
|
{
|
||||||
|
uint8_t tmp_func_idx;
|
||||||
|
|
||||||
|
if (is_onoff == 0)
|
||||||
|
{
|
||||||
|
switch (colour_state)
|
||||||
|
{
|
||||||
|
case STATE_SUN_MOON:
|
||||||
|
func_idx = 1;
|
||||||
|
colour_state = STATE_CLOCK_NO1;
|
||||||
|
colour = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_CLOCK_NO1:
|
||||||
|
colour_state = STATE_CLOCK_NO2;
|
||||||
|
colour = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_CLOCK_NO2:
|
||||||
|
func_idx = 2;
|
||||||
|
colour_state = STATE_LOADING;
|
||||||
|
colour = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_LOADING:
|
||||||
|
func_idx = 0;
|
||||||
|
PORTA ^= 0x20;
|
||||||
|
colour_state = STATE_PC;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_PC:
|
||||||
|
PORTA ^= 0x20;
|
||||||
|
colour_state = STATE_SUN_MOON;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp_func_idx = backup_func_idx;
|
||||||
|
backup_func_idx = func_idx;
|
||||||
|
func_idx = tmp_func_idx;
|
||||||
|
}
|
||||||
|
led0_idx = 0;
|
||||||
|
led1_idx = 0;
|
||||||
|
led2_idx = 0;
|
||||||
|
led3_idx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void sun_and_moon(uint8_t count, uint8_t* idx, uint8_t colour, uint8_t led)
|
void sun_and_moon(uint8_t count, uint8_t* idx, uint8_t colour, uint8_t led)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user