Added toggle switch widget.
This commit is contained in:
@@ -49,4 +49,16 @@ void set_selected_menu_entry_idx(volatile pixel_t *const framebuffer, graphical_
|
||||
void decrement_selected_menu_entry_idx(volatile pixel_t *const framebuffer, graphical_menu_t *const menu);
|
||||
void increment_selected_menu_entry_idx(volatile pixel_t *const framebuffer, graphical_menu_t *const menu);
|
||||
|
||||
/*
|
||||
* Add a toggle switch to the menu entry
|
||||
* It is used to draw additional graphics on top of the menu entry
|
||||
* Arguments:
|
||||
* - menu_entry_size: the size of the menu entry
|
||||
* - toggle_switch_value: (bool *) the value of the toggle switch
|
||||
*
|
||||
* Can be used as a callback function for the extra_draw_function field in the graphical_menu_entry_t struct
|
||||
* This is why toggle_switch_value is a void pointer and not a bool pointer
|
||||
*/
|
||||
void add_toggle_switch_to_menu_entry(const menu_entry_size_t *const menu_entry_size, void *const toggle_switch_value);
|
||||
|
||||
#endif
|
||||
@@ -31,7 +31,7 @@ extern "C" {
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
#include "stdbool.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
@@ -53,7 +53,8 @@ extern "C" {
|
||||
void Error_Handler(void);
|
||||
|
||||
/* USER CODE BEGIN EFP */
|
||||
|
||||
extern volatile bool led1_state;
|
||||
extern volatile bool led2_state;
|
||||
/* USER CODE END EFP */
|
||||
|
||||
/* Private defines -----------------------------------------------------------*/
|
||||
@@ -384,13 +385,15 @@ void Error_Handler(void);
|
||||
#define OK_BUTTON_PRESSED() (HAL_GPIO_ReadPin(BUTTON4_GPIO_Port, BUTTON4_Pin) == GPIO_PIN_RESET)
|
||||
#define UP_BUTTON_PRESSED() (HAL_GPIO_ReadPin(BUTTON5_GPIO_Port, BUTTON5_Pin) == GPIO_PIN_RESET)
|
||||
|
||||
#define LED1_ON() (HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET))
|
||||
#define LED1_OFF() (HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET))
|
||||
#define LED1_TOGGLE() (HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin))
|
||||
#define LED1_ON() led1_state = true;
|
||||
#define LED1_OFF() led1_state = false;
|
||||
#define LED1_TOGGLE() led1_state = !led1_state;
|
||||
#define LED1_STATE() (led1_state)
|
||||
|
||||
#define LED2_ON() (HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET))
|
||||
#define LED2_OFF() (HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET))
|
||||
#define LED2_TOGGLE() (HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin))
|
||||
#define LED2_ON() led2_state = true;
|
||||
#define LED2_OFF() led2_state = false;
|
||||
#define LED2_TOGGLE() led2_state = !led2_state;
|
||||
#define LED2_STATE() (led2_state)
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "stdbool.h"
|
||||
|
||||
void ui_left_button_pressed(void);
|
||||
void ui_right_button_pressed(void);
|
||||
void ui_up_button_pressed(void);
|
||||
void ui_down_button_pressed(void);
|
||||
void ui_ok_button_pressed(void);
|
||||
|
||||
@@ -29,7 +29,7 @@ void DrawBox(uint32_t topleft_x_loc, uint32_t topleft_y_loc, uint32_t width, uin
|
||||
|
||||
void draw_toggle_switch(volatile pixel_t *const framebuffer, const toggle_switch_t *const toggle_switch)
|
||||
{
|
||||
const uint16_t default_width = 50;
|
||||
const uint16_t default_width = 40;
|
||||
const uint16_t default_height = 20;
|
||||
const pixel_t default_on_color = MAKE_PIXEL(0, 255, 0);
|
||||
const pixel_t default_off_color = MAKE_PIXEL(160, 20, 20);
|
||||
|
||||
@@ -20,7 +20,7 @@ void draw_menu_entry(volatile pixel_t *const framebuffer, const graphical_menu_t
|
||||
|
||||
// Draw entry background - use highlighted color if this is the selected entry
|
||||
pixel_t bg_color = is_highlighted ? highlighted_bg_color : entry_bg_color;
|
||||
DrawBox(0, y_pos, DISPLAY_WIDTH, entry_height, bg_color);
|
||||
DrawBox(0, y_pos + 1, DISPLAY_WIDTH, entry_height - 1, bg_color);
|
||||
|
||||
// Draw entry text - use highlighted color if selected, otherwise use enabled/disabled color
|
||||
pixel_t text_color;
|
||||
@@ -35,10 +35,16 @@ void draw_menu_entry(volatile pixel_t *const framebuffer, const graphical_menu_t
|
||||
|
||||
// Calculate baseline from top position: baseline = top + (line_height - base_line)
|
||||
const uint16_t text_baseline_y = y_pos + padding_y + (roboto_bold_font.line_height - roboto_bold_font.base_line);
|
||||
draw_string(framebuffer, &runescape_font,
|
||||
draw_string(framebuffer, &roboto_bold_font,
|
||||
padding_x, text_baseline_y,
|
||||
entry->title, text_color);
|
||||
|
||||
// draw a line between the menu entries
|
||||
if (entry_idx != 0)
|
||||
{
|
||||
DrawBox(5, y_pos, DISPLAY_WIDTH - 10, 1, MAKE_PIXEL(80, 80, 80));
|
||||
}
|
||||
|
||||
if (entry->extra_draw_function != NULL)
|
||||
{
|
||||
const menu_entry_size_t menu_entry_size = {
|
||||
@@ -132,4 +138,24 @@ void increment_selected_menu_entry_idx(volatile pixel_t *const framebuffer, grap
|
||||
}
|
||||
|
||||
set_selected_menu_entry_idx(framebuffer, menu, idx);
|
||||
}
|
||||
|
||||
void add_toggle_switch_to_menu_entry(const menu_entry_size_t *const menu_entry_size, void *const toggle_switch_value)
|
||||
{
|
||||
const uint16_t width_padding = 10;
|
||||
const uint16_t toggle_switch_width = 40;
|
||||
const uint16_t toggle_switch_height = 20;
|
||||
|
||||
const uint16_t x = menu_entry_size->x + ( (menu_entry_size->width - toggle_switch_width)) - width_padding;
|
||||
const uint16_t y = menu_entry_size->y + ( (menu_entry_size->height / 2) - (toggle_switch_height / 2));
|
||||
const toggle_switch_t toggle_switch = {
|
||||
.x = x,
|
||||
.y = y,
|
||||
.width = toggle_switch_width,
|
||||
.height = toggle_switch_height,
|
||||
.inner_padding_pixels = 3,
|
||||
.value = *(bool *)toggle_switch_value,
|
||||
};
|
||||
|
||||
draw_toggle_switch(next_framebuffer, &toggle_switch);
|
||||
}
|
||||
@@ -65,7 +65,8 @@ SDRAM_HandleTypeDef hsdram1;
|
||||
osThreadId defaultTaskHandle;
|
||||
/* USER CODE BEGIN PV */
|
||||
|
||||
|
||||
volatile bool led1_state = false;
|
||||
volatile bool led2_state = false;
|
||||
|
||||
/* USER CODE END PV */
|
||||
|
||||
@@ -951,15 +952,13 @@ void StartDefaultTask(void const * argument)
|
||||
{
|
||||
ui_left_button_pressed();
|
||||
}
|
||||
if (RIGHT_BUTTON_PRESSED())
|
||||
{
|
||||
ui_right_button_pressed();
|
||||
}
|
||||
if (OK_BUTTON_PRESSED())
|
||||
{
|
||||
ui_ok_button_pressed();
|
||||
}
|
||||
ui_task();
|
||||
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, led1_state ? GPIO_PIN_SET : GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, led2_state ? GPIO_PIN_SET : GPIO_PIN_RESET);
|
||||
osDelay(100);
|
||||
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
void ui_enter_submenu(void *const args);
|
||||
void ui_toggle_led1(void *const args);
|
||||
void ui_toggle_led2(void *const args);
|
||||
void ui_toggle_led1_switch(const menu_entry_size_t *const menu_entry_size, void *const args);
|
||||
void ui_toggle_led2_switch(const menu_entry_size_t *const menu_entry_size, void *const args);
|
||||
void ui_draw_toggle_led1_switch(const menu_entry_size_t *const menu_entry_size, void *const args);
|
||||
void ui_draw_toggle_led2_switch(const menu_entry_size_t *const menu_entry_size, void *const args);
|
||||
|
||||
/******************* */
|
||||
/* Menu declarations */
|
||||
@@ -36,13 +36,15 @@ static graphical_menu_t main_menu = {
|
||||
.disabled = true,
|
||||
.selected_callback_function = ui_toggle_led1,
|
||||
.selected_callback_function_args = 0,
|
||||
.extra_draw_function = ui_toggle_led1_switch,
|
||||
.extra_draw_function = add_toggle_switch_to_menu_entry,
|
||||
.extra_draw_function_args = (void *)&led1_state,
|
||||
},
|
||||
{
|
||||
.title = "Toggle LED2",
|
||||
.selected_callback_function = ui_toggle_led2,
|
||||
.selected_callback_function_args = 0,
|
||||
.extra_draw_function = ui_toggle_led2_switch,
|
||||
.extra_draw_function = add_toggle_switch_to_menu_entry,
|
||||
.extra_draw_function_args = (void *)&led2_state,
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -87,40 +89,6 @@ void ui_toggle_led2(void *const args)
|
||||
ui_request_redraw();
|
||||
}
|
||||
|
||||
void ui_toggle_led1_switch(const menu_entry_size_t *const menu_entry_size, void *const args)
|
||||
{
|
||||
const uint16_t width_padding = 10;
|
||||
const uint16_t height_padding = 10;
|
||||
|
||||
const uint16_t x = menu_entry_size->x + ( (menu_entry_size->width / 2) + width_padding);
|
||||
const uint16_t y = menu_entry_size->y + height_padding;
|
||||
const toggle_switch_t toggle_switch = {
|
||||
.x = x,
|
||||
.y = y,
|
||||
.inner_padding_pixels = 3,
|
||||
.value = HAL_GPIO_ReadPin(LD3_GPIO_Port, LD3_Pin) == GPIO_PIN_SET,
|
||||
};
|
||||
|
||||
draw_toggle_switch(next_framebuffer, &toggle_switch);
|
||||
}
|
||||
|
||||
void ui_toggle_led2_switch(const menu_entry_size_t *const menu_entry_size, void *const args)
|
||||
{
|
||||
const uint16_t width_padding = 10;
|
||||
const uint16_t height_padding = 10;
|
||||
|
||||
const uint16_t x = menu_entry_size->x + ( (menu_entry_size->width / 2) + width_padding);
|
||||
const uint16_t y = menu_entry_size->y + height_padding;
|
||||
const toggle_switch_t toggle_switch = {
|
||||
.x = x,
|
||||
.y = y,
|
||||
.inner_padding_pixels = 3,
|
||||
.value = HAL_GPIO_ReadPin(LD4_GPIO_Port, LD4_Pin) == GPIO_PIN_SET,
|
||||
};
|
||||
|
||||
draw_toggle_switch(next_framebuffer, &toggle_switch);
|
||||
}
|
||||
|
||||
/************************* */
|
||||
/* UI function definitions */
|
||||
/************************* */
|
||||
@@ -143,15 +111,9 @@ void ui_exit_submenu(void)
|
||||
|
||||
void ui_left_button_pressed(void)
|
||||
{
|
||||
// decrement_selected_menu_entry_idx(&main_menu);
|
||||
ui_exit_submenu();
|
||||
}
|
||||
|
||||
void ui_right_button_pressed(void)
|
||||
{
|
||||
// increment_selected_menu_entry_idx(&main_menu);
|
||||
}
|
||||
|
||||
void ui_up_button_pressed(void)
|
||||
{
|
||||
decrement_selected_menu_entry_idx(next_framebuffer, current_menu);
|
||||
|
||||
Reference in New Issue
Block a user