Fixed most functionality
This commit is contained in:
parent
b5cfd4d4ce
commit
19d0ddfb91
1
TODO
1
TODO
@ -1 +1,2 @@
|
|||||||
|
Fix EEPROM detection (and maybe read / write)
|
||||||
Battery icon - how to calc percentage?
|
Battery icon - how to calc percentage?
|
||||||
|
|||||||
93
code/main.c
93
code/main.c
@ -49,7 +49,7 @@
|
|||||||
#define OLED_BATTERY_ICON_PERCENT 5
|
#define OLED_BATTERY_ICON_PERCENT 5
|
||||||
|
|
||||||
// Time(ms) to keep the display on before sleep
|
// Time(ms) to keep the display on before sleep
|
||||||
#define DISPLAY_DELAY 3000
|
#define DISPLAY_DELAY 10000
|
||||||
|
|
||||||
// Time(ms) to assume long button press
|
// Time(ms) to assume long button press
|
||||||
#define LONG_PRESS 500
|
#define LONG_PRESS 500
|
||||||
@ -226,10 +226,10 @@ const uint8_t PROGMEM symbols[31 * CHAR_SIZE] =
|
|||||||
|
|
||||||
const char PROGMEM menu_strings[(MENU_COUNT + 1) * MENU_STRLEN] =
|
const char PROGMEM menu_strings[(MENU_COUNT + 1) * MENU_STRLEN] =
|
||||||
{
|
{
|
||||||
CHAR_A, CHAR_t, CHAR_t, CHAR_a, CHAR_c, CHAR_h, 0xFF, 0xFF,
|
0xFF, CHAR_A, CHAR_t, CHAR_t, CHAR_a, CHAR_c, CHAR_h, 0xFF,
|
||||||
CHAR_A, CHAR_d, CHAR_j, CHAR_u, CHAR_s, CHAR_t, 0xFF, 0xFF,
|
0xFF, CHAR_A, CHAR_d, CHAR_j, CHAR_u, CHAR_s, CHAR_t, 0xFF,
|
||||||
CHAR_B, CHAR_a, CHAR_t, CHAR_t, CHAR_e, CHAR_r, CHAR_y, 0xFF,
|
0xFF, CHAR_B, CHAR_a, CHAR_t, CHAR_t, CHAR_e, CHAR_r, CHAR_y,
|
||||||
CHAR_D, CHAR_e, CHAR_t, CHAR_a, CHAR_c, CHAR_h, 0xFF, 0xFF
|
0xFF, CHAR_D, CHAR_e, CHAR_t, CHAR_a, CHAR_c, CHAR_h, 0xFF
|
||||||
};
|
};
|
||||||
|
|
||||||
// 1 / (4 * ROT_PULSE_COUNT) * (2 * pi * ROT_WHEEL_RAD)
|
// 1 / (4 * ROT_PULSE_COUNT) * (2 * pi * ROT_WHEEL_RAD)
|
||||||
@ -372,7 +372,7 @@ void set_adjust_spool();
|
|||||||
void set_battery_state();
|
void set_battery_state();
|
||||||
|
|
||||||
// Updates the ms counter
|
// Updates the ms counter
|
||||||
ISR(TIM1_OVF_vect)
|
ISR(TIM1_CAPT_vect)
|
||||||
{
|
{
|
||||||
cli();
|
cli();
|
||||||
ms += 10;
|
ms += 10;
|
||||||
@ -425,11 +425,6 @@ ISR(PCINT0_vect)
|
|||||||
case 0x23:
|
case 0x23:
|
||||||
btn_state = BTN_DOWN14;
|
btn_state = BTN_DOWN14;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// This should never happen -> Button is broken
|
|
||||||
default:
|
|
||||||
btn_state = btn_state_current;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
btn_idx = btn_state_current * 6 + btn_state;
|
btn_idx = btn_state_current * 6 + btn_state;
|
||||||
@ -467,6 +462,14 @@ ISR(PCINT0_vect)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Actually put the event in the queue
|
||||||
|
if (btn_event != EVENT_NONE)
|
||||||
|
{
|
||||||
|
*event_write = btn_event;
|
||||||
|
++event_count;
|
||||||
|
PTR_INC(event_write);
|
||||||
|
}
|
||||||
|
|
||||||
old_btn_pin_state = btn_pin_state;
|
old_btn_pin_state = btn_pin_state;
|
||||||
btn_state_current = btn_state;
|
btn_state_current = btn_state;
|
||||||
if ((btn_state != BTN_UP5) && (btn_state != BTN_DOWN5))
|
if ((btn_state != BTN_UP5) && (btn_state != BTN_DOWN5))
|
||||||
@ -557,6 +560,12 @@ int main()
|
|||||||
|
|
||||||
void simple_init()
|
void simple_init()
|
||||||
{
|
{
|
||||||
|
// Pull-ups on button
|
||||||
|
PORTA = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 5);
|
||||||
|
|
||||||
|
// Pull-ups on rotary encoder
|
||||||
|
PORTB = (1 << 0) | (1 << 1);
|
||||||
|
|
||||||
// No Prescaler - 1 MHz
|
// No Prescaler - 1 MHz
|
||||||
// Set Mode to CTC with ICR1
|
// Set Mode to CTC with ICR1
|
||||||
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);
|
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);
|
||||||
@ -565,8 +574,8 @@ void simple_init()
|
|||||||
// Interrupt every 10ms
|
// Interrupt every 10ms
|
||||||
ICR1 = 10000;
|
ICR1 = 10000;
|
||||||
|
|
||||||
// Enable Interrupt on overflow
|
// Enable Interrupt on capture
|
||||||
TIMSK1 = (1 << TOIE1);
|
TIMSK1 = (1 << ICIE1);
|
||||||
|
|
||||||
// Interrupt on Up/Down/Click pins
|
// Interrupt on Up/Down/Click pins
|
||||||
PCMSK0 = (1 << PCINT0) | (1 << PCINT1) | (1 << PCINT2) | (1 << PCINT3) | (1 << PCINT5);
|
PCMSK0 = (1 << PCINT0) | (1 << PCINT1) | (1 << PCINT2) | (1 << PCINT3) | (1 << PCINT5);
|
||||||
@ -637,6 +646,7 @@ void display_set_area(uint8_t start_x, uint8_t end_x, uint8_t start_y, uint8_t e
|
|||||||
};
|
};
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (start_x >= OLED_X_SIZE)
|
if (start_x >= OLED_X_SIZE)
|
||||||
{
|
{
|
||||||
start_x = OLED_X_SIZE - 1;
|
start_x = OLED_X_SIZE - 1;
|
||||||
@ -666,7 +676,7 @@ void display_set_area(uint8_t start_x, uint8_t end_x, uint8_t start_y, uint8_t e
|
|||||||
{
|
{
|
||||||
end_y = start_y;
|
end_y = start_y;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
cmd_list[1] = start_x;
|
cmd_list[1] = start_x;
|
||||||
cmd_list[2] = end_x;
|
cmd_list[2] = end_x;
|
||||||
cmd_list[4] = start_y;
|
cmd_list[4] = start_y;
|
||||||
@ -941,9 +951,10 @@ void print_clear_menu_area()
|
|||||||
void print_menu(uint8_t force_draw)
|
void print_menu(uint8_t force_draw)
|
||||||
{
|
{
|
||||||
static uint8_t old_option = 0xFF;
|
static uint8_t old_option = 0xFF;
|
||||||
|
static uint8_t old_spool = 0;
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
if (force_draw || (old_option != menu_option))
|
if (force_draw || (old_option != menu_option) || (old_option == 0 && (old_spool != spool_attached)))
|
||||||
{
|
{
|
||||||
for (i = 0; i < MENU_COUNT; ++i)
|
for (i = 0; i < MENU_COUNT; ++i)
|
||||||
{
|
{
|
||||||
@ -953,19 +964,22 @@ void print_menu(uint8_t force_draw)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
old_option = menu_option;
|
||||||
|
old_spool = spool_attached;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_option(uint8_t option)
|
void print_option(uint8_t option)
|
||||||
{
|
{
|
||||||
uint8_t invert = 0;
|
uint8_t select = 0xFF;
|
||||||
uint8_t x = 0;
|
uint8_t x = (CHAR_SIZE + 1) * 2;
|
||||||
uint8_t y = 1 + option;
|
uint8_t y = 1 + option;
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
// Whether to invert or not
|
// Whether to invert or not
|
||||||
if (option == menu_option)
|
if (option == menu_option)
|
||||||
{
|
{
|
||||||
invert = 1;
|
select = CHAR_gt;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Whether to display "Attach" or "Detach"
|
// Whether to display "Attach" or "Detach"
|
||||||
@ -974,16 +988,29 @@ void print_option(uint8_t option)
|
|||||||
option += MENU_COUNT;
|
option += MENU_COUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MENU_STRLEN; ++i)
|
print_symbol(select, 0, y ,0);
|
||||||
|
|
||||||
|
for (i = 1; i < MENU_STRLEN; ++i)
|
||||||
{
|
{
|
||||||
// Get the symbol index from the menu_strings
|
// Get the symbol index from the menu_strings
|
||||||
print_symbol(pgm_read_byte(&(menu_strings[option * MENU_STRLEN + i])), x, y, invert);
|
print_symbol(pgm_read_byte(&(menu_strings[option * MENU_STRLEN + i])), x, y, 0);
|
||||||
x += (CHAR_SIZE + 1) * 2;
|
x += (CHAR_SIZE + 1) * 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_battery_icon()
|
void print_battery_icon()
|
||||||
{
|
{
|
||||||
|
#if 1
|
||||||
|
uint32_t idx = (uint32_t) eeprom_idx;
|
||||||
|
|
||||||
|
if (eeprom_idx >= 0)
|
||||||
|
{
|
||||||
|
print_symbol(extract_digit(idx, 2), OLED_X_SIZE - (CHAR_SIZE + 1) * 2, 1, 0);
|
||||||
|
print_symbol(extract_digit(idx, 1), OLED_X_SIZE - (CHAR_SIZE + 1) * 2, 2, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
static uint8_t old_percent = 0xFF;
|
static uint8_t old_percent = 0xFF;
|
||||||
uint8_t buf[BUFF_SIZE];
|
uint8_t buf[BUFF_SIZE];
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
@ -1114,7 +1141,7 @@ void print_battery_icon()
|
|||||||
#if ((OLED_BATTERY_ICON_X2 - OLED_BATTERY_ICON_X1 - OLED_BATTERY_ICON_SIZE * 4 + 1) > BUFF_SIZE)
|
#if ((OLED_BATTERY_ICON_X2 - OLED_BATTERY_ICON_X1 - OLED_BATTERY_ICON_SIZE * 4 + 1) > BUFF_SIZE)
|
||||||
#error "THIS X OVERFLOWS"
|
#error "THIS X OVERFLOWS"
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_battery_stat(uint8_t force_draw)
|
void print_battery_stat(uint8_t force_draw)
|
||||||
@ -1130,7 +1157,7 @@ void print_battery_stat(uint8_t force_draw)
|
|||||||
symbols[6] = CHAR_A;
|
symbols[6] = CHAR_A;
|
||||||
symbols[7] = CHAR_h;
|
symbols[7] = CHAR_h;
|
||||||
|
|
||||||
print_battery_single_stat(1, battery_mAh, symbols, 0xFF);
|
print_battery_single_stat(1, battery_mAh, symbols, 5);
|
||||||
old_mAh = battery_mAh;
|
old_mAh = battery_mAh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1140,7 +1167,7 @@ void print_battery_stat(uint8_t force_draw)
|
|||||||
symbols[6] = CHAR_V;
|
symbols[6] = CHAR_V;
|
||||||
symbols[7] = 0xFF;
|
symbols[7] = 0xFF;
|
||||||
|
|
||||||
print_battery_single_stat(1, battery_mV, symbols, 0xFF);
|
print_battery_single_stat(2, battery_mV, symbols, 5);
|
||||||
old_mV = battery_mV;
|
old_mV = battery_mV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1150,7 +1177,7 @@ void print_battery_stat(uint8_t force_draw)
|
|||||||
symbols[6] = CHAR_C;
|
symbols[6] = CHAR_C;
|
||||||
symbols[7] = 0xFF;
|
symbols[7] = 0xFF;
|
||||||
|
|
||||||
print_battery_single_stat(1, battery_temp, symbols, 3);
|
print_battery_single_stat(3, battery_temp, symbols, 3);
|
||||||
old_temp = battery_temp;
|
old_temp = battery_temp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1210,8 +1237,8 @@ int16_t find_eeprom_idx()
|
|||||||
uint8_t err;
|
uint8_t err;
|
||||||
int16_t idx = 0;
|
int16_t idx = 0;
|
||||||
uint8_t found = 0;
|
uint8_t found = 0;
|
||||||
uint8_t dir;
|
uint8_t dir = 0xFF;
|
||||||
uint32_t value = 0xFFFFFFFF;
|
uint32_t value = 0x00FFFFFF;
|
||||||
|
|
||||||
// FF is the erased byte value
|
// FF is the erased byte value
|
||||||
for (idx = 0; idx < EEPROM_SIZE / EEPROM_IDX_SIZE; ++idx)
|
for (idx = 0; idx < EEPROM_SIZE / EEPROM_IDX_SIZE; ++idx)
|
||||||
@ -1222,7 +1249,8 @@ int16_t find_eeprom_idx()
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value != 0xFFFFFFFF)
|
// if ((value != 0x00FFFFFF) && (dir != 0xFF))
|
||||||
|
if (value != 0x00FFFFFF)
|
||||||
{
|
{
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
@ -1682,6 +1710,11 @@ void process_menu()
|
|||||||
menu_option %= MENU_COUNT;
|
menu_option %= MENU_COUNT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state != STATE_MENU)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hold button to exit menu
|
// Hold button to exit menu
|
||||||
@ -1792,13 +1825,16 @@ void process_adjust()
|
|||||||
write_eeprom_val(eeprom_idx, 0xFFFFFFFF, 0xFF);
|
write_eeprom_val(eeprom_idx, 0xFFFFFFFF, 0xFF);
|
||||||
++eeprom_idx;
|
++eeprom_idx;
|
||||||
eeprom_idx %= EEPROM_SIZE / EEPROM_IDX_SIZE;
|
eeprom_idx %= EEPROM_SIZE / EEPROM_IDX_SIZE;
|
||||||
write_eeprom_val(eeprom_idx, (uint32_t) count_value, rot_dir_is_A);
|
write_eeprom_val(eeprom_idx, count_value, rot_dir_is_A);
|
||||||
|
|
||||||
// Go back to idle
|
// Go back to idle
|
||||||
state = STATE_IDLE;
|
state = STATE_IDLE;
|
||||||
long_press_when_ms = 0xFFFFFFFF;
|
long_press_when_ms = 0xFFFFFFFF;
|
||||||
sleep_when_ms = ms + DISPLAY_DELAY;
|
sleep_when_ms = ms + DISPLAY_DELAY;
|
||||||
spool_counting = 1;
|
spool_counting = 1;
|
||||||
|
|
||||||
|
count_highlight = 0;
|
||||||
|
dir_highlight = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1924,5 +1960,6 @@ void set_battery_state()
|
|||||||
{
|
{
|
||||||
print_clear_menu_area();
|
print_clear_menu_area();
|
||||||
state = STATE_BATTERY;
|
state = STATE_BATTERY;
|
||||||
|
read_battery(&battery_mAh, &battery_mV, &battery_temp);
|
||||||
print_battery_stat(1);
|
print_battery_stat(1);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user