diff options
Diffstat (limited to 'src/rf')
| -rw-r--r-- | src/rf/cc1101.cpp | 420 | ||||
| -rw-r--r-- | src/rf/nrf24.cpp | 211 | ||||
| -rw-r--r-- | src/rf/nrf24.h | 2 |
3 files changed, 317 insertions, 316 deletions
diff --git a/src/rf/cc1101.cpp b/src/rf/cc1101.cpp index f9b16b7..87966f8 100644 --- a/src/rf/cc1101.cpp +++ b/src/rf/cc1101.cpp @@ -27,331 +27,331 @@ int powerLevel = 10; // ===== ISR ===== void IRAM_ATTR pulseISR() { - unsigned long now = micros(); + unsigned long now = micros(); - if (!capturing) - return; - if (pulseIndex >= RAW_BUF_MAX) - return; + if (!capturing) + return; + if (pulseIndex >= RAW_BUF_MAX) + return; - unsigned long duration = now - lastEdgeTime; + unsigned long duration = now - lastEdgeTime; - if (duration < 150) - return; + if (duration < 150) + return; - captureBuffer[pulseIndex++] = duration; - lastEdgeTime = now; + captureBuffer[pulseIndex++] = duration; + lastEdgeTime = now; } // ===== OOK SETUP ===== void setupOOKMode() { - ELECHOUSE_cc1101.SetRx(); - ELECHOUSE_cc1101.setMHZ(currentFreq); - - ELECHOUSE_cc1101.setModulation(2); // ASK/OOK - ELECHOUSE_cc1101.setDRate(dataRate); - ELECHOUSE_cc1101.setDeviation(0); - ELECHOUSE_cc1101.setRxBW(rxBW); - ELECHOUSE_cc1101.setSyncMode(0); - ELECHOUSE_cc1101.setPA(powerLevel); + ELECHOUSE_cc1101.SetRx(); + ELECHOUSE_cc1101.setMHZ(currentFreq); + + ELECHOUSE_cc1101.setModulation(2); // ASK/OOK + ELECHOUSE_cc1101.setDRate(dataRate); + ELECHOUSE_cc1101.setDeviation(0); + ELECHOUSE_cc1101.setRxBW(rxBW); + ELECHOUSE_cc1101.setSyncMode(0); + ELECHOUSE_cc1101.setPA(powerLevel); } // ===== INIT (LAZY, SAFE) ===== // ================= CC1101 INIT ================= bool initCC1101() { - Serial.println(); - Serial.println("===== CC1101 INIT ====="); + Serial.println(); + Serial.println("===== CC1101 INIT ====="); - // ===== SPI ===== - SPI.begin(cc1101_SCK, cc1101_MISO, cc1101_MOSI, CC1101_CS); + // ===== SPI ===== + SPI.begin(cc1101_SCK, cc1101_MISO, cc1101_MOSI, CC1101_CS); - pinMode(CC1101_CS, OUTPUT); - digitalWrite(CC1101_CS, HIGH); + pinMode(CC1101_CS, OUTPUT); + digitalWrite(CC1101_CS, HIGH); - delay(100); + delay(100); - // ===== GDO ===== - ELECHOUSE_cc1101.setGDO(CC1101_GDO0, -1); + // ===== GDO ===== + ELECHOUSE_cc1101.setGDO(CC1101_GDO0, -1); - ELECHOUSE_cc1101.setSpiPin(cc1101_SCK, cc1101_MISO, cc1101_MOSI, CC1101_CS); + ELECHOUSE_cc1101.setSpiPin(cc1101_SCK, cc1101_MISO, cc1101_MOSI, CC1101_CS); - // ===== DETECT ===== - Serial.println("Checking chip..."); + // ===== DETECT ===== + Serial.println("Checking chip..."); - if (!ELECHOUSE_cc1101.getCC1101()) { - Serial.println("❌ CC1101 NOT FOUND"); - return false; - } + if (!ELECHOUSE_cc1101.getCC1101()) { + Serial.println("❌ CC1101 NOT FOUND"); + return false; + } - Serial.println("✅ CC1101 FOUND"); + Serial.println("✅ CC1101 FOUND"); - // ===== IMPORTANT ===== - // DO NOT CALL Init() - // it freezes on some ESP32-S3 setups + // ===== IMPORTANT ===== + // DO NOT CALL Init() + // it freezes on some ESP32-S3 setups - // ===== MANUAL CONFIG ===== - ELECHOUSE_cc1101.setMHZ(currentFreq); + // ===== MANUAL CONFIG ===== + ELECHOUSE_cc1101.setMHZ(currentFreq); - // 2 = ASK/OOK - ELECHOUSE_cc1101.setModulation(2); + // 2 = ASK/OOK + ELECHOUSE_cc1101.setModulation(2); - ELECHOUSE_cc1101.setDRate(dataRate); + ELECHOUSE_cc1101.setDRate(dataRate); - ELECHOUSE_cc1101.setRxBW(rxBW); + ELECHOUSE_cc1101.setRxBW(rxBW); - ELECHOUSE_cc1101.setDeviation(0); + ELECHOUSE_cc1101.setDeviation(0); - // disable sync requirement - ELECHOUSE_cc1101.setSyncMode(0); + // disable sync requirement + ELECHOUSE_cc1101.setSyncMode(0); - ELECHOUSE_cc1101.setPA(powerLevel); + ELECHOUSE_cc1101.setPA(powerLevel); - // async serial mode - ELECHOUSE_cc1101.setCCMode(0); + // async serial mode + ELECHOUSE_cc1101.setCCMode(0); - // enter RX - ELECHOUSE_cc1101.SetRx(); + // enter RX + ELECHOUSE_cc1101.SetRx(); - pinMode(CC1101_GDO0, INPUT); + pinMode(CC1101_GDO0, INPUT); - Serial.println("✅ RX MODE READY"); + Serial.println("✅ RX MODE READY"); - cc1101Inited = true; - return true; + cc1101Inited = true; + return true; } // ===== CAPTURE CONTROL ===== void startCapture() { - pulseIndex = 0; - capturing = true; - lastEdgeTime = micros(); + pulseIndex = 0; + capturing = true; + lastEdgeTime = micros(); - attachInterrupt(digitalPinToInterrupt(CC1101_GDO0), pulseISR, CHANGE); + attachInterrupt(digitalPinToInterrupt(CC1101_GDO0), pulseISR, CHANGE); - Serial.println("Looking for RF... "); + Serial.println("Looking for RF... "); } bool isCC1101Ready() { return cc1101Inited; } void stopCapture() { - capturing = false; + capturing = false; - detachInterrupt(digitalPinToInterrupt(CC1101_GDO0)); + detachInterrupt(digitalPinToInterrupt(CC1101_GDO0)); - Serial.println("Capture stopped"); + Serial.println("Capture stopped"); } // ===== DEBUG PRINT ===== void printCapture() { - Serial.println("Captured pulses:"); + Serial.println("Captured pulses:"); - for (int i = 0; i < pulseIndex; i++) { - Serial.println(captureBuffer[i]); - } + for (int i = 0; i < pulseIndex; i++) { + Serial.println(captureBuffer[i]); + } } // ================= REPLAY ================= void replaySignal() { - Serial.println(); - Serial.println("Replaying signal..."); + Serial.println(); + Serial.println("Replaying signal..."); - stopCapture(); + stopCapture(); - ELECHOUSE_cc1101.SetTx(); + ELECHOUSE_cc1101.SetTx(); - pinMode(CC1101_GDO0, OUTPUT); + pinMode(CC1101_GDO0, OUTPUT); - for (int i = 0; i < pulseIndex; i++) { - digitalWrite(CC1101_GDO0, (i % 2 == 0) ? HIGH : LOW); + for (int i = 0; i < pulseIndex; i++) { + digitalWrite(CC1101_GDO0, (i % 2 == 0) ? HIGH : LOW); - delayMicroseconds(captureBuffer[i]); - } + delayMicroseconds(captureBuffer[i]); + } - digitalWrite(CC1101_GDO0, LOW); + digitalWrite(CC1101_GDO0, LOW); - ELECHOUSE_cc1101.SetRx(); + ELECHOUSE_cc1101.SetRx(); - pinMode(CC1101_GDO0, INPUT); + pinMode(CC1101_GDO0, INPUT); - Serial.println("Replay complete"); + 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; + if (!cc1101Inited) { + if (!initCC1101()) { + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(0, 20, "CC1101 Failed"); + u8g2.sendBuffer(); + return; + } } - } - startCapture(); + 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(); + 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; + unsigned long lastSignal = millis(); + int lastPulseCount = 0; - while (true) { - // signal detected - if (pulseIndex > lastPulseCount) { - lastPulseCount = pulseIndex; - lastSignal = millis(); - } + while (true) { + // signal detected + if (pulseIndex > lastPulseCount) { + lastPulseCount = pulseIndex; + lastSignal = millis(); + } - // update OLED - u8g2.clearBuffer(); - u8g2.setFont(u8g2_font_6x10_tr); + // update OLED + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); - u8g2.drawStr(0, 12, "CC1101 Capture"); + u8g2.drawStr(0, 12, "CC1101 Capture"); - u8g2.setCursor(0, 28); - u8g2.print("Pulses: "); - u8g2.print(pulseIndex); + u8g2.setCursor(0, 28); + u8g2.print("Pulses: "); + u8g2.print(pulseIndex); - u8g2.setCursor(0, 42); - u8g2.print("Freq: "); - u8g2.print(currentFreq); - u8g2.print(" MHz"); + 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..."); - } + if (pulseIndex > 0) { + u8g2.drawStr(0, 54, "Signal Detected"); + } else { + u8g2.drawStr(0, 54, "Waiting..."); + } - u8g2.sendBuffer(); + u8g2.sendBuffer(); - // auto print once capture stabilizes - if (pulseIndex > 20 && (millis() - lastSignal > 1500)) { - stopCapture(); + // auto print once capture stabilizes + if (pulseIndex > 20 && (millis() - lastSignal > 1500)) { + stopCapture(); - Serial.println(); - Serial.println("===== RF CAPTURE ====="); + Serial.println(); + Serial.println("===== RF CAPTURE ====="); - for (int i = 0; i < pulseIndex; i++) { - Serial.print(captureBuffer[i]); - Serial.print(", "); - } + for (int i = 0; i < pulseIndex; i++) { + Serial.print(captureBuffer[i]); + Serial.print(", "); + } - Serial.println(); + Serial.println(); - u8g2.clearBuffer(); - u8g2.setFont(u8g2_font_6x10_tr); - u8g2.drawStr(0, 15, "Capture Complete"); + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(0, 15, "Capture Complete"); - u8g2.setCursor(0, 35); + 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; + 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; + pulseIndex = 0; - startCapture(); + startCapture(); - // ===== CAPTURE FOR 5 SEC ===== - unsigned long start = millis(); + // ===== CAPTURE FOR 5 SEC ===== + unsigned long start = millis(); - while (millis() - start < 5000) { - noInterrupts(); - int count = pulseIndex; - interrupts(); + while (millis() - start < 5000) { + noInterrupts(); + int count = pulseIndex; + interrupts(); - u8g2.clearBuffer(); - u8g2.setFont(u8g2_font_6x10_tr); + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); - u8g2.drawStr(0, 12, "RF Capturing..."); + u8g2.drawStr(0, 12, "RF Capturing..."); - u8g2.setCursor(0, 30); - u8g2.print("Pulses: "); - u8g2.print(count); + u8g2.setCursor(0, 30); + u8g2.print("Pulses: "); + u8g2.print(count); - u8g2.sendBuffer(); + u8g2.sendBuffer(); - delay(50); - } + delay(50); + } - stopCapture(); + stopCapture(); - // ===== DISPLAY CAPTURE BUFFER ===== - int scroll = 0; + // ===== DISPLAY CAPTURE BUFFER ===== + int scroll = 0; - while (1) { - noInterrupts(); - int count = pulseIndex; - interrupts(); + while (1) { + noInterrupts(); + int count = pulseIndex; + interrupts(); - u8g2.clearBuffer(); - u8g2.setFont(u8g2_font_5x8_tr); + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_5x8_tr); - u8g2.drawStr(0, 8, "Captured Buffer"); + u8g2.drawStr(0, 8, "Captured Buffer"); - // display 6 lines - for (int i = 0; i < 6; i++) { - int idx = scroll + i; + // display 6 lines + for (int i = 0; i < 6; i++) { + int idx = scroll + i; - if (idx >= count) - break; + if (idx >= count) + break; - noInterrupts(); - unsigned long val = captureBuffer[idx]; - interrupts(); + noInterrupts(); + unsigned long val = captureBuffer[idx]; + interrupts(); - char buf[32]; + char buf[32]; - snprintf(buf, sizeof(buf), "%03d: %lu", idx, val); + snprintf(buf, sizeof(buf), "%03d: %lu", idx, val); - u8g2.drawStr(0, 20 + (i * 8), buf); - } + u8g2.drawStr(0, 20 + (i * 8), buf); + } - u8g2.sendBuffer(); + u8g2.sendBuffer(); - // scroll down - if (btnDown()) { - if (scroll < count - 1) - scroll++; + // scroll down + if (btnDown()) { + if (scroll < count - 1) + scroll++; - delay(120); - } + delay(120); + } - // scroll up - if (btnUp()) { - if (scroll > 0) - scroll--; + // scroll up + if (btnUp()) { + if (scroll > 0) + scroll--; - delay(120); - } + delay(120); + } - // replay - if (btnSelect()) { - replaySignal(); - delay(300); - } + // replay + if (btnSelect()) { + replaySignal(); + delay(300); + } - // exit - if (btnBack()) { - delay(150); - return; - } + // exit + if (btnBack()) { + delay(150); + return; + } - delay(20); - } + delay(20); + } } diff --git a/src/rf/nrf24.cpp b/src/rf/nrf24.cpp index fb6e1ee..dad0f11 100644 --- a/src/rf/nrf24.cpp +++ b/src/rf/nrf24.cpp @@ -21,19 +21,19 @@ const byte zigbee_channels[] = {11, 15, 20, 25}; const byte rc_channels[] = {1, 3, 5, 7}; void initNRF(RF24 &radio) { - if (!radio.begin(RADIO_SPI)) { - Serial.println("NRF not found"); - return; - } - - radio.setAutoAck(false); - radio.stopListening(); - radio.setRetries(0, 0); - radio.setPALevel(RF24_PA_MAX, true); - radio.setDataRate(RF24_2MBPS); - radio.openWritingPipe(0xE7E7E7E7E7LL); - radio.setCRCLength(RF24_CRC_DISABLED); - Serial.println("NRF Initialized"); + if (!radio.begin(RADIO_SPI)) { + Serial.println("NRF not found"); + return; + } + + radio.setAutoAck(false); + radio.stopListening(); + radio.setRetries(0, 0); + radio.setPALevel(RF24_PA_MAX, true); + radio.setDataRate(RF24_2MBPS); + radio.openWritingPipe(0xE7E7E7E7E7LL); + radio.setCRCLength(RF24_CRC_DISABLED); + Serial.println("NRF Initialized"); } // void startBleJammer() { @@ -110,107 +110,108 @@ void initNRF(RF24 &radio) { // } void startJammer(const char *name, const byte *channels, size_t channelCount) { - initNRF(radio1); - initNRF(radio2); - - Serial.println("NRF JAMMER STARTED"); - - const char payload[] = "xxxxxxxxxxxxxxxx"; - - u8g2.clearBuffer(); - u8g2.setFont(u8g2_font_6x10_tr); - u8g2.drawStr(0, 15, "NRF24 Jammer"); - u8g2.drawStr(0, 35, name); - u8g2.drawStr(0, 55, "BACK = Exit"); - u8g2.sendBuffer(); - - while (true) { - for (size_t i = 0; i < channelCount; i++) { - // radio1.setChannel(channels[i]); - // radio1.write(&payload, sizeof(payload)); - - // Optional second NRF - // radio2.setChannel(channels[i]); - // radio2.write(&payload, sizeof(payload)); - - radio1.setChannel(channels[i]); - radio2.setChannel(channels[(i + 1) % channelCount]); - - radio1.writeFast(&payload, sizeof(payload)); - radio2.writeFast(&payload, sizeof(payload)); + initNRF(radio1); + initNRF(radio2); + + Serial.println("NRF JAMMER STARTED"); + + const char payload[] = "xxxxxxxxxxxxxxxx"; + + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(0, 15, "NRF24 Jammer"); + u8g2.drawStr(0, 35, name); + u8g2.drawStr(0, 55, "BACK = Exit"); + u8g2.sendBuffer(); + + while (true) { + for (size_t i = 0; i < channelCount; i++) { + // radio1.setChannel(channels[i]); + // radio1.write(&payload, sizeof(payload)); + + // Optional second NRF + // radio2.setChannel(channels[i]); + // radio2.write(&payload, sizeof(payload)); + + radio1.setChannel(channels[i]); + radio2.setChannel(channels[(i + 1) % channelCount]); + + radio1.writeFast(&payload, sizeof(payload)); + radio2.writeFast(&payload, sizeof(payload)); + } + + if (btnBack()) { + Serial.println("Jammer stopped"); + radio1.powerDown(); + radio2.powerDown(); + return; + } } - if (btnBack()) { - Serial.println("Jammer stopped"); - radio1.powerDown(); - radio2.powerDown(); - return; - } - } - - // while (true) { - // for (size_t i = 0; i < channelCount; i++) - //{ - // radio1.setChannel(channels[i]); - // radio2.setChannel(channels[(i + 1) % channelCount]); + // while (true) { + // for (size_t i = 0; i < channelCount; i++) + //{ + // radio1.setChannel(channels[i]); + // radio2.setChannel(channels[(i + 1) % channelCount]); - // radio1.writeFast(&payload, sizeof(payload)); - // radio2.writeFast(&payload, sizeof(payload)); + // radio1.writeFast(&payload, sizeof(payload)); + // radio2.writeFast(&payload, sizeof(payload)); - // radio1.txStandBy(1); - // radio2.txStandBy(1); + // radio1.txStandBy(1); + // radio2.txStandBy(1); - // delayMicroseconds(200); - //} + // delayMicroseconds(200); + //} - // if (btnBack()) - //{ - // Serial.println("Jammer stopped"); + // if (btnBack()) + //{ + // Serial.println("Jammer stopped"); - // radio1.powerDown(); - // radio2.powerDown(); + // radio1.powerDown(); + // radio2.powerDown(); - // return; - //} - //} + // return; + //} + //} } void NRFToolsMenu(int index) { - switch (index) { - case 0: - // startBleJammer(); - // BLE - startJammer("BLE", bleChannels, - sizeof(bleChannels) / sizeof(bleChannels[0])); - - break; - case 1: - // startBluetoothJammer(); - // Bluetooth - startJammer("Bluetooth", bluetoothChannels, - sizeof(bluetoothChannels) / sizeof(bluetoothChannels[0])); - break; - - case 2: - startJammer("WiFi", wifiChannels, - sizeof(wifiChannels) / sizeof(wifiChannels[0])); - break; - case 3: - startJammer("USB Wireless", usbWireless_channels, - sizeof(usbWireless_channels) / sizeof(usbWireless_channels[0])); - break; - case 4: - startJammer("Video TX", videoTransmitter_channels, - sizeof(videoTransmitter_channels) / - sizeof(videoTransmitter_channels[0])); - break; - case 5: - break; - startJammer("RC", rc_channels, - sizeof(rc_channels) / sizeof(rc_channels[0])); - break; - case 6: - - break; - } + switch (index) { + case 0: + // startBleJammer(); + // BLE + startJammer("BLE", bleChannels, + sizeof(bleChannels) / sizeof(bleChannels[0])); + + break; + case 1: + // startBluetoothJammer(); + // Bluetooth + startJammer("Bluetooth", bluetoothChannels, + sizeof(bluetoothChannels) / sizeof(bluetoothChannels[0])); + break; + + case 2: + startJammer("WiFi", wifiChannels, + sizeof(wifiChannels) / sizeof(wifiChannels[0])); + break; + case 3: + startJammer("USB Wireless", usbWireless_channels, + sizeof(usbWireless_channels) / + sizeof(usbWireless_channels[0])); + break; + case 4: + startJammer("Video TX", videoTransmitter_channels, + sizeof(videoTransmitter_channels) / + sizeof(videoTransmitter_channels[0])); + break; + case 5: + break; + startJammer("RC", rc_channels, + sizeof(rc_channels) / sizeof(rc_channels[0])); + break; + case 6: + + break; + } } diff --git a/src/rf/nrf24.h b/src/rf/nrf24.h index 308bbc4..6d7f7d8 100644 --- a/src/rf/nrf24.h +++ b/src/rf/nrf24.h @@ -8,6 +8,6 @@ void initNRF(RF24 &radio); void startBluetoothJammer(); void startBleJammer(); -void startJammer(const char* name, const byte* channels, size_t channelCount); +void startJammer(const char *name, const byte *channels, size_t channelCount); void NRFToolsMenu(int index); |
