0% found this document useful (0 votes)
11 views11 pages

Display

The document contains bitmap data for a Punisher skull image and various menu icons, each defined as arrays of unsigned char in program memory. The Punisher skull bitmap is 128x64 pixels, while the menu icons are 16x16 pixels. Each icon represents different functionalities such as RF, IR, WiFi, and others.

Uploaded by

btm104460
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views11 pages

Display

The document contains bitmap data for a Punisher skull image and various menu icons, each defined as arrays of unsigned char in program memory. The Punisher skull bitmap is 128x64 pixels, while the menu icons are 16x16 pixels. Each icon represents different functionalities such as RF, IR, WiFi, and others.

Uploaded by

btm104460
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

#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]();
}

You might also like