From a301cc5ea109f5a21b7d795794970b12449d2b39 Mon Sep 17 00:00:00 2001 From: David Westgate Date: Fri, 11 Apr 2025 19:24:35 -0700 Subject: [PATCH] save pkt in file --- .gitignore | 2 + .vscode/settings.json | 2 +- README.md | 2 +- __pycache__/init_regs_value.cpython-311.pyc | Bin 755 -> 0 bytes __pycache__/regs_addr.cpython-311.pyc | Bin 5934 -> 0 bytes __pycache__/util.cpython-311.pyc | Bin 3668 -> 0 bytes freq.txt | 12 ---- src/common.py | 2 +- src/receive.py | 66 ++++++-------------- src/util.py | 9 +-- typings/spidev/__init__.pyi | 6 ++ wiring.txt | 31 --------- 12 files changed, 30 insertions(+), 102 deletions(-) create mode 100644 .gitignore delete mode 100644 __pycache__/init_regs_value.cpython-311.pyc delete mode 100644 __pycache__/regs_addr.cpython-311.pyc delete mode 100644 __pycache__/util.cpython-311.pyc delete mode 100644 freq.txt create mode 100644 typings/spidev/__init__.pyi delete mode 100644 wiring.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fed3f81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +saved_packets/* +src/__pycache__ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index c1860fa..8ed7c59 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - + "python.analysis.stubPath": "./typings" } \ No newline at end of file diff --git a/README.md b/README.md index 63ab42b..c1dbca9 100644 --- a/README.md +++ b/README.md @@ -106,4 +106,4 @@ The known frequency range is 2400 – 2483.5 MHz, and my SDR has a 20 MHZ bandwi ## Run -`python3 read.py` \ No newline at end of file +`python3 -m src.main` \ No newline at end of file diff --git a/__pycache__/init_regs_value.cpython-311.pyc b/__pycache__/init_regs_value.cpython-311.pyc deleted file mode 100644 index b3c4f1841da08260d8433e762702f0934b932940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmZ9{&u$V?6bA4+zzhRrnDVcM7FybxG$huUX}i;y;0!d4g;s{RaMKXZq!LSM1~5@K zK7xr0H@Y;&ohx6#S7=z7xVmnfq#M(f=WyGGIE0ViH}~F?%NI?HGko6c{yq5=W$YJ~ znn%x zU1}CjQ9Rin;Z+yYuIkXtC~3 zktTZYtT#ILy_4bb%g*W8`^xBo?8-8p5Bi>Q-ZPv*cii{RMnj|98EuXHPWOf98~+`< zcmC>1eb67k_|$voS8#%a-{BvOAS_8za5tL?T|^S^oFI()8A+mKRG=`K93`tvrX4YI zTzHP05PLLoQdlR?3#Z6w;S4z|&gRGqOxAGbA~`SK7syLY*75x^xhPyBuL!S_%i`=B bd0lvee23)<7ukHUNrm0STb(}sCjRGtYJSWH diff --git a/__pycache__/regs_addr.cpython-311.pyc b/__pycache__/regs_addr.cpython-311.pyc deleted file mode 100644 index f937fb221aab11fac8babbaf90b1d53f72f6cd8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5934 zcmd6q$x~a&9mn58yFd#dHiK!>-rJE>oNamE^w_9pqi%Dj38hG#9pZ@*2f3II} zuk~l2&#Tej^sRp_ANn=zAIQ}Hf>n4o+N5cJ&}KBIF@05A(-(AIYtqIw*7T*uY3{HcEPv-6Fls?vUPP_ek%v2c#ddhoq0#W6}s4 zBaN~cX`CfU$JqpFl06}vWK*OmmL|=xY0{_6c%%POXC}+C88*wFu{k!+7TCw^6ZRAK zDa*0X_I>1EWY5_WV=T`;XUpsbTVY?Ymu!`-v30hw@BdE!CVRE-W1JP}e{0{y+SoSx z>3$RY8KpmGJ7oFAzH`BocjvwAmk($nuwR*4_}67jiLh>YvOAl37F$``T9T7QYHiNE z`=^c>me&?^rY$thXn9-S&UC~P)TGF!$gaqt$f?Ms$gRku$g8MXQHvsmC6b9ucEYe6 z=6pIjER!M2IX#)3il;3%rO~W0HLPgJvPWVu!*WI^BI&e20Zdt-3PYA7VZ@(~$bV}wj8ObnW9igC=?QETOt#sP?lrNMB%DjMQB6iR}qk&T;K z%P}ny7d=(xq10?7)NCX}>8~7?JC|EuT+8QjmN%DM+hE(P;FetO)%N0Q)ni*(-?9R^ z+~WHB#@6E2%Eo#jm-|Y4hlTv@mBAMqYx%*=mBHA?()L<@eXB6Iw77L`i!Uy{%=1A` zL!Db>j9=f};SQ=H1gpRBHLd*Ok^fRlpg38a+?_lIe8J*WacXy})a)-lDL&bKQU_Jb z-&#x+Q@g2>0(El83T8!lJoBBSvf2^B23(!^+v|Q#E-*}!cSa#Eho0LtM*|`iYaC0t`NRX9Q zm}N7KIg;!gnUk@pIGH1fC@C#n(&=Y0(gc+ur9v*)4O)J7Go6`E^PA|U`w-DzAAug# zWR#%rJCgU-fSR(6BcWWLmf}QlVt1mXKn;>A^L;=)qE;BIMK%?!Jbq|@Po5vw&@w*_ zXuxusv^i}TEZ20z$fjpfmTNX{m`NH^7dCwCinghzNy~1SX43McB1Y8AMzV3sO@o$A zrsA|oS82%d&{qcD8PoF4Ml-qDXf76sTCVKe*gS2XwBc5vnVyuZW{w~540RZX#ON;k zmgKzwSA)<9YItkoQwp>d)5Y{|y1vD!eM7l|?Zr$nvzsY325b$zwd49mD1jVoH17Dp zzD}O+KiJGp1L3fosr=do-@!m+BV)8^oY^^i(=DeV(&M}7Q+gDKm~e50N

L*O}vumpAR?mRX8AvbQkcB?{{49TRX0A?7bylef^bM zYD-x`bM1^%vtX^uJ{8Y!;z2HwG98>W?gr7%bB%jIHV}T%m+hctka(FEkf`eeApob} z`&tWXTjhA1q`i6WO!E)2O0!G2V}3b_WsA`SaE3UL(TD8x~SqYy_SjzWA8G6cbr z;vE#EF3sFlrc5Sn3`ow&GKCcre+yOiZYHAWgIEOe*Tye9)XNO zqL3IQ4oN`9Arp`!YnVDl(H zgkbrEZ9E6-XOKmba*-t5#2E~E7#>6ZMnYv@P{LOrU%=qxYv6Ur24oZR3c^V&kNRzq z4mVrQt)0!4^<^&Bfdhrm0`cJ$pB1rB%LTj&$6q1n%@5Y|x9$h>chE!rHFC9Usm!&R{l>Vb;ZD0@8zupZW3&vn1k6Py1f1 z(h6>q+zt+Dp1_{H(gE(2<-5S$GJX&EgyddupNxMJd`j|ZaKGd;;Ip#)Ij{y9kcRW% z3z9E_FG&uAFH61xzAE_|___={2p*C=3?7ku13W4leiM94+HZsJ$QQi}z9;!U_<`h) zzz^lK9)Tb0G855}8>{A`A{V0^dOt35;#Sdtm6p~H0I9etxq2m0lj)i& z5e$_A?YPK7eDtCa!BFL7AV~cPIje=b5tlA1PbE8gN@Ssnpz}o4)zw?+^#`a5q#sp8 z6Duw|jF1-D?ux_aCkw=@b@!FJdMU_}V%tqQy{oCBL5rT(cR;$x>rDqoSlY!G_&-d` BmW%)Z diff --git a/__pycache__/util.cpython-311.pyc b/__pycache__/util.cpython-311.pyc deleted file mode 100644 index 8470d9c80df6f71e7927a46b3cf3c6b164ca3691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3668 zcmai1%WoUU8K312$>m$3TCzzKvN5(mEIQlNjvuCWJV0Tlsq%1wYSflv9q;X|aDxP#pv=bP8g z_xjE7%Rs)Bi!`8Ig%BWJs255drItjF1(!1c4}mEcVvt zkSzzuv`H30b~ecrWLJ~y1lipryFiwjWVa&9o+eoW+1n(06e|0gWUuW1glzfb0H9wE z0tVy|U{LM=49T5<9da13Q|8~cHWxPU!tb5sJL?<2vz>Pq5^EqXEG{l55;je2 zz#y84ufK1*f4jVqSY3~&goeckp->m$J^e2L7+S~+vLo-%n#TO0QU3zQyo9$}mdNj8 zAA+OuVxH>ss4=SEkH2j*LVSiZ@6w$*dC1+&s4V6kx+^a{?Ra`wcgT)fdsuUxttC^P z9O8=botKSoJrQ&POz4c;WM%WPeeT3(OO zJji90nZ5MPQZBWhRdzLXCY98tG?q*~RM^bEmd;G?9oW*2qHW`B)(5i#@Tz|SD3FRT zP*|$?Itok2L(%6sb7;mInmHlV8R1|`eMPA>QMq*a%jthlo0sOSOLHeg^gu6w=^rZI zDm|!#y35yIg@%pLaHYGyL@V9HCHnn|8;40m@)!4?C;N z%~yP(!rCcpgrw@(hXMu%50E*iJR>?eg5UO{3p+xqYamn6HIBpKgo3_^q;lD85^Ac( za`zN;(&FOW_1W3@SAy+)d|zR6F^4UxduiKU8>-?)A`yluX1l8M*a!&Npbh{O$T!se z*VQMh#Ye@oNqa2XW7Hqk4+B!T_j+jr`!#5JlPmQp)1Qq)17?r9m)lhp6}Jp_s2L)_l%$My;MQX?=tK{z z=%NBS4)>McF~cz{94oAS6AJ(1;BN=zD=(|I%EB3|w;Kh|ATWd&x25;jHWxQH-kW7nSQ`w0x-(?0n7|F7 z;znwk`sB2lyq8h7Q!K?Mp&jR_V*rr))hPb^pUO9^(D(~#1gA_oZP96?{Z02JRuuKM{<5jAACTG5Fv>W(kqTQBi@ya?p!IJbfj2VY||>p(zC z;}KntfNpFUMZjD*=X_7&#ADOYdl^Tdm%#D;m#zL;vwzO&2a{^Mu$>^Szoe89+ALhNW->K8K zeh;WsE3&JV4B^zpop3uqBDmwWdu4THee>1^&x6Atx;355L^$z94t<)UYIVVtdZ45p zMh-7-V&ev6|CK7G-sgvR%vp^gBmy2twsViAcQw`t4baJHbr$Njul5zZEZJWCMD^Na zJNXw>bTslzE&aOq2+lTV+I2`fU!VPdJg&|e$;4Z%kBHRKr1_XlKVY~4vmdT~6 zXDMEYt8P9|CGviDk6)hIJWP8BUUdrqoH{uEeA^tHwg#u+rsSOBU`o9}CDBUgB2dVM zk)tv5Le#ntEqb{5%Uz%DewH}u{ntm&KQeUOct_Fr2LtbWR zCnh1Fbr}BBVLk*u0$%#6VLpPjF$AtX9t)fb8Ac}8jd4~$_iYHup+wu$)Tun7#)u<)) z6`W0N?qKobPySq>l}5$eQR=n4{RQ_4^$Hy)qyaq+p%)mt4w6F{M6m`E6}sU{TL-@& dz%{o4E>QrsZ-Cb?44;q&3{U|)*bdxCKL93X@KXQ) diff --git a/freq.txt b/freq.txt deleted file mode 100644 index 6d3f457..0000000 --- a/freq.txt +++ /dev/null @@ -1,12 +0,0 @@ -Handheld Init -2.4312 GHZ (mid) -2.439256 (strong) -2.447 GHZ (strong) -2.4632 GHZ (strong) -2.471 GHZ (weak) - -Test Pts -2410000.000 -2430000.000 -2450000.000 -2470000.000 \ No newline at end of file diff --git a/src/common.py b/src/common.py index ee5b570..1845ffb 100644 --- a/src/common.py +++ b/src/common.py @@ -83,7 +83,7 @@ def reset(spi): version = read_register(spi, VERSION) print(f"CC2500 VERSION register: 0x{version:02X}") # if version != 0x2F: - # raise Exception("Expected Version was 0x0F!! Quitting") + # raise Exception("Expected Version was 0x2F!! Quitting") def test_read_write_reg(spi, dbg=False): diff --git a/src/receive.py b/src/receive.py index d8a3ba5..b18875f 100644 --- a/src/receive.py +++ b/src/receive.py @@ -1,3 +1,5 @@ +from datetime import datetime +from pathlib import Path from .util import sleep, get_addr, digital_read, GDO0_PIN, GDO2_PIN, debug, delay import time from .common import strobe, read_register @@ -12,9 +14,21 @@ def print_packet(spi, packet_length): for i in range(packet_length): print(f", byte: {0}: 0x{1}", i, read_register(spi, RXFIFO)) -#TODO -def save_packet(): - print() +# Save packet to a timestamped binary file +def save_packet(packet: list): + # Create directory to store packets if it doesn't exist + packet_dir = Path("saved_packets") + packet_dir.mkdir(parents=True, exist_ok=True) + + # Create timestamped filename + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + filename = packet_dir / f"packet_{timestamp}.bin" + + # Save packet as binary data + with open(filename, "wb") as f: + f.write(bytearray(packet)) + + print(f"Packet saved to {filename}") def get_rssi_from_pkt(packet): @@ -61,57 +75,13 @@ def rx_data_rf(spi): gdo2_state = digital_read(GDO2_PIN) delay(100) packet_length: int = read_register(spi, RXFIFO) - # print("Packet Length {0}".format(packet_length)) packet: list = [read_register(spi, RXFIFO) for _ in range(packet_length)] rssi_raw = get_rssi_from_pkt(packet) strength = get_signal_strength_rssi_raw(rssi_raw) print("Length: {0} bytes\t Signal: {1} dBm".format(packet_length, strength) ) - + save_packet(packet) # Make sure that the radio is in IDLE state before flushing the FIFO # (Unless RXOFF_MODE has been changed, the radio should be in IDLE state at this point) strobe(spi, SIDLE) # Flush RX FIFO strobe(spi, SFRX) - -# def burst_read(spi, addr, length): -# """Read multiple bytes""" -# READ_SINGLE = get_addr("READ_SINGLE") -# READ_BURST = get_addr("READ_BURST") -# return spi.xfer2([addr | READ_SINGLE | READ_BURST] + [0x00] * length) - - - -# def read_fifo(spi): -# # Burst read RX FIFO -# READ_BURST = get_addr("READ_BURST") -# RXFIFO = get_addr("RXFIFO") -# fifo = spi.xfer2([RXFIFO | READ_BURST] + [0x00]*64) # Max 64 bytes -# return fifo[1:] - - -# def receive_packet(spi): -# SFRX = get_addr("SFRX") -# RXBYTES = get_addr("RXBYTES") -# SRX = get_addr("SRX") - -# # Flush RX FIFO -# strobe(spi, SFRX) -# time.sleep(0.5) # 1 ms delay to allow flush -# # Go into RX mode -# strobe(spi, SRX) - -# # Wait for data (use GDO0 in real app) -# sleep(0.5) - -# # Check RXBYTES - -# timeout = time.time() + 2 # 2-second timeout -# while time.time() < timeout: -# rx_bytes = read_register(spi, RXBYTES) & 0x7F -# if rx_bytes > 0: -# data = read_fifo(spi) -# print(f"Received: {data}") -# return data -# time.sleep(0.01) - -# print("Timeout: no data received.") diff --git a/src/util.py b/src/util.py index f6852a1..bd5baa9 100644 --- a/src/util.py +++ b/src/util.py @@ -19,14 +19,7 @@ def print_gdo_state(GDO0_PIN=17, GDO2_PIN=27): sleep(0.1) def digital_read(GDO_PIN: int): - bit = GPIO.input(GDO_PIN) - # print("bit " + str(bit)) - if bit == 1: - return True - elif bit == 0: - return False - else: - raise Exception("Unexpected digital read GDO_PIN{GDO_PIN} {bit}") + return GPIO.input(GDO_PIN) def get_addr(name): addr = "" diff --git a/typings/spidev/__init__.pyi b/typings/spidev/__init__.pyi new file mode 100644 index 0000000..fbdbaae --- /dev/null +++ b/typings/spidev/__init__.pyi @@ -0,0 +1,6 @@ +class SpiDev: + def open(self, bus: int, device: int) -> None: ... + def close(self) -> None: ... + def xfer2(self, data: list[int]) -> list[int]: ... + max_speed_hz: int + mode: int \ No newline at end of file diff --git a/wiring.txt b/wiring.txt deleted file mode 100644 index 6bc9535..0000000 --- a/wiring.txt +++ /dev/null @@ -1,31 +0,0 @@ -CC2500 Pins to Raspberry Pi GPIO Pins -GND (CC2500) → Ground (Pin 6 on Raspberry Pi GPIO header) - -VCC (CC2500) → 3.3V Power (Pin 1 or Pin 17 on Raspberry Pi GPIO header) - -Ensure the CC2500 module operates at 3.3V. Connecting it to 5V may damage it. - -SPI Pins: -SI (CC2500) → MOSI (GPIO 10) (Pin 19 on Raspberry Pi GPIO header) - -SCK (CC2500) → SCLK (GPIO 11) (Pin 23 on Raspberry Pi GPIO header) - -CSN (CC2500) → CE0 (GPIO 8) (Pin 24 on Raspberry Pi GPIO header) - -This is the Chip Select line. - -SO (CC2500) → MISO (GPIO 9) (Pin 21 on Raspberry Pi GPIO header) - -Optional Pins: -GDO0 (CC2500) → Any GPIO Pin (e.g., GPIO 18) (Pin 12 on Raspberry Pi GPIO header) - -Use this for interrupt handling or data-ready signals if required. - -GDO2 (CC2500) → Any GPIO Pin (e.g., GPIO 25) (Pin 22 on Raspberry Pi GPIO header) - -Additional interrupt or data pin. - -Power Amplifier Pins (If Applicable): -PA_EN (CC2500) → Any GPIO Pin (Optional, depending on whether you control the amplifier externally or not). - -PA_EX (CC2500) → Not Connected (unless needed for a specific configuration) \ No newline at end of file