Kestrel Interface
Loading...
Searching...
No Matches
kest_parameter_widget.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#include "kest_param_update.h"
7
8static const char *FNAME = "kest_parameter_widget.c";
9
12
14
15void param_widget_rep_update(void *representer, void *representee)
16{
17 kest_parameter_widget *pw = representer;
18 kest_parameter *param = representee;
19
20 if (!pw || !param)
21 return;
22
25
26 return;
27}
28
30{
31 if (!pw)
32 return ERR_NULL_PTR;
33
34 pw->param = NULL;
35
36 pw->obj = NULL;
37 pw->name_label = NULL;
38 pw->val_label = NULL;
39 pw->container = NULL;
40 pw->parent = NULL;
41
42 pw->val_label_text[0] = 0;
43
44 pw->rep.representer = pw;
45 pw->rep.representee = NULL;
47
48 return NO_ERROR;
49}
50
52{
53 if (!pw || !pw->param)
54 return;
55
57
59 {
60 snprintf(&pw->val_label_text[i], PARAM_WIDGET_LABEL_BUFSIZE - i, "%s", pw->param->units);
61 }
62}
63
65{
66 if (!pw || !pw->param)
67 return;
68
70
72 {
73 snprintf(&pw->val_label_text[i], PARAM_WIDGET_LABEL_BUFSIZE - i, "%s", pw->param->units);
74 }
75}
76
78{
79 if (!pw)
80 return ERR_NULL_PTR;
81
82 if (!pw->param || !pw->obj)
83 return ERR_BAD_ARGS;
84
85 kest_parameter *param = pw->param;
86 kest_expr_scope *scope = NULL;
87 kest_effect *effect = NULL;
88
89 KEST_PRINTF("parameter_widget_update_value; parameter %d.%d.%d, \"%s\", value %f\n",
90 param->id.profile_id, param->id.effect_id, param->id.parameter_id,
91 param->name ? param->name : "(NULL)", param->value);
92
93 uint32_t val;
94
95 kest_interval range = kest_parameter_get_range(pw->param);
96
97 float min = range.a;
98 float max = range.b;
99
100 KEST_PRINTF("min/max for PW: %.03f, %.03f\n", min, max);
101
102 if (fabsf(max - min) < 1e-6)
103 {
104 val = (int)PARAMETER_WIDGET_RANGE_SIZE/2;
105 }
106 else
107 {
109 {
110
111 val = PARAMETER_WIDGET_RANGE_SIZE * ((logf(pw->param->value) - logf(min)) /
112 (logf(max) - logf(min)));
113 }
114 else
115 {
116 val = PARAMETER_WIDGET_RANGE_SIZE * ((pw->param->value - min) /
117 (max - min));
118 }
119 }
120
121 switch (pw->param->widget_type)
122 {
126 lv_slider_set_value(pw->obj, val, LV_ANIM_ON);
127 break;
128
129 default:
130 lv_arc_set_value(pw->obj, val);
131 break;
132 }
133
134 return NO_ERROR;
135}
136
138{
139 if (!pw)
140 return;
141
143
144 int len = strlen(pw->val_label_text);
145
146 if (pw->val_label)
147 lv_label_set_text(pw->val_label, pw->val_label_text);
148
149 return;
150}
151
153{
154 if (!pw)
155 return;
156
158
159 int len = strlen(pw->val_label_text);
160
161 if (pw->val_label)
162 lv_label_set_text(pw->val_label, pw->val_label_text);
163
164 return;
165}
166
168{
169 if (!pw || !param)
170 return ERR_NULL_PTR;
171
172 pw->param = param;
173 pw->profile = profile;
174
175 pw->parent = parent;
176
177 #ifdef KEST_ENABLE_REPRESENTATIONS
178 kest_representation_pll_safe_append(&param->reps, &pw->rep);
179 pw->rep.representee = param;
180 #endif
181
183
184 return NO_ERROR;
185}
186
187void parameter_widget_refresh_cb(lv_event_t *event)
188{
189 kest_parameter_widget *pw = lv_event_get_user_data(event);
190
191 if (!pw)
192 {
193 KEST_PRINTF("NULL pw pointer");
194 return;
195 }
196
199}
200
202{
203 if (!pw)
204 {
205 KEST_PRINTF("NULL pw pointer passed to parameter_widget_change_cb_inner");
206 return;
207 }
208
209 if (!pw->param)
210 {
211 KEST_PRINTF("parameter_widget_change_cb_inner called on parameter widget with NULL parameter");
212 return;
213 }
214
215 float val;
216
217 kest_interval range = kest_parameter_get_range(pw->param);
218
219 float min = range.a;
220 float max = range.b;
221
222 switch (pw->param->widget_type)
223 {
227 val = (float)lv_slider_get_value(pw->obj);
228 break;
229
230 default:
231 val = (float)lv_arc_get_value(pw->obj);
232 break;
233 }
234
236
237 switch (pw->param->scale)
238 {
240 float lnmin = logf(min);
241 float lnmax = logf(max);
242
243 val = expf(lnmin + val * (lnmax - lnmin));
244 break;
245
246 default:
247 val = min + val * (max - min);
248 break;
249 }
250
252
254
255 #ifdef USE_TEENSY
256 kest_message msg = create_m_message(KEST_MESSAGE_SET_PARAM_VALUE, "sssf", pw->param->id.profile_id, pw->param->id.effect_id, pw->param->id.parameter_id, pw->param->value);
257 queue_msg_to_teensy(msg);
258 #endif
259
260 if (pw->profile)
261 {
262 pw->profile->unsaved_changes = 1;
263 }
264 else if (pw->param->id.profile_id == CONTEXT_PROFILE_ID)
265 {
266 // do something
267 }
268}
269
270void parameter_widget_change_cb(lv_event_t *event)
271{
272 kest_parameter_widget *pw = lv_event_get_user_data(event);
273
274 if (!pw)
275 {
276 KEST_PRINTF("NULL pw pointer passed to parameter_widget_change_cb");
277 return;
278 }
279
281}
282
284{
285 if (!pw)
286 return ERR_NULL_PTR;
287
288 int ret_val;
289 if ((ret_val = parameter_widget_create_ui_no_callback(pw, parent)) != NO_ERROR)
290 return ret_val;
291
292 lv_obj_add_event_cb(pw->obj, parameter_widget_change_cb, LV_EVENT_VALUE_CHANGED, pw);
293
294 return NO_ERROR;
295}
296
298{
299
300 KEST_PRINTF("parameter_widget_create_ui_no_callback(pw = %p, parent = %p)\n", pw, parent);
301 if (!pw || !pw->param || !parent)
302 return ERR_NULL_PTR;
303
304 pw->container = lv_obj_create(parent);
305 KEST_PRINTF("pw->container = %p\n", pw->container);
306 lv_obj_remove_style_all(pw->container);
307
308 KEST_PRINTF("parameter_widget_create_ui_no_callback, parameter %d.%d.%d, \"%s\" (%s). param->min_expr = %p, param->max_expr = %p\n",
309 pw->param->id.profile_id,
310 pw->param->id.effect_id,
311 pw->param->id.parameter_id,
312 pw->param->name,
313 pw->param->name_internal,
314 pw->param->min_expr,
315 pw->param->max_expr);
316 switch (pw->param->widget_type)
317 {
319 pw->obj = lv_slider_create(pw->container);
320
321 lv_obj_align(pw->obj, LV_ALIGN_CENTER, 0, 20);
322 lv_obj_set_size(pw->obj, HSLIDER_SIZE_W, HSLIDER_SIZE_H);
323
325
326 pw->name_label = lv_label_create(pw->container);
327 lv_label_set_text(pw->name_label, pw->param->name);
328 lv_obj_align_to(pw->name_label, pw->obj, LV_ALIGN_OUT_TOP_LEFT, 20, -35);
329
330 pw->val_label = lv_label_create(pw->container);
331 lv_obj_align_to(pw->val_label, pw->obj, LV_ALIGN_OUT_TOP_RIGHT, 30, -35);
332
333 lv_slider_set_range(pw->obj, 0, (int)PARAMETER_WIDGET_RANGE_SIZE);
334 break;
335
337 pw->obj = lv_slider_create(pw->container);
338
339 lv_obj_align(pw->obj, LV_ALIGN_CENTER, 0, VSLIDER_PAD_H / 2);
340 lv_obj_set_size(pw->obj, VSLIDER_SIZE_W, VSLIDER_SIZE_H);
341
342
344
345 pw->name_label = lv_label_create(pw->container);
346 lv_label_set_text(pw->name_label, pw->param->name);
347 lv_obj_align_to(pw->name_label, pw->obj, LV_ALIGN_OUT_TOP_MID, 0, 20);
348
349 pw->val_label = lv_label_create(pw->container);
350 lv_obj_align_to(pw->val_label, pw->obj, LV_ALIGN_OUT_BOTTOM_LEFT, 15, 0);
351
352 lv_slider_set_range(pw->obj, 0, (int)PARAMETER_WIDGET_RANGE_SIZE);
353 break;
354
356 pw->obj = lv_slider_create(pw->container);
357
358 lv_obj_align(pw->obj, LV_ALIGN_CENTER, 0, 30);
359 lv_obj_set_size(pw->obj, VSLIDER_TALL_SIZE_W, VSLIDER_TALL_SIZE_H);
360
362
363 pw->name_label = lv_label_create(pw->container);
364 lv_label_set_text(pw->name_label, pw->param->name);
365 lv_obj_align_to(pw->name_label, pw->obj, LV_ALIGN_TOP_MID, 0, -30);
366
367 pw->val_label = lv_label_create(pw->container);
368 lv_obj_align_to(pw->val_label, pw->obj, LV_ALIGN_OUT_BOTTOM_MID, -5, 15);
369
370 lv_slider_set_range(pw->obj, 0, (int)PARAMETER_WIDGET_RANGE_SIZE);
371 break;
372
373 default:
374 pw->obj = lv_arc_create(pw->container);
375
377
378 lv_obj_align(pw->obj, LV_ALIGN_CENTER, 0, -15);
379 lv_obj_set_size(pw->obj, VIRTUAL_POT_SIZE_W, VIRTUAL_POT_SIZE_H);
380
381 lv_arc_set_rotation(pw->obj, 135);
382 lv_arc_set_bg_angles(pw->obj, 0, 270);
383 lv_arc_set_range(pw->obj, 0, (int)PARAMETER_WIDGET_RANGE_SIZE);
384
385 pw->name_label = lv_label_create(pw->container);
386 lv_label_set_text(pw->name_label, pw->param->name);
387 lv_obj_align(pw->name_label, LV_ALIGN_BOTTOM_MID, 0, 0);
388 lv_obj_set_size(pw->name_label, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
389
390 pw->val_label = lv_label_create(pw->obj);
391 lv_obj_center(pw->val_label);
392 break;
393 }
394
397
398 return NO_ERROR;
399}
400
401
402//
403//
404//
405// === setting widget ===
406//
407//
408//
409
411{
412 if (!pw)
413 return;
414
415 // Currently the kest_parameter_widget struct contains nothing that
416 // it owns itself. This may change !
417 kest_free(pw);
418}
419
421
422void setting_widget_rep_update(void *representer, void *representee)
423{
424 kest_setting_widget *sw = representer;
425 kest_setting *setting = representee;
426
427 if (!sw || !setting)
428 return;
429
431}
432
434{
435 if (!sw)
436 return ERR_NULL_PTR;
437
438 sw->setting = NULL;
439
440 sw->obj = NULL;
441
443 sw->saved_field_text = NULL;
444
445 sw->parent = NULL;
446
447 sw->rep.representer = sw;
448 sw->rep.representee = NULL;
450
451 return NO_ERROR;
452}
453
455{
456 KEST_PRINTF("setting_widget_update_value(sw = %p)\n", sw);
457 if (!sw)
458 return ERR_NULL_PTR;
459
460 KEST_PRINTF(" ... sw->setting = %p, sw->obj = %p\n", sw->setting, sw->obj);
461 if (!sw->setting || !sw->obj)
462 return ERR_BAD_ARGS;
463
464 char buf[32];
465
466 KEST_PRINTF("sw->type = %d = %s\n", sw->type, (sw->type == SETTING_WIDGET_DROPDOWN)
467 ? "SETTING_WIDGET_DROPDOWN"
468 : ((sw->type == SETTING_WIDGET_SWITCH)
469 ? "SETTING_WIDGET_SWITCH"
470 : ((sw->type == SETTING_WIDGET_FIELD)
471 ? "SETTING_WIDGET_FIELD"
472 : "??")));
473 switch (sw->type)
474 {
476 KEST_PRINTF("sw->setting->options = %p, sw->setting->n_options = %d\n", sw->setting->options, sw->setting->n_options);
477 if (!sw->setting->options)
478 return ERR_BAD_ARGS;
479
480 for (int i = 0; i < sw->setting->n_options; i++)
481 {
482 KEST_PRINTF("Option %d: value %d, name \"%s\"\n", i, sw->setting->options[i].value, sw->setting->options[i].name);
483 if (sw->setting->options[i].value == sw->setting->value)
484 {
485 lv_dropdown_set_selected(sw->obj, i);
486 }
487 }
488 break;
489
491 break;
492
494 KEST_PRINTF("It is a field\n");
495 snprintf(buf, 32, "%d", sw->setting->value);
496 KEST_PRINTF("Set textarea text to \"%s\"\n", buf);
497 lv_textarea_set_text(sw->obj, buf);
498 break;
499
500 default:
501 return ERR_BAD_ARGS;
502 break;
503 }
504
505 return NO_ERROR;
506}
507
509{
510 if (!sw || !setting)
511 return ERR_NULL_PTR;
512
513 sw->setting = setting;
514 sw->profile = profile;
515 sw->parent = parent;
516
517 sw->type = sw->setting->widget_type;
518
519 //kest_representation_pll_safe_append(&setting->reps, &sw->rep);
520
521 //sw->rep.representee = setting;
522
523 return NO_ERROR;
524}
525
526void setting_widget_refresh_cb(lv_event_t *event)
527{
528 kest_setting_widget *sw = lv_event_get_user_data(event);
529
530 if (!sw)
531 return;
532}
533
535{
536 if (!sw || !target)
537 return ERR_NULL_PTR;
538
539 if (!sw->obj)
540 return ERR_BAD_ARGS;
541
542 kest_setting *setting = sw->setting;
543
544 if (!setting)
545 return ERR_BAD_ARGS;
546
547 char buf[128];
548 int found = 0;
549 switch (sw->type)
550 {
552 lv_dropdown_get_selected_str(sw->obj, buf, 128);
553
554 for (int i = 0; i < setting->n_options; i++)
555 {
556 if (strncmp(buf, setting->options[i].name, 128) == 0)
557 {
558 found = 1;
559 *target = setting->options[i].value;
560 }
561 }
562
563 if (!found)
564 {
565 return ERR_BAD_ARGS;
566 }
567 break;
568
569 default:
570 return ERR_UNIMPLEMENTED;
571 }
572
573 return NO_ERROR;
574}
575
576
578{
579 if (!sw)
580 return;
581}
582
583void sw_field_save_cb(lv_event_t *e)
584{
585 kest_setting_widget *sw = lv_event_get_user_data(e);
586
587 if (!sw)
588 return;
589
590 if (!sw->setting)
591 return;
592
593 // Parse an int!
594 kest_profile *profile;
595
596 char *content = kest_strndup(lv_textarea_get_text(sw->obj), 32);
597
598 if (!content)
599 {
600 return;
601 }
602
603 int read_int = 0;
604 int valid_string = 0;
605
606 // ... tbh just delete anything not a number
607 for (int i = 0; content[i]; i++)
608 {
609 if (content[i] < '0' || content[i] > '9')
610 {
611 if (content[i] == '.')
612 {
613 content[i] = 0;
614 break;
615 }
616
617 for (int j = i; content[j]; j++)
618 {
619 content[j] = content[j + 1];
620 }
621 }
622 }
623
624 if (!content[0])
625 {
626 sw_field_reject(sw);
627 return;
628 }
629
630 for (int i = 0; content[i]; i++)
631 {
632 read_int = read_int * 10 + (int)((uint8_t)content[i] - (uint8_t)'0');
633 }
634
635 KEST_PRINTF("Read in the int %d\n", read_int);
636
637 KEST_PRINTF("read_int = binary_min(binary_max(read_int, sw->setting->min), sw->setting->max) = binary_min(binary_max(%d, %d), %d) = binary_min(%d, %d) = %d\n",
638 read_int, sw->setting->min, sw->setting->max, binary_max(read_int, sw->setting->min), sw->setting->max, binary_min(binary_max(read_int, sw->setting->min), sw->setting->max));
639 read_int = binary_min(binary_max(read_int, sw->setting->min), sw->setting->max);
640
641 if (sw->setting->value != read_int)
642 {
643 sw->setting->old_value = sw->setting->value;
644
645 sw->setting->value = read_int;
646 sw->setting->updated = 1;
647
648 #ifdef KEST_ENABLE_FPGA
650 KEST_PRINTF("Setting widget value changed from %d to %d; reprogramming FPGA in light. profile = %p\n",
651 sw->setting->old_value, sw->setting->value, profile);
652 if (profile)
653 {
655 }
656 #endif
657
658 #ifdef USE_TEENSY
659 kest_message msg = create_m_message(KEST_MESSAGE_SET_SETTING_VALUE, "ssss", sw->setting->id.profile_id, sw->setting->id.effect_id, sw->setting->id.setting_id, read_int);
660
661 queue_msg_to_teensy(msg);
662 #endif
663 }
664
665 kest_free(content);
666
667 char buf[32];
668
669 snprintf(buf, 32, "%d", read_int);
670 KEST_PRINTF("setting field value to \"%s\"\n", buf);
671 lv_textarea_set_text(sw->obj, buf);
672
674 lv_obj_clear_state(sw->obj, LV_STATE_FOCUSED);
675
676 KEST_PRINTF("sw_field_save_cb done\n");
677}
678
679void sw_field_cancel_cb(lv_event_t *e)
680{
681 KEST_PRINTF("sw_field_cancel_cb\n");
682 kest_setting_widget *sw = lv_event_get_user_data(e);
683
684 if (!sw)
685 return;
686
687 KEST_PRINTF("%s:%d\n", __func__, __LINE__);
688 if (sw->saved_field_text)
689 {
690 KEST_PRINTF("%s:%d\n", __func__, __LINE__);
691 lv_textarea_set_text(sw->obj, sw->saved_field_text);
692 KEST_PRINTF("%s:%d\n", __func__, __LINE__);
694 KEST_PRINTF("%s:%d\n", __func__, __LINE__);
695 sw->saved_field_text = NULL;
696 KEST_PRINTF("%s:%d\n", __func__, __LINE__);
697 }
699 KEST_PRINTF("sw_field_cancel_cb done\n");
700}
701
702void edit_sw_field_cb(lv_event_t *e)
703{
704 KEST_PRINTF("edit_sw_field_cb\n");
705 kest_setting_widget *sw = lv_event_get_user_data(e);
706
707 if (!sw)
708 return;
709
710 if (!sw->obj || !sw->parent)
711 return;
712
714 KEST_PRINTF("spawned numerical keyboard\n");
715 lv_obj_add_state(sw->obj, LV_STATE_FOCUSED);
716
717 sw->saved_field_text = kest_strndup(lv_textarea_get_text(sw->obj), 32);
718 KEST_PRINTF("edit_sw_field_cb done\n");
719}
720
722{
723 if (!sw)
724 return;
725
726 int16_t value;
727
728 int ret_val;
729
730 if ((ret_val = setting_widget_calc_value(sw, &value)) != NO_ERROR)
731 {
732 KEST_PRINTF("Error %s getting setting widget value\n", kest_error_code_to_string(ret_val));
733 return;
734 }
735
736 if (sw->setting)
737 {
738 sw->setting->value = value;
739 sw->setting->updated = 1;
740 }
741
742 KEST_PRINTF("setting_widget_change_cb_inner. value = %d\n", value);
743 #ifdef USE_TEENSY
744 kest_message msg = create_m_message(KEST_MESSAGE_SET_SETTING_VALUE, "ssss", sw->setting->id.profile_id, sw->setting->id.effect_id, sw->setting->id.setting_id, value);
745
746 queue_msg_to_teensy(msg);
747 #endif
748
749 if (sw->profile)
750 {
751 sw->profile->unsaved_changes = 1;
752 }
753 else
754 {
755 // do something
756 }
757}
758
759void setting_widget_change_cb(lv_event_t *event)
760{
761 kest_setting_widget *sw = lv_event_get_user_data(event);
762
763 if (!sw)
764 {
765 KEST_PRINTF("NULL virtual sw pointer");
766 return;
767 }
768
770}
771
773{
774 KEST_PRINTF("setting_widget_create_ui(sw = %p, parent = %p)", sw, parent);
775 if (!sw)
776 return ERR_NULL_PTR;
777
778 int ret_val;
779 if ((ret_val = setting_widget_create_ui_no_callback(sw, parent)) != NO_ERROR)
780 {
781 KEST_PRINTF("setting_widget_create_ui line %d\n", __LINE__);
782 return ret_val;
783 }
784
785 KEST_PRINTF("setting_widget_create_ui line %d\n", __LINE__);
786 switch (sw->type)
787 {
789 lv_obj_add_event_cb(sw->obj, setting_widget_change_cb, LV_EVENT_VALUE_CHANGED, sw);
790 break;
791
793
794 break;
795
797 lv_obj_add_event_cb(sw->obj, edit_sw_field_cb, LV_EVENT_CLICKED, sw);
798 break;
799 }
800
801 KEST_PRINTF("setting_widget_create_ui done\n");
802 return NO_ERROR;
803}
804
806{
807
808 if (!sw || !sw->setting || !parent)
809 {
810 KEST_PRINTF("setting_widget_create_ui_no_callback(sw = %p, parent = %p)\n", sw, parent);
811 return ERR_NULL_PTR;
812 }
813
814 sw->container = lv_obj_create(parent);
815 lv_obj_remove_style_all(sw->container);
816 lv_obj_clear_flag(sw->container, LV_OBJ_FLAG_SCROLLABLE);
817
818 KEST_PRINTF("sw->type = %d = %s\n", sw->type, (sw->type == SETTING_WIDGET_DROPDOWN)
819 ? "SETTING_WIDGET_DROPDOWN"
820 : ((sw->type == SETTING_WIDGET_SWITCH)
821 ? "SETTING_WIDGET_SWITCH"
822 : ((sw->type == SETTING_WIDGET_FIELD)
823 ? "SETTING_WIDGET_FIELD"
824 : "??")));
825
826 switch (sw->setting->widget_type)
827 {
829 KEST_PRINTF("Creating label for setting %s\n", sw->setting->name);
830
831 lv_obj_set_layout(sw->container, LV_LAYOUT_FLEX);
832 lv_obj_set_flex_flow(sw->container, LV_FLEX_FLOW_ROW);
833 lv_obj_set_flex_align(sw->container, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
834
835 sw->label = lv_label_create(sw->container);
836 lv_label_set_text(sw->label, sw->setting->name);
837 lv_obj_set_flex_grow(sw->label, 2);
838
839 sw->pad = lv_obj_create(sw->container);
840 lv_obj_remove_style_all(sw->pad);
841
842 sw->obj = lv_dropdown_create(sw->container);
843 lv_dropdown_clear_options(sw->obj);
844 lv_obj_set_width(sw->obj, STANDARD_CONTAINER_WIDTH / 3);
845
847
848 for (int i = 0; i < sw->setting->n_options; i++)
849 {
850 lv_dropdown_add_option(sw->obj, sw->setting->options[i].name, i);
851 }
852
853 lv_dropdown_close(sw->obj);
854 break;
855
857 break;
858
860 lv_obj_set_layout(sw->container, LV_LAYOUT_FLEX);
861 lv_obj_set_flex_flow(sw->container, LV_FLEX_FLOW_ROW);
862 lv_obj_set_flex_align(sw->container, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
863
864 KEST_PRINTF("Creating label for setting %s\n", sw->setting->name);
865 sw->label = lv_label_create(sw->container);
866 lv_label_set_text(sw->label, sw->setting->name);
867 lv_obj_set_flex_grow(sw->label, 2);
868
869 sw->pad = lv_obj_create(sw->container);
870 lv_obj_remove_style_all(sw->pad);
871
872 sw->obj = lv_textarea_create(sw->container);
873 lv_obj_set_style_text_align(sw->obj, LV_TEXT_ALIGN_RIGHT, 0);
874 lv_textarea_set_one_line(sw->obj, true);
875 lv_obj_set_width(sw->obj, STANDARD_CONTAINER_WIDTH / 3);
876
878 break;
879 }
880
881 KEST_PRINTF("setting_widget_create_ui_no_callback nearly finished\n");
883
884 KEST_PRINTF("setting_widget_create_ui_no_callback done\n");
885
886 return NO_ERROR;
887}
888
890{
891 if (!sw)
892 return;
893
894 // Currently the kest_setting_widget struct contains nothing that
895 // it owns itself. This may change !
896 kest_free(sw);
897}
void kest_free(void *ptr)
Definition kest_alloc.c:32
char * kest_strndup(const char *str, size_t n)
Definition kest_alloc.c:73
#define STANDARD_BUTTON_SHORT_HEIGHT
Definition kest_button.h:9
kest_profile * cxt_get_profile_by_id(kest_context *cxt, uint16_t profile_id)
#define CONTEXT_PROFILE_ID
Definition kest_context.h:6
const char * kest_error_code_to_string(int error_code)
#define ERR_BAD_ARGS
#define NO_ERROR
#define ERR_UNIMPLEMENTED
#define ERR_NULL_PTR
int format_float(char *buf, float val, int max_len)
Definition kest_hfunc.c:47
#define binary_min(x, y)
Definition kest_hfunc.h:7
#define binary_max(x, y)
Definition kest_hfunc.h:6
kest_context global_cxt
Definition kest_int.c:12
#define IMPLEMENT_LINKED_PTR_LIST(X)
int kest_parameter_trigger_update(kest_parameter *param, float target)
#define PARAMETER_SCALE_LOGARITHMIC
void sw_field_cancel_cb(lv_event_t *e)
void setting_widget_rep_update(void *representer, void *representee)
void param_widget_rep_update(void *representer, void *representee)
int setting_widget_create_ui_no_callback(kest_setting_widget *sw, lv_obj_t *parent)
int configure_setting_widget(kest_setting_widget *sw, kest_setting *setting, kest_profile *profile, kest_ui_page *parent)
int setting_widget_create_ui(kest_setting_widget *sw, lv_obj_t *parent)
int setting_widget_calc_value(kest_setting_widget *sw, int16_t *target)
void sw_field_save_cb(lv_event_t *e)
void sw_field_reject(kest_setting_widget *sw)
int parameter_widget_create_ui_no_callback(kest_parameter_widget *pw, lv_obj_t *parent)
int nullify_setting_widget(kest_setting_widget *sw)
int configure_parameter_widget(kest_parameter_widget *pw, kest_parameter *param, kest_profile *profile, kest_ui_page *parent)
void edit_sw_field_cb(lv_event_t *e)
void format_parameter_widget_value_label_v(kest_parameter_widget *pw, float v)
void parameter_widget_update_value_label_v(kest_parameter_widget *pw, float v)
int nullify_parameter_widget(kest_parameter_widget *pw)
int setting_widget_update_value(kest_setting_widget *sw)
void format_parameter_widget_value_label(kest_parameter_widget *pw)
void setting_widget_change_cb_inner(kest_setting_widget *sw)
void parameter_widget_change_cb(lv_event_t *event)
int parameter_widget_update_value(kest_parameter_widget *pw)
void free_parameter_widget(kest_parameter_widget *pw)
void parameter_widget_refresh_cb(lv_event_t *event)
int parameter_widget_create_ui(kest_parameter_widget *pw, lv_obj_t *parent)
void setting_widget_refresh_cb(lv_event_t *event)
void parameter_widget_update_value_label(kest_parameter_widget *pw)
void parameter_widget_change_cb_inner(kest_parameter_widget *pw)
void free_setting_widget(kest_setting_widget *sw)
void setting_widget_change_cb(lv_event_t *event)
#define VSLIDER_SIZE_H
#define VSLIDER_PAD_W
#define SETTING_WIDGET_DROPDOWN
#define VIRTUAL_POT_SIZE_W
#define VIRTUAL_POT_SIZE_H
#define VSLIDER_TALL_PAD_H
#define VPOT_PAD_H
#define SETTING_WIDGET_FIELD
#define HSLIDER_PAD_H
#define PARAM_WIDGET_VSLIDER_TALL
#define VSLIDER_TALL_PAD_W
#define HSLIDER_SIZE_H
#define PARAMETER_WIDGET_RANGE_SIZE
#define PARAM_WIDGET_VSLIDER
#define PARAM_WIDGET_LABEL_BUFSIZE
#define VSLIDER_PAD_H
#define VPOT_PAD_W
#define VSLIDER_TALL_SIZE_W
#define VSLIDER_TALL_SIZE_H
#define HSLIDER_SIZE_W
#define PARAM_WIDGET_HSLIDER
#define SETTING_WIDGET_SWITCH
#define HSLIDER_PAD_W
#define VSLIDER_SIZE_W
#define KEST_PRINTF(...)
Definition kest_printf.h:10
int kest_profile_if_active_update_fpga(kest_profile *profile)
void hide_keyboard()
Definition kest_ui.c:769
void spawn_numerical_keyboard(lv_obj_t *parent, lv_obj_t *text_area, void(*ok_cb)(lv_event_t *), void *ok_arg, void(*cancel_cb)(lv_event_t *), void *cancel_arg)
Definition kest_ui.c:759
#define STANDARD_CONTAINER_WIDTH
Definition kest_ui.h:38
char val_label_text[PARAM_WIDGET_LABEL_BUFSIZE]
struct kest_profile * profile
struct kest_expression * min_expr
const char * name_internal
const char * name
struct kest_expression * max_expr
const char * units
kest_parameter_id id
void(* update)(void *representer, void *representee)
struct kest_profile * profile
kest_representation rep
kest_setting_option * options
kest_setting_id id
const char * name
lv_obj_t * screen
Definition kest_ui.h:89