aboutsummaryrefslogtreecommitdiff
path: root/src/rf
diff options
context:
space:
mode:
Diffstat (limited to 'src/rf')
-rw-r--r--src/rf/cc1101.cpp203
-rw-r--r--src/rf/cc1101.h3
2 files changed, 206 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);
+ }
+}
diff --git a/src/rf/cc1101.h b/src/rf/cc1101.h
index a403edb..def6a2e 100644
--- a/src/rf/cc1101.h
+++ b/src/rf/cc1101.h
@@ -3,6 +3,9 @@
bool initCC1101();
bool isCC1101Ready();
+void captureAndDisplay();
+
+void handleMenu();
void startCapture();
void stopCapture();
void printCapture();