pebble/src/fw/mfg/mfg_apps/mfg_func_test_buttons.h
2025-01-27 11:38:16 -08:00

132 lines
4.4 KiB
C

/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "drivers/button.h"
#include "drivers/backlight.h"
#include "util/trig.h"
#include "applib/ui/ui.h"
#include "applib/ui/window_private.h"
#include "applib/fonts/fonts.h"
typedef struct {
MfgFuncTestData *app_data;
ButtonId button_id;
TextLayer label;
PathLayer arrow;
} ButtonTestData;
static const GPathInfo ARROW_PATH_INFO = {
.num_points = 7,
.points = (GPoint []) {{0, 14}, {29, 14}, {29, 0}, {54, 25}, {29, 50}, {29, 36}, {0, 36}}
};
static const GPathInfo BOLT_PATH_INFO = {
.num_points = 6,
.points = (GPoint []) {{21, 0}, {14, 26}, {28, 26}, {7, 60}, {14, 34}, {0, 34}}
};
static void move_arrow_to_button(ButtonTestData *data, ButtonId id) {
#define ARROW_SIZE {54, 50}
static const GRect ARROW_RECTS[] = {
{{2, 30}, ARROW_SIZE}, // BACK
{{88, 2}, ARROW_SIZE}, // UP
{{88, 59}, ARROW_SIZE}, // SELECT
{{88, 116}, ARROW_SIZE}, // DOWN
};
layer_set_frame(&data->arrow.layer, &ARROW_RECTS[id]);
gpath_rotate_to(&data->arrow.path, id == BUTTON_ID_BACK ? (TRIG_MAX_ANGLE / 2) : 0);
gpath_move_to(&data->arrow.path, id == BUTTON_ID_BACK ? GPoint(54, 50) : GPoint(0, 0));
}
static void button_window_button_up(ClickRecognizerRef recognizer, Window *window) {
ButtonTestData *data = window_get_user_data(window);
ButtonId button_id = click_recognizer_get_button_id(recognizer);
if (data->button_id == button_id) {
++(data->button_id);
if (data->button_id > BUTTON_ID_DOWN) {
mfg_func_test_append_bits(MfgFuncTestBitButtonTestPassed);
data->app_data->button_test_done = true;
data->button_id = BUTTON_ID_BACK;
const bool animated = false;
window_stack_pop(animated);
} else {
move_arrow_to_button(data, data->button_id);
}
backlight_set_brightness(0);
}
}
static void button_window_button_down(ClickRecognizerRef recognizer, Window *window) {
ButtonTestData *data = window_get_user_data(window);
if (data->button_id == click_recognizer_get_button_id(recognizer)) {
backlight_set_brightness(0xffff);
}
}
static void button_window_click_config_provider(void *context) {
for (ButtonId button_id = BUTTON_ID_BACK; button_id < NUM_BUTTONS; ++button_id) {
window_raw_click_subscribe(button_id,
(ClickHandler) button_window_button_down, (ClickHandler) button_window_button_up, context);
}
}
static void button_window_load(Window *window) {
ButtonTestData *data = window_get_user_data(window);
Layer *root = &window->layer;
TextLayer *label = &data->label;
text_layer_init(label, GRect(0, 0, 144, 40));
text_layer_set_background_color(label, GColorClear);
text_layer_set_text_color(label, GColorBlack);
text_layer_set_text(label, "Press Button");
text_layer_set_font(label, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
layer_add_child(root, &label->layer);
PathLayer *arrow = &data->arrow;
path_layer_init(arrow, &ARROW_PATH_INFO);
path_layer_set_fill_color(arrow, GColorBlack);
path_layer_set_stroke_color(arrow, GColorClear);
layer_add_child(root, &arrow->layer);
move_arrow_to_button(data, data->button_id);
}
static void push_button_test_window(MfgFuncTestData *app_data) {
static ButtonTestData s_button_test_data = {
.button_id = BUTTON_ID_BACK,
};
s_button_test_data.app_data = app_data;
Window *button_window = &app_data->button_window;
window_init(button_window, WINDOW_NAME("Mfg Func Test Buttons"));
window_set_overrides_back_button(button_window, true);
window_set_click_config_provider_with_context(button_window,
(ClickConfigProvider) button_window_click_config_provider, button_window);
window_set_window_handlers(button_window, &(WindowHandlers) {
.load = button_window_load
});
window_set_user_data(button_window, &s_button_test_data);
window_set_fullscreen(button_window, true);
const bool animated = false;
window_stack_push(button_window, animated);
}