113 lines
3.1 KiB
Python
113 lines
3.1 KiB
Python
|
import unittest
|
||
|
from multiprocessing import Pipe
|
||
|
|
||
|
from multiprocessing import Process
|
||
|
from threading import Thread
|
||
|
|
||
|
from urh.dev.native.lib import rtlsdr
|
||
|
import time
|
||
|
|
||
|
from urh.util.Logger import logger
|
||
|
|
||
|
|
||
|
def callback_recv(buffer):
|
||
|
try:
|
||
|
print(len(buffer))
|
||
|
except BrokenPipeError:
|
||
|
pass
|
||
|
return 0
|
||
|
|
||
|
|
||
|
def receive_async(callback, connection):
|
||
|
rtlsdr.open(0)
|
||
|
rtlsdr.reset_buffer()
|
||
|
rtlsdr.read_async(callback, connection)
|
||
|
connection.close()
|
||
|
|
||
|
def receive_sync(connection):
|
||
|
rtlsdr.open(0)
|
||
|
rtlsdr.reset_buffer()
|
||
|
exit_requested = False
|
||
|
|
||
|
while not exit_requested:
|
||
|
while connection.poll():
|
||
|
result = process_command(connection.recv())
|
||
|
if result == "stop":
|
||
|
exit_requested = True
|
||
|
break
|
||
|
|
||
|
if not exit_requested:
|
||
|
connection.send_bytes(rtlsdr.read_sync())
|
||
|
|
||
|
connection.close()
|
||
|
|
||
|
def process_command(command):
|
||
|
if command == "stop":
|
||
|
return "stop"
|
||
|
|
||
|
tag, value = command.split(":")
|
||
|
if tag == "center_freq":
|
||
|
logger.info("[RTLSDR] setting center freq to {}".format(int(value)))
|
||
|
rtlsdr.set_center_freq(int(value))
|
||
|
elif tag == "tuner_gain":
|
||
|
logger.info("[RTLSDR] setting tuner_gain to {}".format(int(value)))
|
||
|
rtlsdr.set_tuner_gain(int(value))
|
||
|
elif tag == "sample_rate":
|
||
|
logger.info("[RTLSDR] setting sample rate to {}".format(int(value)))
|
||
|
rtlsdr.set_sample_rate(int(value))
|
||
|
|
||
|
def read_connection(connection):
|
||
|
while True:
|
||
|
try:
|
||
|
received_bytes = connection.recv_bytes()
|
||
|
print(received_bytes[0:100])
|
||
|
except EOFError:
|
||
|
break
|
||
|
|
||
|
def f(child_conn):
|
||
|
ctrl_command = b""
|
||
|
while ctrl_command != b"stop":
|
||
|
child_conn.send_bytes(bytearray([1, 2, 3, 4, 5]))
|
||
|
time.sleep(0.1)
|
||
|
if child_conn.poll():
|
||
|
ctrl_command = child_conn.recv_bytes()
|
||
|
print("Got from server", ctrl_command)
|
||
|
|
||
|
print("Stopping....")
|
||
|
child_conn.send("goodbye")
|
||
|
child_conn.close()
|
||
|
|
||
|
|
||
|
class TestPipe(unittest.TestCase):
|
||
|
def test_multiprocessing_pipe(self):
|
||
|
parent_conn, child_conn = Pipe()
|
||
|
p = Process(target=f, args=(child_conn,))
|
||
|
p.start()
|
||
|
for _ in range(5):
|
||
|
while parent_conn.poll():
|
||
|
print("Got from client", parent_conn.recv_bytes()) # prints "[42, None, 'hello']"
|
||
|
time.sleep(1)
|
||
|
parent_conn.send_bytes(b"stop")
|
||
|
p.join()
|
||
|
|
||
|
|
||
|
def test_rtl_sdr_with_pipe(self):
|
||
|
parent_conn, child_conn = Pipe()
|
||
|
p = Process(target=receive_sync, args=(child_conn, ))
|
||
|
t = Thread(target=read_connection, args=(parent_conn, ))
|
||
|
t.daemon = True
|
||
|
p.daemon = True
|
||
|
t.start()
|
||
|
p.start()
|
||
|
time.sleep(2)
|
||
|
print("Sending set freq command")
|
||
|
parent_conn.send("center_freq:{}".format(int(433.92e6)))
|
||
|
time.sleep(1)
|
||
|
parent_conn.send("tuner_gain:{}".format(int(20)))
|
||
|
time.sleep(1)
|
||
|
parent_conn.send("sample_rate:{}".format(int(2e6)))
|
||
|
print("Sending stop command")
|
||
|
parent_conn.send("stop")
|
||
|
p.join()
|
||
|
time.sleep(2)
|