diff options
Diffstat (limited to 'src/rf/cc1101.cpp')
| -rw-r--r-- | src/rf/cc1101.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/rf/cc1101.cpp b/src/rf/cc1101.cpp index 603a0d7..50530f4 100644 --- a/src/rf/cc1101.cpp +++ b/src/rf/cc1101.cpp @@ -3,6 +3,8 @@ #include "cc1101.h" #include "../config.h" #include "SPI.h" +#include "../ui/display.h" +#include "../utils/buttons.h" // ===== CONFIG ===== #define RAW_BUF_MAX 512 @@ -203,3 +205,204 @@ void replaySignal() Serial.println("Replay complete"); } + +void captureAndDisplay() +{ + if (!cc1101Inited) + { + if (!initCC1101()) + { + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(0, 20, "CC1101 Failed"); + u8g2.sendBuffer(); + return; + } + } + + startCapture(); + + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(0, 12, "CC1101 Capture"); + u8g2.drawStr(0, 28, "Waiting RF..."); + u8g2.drawStr(0, 60, "BACK = Exit"); + u8g2.sendBuffer(); + + unsigned long lastSignal = millis(); + int lastPulseCount = 0; + + while (true) + { + // signal detected + if (pulseIndex > lastPulseCount) + { + lastPulseCount = pulseIndex; + lastSignal = millis(); + } + + // update OLED + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + + u8g2.drawStr(0, 12, "CC1101 Capture"); + + u8g2.setCursor(0, 28); + u8g2.print("Pulses: "); + u8g2.print(pulseIndex); + + u8g2.setCursor(0, 42); + u8g2.print("Freq: "); + u8g2.print(currentFreq); + u8g2.print(" MHz"); + + if (pulseIndex > 0) + { + u8g2.drawStr(0, 54, "Signal Detected"); + } + else + { + u8g2.drawStr(0, 54, "Waiting..."); + } + + u8g2.sendBuffer(); + + // auto print once capture stabilizes + if (pulseIndex > 20 && (millis() - lastSignal > 1500)) + { + stopCapture(); + + Serial.println(); + Serial.println("===== RF CAPTURE ====="); + + for (int i = 0; i < pulseIndex; i++) + { + Serial.print(captureBuffer[i]); + Serial.print(", "); + } + + Serial.println(); + + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(0, 15, "Capture Complete"); + + u8g2.setCursor(0, 35); +} +} +} + +void handleMenu() +{ + if (!isCC1101Ready()) + { + if (!initCC1101()) + { + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(0, 20, "CC1101 Failed"); + u8g2.sendBuffer(); + delay(1500); + return; + } + } + + pulseIndex = 0; + + startCapture(); + + // ===== CAPTURE FOR 5 SEC ===== + unsigned long start = millis(); + + while (millis() - start < 5000) + { + noInterrupts(); + int count = pulseIndex; + interrupts(); + + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + + u8g2.drawStr(0, 12, "RF Capturing..."); + + u8g2.setCursor(0, 30); + u8g2.print("Pulses: "); + u8g2.print(count); + + u8g2.sendBuffer(); + + delay(50); + } + + stopCapture(); + + // ===== DISPLAY CAPTURE BUFFER ===== + int scroll = 0; + + while (1) + { + noInterrupts(); + int count = pulseIndex; + interrupts(); + + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_5x8_tr); + + u8g2.drawStr(0, 8, "Captured Buffer"); + + // display 6 lines + for (int i = 0; i < 6; i++) + { + int idx = scroll + i; + + if (idx >= count) + break; + + noInterrupts(); + unsigned long val = captureBuffer[idx]; + interrupts(); + + char buf[32]; + + snprintf(buf, sizeof(buf), "%03d: %lu", idx, val); + + u8g2.drawStr(0, 20 + (i * 8), buf); + } + + u8g2.sendBuffer(); + + // scroll down + if (btnDown()) + { + if (scroll < count - 1) + scroll++; + + delay(120); + } + + // scroll up + if (btnUp()) + { + if (scroll > 0) + scroll--; + + delay(120); + } + + // replay + if (btnSelect()) + { + replaySignal(); + delay(300); + } + + // exit + if (btnBack()) + { + delay(150); + return; + } + + delay(20); + } +} |
