static void rebuild_offset_screen(offset_screen_t* s) { uint32_t num_buttons = 0; button_spec_t buttons[3]; char* text; char* units_subtext; char* probe1_subtext = NULL; char* probe2_subtext = NULL; bool sensor1_connected = get_sensor_conn_status(SENSOR_1); bool sensor2_connected = get_sensor_conn_status(SENSOR_2); sensor_config_t* sensor1_cfg = get_sensor_cfg(SENSOR_1); sensor_config_t* sensor2_cfg = get_sensor_cfg(SENSOR_2); quantity_t probe1_offset = app_cfg_get_probe_offset(sensor1_cfg->sensor_serial); quantity_t probe2_offset = app_cfg_get_probe_offset(sensor2_cfg->sensor_serial); if (app_cfg_get_temp_unit() == UNIT_TEMP_DEG_F) { units_subtext = "F"; } else { probe1_offset.value *= (5.0f / 9.0f); probe2_offset.value *= (5.0f / 9.0f); units_subtext = "C"; } if (sensor1_connected == true) { text = "Probe 1 Offset"; probe1_subtext = malloc(128); snprintf(probe1_subtext, 128, "Probe 1 Offset: %d.%d %s", (int)(probe1_offset.value), ((int)(fabs(probe1_offset.value) * 10.0f)) % 10, units_subtext); add_button_spec(buttons, &num_buttons, probe1_offset_button_clicked, img_temp_med, AMBER, text, probe1_subtext, s); } if (sensor2_connected == true) { text = "Probe 2 Offset"; probe2_subtext = malloc(128); snprintf(probe2_subtext, 128, "Probe 2 Offset: %d.%d %s", (int)(probe2_offset.value), ((int)(fabs(probe2_offset.value) * 10.0f)) % 10, units_subtext); add_button_spec(buttons, &num_buttons, probe2_offset_button_clicked, img_temp_med, MAGENTA, text, probe2_subtext, s); } button_list_set_buttons(s->button_list, buttons, num_buttons); if (probe1_subtext != NULL) free(probe1_subtext); if (probe2_subtext != NULL) free(probe2_subtext); }
static void set_controller_settings(controller_settings_screen_t* s) { uint32_t num_buttons = 0; button_spec_t buttons[16]; char* subtext; char* setpoint_subtext; switch (s->settings.setpoint_type) { case SP_STATIC: subtext = "Static Setpoint - Temp is held at fixed value"; break; case SP_TEMP_PROFILE: subtext = "Temp Profile - Temp follows customized profile"; break; default: subtext = "Invalid setpoint type!"; break; } add_button_spec(buttons, &num_buttons, setpoint_type_button_clicked, img_snowflake, CYAN, "Setpoint Type", subtext, s); setpoint_subtext = malloc(128); switch (s->settings.setpoint_type) { case SP_STATIC: { quantity_t setpoint = quantity_convert(s->settings.static_setpoint, app_cfg_get_temp_unit()); if (setpoint.unit == UNIT_TEMP_DEG_F) subtext = "F"; else subtext = "C"; snprintf(setpoint_subtext, 128, "Setpoint value: %d.%d %s", (int)(setpoint.value), ((int)(fabs(setpoint.value) * 10.0f)) % 10, subtext); add_button_spec(buttons, &num_buttons, static_setpoint_button_clicked, img_snowflake, CYAN, "Static Setpoint", setpoint_subtext, s); break; } case SP_TEMP_PROFILE: { const temp_profile_t* tp = app_cfg_get_temp_profile(s->settings.temp_profile_id); if (tp != NULL) snprintf(setpoint_subtext, 128, "Selected profile: '%s'", tp->name); else snprintf(setpoint_subtext, 128, "Selected profile: id=%u", (unsigned int)s->settings.temp_profile_id); add_button_spec(buttons, &num_buttons, temp_profile_button_clicked, img_snowflake, CYAN, "Temp Profile", setpoint_subtext, s); break; } default: break; } switch (s->output_selection) { case SELECT_1: subtext = "Use Output #1"; break; case SELECT_2: subtext = "Use Output #2"; break; case SELECT_1_2: subtext = "Use Output #1 & #2"; break; default: case SELECT_NONE: subtext = "No output"; break; } add_button_spec(buttons, &num_buttons, output_selection_button_clicked, img_plug, CYAN, "Output Selection", subtext, s); if (s->settings.output_settings[OUTPUT_1].enabled) add_button_spec(buttons, &num_buttons, output_settings_button_clicked, img_plug, CYAN, "Output 1 Settings", "Set settings for output 1", &s->settings.output_settings[OUTPUT_1]); if (s->settings.output_settings[OUTPUT_2].enabled) add_button_spec(buttons, &num_buttons, output_settings_button_clicked, img_plug, CYAN, "Output 2 Settings", "Set settings for output 2", &s->settings.output_settings[OUTPUT_2]); button_list_set_buttons(s->button_list, buttons, num_buttons); free(setpoint_subtext); }