1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/* Copyright (C) 2026 Reiner Herrmann
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include <pebble.h>
#include "metronome.h"
static Window *app_window;
static ActionBarLayer *action_bar;
static GBitmap *icon_left_arrows;
static GBitmap *icon_right_arrows;
static GBitmap *icon_plus;
static GBitmap *icon_minus;
static GBitmap *icon_three_dots;
static GBitmap *icon_pause;
static GBitmap *icon_play;
static AppTimer *action_bar_timer;
static const int action_bar_timeout = 2000;
static void primary_action_bar();
static void secondary_action_bar();
static void increase_bpm_handler(ClickRecognizerRef recognizer, void *context) {
increase_bpm();
}
static void decrease_bpm_handler(ClickRecognizerRef recognizer, void *context) {
decrease_bpm();
}
static void increase_beats_handler(ClickRecognizerRef recognizer, void *context) {
increase_beats();
app_timer_reschedule(action_bar_timer, action_bar_timeout);
}
static void decrease_beats_handler(ClickRecognizerRef recognizer, void *context) {
decrease_beats();
app_timer_reschedule(action_bar_timer, action_bar_timeout);
}
static void switch_to_secondary_handler(ClickRecognizerRef recognizer, void *context) {
secondary_action_bar();
/* switch back to primary after timeout */
action_bar_timer = app_timer_register(action_bar_timeout, primary_action_bar, NULL);
}
static void pause_play_handler(ClickRecognizerRef recognizer, void *context) {
if (is_paused()) {
start_metronome();
action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_pause);
} else {
stop_metronome();
action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_play);
}
app_timer_reschedule(action_bar_timer, action_bar_timeout);
}
static void click_config_provider_primary(void *context) {
window_single_click_subscribe(BUTTON_ID_UP, increase_bpm_handler);
window_single_click_subscribe(BUTTON_ID_SELECT, switch_to_secondary_handler);
window_single_click_subscribe(BUTTON_ID_DOWN, decrease_bpm_handler);
}
static void click_config_provider_secondary(void *context) {
window_single_click_subscribe(BUTTON_ID_UP, increase_beats_handler);
window_single_click_subscribe(BUTTON_ID_SELECT, pause_play_handler);
window_single_click_subscribe(BUTTON_ID_DOWN, decrease_beats_handler);
}
static void secondary_action_bar() {
action_bar_layer_set_click_config_provider(action_bar, click_config_provider_secondary);
action_bar_layer_set_icon(action_bar, BUTTON_ID_UP, icon_plus);
action_bar_layer_set_icon(action_bar, BUTTON_ID_DOWN, icon_minus);
action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, is_paused() ? icon_play : icon_pause);
}
static void primary_action_bar() {
action_bar_layer_set_click_config_provider(action_bar, click_config_provider_primary);
action_bar_layer_set_icon(action_bar, BUTTON_ID_UP, icon_right_arrows);
action_bar_layer_set_icon(action_bar, BUTTON_ID_DOWN, icon_left_arrows);
action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_three_dots);
}
static void init() {
icon_left_arrows = gbitmap_create_with_resource(RESOURCE_ID_LEFT_ARROWS);
icon_right_arrows = gbitmap_create_with_resource(RESOURCE_ID_RIGHT_ARROWS);
icon_plus = gbitmap_create_with_resource(RESOURCE_ID_PLUS);
icon_minus = gbitmap_create_with_resource(RESOURCE_ID_MINUS);
icon_three_dots = gbitmap_create_with_resource(RESOURCE_ID_THREE_DOTS);
icon_pause = gbitmap_create_with_resource(RESOURCE_ID_PAUSE);
icon_play = gbitmap_create_with_resource(RESOURCE_ID_PLAY);
app_window = create_metronome_window();
action_bar = action_bar_layer_create();
action_bar_layer_add_to_window(action_bar, app_window);
primary_action_bar();
window_stack_push(app_window, true);
}
static void deinit() {
window_destroy(app_window);
}
int main(void) {
init();
app_event_loop();
deinit();
}
|