コード例 #1
0
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;
}
コード例 #2
0
ファイル: home.c プロジェクト: CalcMan/model-t
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 ||