Wielopoziomowo zagnieżdżone menu w ESP32

Wielopoziomowo zagnieżdżone menu w ESP32

Wątek przeniesiony 2024-05-17 13:43 z C/C++ przez flowCRANE.

SC
  • Rejestracja:12 miesięcy
  • Ostatnio:6 miesięcy
  • Postów:2
0

Witam. Napisałem program do ESP32 obsługujący wyświetlacz 128x64 oraz menu z wieloma poziomami zagnieżdżenia z możliwością swobodnego poruszania się po całym menu. zmienna "menu" określa poziom zagnieżdżenia, tablica "cursor[]" określa pozycję kursora dla każdego poziomu zagnieżdżenia, a tablica "site[]", określa stronę dla każdego zagnieżdżenia (gdy zabraknie miejsca dla kursora, to zmienia się strona). Wszystko dobrze działa, ale zastanawiam się w jaki sposób można to zrobić, żeby było bardziej czytelne. Chcę żeby z łatwością dało się zidentyfikować w programie, która pozycja w switch to które menu i uniknąć takiego zagnieżdżonego "switch" jeśli się da.

Kopiuj
switch (menu) {
    default:
      if (menu == (-1)) {
        max_cursor = 1;
        max_site = 0;
        menu = menu + buttons[0] + buttons[4];
        switch (cursor[0]) {
          case 0:
            light_power[0] = light_power[0] + buttons[7] - buttons[1] + encoder_out_func();
            break;
          case 1:
            light_power[1] = light_power[1] + buttons[7] - buttons[1] + encoder_out_func();
            break;
          default:
            break;
        }
      } else {
        if (buttons_long[1]) {
          EEPROM_update();
        }
        menu = menu - buttons[4] + buttons[6];
      }
      //---------------------------------------------------
      if (temperature[3] >= 10) {
        lcd.setCursor(80, 12);
      } else {
        lcd.setCursor(85, 12);
      }
      lcd.print(temperature[3], 1);
      lcd.print(" ");
      lcd.drawFrame(104, 13, 3, 3);
      lcd.print("C");
      //---------------------------------------------------
      if (battery >= 100) {
        lcd.setCursor(105, 0);
      } else {
        if (battery >= 10) {
          lcd.setCursor(108, 0);
        } else {
          lcd.setCursor(111, 0);
        }
      }
      lcd.setFont(u8g2_font_5x8_tf);
      lcd.print(battery, 0);
      lcd.print("%");
      lcd.drawFrame(104, 0, 24, 8);
      lcd.drawBox(102, 2, 2, 4);
      lcd.setDrawColor(2);
      lcd.drawBox(105, 1, battery * 0.23, 6);
      lcd.setDrawColor(1);
      //------------------------------------------------
      lcd.setFont(u8g2_font_10x20_tf);
      lcd.setCursor(2, 3);
      if (vel < 100) {
        if (vel < 10) {
          lcd.print(vel, 2);
        } else {
          lcd.print(vel, 1);
        }
      } else {
        lcd.print(vel, 0);
      }
      lcd.setFont(u8g2_font_5x7_tf);
      lcd.drawStr(43, 2, "km");
      lcd.drawHLine(44, 10, 7);
      lcd.drawStr(46, 11, "h");
      lcd.drawVLine(53, 0, 20);
      lcd.drawHLine(0, 19, 53);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_mr);
      if ((light_power[1] + 1) * 0.39216 < 10) {
        lcd.setCursor(103, 40);
      } else {
        if ((light_power[1] + 1) * 0.39216 < 100) {
          lcd.setCursor(101, 40);
        } else {
          lcd.setCursor(99, 40);
        }
      }
      lcd.setDrawColor(2);
      if (menu == (-1) && cursor[0] == 1) {
        lcd.print(light_power[1] * 0.39216, 0);
        lcd.print("%");
        lcd.drawBox(98, 41, 17, 5);
      } else {
        lcd.print(light_power_out[1] * 0.39216, 0);
        lcd.print("%");
      }
      lcd.setDrawColor(1);
      if (temperature[1] >= 10 || temperature[1] < 0) {
        lcd.setCursor(99, 46);
      } else {
        lcd.setCursor(101, 46);
      }
      lcd.print(temperature[1], 0);
      lcd.print(" C");
      if (temperature[1] >= 10 || temperature[1] < 0) {
        lcd.drawBox(108, 47, 2, 2);
      } else {
        lcd.drawBox(106, 47, 2, 2);
      }
      lcd.drawFrame(115, 40, 14, 13);
      lcd.drawFrame(97, 40, 19, 13);
      if (light_on[1]) {
        lcd.setDrawColor(1);
      } else {
        lcd.setDrawColor(0);
      }
      lcd.drawXBMP(116, 41, 12, 11, bitmap_long_light);
      lcd.setDrawColor(1);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_mr);
      if ((light_power[0] + 1) * 0.39216 < 10) {
        lcd.setCursor(103, 28);
      } else {
        if ((light_power[0] + 1) * 0.39216 < 100) {
          lcd.setCursor(101, 28);
        } else {
          lcd.setCursor(99, 28);
        }
      }
      lcd.setDrawColor(2);
      if (menu == (-1) && cursor[0] == 0) {
        lcd.print(light_power[0] * 0.39216, 0);
        lcd.print("%");
        lcd.drawBox(98, 29, 17, 5);
      } else {
        lcd.print(light_power_out[0] * 0.39216, 0);
        lcd.print("%");
      }
      lcd.setDrawColor(1);
      if (temperature[0] >= 10 || temperature[0] < 0) {
        lcd.setCursor(99, 34);
      } else {
        lcd.setCursor(101, 34);
      }
      lcd.print(temperature[0], 0);
      lcd.print(" C");
      if (temperature[0] >= 10 || temperature[0] < 0) {
        lcd.drawBox(108, 35, 2, 2);
      } else {
        lcd.drawBox(106, 35, 2, 2);
      }
      lcd.drawFrame(115, 28, 14, 13);
      lcd.drawFrame(97, 28, 19, 13);
      if (light_on[0]) {
        lcd.setDrawColor(1);
      } else {
        lcd.setDrawColor(0);
      }
      lcd.drawXBMP(116, 29, 12, 11, bitmap_short_light);
      lcd.setDrawColor(1);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_mr);
      if (temperature[2] >= 10 || temperature[2] < 0) {
        lcd.setCursor(99, 55);
      } else {
        lcd.setCursor(101, 55);
      }
      lcd.print(temperature[2], 0);
      lcd.print(" C");
      if (temperature[2] >= 10 || temperature[2] < 0) {
        lcd.drawBox(108, 56, 2, 2);
      } else {
        lcd.drawBox(106, 56, 2, 2);
      }
      lcd.drawFrame(115, 52, 14, 13);
      lcd.drawFrame(97, 52, 19, 13);
      lcd.drawXBMP(116, 53, 12, 11, bitmap_mosfet);
      lcd.setDrawColor(1);
      //------------------------------------------------
      lcd.setFont(u8g2_font_unifont_t_symbols);
      lcd.drawUTF8(61, -3, "▴");
      lcd.setFont(u8g2_font_5x7_tf);
      lcd.setCursor(55, 1);
      lcd.print(shift[0]);
      lcd.drawFrame(53, 0, 8, 10);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_tr);
      lcd.setCursor(1, 20);
      lcd.print("-5");
      lcd.setCursor(45, 20);
      lcd.print("+5");
      lcd.setCursor(55, 20);
      if (vel_dif >= 0) {
        lcd.print("+");
      }
      if (vel_dif < 10) {
        lcd.print(vel_dif, 1);
      } else {
        lcd.print(vel_dif, 0);
      }
      lcd.drawFrame(53, 19, 19, 9);
      if (vel_dif < 0) {
        for (int i = 20; i >= 20 + constrain(vel_dif * 4, -20, 0); i--) {
          lcd.drawVLine(1.3333 * i, 21, 5);
        }
      } else {
        for (int i = 20; i < 20 + constrain(vel_dif * 4, 0, 20); i++) {
          lcd.drawVLine(1.3333 * i, 21, 5);
        }
      }
      lcd.drawFrame(-1, 19, 55, 9);
      //------------------------------------------------
      lcd.drawBox(0, 28, 13, 6);
      lcd.setCursor(1, 28);
      lcd.setDrawColor(0);
      lcd.print("AVG");
      lcd.setDrawColor(1);
      lcd.setCursor(14, 28);
      if (vel_avg[0] > 10) {
        lcd.print(vel_avg[0], 1);
      } else {
        lcd.print(vel_avg[0], 2);
      }
      lcd.drawVLine(30, 28, 7);
      lcd.setCursor(32, 28);
      if (vel_avg[1] > 10) {
        lcd.print(vel_avg[1], 1);
      } else {
        lcd.print(vel_avg[1], 2);
      }
      lcd.drawVLine(48, 28, 7);
      lcd.setCursor(50, 28);
      lcd.print("kmh");
      lcd.drawVLine(62, 28, 7);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_tr);
      lcd.drawBox(0, 34, 13, 6);
      lcd.setDrawColor(0);
      lcd.setCursor(1, 34);
      lcd.print("MAX");
      lcd.setDrawColor(1);
      lcd.setCursor(14, 34);
      if (vel_max[0] > 10) {
        if (vel_max[0] > 100) {
          lcd.setCursor(16, 34);
          lcd.print(vel_max[0], 0);
        } else {
          lcd.print(vel_max[0], 1);
        }
      } else {
        lcd.print(vel_max[0], 2);
      }
      lcd.drawVLine(30, 34, 7);
      lcd.setCursor(32, 34);
      if (vel_max[1] > 10) {
        if (vel_max[1] > 100) {
          lcd.setCursor(34, 34);
          lcd.print(vel_max[1], 0);
        } else {
          lcd.print(vel_max[1], 1);
        }
      } else {
        lcd.print(vel_max[1], 2);
      }
      lcd.drawVLine(48, 34, 7);
      lcd.setCursor(50, 34);
      lcd.print("kmh");
      lcd.drawVLine(62, 34, 7);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_tr);
      lcd.drawBox(0, 40, 13, 6);
      lcd.setDrawColor(0);
      lcd.setCursor(1, 40);
      lcd.print("RPM");
      lcd.setDrawColor(1);
      lcd.setCursor(14, 40);
      if (rpm[0] >= 10) {
        if (rpm[0] >= 100) {
          if (rpm[0] >= 1000) {
            lcd.setCursor(14, 40);
            lcd.print(rpm[0], 0);
          } else {
            lcd.setCursor(16, 40);
            lcd.print(rpm[0], 0);
          }
        } else {
          lcd.print(rpm[0], 1);
        }
      } else {
        lcd.print(rpm[0], 2);
      }
      lcd.drawVLine(30, 40, 7);
      lcd.drawVLine(48, 40, 7);
      lcd.setCursor(50, 40);
      lcd.print("rpm");
      lcd.drawVLine(62, 40, 7);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_tr);
      lcd.drawBox(0, 46, 13, 6);
      lcd.setDrawColor(0);
      lcd.setCursor(1, 46);
      lcd.print("PWR");
      lcd.setDrawColor(1);
      lcd.setCursor(14, 46);
      if (power >= 10) {
        if (power >= 100) {
          if (power >= 1000) {
          } else {
            lcd.setCursor(16, 46);
          }
          lcd.print(power, 0);
        } else {
          lcd.print(power, 1);
        }
      } else {
        lcd.print(power, 2);
      }
      lcd.drawVLine(30, 46, 7);
      lcd.drawVLine(48, 46, 7);
      lcd.setCursor(54, 46);
      lcd.print("W");
      lcd.drawVLine(62, 46, 7);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_tr);
      lcd.drawBox(0, 52, 13, 6);
      lcd.setDrawColor(0);
      lcd.setCursor(1, 52);
      lcd.print("DST");
      lcd.setDrawColor(1);
      if (dst >= 1000) {
        if (dst >= 10000) {
          if (dst >= 100000) {
            if (dst >= 1000000) {
              if (dst >= 1000000) {
                lcd.setCursor(14, 52);
                lcd.print(dst * 0.00001, 1);
                lcd.setCursor(52, 52);
                lcd.print("km");
              } else {
                lcd.setCursor(14, 52);
                lcd.print(dst * 0.00001, 2);
                lcd.setCursor(52, 52);
                lcd.print("km");
              }
            } else {
              lcd.setCursor(14, 52);
              lcd.print(dst * 0.01, 0);
              lcd.setCursor(54, 52);
              lcd.print("m");
            }
          } else {
            lcd.setCursor(16, 52);
            lcd.print(dst * 0.01, 0);
            lcd.setCursor(54, 52);
            lcd.print("m");
          }
        } else {
          lcd.setCursor(18, 52);
          lcd.print(dst * 0.01, 0);
          lcd.setCursor(54, 52);
          lcd.print("m");
        }
      } else {
        lcd.setCursor(20, 52);
        lcd.print(dst * 0.01, 0);
        lcd.setCursor(54, 52);
        lcd.print("m");
      }
      lcd.drawVLine(30, 52, 7);
      lcd.drawVLine(48, 52, 7);
      lcd.drawVLine(62, 52, 7);
      //------------------------------------------------
      lcd.setFont(u8g2_font_micro_tr);
      lcd.drawBox(0, 58, 13, 6);
      lcd.setDrawColor(0);
      lcd.setCursor(3, 58);
      lcd.print("TM");
      lcd.setDrawColor(1);
      lcd.drawVLine(48, 58, 7);
      lcd.setCursor(14, 58);
      if (travel_time / 3600000 < 10) {
        lcd.print("0");
      }
      lcd.print(travel_time / 3600000);
      lcd.print(":");
      if ((travel_time % 3600000) / 60000 < 10) {
        lcd.print("0");
      }
      lcd.print((travel_time % 3600000) / 60000);
      lcd.print(":");
      if ((travel_time % 60000) / 1000 < 10) {
        lcd.print("0");
      }
      if (travel_time > 0) {
        lcd.print((travel_time % 60000) / 1000);
      } else {
        lcd.print("0");
      }
      lcd.drawVLine(62, 58, 7);
      //------------------------------------------------
      lcd.setFont(u8g2_font_6x10_tf);
      break;
    case 1:
      max_site = 0;
      switch (site[1]) {
        case 0:
          max_cursor = 2;
          menu = menu + buttons[4];  //Sterowanie
          buttons[4] = 0;
          disp_cursor_color(0, -1);
          lcd.drawStr(0, pos_y, "Settings");
          disp_cursor_color(1, -1);
          lcd.drawStr(0, pos_y, "Stats");
          disp_cursor_color(2, -1);
          lcd.drawStr(0, pos_y, "Charts");
          break;
        default:
          break;
      }
      break;
    case 2:
      switch (site[1]) {
        case 0:
          switch (cursor[1]) {
            case 0:
              max_site = 0;
              switch (site[2]) {
                case 0:
                  max_cursor = 5;
                  menu = menu + buttons[4];  //Sterowanie
                  buttons[4] = 0;
                  disp_cursor_color(0, -1);
                  lcd.drawStr(0, pos_y, "LCD");
                  disp_cursor_color(1, -1);
                  lcd.drawStr(0, pos_y, "Light");
                  disp_cursor_color(2, -1);
                  lcd.drawStr(0, pos_y, "Supply");
                  disp_cursor_color(3, -1);
                  lcd.drawStr(0, pos_y, "EEPROM");
                  disp_cursor_color(4, -1);
                  lcd.drawStr(0, pos_y, "Parameters");
                  disp_cursor_color(5, -1);
                  lcd.drawStr(0, pos_y, "TEST");
                  break;
                default:
                  break;
              }
              break;
            case 2:
              max_site = 0;
              switch (site[2]) {
                case 0:
                  max_cursor = 0;
                  for (int i = 0; i < chart_i; i++) {
                    max_vel = max(uint8_t(ceil(max_vel)), vel_chart[i]);
                  }
                  max_vel = 5 * ceil(max_vel / 5);
                  lcd.drawStr(58, 0, "Vel");
                  lcd.drawHLine(0, 9, 127);
                  lcd.drawFrame(16, 9, 112, 47);
                  lcd.setFont(u8g2_font_5x8_tf);
                  lcd.setCursor(0, 9);
                  lcd.print(max_vel, 0);
                  lcd.setCursor(0, 17);
                  lcd.print("kmh");
                  lcd.setCursor(14, 56);
                  lcd.print("0");
                  lcd.setCursor(107, 56);
                  lcd.print(float(travel_time) * 0.001, 1);
                  lcd.setFont(u8g2_font_6x10_tf);
                  for (int i = 1; i < chart_i + 1; i++) {
                    lcd.drawLine(uint8_t(17 + i * 111 / chart_i - 111 / chart_i), 55 - vel_chart[i - 1] * 47 / max_vel, uint8_t(17 + i * 111 / chart_i), 55 - vel_chart[i] * 47 / max_vel);
                  }
                  break;
                default:
                  break;
              }
              break;
            default:
              break;
          }
          break;
        default:
          break;
      }
      break;
    case 3:
      switch (site[1]) {
        case 0:
          switch (cursor[1]) {
            case 0:
              switch (site[2]) {
                case 0:
                  switch (cursor[2]) {
                    case 0:
                      max_site = 0;
                      switch (site[3]) {
                        case 0:
                          max_cursor = 2;
                          switch (cursor[3]) {  //Sterowanie
                            case 0:
                              lcd_backlight = lcd_backlight + buttons[7] - buttons[1] + encoder_out_func();
                              break;
                            case 1:
                              if (buttons[7] || buttons[1] || encoder_out_func()) { lcd_auto_backlight = !lcd_auto_backlight; };
                              break;
                            case 2:
                              lcd_contrast = lcd_contrast + buttons[7] - buttons[1] + encoder_out_func();
                              break;
                            default:
                              break;
                          }
                          disp_cursor_color(0, 0);
                          lcd.drawStr(0, pos_y, "Backlight");
                          disp_cursor_color(1, 0);
                          lcd.drawStr(0, pos_y, "Auto backlight");
                          disp_cursor_color(2, 0);
                          lcd.drawStr(0, pos_y, "Contrast");
                          lcd.setDrawColor(1);
                          lcd.setCursor(93, 0);
                          lcd.print(lcd_backlight);
                          lcd.setCursor(93, 9);
                          lcd.print(lcd_auto_backlight);
                          lcd.setCursor(93, 18);
                          lcd.print(lcd_contrast);

                          lcd.setContrast(lcd_contrast);
                          analogWrite(LCD_BACKLIGHT_PIN, lcd_backlight);
                          break;
                        default:
                          break;
                      }
                      break;
                    case 1:
                      max_site = 0;
                      switch (site[3]) {
                        case 0:
                          max_cursor = 1;
                          switch (cursor[3]) {  //Sterowanie
                            case 0:
                              light_power[1] = light_power[1] + buttons[7] - buttons[1] + encoder_out_func();
                              break;
                            case 1:
                              light_power[0] = light_power[0] + buttons[7] - buttons[1] + encoder_out_func();
                              break;
                            default:
                              break;
                          }
                          disp_cursor_color(0, 0);
                          lcd.drawStr(0, pos_y, "long light");
                          disp_cursor_color(1, 0);
                          lcd.drawStr(0, pos_y, "short light");
                          lcd.setDrawColor(1);
                          lcd.setCursor(93, 0);
                          lcd.print(light_power[1]);
                          lcd.setCursor(93, 9);
                          lcd.print(light_power[0]);
                          break;
                        default:
                          break;
                      }
                      break;
                    case 2:
                      max_site = 0;
                      switch (site[3]) {
                        case 0:
                          max_cursor = 2;
                          menu = menu + buttons[4];  //Sterowanie
                          buttons[4] = 0;
                          if (cursor[menu] == 0) {
                            cursor[menu] = 1;
                          };
                          lcd.setCursor(0, 1);
                          lcd.print(voltage[0]);
                          lcd.print(" ");
                          lcd.print(voltage[1]);
                          lcd.print(" ");
                          lcd.print(voltage[2]);
                          lcd.print(" ");
                          lcd.print(voltage[3]);
                          lcd.print(" V");
                          lcd.drawHLine(0, 9, 128);
                          pos_y = 0;
                          disp_cursor_color(1, -1);
                          lcd.drawStr(0, pos_y, "Voltage factors");
                          disp_cursor_color(2, -1);
                          lcd.drawStr(0, pos_y, "Voltage drops");
                          break;
                        default:
                          break;
                      }
                      break;
                    case 3:
                      max_site = 0;
                      switch (site[3]) {
                        case 0:
                          max_cursor = 3;
                          if (buttons[4]) {
                            switch (cursor[3]) {
                              case 0:
                                EEPROM_update();
                                break;
                              case 1:
                                EEPROM_read();
                                digitalWrite(BUZZER_PIN, HIGH);
                                delay(50);
                                digitalWrite(BUZZER_PIN, LOW);
                                delay(100);
                                digitalWrite(BUZZER_PIN, HIGH);
                                delay(20);
                                digitalWrite(BUZZER_PIN, LOW);
                                break;
                              case 2:
                                EEPROM_0();
                                break;
                              case 3:
                                break;
                            }
                          }
                          disp_cursor_color(0, -1);
                          lcd.drawStr(0, pos_y, "EEPROM save");
                          disp_cursor_color(1, -1);
                          lcd.drawStr(0, pos_y, "EEPROM load");
                          disp_cursor_color(2, -1);
                          lcd.drawStr(0, pos_y, "EEPROM reset");
                          disp_cursor_color(3, -1);
                          lcd.drawStr(0, pos_y, "EEPROM default");
                          lcd.setDrawColor(1);
                          break;
                        default:
                          break;
                      }
                      break;
                    case 4:
                      max_site = 0;
                      switch (site[3]) {
                        case 0:
                          max_cursor = 4;
                          switch (cursor[3]) {  //Sterowanie
                            case 0:
                              body_weight = body_weight + buttons[7] - buttons[1] + encoder_out_func();
                              if (body_weight < 0) body_weight = 0;
                              break;
                            case 1:
                              bike_weight = bike_weight + buttons[7] - buttons[1] + encoder_out_func();
                              if (bike_weight < 0) bike_weight = 0;
                              break;
                            case 2:
                              friction_coe = friction_coe + buttons[7] * 0.01 - buttons[1] * 0.01 + encoder_out_func() * 0.01;
                              if (friction_coe < 0) friction_coe = 0;
                              break;
                            case 3:
                              vel_avg_range = vel_avg_range + buttons[7] * 10 - buttons[1] * 10 + encoder_out_func() * 10;
                              if (vel_avg_range > 60000) vel_avg_range = 0;
                              break;
                            case 4:
                              menu = menu + buttons[4];
                              break;
                            default:
                              break;
                          }
                          disp_cursor_color(0, 0);
                          lcd.drawStr(0, pos_y, "Bike weight");
                          disp_cursor_color(1, 0);
                          lcd.drawStr(0, pos_y, "Body weight");
                          disp_cursor_color(2, 0);
                          lcd.drawStr(0, pos_y, "friction coe.");
                          disp_cursor_color(3, 0);
                          lcd.drawStr(0, pos_y, "AVG vel range");
                          disp_cursor_color(4, 0);
                          lcd.drawStr(0, pos_y, "Gears");
                          lcd.setDrawColor(1);
                          lcd.setCursor(93, 0);
                          lcd.print(body_weight, 0);
                          lcd.print("kg");
                          lcd.setCursor(93, 9);
                          lcd.print(bike_weight, 0);
                          lcd.print("kg");
                          lcd.setCursor(93, 18);
                          lcd.print(friction_coe, 2); /*
                          lcd.setFont(u8g2_font_4x6_tf);
                          lcd.print("N/m^2/s^2");
                          lcd.setFont(u8g2_font_6x10_tf);*/
                          lcd.setCursor(93, 27);
                          lcd.print(vel_avg_range);
                          lcd.print("m");
                          break;
                        default:
                          break;
                      }
                      break;
                    case 5:
                      max_site = 1;
                      switch (site[3]) {
                        case 0:
                          max_cursor = 6;
                          lcd.setCursor(0, 0);
                          lcd.print(lcd_backlight);
                          lcd.setCursor(0, 9);
                          lcd.print(light_power[0]);
                          lcd.setCursor(0, 18);
                          lcd.print(light_power[1]);
                          lcd.setCursor(0, 27);
                          lcd.print(voltage[0]);
                          lcd.setCursor(0, 36);
                          lcd.print(voltage[1]);
                          lcd.setCursor(0, 45);
                          lcd.print(voltage[2]);
                          lcd.setCursor(0, 54);
                          lcd.print(voltage[3]);
                          lcd.setCursor(30, 0);
                          lcd.print(temperature[0]);
                          lcd.setCursor(30, 9);
                          lcd.print(temperature[1]);
                          lcd.setCursor(30, 18);
                          lcd.print(temperature[2]);
                          lcd.setCursor(30, 27);
                          lcd.print(temperature[3]);
                          lcd.setCursor(90, 36);
                          lcd.print(light_level);
                          lcd.setCursor(30, 36);
                          lcd.print(digitalRead(ENCODER_A_PIN));
                          lcd.setCursor(30, 45);
                          lcd.print(digitalRead(ENCODER_B_PIN));
                          lcd.setCursor(30, 54);
                          lcd.print(encoder_out);
                          lcd.setCursor(40, 36);
                          lcd.print(test_1);
                          lcd.setCursor(40, 45);
                          lcd.print(test_2);
                          lcd.setCursor(65, 0);
                          lcd.print(light_power_out[0]);
                          lcd.setCursor(65, 9);
                          lcd.print(light_power_out[1]);
                          lcd.setCursor(65, 18);
                          lcd.print(cursor[menu]);
                          lcd.print(" ");
                          lcd.print(site[menu]);
                          lcd.print(" ");
                          lcd.print(max_site);
                          lcd.setCursor(65, 27);
                          lcd.print(analogRead(CELL_1_PIN));
                          lcd.setCursor(65, 36);
                          lcd.print(analogRead(CELL_2_PIN));
                          lcd.setCursor(65, 45);
                          lcd.print(analogRead(CELL_3_PIN));
                          lcd.setCursor(65, 54);
                          lcd.print(analogRead(CELL_4_PIN));
                          break;
                        case 1:
                          max_cursor = 3;
                          disp_cursor_color(0, 0);
                          lcd.drawStr(0, pos_y, "1");
                          disp_cursor_color(1, 0);
                          lcd.drawStr(0, pos_y, "2");
                          disp_cursor_color(2, 0);
                          lcd.drawStr(0, pos_y, "3");
                          disp_cursor_color(3, 0);
                          lcd.drawStr(0, pos_y, "4");
                          lcd.setDrawColor(1);
                        default:
                          break;
                      }
                      break;
                    default:
                      break;
                  }
                  break;
                default:
                  break;
              }
              break;
            default:
              break;
          }
          break;
        default:
          break;
      }
      break;
    case 4:
      switch (site[1]) {
        case 0:
          switch (cursor[1]) {
            case 0:
              switch (site[2]) {
                case 0:
                  switch (cursor[2]) {
                    case 2:
                      switch (site[3]) {
                        case 0:
                          switch (cursor[3]) {
                            case 1:
                              max_site = 0;
                              switch (site[4]) {
                                case 0:
                                  max_cursor = 4;
                                  voltage_factor[cursor[4] - 1] = voltage_factor[cursor[4] - 1] + 0.000001 * float(buttons[7] - buttons[1] + encoder_out_func());
                                  if (voltage_factor[cursor[4] - 1] < 0) voltage_factor[cursor[4] - 1] = 0;
                                  if (cursor[menu] == 0) {
                                    cursor[menu] = 1;
                                  };
                                  lcd.setCursor(0, 1);
                                  lcd.print(voltage[0]);
                                  lcd.print(" ");
                                  lcd.print(voltage[1]);
                                  lcd.print(" ");
                                  lcd.print(voltage[2]);
                                  lcd.print(" ");
                                  lcd.print(voltage[3]);
                                  lcd.print(" V");
                                  lcd.drawHLine(0, 9, 128);
                                  pos_y = 0;
                                  disp_cursor_color(1, 1);
                                  lcd.drawStr(0, pos_y, "Cell 1");
                                  disp_cursor_color(2, 1);
                                  lcd.drawStr(0, pos_y, "Cell 2");
                                  disp_cursor_color(3, 1);
                                  lcd.drawStr(0, pos_y, "Cell 3");
                                  disp_cursor_color(4, 1);
                                  lcd.drawStr(0, pos_y, "Cell 4");
                                  lcd.setDrawColor(1);
                                  lcd.setCursor(93, 9);
                                  lcd.print(voltage_factor[0] * 1000000, 0);
                                  lcd.setCursor(93, 18);
                                  lcd.print(voltage_factor[1] * 1000000, 0);
                                  lcd.setCursor(93, 27);
                                  lcd.print(voltage_factor[2] * 1000000, 0);
                                  lcd.setCursor(93, 36);
                                  lcd.print(voltage_factor[3] * 1000000, 0);
                                  lcd.setCursor(93, 54);
                                  lcd.print("*10");
                                  lcd.setFont(u8g2_font_4x6_tf);
                                  lcd.setCursor(111, 52);
                                  lcd.print("-6");
                                  lcd.setFont(u8g2_font_6x10_tf);
                                  break;
                                default:
                                  break;
                              }
                              break;
                            case 2:
                              max_site = 0;
                              switch (site[4]) {
                                case 0:
                                  max_cursor = 2;
                                  switch (cursor[4]) {
                                    case 1:
                                      internal_resistance = internal_resistance + 0.01 * float(buttons[7] - buttons[1] + encoder_out_func());
                                      if (internal_resistance < 0) internal_resistance = 0;
                                      if (internal_resistance > 9.99) internal_resistance = 9.99;
                                      break;
                                    case 2:
                                      menu = menu + buttons[4];
                                      break;
                                    default:
                                      break;
                                  }
                                  if (cursor[menu] == 0) {
                                    cursor[menu] = 1;
                                  };
                                  lcd.setCursor(0, 1);
                                  lcd.print(voltage[0]);
                                  lcd.print(" ");
                                  lcd.print(voltage[1]);
                                  lcd.print(" ");
                                  lcd.print(voltage[2]);
                                  lcd.print(" ");
                                  lcd.print(voltage[3]);
                                  lcd.print(" V");
                                  lcd.drawHLine(0, 9, 128);
                                  pos_y = 0;
                                  disp_cursor_color(1, 1);
                                  lcd.drawStr(0, pos_y, "Resistance");
                                  disp_cursor_color(2, 1);
                                  lcd.drawStr(0, pos_y, "Temp. factors");
                                  lcd.setDrawColor(1);
                                  lcd.setCursor(93, 9);
                                  lcd.print(internal_resistance, 2);
                                  lcd.drawXBMP(117, 10, 5, 7, bitmap_ohm);
                                  break;
                                default:
                                  break;
                              }
                              break;
                            default:
                              break;
                          }
                          break;
                        default:
                          break;
                      }
                      break;
                    case 4:
                      switch (site[3]) {
                        case 0:
                          switch (cursor[3]) {
                            case 4:
                              max_site = 0;
                              switch (site[4]) {
                                case 0:
                                  max_cursor = 1;
                                  menu = menu + buttons[4];
                                  disp_cursor_color(0, -1);
                                  lcd.drawStr(0, pos_y, "Front gear");
                                  disp_cursor_color(1, -1);
                                  lcd.drawStr(0, pos_y, "Rear gear");
                                  lcd.setDrawColor(1);
                                  break;
                                default:
                                  break;
                              }
                              break;
                            default:
                              break;
                          }
                          break;
                        default:
                          break;
                      }
                      break;
                    default:
                      break;
                  }
                  break;
                default:
                  break;
              }
              break;
            default:
              break;
          }
          break;
        default:
          break;
      }
      break;
    case 5:
      switch (site[1]) {
        case 0:
          switch (cursor[1]) {
            case 0:
              switch (site[2]) {
                case 0:
                  switch (cursor[2]) {
                    case 2:
                      switch (site[3]) {
                        case 0:
                          switch (cursor[3]) {
                            case 2:
                              switch (site[4]) {
                                case 0:
                                  switch (cursor[4]) {
                                    case 2:
                                      max_site = 0;
                                      switch (site[5]) {
                                        case 0:
                                          max_cursor = 3;
                                          switch (cursor[5]) {
                                            case 1:
                                              temp_factor[0] = temp_factor[0] + 0.0001 * float(buttons[7] - buttons[1] + encoder_out_func());
                                              break;
                                            case 2:
                                              temp_factor[1] = temp_factor[1] + 0.0001 * float(buttons[7] - buttons[1] + encoder_out_func());
                                              break;
                                            case 3:
                                              temp_factor[2] = temp_factor[2] + 0.0001 * float(buttons[7] - buttons[1] + encoder_out_func());
                                              break;
                                            default:
                                              break;
                                          }
                                          if (cursor[menu] == 0) {
                                            cursor[menu] = 1;
                                          };
                                          lcd.setCursor(0, 1);
                                          lcd.print(voltage[0]);
                                          lcd.print(" ");
                                          lcd.print(voltage[1]);
                                          lcd.print(" ");
                                          lcd.print(voltage[2]);
                                          lcd.print(" ");
                                          lcd.print(voltage[3]);
                                          lcd.print(" V");
                                          lcd.drawHLine(0, 9, 128);
                                          pos_y = 0;
                                          disp_cursor_color(1, 1);
                                          lcd.drawStr(0, pos_y, "Short factor");
                                          disp_cursor_color(2, 1);
                                          lcd.drawStr(0, pos_y, "Long factor");
                                          disp_cursor_color(3, 1);
                                          lcd.drawStr(0, pos_y, "MOSFET factor");
                                          lcd.setDrawColor(1);
                                          lcd.setCursor(93, 9);
                                          lcd.print(temp_factor[0], 4);
                                          lcd.setCursor(93, 18);
                                          lcd.print(temp_factor[1], 4);
                                          lcd.setCursor(93, 27);
                                          lcd.print(temp_factor[2], 4);
                                          break;
                                        default:
                                          break;
                                      }
                                      break;
                                    default:
                                      break;
                                  }
                                  break;
                                default:
                                  break;
                              }
                              break;
                            default:
                              break;
                          }
                          break;
                        default:
                          break;
                      }
                      break;
                    case 4:
                      switch (site[3]) {
                        case 0:
                          switch (cursor[3]) {
                            case 4:
                              switch (site[4]) {
                                case 0:
                                  switch (cursor[4]) {
                                    case 0:
                                      max_site = 0;
                                      switch (site[5]) {
                                        case 0:
                                          max_cursor = 3;
                                          switch (cursor[5]) {  //Sterowanie
                                            case 0:
                                              shift[0] = shift[0] + buttons[7] - buttons[1] + encoder_out_func();
                                              if (shift[0] > 3) shift[0] = 0;
                                              if (shift[0] > 2) shift[0] = 2;
                                              break;
                                            default:
                                              gear_f[cursor[5] - 1] = gear_f[cursor[5] - 1] + buttons[7] - buttons[1] + encoder_out_func();
                                              if (gear_f[cursor[5] - 1] < 1) gear_f[cursor[5] - 1] = 1;
                                              break;
                                          }
                                          disp_cursor_color(0, 0);
                                          lcd.drawStr(0, pos_y, "Shift");
                                          disp_cursor_color(1, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 1");
                                          disp_cursor_color(2, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 2");
                                          disp_cursor_color(3, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 3");
                                          lcd.setDrawColor(1);
                                          lcd.setCursor(93, 0);
                                          lcd.print(shift[0] + 1);
                                          lcd.setCursor(93, 9);
                                          lcd.print(gear_f[0]);
                                          lcd.setCursor(93, 18);
                                          lcd.print(gear_f[1]);
                                          lcd.setCursor(93, 27);
                                          lcd.print(gear_f[2]);
                                          break;
                                        default:
                                          break;
                                      }
                                      break;
                                    case 1:
                                      max_site = 1;
                                      switch (site[5]) {
                                        case 0:
                                          max_cursor = 6;
                                          switch (cursor[5]) {  //Sterowanie
                                            case 0:
                                              shift[1] = shift[1] + buttons[7] - buttons[1] + encoder_out_func();
                                              if (shift[1] > 7) shift[1] = 0;
                                              if (shift[1] > 6) shift[1] = 6;
                                              break;
                                            case 1:
                                              if (buttons[7] || buttons[1] || encoder_out_func()) { auto_shift = !auto_shift; };
                                              break;
                                            default:
                                              gear_r[cursor[5] - 2] = gear_r[cursor[5] - 2] + buttons[7] - buttons[1] + encoder_out_func();
                                              if (gear_r[cursor[5] - 5] < 1) gear_r[cursor[5] - 5] = 1;
                                              break;
                                          }
                                          disp_cursor_color(0, 0);
                                          lcd.drawStr(0, pos_y, "Shift");
                                          disp_cursor_color(1, 0);
                                          lcd.drawStr(0, pos_y, "Auto shift");
                                          disp_cursor_color(2, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 1");
                                          disp_cursor_color(3, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 2");
                                          disp_cursor_color(4, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 3");
                                          disp_cursor_color(5, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 4");
                                          disp_cursor_color(6, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 5");
                                          lcd.setDrawColor(1);
                                          lcd.setCursor(93, 0);
                                          lcd.print(shift[1] + 1);
                                          lcd.setCursor(93, 9);
                                          lcd.print(auto_shift);
                                          lcd.setCursor(93, 18);
                                          lcd.print(gear_r[0]);
                                          lcd.setCursor(93, 27);
                                          lcd.print(gear_r[1]);
                                          lcd.setCursor(93, 36);
                                          lcd.print(gear_r[2]);
                                          lcd.setCursor(93, 45);
                                          lcd.print(gear_r[3]);
                                          lcd.setCursor(93, 54);
                                          lcd.print(gear_r[4]);
                                          break;
                                        case 1:
                                          max_cursor = 1;
                                          gear_r[cursor[5] + 5] = gear_r[cursor[5] + 5] + buttons[7] - buttons[1] + encoder_out_func();
                                          if (gear_r[cursor[5] + 5] < 1) gear_r[cursor[5] + 5] = 1;
                                          disp_cursor_color(0, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 6");
                                          disp_cursor_color(1, 0);
                                          lcd.drawStr(0, pos_y, "gear teeths 7");
                                          lcd.setDrawColor(1);
                                          lcd.setCursor(93, 0);
                                          lcd.print(gear_r[5]);
                                          lcd.setCursor(93, 9);
                                          lcd.print(gear_r[6]);
                                          break;
                                        default:
                                          break;
                                      }
                                      break;
                                    default:
                                      break;
                                  }
                                  break;
                                default:
                                  break;
                              }
                              break;
                            default:
                              break;
                          }
                          break;
                        default:
                          break;
                      }
                      break;
                    default:
                      break;
                  }
                  break;
                default:
                  break;
              }
              break;
            default:
              break;
          }
          break;
        default:
          break;
      }
      break;
    case 6:
      break;
  }
  lcd.setDrawColor(1);
  lcd.sendBuffer();
}
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:15 dni
7

Najprostszy sposób na uniknięcie switcha jest dispatch table albo polimorfizm (chociaż wydaje mi się, że jeszcze nie przerabiałeś obietówki). Poza tym poszukaj powtarzającego sie kodu i wydziel funkcje. To tak na początek.

Dispatch table działa tak, że zamiast robić switch, definiujesz sobie tablicę reprezentującą wybór:

Kopiuj
typedef void (*callback_t)(/* parametry... */);

callback_t jobs[] = { &foo, &bar, &baz }; /* foo bar baz to nazwy funkcji */
#define JOBS_COUNT sizeof(jobs) / sizeof(callback_t)

/*...*/
if(x >= 0 && x < JOBS_COUNT) {
  jobs[x](/*parametry*/);
} else {
   /* jakiś kod */
}

Jest to tylko podstawowy przypadek, w którym rozpatrujemy tylko kolejne wartości (działa dobrze dla enumów), ale często potrzebujemy zdefiniować callback_t jako strukturę zawierającą dodatkowo wartość referencyjną lub funkcję dopasowującą wartość do wzorca.


Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:2 dni
  • Postów:2100
3

Z przykładowego kodu to nawet nie jestem w stanie powiedzieć oglądając kod w 3s czy to jest jedno długie menu czy jakaś karkołomna struktura wielopoziomowa :(
Wszystko razem wymieszane niczym praca zaliczeniowa z informatyki ;)

Ewidentnie trzeba to trochę podzielić np.

Kopiuj
char *menu0[]={
			   "ustawianie 1",
			   "ustawianie 2",
			   "ustawianie 3",
			   "ustawianie 4",
			   "ustawianie 5",
};

 int menuPosition=0
  while(1)
  {
    menuPosition=zrobMenu(sizeof(menu0)/sizeof(menu0[0]),menu0,menuPosition);
    switch(menuPosition)
    {
    }
  }

--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 2x, ostatnio: Marius.Maximus
SC
  • Rejestracja:12 miesięcy
  • Ostatnio:6 miesięcy
  • Postów:2
0
elwis napisał(a):

Najprostszy sposób na uniknięcie switcha jest dispatch table albo polimorfizm (chociaż wydaje mi się, że jeszcze nie przerabiałeś obietówki). Poza tym poszukaj powtarzającego sie kodu i wydziel funkcje. To tak na początek.

Obiektowo nie miałem okazji programować nic większego, tylko próbowałem sobie jak to działa, ale jeśli było by w tym idealne rozwiązanie to czemu nie.

Marius.Maximus napisał(a):

Z przykładowego kodu to nawet nie jestem w stanie powiedzieć oglądając kod w 3s czy to jest jedno długie menu czy jakaś karkołomna struktura wielopoziomowa :(
Wszystko razem wymieszane niczym praca zaliczeniowa z informatyki ;)

Wiem, że to tak wygląda i tego chcę właśnie uniknąć, ale cały program pisałem przez takie jakby ciągłe "dobudowywanie" kodu, bez większego planowania. Kod jest tak zagmatwany, że może nie zrozumieliście z czym mam tak na prawdę problem. Tablicę wskaźników do funkcji można zrobić, to nie problem. Problemem jest to, że do odpowiedniego menu prowadzą trzy zmienne i +2 zmienne na każdy poziom zagnieżdżenia (W pierwszym poziomie "menu" - poziom zagnieżdżenia oraz "site[1]" - opisujące na której stronie jestem). Dla trzeciego poziomu zagnieżdżenia będzie to już "menu", site[1], cursor[1], site[2], cursor[2], site[3]), a wszystko po to, żeby przy cofaniu, wracać do odpowiedniego menu z kursorem na odpowiedniej pozycji. Może da się to łatwiej zrobić, nie wiem.

Tutaj wstawiam urywek kody ze zwiniętymi funkcjami jakie wykonuje, tylko samą "nawigację" do odpowiedniego menu:

screenshot-20240517133939.pngIMG20240517134151.jpg

edytowany 2x, ostatnio: Scalak_
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:15 dni
2
Scalak_ napisał(a):

Wiem, że to tak wygląda i tego chcę właśnie uniknąć, ale cały program pisałem przez takie jakby ciągłe "dobudowywanie" kodu, bez większego planowania. Kod jest tak zagmatwany, że może nie zrozumieliście z czym mam tak na prawdę problem. Tablicę wskaźników do funkcji można zrobić, to nie problem. Problemem jest to, że do odpowiedniego menu prowadzą trzy zmienne i +2 zmienne na każdy poziom zagnieżdżenia (W pierwszym poziomie "menu" - poziom zagnieżdżenia oraz "site[1]" - opisujące na której stronie jestem). Dla trzeciego poziomu zagnieżdżenia będzie to już "menu", site[1], cursor[1], site[2], cursor[2], site[3]), a wszystko po to, żeby przy cofaniu, wracać do odpowiedniego menu z kursorem na odpowiedniej pozycji. Może da się to łatwiej zrobić, nie wiem.

Jak byłem na studiach to na pierwszych zajęciach z programowania (wtedy to było jeszcze C) mówili, że funkcja najlepiej, żeby miała do 5 linijek i robiła jedną rzecz. Jeśli uważasz, że wciąż robisz jedną rzecz, a masz już 20 linijek to po prostu bierzesz kod, przeklejasz do odrębnej funkcji, wybierasz parametry które trzeba do niej przekazać i potem myślisz co to jest i jak to się nazywa. Muszę powiedzieć super rada na pierwsze kroki, to było pomocne. Z czasem nauczysz się pisać funkcje, które mają w większości do 5 linii.

Potem zacznie ci uwierać ilość parametrów, więc zaczniesz je zawierać w strukturach. Potem skojarzysz, które funkcje działają na których klasach i tak dochodzisz do podstaw obiektówki.


edytowany 3x, ostatnio: elwis

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.