Kestrel Interface
Loading...
Searching...
No Matches
kest_profile_view.c
Go to the documentation of this file.
1#include "kest_int.h"
2
3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 0
5#endif
6
7static const char *FNAME = "kest_profile_view.c";
8
10{
11 KEST_PRINTF("create_profile_view_for(profile = %p)\n", profile);
12 if (!profile)
13 return NULL;
14
15 kest_ui_page *page = kest_alloc(sizeof(kest_ui_page));
16
17 if (!page)
18 return NULL;
19
20 KEST_PRINTF("Calling init_ui_page...\n");
21 init_ui_page(page);
22
23 KEST_PRINTF("Calling init_profile_view...\n");
24 int ret_val = init_profile_view(page);
25
26 if (ret_val != NO_ERROR)
27 {
29 return NULL;
30 }
31
32 KEST_PRINTF("Calling configure_profile_view...\n");
33 ret_val = configure_profile_view(page, profile);
34
35 if (ret_val != NO_ERROR)
36 {
38 return NULL;
39 }
40
41 profile->view_page = page;
42
43 KEST_PRINTF("create_profile_view_for done\n");
44 return page;
45}
46
48{
49 if (!button)
50 return ERR_NULL_PTR;
51
52 if (!button->data)
53 return ERR_BAD_ARGS;
54
55 kest_effect *effect = (kest_effect*)button->data;
56
57 /*
58 if (!effect->view_page)
59 {
60 KEST_PRINTF("Trnasformer's view page existn't; creating now\n");
61 kest_effect_init_view_page(effect);
62 }
63 */
64 enter_ui_page_forwards(((kest_effect*)button->data)->view_page);
65
66 return NO_ERROR;
67}
68
70{
71 if (!button)
72 return ERR_NULL_PTR;
73
74 kest_effect *effect = button->data;
75
76 if (!effect)
77 return ERR_BAD_ARGS;
78
79 #ifdef USE_TEENSY
80 queue_msg_to_teensy(create_m_message(KEST_MESSAGE_MOVE_TRANSFORMER, "sss", effect->profile->id, effect->id, button->index));
81 #endif
82
83 #ifdef USE_FPGA
84 kest_profile *profile = effect->profile;
85
86 if (profile)
87 kest_profile_move_effect(profile, button->index, button->prev_index);
88 #endif
89
90 return NO_ERROR;
91}
92
94{
95 KEST_PRINTF("profile_view_effect_delete_cb\n");
96 if (!button)
97 return ERR_NULL_PTR;
98
99 kest_effect *effect = button->data;
100
101 if (!effect)
102 return ERR_BAD_ARGS;
103
104 int ret_val = kest_profile_remove_effect(effect->profile, effect->id);
105
106 if (ret_val != NO_ERROR)
107 return ret_val;
108
109 #ifdef USE_FPGA
111 #endif
112 KEST_PRINTF("profile_view_effect_delete_cb done\n");
113 return ret_val;
114}
115
117{
118 //kest_printf("init_profile_view...\n");
119 if (!page)
120 return ERR_NULL_PTR;
121
122 init_ui_page(page);
123
125
127
128 if (!str)
129 return ERR_ALLOC_FAIL;
130
131 str->settings_page = malloc(sizeof(kest_ui_page));
132
133 if (!str->settings_page)
134 {
135 kest_free(str);
136 return ERR_ALLOC_FAIL;
137 }
138
139 int ret_val = init_profile_settings_page(str->settings_page);
140
141 if (ret_val != NO_ERROR)
142 {
143 return ret_val;
144 }
145
146 page->data_struct = (void*)str;
147
148 str->profile = NULL;
149
154
155 str->save = NULL;
156 str->plus = NULL;
157 str->play = NULL;
158
159 str->menu_button = NULL;
160 str->menu_button_label = NULL;
161
162 page->panel = new_panel();
163
165
167
170
174
175 str->rep.representee = NULL;
176 str->rep.representer = page;
178
179 return NO_ERROR;
180}
181
182static void save_button_cb(lv_event_t *e)
183{
184 #ifndef USE_SDCARD
185 return;
186 #endif
187
188 kest_ui_page *page = lv_event_get_user_data(e);
189
190 if (!page)
191 return;
192
194
195 if (!str)
196 return;
197
198 //kest_printf("Saving profile...\n");
199 int ret_val;
200
201 if ((ret_val = kest_profile_save(str->profile)) == NO_ERROR)
202 kest_button_disable(str->save);
203}
204
205static void menu_button_cb(lv_event_t *e)
206{
207 KEST_PRINTF("menu_button_cb\n");
208 kest_ui_page *page = lv_event_get_user_data(e);
209
210 if (!page)
211 return;
212
214
215 if (!str)
216 return;
217
218 kest_profile *profile = str->profile;
219
220 if (!profile)
221 return;
222
223 if (profile->sequence)
224 {
225 KEST_PRINTF("profile has a sequence; enter sequence view %p\n", profile->sequence->view_page);
226 enter_ui_page_backwards(profile->sequence->view_page);
227 }
228 else
229 {
230 KEST_PRINTF("profile has no sequence. enter ... whatevery. %p\n", page->parent);
232 }
233}
234
236{
237 if (!page)
238 return ERR_NULL_PTR;
239
241
242 const char *new_name = lv_textarea_get_text(page->panel->title);
243
244 if (str->profile->name)
245 kest_free(str->profile->name);
246
248
249 lv_obj_clear_state(page->panel->title, LV_STATE_FOCUSED);
250 lv_obj_add_state(page->container, LV_STATE_FOCUSED);
251
253
254 str->profile->unsaved_changes = 1;
255
256 #ifdef USE_SDCARD
258 #endif
259
261
262 return NO_ERROR;
263}
264
265
266void profile_view_save_name_cb(lv_event_t *e)
267{
268 kest_ui_page *page = (kest_ui_page*)lv_event_get_user_data(e);
270}
271
272void profile_view_revert_name(lv_event_t *e)
273{
274 kest_ui_page *page = (kest_ui_page*)lv_event_get_user_data(e);
276
277 lv_textarea_set_text(page->panel->title, str->profile->name);
278
279 lv_obj_clear_state(page->panel->title, LV_STATE_FOCUSED);
280 lv_obj_add_state(page->container, LV_STATE_FOCUSED);
281
283}
284
286{
287 kest_ui_page *page = (kest_ui_page*)lv_event_get_user_data(e);
288
289 if (!page)
290 return;
291
293
294 if (!str)
295 return;
296
298}
299
301{
302 enter_ui_page_backwards(&global_cxt.pages.main_menu);
303}
304
306{
307 KEST_PRINTF("profile_view_play_button_cb\n");
308 kest_ui_page *page = (kest_ui_page*)lv_event_get_user_data(e);
309
310 if (!page)
311 return;
312
314
315 if (!str)
316 return;
317
318 if (!str->profile)
319 {
320 KEST_PRINTF("Profile is NULL\n");
321 set_active_profile(NULL);
322 return;
323 }
324
325 if (str->profile->sequence)
326 {
327 kest_sequence_begin_at(str->profile->sequence, str->profile);
328 }
329 else
330 {
332 }
333}
334
336{
337 KEST_PRINTF("configure_profile_view(page = %p, data = %p)\n", page, data);
338 if (!page || !data)
339 return ERR_NULL_PTR;
340
341 if (page->configured)
342 return NO_ERROR;
343
344 kest_profile *profile = (kest_profile*)data;
345
347
348 if (!str)
349 return ERR_ALLOC_FAIL;
350
351 page->data_struct = str;
352
353 str->profile = profile;
354
355 profile->view_page = page;
356
357 int ret_val;
358 int alloc_fail = 0;
359
360 kest_effect *effect;
361
362 int i = 0;
363 kest_effect_pll *current = profile->pipeline.effects;
364
365 KEST_PRINTF("Entering while(current)\n");
366 while (current)
367 {
368 effect = current->data;
369
371 if (effect && !effect->view_page)
372 {
373 ret_val = kest_effect_init_view_page(effect, page);
374 if (ret_val != NO_ERROR)
375 {
376 // kill self
377 }
378 else
379 {
380 effect->view_page->create_ui(effect->view_page);
381 }
382 }
383
384 current = current->next;
385 }
386
388
389 str->play = ui_page_add_bottom_button(page, LV_SYMBOL_PLAY, profile_view_play_button_cb);
390 str->plus = ui_page_add_bottom_button(page, LV_SYMBOL_PLUS, enter_effect_selector_cb);
391 str->save = ui_page_add_bottom_button(page, LV_SYMBOL_SAVE, save_button_cb);
392
393 #ifndef USE_SDCARD
395 #endif
396
397 if (!profile->unsaved_changes)
399
401
402 ui_page_add_left_panel_button(page, LV_SYMBOL_LIST, menu_button_cb);
404
405 str->rep.representee = profile;
406
407 kest_profile_add_representation(profile, &str->rep);
408
409 ret_val = NO_ERROR;
410 if (alloc_fail) ret_val = ERR_ALLOC_FAIL;
411 else page->configured = 1;
412
413 return ret_val;
414}
415
417{
418 if (!page)
419 return ERR_NULL_PTR;
420
421 if (page->ui_created)
422 return NO_ERROR;
423
424 page->parent = &global_cxt.pages.main_menu;
425
427
428 if (!str)
429 return ERR_BAD_ARGS;
430
431 kest_profile *profile = str->profile;
432
433 if (!profile)
434 return ERR_BAD_ARGS;
435
436 if (page->panel->text)
437 {
438 // Prevent a minor memory leak
439 // After I figure out ownership/nullification
440 }
441
442 if (!profile->name)
443 {
444 KEST_PRINTF("create_profile_view_ui. profile->name = NULL\n");
446 }
447
448 KEST_PRINTF("create_profile_view_ui. profile->name = %s\n", profile->name);
449
450 page->panel->text = profile->name;
451
454
455 KEST_PRINTF("profile->active = %d\n", profile->active);
456
457 if (profile->active)
458 {
460 }
461
462 if (!str->profile->unsaved_changes)
463 {
465 }
466
467 page->ui_created = 1;
468
469 return NO_ERROR;
470}
471
473{
474 KEST_PRINTF("enter_profile_view\n");
475 if (!page)
476 return ERR_NULL_PTR;
477
479
480 if (str)
481 global_cxt.working_profile = str->profile;
482 KEST_PRINTF("set working profile\n");
483 global_cxt.pages.effect_selector.parent = page;
484 KEST_PRINTF("enter_profile_view done\n");
485 return NO_ERROR;
486}
487
489{
490 KEST_PRINTF("profile_view_append_effect\n");
491 if (!page)
492 return ERR_NULL_PTR;
493
495
496 if (!str)
497 return ERR_BAD_ARGS;
498
500
501 if (page->ui_created)
502 {
504 }
505
506 KEST_PRINTF("profile_view_append_effect done; effect->view_page = %p\n", effect->view_page);
507 return NO_ERROR;
508}
509
511{
512 if (!page)
513 return ERR_NULL_PTR;
514
515
516
517 return NO_ERROR;
518}
519
520
522{
523 if (!page)
524 return ERR_NULL_PTR;
525
527
528 return ERR_UNIMPLEMENTED;
529
530 return NO_ERROR;
531}
532
534{
535 if (!page)
536 return ERR_NULL_PTR;
537
538
539
540 return NO_ERROR;
541}
542
543
545{
546 if (!page)
547 return ERR_NULL_PTR;
548
549 return NO_ERROR;
550}
551
553{
554 if (!page)
555 return ERR_NULL_PTR;
556
557 if (!page->panel)
558 return ERR_BAD_ARGS;
559
560
561
562 return NO_ERROR;
563}
564
566{
567 if (!page)
568 return ERR_NULL_PTR;
569
571
572
573
574 return NO_ERROR;
575}
576
577void profile_view_rep_update(void *representer, void *representee)
578{
579 KEST_PRINTF("profile_view_rep_update. representer = %p, representee = %p\n", representer, representee);
580
581 kest_ui_page *page = (kest_ui_page*)representer;
582 kest_profile *profile = (kest_profile*)representee;
583
584 if (!page || !profile)
585 return;
586
587 ui_page_set_title(page, profile->name);
588
590 KEST_PRINTF("profile->active = %d, str = %p, \n", profile->active, str);
591 if (!str)
592 return;
593
594 if (profile->active)
595 {
597 }
598 else
599 {
601 }
602
603 #ifdef USE_SDCARD
604 if (profile->unsaved_changes)
605 {
607 }
608 else
609 {
611 }
612 #endif
613
614 KEST_PRINTF("profile_view_rep_update done\n");
615}
void kest_free(void *ptr)
Definition kest_alloc.c:32
void * kest_alloc(size_t size)
Definition kest_alloc.c:11
char * kest_strndup(const char *str, size_t n)
Definition kest_alloc.c:73
int kest_button_disable(kest_button *button)
int kest_active_button_create_ui(kest_active_button *button, lv_obj_t *parent)
kest_active_button * kest_active_button_array_append_new(kest_active_button_array *array, void *data, char *label)
int kest_active_button_array_create_ui(kest_active_button_array *array, lv_obj_t *parent)
int kest_button_enable(kest_button *button)
int kest_active_button_array_set_length(kest_active_button_array *array, int n)
kest_active_button_array * kest_active_button_array_new()
#define KEST_ACTIVE_BUTTON_ARRAY_FLAG_DELETEABLE
#define KEST_ACTIVE_BUTTON_ARRAY_FLAG_MOVEABLE
int set_active_profile(kest_profile *profile)
const char * kest_effect_name(kest_effect *effect)
Definition kest_effect.c:17
int kest_effect_init_view_page(kest_effect *effect, struct kest_ui_page *parent)
void enter_effect_selector_cb(lv_event_t *e)
#define ERR_ALLOC_FAIL
#define ERR_BAD_ARGS
#define NO_ERROR
#define ERR_UNIMPLEMENTED
#define ERR_NULL_PTR
kest_context global_cxt
Definition kest_int.c:12
#define KEST_PRINTF(...)
Definition kest_printf.h:10
int kest_profile_if_active_update_fpga(kest_profile *profile)
int kest_profile_remove_effect(kest_profile *profile, uint16_t id)
int kest_profile_add_representation(kest_profile *profile, kest_representation *rep)
int kest_profile_save(kest_profile *profile)
int kest_profile_update_representations(kest_profile *profile)
int kest_profile_move_effect(kest_profile *profile, int new_pos, int old_pos)
int kest_profile_set_default_name_from_id(kest_profile *profile)
#define PROFILE_NAME_MAX_LEN
Definition kest_profile.h:4
int init_profile_settings_page(kest_ui_page *page)
int configure_profile_settings_page(kest_ui_page *page, void *data)
void profile_view_save_name_cb(lv_event_t *e)
int profile_view_save_name(kest_ui_page *page)
int create_profile_view_ui(kest_ui_page *page)
void profile_view_revert_name(lv_event_t *e)
int profile_view_effect_moved_cb(kest_active_button *button)
int profile_view_refresh_save_button(kest_ui_page *page)
int free_profile_view(kest_ui_page *page)
void profile_view_play_button_cb(lv_event_t *e)
void profile_view_enter_settings_page_cb(lv_event_t *e)
int enter_profile_view(kest_ui_page *page)
kest_ui_page * create_profile_view_for(kest_profile *profile)
void profile_view_rep_update(void *representer, void *representee)
int profile_view_recalculate_indices(kest_ui_page *page)
int profile_view_append_effect(kest_ui_page *page, kest_effect *effect)
int configure_profile_view(kest_ui_page *page, void *data)
int profile_view_set_left_button_mode(kest_ui_page *page, int mode)
void profile_view_enter_main_menu_cb(lv_event_t *e)
int init_profile_view(kest_ui_page *page)
int profile_view_refresh_play_button(kest_ui_page *page)
int profile_view_change_name(kest_ui_page *page, char *name)
int profile_view_effect_delete_cb(kest_active_button *button)
int profile_view_effect_click_cb(kest_active_button *button)
int kest_sequence_begin_at(kest_sequence *sequence, kest_profile *profile)
kest_ui_page_panel * new_panel()
Definition kest_ui.c:991
int ui_page_set_title_rw(kest_ui_page *page, lv_event_cb_t save_cb, lv_event_cb_t cancel_cb)
Definition kest_ui.c:1335
int ui_page_add_left_panel_button(kest_ui_page *page, const char *label, lv_event_cb_t cb)
Definition kest_ui.c:1171
int enter_ui_page_forwards(kest_ui_page *page)
Definition kest_ui.c:299
kest_button * ui_page_add_bottom_button(kest_ui_page *page, const char *label, lv_event_cb_t cb)
Definition kest_ui.c:1308
void hide_keyboard()
Definition kest_ui.c:769
int ui_page_set_title(kest_ui_page *page, const char *text)
Definition kest_ui.c:1066
int ui_page_create_base_ui(kest_ui_page *page)
Definition kest_ui.c:1207
int enter_ui_page_backwards(kest_ui_page *page)
Definition kest_ui.c:354
int init_ui_page(kest_ui_page *page)
Definition kest_ui.c:152
int ui_page_add_right_panel_button(kest_ui_page *page, const char *label, lv_event_cb_t cb)
Definition kest_ui.c:1189
#define KEST_UI_PAGE_PROF_VIEW
Definition kest_ui.h:80
int(* moved_cb)(struct kest_active_button *button)
int(* clicked_cb)(struct kest_active_button *button)
int(* del_button_cb)(struct kest_active_button *button)
uint16_t id
Definition kest_effect.h:21
struct kest_profile * profile
Definition kest_effect.h:37
kest_effect_pll * effects
kest_representation rep
kest_active_button_array * array
kest_ui_page * settings_page
kest_pipeline pipeline
uint16_t id
void(* update)(void *representer, void *representee)
lv_obj_t * title
Definition kest_ui.h:51
int ui_created
Definition kest_ui.h:107
kest_ui_page_panel * panel
Definition kest_ui.h:94
int(* create_ui)(struct kest_ui_page *page)
Definition kest_ui.h:97
lv_obj_t * container
Definition kest_ui.h:92
struct kest_ui_page * parent
Definition kest_ui.h:109
void * data_struct
Definition kest_ui.h:104
int configured
Definition kest_ui.h:106
int(* enter_page)(struct kest_ui_page *page)
Definition kest_ui.h:100
int(* free_all)(struct kest_ui_page *page)
Definition kest_ui.h:99
int(* configure)(struct kest_ui_page *page, void *data)
Definition kest_ui.h:96