aboutsummaryrefslogtreecommitdiff
path: root/firmware/menu.cpp
diff options
context:
space:
mode:
authorkrolyxon <me@krolyxon.com>2026-05-04 22:48:07 +0530
committerkrolyxon <me@krolyxon.com>2026-05-04 22:48:07 +0530
commit0a40daf4fad5c1593c6e1696ac0cab992c799e2e (patch)
tree28b6d356872f6030053028dd46e3bb73f81ac06b /firmware/menu.cpp
initial commit
Diffstat (limited to 'firmware/menu.cpp')
-rw-r--r--firmware/menu.cpp278
1 files changed, 278 insertions, 0 deletions
diff --git a/firmware/menu.cpp b/firmware/menu.cpp
new file mode 100644
index 0000000..411df35
--- /dev/null
+++ b/firmware/menu.cpp
@@ -0,0 +1,278 @@
+#include <Arduino.h>
+#include "menu.h"
+#include "display.h"
+#include "buttons.h"
+#include "badusb.h"
+#include "nrf24.h"
+#include "cc1101.h"
+#include "blescanner.h"
+#include "wifi_scan.h"
+#include "wifi_analyzer.h"
+#include "device_check.h"
+
+// ================= FEATURE HANDLERS =================
+void runSystemInfoFeature();
+void runRFCaptureFeature();
+void runBLEScanFeature();
+
+
+
+// ================= MENU DATA =================
+
+// Root menu
+const char *mainMenuItems[] = {
+ "BadUSB",
+ "RF Capture",
+ "NRF Jammer",
+ "BLE Scan",
+ "Wifi Scan",
+ "Wifi Analyzer",
+ "System Info",
+ "Device Check",
+ "Restart"
+};
+
+Menu mainMenu = {mainMenuItems, sizeof(mainMenuItems) / sizeof(mainMenuItems[0])};
+
+// BadUSB submenu
+const char *badusbItems[] = {
+ "Demo",
+ "Open CMD",
+ "Rickroll"};
+
+Menu badusbMenu = {badusbItems, 3};
+
+// ================= MENU STATE =================
+
+Menu *currentMenu = &mainMenu;
+
+int menuIndex = 0;
+int menuOffset = 0;
+
+#define MENU_VISIBLE_ROWS 4
+
+bool insideFeature = false;
+
+// ================= DRAW =================
+
+void drawMenu()
+{
+ u8g2.clearBuffer();
+
+ // scroll handling
+ if (menuIndex < menuOffset)
+ menuOffset = menuIndex;
+
+ if (menuIndex >= menuOffset + MENU_VISIBLE_ROWS)
+ menuOffset = menuIndex - MENU_VISIBLE_ROWS + 1;
+
+ for (int i = 0; i < MENU_VISIBLE_ROWS; i++)
+ {
+ int item = menuOffset + i;
+
+ if (item >= currentMenu->size)
+ break;
+
+ if (item == menuIndex)
+ u8g2.drawStr(0, 14 + i * 14, ">");
+
+ u8g2.drawStr(10, 14 + i * 14, currentMenu->items[item]);
+ }
+
+ // scroll indicators
+ if (menuOffset > 0)
+ u8g2.drawStr(118, 10, "^");
+
+ if (menuOffset + MENU_VISIBLE_ROWS < currentMenu->size)
+ u8g2.drawStr(118, 62, "v");
+
+ u8g2.sendBuffer();
+}
+
+// ================= FEATURE EXECUTION =================
+
+void launchFeature()
+{
+ insideFeature = true;
+
+ if (currentMenu == &mainMenu)
+ {
+ switch (menuIndex)
+ {
+ case 0: // BadUSB → enter submenu
+ currentMenu = &badusbMenu;
+ menuIndex = 0;
+ menuOffset = 0;
+ break;
+
+ case 1:
+ if (!isCC1101Ready()) {
+ if (!initCC1101()) {
+ Serial.println("CC1101 failed");
+ return;
+ }
+ }
+
+ Serial.println("Ready to capture...");
+
+ startCapture();
+ delay(5000);
+ stopCapture();
+ printCapture();
+ break;
+ case 2:
+ startNRFJammer();
+ break;
+
+ case 3:
+ ble_scan();
+ ble_drawMenu();
+ while (1) {
+ ble_loop();
+ if (btnBack())
+ break;
+ }
+ break;
+
+ case 4:
+ {
+ // Start scan once
+ wifi_scan_start();
+ wifi_scan_draw();
+
+ while (1) {
+ wifi_scan_loop();
+ // EXIT condition handled ONLY here
+ if (btnBack()) {
+ delay(150); // debounce
+ break;
+ }
+ }
+ break;
+ }
+ case 5:
+ {
+
+ wifi_analyzer_start();
+
+ bool prevBack = false;
+ while (1)
+ {
+ wifi_analyzer_loop();
+ bool nowBack = btnBack();
+ if (nowBack && !prevBack)
+ {
+ delay(150);
+ break;
+ }
+ prevBack = nowBack;
+ }
+ break;
+ }
+
+ case 6:
+ runSystemInfoFeature();
+ break;
+ case 7:
+ device_check_run();
+ break;
+ case 8:
+ u8g2.clearBuffer();
+ u8g2.setFont(u8g2_font_6x13_tr);
+ u8g2.drawStr(30, 30, "Restarting...");
+ u8g2.sendBuffer();
+ delay(1000);
+ ESP.restart();
+ break;
+ }
+ }
+ else if (currentMenu == &badusbMenu)
+ {
+ switch (menuIndex)
+ {
+ case 0:
+ runBadUSBDemo();
+ break;
+
+ case 1:
+ Serial.println("Open CMD payload");
+ runBadUSBOpenCMD();
+ break;
+
+ case 2:
+ Serial.println("Rickroll payload");
+ runBadUSBRickroll();
+ break;
+ }
+ }
+
+ insideFeature = false;
+
+ drawMenu();
+}
+
+// ================= INIT =================
+
+void menuInit()
+{
+ currentMenu = &mainMenu;
+ menuIndex = 0;
+ menuOffset = 0;
+
+ drawMenu();
+}
+
+// ================= LOOP =================
+
+void menuLoop()
+{
+ static uint32_t lastPress = 0;
+
+ if (insideFeature)
+ return;
+
+ if (millis() - lastPress < 150)
+ return;
+
+ if (btnUp())
+ {
+ menuIndex--;
+
+ if (menuIndex < 0)
+ menuIndex = currentMenu->size - 1;
+
+ drawMenu();
+ lastPress = millis();
+ }
+
+ else if (btnDown())
+ {
+ menuIndex++;
+
+ if (menuIndex >= currentMenu->size)
+ menuIndex = 0;
+
+ drawMenu();
+ lastPress = millis();
+ }
+
+ else if (btnSelect())
+ {
+ launchFeature();
+ lastPress = millis();
+ }
+
+ else if (btnBack())
+ {
+ if (currentMenu != &mainMenu)
+ {
+ currentMenu = &mainMenu;
+ menuIndex = 0;
+ menuOffset = 0;
+
+ drawMenu();
+ }
+
+ lastPress = millis();
+ }
+}