Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. import serial
  4. import socket
  5. import time
  6. import subprocess
  7.  
  8.  
  9. """
  10. DC0;SQ0000;FA00137100000;MD4;FA00137102450;FA00137102440;FA00137102436;...
  11. Sent over serial by WxToImg for doppler tuning if below is set;
  12.  
  13. Options > Recording Options >
  14. receiver type = Kenwood
  15. receiver port = /dev/ttyAMA0
  16. receiver baud rate = 9600
  17.  
  18. Short Raspberry Pi UART TXD/RXD pins together
  19. """
  20.  
  21.  
  22. IN_DEV = "/dev/ttyAMA0"
  23. BAUD = 9600
  24. END_MSG = ";"
  25. RTL_RATE = "60k"
  26.  
  27.  
  28. class rtl_fm_remote(object):
  29. """
  30. For remote control of rtl_fm command line program
  31. """
  32. def __init__(self,
  33. host="localhost",
  34. port=6020):
  35. self._host = host
  36. self._port = port
  37. self._s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  38. self._s.connect((self._host, self._port))
  39.  
  40. def set_freq(self, freq):
  41. self.send_cmd(0, freq)
  42.  
  43. def set_mode(self, mode):
  44. self.send_cmd(1, mode)
  45.  
  46. def set_squelch(self, squelch):
  47. self.send_cmd(2, squelch)
  48.  
  49. def set_gain(self, gain):
  50. self.send_cmd(3, gain)
  51.  
  52. def send_cmd(self, cmd, param):
  53. cmd_bytes = (cmd).to_bytes(1, "little")
  54. param_bytes = (param).to_bytes(32, "little")
  55. self._s.send(cmd_bytes + param_bytes)
  56.  
  57. def __del__(self):
  58. self._s.close()
  59.  
  60.  
  61. rtl_proc = None
  62. play_proc = None
  63. rtl_remote = None
  64. last_rx_time = 0
  65.  
  66. ser = serial.Serial(port=IN_DEV, baudrate=BAUD)
  67. buffer = ""
  68. rx_freq = 0
  69.  
  70. while True:
  71. time.sleep(.1)
  72. buffer += ser.read(ser.inWaiting()).decode("UTF8")
  73. if END_MSG in buffer:
  74. lines = buffer.split(END_MSG)
  75. buffer = ""
  76. for line in lines:
  77. if len(line) > 0 and line.startswith("FA"):
  78. str_freq = line[2:]
  79. if str_freq.isnumeric():
  80. last_rx_time = time.time()
  81. rx_freq = int(str_freq)
  82.  
  83. if rtl_proc is None:
  84. rtl_cmd = ["rtl_fm", "-M", "fm", "-f", str(rx_freq), "-s", RTL_RATE, "-E", "deemp", "-F", "9"]
  85. play_cmd = ["play", "-r", RTL_RATE, "-t", "raw", "-e", "s", "-b", "16", "-c", "1", "-V1", "-"]
  86. rtl_proc = subprocess.Popen(rtl_cmd, stdout=subprocess.PIPE)
  87. time.sleep(1)
  88. play_proc = subprocess.Popen(play_cmd, stdin=rtl_proc.stdout)
  89. time.sleep(1)
  90. rtl_remote = rtl_fm_remote()
  91. else:
  92. rtl_remote.set_freq(rx_freq)
  93.  
  94. if rtl_proc is not None:
  95. if time.time() - last_rx_time > 60:
  96. del(rtl_remote)
  97. rtl_remote = None
  98. play_proc.kill()
  99. play_proc.wait()
  100. play_proc = None
  101. rtl_proc.kill()
  102. rtl_proc.wait()
  103. rtl_proc = None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement