widget_t* controller_settings_screen_create(temp_controller_id_t controller) { controller_settings_screen_t* s = calloc(1, sizeof(controller_settings_screen_t)); s->screen = widget_create(NULL, &controller_settings_widget_class, s, display_rect); widget_set_background(s->screen, BLACK, FALSE); char* title; temp_controller_id_t other_controller; if (controller == CONTROLLER_1) { title = "Controller 1 Setup"; other_controller = CONTROLLER_2; } else { title = "Controller 2 Setup"; other_controller = CONTROLLER_1; } s->button_list = button_list_screen_create(s->screen, title, back_button_clicked, s); s->controller = controller; s->settings = *app_cfg_get_controller_settings(controller); /* Convert enabled flags to selection enum */ if (s->settings.output_settings[OUTPUT_1].enabled && s->settings.output_settings[OUTPUT_2].enabled) s->output_selection = SELECT_1_2; else if (s->settings.output_settings[OUTPUT_1].enabled) s->output_selection = SELECT_1; else if (s->settings.output_settings[OUTPUT_2].enabled) s->output_selection = SELECT_2; else s->output_selection = SELECT_NONE; /* Figure out which output selections are allowed by checking which outputs are currently * being controlled by the other controller. */ const controller_settings_t* other_controller_settings = app_cfg_get_controller_settings(other_controller); s->output_selection_valid[SELECT_NONE] = true; if (!other_controller_settings->output_settings[OUTPUT_1].enabled) s->output_selection_valid[SELECT_1] = true; if (!other_controller_settings->output_settings[OUTPUT_2].enabled) s->output_selection_valid[SELECT_2] = true; if (!other_controller_settings->output_settings[OUTPUT_1].enabled && !other_controller_settings->output_settings[OUTPUT_2].enabled) s->output_selection_valid[SELECT_1_2] = true; /* If the current output selection is not valid, set it to none */ if (!s->output_selection_valid[s->output_selection]) s->output_selection = SELECT_NONE; set_controller_settings(s); return s->screen; }
static void click_output_button(button_event_t* event) { if (event->id != EVT_BUTTON_CLICK) return; widget_t* parent = widget_get_parent(event->widget); home_screen_t* s = widget_get_instance_data(parent); const controller_settings_t* controller1_settings = app_cfg_get_controller_settings(CONTROLLER_1); const controller_settings_t* controller2_settings = app_cfg_get_controller_settings(CONTROLLER_2); output_id_t output; if (event->widget == s->outputs[OUTPUT_1].button) output = OUTPUT_1; else output = OUTPUT_2; output_function_t controller_1_function = controller1_settings->output_settings[output].function; output_function_t controller_2_function = controller2_settings->output_settings[output].function; if (controller_1_function == OUTPUT_FUNC_MANUAL || controller_2_function == OUTPUT_FUNC_MANUAL) { if (s->outputs[output].enabled == false) s->outputs[output].enabled = true; else s->outputs[output].enabled = false; set_output_settings(s, output, OUTPUT_FUNC_MANUAL); } else if (controller_1_function == OUTPUT_FUNC_HEATING || controller_1_function == OUTPUT_FUNC_COOLING) { if (s->output_ovrd[output] == true) s->output_ovrd[output] = false; else s->output_ovrd[output] = true; output_ovrd_msg_t msg = { .output = output, .controller = CONTROLLER_1 }; msg_send(MSG_OUTPUT_OVRD, &msg); set_output_icon_color(s, output); } else if (controller_2_function == OUTPUT_FUNC_HEATING ||