3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 0
8static const char *FNAME =
"kest_parameter_widget.c";
53 if (!pw || !pw->
param)
66 if (!pw || !pw->
param)
89 KEST_PRINTF(
"parameter_widget_update_value; parameter %d.%d.%d, \"%s\", value %f\n",
100 KEST_PRINTF(
"min/max for PW: %.03f, %.03f\n", min, max);
102 if (fabsf(max - min) < 1e-6)
112 (logf(max) - logf(min)));
126 lv_slider_set_value(pw->
obj, val, LV_ANIM_ON);
130 lv_arc_set_value(pw->
obj, val);
177 #ifdef KEST_ENABLE_REPRESENTATIONS
178 kest_representation_pll_safe_append(¶m->reps, &pw->
rep);
205 KEST_PRINTF(
"NULL pw pointer passed to parameter_widget_change_cb_inner");
211 KEST_PRINTF(
"parameter_widget_change_cb_inner called on parameter widget with NULL parameter");
227 val = (float)lv_slider_get_value(pw->
obj);
231 val = (float)lv_arc_get_value(pw->
obj);
240 float lnmin = logf(min);
241 float lnmax = logf(max);
243 val = expf(lnmin + val * (lnmax - lnmin));
247 val = min + val * (max - min);
257 queue_msg_to_teensy(msg);
276 KEST_PRINTF(
"NULL pw pointer passed to parameter_widget_change_cb");
300 KEST_PRINTF(
"parameter_widget_create_ui_no_callback(pw = %p, parent = %p)\n", pw, parent);
301 if (!pw || !pw->
param || !parent)
308 KEST_PRINTF(
"parameter_widget_create_ui_no_callback, parameter %d.%d.%d, \"%s\" (%s). param->min_expr = %p, param->max_expr = %p\n",
321 lv_obj_align(pw->
obj, LV_ALIGN_CENTER, 0, 20);
328 lv_obj_align_to(pw->
name_label, pw->
obj, LV_ALIGN_OUT_TOP_LEFT, 20, -35);
331 lv_obj_align_to(pw->
val_label, pw->
obj, LV_ALIGN_OUT_TOP_RIGHT, 30, -35);
347 lv_obj_align_to(pw->
name_label, pw->
obj, LV_ALIGN_OUT_TOP_MID, 0, 20);
350 lv_obj_align_to(pw->
val_label, pw->
obj, LV_ALIGN_OUT_BOTTOM_LEFT, 15, 0);
358 lv_obj_align(pw->
obj, LV_ALIGN_CENTER, 0, 30);
365 lv_obj_align_to(pw->
name_label, pw->
obj, LV_ALIGN_TOP_MID, 0, -30);
368 lv_obj_align_to(pw->
val_label, pw->
obj, LV_ALIGN_OUT_BOTTOM_MID, -5, 15);
378 lv_obj_align(pw->
obj, LV_ALIGN_CENTER, 0, -15);
381 lv_arc_set_rotation(pw->
obj, 135);
382 lv_arc_set_bg_angles(pw->
obj, 0, 270);
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);
456 KEST_PRINTF(
"setting_widget_update_value(sw = %p)\n", sw);
467 ?
"SETTING_WIDGET_DROPDOWN"
469 ?
"SETTING_WIDGET_SWITCH"
471 ?
"SETTING_WIDGET_FIELD"
485 lv_dropdown_set_selected(sw->
obj, i);
497 lv_textarea_set_text(sw->
obj, buf);
552 lv_dropdown_get_selected_str(sw->
obj, buf, 128);
554 for (
int i = 0; i < setting->
n_options; i++)
556 if (strncmp(buf, setting->
options[i].
name, 128) == 0)
604 int valid_string = 0;
607 for (
int i = 0; content[i]; i++)
609 if (content[i] <
'0' || content[i] >
'9')
611 if (content[i] ==
'.')
617 for (
int j = i; content[j]; j++)
619 content[j] = content[j + 1];
630 for (
int i = 0; content[i]; i++)
632 read_int = read_int * 10 + (int)((uint8_t)content[i] - (uint8_t)
'0');
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",
648 #ifdef KEST_ENABLE_FPGA
650 KEST_PRINTF(
"Setting widget value changed from %d to %d; reprogramming FPGA in light. profile = %p\n",
661 queue_msg_to_teensy(msg);
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);
674 lv_obj_clear_state(sw->
obj, LV_STATE_FOCUSED);
715 lv_obj_add_state(sw->
obj, LV_STATE_FOCUSED);
742 KEST_PRINTF(
"setting_widget_change_cb_inner. value = %d\n", value);
746 queue_msg_to_teensy(msg);
774 KEST_PRINTF(
"setting_widget_create_ui(sw = %p, parent = %p)", sw, parent);
781 KEST_PRINTF(
"setting_widget_create_ui line %d\n", __LINE__);
785 KEST_PRINTF(
"setting_widget_create_ui line %d\n", __LINE__);
808 if (!sw || !sw->
setting || !parent)
810 KEST_PRINTF(
"setting_widget_create_ui_no_callback(sw = %p, parent = %p)\n", sw, parent);
816 lv_obj_clear_flag(sw->
container, LV_OBJ_FLAG_SCROLLABLE);
819 ?
"SETTING_WIDGET_DROPDOWN"
821 ?
"SETTING_WIDGET_SWITCH"
823 ?
"SETTING_WIDGET_FIELD"
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);
837 lv_obj_set_flex_grow(sw->
label, 2);
840 lv_obj_remove_style_all(sw->
pad);
843 lv_dropdown_clear_options(sw->
obj);
853 lv_dropdown_close(sw->
obj);
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);
867 lv_obj_set_flex_grow(sw->
label, 2);
870 lv_obj_remove_style_all(sw->
pad);
873 lv_obj_set_style_text_align(sw->
obj, LV_TEXT_ALIGN_RIGHT, 0);
874 lv_textarea_set_one_line(sw->
obj,
true);
881 KEST_PRINTF(
"setting_widget_create_ui_no_callback nearly finished\n");
884 KEST_PRINTF(
"setting_widget_create_ui_no_callback done\n");
void kest_free(void *ptr)
char * kest_strndup(const char *str, size_t n)
kest_profile * cxt_get_profile_by_id(kest_context *cxt, uint16_t profile_id)
#define CONTEXT_PROFILE_ID
const char * kest_error_code_to_string(int error_code)
#define ERR_UNIMPLEMENTED
int format_float(char *buf, float val, int max_len)
#define IMPLEMENT_LINKED_PTR_LIST(X)
int kest_parameter_trigger_update(kest_parameter *param, float target)
#define PARAMETER_SCALE_LOGARITHMIC
int kest_profile_if_active_update_fpga(kest_profile *profile)
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)
#define STANDARD_CONTAINER_WIDTH
struct kest_expression * min_expr
const char * name_internal
struct kest_expression * max_expr
void(* update)(void *representer, void *representee)
kest_setting_option * options