ubitxv6/menu_utils.cpp

104 lines
2.9 KiB
C++
Raw Normal View History

2020-02-10 02:04:47 +01:00
#include "menu_utils.h"
2020-02-10 01:16:57 +01:00
#include <avr/pgmspace.h>
#include "button.h"
#include "color_theme.h"
2020-02-10 02:04:47 +01:00
#include "morse.h"
2020-02-10 00:42:37 +01:00
#include "nano_gui.h"
2020-02-10 02:04:47 +01:00
#include "utils.h"
2020-02-09 23:10:08 +01:00
bool findPressedButton(const Button* const* buttons,
2020-02-10 01:16:57 +01:00
const uint8_t num_buttons,
Button *const button_out,
const Point touch_point)
{
2020-02-12 06:55:23 +01:00
Button* bp;
2020-02-10 01:16:57 +01:00
for(uint16_t i = 0; i < num_buttons; ++i){
2020-02-12 06:55:23 +01:00
memcpy_P(&bp,&(buttons[i]),sizeof(bp));
2020-02-12 07:15:46 +01:00
memcpy_P(button_out,bp,sizeof(*button_out));
if((button_out->x <= touch_point.x)
&&(touch_point.x <= button_out->x + button_out->w)
&&(button_out->y <= touch_point.y)
&&(touch_point.y <= button_out->y + button_out->h)){
2020-02-10 01:16:57 +01:00
return true;
}
}
return false;
}
2020-02-10 02:04:47 +01:00
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);
}
const ButtonStatus_e bs = button->status();
if(ButtonStatus_e::Inactive == bs){
2020-02-10 02:04:47 +01:00
morseBool(false);
}
else if(ButtonStatus_e::Active == bs){
2020-02-10 02:04:47 +01:00
morseBool(true);
}
}
void initSelector(int16_t *const raw_select_val_in_out,
const Button* const* buttons,
2020-02-10 02:04:47 +01:00
const uint8_t num_buttons,
const MorsePlaybackType_e play_type)
{
*raw_select_val_in_out = 0;
if(0 < num_buttons){
Button button;
2020-02-12 06:55:23 +01:00
Button* bp;
memcpy_P(&bp,&(buttons[0]),sizeof(bp));
memcpy_P(&button,bp,sizeof(button));
2020-02-10 06:45:51 +01:00
movePuck(nullptr,&button);
playButtonMorse(&button,play_type);
2020-02-10 02:04:47 +01:00
}
}
void adjustSelector(int16_t *const raw_select_val_in_out,
const int16_t knob,
const Button* const* buttons,
2020-02-10 02:04:47 +01:00
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);
2020-02-10 02:04:47 +01:00
const uint8_t new_select = (*raw_select_val_in_out)/MENU_KNOB_COUNTS_PER_ITEM;
if(prev_select != new_select){
Button prev_button;
2020-02-12 06:55:23 +01:00
Button* bp;
memcpy_P(&bp,&(buttons[prev_select]),sizeof(bp));
memcpy_P(&prev_button,bp,sizeof(prev_button));
Button new_button;
2020-02-12 06:55:23 +01:00
memcpy_P(&bp,&(buttons[new_select]),sizeof(bp));
memcpy_P(&new_button,bp,sizeof(new_button));
movePuck(&prev_button,&new_button);
playButtonMorse(&new_button,play_type);
2020-02-10 02:04:47 +01:00
}
}
2020-02-10 06:59:15 +01:00
void endSelector(const Button *const button)
{
movePuck(button,nullptr);
}