diff --git a/TecktroHack/ui_interface.ino b/TecktroHack/ui_interface.ino index 609fc56..e69b670 100644 --- a/TecktroHack/ui_interface.ino +++ b/TecktroHack/ui_interface.ino @@ -44,9 +44,13 @@ enum MenuState { }; -const char* modelList[] = { "MDO5", "MDO4", "MDO3", "MDO2", "MDO1", "DPO5", "DPO4", "DPO3", "DPO2", "DPO1" }; +const char* modelList[] = { "DPO4", "DPO3", "DPO2", "DPO1", "MDO4", "MDO3", "MDO2", "MDO1"}; const uint8_t modelCount = sizeof(modelList) / sizeof(modelList[0]); +// Фильтрация опций по модели +uint8_t filteredOptionIndexes[50]; +uint8_t filteredOptionCount = 0; + const char* optionList[] = { "BND", // Bundle (all-in-one) "AERO", // Aerospace serial buses @@ -63,38 +67,107 @@ const char* optionList[] = { "PWR", // Power analysis "SA", // Spectrum Analyzer "SA3", // Spectrum Analyzer + "SA3T6", // Spectrum Analyzer "SA6", // Spectrum Analyzer "SEC", // Security extension "TRIG", // RF Power Level Trigger "USB", // USB analysis "VID" // Video signal triggering }; +const uint8_t optionCount = sizeof(optionList) / sizeof(optionList[0]); const char* optionDescriptions[] = { "Include all available options in one", - "Aerospace buses: MIL-STD-1553, ARINC 429", + "Aerospace buses: MIL-STD-1553", "Waveform generator for custom signals", - "Audio buses: I2S, TDM, LJ, RJ", - "Cars buses: CAN FD, CAN, LIN", - "Cars buses: CAN FD, CAN, LIN, FlexRay", - "Computer buses: SPI, I2C, RS-232, PS/2", - "Embedded protocols: I2C, SPI, UART, GPIO", - "Ethernet: 10/100/1000BASE-T", + "Audio buses: I2S, LJ, RJ, TDM", + "Cars buses: CAN, CAN FD, LIN", + "Cars buses: CAN, CAN FD, LIN, FlexRay", + "Computer buses: RS-232/422/485, UART", + "Embedded protocols: I2C, SPI", + "Ethernet: 10BASE-T, 100BASE-TX", "Cars bus FlexRay", "Limit and mask testing: Go/No-Go", "Mixed Signal Oscill: analog + digital", - "Power analysis: efficiency, ripple, Bode", + "Power: efficiency, ripple, dI/dt, dV/dt", "Spectrum analysis: RF, high-frequency", "Spectr analysis (3 MHz): RF, high-frequency", + "SA3 extention to 6 MHz for MDO4000C", "Spectr analysis (6 MHz): RF, high-frequency", "Security extension: access control", "RF power level triggering", - "USB decoding: USB 1.x/2.0/3.x", - "Video triggering: HDMI, VGA, analog" + "USB decoding: USB LS, FS, HS", + "Video triggering: HDTV" }; -const uint8_t optionCount = sizeof(optionList) / sizeof(optionList[0]); +bool isOptionForDPO[] = { + true, // BND → DPO4BND + true, // AERO → DPO4AERO + false, // AFG → (не используется в DPO) + true, // AUDIO → DPO4AUDIO + true, // AUTO → DPO4AUTO + true, // AUTOMAX → нет в DPO + true, // COMP → DPO4COMP + true, // EMBD → DPO4EMBD + true, // ENET → DPO4ENET + true, // FLEX → нет упоминания, но оставим + true, // LMT → DPO4LMT + false, // MSO → только для MDO (MDO4MSO) + true, // PWR → DPO4PWR + false, // SA → только MDO + false, // SA3 → только MDO + false, // SA3T6 → только MDO + false, // SA6 → только MDO + false, // SEC → только MDO (MDO4SEC) + false, // TRIG → только MDO (MDO4TRIG) + true, // USB → DPO4USB + true // VID → DPO4VID +}; + +bool isOptionForMDO[] = { + false, // BND → нет прямого MDO4BND + false, // AERO + true, // AFG → MDO4AFG + false, // AUDIO + false, // AUTO + false, // AUTOMAX → пусть будет для MDO + false, // COMP + false, // EMBD + false, // ENET + false, // FLEX + false, // LMT + true, // MSO → MDO4MSO + false, // PWR + true, // SA → MDO4SA3/MDO4SA6 + true, // SA3 → MDO4SA3 + true, // SA3 → MDO4SA3T6 + true, // SA6 → MDO4SA6 + true, // SEC → MDO4SEC + true, // TRIG → MDO4TRIG + false, // USB + false // VID +}; + +void filterOptionsForModel(const char* modelName) { + filteredOptionCount = 0; + + bool isMDO = strstr(modelName, "MDO") != nullptr; + bool isDPO = strstr(modelName, "DPO") != nullptr; + + for (uint8_t i = 0; i < optionCount; ++i) { + if ((isMDO && isOptionForMDO[i]) || (isDPO && isOptionForDPO[i])) { + filteredOptionIndexes[filteredOptionCount++] = i; + } + } + + // Подстраховка + if (filteredOptionCount == 0) { + for (uint8_t i = 0; i < sizeof(optionList); ++i) + filteredOptionIndexes[filteredOptionCount++] = i; + } +} + uint8_t selectedModel = 0; uint8_t selectedOption = 0; @@ -312,8 +385,10 @@ void updateMenuDisplay() { u8g2.setFont(FONT); // основной шрифт u8g2.drawStr(0, LINE_SPACING * 1, "Option:"); + if (cursorPos >= filteredOptionCount) cursorPos = filteredOptionCount - 1; + char line[20]; - uint8_t optIndex = cursorPos % optionCount; + uint8_t optIndex = filteredOptionIndexes[cursorPos]; snprintf(line, sizeof(line), ">%s", optionList[optIndex]); u8g2.drawStr(0, LINE_SPACING * 2, line); @@ -399,11 +474,12 @@ void handleOk() { } else if (currentMenu == MENU_SELECT_MODEL) { selectedModel = cursorPos % modelCount; + filterOptionsForModel(modelList[selectedModel]); // ← ВАЖНО! cursorPos = 0; currentMenu = MENU_SELECT_OPTION; } else if (currentMenu == MENU_SELECT_OPTION) { - selectedOption = cursorPos % optionCount; + selectedOption = filteredOptionIndexes[cursorPos];; char fullModule[32]; snprintf(fullModule, sizeof(fullModule), "%s%s", modelList[selectedModel], optionList[selectedOption]);