├── ESP-GRABER.ino ├── Pictures ├── ESP-GABER_Device.jpg ├── Logo_BW.png ├── Logo_GitHub.png └── Scheme.png ├── README.md └── interface.h /ESP-GRABER.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "interface.h" 8 | 9 | // Пины 10 | #define OLED_SCL 22 11 | #define OLED_SDA 21 12 | #define BTN_UP 27 // K1 (Up) 13 | #define BTN_DOWN 26 // K2 (Down) 14 | #define BTN_OK 33 // K3 (OK) 15 | #define BTN_BACK 32 // K4 (Back) 16 | #define CC1101_GDO0 2 17 | #define CC1101_CS 5 18 | #define CC1101_SCK 18 19 | #define CC1101_MOSI 23 20 | #define CC1101_MISO 19 21 | 22 | // OLED 23 | #define SCREEN_WIDTH 128 24 | #define SCREEN_HEIGHT 64 25 | #define OLED_RESET -1 26 | Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); 27 | 28 | // Кнопки 29 | GButton btn_up(BTN_UP, HIGH_PULL, NORM_OPEN); 30 | GButton btn_down(BTN_DOWN, HIGH_PULL, NORM_OPEN); 31 | GButton btn_ok(BTN_OK, HIGH_PULL, NORM_OPEN); 32 | GButton btn_back(BTN_BACK, HIGH_PULL, NORM_OPEN); 33 | 34 | // CC1101 35 | #define DEFAULT_RF_FREQUENCY 433.92 // MHz 36 | float frequency = DEFAULT_RF_FREQUENCY; 37 | const float frequencies[] = {315.0, 433.92, 868.0, 915.0}; 38 | const int numFrequencies = 4; 39 | int freqIndex = 1; // Дефолт 433.92 MHz 40 | 41 | // Список частот для аналайзера 42 | const float subghz_frequency_list[] = {315.0, 433.92, 868.0, 915.0}; 43 | const int subghz_frequency_count = sizeof(subghz_frequency_list) / sizeof(subghz_frequency_list[0]); 44 | int current_scan_index = 0; 45 | const int rssi_threshold = -85; // Порог RSSI 46 | 47 | // RCSwitch 48 | RCSwitch rcswitch = RCSwitch(); 49 | 50 | #define MAX_DATA_LOG 512 51 | #define MAX_KEY_COUNT 20 // Ключи 52 | #define RSSI_THRESHOLD -85 53 | #define MAX_TRIES 5 54 | #define EEPROM_SIZE 2048 // Место под ключи 55 | 56 | volatile bool recieved = false; 57 | volatile int keyRawLog[MAX_DATA_LOG]; 58 | volatile byte logLen; 59 | volatile bool sleepOn = false; 60 | 61 | enum emKeys { kUnknown, kP12bt, k12bt, k24bt, k64bt, kKeeLoq, kANmotors64, kPrinceton, kRcSwitch, kStarLine, kCAME, kNICE, kHOLTEK }; 62 | enum emMenuState { menuLogo, menuMain, menuReceive, menuTransmit, menuAnalyzer, menuJammer } menuState = menuLogo; 63 | 64 | struct tpKeyData { 65 | byte keyID[9]; 66 | int zero[2]; 67 | int one[2]; 68 | int prePulse[2]; 69 | int startPause[2]; 70 | int midlePause[2]; 71 | byte prePulseLenth; 72 | byte codeLenth; 73 | byte firstDataIdx; 74 | emKeys type; 75 | float frequency; 76 | int te; 77 | char rawData[16]; 78 | int bitLength; 79 | char preset[8]; 80 | }; 81 | 82 | byte maxKeyCount = MAX_KEY_COUNT; 83 | byte EEPROM_key_count; 84 | byte EEPROM_key_index = 0; 85 | unsigned long stTimer = 0; 86 | unsigned long scanTimer = 0; 87 | byte menuIndex = 0; 88 | bool awaitingDeleteConfirmation = false; 89 | bool validKeyReceived = false; 90 | bool readRAW = true; 91 | bool autoSave = false; 92 | int signals = 0; 93 | uint64_t lastSavedKey = 0; 94 | tpKeyData keyData1; 95 | float detected_frequency = 0.0; 96 | float last_detected_frequency = 0.0; 97 | bool display_updated = false; 98 | bool isJamming = false; 99 | 100 | String getTypeName(emKeys tp); 101 | void OLED_printKey(tpKeyData* kd, byte msgType = 0, bool isSending = false); 102 | void OLED_printError(String st, bool err = true); 103 | byte indxKeyInROM(tpKeyData* kd); 104 | bool EEPROM_AddKey(tpKeyData* kd); 105 | void EEPROM_get_key(byte EEPROM_key_index1, tpKeyData* kd); 106 | void sendSynthKey(tpKeyData* kd); 107 | void deleteCurrentKey(); 108 | void OLED_printWaitingSignal(); 109 | void myDelayMcs(unsigned long dl); 110 | void sendSynthBit(int bt[2]); 111 | void setupCC1101(); 112 | void read_rcswitch(tpKeyData* kd); 113 | void read_raw(tpKeyData* kd); 114 | void restoreReceiveMode(); 115 | void OLED_printAnalyzer(bool signalReceived = false, float detectedFreq = 0.0); 116 | void OLED_printJammer(); 117 | void startJamming(); 118 | void stopJamming(); 119 | 120 | void setup() { 121 | Serial.begin(115200); 122 | 123 | // Снова кнопки 124 | btn_up.setDebounce(50); 125 | btn_up.setTimeout(500); 126 | btn_up.setClickTimeout(300); 127 | btn_up.setStepTimeout(200); 128 | btn_down.setDebounce(50); 129 | btn_down.setTimeout(500); 130 | btn_down.setClickTimeout(300); 131 | btn_down.setStepTimeout(200); 132 | btn_ok.setDebounce(50); 133 | btn_ok.setTimeout(500); 134 | btn_ok.setClickTimeout(300); 135 | btn_ok.setStepTimeout(200); 136 | btn_back.setDebounce(50); 137 | btn_back.setTimeout(500); 138 | btn_back.setClickTimeout(300); 139 | btn_back.setStepTimeout(200); 140 | btn_up.setTickMode(AUTO); 141 | btn_down.setTickMode(AUTO); 142 | 143 | // Инициализация OLED 144 | Wire.begin(OLED_SDA, OLED_SCL); 145 | if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 146 | Serial.println(F("SSD1306 allocation failed")); 147 | for (;;); 148 | } 149 | OLED_printLogo(display); 150 | 151 | // Инициализация CC1101 152 | setupCC1101(); 153 | 154 | // Инициализация RCSwitch 155 | rcswitch.enableReceive(CC1101_GDO0); 156 | 157 | // Инициализация EEPROM 158 | EEPROM.begin(EEPROM_SIZE); 159 | byte read_count = EEPROM.read(0); 160 | EEPROM_key_count = (read_count <= MAX_KEY_COUNT) ? read_count : 0; 161 | EEPROM_key_index = EEPROM.read(1); 162 | if (EEPROM_key_count > 0 && EEPROM_key_index <= EEPROM_key_count && EEPROM_key_index > 0) { 163 | EEPROM_get_key(EEPROM_key_index, &keyData1); 164 | } else { 165 | EEPROM_key_count = 0; 166 | EEPROM_key_index = 0; 167 | EEPROM.write(0, 0); 168 | EEPROM.write(1, 0); 169 | EEPROM.commit(); 170 | memset(&keyData1, 0, sizeof(tpKeyData)); 171 | } 172 | 173 | // Ждём кнопку для выхода с лого 174 | while (!(btn_up.isClick() || btn_down.isClick() || btn_ok.isClick() || btn_back.isClick())) { 175 | btn_up.tick(); 176 | btn_down.tick(); 177 | btn_ok.tick(); 178 | btn_back.tick(); 179 | } 180 | menuState = menuMain; 181 | OLED_printMenu(display, menuIndex); 182 | } 183 | 184 | void loop() { 185 | btn_up.tick(); 186 | btn_down.tick(); 187 | btn_ok.tick(); 188 | btn_back.tick(); 189 | 190 | // Serial 191 | if (Serial.available()) { 192 | char echo = Serial.read(); 193 | if (echo == 'e') { 194 | display.clearDisplay(); 195 | display.setTextSize(1); 196 | display.setCursor(0, 0); 197 | display.print(F("EEPROM cleared success!")); 198 | display.display(); 199 | EEPROM.write(0, 0); 200 | EEPROM.write(1, 0); 201 | EEPROM.commit(); 202 | EEPROM_key_count = 0; 203 | EEPROM_key_index = 0; 204 | memset(&keyData1, 0, sizeof(tpKeyData)); 205 | stTimer = millis(); 206 | } else if (echo == 't' && menuState == menuTransmit && EEPROM_key_count > 0) { 207 | sendSynthKey(&keyData1); 208 | restoreReceiveMode(); 209 | stTimer = millis(); 210 | } 211 | } 212 | 213 | // Menu 214 | if (menuState == menuLogo) { 215 | if (btn_up.isClick() || btn_down.isClick() || btn_ok.isClick() || btn_back.isClick()) { 216 | menuState = menuMain; 217 | OLED_printMenu(display, menuIndex); 218 | } 219 | } else if (menuState == menuMain) { 220 | if (btn_up.isClick()) { 221 | menuIndex = (menuIndex == 0) ? 3 : menuIndex - 1; 222 | OLED_printMenu(display, menuIndex); 223 | } 224 | if (btn_down.isClick()) { 225 | menuIndex = (menuIndex == 3) ? 0 : menuIndex + 1; 226 | OLED_printMenu(display, menuIndex); 227 | } 228 | if (btn_ok.isClick()) { 229 | if (menuIndex == 0) menuState = menuReceive; 230 | else if (menuIndex == 1) menuState = menuTransmit; 231 | else if (menuIndex == 2) menuState = menuAnalyzer; 232 | else if (menuIndex == 3) menuState = menuJammer; 233 | if (menuState == menuReceive) { 234 | setupCC1101(); 235 | rcswitch.disableReceive(); 236 | rcswitch.enableReceive(CC1101_GDO0); 237 | validKeyReceived = false; 238 | signals = 0; 239 | memset(&keyData1, 0, sizeof(tpKeyData)); 240 | lastSavedKey = 0; 241 | rcswitch.resetAvailable(); 242 | OLED_printWaitingSignal(); 243 | } else if (menuState == menuTransmit) { 244 | if (EEPROM_key_count > 0) { 245 | EEPROM_get_key(EEPROM_key_index, &keyData1); 246 | } else { 247 | memset(&keyData1, 0, sizeof(tpKeyData)); 248 | } 249 | OLED_printKey(&keyData1); 250 | } else if (menuState == menuAnalyzer) { 251 | setupCC1101(); 252 | rcswitch.disableReceive(); 253 | current_scan_index = 0; 254 | detected_frequency = 0.0; 255 | last_detected_frequency = 0.0; 256 | display_updated = false; 257 | scanTimer = millis(); 258 | OLED_printAnalyzer(); 259 | } else if (menuState == menuJammer) { 260 | isJamming = false; 261 | OLED_printJammer(); 262 | } 263 | stTimer = millis(); 264 | } 265 | if (btn_back.isClick()) { 266 | menuState = menuLogo; 267 | OLED_printLogo(display); 268 | } 269 | } else { 270 | // EEPROM clear 271 | if (btn_up.isHold() && btn_down.isHold()) { 272 | display.clearDisplay(); 273 | display.setTextSize(1); 274 | display.setCursor(0, 0); 275 | display.print(F("EEPROM cleared success!")); 276 | display.display(); 277 | EEPROM.write(0, 0); 278 | EEPROM.write(1, 0); 279 | EEPROM.commit(); 280 | EEPROM_key_count = 0; 281 | EEPROM_key_index = 0; 282 | memset(&keyData1, 0, sizeof(tpKeyData)); 283 | stTimer = millis(); 284 | } 285 | 286 | // Подтверждение удаления 287 | if (awaitingDeleteConfirmation) { 288 | if (btn_ok.isClick()) { 289 | deleteCurrentKey(); 290 | awaitingDeleteConfirmation = false; 291 | if (menuState == menuTransmit) { 292 | OLED_printKey(&keyData1); 293 | } else if (menuState == menuReceive) { 294 | OLED_printWaitingSignal(); 295 | } else { 296 | menuState = menuMain; 297 | OLED_printMenu(display, menuIndex); 298 | } 299 | stTimer = millis(); 300 | } else if (btn_back.isClick() || btn_up.isClick() || btn_down.isClick()) { 301 | awaitingDeleteConfirmation = false; 302 | if (menuState == menuTransmit) { 303 | OLED_printKey(&keyData1); 304 | } else if (menuState == menuReceive) { 305 | OLED_printWaitingSignal(); 306 | } else if (menuState == menuAnalyzer) { 307 | OLED_printAnalyzer(last_detected_frequency != 0.0, last_detected_frequency); 308 | } else if (menuState == menuJammer) { 309 | OLED_printJammer(); 310 | } else { 311 | menuState = menuMain; 312 | OLED_printMenu(display, menuIndex); 313 | } 314 | stTimer = millis(); 315 | } 316 | return; 317 | } 318 | 319 | // Сцены 320 | if (menuState == menuReceive) { 321 | // Переключение частоты 322 | if (btn_up.isClick()) { 323 | freqIndex = (freqIndex + 1) % numFrequencies; 324 | frequency = frequencies[freqIndex]; 325 | keyData1.frequency = frequency; 326 | setupCC1101(); 327 | OLED_printWaitingSignal(); 328 | stTimer = millis(); 329 | } 330 | if (btn_down.isClick()) { 331 | freqIndex = (freqIndex - 1 + numFrequencies) % numFrequencies; 332 | frequency = frequencies[freqIndex]; 333 | keyData1.frequency = frequency; 334 | setupCC1101(); 335 | OLED_printWaitingSignal(); 336 | stTimer = millis(); 337 | } 338 | if (btn_ok.isHolded() && validKeyReceived) { 339 | Serial.print(F("Attempting to save key: ID=")); 340 | for (byte i = 0; i < keyData1.codeLenth >> 3; i++) { 341 | Serial.print(keyData1.keyID[i], HEX); 342 | } 343 | Serial.println(); 344 | if (EEPROM_AddKey(&keyData1)) { 345 | display.clearDisplay(); 346 | display.drawBitmap(16, 6, image_DolphinSaved_bits, 92, 58, 1); 347 | display.setTextColor(1); 348 | display.setTextWrap(false); 349 | display.setCursor(6, 16); 350 | display.print("Saved"); 351 | display.display(); 352 | Serial.println(F("Key saved successfully")); 353 | delay(1000); 354 | validKeyReceived = false; 355 | signals = 0; 356 | memset(&keyData1, 0, sizeof(tpKeyData)); 357 | lastSavedKey = 0; 358 | rcswitch.resetAvailable(); 359 | } else { 360 | OLED_printError(F("Key not saved"), true); 361 | Serial.println(F("Failed to save key")); 362 | } 363 | OLED_printWaitingSignal(); 364 | stTimer = millis(); 365 | } 366 | if (rcswitch.available()) { 367 | Serial.println(F("Signal received")); 368 | if (!readRAW) { 369 | read_rcswitch(&keyData1); 370 | } else { 371 | read_raw(&keyData1); 372 | } 373 | if (validKeyReceived && autoSave && (lastSavedKey != keyData1.keyID[0] || keyData1.keyID[0] == 0)) { 374 | Serial.print(F("Auto-saving key: ID=")); 375 | for (byte i = 0; i < keyData1.codeLenth >> 3; i++) { 376 | Serial.print(keyData1.keyID[i], HEX); 377 | } 378 | Serial.println(); 379 | if (EEPROM_AddKey(&keyData1)) { 380 | lastSavedKey = keyData1.keyID[0]; 381 | Serial.println(F("Key auto-saved successfully")); 382 | validKeyReceived = false; 383 | signals = 0; 384 | memset(&keyData1, 0, sizeof(tpKeyData)); 385 | rcswitch.resetAvailable(); 386 | } else { 387 | Serial.println(F("Auto-save failed")); 388 | } 389 | } 390 | stTimer = millis(); 391 | } 392 | } else if (menuState == menuTransmit) { 393 | if (btn_up.isClick() && (EEPROM_key_count > 0)) { 394 | EEPROM_key_index = (EEPROM_key_index == EEPROM_key_count) ? 1 : EEPROM_key_index + 1; 395 | EEPROM_get_key(EEPROM_key_index, &keyData1); 396 | OLED_printKey(&keyData1); 397 | stTimer = millis(); 398 | } 399 | if (btn_down.isClick() && (EEPROM_key_count > 0)) { 400 | EEPROM_key_index = (EEPROM_key_index == 1) ? EEPROM_key_count : EEPROM_key_index - 1; 401 | EEPROM_get_key(EEPROM_key_index, &keyData1); 402 | OLED_printKey(&keyData1); 403 | stTimer = millis(); 404 | } 405 | if (btn_ok.isClick()) { 406 | if (EEPROM_key_count > 0) { 407 | sendSynthKey(&keyData1); 408 | restoreReceiveMode(); 409 | } else { 410 | OLED_printError(F("No keys to send"), true); 411 | delay(1000); 412 | OLED_printKey(&keyData1); 413 | } 414 | stTimer = millis(); 415 | } 416 | } else if (menuState == menuAnalyzer) { 417 | if (millis() - scanTimer >= 250) { 418 | int rssi = ELECHOUSE_cc1101.getRssi(); 419 | if (rssi >= rssi_threshold) { 420 | detected_frequency = subghz_frequency_list[current_scan_index]; 421 | if (detected_frequency != last_detected_frequency) { 422 | last_detected_frequency = detected_frequency; 423 | Serial.print(F("Signal detected at ")); 424 | Serial.print(detected_frequency); 425 | Serial.println(F(" MHz")); 426 | OLED_printAnalyzer(true, last_detected_frequency); 427 | display_updated = true; 428 | } 429 | } else { 430 | // Сигнал отсутствует, продолжаем скан 431 | detected_frequency = 0.0; 432 | } 433 | // Следующая частота 434 | current_scan_index = (current_scan_index + 1) % subghz_frequency_count; 435 | ELECHOUSE_cc1101.setMHZ(subghz_frequency_list[current_scan_index]); 436 | ELECHOUSE_cc1101.SetRx(); 437 | delayMicroseconds(3500); // Стабилизация приемника 438 | scanTimer = millis(); 439 | } 440 | } else if (menuState == menuJammer) { 441 | if (btn_up.isClick()) { 442 | freqIndex = (freqIndex + 1) % numFrequencies; 443 | frequency = frequencies[freqIndex]; 444 | if (isJamming) { 445 | stopJamming(); 446 | startJamming(); 447 | } 448 | OLED_printJammer(); 449 | stTimer = millis(); 450 | } 451 | if (btn_down.isClick()) { 452 | freqIndex = (freqIndex - 1 + numFrequencies) % numFrequencies; 453 | frequency = frequencies[freqIndex]; 454 | if (isJamming) { 455 | stopJamming(); 456 | startJamming(); 457 | } 458 | OLED_printJammer(); 459 | stTimer = millis(); 460 | } 461 | if (btn_ok.isClick()) { 462 | if (!isJamming) { 463 | startJamming(); 464 | isJamming = true; 465 | } else { 466 | stopJamming(); 467 | isJamming = false; 468 | } 469 | OLED_printJammer(); 470 | stTimer = millis(); 471 | } 472 | } 473 | 474 | if (btn_back.isClick()) { 475 | if (menuState == menuJammer && isJamming) { 476 | stopJamming(); 477 | isJamming = false; 478 | } 479 | menuState = menuMain; 480 | restoreReceiveMode(); 481 | OLED_printMenu(display, menuIndex); 482 | stTimer = millis(); 483 | } 484 | if (btn_back.isHold() && EEPROM_key_count > 0 && !awaitingDeleteConfirmation && menuState == menuTransmit) { 485 | display.clearDisplay(); 486 | display.drawBitmap(83, 22, image_WarningDolphinFlip_bits, 45, 42, 1); 487 | display.drawBitmap(77, 2, image_file_delete_bin_bits, 13, 16, 1); 488 | display.setTextColor(1); 489 | display.setTextWrap(false); 490 | display.setCursor(7, 7); 491 | display.print("Press OK to "); 492 | display.display(); 493 | awaitingDeleteConfirmation = true; 494 | stTimer = millis(); 495 | } 496 | } 497 | } 498 | 499 | void setupCC1101() { 500 | ELECHOUSE_cc1101.setSpiPin(CC1101_SCK, CC1101_MISO, CC1101_MOSI, CC1101_CS); 501 | ELECHOUSE_cc1101.setGDO0(CC1101_GDO0); 502 | ELECHOUSE_cc1101.Init(); 503 | ELECHOUSE_cc1101.setModulation(2); 504 | ELECHOUSE_cc1101.setMHZ(frequency); 505 | ELECHOUSE_cc1101.setRxBW(270.0); 506 | ELECHOUSE_cc1101.setDeviation(0); 507 | ELECHOUSE_cc1101.setPA(12); 508 | ELECHOUSE_cc1101.SetRx(); 509 | } 510 | 511 | void restoreReceiveMode() { 512 | ELECHOUSE_cc1101.Init(); 513 | ELECHOUSE_cc1101.setModulation(2); 514 | ELECHOUSE_cc1101.setMHZ(frequency); // Последняя выбранная частота 515 | ELECHOUSE_cc1101.setRxBW(270.0); 516 | ELECHOUSE_cc1101.setDeviation(0); 517 | ELECHOUSE_cc1101.setPA(12); 518 | ELECHOUSE_cc1101.SetRx(); 519 | rcswitch.disableReceive(); 520 | rcswitch.enableReceive(CC1101_GDO0); 521 | recieved = false; 522 | } 523 | 524 | void read_rcswitch(tpKeyData* kd) { 525 | uint64_t decoded = rcswitch.getReceivedValue(); 526 | if (decoded) { 527 | Serial.println(F("RcSwitch signal captured")); 528 | signals++; 529 | kd->frequency = frequency; 530 | kd->keyID[0] = decoded & 0xFF; 531 | kd->keyID[1] = (decoded >> 8) & 0xFF; 532 | kd->keyID[2] = (decoded >> 16) & 0xFF; 533 | kd->keyID[3] = (decoded >> 24) & 0xFF; 534 | kd->type = (rcswitch.getReceivedProtocol() == 1 && rcswitch.getReceivedBitlength() == 24) ? kPrinceton : kRcSwitch; 535 | if (rcswitch.getReceivedBitlength() <= 40) { 536 | if (rcswitch.getReceivedProtocol() == 11) { 537 | kd->type = kCAME; 538 | } 539 | } 540 | kd->te = rcswitch.getReceivedDelay(); 541 | kd->bitLength = rcswitch.getReceivedBitlength(); 542 | kd->codeLenth = kd->bitLength; 543 | strncpy(kd->preset, String(rcswitch.getReceivedProtocol()).c_str(), sizeof(kd->preset) - 1); 544 | kd->preset[sizeof(kd->preset) - 1] = '\0'; 545 | kd->rawData[0] = '\0'; 546 | unsigned int* raw = rcswitch.getReceivedRawdata(); 547 | String rawStr = ""; 548 | for (int i = 0; i < kd->bitLength * 2 && i < 15; i++) { 549 | if (i > 0) rawStr += " "; 550 | int sign = (i % 2 == 0) ? 1 : -1; 551 | rawStr += String(sign * (int)raw[i]); 552 | } 553 | strncpy(kd->rawData, rawStr.c_str(), sizeof(kd->rawData) - 1); 554 | kd->rawData[sizeof(kd->rawData) - 1] = '\0'; 555 | validKeyReceived = true; 556 | byte idx = indxKeyInROM(kd); 557 | OLED_printKey(kd, idx == 0 ? 1 : 3); 558 | } 559 | rcswitch.resetAvailable(); 560 | } 561 | 562 | void read_raw(tpKeyData* kd) { 563 | delay(400); 564 | unsigned int* raw = rcswitch.getReceivedRawdata(); 565 | uint64_t decoded = rcswitch.getReceivedValue(); 566 | String data = ""; 567 | int transitions = 0; 568 | for (transitions = 0; transitions < MAX_DATA_LOG; transitions++) { 569 | if (raw[transitions] == 0) break; 570 | if (transitions > 0) data += " "; 571 | int sign = (transitions % 2 == 0) ? 1 : -1; 572 | data += String(sign * (int)raw[transitions]); 573 | } 574 | if (transitions > 20) { 575 | Serial.println(F("Raw signal captured")); 576 | signals++; 577 | kd->frequency = frequency; 578 | if (data.length() >= sizeof(kd->rawData)) { 579 | data = data.substring(0, sizeof(kd->rawData) - 1); 580 | } 581 | strncpy(kd->rawData, data.c_str(), sizeof(kd->rawData) - 1); 582 | kd->rawData[sizeof(kd->rawData) - 1] = '\0'; 583 | kd->type = kUnknown; 584 | kd->te = 0; 585 | kd->bitLength = 0; 586 | strncpy(kd->preset, "0", sizeof(kd->preset) - 1); 587 | kd->preset[sizeof(kd->preset) - 1] = '\0'; 588 | kd->codeLenth = transitions; 589 | if (decoded) { 590 | kd->keyID[0] = decoded & 0xFF; 591 | kd->keyID[1] = (decoded >> 8) & 0xFF; 592 | kd->keyID[2] = (decoded >> 16) & 0xFF; 593 | kd->keyID[3] = (decoded >> 24) & 0xFF; 594 | kd->type = (rcswitch.getReceivedProtocol() == 1 && rcswitch.getReceivedBitlength() == 24) ? kPrinceton : kRcSwitch; 595 | if (rcswitch.getReceivedBitlength() <= 40 && rcswitch.getReceivedProtocol() == 11) { 596 | kd->type = kCAME; 597 | } 598 | kd->te = rcswitch.getReceivedDelay(); 599 | kd->bitLength = rcswitch.getReceivedBitlength(); 600 | kd->codeLenth = kd->bitLength; 601 | strncpy(kd->preset, String(rcswitch.getReceivedProtocol()).c_str(), sizeof(kd->preset) - 1); 602 | kd->preset[sizeof(kd->preset) - 1] = '\0'; 603 | } else { 604 | if (transitions >= 129 && transitions <= 137) { 605 | kd->type = kStarLine; 606 | } else if (transitions >= 133 && transitions <= 137) { 607 | kd->type = kKeeLoq; 608 | } else if (transitions >= 40 && transitions <= 60) { 609 | kd->type = kCAME; 610 | } 611 | } 612 | validKeyReceived = true; 613 | byte idx = indxKeyInROM(kd); 614 | OLED_printKey(kd, idx == 0 ? 1 : 3); 615 | } 616 | rcswitch.resetAvailable(); 617 | } 618 | 619 | void OLED_printWaitingSignal() { 620 | display.clearDisplay(); 621 | display.drawBitmap(0, 4, image_RFIDDolphinReceive_bits, 97, 61, 1); 622 | display.drawBitmap(79, 8, image_Layer_4_bits, 23, 17, 0); 623 | display.setTextColor(1); 624 | display.setTextWrap(false); 625 | display.setCursor(65, 38); 626 | display.print("Waiting"); 627 | display.setCursor(65, 47); 628 | display.print("signal..."); 629 | // Выбранная частота 630 | display.setCursor(72, 13); 631 | display.print(String(frequency, 2) + "MHz"); 632 | display.display(); 633 | } 634 | 635 | void deleteCurrentKey() { 636 | if (EEPROM_key_count == 0) { 637 | Serial.println(F("No keys to delete")); 638 | return; 639 | } 640 | 641 | if (EEPROM_key_index < 1 || EEPROM_key_index > EEPROM_key_count) { 642 | EEPROM_key_index = EEPROM_key_count; 643 | } 644 | 645 | Serial.print(F("Deleting key at index ")); 646 | Serial.println(EEPROM_key_index); 647 | 648 | // Сдвигаем все последующие ключи 649 | for (byte i = EEPROM_key_index; i < EEPROM_key_count; i++) { 650 | tpKeyData nextKey; 651 | int nextAddress = (i + 1) * sizeof(tpKeyData) + 2; 652 | int currentAddress = i * sizeof(tpKeyData) + 2; 653 | 654 | // Следующий ключ 655 | for (byte j = 0; j < sizeof(tpKeyData); j++) { 656 | ((byte*)&nextKey)[j] = EEPROM.read(nextAddress + j); 657 | } 658 | 659 | for (byte j = 0; j < sizeof(tpKeyData); j++) { 660 | EEPROM.write(currentAddress + j, ((byte*)&nextKey)[j]); 661 | } 662 | } 663 | 664 | int lastAddress = EEPROM_key_count * sizeof(tpKeyData) + 2; 665 | for (byte j = 0; j < sizeof(tpKeyData); j++) { 666 | EEPROM.write(lastAddress + j, 0); 667 | } 668 | 669 | EEPROM_key_count--; 670 | EEPROM.write(0, EEPROM_key_count); 671 | 672 | if (EEPROM_key_count > 0) { 673 | if (EEPROM_key_index > EEPROM_key_count) { 674 | EEPROM_key_index = EEPROM_key_count; 675 | } 676 | } else { 677 | EEPROM_key_index = 0; 678 | } 679 | EEPROM.write(1, EEPROM_key_index); 680 | EEPROM.commit(); 681 | 682 | // Текущий ключ 683 | if (EEPROM_key_count > 0) { 684 | EEPROM_get_key(EEPROM_key_index, &keyData1); 685 | Serial.print(F("Key deleted, now at index: ")); 686 | Serial.println(EEPROM_key_index); 687 | } else { 688 | EEPROM_key_index = 0; 689 | memset(&keyData1, 0, sizeof(tpKeyData)); 690 | Serial.println(F("All keys deleted")); 691 | } 692 | 693 | // Подтверждение удаления 694 | display.clearDisplay(); 695 | display.drawBitmap(5, 2, image_DolphinMafia_bits, 119, 62, 1); 696 | display.setTextColor(1); 697 | display.setTextWrap(false); 698 | display.setCursor(84, 15); 699 | display.print("Deleted"); 700 | display.display(); 701 | delay(1000); 702 | } 703 | 704 | void OLED_printKey(tpKeyData* kd, byte msgType, bool isSending) { 705 | String st; 706 | display.clearDisplay(); 707 | display.setTextSize(1); 708 | display.setTextColor(1); 709 | display.setTextWrap(false); 710 | 711 | // Сигналы 712 | switch (msgType) { 713 | case 0: 714 | st = " Signal " + String(EEPROM_key_index) + "/" + String(EEPROM_key_count) + " in ESP"; 715 | break; 716 | case 1: 717 | st = " Hold OK to save"; 718 | break; 719 | case 3: 720 | st = " Signal " + String(indxKeyInROM(kd)); 721 | break; 722 | } 723 | display.setCursor(0, 0); 724 | display.print(st); 725 | 726 | // Информация ключа 727 | st = ""; 728 | for (byte i = 0; i < kd->codeLenth >> 3; i++) st += String(kd->keyID[i], HEX) + ":"; 729 | st.remove(st.length() - 1); 730 | 731 | display.setCursor(0, 12); 732 | display.print("Code: " + st); 733 | 734 | st = "Type: " + getTypeName(kd->type); 735 | display.setCursor(0, 24); 736 | display.print(st); 737 | 738 | st = "Freq: " + String(kd->frequency) + " MHz"; 739 | display.setCursor(0, 36); 740 | display.print(st); 741 | 742 | if (kd->bitLength > 0) { 743 | st = "Bits: " + String(kd->bitLength); 744 | display.setCursor(0, 48); 745 | display.print(st); 746 | } 747 | 748 | // "Sending..." и битмап 749 | if (isSending) { 750 | display.setCursor(67, 54); 751 | display.print("Sending..."); 752 | display.drawBitmap(109, 40, image_satellite_dish_bits, 15, 16, 1); 753 | } 754 | display.display(); 755 | } 756 | 757 | void OLED_printError(String st, bool err) { 758 | display.clearDisplay(); 759 | display.setTextSize(1); 760 | display.setCursor(0, 0); 761 | display.print(err ? F("Error!") : F("OK")); 762 | display.setCursor(0, 12); 763 | display.print(st); 764 | display.display(); 765 | } 766 | 767 | byte indxKeyInROM(tpKeyData* kd) { 768 | if (!kd || kd->codeLenth == 0) return 0; 769 | bool eq = true; 770 | byte* buf = (byte*)kd; 771 | for (byte j = 1; j <= EEPROM_key_count; j++) { 772 | eq = true; 773 | byte i = (kd->type == kKeeLoq || kd->type == kANmotors64) ? 4 : 0; 774 | for (; i < kd->codeLenth >> 3; i++) { 775 | byte eepromByte = EEPROM.read(i + j * sizeof(tpKeyData) + 2); 776 | if (buf[i] != eepromByte) { 777 | eq = false; 778 | break; 779 | } 780 | } 781 | if (eq) { 782 | Serial.print(F("Key already exists at index ")); 783 | Serial.println(j); 784 | return j; 785 | } 786 | } 787 | return 0; 788 | } 789 | 790 | bool EEPROM_AddKey(tpKeyData* kd) { 791 | if (!kd) { 792 | Serial.println(F("Invalid key data: NULL pointer")); 793 | return false; 794 | } 795 | if (kd->codeLenth == 0) { 796 | Serial.println(F("Invalid key data: codeLenth is zero")); 797 | return false; 798 | } 799 | if (kd->frequency == 0.0) { 800 | Serial.println(F("Invalid key data: frequency is zero")); 801 | return false; 802 | } 803 | byte indx = indxKeyInROM(kd); 804 | if (indx != 0) { 805 | EEPROM_key_index = indx; 806 | EEPROM.write(1, EEPROM_key_index); 807 | EEPROM.commit(); 808 | Serial.println(F("Key already exists, updated index")); 809 | return false; 810 | } 811 | if (EEPROM_key_count >= maxKeyCount) { 812 | Serial.println(F("Max key count reached")); 813 | return false; 814 | } 815 | EEPROM_key_count++; 816 | EEPROM_key_index = EEPROM_key_count; 817 | int address = EEPROM_key_index * sizeof(tpKeyData) + 2; 818 | if (address + sizeof(tpKeyData) > EEPROM_SIZE) { 819 | EEPROM_key_count--; 820 | Serial.println(F("EEPROM overflow")); 821 | return false; 822 | } 823 | for (byte i = 0; i < sizeof(tpKeyData); i++) { 824 | EEPROM.write(address + i, ((byte*)kd)[i]); 825 | } 826 | EEPROM.write(0, EEPROM_key_count); 827 | EEPROM.write(1, EEPROM_key_index); 828 | EEPROM.commit(); 829 | Serial.print(F("Key saved at index ")); 830 | Serial.println(EEPROM_key_index); 831 | return true; 832 | } 833 | 834 | void EEPROM_get_key(byte EEPROM_key_index1, tpKeyData* kd) { 835 | int address = EEPROM_key_index1 * sizeof(tpKeyData) + 2; 836 | if (address + sizeof(tpKeyData) > EEPROM_SIZE) { 837 | Serial.println(F("Invalid EEPROM address for key read")); 838 | return; 839 | } 840 | for (byte i = 0; i < sizeof(tpKeyData); i++) { 841 | ((byte*)kd)[i] = EEPROM.read(address + i); 842 | } 843 | } 844 | 845 | String getTypeName(emKeys tp) { 846 | switch (tp) { 847 | case kUnknown: return F("Unknown"); 848 | case kP12bt: return F("Pre 12bit"); 849 | case k12bt: return F("12bit"); 850 | case k24bt: return F("24bit"); 851 | case k64bt: return F("64bit"); 852 | case kKeeLoq: return F("KeeLoq"); 853 | case kANmotors64: return F("ANmotors"); 854 | case kPrinceton: return F("Princeton"); 855 | case kRcSwitch: return F("RcSwitch"); 856 | case kStarLine: return F("StarLine"); 857 | case kCAME: return F("CAME"); 858 | case kNICE: return F("NICE"); 859 | case kHOLTEK: return F("HOLTEK"); 860 | } 861 | return ""; 862 | } 863 | 864 | void myDelayMcs(unsigned long dl) { 865 | if (dl > 16000) { 866 | delay(dl / 1000); 867 | } else { 868 | delayMicroseconds(dl); 869 | } 870 | } 871 | 872 | void sendSynthKey(tpKeyData* kd) { 873 | recieved = true; 874 | OLED_printKey(kd, 0, true); 875 | 876 | Serial.print(F("Transmitting key, protocol: ")); 877 | Serial.print(getTypeName(kd->type)); 878 | Serial.print(F(", ID: ")); 879 | for (byte i = 0; i < kd->codeLenth >> 3; i++) { 880 | Serial.print(kd->keyID[i], HEX); 881 | } 882 | Serial.print(F(", Freq: ")); 883 | Serial.print(kd->frequency); 884 | Serial.println(F(" MHz")); 885 | 886 | ELECHOUSE_cc1101.setModulation(2); 887 | ELECHOUSE_cc1101.setMHZ(kd->frequency); 888 | ELECHOUSE_cc1101.setRxBW(270.0); 889 | ELECHOUSE_cc1101.setPA(12); 890 | ELECHOUSE_cc1101.SetTx(); 891 | pinMode(CC1101_GDO0, OUTPUT); 892 | 893 | if (kd->type == kRcSwitch || kd->type == kPrinceton || kd->type == kCAME || kd->type == kNICE || kd->type == kHOLTEK) { 894 | uint64_t data = 0; 895 | for (int i = 0; i < kd->bitLength / 8; i++) { 896 | data |= ((uint64_t)kd->keyID[i] << (i * 8)); 897 | } 898 | int protocol = atoi(kd->preset); 899 | if (kd->type == kCAME || kd->type == kNICE || kd->type == kHOLTEK) { 900 | protocol = 11; 901 | kd->te = 270; 902 | } else if (kd->type == kPrinceton) { 903 | protocol = 1; 904 | kd->te = 350; 905 | } 906 | rcswitch.enableTransmit(CC1101_GDO0); 907 | rcswitch.setProtocol(protocol); 908 | if (kd->te) rcswitch.setPulseLength(kd->te); 909 | rcswitch.setRepeatTransmit(10); 910 | rcswitch.send(data, kd->bitLength); 911 | rcswitch.disableTransmit(); 912 | } else { 913 | String data = String(kd->rawData); 914 | int buff_size = 0; 915 | int index = 0; 916 | while (index >= 0) { 917 | index = data.indexOf(' ', index + 1); 918 | buff_size++; 919 | } 920 | int* transmittimings = (int*)calloc(sizeof(int), buff_size + 1); 921 | int startIndex = 0; 922 | index = 0; 923 | for (size_t i = 0; i < buff_size; i++) { 924 | index = data.indexOf(' ', startIndex); 925 | if (index == -1) { 926 | transmittimings[i] = data.substring(startIndex).toInt(); 927 | } else { 928 | transmittimings[i] = data.substring(startIndex, index).toInt(); 929 | } 930 | startIndex = index + 1; 931 | } 932 | transmittimings[buff_size] = 0; 933 | 934 | for (int nRepeat = 0; nRepeat < 2; nRepeat++) { 935 | unsigned int currenttiming = 0; 936 | bool currentlogiclevel = true; 937 | while (transmittimings[currenttiming]) { 938 | if (transmittimings[currenttiming] >= 0) { 939 | currentlogiclevel = true; 940 | } else { 941 | currentlogiclevel = false; 942 | transmittimings[currenttiming] = (-1) * transmittimings[currenttiming]; 943 | } 944 | digitalWrite(CC1101_GDO0, currentlogiclevel ? HIGH : LOW); 945 | myDelayMcs(transmittimings[currenttiming]); 946 | currenttiming++; 947 | } 948 | digitalWrite(CC1101_GDO0, LOW); 949 | } 950 | free(transmittimings); 951 | } 952 | 953 | ELECHOUSE_cc1101.SetRx(); 954 | recieved = false; 955 | 956 | display.clearDisplay(); 957 | display.setTextColor(1); 958 | display.setTextWrap(false); 959 | display.setCursor(15, 47); 960 | display.print("Successfully!"); 961 | display.drawBitmap(15, 12, image_Connected_bits, 62, 31, 1); 962 | display.display(); 963 | delay(1000); 964 | OLED_printKey(kd); 965 | } 966 | 967 | void sendSynthBit(int bt[2]) { 968 | static uint8_t dataOn[1] = {0xFF}; 969 | static uint8_t dataOff[1] = {0x00}; 970 | if (bt[0] == 0) return; 971 | for (byte i = 0; i < 2; i++) { 972 | if (bt[i] > 0) { 973 | ELECHOUSE_cc1101.SendData(dataOn, 1); 974 | myDelayMcs(bt[i]); 975 | } else { 976 | ELECHOUSE_cc1101.SendData(dataOff, 1); 977 | myDelayMcs(-bt[i]); 978 | } 979 | } 980 | } 981 | 982 | void OLED_printAnalyzer(bool signalReceived, float detectedFreq) { 983 | display.clearDisplay(); 984 | display.drawBitmap(0, 7, image_Dolphin_MHz_bits, 108, 57, 1); 985 | display.drawBitmap(100, 6, image_MHz_1_bits, 25, 11, 1); 986 | display.setTextColor(1); 987 | display.setTextWrap(false); 988 | display.setCursor(62, 10); 989 | if (signalReceived || detectedFreq != 0.0) { 990 | char freq_str[7]; 991 | snprintf(freq_str, sizeof(freq_str), "%06.2f", detectedFreq); 992 | display.print(freq_str); 993 | } else { 994 | display.print("000.00"); 995 | } 996 | display.display(); 997 | } 998 | 999 | void OLED_printJammer() { 1000 | display.clearDisplay(); 1001 | display.drawBitmap(0, 3, image_Dolphin_Send_bits, 97, 61, 1); 1002 | display.setTextColor(1); 1003 | display.setTextWrap(false); 1004 | display.setCursor(78, 12); 1005 | display.print(String(frequency, 2)); 1006 | display.setCursor(65, 42); 1007 | if (isJamming) { 1008 | display.print("Jamming..."); 1009 | } else { 1010 | display.print("Press OK"); 1011 | } 1012 | if (!isJamming) { 1013 | display.setCursor(65, 51); 1014 | display.print("to start"); 1015 | } 1016 | display.display(); 1017 | } 1018 | 1019 | void startJamming() { 1020 | Serial.println(F("Starting jammer")); 1021 | ELECHOUSE_cc1101.Init(); 1022 | ELECHOUSE_cc1101.setModulation(0); 1023 | ELECHOUSE_cc1101.setMHZ(frequency); 1024 | ELECHOUSE_cc1101.setPA(12); // Мощность 1025 | ELECHOUSE_cc1101.setDeviation(0); 1026 | ELECHOUSE_cc1101.setRxBW(270.0); 1027 | 1028 | ELECHOUSE_cc1101.SetTx(); 1029 | ELECHOUSE_cc1101.SpiWriteReg(0x3E, 0xFF); 1030 | ELECHOUSE_cc1101.SpiWriteReg(0x35, 0x60); 1031 | } 1032 | 1033 | void stopJamming() { 1034 | Serial.println(F("Stopping jammer")); 1035 | ELECHOUSE_cc1101.SpiWriteReg(0x35, 0x00); 1036 | ELECHOUSE_cc1101.SetRx(); 1037 | restoreReceiveMode(); 1038 | } 1039 | -------------------------------------------------------------------------------- /Pictures/ESP-GABER_Device.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Teapot174/ESP-GRABER/86eb334438366561c0a69c3329c56729e2b7c1ae/Pictures/ESP-GABER_Device.jpg -------------------------------------------------------------------------------- /Pictures/Logo_BW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Teapot174/ESP-GRABER/86eb334438366561c0a69c3329c56729e2b7c1ae/Pictures/Logo_BW.png -------------------------------------------------------------------------------- /Pictures/Logo_GitHub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Teapot174/ESP-GRABER/86eb334438366561c0a69c3329c56729e2b7c1ae/Pictures/Logo_GitHub.png -------------------------------------------------------------------------------- /Pictures/Scheme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Teapot174/ESP-GRABER/86eb334438366561c0a69c3329c56729e2b7c1ae/Pictures/Scheme.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

📡 ESP-GRABER Русский | English

3 | 4 | ![ESP-GRABER_LOGO](https://github.com/user-attachments/assets/d66de6df-3508-4e3d-aba1-9d0b1d6ce611) 5 | 6 |
7 | 8 |
9 | 10 | ## 🚀 О проекте ESP-GRABER 11 | ESP-GRABER — универсальный инструмент для работы с радиочастотами на базе ESP32. 12 | Проект позволяет **считывать**, **повторять** и **сохранять** сигналы 315/433/868/915 МГц. 13 | *Проект стабилен, но может дорабатываться для расширения функционала.* 14 | 15 | ### ⚠️ Дисклеймер 16 | Данная прошивка разработана исключительно для исследовательских целей и тестирования оборудования. 17 | Используя прошивку вы обязаны соблюдать законодательство своего региона. Создатель прошивки не несет ответственность за ваши действия. Глушилки — НЕЛЕГАЛЬНЫ. 18 | 19 | *Использование прошивки означает ваше полное согласие с этими условиями* 20 | ## ⚡ Возможности 21 | ### 📶 **SubGHz | 315 • 433 • 868 • 915 МГц** 22 | - 🔍 **Считывание сигналов** 23 | - 🔄 **Повтор сигналов** 24 | - 📊 **Анализатор частот** 25 | - 🛰️ **Глушилка (НЕЛЕГАЛЬНО)** 26 | - 💾 **Хранение сигналов (до 20 ключей)** 27 | - 🚫 **Удаление сигналов** 28 | 29 | ### 📡 Поддерживаемые модуляции 30 | - Princeton 31 | - RcSwitch 32 | - Came 33 | - Holtec 34 | - Nice 35 | - StarLine 36 | - KeeLoq 37 | 38 | ## 🛠️ Сборка 39 | ### 🔧 Необходимые компоненты 40 | | Компонент | Ссылка | 41 | |-----------|--------| 42 | | ESP32-WROOM | [AliExpress](https://aliexpress.ru/item/1005004605399313.html) | 43 | | CC1101-Модуль | [AliExpress](https://aliexpress.ru/item/1005008544032996.html) | 44 | | Дисплей&кнопки | [AliExpress](https://aliexpress.ru/item/1005006322355552.html) | 45 | | Макетная плата | [AliExpress](https://aliexpress.ru/item/1005008466693134.html) | 46 | | Провода-перемычки | [AliExpress](https://aliexpress.ru/item/1005007553381854.html) | 47 | 48 | ### 🔌 Схема подключения 49 | ![Схема](https://github.com/user-attachments/assets/cda54f27-3c40-4c8f-980a-df7c30e4257f) 50 | |Module|Pin 1|Pin 2|Pin 3|Pin 4|Pin 5|Pin 6| Pin 7| 51 | |--------|--------|--------|--------|--------|--------|--------|--------| 52 | |**📺 Display**|VCC→3V3|GND→GND|SCL→G22|SDA→G21|-|-|-| 53 | |**🔘 Buttons**|UP(K1)→G27|DOWN(K2)→G26|OK(K3)→G33|BACK(K4)→G32|-|-|-| 54 | |**📡 CC1101**|1→GND|2→3V3|3→G2|4→G5|5→G18|6→G23 |7→G19| 55 | 56 | ### 📸 Финальный результат (YouTube) 57 | [![Watch the video](https://img.youtube.com/vi/qRX-z81Mjyg/maxresdefault.jpg)](https://www.youtube.com/watch?v=qRX-z81Mjyg) 58 | 59 | 112 | -------------------------------------------------------------------------------- /interface.h: -------------------------------------------------------------------------------- 1 | #ifndef INTERFACE_H 2 | #define INTERFACE_H 3 | 4 | #include 5 | #include 6 | 7 | #define SCREEN_WIDTH 128 8 | #define SCREEN_HEIGHT 64 9 | 10 | // Dolphin_MHz 11 | static const unsigned char PROGMEM image_Dolphin_MHz_bits[] = { 12 | 0x00,0x00,0x03,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 13 | 0x1c,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00, 14 | 0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x30, 15 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00, 16 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 17 | 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 18 | 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 19 | 0x00,0x20,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40, 20 | 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 21 | 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00, 22 | 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x20,0x00, 23 | 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0xe0,0x00,0x00,0x20,0x00,0x00,0x00, 24 | 0x00,0x00,0x00,0x00,0x01,0x00,0x0c,0x38,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 25 | 0x00,0x00,0x01,0x00,0x11,0xfc,0x00,0x00,0x10,0x1f,0xe0,0x00,0x00,0x00,0x00,0x00, 26 | 0x02,0x00,0x23,0xce,0x00,0x00,0x10,0xe0,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 27 | 0x27,0x86,0x00,0x00,0x13,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x47,0x87, 28 | 0x00,0x00,0x1c,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x4f,0xcf,0x00,0x00, 29 | 0x30,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x4f,0xff,0x00,0x00,0xc0,0x00, 30 | 0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x4f,0xff,0x00,0x03,0x00,0x03,0xe4,0x00, 31 | 0x00,0x00,0x00,0x00,0x04,0x02,0xcf,0xff,0x00,0x0c,0x00,0x0d,0x54,0x00,0x00,0x00, 32 | 0x00,0x00,0x04,0x05,0x67,0xfe,0x00,0x00,0x00,0x1a,0xa8,0x00,0x00,0x00,0x00,0x00, 33 | 0x04,0x02,0xa7,0xfe,0x00,0x00,0x00,0x75,0x58,0x00,0x00,0x00,0x00,0x00,0x08,0x05, 34 | 0x57,0xfc,0x00,0x00,0x00,0xaa,0xb0,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0xb8,0x38, 35 | 0x00,0x00,0x03,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x60,0x08,0x00,0x00, 36 | 0x06,0xaa,0xa0,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0xc0,0x04,0x00,0x00,0x1d,0x55, 37 | 0x40,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x40,0x04,0x00,0x00,0x2a,0xaa,0x80,0x00, 38 | 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0xd5,0x55,0x00,0x00,0x00,0x00, 39 | 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x01,0xaa,0xaa,0x00,0x00,0x00,0x00,0x00,0x00, 40 | 0x08,0x00,0x00,0x00,0x00,0x07,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x07, 41 | 0x00,0x00,0x00,0x1a,0xaa,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xc0,0x40, 42 | 0x00,0x7f,0x55,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x30,0x20,0x01,0xff, 43 | 0xeb,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x08,0x18,0x1f,0xe0,0x3f,0x80, 44 | 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x04,0x07,0xff,0x00,0x0f,0xf0,0x00,0x00, 45 | 0x00,0x00,0x00,0x00,0x08,0x30,0x02,0x00,0x3e,0x00,0x07,0xfc,0x00,0x00,0x00,0x00, 46 | 0x00,0x00,0x08,0x18,0x01,0x00,0x07,0x00,0x03,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 47 | 0x08,0x28,0x01,0x00,0x00,0xe0,0x01,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x0c,0x14, 48 | 0x00,0x80,0x00,0x1c,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x0c,0x2c,0x00,0x80, 49 | 0x00,0x03,0xc0,0x7f,0xf0,0x00,0x00,0x00,0x00,0x00,0x1c,0x16,0x00,0x40,0x00,0x00, 50 | 0x3f,0xff,0x90,0x00,0x00,0x00,0x00,0x00,0x1c,0x2a,0x00,0x40,0x00,0x00,0x00,0x00, 51 | 0x10,0x00,0x00,0x00,0x00,0x00,0x3c,0x56,0x00,0x40,0x00,0x00,0x00,0x00,0x20,0x00, 52 | 0x00,0x00,0x00,0x00,0x3c,0x2a,0x00,0x20,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x0e, 53 | 0x00,0x00,0x5c,0x56,0x00,0x20,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x00, 54 | 0x7c,0xaa,0x00,0x20,0x00,0xa8,0x00,0x1c,0x00,0x00,0x00,0x61,0x00,0x00,0xdd,0x56, 55 | 0x00,0x10,0x00,0x57,0xff,0xe0,0x00,0x00,0x01,0x81,0x00,0x00,0xbe,0xaa,0x00,0x10, 56 | 0x00,0x2a,0xaa,0x00,0x00,0x00,0x0e,0x01,0x00,0x00,0x5d,0x56,0x00,0x10,0x00,0x15, 57 | 0x57,0xc0,0x00,0x00,0xf0,0x01,0x00,0x00,0xbe,0xaa,0x00,0x08,0x00,0x02,0xab,0x3c, 58 | 0x00,0x0f,0x00,0x02,0x00,0x00,0x5f,0x54,0x00,0x08,0x00,0x01,0x55,0x03,0xff,0xf0, 59 | 0x00,0x02,0x00,0x00,0xbe,0xac,0x00,0x08,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04, 60 | 0x00,0x00,0x5f,0x54,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x08,0x00,0x00, 61 | 0xae,0xac,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x10,0x00,0x00 62 | }; 63 | 64 | static const unsigned char PROGMEM image_MHz_1_bits[] = { 65 | 0xc3,0x61,0x80,0x00,0xe7,0x61,0x80,0x00,0xff,0x61,0x80,0x00,0xff,0x61,0xbf,0x80, 66 | 0xdb,0x7f,0xbf,0x80,0xdb,0x7f,0x83,0x00,0xdb,0x61,0x86,0x00,0xc3,0x61,0x8c,0x00, 67 | 0xc3,0x61,0x98,0x00,0xc3,0x61,0xbf,0x80,0xc3,0x61,0xbf,0x80 68 | }; 69 | 70 | // Analyser 71 | static const unsigned char PROGMEM image_DolphinSuccess_bits[] = { 72 | 0x00,0x00,0x03,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00, 73 | 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x0c,0x00,0x00,0x00, 74 | 0x00,0x00,0x00,0x00,0x00,0x01,0xd0,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 75 | 0x00,0x06,0x80,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x40,0x00, 76 | 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x10,0x00,0x00, 77 | 0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 78 | 0x00,0x68,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00, 79 | 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x02,0x00,0x00, 80 | 0x00,0x00,0x00,0x00,0x01,0x54,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 81 | 0x01,0xa0,0x00,0x7c,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x50,0x01,0x83, 82 | 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x02,0x3e,0x80,0x01,0x00,0x00, 83 | 0x00,0x00,0x00,0x00,0x03,0x50,0x04,0x79,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 84 | 0x06,0x80,0x04,0xf0,0xc0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x05,0x50,0x08,0xf0, 85 | 0xe0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x06,0x80,0x09,0xf9,0xe0,0x00,0x80,0x00, 86 | 0x00,0x00,0x00,0x00,0x05,0x50,0x09,0xff,0x20,0x00,0x8f,0xc0,0x00,0x00,0x00,0x00, 87 | 0x0a,0x00,0x09,0xfd,0x60,0x00,0xf0,0x30,0x00,0x00,0x00,0x00,0x0d,0x50,0x09,0xff, 88 | 0xe0,0x03,0x80,0x08,0x00,0x00,0x00,0x00,0x0a,0x00,0x04,0xfe,0xc0,0x1c,0x00,0x04, 89 | 0x00,0x00,0x00,0x00,0x0d,0x50,0x04,0xff,0xc0,0xe0,0x00,0x04,0x00,0x00,0x00,0x00, 90 | 0x0a,0x00,0x02,0xc0,0xc0,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x0d,0x50,0x01,0x80, 91 | 0x20,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x04, 92 | 0x00,0x00,0x00,0x00,0x0d,0x50,0x01,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,0x00, 93 | 0x0a,0x00,0x00,0x00,0x00,0x00,0x60,0x04,0x00,0x00,0x00,0x00,0x0d,0x50,0x00,0x00, 94 | 0x00,0x01,0x80,0x04,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x04,0x00,0x06,0x00,0x08, 95 | 0x00,0x00,0x00,0x00,0x15,0x50,0x00,0x04,0x00,0x18,0x00,0x10,0x00,0x00,0x00,0x00, 96 | 0x1a,0x00,0x00,0x02,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x15,0x50,0x00,0x01, 97 | 0x83,0x80,0x00,0xc0,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x7c,0x00,0x01,0x00, 98 | 0x00,0x00,0x00,0x00,0x15,0x50,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00, 99 | 0x3a,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x35,0x54,0x00,0x00, 100 | 0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x7a,0x80,0x00,0x00,0x00,0x00,0x40,0x00, 101 | 0x3c,0x00,0x00,0x00,0x75,0x54,0x00,0x00,0x00,0x03,0xc0,0x00,0x42,0x03,0x80,0x00, 102 | 0xfa,0xa0,0x00,0x00,0x00,0x1f,0xc0,0x00,0x81,0x0c,0x40,0x00,0xf5,0x55,0x00,0x00, 103 | 0x00,0xff,0x40,0x01,0x01,0x10,0x20,0x00,0xfa,0xa0,0x00,0x00,0x03,0xff,0x40,0x06, 104 | 0x01,0x20,0x20,0x00,0xf5,0x55,0x40,0x00,0x00,0xfc,0x40,0x08,0x01,0x40,0x20,0x00, 105 | 0xfa,0xa0,0x00,0x20,0x00,0x00,0x60,0x10,0x01,0x80,0x20,0x00,0xf5,0x55,0x00,0x18, 106 | 0x00,0x00,0x70,0x60,0x01,0x00,0x40,0x00,0xea,0x80,0x00,0x06,0x00,0x00,0x7f,0x80, 107 | 0x02,0x00,0x40,0x00,0xf5,0x54,0x00,0x01,0x80,0x00,0x7e,0x00,0x02,0x00,0x40,0x00, 108 | 0xea,0x00,0x00,0x00,0x70,0x00,0xf0,0x00,0x04,0x00,0x80,0x00,0xf5,0x54,0x00,0x00, 109 | 0x0f,0xff,0x00,0x00,0x04,0x00,0x80,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 110 | 0x08,0x01,0x00,0x00,0xf5,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x00, 111 | 0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0xd5,0x50,0x00,0x00, 112 | 0x00,0x00,0x00,0x00,0x2a,0x04,0x00,0x00,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 113 | 0x55,0x48,0x00,0x00 114 | }; 115 | 116 | // Waiting signal 117 | static const unsigned char PROGMEM image_RFIDDolphinReceive_bits[] = { 118 | 0x00,0x00,0x7f,0xf8,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80, 119 | 0x07,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x60,0x00, 120 | 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x02,0x00,0x00, 121 | 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x02,0x02,0x00,0x00,0x05,0x50, 122 | 0x00,0x00,0x80,0x00,0x00,0x02,0x00,0x04,0x04,0x00,0x00,0x05,0x50,0x00,0x01,0x00, 123 | 0x00,0x00,0x01,0x00,0x04,0x04,0x00,0x00,0x0f,0xf8,0x00,0x02,0x00,0x00,0x00,0x00, 124 | 0x80,0x04,0x08,0x00,0x00,0x10,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x08,0x08, 125 | 0x00,0x00,0x27,0xb2,0x00,0x04,0x00,0x00,0x00,0x3c,0x20,0x08,0x10,0x20,0x00,0xe8, 126 | 0x33,0x80,0x08,0x00,0x00,0x00,0x42,0x20,0x08,0x10,0x40,0x00,0x28,0x02,0x00,0x08, 127 | 0x00,0x00,0x00,0x81,0x10,0x08,0x10,0x40,0x00,0xe0,0x0b,0x80,0x10,0x60,0x00,0x01, 128 | 0x18,0x90,0x08,0x10,0x40,0x00,0x28,0x0a,0x00,0x10,0x90,0x10,0x01,0x24,0x90,0x08, 129 | 0x10,0x40,0x00,0xe0,0x0b,0x80,0x21,0x08,0x10,0x01,0x24,0x88,0x08,0x10,0x40,0x00, 130 | 0x28,0x0a,0x00,0x23,0x08,0x08,0x01,0x24,0x88,0x08,0x10,0x20,0x00,0xe8,0x0b,0x80, 131 | 0x22,0x08,0x08,0x01,0x24,0x88,0x08,0x08,0x00,0x00,0x25,0xf2,0x00,0x62,0x04,0x04, 132 | 0x01,0x24,0x88,0x04,0x08,0x00,0x00,0x10,0x04,0x00,0x54,0x04,0x04,0x01,0x24,0x88, 133 | 0x04,0x04,0x00,0x00,0x0f,0xf8,0x00,0x6c,0x04,0x02,0x01,0x18,0x88,0x04,0x04,0x00, 134 | 0x00,0x05,0x50,0x00,0xd8,0x07,0x01,0x00,0x81,0x08,0x02,0x02,0x00,0x00,0x05,0x50, 135 | 0x00,0xb0,0x07,0x00,0x80,0x42,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07, 136 | 0x80,0x00,0x3c,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x80,0x00,0x00, 137 | 0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0xc0,0x00,0x00,0x50,0x00,0x80, 138 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xff,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 139 | 0x00,0x00,0x00,0x0b,0xff,0x80,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 140 | 0x18,0xff,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3c,0x00, 141 | 0xf8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x06,0x01,0x60,0x00, 142 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x10,0x00,0xa0,0x00,0x00,0x00,0x00, 143 | 0x00,0x00,0x00,0x00,0x28,0x00,0x40,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 144 | 0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00, 145 | 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x20, 146 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 147 | 0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 148 | 0x00,0x01,0xa0,0x18,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x40, 149 | 0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x03,0x00,0x00, 150 | 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x40,0x00,0x80,0x00,0x04,0x00,0x00, 151 | 0x00,0x00,0x00,0x00,0x00,0x0a,0x80,0x00,0x60,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 152 | 0x00,0x00,0x0d,0x00,0x28,0x10,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 153 | 0x00,0x56,0x0c,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x2b,0x82, 154 | 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x15,0xc1,0x80,0x02,0x00, 155 | 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x0a,0xf0,0x40,0x02,0x00,0x00,0x00,0x00, 156 | 0x00,0x00,0x00,0xa8,0x00,0x05,0x78,0x3f,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 157 | 0xd0,0x00,0x02,0xbe,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x05, 158 | 0x5f,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0xe0,0x10, 159 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0xff,0xe0,0x00,0x00,0x00, 160 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 161 | 0x00,0x00,0x00,0x00,0x05,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 162 | 0x00,0x02,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59, 163 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00, 164 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00, 165 | 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 166 | 0x00,0x00,0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 167 | 0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00 168 | }; 169 | 170 | static const unsigned char PROGMEM image_Layer_4_bits[] = { 171 | 0x07,0xff,0x00,0x07,0xff,0xc0,0x1f,0xff,0x80,0x1f,0xff,0x80,0x3f,0xff,0x80,0x7f, 172 | 0xff,0xe0,0x7f,0xff,0xe0,0xfc,0x07,0xcc,0x7f,0x87,0xf8,0x7f,0xdf,0xf0,0x7f,0xff, 173 | 0xfe,0x7f,0xff,0xfc,0x3f,0xff,0x80,0x1f,0xfe,0x00,0x07,0xfc,0x00,0x03,0xa8,0x00, 174 | 0x03,0xa8,0x00 175 | }; 176 | 177 | // Satellite dish bitmap 178 | static const unsigned char PROGMEM image_satellite_dish_bits[] = { 179 | 0x00, 0x00, 0x00, 0x78, 0x30, 0x04, 0x2c, 0x32, 0x63, 0x0a, 0xa8, 0xea, 180 | 0x92, 0xa2, 0x90, 0xe0, 0x89, 0x10, 0x8a, 0x48, 0x44, 0x08, 0x43, 0x24, 181 | 0x20, 0xc4, 0x30, 0x3c, 0x0c, 0x10, 0x03, 0xe0 182 | }; 183 | 184 | // Connected bitmap 185 | static const unsigned char PROGMEM image_Connected_bits[] = { 186 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xfe,0x00,0x00,0x00,0x00,0x00, 187 | 0x00,0x30,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x60,0x00,0x00,0x00,0x00, 188 | 0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 189 | 0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 190 | 0x08,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x10,0x0f,0x00,0x02,0x1e,0x00,0x00,0x00, 191 | 0x10,0x10,0x80,0x01,0x61,0x00,0x00,0x00,0x20,0x2f,0x40,0x01,0x80,0x80,0x00,0x00, 192 | 0x20,0x5d,0xa0,0x06,0x00,0x83,0x80,0x00,0x20,0x5c,0xa0,0x18,0x07,0x82,0x4f,0x00, 193 | 0x20,0x5f,0xa0,0x60,0x1f,0x02,0x30,0x80,0x40,0x5f,0xa0,0x00,0x3e,0x02,0x20,0x40, 194 | 0x40,0x2f,0xc0,0x00,0xfc,0x01,0x20,0x20,0x40,0x14,0x20,0x01,0xf8,0x01,0x20,0x20, 195 | 0x40,0x08,0x00,0x03,0xf0,0x01,0x20,0x20,0x40,0x08,0x00,0x07,0xe0,0x00,0x90,0x20, 196 | 0x40,0x00,0x00,0x0f,0xc0,0x00,0x8c,0x40,0x40,0x00,0x40,0x30,0xff,0x00,0x83,0xc0, 197 | 0x40,0x00,0x30,0xc0,0x3c,0x80,0x80,0x40,0x40,0x00,0x0f,0xff,0xc0,0x80,0x80,0x40, 198 | 0x40,0x00,0x00,0x00,0x00,0x81,0x00,0x40,0x40,0x00,0x00,0x00,0x01,0x01,0x00,0x40, 199 | 0x40,0x00,0x00,0x00,0x0e,0x01,0x00,0x40,0x40,0x00,0x00,0x00,0x30,0x02,0x00,0x40, 200 | 0x40,0x00,0x00,0x7f,0xc0,0x02,0x00,0x40,0x40,0x00,0x00,0x1f,0x80,0x04,0x00,0x40, 201 | 0x40,0x00,0x00,0x00,0x80,0x04,0x00,0x40 202 | }; 203 | 204 | // Dolphin Saved bitmap 205 | static const unsigned char PROGMEM image_DolphinSaved_bits[] = { 206 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 207 | 0x00,0x00,0x30,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00, 208 | 0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x02,0x00,0x00,0x00, 209 | 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 210 | 0x00,0x08,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 211 | 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00, 212 | 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 213 | 0x00,0x40,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00, 214 | 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x00, 215 | 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0xe0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 216 | 0x01,0x00,0x00,0x0c,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0x00,0x00,0x10, 217 | 0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x23,0xf2,0x01,0x00,0x00, 218 | 0x00,0x00,0x00,0x04,0x00,0xc0,0x00,0x24,0xfa,0x00,0x80,0x00,0x00,0x00,0x00,0x04, 219 | 0x00,0x30,0x00,0x48,0x7d,0x00,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x48, 220 | 0x7d,0x00,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x4c,0xfd,0x00,0x80,0x00, 221 | 0x00,0x00,0x00,0x09,0xf0,0x00,0xc0,0x4f,0xfd,0x00,0x80,0x00,0x00,0x00,0x00,0x0a, 222 | 0x0c,0x00,0x30,0x5f,0xfd,0x00,0x80,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x61, 223 | 0xfe,0x00,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x80,0x00,0x80,0x7a,0x00,0x40,0x00, 224 | 0xff,0xfc,0x00,0x04,0x00,0x60,0x00,0x00,0x34,0x00,0x40,0x00,0xf8,0x0e,0x00,0x02, 225 | 0x00,0x10,0x00,0x00,0x18,0x00,0x40,0x00,0xf8,0x6f,0x00,0x02,0x00,0x0c,0x00,0x00, 226 | 0x10,0x00,0x40,0x00,0xf8,0x6f,0x80,0x01,0x00,0x02,0x00,0x08,0x00,0x00,0x40,0x00, 227 | 0xf8,0x6f,0x80,0x00,0x80,0x01,0x80,0x08,0x00,0x00,0x40,0x00,0xf8,0x0f,0x80,0x00, 228 | 0x40,0x00,0x40,0x10,0x00,0x00,0x40,0x00,0xff,0xff,0x80,0x00,0x30,0x00,0x30,0x20, 229 | 0x00,0x00,0x40,0x00,0xff,0xff,0x80,0x00,0x18,0x00,0x0f,0xc0,0x00,0x00,0x40,0x00, 230 | 0xff,0xff,0x80,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xff,0xff,0x80,0x00, 231 | 0x0f,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xe0,0x03,0x80,0x00,0x0f,0x80,0x00,0x00, 232 | 0x00,0x00,0x80,0x00,0xe7,0xf3,0xe0,0x00,0x3f,0xe0,0x00,0x00,0x00,0x00,0x80,0x00, 233 | 0xe0,0x03,0x9c,0x00,0xcb,0xfc,0x00,0x00,0x00,0x00,0x80,0x00,0xe7,0xf3,0x83,0x87, 234 | 0x0b,0xff,0xc1,0xc0,0x00,0x00,0xc0,0x00,0xe0,0x03,0x80,0x78,0x09,0xff,0x02,0x20, 235 | 0x00,0x00,0xe0,0x00,0xe0,0x03,0x80,0x00,0x08,0xf8,0x02,0x20,0x00,0x00,0xb0,0x00, 236 | 0xff,0xff,0x80,0x00,0x08,0x00,0x04,0x20,0x00,0x00,0xd8,0x00,0x00,0x20,0x00,0x00, 237 | 0x08,0x00,0x04,0x20,0x00,0x00,0xac,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x7c,0x20, 238 | 0x00,0x00,0x54,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x82,0x20,0x00,0x00,0x6a,0x00, 239 | 0x00,0x04,0x00,0x00,0x10,0x01,0x00,0x10,0x00,0x00,0x76,0x00,0x00,0x02,0x00,0x00, 240 | 0x10,0x01,0x00,0x10,0x00,0x00,0x2b,0x00,0x00,0x01,0x80,0x04,0x50,0x02,0x00,0x0c, 241 | 0x00,0x00,0x35,0x00,0x00,0x00,0x40,0x00,0x10,0x02,0x00,0x03,0x80,0x00,0x1a,0x80, 242 | 0x00,0x00,0x35,0x15,0x50,0x02,0x00,0x00,0x70,0x00,0x15,0x80,0x00,0x00,0x18,0x00, 243 | 0x10,0x02,0x00,0x00,0x0e,0x00,0x0a,0xc0,0x00,0x00,0x05,0x55,0x50,0x02,0x00,0x00, 244 | 0x01,0x80,0x0d,0x40,0x00,0x00,0x03,0xa0,0xb0,0x01,0x00,0x00,0x00,0x40,0x0a,0xa0, 245 | 0x00,0x00,0x00,0xd5,0x50,0x00,0x80,0x00,0x00,0x00,0x0d,0x60,0x00,0x00,0x00,0x3a, 246 | 0xa8,0x00,0x60,0x00,0x00,0x00,0x06,0xb0,0x00,0x00,0x00,0x07,0x58,0x00,0x18,0x00, 247 | 0x00,0x00,0x05,0x50,0x00,0x00,0x00,0x00,0xf8,0x00,0x1c,0x00,0x00,0x00,0x06,0xb0, 248 | 0x00,0x00,0x00,0x00,0x08,0x00,0x1f,0x00,0x00,0x00,0x05,0x50,0x00,0x00,0x00,0x00, 249 | 0x08,0x00,0x0f,0xc0,0x00,0x00,0x06,0xb0 250 | }; 251 | 252 | // Dolphin Mafia bitmap 253 | static const unsigned char PROGMEM image_DolphinMafia_bits[] = { 254 | 0x00,0x00,0x00,0x00,0x0f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 255 | 0x00,0x00,0x00,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 256 | 0x00,0x07,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 257 | 0x7f,0xfe,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xaa, 258 | 0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x55,0x00, 259 | 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xaa,0xaa,0xa8,0x00, 260 | 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x55,0x54,0x00,0x00,0x20, 261 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xaa,0xaa,0xaa,0x00,0x10,0x00, 262 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x54,0x00,0x00,0x10,0xff,0xfc, 263 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xaa,0xaa,0xaa,0x00,0x1f,0x00,0x03,0x00, 264 | 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x54,0x00,0x00,0x08,0x00,0x00,0x80,0x00, 265 | 0x00,0x00,0x00,0x00,0x00,0x06,0xaa,0xaa,0xaa,0x00,0x08,0x00,0x00,0x80,0x00,0x00, 266 | 0x00,0x00,0x00,0x00,0x05,0x55,0x54,0x00,0x00,0x04,0x00,0x00,0x80,0x00,0x00,0x00, 267 | 0x00,0x00,0x00,0x06,0xab,0xff,0xff,0xfc,0x04,0x00,0x03,0x00,0x00,0x00,0x00,0x00, 268 | 0x00,0x00,0x05,0x5f,0xff,0xff,0xff,0xff,0xc0,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 269 | 0x00,0x06,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 270 | 0x07,0xff,0xff,0xfd,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f, 271 | 0xff,0xff,0xea,0xaa,0xaa,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff, 272 | 0xff,0x55,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xfa, 273 | 0xa8,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xf5,0x40, 274 | 0x1f,0xf0,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xaa,0x80,0xff, 275 | 0xf8,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0x54,0x03,0xf0,0x1f, 276 | 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xfa,0xa8,0x0f,0xf0,0x1f,0xf0, 277 | 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x1f,0xff,0xf5,0x40,0x1f,0xf0,0x38,0x70,0xf8, 278 | 0x00,0x00,0x00,0x00,0x00,0x06,0x3f,0xff,0xea,0xa8,0x1f,0xf8,0x78,0x7f,0x06,0x00, 279 | 0x00,0x00,0x6b,0x00,0x0a,0x7f,0xff,0xd5,0xff,0xff,0xff,0xf0,0xf0,0x01,0x00,0x00, 280 | 0x01,0x80,0x13,0x72,0x7f,0xff,0xaf,0xe8,0x0f,0xff,0xf3,0x00,0x00,0x80,0x00,0x02, 281 | 0x00,0x00,0x04,0xff,0xff,0xdf,0x00,0x07,0xff,0xe0,0x00,0x06,0x80,0x00,0x04,0x00, 282 | 0x00,0x18,0xff,0xff,0xba,0xa0,0x03,0xff,0xc0,0x00,0x0e,0x87,0xe0,0x05,0xc5,0x0d, 283 | 0x60,0xff,0xff,0x55,0x00,0x01,0xff,0x80,0x00,0x3f,0x80,0x00,0x06,0x00,0x00,0x00, 284 | 0xff,0xff,0xba,0xa0,0x03,0xfe,0x00,0x00,0xcd,0x00,0x00,0x04,0x00,0x00,0x00,0x7f, 285 | 0xff,0x75,0x00,0x04,0x06,0x00,0x03,0x01,0x00,0xf8,0x00,0x00,0x00,0x00,0x3f,0xf9, 286 | 0xaa,0xa0,0x08,0x02,0x00,0x0c,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x01,0x55, 287 | 0x00,0x08,0x00,0x00,0x30,0x01,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x01,0xaa,0xa0, 288 | 0x00,0x00,0x00,0xc0,0x02,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x01,0x55,0x00,0x00, 289 | 0x40,0x01,0x00,0x04,0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x00,0xaa,0xa0,0x00,0x40, 290 | 0x06,0x00,0x08,0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x30,0x18, 291 | 0x00,0x30,0x00,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xaa,0xa8,0x00,0x0f,0xe0,0x00, 292 | 0xc0,0x03,0x88,0x10,0x00,0x00,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x00,0x03,0x00, 293 | 0x04,0x68,0x78,0x00,0x00,0x00,0x00,0x00,0xaa,0xa8,0x00,0x00,0x00,0x0c,0x00,0x04, 294 | 0x10,0x84,0x00,0x00,0x00,0x00,0x01,0xd5,0x00,0x00,0x00,0x00,0x30,0x00,0x04,0x01, 295 | 0x02,0x00,0x00,0x00,0x00,0x02,0xba,0xa8,0x00,0x00,0x00,0xc0,0x00,0x02,0x01,0x01, 296 | 0x00,0x00,0x00,0x00,0x03,0x57,0x40,0x00,0x00,0x03,0xe0,0x00,0x02,0x02,0x00,0x80, 297 | 0x00,0x00,0x00,0x02,0xaa,0xea,0x00,0x00,0x1f,0xe0,0x00,0x01,0x02,0x00,0x80,0x00, 298 | 0x00,0x00,0x03,0x55,0x5c,0x00,0x00,0x7f,0xa0,0x00,0x01,0x02,0x00,0x80,0x00,0x00, 299 | 0x00,0x07,0xaa,0xab,0x80,0x00,0x3f,0xa0,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00, 300 | 0x0f,0xd5,0x50,0x78,0x00,0x0e,0x30,0x00,0x01,0x00,0x81,0x00,0x00,0x00,0x00,0x1b, 301 | 0xea,0xaa,0x87,0x80,0x00,0x28,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x00,0x37,0xf5, 302 | 0x50,0x00,0x7f,0xe0,0x28,0x00,0x07,0x00,0x3e,0x00,0x00,0x00,0x00,0x4f,0xfe,0xaa, 303 | 0xa0,0x00,0x18,0x24,0x00,0x08,0x80,0x04,0x00,0x00,0x00,0x00,0xd7,0xff,0x50,0x00, 304 | 0x00,0x04,0x44,0x00,0x10,0x40,0x04,0x00,0x00,0x00,0x00,0xaf,0xff,0xaa,0xa0,0x00, 305 | 0x12,0x44,0x00,0x20,0x20,0x08,0x00,0x00,0x00,0x01,0x5f,0xff,0xf0,0x00,0x00,0x31, 306 | 0x42,0x00,0x60,0x10,0x10,0x00,0x00,0x00,0x02,0xaf,0xff,0xfa,0xa8,0x00,0x60,0xd2, 307 | 0x01,0x90,0x0c,0x20,0x00,0x00,0x00,0x03,0x5f,0xff,0x57,0x00,0x00,0xe0,0x4a,0x02, 308 | 0x08,0x03,0x60,0x00,0x00,0x00,0x06,0xaf,0xfe,0xaa,0xe8,0x01,0xf0,0x4e,0x0c,0x04, 309 | 0x00,0xe0,0x00,0x00,0x00,0x0d,0x5f,0xfd,0x55,0x1c,0x03,0xf8,0x2f,0x35,0x42,0x00, 310 | 0x20,0x00,0x00,0x00,0x0a,0xaf,0xfa,0xaa,0xab,0x87,0xfc,0x2e,0xea,0x81,0x80,0x40, 311 | 0x00,0x00,0x00,0x15,0x5f,0xf5,0x55,0x01,0xcf,0xfe,0x1f,0x55,0x50,0x60,0x80,0x00, 312 | 0x00,0x00 313 | }; 314 | 315 | // Warning Dolphin Flip bitmap 316 | static const unsigned char PROGMEM image_WarningDolphinFlip_bits[] = { 317 | 0x10,0x40,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x10,0x80,0x3f,0xf8, 318 | 0x00,0x00,0x10,0x80,0xc0,0x06,0x00,0x00,0x11,0x03,0x00,0x01,0x80,0x00,0x11,0x04, 319 | 0x00,0x00,0x40,0x00,0x00,0x08,0x00,0x00,0x20,0x00,0x12,0x10,0x00,0x00,0x10,0x00, 320 | 0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x3c,0x20,0x00,0x78, 321 | 0x04,0x00,0x43,0x40,0x00,0x84,0x04,0x00,0x80,0xc0,0x01,0x7a,0x02,0x00,0x80,0x30, 322 | 0x02,0xdd,0x02,0x00,0xf0,0x0c,0x02,0x9d,0x02,0x00,0x7c,0x03,0x02,0xfd,0x02,0x00, 323 | 0x3e,0x00,0x02,0xfd,0x01,0x00,0x1f,0x80,0x01,0x7a,0x01,0x00,0x0f,0xc0,0x01,0xf4, 324 | 0x01,0x00,0x07,0xe0,0x02,0x08,0x01,0x00,0x03,0xf0,0x00,0x04,0x01,0x00,0x01,0xf8, 325 | 0x00,0x00,0x01,0x00,0x7f,0x86,0x00,0x00,0x01,0x00,0x9e,0x01,0x80,0x06,0x01,0x00, 326 | 0x81,0xff,0xf8,0x09,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x80,0x40,0x00,0x00,0x09, 327 | 0x01,0x80,0x30,0x00,0x00,0x09,0x01,0xc0,0x0e,0x00,0x00,0x08,0xf0,0xc0,0x01,0xff, 328 | 0x00,0x09,0x08,0xe0,0x00,0xfc,0x00,0x0e,0x04,0xe0,0x00,0x80,0x00,0x12,0x04,0x70, 329 | 0x00,0x80,0x00,0x12,0x14,0x70,0x00,0x80,0x00,0x12,0x14,0x78,0x00,0x80,0x00,0x11, 330 | 0xe4,0x38,0x00,0x80,0x00,0x08,0xe2,0x38,0x00,0x80,0x00,0x04,0x02,0x38,0x01,0x00, 331 | 0x00,0x02,0x01,0x18,0x01,0x00,0x00,0x02,0x01,0x18,0x01,0x00,0x00,0x02,0x00,0x98, 332 | 0x01,0x00,0x00,0x02,0x00,0x88,0x01,0x00,0x00,0x02,0x00,0x48 333 | }; 334 | 335 | // File Delete Bin bitmap 336 | static const unsigned char PROGMEM image_file_delete_bin_bits[] = { 337 | 0x07,0x00,0x18,0xc0,0xdf,0xd8,0xff,0xf8,0xc0,0x18,0x40,0x10,0x40,0x10,0x60,0x30, 338 | 0x2a,0xa0,0x2a,0xa0,0x2a,0xa0,0x2a,0xa0,0x2a,0xa0,0x20,0x20,0x1f,0xc0,0x00,0x00 339 | }; 340 | 341 | // SubGHz-R bitmap 342 | static const unsigned char PROGMEM image_Scanning_bits[] = { 343 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 344 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 345 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 346 | 0x00,0x03,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 347 | 0x00,0x0f,0x00,0xe0,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x08,0x00,0x00, 348 | 0x00,0x35,0xc0,0x18,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 349 | 0x00,0x6a,0xa0,0x06,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 350 | 0x00,0x81,0x50,0x01,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 351 | 0x01,0x00,0xa8,0x00,0x80,0x00,0x00,0x02,0x40,0x00,0x00,0x00,0x00,0x41,0x00,0x00, 352 | 0x02,0x00,0x1c,0x00,0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x00,0x00,0x82,0x00,0x00, 353 | 0x04,0x00,0x2e,0x00,0x20,0x00,0x00,0x02,0x41,0x80,0x00,0x00,0x00,0x84,0x00,0x00, 354 | 0x04,0x00,0x16,0x00,0x20,0x00,0x00,0x04,0x41,0x40,0x60,0x00,0x00,0x84,0x00,0x00, 355 | 0x08,0x00,0x0b,0x07,0xf0,0x00,0x00,0x04,0x41,0x40,0x50,0x30,0x01,0x04,0x10,0x00, 356 | 0x08,0x00,0x05,0x38,0x08,0x00,0x00,0x04,0x41,0x40,0x50,0x28,0x01,0x08,0x20,0x00, 357 | 0x10,0x07,0xcb,0xc0,0x08,0x00,0x00,0x08,0x41,0x40,0x50,0x28,0x01,0x08,0x40,0x00, 358 | 0x10,0x09,0xe5,0x02,0x24,0x00,0x00,0x08,0x41,0x40,0x50,0x28,0x01,0x08,0x40,0x00, 359 | 0x10,0x13,0xfe,0x21,0x14,0x00,0x00,0x08,0x21,0x40,0x50,0xff,0x01,0x08,0x40,0x00, 360 | 0x11,0xe6,0x7c,0x11,0x14,0x00,0x00,0x08,0x21,0x5f,0xff,0xff,0x01,0x08,0x40,0x00, 361 | 0x22,0x26,0x74,0x11,0x14,0x00,0x00,0x08,0x3f,0xf5,0xff,0xa8,0x01,0x08,0x20,0x00, 362 | 0x22,0x27,0xf4,0x11,0x54,0x00,0x00,0x18,0x2b,0xfb,0xf8,0x28,0x01,0x04,0x10,0x00, 363 | 0x22,0x27,0xf4,0x0a,0xff,0x00,0x7f,0xf8,0x37,0xfc,0x50,0x28,0x00,0x84,0x00,0x00, 364 | 0x22,0x23,0xf4,0x57,0x00,0x80,0x80,0x58,0x3f,0x40,0x50,0x28,0x00,0x82,0x00,0x00, 365 | 0x21,0x11,0xf4,0xb8,0x00,0x41,0xbe,0x78,0x21,0x40,0x50,0x18,0x00,0x41,0x00,0x00, 366 | 0x61,0xf8,0x63,0x60,0x00,0x21,0xbe,0x68,0x21,0x40,0x50,0x00,0x00,0x40,0x00,0x00, 367 | 0x62,0xaf,0xc3,0x80,0x00,0x22,0x80,0x44,0x21,0x40,0x30,0x00,0x00,0x20,0x00,0x00, 368 | 0xe1,0x50,0x3e,0x00,0x00,0x22,0xc0,0x44,0x11,0x40,0x00,0x00,0x00,0x10,0x00,0x00, 369 | 0xa2,0xa0,0x10,0x00,0x7e,0x25,0xc0,0x42,0x11,0x40,0x00,0x00,0x00,0x08,0x00,0x00, 370 | 0x61,0x60,0x00,0x03,0x81,0xa5,0xe0,0x42,0x10,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, 371 | 0xa0,0x00,0x00,0x0c,0x00,0x4b,0xff,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 372 | 0x60,0x00,0x00,0x30,0x00,0x4b,0xf8,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 373 | 0xa0,0x01,0x00,0xc0,0x00,0x8b,0xf8,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 374 | 0x60,0x00,0x87,0x00,0x01,0x97,0xf0,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 375 | 0xa0,0x00,0x78,0x00,0x03,0x17,0xf0,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 376 | 0x60,0x00,0x00,0x00,0x0e,0x77,0xf0,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 377 | 0xe0,0x00,0x00,0x00,0x3c,0x9f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 378 | 0xc0,0x00,0x00,0x55,0xf9,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 379 | 0x80,0x02,0xaa,0xbf,0xfa,0x0f,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 380 | 0xc0,0x01,0x57,0xff,0xfc,0x07,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 381 | 0x80,0x02,0xab,0xff,0xf8,0x07,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 382 | 0x40,0x01,0x55,0xff,0xf0,0x07,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 383 | 0x80,0x00,0xaa,0xaa,0xc0,0x0f,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 384 | 0x40,0x00,0x55,0x55,0x00,0x0d,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 385 | 0x80,0x00,0x2a,0xae,0x00,0x1a,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 386 | 0x40,0x00,0x15,0xf0,0x00,0x15,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 387 | 0xa0,0x00,0x3e,0x00,0x00,0x3a,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 388 | 0x40,0x00,0x00,0x00,0x00,0x75,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 389 | 0xa0,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 390 | 0x50,0x00,0x00,0x00,0x01,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 391 | 0xa8,0x00,0x00,0x00,0x03,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 392 | 0x54,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 393 | 0xaa,0x00,0x00,0x00,0x3f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 394 | 0x55,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 395 | }; 396 | 397 | // SubGHz-T bitmap 398 | static const unsigned char PROGMEM image_Scanning_short_bits[] = { 399 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 400 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 401 | 0x00,0x00,0x00,0x00,0x00,0x03,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 402 | 0x00,0x0f,0x00,0xe0,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x35,0xc0,0x18, 403 | 0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x6a,0xa0,0x06,0x00,0x00,0x00,0x01, 404 | 0x40,0x00,0x00,0x00,0x00,0x81,0x50,0x01,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00, 405 | 0x01,0x00,0xa8,0x00,0x80,0x00,0x00,0x02,0x40,0x00,0x00,0x00,0x02,0x00,0x1c,0x00, 406 | 0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x00,0x04,0x00,0x2e,0x00,0x20,0x00,0x00,0x02, 407 | 0x41,0x80,0x00,0x00,0x04,0x00,0x16,0x00,0x20,0x00,0x00,0x04,0x41,0x40,0x60,0x00, 408 | 0x08,0x00,0x0b,0x07,0xf0,0x00,0x00,0x04,0x41,0x40,0x50,0x30,0x08,0x00,0x05,0x38, 409 | 0x08,0x00,0x00,0x04,0x41,0x40,0x50,0x28,0x10,0x07,0xcb,0xc0,0x08,0x00,0x00,0x08, 410 | 0x41,0x40,0x50,0x28,0x10,0x09,0xe5,0x02,0x24,0x00,0x00,0x08,0x41,0x40,0x50,0x28, 411 | 0x10,0x13,0xfe,0x21,0x14,0x00,0x00,0x08,0x21,0x40,0x50,0xff,0x11,0xe6,0x7c,0x11, 412 | 0x14,0x00,0x00,0x08,0x21,0x5f,0xff,0xff,0x22,0x26,0x74,0x11,0x14,0x00,0x00,0x08, 413 | 0x3f,0xf5,0xff,0xa8,0x22,0x27,0xf4,0x11,0x54,0x00,0x00,0x18,0x2b,0xfb,0xf8,0x28, 414 | 0x22,0x27,0xf4,0x0a,0xff,0x00,0x7f,0xf8,0x37,0xfc,0x50,0x28,0x22,0x23,0xf4,0x57, 415 | 0x00,0x80,0x80,0x58,0x3f,0x40,0x50,0x28,0x21,0x11,0xf4,0xb8,0x00,0x41,0xbe,0x78, 416 | 0x21,0x40,0x50,0x18,0x61,0xf8,0x63,0x60,0x00,0x21,0xbe,0x68,0x21,0x40,0x50,0x00, 417 | 0x62,0xaf,0xc3,0x80,0x00,0x22,0x80,0x44,0x21,0x40,0x30,0x00,0xe1,0x50,0x3e,0x00, 418 | 0x00,0x22,0xc0,0x44,0x11,0x40,0x00,0x00,0xa2,0xa0,0x10,0x00,0x7e,0x25,0xc0,0x42, 419 | 0x11,0x40,0x00,0x00,0x61,0x60,0x00,0x03,0x81,0xa5,0xe0,0x42,0x10,0xc0,0x00,0x00, 420 | 0xa0,0x00,0x00,0x0c,0x00,0x4b,0xff,0x81,0x10,0x00,0x00,0x00,0x60,0x00,0x00,0x30, 421 | 0x00,0x4b,0xf8,0x01,0x10,0x00,0x00,0x00,0xa0,0x01,0x00,0xc0,0x00,0x8b,0xf8,0x00, 422 | 0x90,0x00,0x00,0x00,0x60,0x00,0x87,0x00,0x01,0x97,0xf0,0x00,0x48,0x00,0x00,0x00, 423 | 0xa0,0x00,0x78,0x00,0x03,0x17,0xf0,0x00,0x28,0x00,0x00,0x00,0x60,0x00,0x00,0x00, 424 | 0x0e,0x77,0xf0,0x00,0x18,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x3c,0x9f,0xf0,0x00, 425 | 0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x55,0xf9,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00, 426 | 0x80,0x02,0xaa,0xbf,0xfa,0x0f,0xe8,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x57,0xff, 427 | 0xfc,0x07,0xe8,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0xab,0xff,0xf8,0x07,0xe8,0x00, 428 | 0x00,0x00,0x00,0x00,0x40,0x01,0x55,0xff,0xf0,0x07,0xc8,0x00,0x00,0x00,0x00,0x00, 429 | 0x80,0x00,0xaa,0xaa,0xc0,0x0f,0xa8,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x55,0x55, 430 | 0x00,0x0d,0x50,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x2a,0xae,0x00,0x1a,0xb0,0x00, 431 | 0x00,0x00,0x00,0x00,0x40,0x00,0x15,0xf0,0x00,0x15,0x60,0x00,0x00,0x00,0x00,0x00, 432 | 0xa0,0x00,0x3e,0x00,0x00,0x3a,0xc0,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 433 | 0x00,0x75,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0xeb,0x00,0x00, 434 | 0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x01,0xde,0x00,0x00,0x00,0x00,0x00,0x00, 435 | 0xa8,0x00,0x00,0x00,0x03,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00, 436 | 0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x3f,0x80,0x00,0x00, 437 | 0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00 438 | }; 439 | 440 | static const unsigned char PROGMEM image_EviSmile1_bits[] = { 441 | 0x30,0x03,0x00,0x60,0x01,0x80,0xe0,0x01,0xc0,0xf3,0xf3,0xc0,0xff,0xff,0xc0,0xff, 442 | 0xff,0xc0,0x7f,0xff,0x80,0x7f,0xff,0x80,0x7f,0xff,0x80,0xef,0xfd,0xc0,0xe7,0xf9, 443 | 0xc0,0xe3,0xf1,0xc0,0xe1,0xe1,0xc0,0xf1,0xe3,0xc0,0xff,0xff,0xc0,0x7f,0xff,0x80, 444 | 0x7b,0xf7,0x80,0x3d,0x2f,0x00,0x1e,0x1e,0x00,0x0f,0xfc,0x00,0x03,0xf0,0x00 445 | }; 446 | 447 | static const unsigned char PROGMEM image_Dolphin_Send_bits[] = { 448 | 0x00,0x00,0x7f,0xf8,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80, 449 | 0x07,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x60,0x00, 450 | 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x00,0x00,0x80, 451 | 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x80,0x80,0x00,0x00,0x00, 452 | 0x00,0x00,0x80,0x00,0x00,0x02,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x01,0x00, 453 | 0x00,0x00,0x01,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 454 | 0x80,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x20, 455 | 0x20,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x3c,0x20,0x08,0x10,0x20,0x00,0x00, 456 | 0x00,0x00,0x08,0x00,0x00,0x00,0x42,0x20,0x04,0x10,0x20,0x00,0x00,0x00,0x00,0x08, 457 | 0x00,0x00,0x00,0x81,0x10,0x04,0x10,0x20,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x01, 458 | 0x18,0x90,0x04,0x10,0x20,0x00,0x00,0x00,0x00,0x10,0x90,0x10,0x01,0x24,0x90,0x04, 459 | 0x10,0x20,0x00,0x00,0x00,0x00,0x21,0x08,0x10,0x01,0x24,0x88,0x04,0x10,0x20,0x00, 460 | 0x00,0x00,0x00,0x23,0x08,0x08,0x01,0x24,0x88,0x08,0x10,0x20,0x00,0x00,0x00,0x00, 461 | 0x22,0x08,0x08,0x01,0x24,0x88,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x62,0x04,0x04, 462 | 0x01,0x24,0x88,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x54,0x04,0x04,0x01,0x24,0x88, 463 | 0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x6c,0x04,0x02,0x01,0x18,0x88,0x00,0x40,0x40, 464 | 0x00,0x00,0x00,0x00,0xd8,0x07,0x01,0x00,0x81,0x08,0x00,0x80,0x80,0x00,0x00,0x00, 465 | 0x00,0xb0,0x07,0x00,0x80,0x42,0x08,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0xe0,0x07, 466 | 0x80,0x00,0x3c,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x80,0x00,0x00, 467 | 0x28,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0xc0,0x00,0x00,0x50,0x00,0x02, 468 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xff,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 469 | 0x00,0x00,0x00,0x0b,0xff,0x80,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 470 | 0x18,0xff,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3c,0x00, 471 | 0xf8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x06,0x01,0x60,0x00, 472 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x10,0x00,0xa0,0x00,0x00,0x00,0x00, 473 | 0x00,0x00,0x00,0x00,0x28,0x00,0x40,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 474 | 0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00, 475 | 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x20, 476 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 477 | 0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 478 | 0x00,0x01,0xa0,0x18,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x40, 479 | 0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x03,0x00,0x00, 480 | 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x40,0x00,0x80,0x00,0x04,0x00,0x00, 481 | 0x00,0x00,0x00,0x00,0x00,0x0a,0x80,0x00,0x60,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 482 | 0x00,0x00,0x0d,0x00,0x28,0x10,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 483 | 0x00,0x56,0x0c,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x2b,0x82, 484 | 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x15,0xc1,0x80,0x02,0x00, 485 | 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x0a,0xf0,0x40,0x02,0x00,0x00,0x00,0x00, 486 | 0x00,0x00,0x00,0xa8,0x00,0x05,0x78,0x3f,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 487 | 0xd0,0x00,0x02,0xbe,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x05, 488 | 0x5f,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0xe0,0x10, 489 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0xff,0xe0,0x00,0x00,0x00, 490 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 491 | 0x00,0x00,0x00,0x00,0x05,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 492 | 0x00,0x02,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59, 493 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00, 494 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00, 495 | 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 496 | 0x00,0x00,0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 497 | 0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00 498 | }; 499 | 500 | void OLED_printLogo(Adafruit_SSD1306 &display) { 501 | display.clearDisplay(); 502 | display.setTextColor(1); 503 | display.setTextSize(2); 504 | display.setTextWrap(false); 505 | display.setCursor(13, 24); 506 | display.print("ESP-GRA"); 507 | display.setCursor(61, 40); 508 | display.print(" BER"); 509 | display.setTextSize(1); 510 | display.setCursor(12, 48); 511 | display.print("v1.1"); 512 | display.setCursor(7, 7); 513 | display.print("by teapot174"); 514 | display.drawBitmap(93, 13, image_satellite_dish_bits, 15, 16, 1); 515 | display.display(); 516 | } 517 | 518 | void OLED_printMenu(Adafruit_SSD1306 &display, byte menuIndex) { 519 | display.clearDisplay(); 520 | if (menuIndex == 0) { 521 | display.drawBitmap(5, 12, image_Scanning_bits, 123, 52, 1); 522 | display.setCursor(42, 4); 523 | display.print("SubGHz-R"); 524 | } else if (menuIndex == 1) { 525 | display.drawBitmap(5, 12, image_Scanning_short_bits, 96, 52, 1); 526 | display.setCursor(42, 4); 527 | display.print("SubGHz-T"); 528 | } else if (menuIndex == 2) { 529 | display.drawBitmap(5, 12, image_DolphinSuccess_bits, 96, 52, 1); 530 | display.drawBitmap(71, 31, image_MHz_1_bits, 25, 11, 1); 531 | display.setCursor(42, 4); 532 | display.print("Analyser"); 533 | } else if (menuIndex == 3) { 534 | display.drawBitmap(0, 12, image_Scanning_short_bits, 96, 52, 1); 535 | display.drawBitmap(100, 17, image_EviSmile1_bits, 18, 21, 1); 536 | display.setCursor(47, 4); 537 | display.print("Jammer"); 538 | } 539 | display.setTextColor(1); 540 | display.setTextWrap(false); 541 | display.setCursor(2, 4); 542 | display.print("<"); 543 | display.setCursor(120, 4); 544 | display.print(">"); 545 | display.display(); 546 | } 547 | #endif 548 | --------------------------------------------------------------------------------