Move selector logic to menu_utils

This commit is contained in:
Reed Nightingale 2020-02-09 17:04:47 -08:00
parent 9e21faa6f1
commit 5e30551bf2
3 changed files with 87 additions and 33 deletions

View File

@ -22,7 +22,7 @@ Menu_t mainMenu = {
Menu_t* const rootMenu = &mainMenu;
bool mainMenuSelecting = false;//Tracks if we're selecting buttons with knob, or adjusting frequency
uint8_t mainMenuSelectedItemRaw = 0;
int16_t mainMenuSelectedItemRaw = 0;//Allow negative only for easier checks on wrap around
const Button mainMenuButtons [] PROGMEM = {};
static constexpr uint8_t MAIN_MENU_NUM_BUTTONS = sizeof(mainMenuButtons) / sizeof(mainMenuButtons[0]);
@ -93,7 +93,10 @@ MenuReturn_e runMainMenu(const ButtonPress_e tuner_button,
//TODO: activate button
}
else{
movePuck(nullptr,&mainMenuButtons[0]);
initSelector(&mainMenuSelectedItemRaw,
mainMenuButtons,
MAIN_MENU_NUM_BUTTONS,
MorsePlaybackType_e::PlayChar);
}
mainMenuSelecting = !mainMenuSelecting;
@ -132,21 +135,11 @@ MenuReturn_e runMainMenu(const ButtonPress_e tuner_button,
else{//Neither button input type found, so handle the knob
if(mainMenuSelecting){
const uint8_t prev_select = mainMenuSelectedItemRaw/MENU_KNOB_COUNTS_PER_ITEM;
mainMenuSelectedItemRaw += LIMIT(mainMenuSelectedItemRaw+knob,0,MAIN_MENU_NUM_BUTTONS*MENU_KNOB_COUNTS_PER_ITEM);
const uint8_t new_select = mainMenuSelectedItemRaw/MENU_KNOB_COUNTS_PER_ITEM;
if(prev_select != new_select){
movePuck(&mainMenuButtons[prev_select],&mainMenuButtons[new_select]);//TODO
morseLetter(mainMenuButtons[new_select].morse);
int8_t morse_status = 0;
mainMenuButtons[new_select].morse_status(morse_status);
if(morse_status < 0){
morseBool(false);
}
else if(morse_status > 0){
morseBool(true);
}
}
adjustSelector(&mainMenuSelectedItemRaw,
knob,
mainMenuButtons,
MAIN_MENU_NUM_BUTTONS,
MorsePlaybackType_e::PlayChar);
}
else{
mainMenuTune(knob);

View File

@ -1,10 +1,12 @@
#include "menu.h"
#include "menu_utils.h"
#include <avr/pgmspace.h>
#include "button.h"
#include "color_theme.h"
#include "morse.h"
#include "nano_gui.h"
#include "utils.h"
bool runSubmenu(Menu_t* const current_menu,
void(*const redraw_callback)(),
@ -35,17 +37,6 @@ bool runSubmenu(Menu_t* const current_menu,
return false;
}
void movePuck(const Button *const b_old,
const Button *const b_new)
{
if(nullptr != b_old){
displayRect(b_old->x,b_old->y,b_old->w,b_old->h,COLOR_INACTIVE_BORDER);
}
if(nullptr != b_new){
displayRect(b_new->x,b_new->y,b_new->w,b_new->h,COLOR_ACTIVE_BORDER);
}
}
bool findPressedButton(const Button *const buttons,
const uint8_t num_buttons,
Button *const button_out,
@ -63,3 +54,60 @@ bool findPressedButton(const Button *const buttons,
return false;
}
void movePuck(const Button *const b_old,
const Button *const b_new)
{
if(nullptr != b_old){
displayRect(b_old->x,b_old->y,b_old->w,b_old->h,COLOR_INACTIVE_BORDER);
}
if(nullptr != b_new){
displayRect(b_new->x,b_new->y,b_new->w,b_new->h,COLOR_ACTIVE_BORDER);
}
}
void playButtonMorse(const Button *const button,
const MorsePlaybackType_e play_type)
{
if(MorsePlaybackType_e::PlayText == play_type){
morseText(button->text);
}
else{
morseLetter(button->morse);
}
int8_t morse_status = 0;
button->morse_status(&morse_status);
if(morse_status < 0){
morseBool(false);
}
else if(morse_status > 0){
morseBool(true);
}
}
void initSelector(int16_t *const raw_select_val_in_out,
const Button *const buttons,
const uint8_t num_buttons,
const MorsePlaybackType_e play_type)
{
*raw_select_val_in_out = 0;
if(0 < num_buttons){
playButtonMorse(&buttons[0],play_type);
}
}
void adjustSelector(int16_t *const raw_select_val_in_out,
const int16_t knob,
const Button *const buttons,
const uint8_t num_buttons,
const MorsePlaybackType_e play_type)
{
const uint8_t prev_select = (*raw_select_val_in_out)/MENU_KNOB_COUNTS_PER_ITEM;
*raw_select_val_in_out += LIMIT((*raw_select_val_in_out)+knob,0,num_buttons*MENU_KNOB_COUNTS_PER_ITEM - 1);
const uint8_t new_select = (*raw_select_val_in_out)/MENU_KNOB_COUNTS_PER_ITEM;
if(prev_select != new_select){
movePuck(&buttons[prev_select],&buttons[new_select]);
playButtonMorse(&buttons[new_select],play_type);
}
}

View File

@ -1,6 +1,7 @@
#pragma once
#include "button.h"
#include "menu.h"
//Returns true if submenu was run, false otherwise
bool runSubmenu(Menu_t* current_menu,
@ -10,11 +11,23 @@ bool runSubmenu(Menu_t* current_menu,
const Point touch_point,
const int16_t knob);
void movePuck(const Button *const b_old,
const Button *const b_new);
//Returns true if button was found, false otherwise
bool findPressedButton(const Button *const buttons,
const uint8_t num_buttons,
Button *const button_out,
const Point touch_point);
const Point touch_point);
enum MorsePlaybackType_e : uint8_t {
PlayChar,
PlayText
};
void initSelector(int16_t *const raw_select_val_in_out,
const Button *const buttons,
const uint8_t num_buttons,
const MorsePlaybackType_e);
void adjustSelector(int16_t *const raw_select_val_in_out,
int16_t knob,
const Button *const buttons,
const uint8_t num_buttons,
const MorsePlaybackType_e);