forked from MNVolkov/Template
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtemplate.c
More file actions
179 lines (133 loc) · 8.24 KB
/
template.c
File metadata and controls
179 lines (133 loc) · 8.24 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*
Application template for Amazfit Bip BipOS
(C) Maxim Volkov 2019 <Maxim.N.Volkov@ya.ru>
Шаблон приложения для загрузчика BipOS
*/
#include <libbip.h>
#include "template.h"
// структура меню экрана - для каждого экрана своя
struct regmenu_ screen_data = {
55, // номер главного экрана, значение 0-255, для пользовательских окон лучше брать от 50 и выше
1, // вспомогательный номер экрана (обычно равен 1)
0, // 0
dispatch_screen, // указатель на функцию обработки тача, свайпов, долгого нажатия кнопки
key_press_screen, // указатель на функцию обработки нажатия кнопки
screen_job, // указатель на функцию-колбэк таймера
0, // 0
show_screen, // указатель на функцию отображения экрана
0, //
0 // долгое нажатие кнопки
};
int main(int param0, char** argv){ // здесь переменная argv не определена
show_screen((void*) param0);
}
void show_screen (void *param0){
struct app_data_** app_data_p = get_ptr_temp_buf_2(); // указатель на указатель на данные экрана
struct app_data_ * app_data; // указатель на данные экрана
Elf_proc_* proc;
// проверка источника запуска процедуры
if ( (param0 == *app_data_p) && get_var_menu_overlay()){ // возврат из оверлейного экрана (входящий звонок, уведомление, будильник, цель и т.д.)
app_data = *app_data_p; // указатель на данные необходимо сохранить для исключения
// высвобождения памяти функцией reg_menu
*app_data_p = NULL; // обнуляем указатель для передачи в функцию reg_menu
// создаем новый экран, при этом указатель temp_buf_2 был равен 0 и память не была высвобождена
reg_menu(&screen_data, 0); // menu_overlay=0
*app_data_p = app_data; // восстанавливаем указатель на данные после функции reg_menu
// здесь проводим действия при возврате из оверлейного экрана: восстанавливаем данные и т.д.
} else { // если запуск функции произошел впервые т.е. из меню
// создаем экран (регистрируем в системе)
reg_menu(&screen_data, 0);
// выделяем необходимую память и размещаем в ней данные, (память по указателю, хранящемуся по адресу temp_buf_2 высвобождается автоматически функцией reg_menu другого экрана)
*app_data_p = (struct app_data_ *)pvPortMalloc(sizeof(struct app_data_));
app_data = *app_data_p; // указатель на данные
// очистим память под данные
_memclr(app_data, sizeof(struct app_data_));
// значение param0 содержит указатель на данные запущенного процесса структура Elf_proc_
proc = param0;
// запомним адрес указателя на функцию в которую необходимо вернуться после завершения данного экрана
if ( param0 && proc->ret_f ) // если указатель на возврат передан, то возвоащаемся на него
app_data->ret_f = proc->elf_finish;
else // если нет, то на циферблат
app_data->ret_f = show_watchface;
// здесь проводим действия которые необходимо если функция запущена впервые из меню: заполнение всех структур данных и т.д.
app_data->col=0;
}
// здесь выполняем отрисовку интерфейса, обновление (перенос в видеопамять) экрана выполнять не нужно
draw_screen(app_data->col);
// при необходимости ставим таймер вызова screen_job в мс
set_update_period(1, 5000);
}
void key_press_screen(){
struct app_data_** app_data_p = get_ptr_temp_buf_2(); // указатель на указатель на данные экрана
struct app_data_ * app_data = *app_data_p; // указатель на данные экрана
// вызываем функцию возврата (обычно это меню запуска), в качестве параметра указываем адрес функции нашего приложения
show_menu_animate(app_data->ret_f, (unsigned int)show_screen, ANIMATE_RIGHT);
};
void screen_job(){
// при необходимости можно использовать данные экрана в этой функции
struct app_data_** app_data_p = get_ptr_temp_buf_2(); // указатель на указатель на данные экрана
struct app_data_ * app_data = *app_data_p; // указатель на данные экрана
// делаем периодическое действие: анимация, увеличение счетчика, обновление экрана,
// отрисовку интерфейса, обновление (перенос в видеопамять) экрана выполнять нужно
app_data->col = (app_data->col+1)%COLORS_COUNT;
draw_screen(app_data->col);
// перенос в видеопамять строк экрана, которые были перерисованы
repaint_screen_lines(0, 176);
// при необходимости заново ставим таймер вызова screen_job
set_update_period(1, 5000);
}
int dispatch_screen (void *param){
struct app_data_** app_data_p = get_ptr_temp_buf_2(); // указатель на указатель на данные экрана
struct app_data_ * app_data = *app_data_p; // указатель на данные экрана
// в случае отрисовки интерфейса, обновление (перенос в видеопамять) экрана выполнять нужно
struct gesture_ *gest = param;
int result = 0;
switch (gest->gesture){
case GESTURE_CLICK: {
if ( ( gest->touch_pos_y >66) && ( gest->touch_pos_y < 110) ){
if ( ( gest->touch_pos_x >66) && ( gest->touch_pos_x < 110) ){
// тач в центр экрана
// выполняем действия
vibrate(1,70,0);
app_data->col = (app_data->col+1)%COLORS_COUNT;
draw_screen(app_data->col);
repaint_screen_lines(0, 176);
}
}
break;
};
case GESTURE_SWIPE_RIGHT: { // свайп направо
// обычно это выход из приложения
show_menu_animate(app_data->ret_f, (unsigned int)show_screen, ANIMATE_RIGHT);
break;
};
case GESTURE_SWIPE_LEFT: { // справа налево
// действия при свайпе влево
break;
};
case GESTURE_SWIPE_UP: { // свайп вверх
// действия при свайпе вверх
break;
};
case GESTURE_SWIPE_DOWN: { // свайп вниз
// действия при свайпе вниз
break;
};
default:{ // что-то пошло не так...
break;
};
}
return result;
};
// пользовательская функция
void draw_screen(int col){
static int colors_bg[COLORS_COUNT] = {COLOR_BLACK, COLOR_BLUE, COLOR_RED, COLOR_PURPLE};
static int colors_fg[COLORS_COUNT] = {COLOR_AQUA, COLOR_WHITE, COLOR_YELLOW, COLOR_GREEN};
set_bg_color(colors_bg[col]);
fill_screen_bg();
set_graph_callback_to_ram_1();
// подгружаем шрифты
load_font();
set_fg_color(colors_fg[col]);
text_out_center("Привет!!!", 88, 60);
};