#include "Display.
h"
#include <vector>
// Real Punisher Skull Bitmap (128x64, generated via Image2CPP for a standard Punisher skull
design)
const unsigned char punisherSkull[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00
};
// Menu Icons (16x16)
const unsigned char icon_rf[] PROGMEM = {0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF,
0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF};
const unsigned char icon_ir[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x7F, 0xFE,
0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const unsigned char icon_wifi[] PROGMEM = {0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC,
0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x00, 0x00};
const unsigned char icon_ble[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x7F, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const unsigned char icon_jammer[] PROGMEM = {0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55,
0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55};
const unsigned char icon_sd_card[] PROGMEM = {0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xC0,
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF};
const unsigned char icon_bomb_timer[] PROGMEM = {0x00, 0x00, 0x07, 0xE0, 0x08, 0x10,
0x10, 0x08, 0x10, 0x08, 0x08, 0x10, 0x07, 0xE0, 0x00, 0x00};
const unsigned char icon_ask[] PROGMEM = {0xFF, 0xFF, 0x80, 0x01, 0x80, 0x01, 0xFF, 0xFF,
0xFF, 0xFF, 0x80, 0x01, 0x80, 0x01, 0xFF, 0xFF};
const unsigned char icon_ook[] PROGMEM = {0xFF, 0xFF, 0x80, 0x00, 0x80, 0x00, 0xFF, 0xFF,
0xFF, 0xFF, 0x80, 0x00, 0x80, 0x00, 0xFF, 0xFF};
const unsigned char icon_fsk[] PROGMEM = {0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55,
0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55};
const unsigned char icon_gfsk[] PROGMEM = {0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA,
0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA};
const unsigned char icon_manchester[] PROGMEM = {0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC,
0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33};
const unsigned char icon_keeloq[] PROGMEM = {0xF0, 0x0F, 0x0F, 0xF0, 0xF0, 0x0F, 0x0F,
0xF0, 0xF0, 0x0F, 0x0F, 0xF0, 0xF0, 0x0F, 0x0F, 0xF0};
const unsigned char icon_aes_rolling[] PROGMEM = {0x3C, 0x3C, 0xC3, 0xC3, 0x3C, 0x3C,
0xC3, 0xC3, 0x3C, 0x3C, 0xC3, 0xC3, 0x3C, 0x3C, 0xC3, 0xC3};
const unsigned char icon_custom[] PROGMEM = {0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40,
0x02, 0x40, 0x02, 0x40, 0x02, 0x7F, 0xFE, 0x00, 0x00};
MenuIcon mainMenuIcons[] = {
{icon_rf, 16, 16}, {icon_ir, 16, 16}, {icon_wifi, 16, 16}, {icon_ble, 16, 16},
{icon_jammer, 16, 16}, {icon_sd_card, 16, 16}, {icon_bomb_timer, 16, 16}
};
MenuIcon protocolIcons[] = {
{icon_ask, 16, 16}, {icon_ook, 16, 16}, {icon_fsk, 16, 16}, {icon_gfsk, 16, 16},
{icon_manchester, 16, 16}, {icon_keeloq, 16, 16}, {icon_aes_rolling, 16, 16}, {icon_custom, 16,
16}
};
float getBatteryPercentage() {
int raw = analogRead(BATTERY_PIN);
float voltage = raw * (3.3 / 4095.0) * 2.0; // Assuming voltage divider
return constrain((voltage - 3.0) / (4.2 - 3.0) * 100, 0, 100);
}
void showPunisherLogo() {
[Link]();
[Link](0, 0, 128, 64, punisherSkull);
[Link](u8g2_font_6x10_tr);
[Link](0);
[Link](10, 60, "WaveBreaker v1.0");
[Link](1);
[Link]();
saveToSD("Displayed Punisher Logo", "/signals/[Link]", false);
delay(3000);
}
void showWarningScreen() {
[Link]();
[Link](u8g2_font_6x10_tr);
[Link](0, 10, "WARNING: FOR");
[Link](0, 20, "EDUCATIONAL USE ONLY");
[Link](0, 30, "MADE BY PARADOX_BADSHA");
[Link](0, 40, "PARABOX PENTESTING");
[Link](0, 50, "Version: v1.0");
[Link]();
saveToSD("Displayed Warning Screen", "/signals/[Link]", false);
delay(2000);
}
void showMainMenu() {
const char* menuItems[] = {"RF Tools", "IR Tools", "WiFi Tools", "BLE Tools", "Jammer", "SD
Card", "Bomb Timer"};
drawSideMenu(menuItems, 7, [Link], "Main Menu");
}
void drawSideMenu(const char* menu[], int size, int selected, const char* title, int xOffset) {
[Link]();
[Link](u8g2_font_6x10_tr);
[Link](0, 8, "Bat:"); [Link](20, 8); [Link](getBatteryPercentage());
[Link]("%");
[Link](80, 8); [Link]([Link]); [Link]("MHz");
[Link](50, 8);
switch ([Link]) {
case WaveBreakerState::ASK: [Link]("ASK"); break;
case WaveBreakerState::OOK: [Link]("OOK"); break;
case WaveBreakerState::FSK: [Link]("FSK"); break;
case WaveBreakerState::GFSK: [Link]("GFSK"); break;
case WaveBreakerState::MANCHESTER: [Link]("Manchester"); break;
case WaveBreakerState::KEELOQ: [Link]("KeeLoq"); break;
case WaveBreakerState::AES_ROLLING: [Link]("AES"); break;
case WaveBreakerState::CUSTOM: [Link]("Custom"); break;
}
for (int i = max(0, selected - 2); i < min(size, selected + 3); i++) {
int x = xOffset + (i - selected) * 32;
if (x >= 0 && x < 128) {
if (i == selected) {
[Link](x, 16, 32, 48);
[Link](x + 2, 18, 28, 44);
[Link](0);
}
MenuIcon* icons = ([Link] == WaveBreakerState::RF_PROTOCOL_CONFIG) ?
protocolIcons : mainMenuIcons;
[Link](x + 8, 20, icons[i].width, icons[i].height, icons[i].bitmap);
[Link](1);
[Link](x, 50, menu[i]);
}
}
[Link]();
}
void animateMenuTransition(int direction) {
const int steps = 10;
int xOffset = direction > 0 ? -32 : 32;
for (int i = 0; i < steps; i++) {
[Link]();
[Link](u8g2_font_6x10_tr);
int shift = (xOffset * (steps - i)) / steps;
drawSideMenu((const char*[]){"RF Tools", "IR Tools", "WiFi Tools", "BLE Tools", "Jammer",
"SD Card", "Bomb Timer"}, 7, [Link], "Main Menu", shift);
[Link]();
delay(15);
}
}
void drawGraph(int values[], int size) {
[Link]();
[Link](u8g2_font_6x10_tr);
[Link](0, 10, "Signal Strength");
for (int i = 0; i < min(size, 128); i++) {
int height = map(values[i], 0, 100, 0, 50);
[Link](i, 64 - height, i, 64);
}
[Link]();
saveToSD("Displayed Signal Graph", "/signals/[Link]", false);
}
void updateDisplay() {
if ([Link]) return;
[Link]();
[Link](u8g2_font_6x10_tr);
switch ([Link]) {
case WaveBreakerState::MAIN_MENU:
showMainMenu();
break;
case WaveBreakerState::RF_SUBMENU:
drawSideMenu((const char*[]){"Set Frequency", "Capture Signal", "Replay Signal", "Brute
Force", "Rollback Attack", "Dynamic Scan", "Protocol Config"}, 7, [Link], "RF
Tools");
break;
case WaveBreakerState::IR_SUBMENU:
drawSideMenu((const char*[]){"Receive IR", "Transmit IR", "Delete IR", "IR Brute Force"}, 4,
[Link], "IR Tools");
break;
case WaveBreakerState::WIFI_SUBMENU:
drawSideMenu((const char*[]){"WiFi Scan", "Evil Twin", "Deauth Attack", "Packet Sniffer"}, 4,
[Link], "WiFi Tools");
break;
case WaveBreakerState::BLE_SUBMENU:
drawSideMenu((const char*[]){"BLE Spam", "BLE Scan"}, 2, [Link], "BLE
Tools");
break;
case WaveBreakerState::JAMMER_SUBMENU:
drawSideMenu((const char*[]){"Jam 315 MHz", "Jam 433 MHz", "Jam 2.4 GHz", "Jam
Random", "Jam IR"}, 5, [Link], "Jammer");
break;
case WaveBreakerState::SD_CARD_SUBMENU:
drawSideMenu((const char*[]){"Import Signals", "Export Signals", "Import Protocol"}, 3,
[Link], "SD Card");
break;
case WaveBreakerState::BOMB_TIMER_SUBMENU:
drawSideMenu((const char*[]){"Set Minutes", "Set Seconds"}, 2, [Link], "Bomb
Timer");
break;
case WaveBreakerState::RF_PROTOCOL_CONFIG:
drawSideMenu((const char*[]){"ASK", "OOK", "FSK", "GFSK", "Manchester", "KeeLoq",
"AES Rolling", "Custom"}, WaveBreakerState::PROTOCOL_COUNT, [Link],
"Protocol Config");
break;
case WaveBreakerState::RF_SET_FREQUENCY:
[Link](0, 10, "Set Frequency (MHz)");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Freq: "); [Link]([Link]);
[Link](0, 40, "UP/DOWN: Adjust");
[Link](0, 50, "ENTER: Set BACK: Cancel");
break;
case WaveBreakerState::RF_CAPTURE_SIGNAL:
[Link](0, 10, "Capture RF Signal");
[Link](0, 20, "-------------------");
if ([Link]) {
[Link](0, 30, "Waiting for RF signal...");
[Link](0, 40, "ENTER: Retry BACK: Exit");
} else {
[Link](0, 30, "Press ENTER to start");
[Link](0, 40, "BACK: Exit");
}
break;
case WaveBreakerState::RF_REPLAY_SIGNAL:
[Link](0, 10, "Replay RF Signal");
[Link](0, 20, "-------------------");
if ([Link]()) {
[Link](0, 30, "No Signals Saved");
} else {
[Link](0, 30); [Link]("Signal: ");
[Link]([Link][[Link]].name.c_str());
[Link](0, 40, "ENTER: Replay BACK: Exit");
}
break;
case WaveBreakerState::RF_BRUTE_FORCE:
drawSideMenu((const char*[]){"Standard Brute Force", "Rolling Code Brute"}, 2,
[Link], "RF Brute Force");
break;
case WaveBreakerState::RF_ROLLBACK_ATTACK:
drawSideMenu((const char*[]){"Capture Rollback", "Replay Rollback"}, 2, [Link],
"Rollback Attack");
break;
case WaveBreakerState::RF_DYNAMIC_SCAN:
drawSideMenu((const char*[]){"Scan 315 MHz", "Scan 433 MHz", "Scan 2.4 GHz"}, 3,
[Link], "Dynamic Scan");
break;
case WaveBreakerState::IR_RECEIVE:
[Link](0, 10, "Receive IR Signal");
[Link](0, 20, "-------------------");
if ([Link]) {
[Link](0, 30, "Waiting for IR signal...");
[Link](0, 40, "ENTER: Retry BACK: Exit");
} else {
[Link](0, 30, "Press ENTER to start");
[Link](0, 40, "BACK: Exit");
}
break;
case WaveBreakerState::IR_TRANSMIT:
[Link](0, 10, "Transmit IR Signal");
[Link](0, 20, "-------------------");
if ([Link]()) {
[Link](0, 30, "No Signals Saved");
} else {
[Link](0, 30); [Link]("Signal: ");
[Link]([Link][[Link]].name.c_str());
[Link](0, 40, "ENTER: Transmit BACK: Exit");
}
break;
case WaveBreakerState::IR_DELETE:
[Link](0, 10, "Delete IR Signal");
[Link](0, 20, "-------------------");
if ([Link]()) {
[Link](0, 30, "No Signals to Delete");
} else {
[Link](0, 30); [Link]("Signal: ");
[Link]([Link][[Link]].name.c_str());
[Link](0, 40, "ENTER: Delete BACK: Exit");
}
break;
case WaveBreakerState::IR_BRUTE_FORCE:
drawSideMenu((const char*[]){"NEC", "Sony", "RC5", "RC6", "Samsung", "Panasonic",
"JVC", "Denon", "Sharp", "LG",
"Whynter", "Lego", "BoseWave", "Bang&Olufsen", "Fast", "MagiQuest",
"Universal", "All"},
WaveBreakerState::BF_PROTOCOL_COUNT, [Link], "IR Brute Force");
break;
case WaveBreakerState::WIFI_SCAN:
case WaveBreakerState::BLE_SCAN:
[Link](0, 10, [Link] == WaveBreakerState::WIFI_SCAN ? "WiFi Scan
Results" : "BLE Scan Results");
[Link](0, 20, "-------------------");
if ([Link]()) {
[Link](0, 30, "No Devices Found");
} else {
[Link](0, 30); [Link]([Link][[Link]].substring(0,
20).c_str());
[Link](0, 40, "UP/DOWN: Select");
[Link](0, 50, "BACK: Exit");
}
break;
case WaveBreakerState::WIFI_EVIL_TWIN:
[Link](0, 10, "Evil Twin AP");
[Link](0, 20, "-------------------");
[Link](0, 30, "SSID: WaveBreaker");
[Link](0, 40, "Status: Running");
[Link](0, 50, "BACK: Stop");
break;
case WaveBreakerState::WIFI_DEAUTH:
[Link](0, 10, "Deauth Attack");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Target: ");
[Link]([Link][[Link]].substring(0, 15).c_str());
[Link](0, 40, "Status: Running");
[Link](0, 50, "BACK: Stop");
break;
case WaveBreakerState::WIFI_SNIFFER:
[Link](0, 10, "Packet Sniffer");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Channel: "); [Link]([Link]);
[Link](0, 40, "Status: Running");
[Link](0, 50, "BACK: Stop");
break;
case WaveBreakerState::BLE_SPAM:
[Link](0, 10, "BLE Spam");
[Link](0, 20, "-------------------");
[Link](0, 30, "Status: Broadcasting");
[Link](0, 40, "BACK: Stop");
break;
case WaveBreakerState::JAMMER_RUNNING:
[Link](0, 10, "Jammer Active");
[Link](0, 20, "-------------------");
[Link](0, 30);
switch ([Link]) {
case 0: [Link]("315 MHz"); break;
case 1: [Link]("433 MHz"); break;
case 2: [Link]("2.4 GHz"); break;
case 3: [Link]("Random"); break;
case 4: [Link]("IR Jammer"); break;
}
[Link](0, 40, "BACK: Stop");
break;
case WaveBreakerState::SD_IMPORT:
[Link](0, 10, "Import Signals");
[Link](0, 20, "-------------------");
[Link](0, 30, "ENTER: Import");
[Link](0, 40, "BACK: Exit");
break;
case WaveBreakerState::SD_EXPORT:
[Link](0, 10, "Export Signals");
[Link](0, 20, "-------------------");
[Link](0, 30, "ENTER: Export");
[Link](0, 40, "BACK: Exit");
break;
case WaveBreakerState::SD_PROTOCOL_IMPORT:
[Link](0, 10, "Import Protocol");
[Link](0, 20, "-------------------");
if ([Link]()) {
[Link](0, 30, "No Protocols Found");
} else {
[Link](0, 30); [Link]("Protocol: ");
[Link]([Link][[Link]].name.c_str());
[Link](0, 40, "ENTER: Import BACK: Exit");
}
break;
case WaveBreakerState::BOMB_SET_MINUTES:
[Link](0, 10, "Set Bomb Timer");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Minutes: "); [Link]([Link]);
[Link](0, 40, "UP/DOWN: Adjust");
[Link](0, 50, "ENTER: Next BACK: Exit");
break;
case WaveBreakerState::BOMB_SET_SECONDS:
[Link](0, 10, "Set Bomb Timer");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Seconds: "); [Link]([Link]);
[Link](0, 40, "UP/DOWN: Adjust");
[Link](0, 50, "ENTER: Start BACK: Exit");
break;
case WaveBreakerState::BOMB_RUNNING:
[Link](0, 10, "Bomb Timer");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Time Left: ");
[Link](([Link] / 1000) / 60); [Link](":");
[Link](([Link] / 1000) % 60);
[Link](0, 40, "BACK: Stop");
break;
case WaveBreakerState::IR_CONFIRM_SAVE:
[Link](0, 10, "Save IR Signal");
[Link](0, 20, "-------------------");
[Link](0, 30, "Signal Captured!");
[Link](0, 40, "ENTER: Save");
[Link](0, 50, "BACK: Discard");
break;
case WaveBreakerState::IR_BF_RUNNING:
[Link](0, 10, "IR Brute Force");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Code: 0x"); [Link]([Link], HEX);
[Link](0, 40, "BACK: Stop");
break;
case WaveBreakerState::RF_BF_RUNNING:
[Link](0, 10, "RF Brute Force");
[Link](0, 20, "-------------------");
[Link](0, 30); [Link]("Code: 0x"); [Link]([Link], HEX);
[Link](0, 40, "BACK: Stop");
break;
}
[Link]();
}