python 2/3 agnosticism http_server.py
This commit is contained in:
parent
5e5566f0f3
commit
1da0714da5
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
# Copyright 2017, 2018 Max H. Parke KA1RBI
|
# Copyright 2017, 2018, 2019, 2020 Max H. Parke KA1RBI
|
||||||
#
|
#
|
||||||
# This file is part of OP25
|
# This file is part of OP25
|
||||||
#
|
#
|
||||||
|
@ -49,6 +49,13 @@ TSV_DIR = './'
|
||||||
fake http and ajax server module
|
fake http and ajax server module
|
||||||
TODO: make less fake
|
TODO: make less fake
|
||||||
"""
|
"""
|
||||||
|
def ensure_str(s): # for python 2/3
|
||||||
|
if isinstance(s[0], str):
|
||||||
|
return s
|
||||||
|
ns = ''
|
||||||
|
for i in range(len(s)):
|
||||||
|
ns += chr(s[i])
|
||||||
|
return ns
|
||||||
|
|
||||||
def static_file(environ, start_response):
|
def static_file(environ, start_response):
|
||||||
content_types = { 'png': 'image/png', 'jpeg': 'image/jpeg', 'jpg': 'image/jpeg', 'gif': 'image/gif', 'css': 'text/css', 'js': 'application/javascript', 'html': 'text/html'}
|
content_types = { 'png': 'image/png', 'jpeg': 'image/jpeg', 'jpg': 'image/jpeg', 'gif': 'image/gif', 'css': 'text/css', 'js': 'application/javascript', 'html': 'text/html'}
|
||||||
|
@ -265,7 +272,7 @@ class Backend(threading.Thread):
|
||||||
|
|
||||||
self.zmq_sub = self.zmq_context.socket(zmq.SUB)
|
self.zmq_sub = self.zmq_context.socket(zmq.SUB)
|
||||||
self.zmq_sub.connect('tcp://localhost:%d' % self.zmq_port)
|
self.zmq_sub.connect('tcp://localhost:%d' % self.zmq_port)
|
||||||
self.zmq_sub.setsockopt(zmq.SUBSCRIBE, '')
|
self.zmq_sub.setsockopt_string(zmq.SUBSCRIBE, '')
|
||||||
|
|
||||||
self.zmq_pub = self.zmq_context.socket(zmq.PUB)
|
self.zmq_pub = self.zmq_context.socket(zmq.PUB)
|
||||||
self.zmq_pub.sndhwm = 5
|
self.zmq_pub.sndhwm = 5
|
||||||
|
@ -286,7 +293,8 @@ class Backend(threading.Thread):
|
||||||
t = msg.type()
|
t = msg.type()
|
||||||
s = msg.to_string()
|
s = msg.to_string()
|
||||||
a = msg.arg1()
|
a = msg.arg1()
|
||||||
self.zmq_pub.send(json.dumps({'command': s, 'data': a, 'msgtype': t}))
|
s = ensure_str(s)
|
||||||
|
self.zmq_pub.send_string(json.dumps({'command': s, 'data': a, 'msgtype': t}))
|
||||||
|
|
||||||
def check_subproc(self): # return True if subprocess is active
|
def check_subproc(self): # return True if subprocess is active
|
||||||
if not self.subproc:
|
if not self.subproc:
|
||||||
|
@ -301,6 +309,9 @@ class Backend(threading.Thread):
|
||||||
|
|
||||||
def process_msg(self, msg):
|
def process_msg(self, msg):
|
||||||
def make_command(options, config_file):
|
def make_command(options, config_file):
|
||||||
|
py_exe = 'python'
|
||||||
|
if sys.version[0] == '3':
|
||||||
|
py_exe = 'python3'
|
||||||
trunked_ct = [True for x in options._js_config['channels'] if x['trunked']]
|
trunked_ct = [True for x in options._js_config['channels'] if x['trunked']]
|
||||||
total_ct = [True for x in options._js_config['channels']]
|
total_ct = [True for x in options._js_config['channels']]
|
||||||
if trunked_ct and len(trunked_ct) != len(total_ct):
|
if trunked_ct and len(trunked_ct) != len(total_ct):
|
||||||
|
@ -308,15 +319,57 @@ class Backend(threading.Thread):
|
||||||
return None
|
return None
|
||||||
if not trunked_ct:
|
if not trunked_ct:
|
||||||
self.backend = '%s/%s' % (os.getcwd(), 'multi_rx.py')
|
self.backend = '%s/%s' % (os.getcwd(), 'multi_rx.py')
|
||||||
opts = [self.backend]
|
opts = [py_exe, self.backend]
|
||||||
filename = '%s%s.json' % (CFG_DIR, config_file)
|
filename = '%s%s.json' % (CFG_DIR, config_file)
|
||||||
opts.append('--config-file')
|
opts.append('--config-file')
|
||||||
opts.append(filename)
|
opts.append(filename)
|
||||||
return opts
|
return opts
|
||||||
|
|
||||||
types = {'costas-alpha': 'float', 'trunk-conf-file': 'str', 'demod-type': 'str', 'logfile-workers': 'int', 'decim-amt': 'int', 'wireshark-host': 'str', 'gain-mu': 'float', 'phase2-tdma': 'bool', 'seek': 'int', 'ifile': 'str', 'pause': 'bool', 'antenna': 'str', 'calibration': 'float', 'fine-tune': 'float', 'raw-symbols': 'str', 'audio-output': 'str', 'vocoder': 'bool', 'input': 'str', 'wireshark': 'bool', 'gains': 'str', 'args': 'str', 'sample-rate': 'int', 'terminal-type': 'str', 'gain': 'float', 'excess-bw': 'float', 'offset': 'float', 'audio-input': 'str', 'audio': 'bool', 'plot-mode': 'str', 'audio-if': 'bool', 'tone-detect': 'bool', 'frequency': 'int', 'freq-corr': 'float', 'hamlib-model': 'int', 'udp-player': 'bool', 'verbosity': 'int'}
|
# TODO: this probably should be external and/or configurable
|
||||||
|
# these options must match up one for one with the rx.py cli opts
|
||||||
|
types = {'costas-alpha': 'float',
|
||||||
|
'trunk-conf-file': 'str',
|
||||||
|
'demod-type': 'str',
|
||||||
|
'logfile-workers': 'int',
|
||||||
|
'decim-amt': 'int',
|
||||||
|
'wireshark-host': 'str',
|
||||||
|
'gain-mu': 'float',
|
||||||
|
'phase2-tdma': 'bool',
|
||||||
|
'seek': 'int',
|
||||||
|
'ifile': 'str',
|
||||||
|
'pause': 'bool',
|
||||||
|
'antenna': 'str',
|
||||||
|
'calibration': 'float',
|
||||||
|
'fine-tune': 'float',
|
||||||
|
'raw-symbols': 'str',
|
||||||
|
'audio-output': 'str',
|
||||||
|
'vocoder': 'bool',
|
||||||
|
'input': 'str',
|
||||||
|
'wireshark': 'bool',
|
||||||
|
'gains': 'str',
|
||||||
|
'args': 'str',
|
||||||
|
'sample-rate': 'int',
|
||||||
|
'terminal-type': 'str',
|
||||||
|
'gain': 'float',
|
||||||
|
'excess-bw': 'float',
|
||||||
|
'offset': 'float',
|
||||||
|
'audio-input': 'str',
|
||||||
|
'audio': 'bool',
|
||||||
|
'plot-mode': 'str',
|
||||||
|
'audio-if': 'bool',
|
||||||
|
'tone-detect': 'bool',
|
||||||
|
'frequency': 'int',
|
||||||
|
'freq-corr': 'float',
|
||||||
|
'hamlib-model': 'int',
|
||||||
|
'udp-player': 'bool',
|
||||||
|
'verbosity': 'int',
|
||||||
|
'audio-gain': 'float',
|
||||||
|
'freq-error-tracking': 'bool',
|
||||||
|
'nocrypt': 'bool',
|
||||||
|
'wireshark-port': 'int'
|
||||||
|
}
|
||||||
self.backend = '%s/%s' % (os.getcwd(), 'rx.py')
|
self.backend = '%s/%s' % (os.getcwd(), 'rx.py')
|
||||||
opts = [self.backend]
|
opts = [py_exe, self.backend]
|
||||||
for k in [ x for x in dir(options) if not x.startswith('_') ]:
|
for k in [ x for x in dir(options) if not x.startswith('_') ]:
|
||||||
kw = k.replace('_', '-')
|
kw = k.replace('_', '-')
|
||||||
val = getattr(options, k)
|
val = getattr(options, k)
|
||||||
|
@ -359,6 +412,7 @@ class Backend(threading.Thread):
|
||||||
options.verbosity = self.verbosity
|
options.verbosity = self.verbosity
|
||||||
options.terminal_type = 'zmq:tcp:%d' % (self.zmq_port)
|
options.terminal_type = 'zmq:tcp:%d' % (self.zmq_port)
|
||||||
cmd = make_command(options, msg['data'])
|
cmd = make_command(options, msg['data'])
|
||||||
|
sys.stderr.write('executing %s\n' % (' '.join(cmd)))
|
||||||
if cmd:
|
if cmd:
|
||||||
self.subproc = subprocess.Popen(cmd)
|
self.subproc = subprocess.Popen(cmd)
|
||||||
elif msg['command'] == 'rx-stop':
|
elif msg['command'] == 'rx-stop':
|
||||||
|
@ -384,6 +438,7 @@ class Backend(threading.Thread):
|
||||||
js = self.zmq_sub.recv()
|
js = self.zmq_sub.recv()
|
||||||
if not self.keep_running:
|
if not self.keep_running:
|
||||||
break
|
break
|
||||||
|
js = ensure_str(js)
|
||||||
msg = gr.message().make_from_string(js, -4, 0, 0)
|
msg = gr.message().make_from_string(js, -4, 0, 0)
|
||||||
if not self.output_q.full_p():
|
if not self.output_q.full_p():
|
||||||
self.output_q.insert_tail(msg)
|
self.output_q.insert_tail(msg)
|
||||||
|
|
Loading…
Reference in New Issue