Krolyxon
Commit 278646b

Branches

Tags

Refs →

orion-rfsrcrfcc1101.cpp

205 lines · 3.9 KB · C++

1#include <Arduino.h>
2#include "../libs/ELECHOUSE_CC1101_SRC_DRV.h"
3#include "cc1101.h"
4#include "../config.h"
5#include "SPI.h"
6
7// ===== CONFIG =====
8#define RAW_BUF_MAX 512
9
10// ===== STATE =====
11static bool cc1101Inited = false;
12
13// ===== CAPTURE STATE =====
14volatile unsigned long captureBuffer[RAW_BUF_MAX];
15volatile int pulseIndex = 0;
16volatile unsigned long lastEdgeTime = 0;
17volatile bool capturing = false;
18
19// ===== RF SETTINGS =====
20float currentFreq = 433.92;
21float dataRate = 3.79372;
22float deviation = 0.0;
23float rxBW = 325.0;
24int powerLevel = 10;
25
26// ===== ISR =====
27void IRAM_ATTR pulseISR()
28{
29 unsigned long now = micros();
30
31 if (!capturing) return;
32 if (pulseIndex >= RAW_BUF_MAX) return;
33
34 unsigned long duration = now - lastEdgeTime;
35
36 if (duration < 150) return;
37
38 captureBuffer[pulseIndex++] = duration;
39 lastEdgeTime = now;
40}
41
42// ===== OOK SETUP =====
43void setupOOKMode()
44{
45 ELECHOUSE_cc1101.SetRx();
46 ELECHOUSE_cc1101.setMHZ(currentFreq);
47
48 ELECHOUSE_cc1101.setModulation(2); // ASK/OOK
49 ELECHOUSE_cc1101.setDRate(dataRate);
50 ELECHOUSE_cc1101.setDeviation(0);
51 ELECHOUSE_cc1101.setRxBW(rxBW);
52 ELECHOUSE_cc1101.setSyncMode(0);
53 ELECHOUSE_cc1101.setPA(powerLevel);
54}
55
56// ===== INIT (LAZY, SAFE) =====
57// ================= CC1101 INIT =================
58bool initCC1101()
59{
60 Serial.println();
61 Serial.println("===== CC1101 INIT =====");
62
63 // ===== SPI =====
64 SPI.begin(
65 cc1101_SCK,
66 cc1101_MISO,
67 cc1101_MOSI,
68 CC1101_CS
69 );
70
71 pinMode(CC1101_CS, OUTPUT);
72 digitalWrite(CC1101_CS, HIGH);
73
74 delay(100);
75
76 // ===== GDO =====
77 ELECHOUSE_cc1101.setGDO(
78 CC1101_GDO0,
79 -1
80 );
81
82 ELECHOUSE_cc1101.setSpiPin(
83 cc1101_SCK,
84 cc1101_MISO,
85 cc1101_MOSI,
86 CC1101_CS
87 );
88
89 // ===== DETECT =====
90 Serial.println("Checking chip...");
91
92 if (!ELECHOUSE_cc1101.getCC1101())
93 {
94 Serial.println("❌ CC1101 NOT FOUND");
95 return false;
96 }
97
98 Serial.println("✅ CC1101 FOUND");
99
100 // ===== IMPORTANT =====
101 // DO NOT CALL Init()
102 // it freezes on some ESP32-S3 setups
103
104 // ===== MANUAL CONFIG =====
105 ELECHOUSE_cc1101.setMHZ(currentFreq);
106
107 // 2 = ASK/OOK
108 ELECHOUSE_cc1101.setModulation(2);
109
110 ELECHOUSE_cc1101.setDRate(dataRate);
111
112 ELECHOUSE_cc1101.setRxBW(rxBW);
113
114 ELECHOUSE_cc1101.setDeviation(0);
115
116 // disable sync requirement
117 ELECHOUSE_cc1101.setSyncMode(0);
118
119 ELECHOUSE_cc1101.setPA(powerLevel);
120
121 // async serial mode
122 ELECHOUSE_cc1101.setCCMode(0);
123
124 // enter RX
125 ELECHOUSE_cc1101.SetRx();
126
127 pinMode(CC1101_GDO0, INPUT);
128
129 Serial.println("✅ RX MODE READY");
130
131 cc1101Inited = true;
132 return true;
133}
134// ===== CAPTURE CONTROL =====
135void startCapture()
136{
137 pulseIndex = 0;
138 capturing = true;
139 lastEdgeTime = micros();
140
141 attachInterrupt(
142 digitalPinToInterrupt(CC1101_GDO0),
143 pulseISR,
144 CHANGE
145 );
146
147 Serial.println("Looking for RF... ");
148}
149
150bool isCC1101Ready() {
151 return cc1101Inited;
152}
153
154void stopCapture()
155{
156 capturing = false;
157
158 detachInterrupt(digitalPinToInterrupt(CC1101_GDO0));
159
160 Serial.println("Capture stopped");
161}
162
163// ===== DEBUG PRINT =====
164void printCapture()
165{
166 Serial.println("Captured pulses:");
167
168 for (int i = 0; i < pulseIndex; i++)
169 {
170 Serial.println(captureBuffer[i]);
171 }
172}
173
174
175// ================= REPLAY =================
176void replaySignal()
177{
178 Serial.println();
179 Serial.println("Replaying signal...");
180
181 stopCapture();
182
183 ELECHOUSE_cc1101.SetTx();
184
185 pinMode(CC1101_GDO0, OUTPUT);
186
187 for (int i = 0; i < pulseIndex; i++)
188 {
189 digitalWrite(
190 CC1101_GDO0,
191 (i % 2 == 0) ? HIGH : LOW
192 );
193
194 delayMicroseconds(captureBuffer[i]);
195 }
196
197 digitalWrite(CC1101_GDO0, LOW);
198
199 ELECHOUSE_cc1101.SetRx();
200
201 pinMode(CC1101_GDO0, INPUT);
202
203 Serial.println("Replay complete");
204}
205