diff --git a/htdocs/index.wrx b/htdocs/index.wrx index 5b5f1dd..6609d96 100644 --- a/htdocs/index.wrx +++ b/htdocs/index.wrx @@ -108,8 +108,13 @@
+
0 dB
+ +
+
+
+
-
diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 760241e..00873ab 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -36,7 +36,7 @@ input input[type=range] { -webkit-appearance: none; - margin: 10px 0; + margin: 0 0; } input[type=range]:focus { @@ -745,3 +745,36 @@ img.openwebrx-mirror-img { padding-top: 5px; } + +#openwebrx-smeter-outer +{ + border-color: #888; + border-style: solid; + border-width: 0px; + width: 255px; + height: 7px; + background-color: #373737; + border-radius: 3px; + position: relative; +} +#openwebrx-smeter-bar +{ + transition: all 0.2s linear; + width: 0px; + height: 7px; + background: linear-gradient(to top, #ff5939 , #961700); + position: absolute; + margin: 0; padding: 0; left: 0; + border-radius: 3px; +} + +#openwebrx-smeter-db +{ + color: #aaa; + display: inline-block; + font-size: 10pt; + float: right; + margin-right: 5px; + margin-top: 29px; + font-family: 'expletus-sans-medium'; +} diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 2d3f960..cebeb91 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -178,6 +178,36 @@ function waterfallColorsAuto() updateWaterfallColors(0); } +function setSmeterRelativeValue(value) +{ + if(value<0) value=0; + if(value>1.0) value=1.0; + var bar=e("openwebrx-smeter-bar"); + var outer=e("openwebrx-smeter-outer"); + bar.style.width=(outer.offsetWidth*value).toString()+"px"; + bgRed="linear-gradient(to top, #ff5939 , #961700)"; + bgGreen="linear-gradient(to top, #22ff2f , #008908)"; + bgYellow="linear-gradient(to top, #fff720 , #a49f00)"; + bar.style.background=(value>0.9)?bgRed:((value>0.7)?bgYellow:bgGreen); + //bar.style.backgroundColor=(value>0.9)?"#ff5939":((value>0.7)?"#fff720":"#22ff2f"); +} + +function getLogSmeterValue(value) +{ + return 10*Math.log10(value); +} + +function setSmeterAbsoluteValue(value) //the value that comes from `csdr squelch_and_smeter_cc` +{ + var logValue=getLogSmeterValue(value); + var lowLevel=waterfall_min_level-20; + var highLevel=waterfall_max_level+20; + var percent=(logValue-lowLevel)/(highLevel-lowLevel); + setSmeterRelativeValue(percent); + e("openwebrx-smeter-db").innerHTML=logValue.toFixed(1)+" dB"; +} + + // ======================================================== // ================= ANIMATION ROUTINES ================= // ======================================================== @@ -1145,6 +1175,10 @@ function on_ws_recv(evt) case "max_clients": max_clients_num=parseInt(param[1]); break; + case "s": + smeter_level=parseFloat(param[1]); + setSmeterAbsoluteValue(smeter_level); + break; } } /*} diff --git a/openwebrx.py b/openwebrx.py index d153ff8..dea3a9b 100755 --- a/openwebrx.py +++ b/openwebrx.py @@ -2,7 +2,7 @@ print "" # python2.7 is required to run OpenWebRX instead of python3. Please run me by: python2 openwebrx.py """ - This file is part of OpenWebRX, + This file is part of OpenWebRX, an open-source SDR receiver software with a web UI. Copyright (c) 2013-2015 by Andras Retzler @@ -31,7 +31,7 @@ import thread import time import datetime import subprocess -import os +import os from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from SocketServer import ThreadingMixIn import fcntl @@ -72,7 +72,7 @@ def import_all_plugins(directory): importlib.import_module(importname) class MultiThreadHTTPServer(ThreadingMixIn, HTTPServer): - pass + pass def handle_signal(signal, frame): global spectrum_dsp @@ -94,19 +94,19 @@ def main(): print print "OpenWebRX - Open Source SDR Web App for Everyone! | for license see LICENSE file in the package" print "_________________________________________________________________________________________________" - print + print print "Author contact info: Andras Retzler, HA7ILM " - print + print no_arguments=len(sys.argv)==1 if no_arguments: print "[openwebrx-main] Configuration script not specified. I will use: \"config_webrx.py\"" cfg=__import__("config_webrx" if no_arguments else sys.argv[1]) - for option in ("access_log","csdr_dynamic_bufsize","csdr_print_bufsizes","csdr_through"): + for option in ("access_log","csdr_dynamic_bufsize","csdr_print_bufsizes","csdr_through"): if not option in dir(cfg): setattr(cfg, option, False) #initialize optional config parameters #Open log files logs = type("logs_class", (object,), {"access_log":open(cfg.access_log if cfg.access_log else "/dev/null","a"), "error_log":""})() - + #Set signal handler signal.signal(signal.SIGINT, handle_signal) #http://stackoverflow.com/questions/1112343/how-do-i-capture-sigint-in-python @@ -129,7 +129,7 @@ def main(): #Start rtl thread if os.system("ncat --version > /dev/null") == 32512: #check for ncat print "[openwebrx-main] Error: ncat not detected, please install it! The ncat tool is a netcat alternative, used for distributing the I/Q data stream. It is usually available in the nmap package (sudo apt-get install nmap). For more explanation, look into the README.md" - return + return if cfg.start_rtl_thread: cfg.start_rtl_command += "| ncat -4l %d -k --send-only --allow 127.0.0.1" % cfg.iq_server_port rtl_thread=threading.Thread(target = lambda:subprocess.Popen(cfg.start_rtl_command, shell=True), args=()) @@ -144,7 +144,7 @@ def main(): continue testsock.close() break - print "[openwebrx-main] I/Q server started." + print "[openwebrx-main] I/Q server started." #Initialize clients clients=[] @@ -157,7 +157,7 @@ def main(): mutex_test_thread.start() mutex_watchdog_thread=threading.Thread(target = mutex_watchdog_thread_function, args = ()) mutex_watchdog_thread.start() - + #Start spectrum thread print "[openwebrx-main] Starting spectrum thread." @@ -169,16 +169,16 @@ def main(): get_cpu_usage() bcastmsg_thread=threading.Thread(target = bcastmsg_thread_function, args = ()) bcastmsg_thread.start() - + #threading.Thread(target = measure_thread_function, args = ()).start() #Start sdr.hu update thread - if sdrhu and cfg.sdrhu_key and cfg.sdrhu_public_listing: + if sdrhu and cfg.sdrhu_key and cfg.sdrhu_public_listing: print "[openwebrx-main] Starting sdr.hu update thread..." avatar_ctime=str(os.path.getctime("htdocs/gfx/openwebrx-avatar.png")) sdrhu_thread=threading.Thread(target = sdrhu.run, args = ()) sdrhu_thread.start() - + #Start HTTP thread httpd = MultiThreadHTTPServer(('', cfg.web_port), WebRXHandler) print('[openwebrx-main] Starting HTTP server.') @@ -190,7 +190,7 @@ def main(): measure_value=0 def measure_thread_function(): global measure_value - while True: + while True: print "[openwebrx-measure] value is",measure_value measure_value=0 time.sleep(1) @@ -232,17 +232,17 @@ def mutex_watchdog_thread_function(): global clients_mutex_locker global clients_mutex while True: - if lock_try_time != 0 and time.time()-lock_try_time > 3.0: + if lock_try_time != 0 and time.time()-lock_try_time > 3.0: #if 3 seconds pass without unlock - print "[openwebrx-mutex-watchdog] Mutex unlock timeout. Locker: \""+str(clients_mutex_locker)+"\" Now unlocking..." + print "[openwebrx-mutex-watchdog] Mutex unlock timeout. Locker: \""+str(clients_mutex_locker)+"\" Now unlocking..." clients_mutex.release() - time.sleep(0.5) + time.sleep(0.5) def spectrum_watchdog_thread_function(): global spectrum_thread_watchdog_last_tick, receiver_failed while True: time.sleep(60) - if spectrum_thread_watchdog_last_tick and time.time()-spectrum_thread_watchdog_last_tick > 60.0: + if spectrum_thread_watchdog_last_tick and time.time()-spectrum_thread_watchdog_last_tick > 60.0: print "[openwebrx-spectrum-watchdog] Spectrum timeout. Seems like no I/Q data is coming from the receiver.\nIf you're using RTL-SDR, the receiver hardware may randomly fail under some circumstances:\n1) high temperature,\n2) insufficient current available from the USB port." print "[openwebrx-spectrum-watchdog] Deactivating receiver." receiver_failed="spectrum" @@ -250,7 +250,7 @@ def spectrum_watchdog_thread_function(): def check_server(): global spectrum_dsp, server_fail, rtl_thread - if server_fail: return server_fail + if server_fail: return server_fail #print spectrum_dsp.process.poll() if spectrum_dsp and spectrum_dsp.process.poll()!=None: server_fail = "spectrum_thread dsp subprocess failed" #if rtl_thread and not rtl_thread.is_alive(): server_fail = "rtl_thread failed" @@ -260,7 +260,7 @@ def check_server(): def apply_csdr_cfg_to_dsp(dsp): dsp.csdr_dynamic_bufsize = cfg.csdr_dynamic_bufsize dsp.csdr_print_bufsizes = cfg.csdr_print_bufsizes - dsp.csdr_through = cfg.csdr_through + dsp.csdr_through = cfg.csdr_through def spectrum_thread_function(): global clients, spectrum_dsp, spectrum_thread_watchdog_last_tick @@ -276,16 +276,16 @@ def spectrum_thread_function(): sleep_sec=0.87/cfg.fft_fps print "[openwebrx-spectrum] Spectrum thread initialized successfully." dsp.start() - if cfg.csdr_dynamic_bufsize: + if cfg.csdr_dynamic_bufsize: dsp.read(8) #dummy read to skip bufsize & preamble print "[openwebrx-spectrum] Note: CSDR_DYNAMIC_BUFSIZE_ON = 1" - print "[openwebrx-spectrum] Spectrum thread started." + print "[openwebrx-spectrum] Spectrum thread started." bytes_to_read=int(dsp.get_fft_bytes_to_read()) spectrum_thread_counter=0 while True: data=dsp.read(bytes_to_read) #print "gotcha",len(data),"bytes of spectrum data via spectrum_thread_function()" - if spectrum_thread_counter >= cfg.fft_fps: + if spectrum_thread_counter >= cfg.fft_fps: spectrum_thread_counter=0 spectrum_thread_watchdog_last_tick = time.time() #once every second else: spectrum_thread_counter+=1 @@ -301,7 +301,7 @@ def spectrum_thread_function(): else: clients[i].spectrum_queue.put([data]) # add new string by "reference" to all clients cmr() - + def get_client_by_id(client_id, use_mutex=True): global clients output=-1 @@ -337,7 +337,7 @@ def cleanup_clients(end_all=False): def generate_client_id(ip): #add a client global clients - new_client=namedtuple("ClientStruct", "id gen_time ws_started sprectum_queue ip closed bcastmsg dsp") + new_client=namedtuple("ClientStruct", "id gen_time ws_started sprectum_queue ip closed bcastmsg dsp") new_client.id=md5.md5(str(random.random())).hexdigest() new_client.gen_time=time.time() new_client.ws_started=False # to check whether client has ever tried to open the websocket @@ -371,7 +371,7 @@ def close_client(i, use_mutex=True): # http://www.codeproject.com/Articles/462525/Simple-HTTP-Server-and-Client-in-Python # some ideas are used from the artice above -class WebRXHandler(BaseHTTPRequestHandler): +class WebRXHandler(BaseHTTPRequestHandler): def proc_read_thread(): pass @@ -386,11 +386,11 @@ class WebRXHandler(BaseHTTPRequestHandler): def do_GET(self): self.connection.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) global dsp_plugin, clients_mutex, clients, avatar_ctime, sw_version, receiver_failed - rootdir = 'htdocs' + rootdir = 'htdocs' self.path=self.path.replace("..","") path_temp_parts=self.path.split("?") self.path=path_temp_parts[0] - request_param=path_temp_parts[1] if(len(path_temp_parts)>1) else "" + request_param=path_temp_parts[1] if(len(path_temp_parts)>1) else "" access_log("GET "+self.path+" from "+self.client_address[0]) try: if self.path=="/": @@ -402,9 +402,9 @@ class WebRXHandler(BaseHTTPRequestHandler): try: # ========= WebSocket handshake ========= ws_success=True - try: + try: rxws.handshake(self) - cma("do_GET /ws/") + cma("do_GET /ws/") client_i=get_client_by_id(self.path[4:], False) myclient=clients[client_i] except rxws.WebSocketException: ws_success=False @@ -439,11 +439,11 @@ class WebRXHandler(BaseHTTPRequestHandler): dsp.nc_port=cfg.iq_server_port apply_csdr_cfg_to_dsp(dsp) myclient.dsp=dsp - + access_log("Started streaming to client: "+self.client_address[0]+"#"+myclient.id+" (users now: "+str(len(clients))+")") while True: - if myclient.closed[0]: + if myclient.closed[0]: print "[openwebrx-httpd:ws] client closed by other thread" break @@ -456,10 +456,20 @@ class WebRXHandler(BaseHTTPRequestHandler): while not myclient.spectrum_queue.empty(): spectrum_data=myclient.spectrum_queue.get() #spectrum_data_mid=len(spectrum_data[0])/2 - #rxws.send(self, spectrum_data[0][spectrum_data_mid:]+spectrum_data[0][:spectrum_data_mid], "FFT ") + #rxws.send(self, spectrum_data[0][spectrum_data_mid:]+spectrum_data[0][:spectrum_data_mid], "FFT ") # (it seems GNU Radio exchanges the first and second part of the FFT output, we correct it) rxws.send(self, spectrum_data[0],"FFT ") + # ========= send smeter_level ========= + smeter_level=None + while True: + try: + smeter_level=dsp.get_smeter_level() + if smeter_level == None: break + except: + break + if smeter_level!=None: rxws.send(self, "MSG s={0}".format(smeter_level)) + # ========= send bcastmsg ========= if myclient.bcastmsg!="": rxws.send(self,myclient.bcastmsg) @@ -486,17 +496,19 @@ class WebRXHandler(BaseHTTPRequestHandler): new_bpf[1]=int(param_value) elif param_name == "offset_freq" and -cfg.samp_rate/2 <= float(param_value) <= cfg.samp_rate/2: dsp.set_offset_freq(int(param_value)) + elif param_name == "squelch_level" and float(param_value) >= 0: + dsp.set_squelch_level(float(param_value)) elif param_name=="mod": if (dsp.get_demodulator()!=param_value): if dsp_initialized: dsp.stop() dsp.set_demodulator(param_value) if dsp_initialized: dsp.start() elif param_name == "output_rate": - if not dsp_initialized: + if not dsp_initialized: dsp.set_output_rate(int(param_value)) dsp.set_samp_rate(cfg.samp_rate) elif param_name=="action" and param_value=="start": - if not dsp_initialized: + if not dsp_initialized: dsp.start() dsp_initialized=True else: @@ -508,13 +520,13 @@ class WebRXHandler(BaseHTTPRequestHandler): exc_type, exc_value, exc_traceback = sys.exc_info() if exc_value[0]==32: #"broken pipe", client disconnected pass - elif exc_value[0]==11: #"resource unavailable" on recv, client disconnected + elif exc_value[0]==11: #"resource unavailable" on recv, client disconnected pass - else: + else: print "[openwebrx-httpd] error in /ws/ handler: ",exc_type,exc_value traceback.print_tb(exc_traceback) - #stop dsp for the disconnected client + #stop dsp for the disconnected client try: dsp.stop() del dsp @@ -537,7 +549,7 @@ class WebRXHandler(BaseHTTPRequestHandler): #self.send_header('Content-type','text/plain') getbands=lambda: str(int(cfg.shown_center_freq-cfg.samp_rate/2))+"-"+str(int(cfg.shown_center_freq+cfg.samp_rate/2)) self.wfile.write("status="+("inactive" if receiver_failed else "active")+"\nname="+cfg.receiver_name+"\nsdr_hw="+cfg.receiver_device+"\nop_email="+cfg.receiver_admin+"\nbands="+getbands()+"\nusers="+str(len(clients))+"\nusers_max="+str(cfg.max_clients)+"\navatar_ctime="+avatar_ctime+"\ngps="+str(cfg.receiver_gps)+"\nasl="+str(cfg.receiver_asl)+"\nloc="+cfg.receiver_location+"\nsw_version="+sw_version+"\nantenna="+cfg.receiver_ant+"\n") - print "[openwebrx-httpd] GET /status/ from",self.client_address[0] + print "[openwebrx-httpd] GET /status/ from",self.client_address[0] else: f=open(rootdir+self.path) data=f.read() @@ -560,7 +572,7 @@ class WebRXHandler(BaseHTTPRequestHandler): self.send_header('Content-type','text/javascript') elif(extension=="css"): self.send_header('Content-type','text/css') - self.end_headers() + self.end_headers() if extension == "wrx": replace_dictionary=( ("%[RX_PHOTO_DESC]",cfg.photo_desc), @@ -594,7 +606,7 @@ class WebRXHandler(BaseHTTPRequestHandler): exc_type, exc_value, exc_traceback = sys.exc_info() print "[openwebrx-httpd] error (@outside):", exc_type, exc_value traceback.print_tb(exc_traceback) - + class ClientNotFoundException(Exception): pass @@ -622,4 +634,3 @@ def get_cpu_usage(): if __name__=="__main__": main() - diff --git a/plugins/dsp/csdr/plugin.py b/plugins/dsp/csdr/plugin.py index c0a3997..08158c8 100644 --- a/plugins/dsp/csdr/plugin.py +++ b/plugins/dsp/csdr/plugin.py @@ -1,7 +1,7 @@ """ OpenWebRX csdr plugin: do the signal processing with csdr - This file is part of OpenWebRX, + This file is part of OpenWebRX, an open-source SDR receiver software with a web UI. Copyright (c) 2013-2015 by Andras Retzler @@ -25,6 +25,7 @@ import time import os import code import signal +import fcntl class dsp_plugin: @@ -49,20 +50,21 @@ class dsp_plugin: self.csdr_dynamic_bufsize = False self.csdr_print_bufsizes = False self.csdr_through = False + self.squelch_level = 0 def chain(self,which): any_chain_base="ncat -v 127.0.0.1 {nc_port} | " if self.csdr_dynamic_bufsize: any_chain_base+="csdr setbuf {start_bufsize} | " if self.csdr_through: any_chain_base+="csdr through | " any_chain_base+=self.format_conversion+(" | " if self.format_conversion!="" else "") ##"csdr flowcontrol {flowcontrol} auto 1.5 10 | " - if which == "fft": + if which == "fft": fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logpower_cf -70 | csdr fft_exchange_sides_ff {fft_size}" if self.fft_compression=="adpcm": return fft_chain_base+" | csdr compress_fft_adpcm_f_u8 {fft_size}" else: return fft_chain_base - chain_begin=any_chain_base+"csdr shift_addition_cc --fifo {shift_pipe} | csdr fir_decimate_cc {decimation} {ddc_transition_bw} HAMMING | csdr bandpass_fir_fft_cc --fifo {bpf_pipe} {bpf_transition_bw} HAMMING | " - chain_end = "" + chain_begin=any_chain_base+"csdr shift_addition_cc --fifo {shift_pipe} | csdr fir_decimate_cc {decimation} {ddc_transition_bw} HAMMING | csdr bandpass_fir_fft_cc --fifo {bpf_pipe} {bpf_transition_bw} HAMMING | csdr squelch_and_smeter_cc --fifo {squelch_pipe} --outfifo {smeter_pipe} 5 1 | " + chain_end = "" if self.audio_compression=="adpcm": chain_end = " | csdr encode_ima_adpcm_i16_u8" if which == "nfm": return chain_begin + "csdr fmdemod_quadri_cf | csdr limit_ff | csdr fractional_decimator_ff {last_decimation} | csdr deemphasis_nfm_ff 11025 | csdr fastagc_ff 1024 | csdr convert_f_i16"+chain_end @@ -92,7 +94,7 @@ class dsp_plugin: def get_name(self): return self.name - + def get_output_rate(self): return self.output_rate @@ -114,7 +116,7 @@ class dsp_plugin: def set_fft_fps(self,fft_fps): #to change this, restart is required self.fft_fps=fft_fps - + def fft_block_size(self): return self.samp_rate/self.fft_fps @@ -123,48 +125,66 @@ class dsp_plugin: def set_offset_freq(self,offset_freq): self.offset_freq=offset_freq - if self.running: + if self.running: self.shift_pipe_file.write("%g\n"%(-float(self.offset_freq)/self.samp_rate)) self.shift_pipe_file.flush() - + def set_bpf(self,low_cut,high_cut): self.low_cut=low_cut self.high_cut=high_cut - if self.running: + if self.running: self.bpf_pipe_file.write( "%g %g\n"%(float(self.low_cut)/self.if_samp_rate(), float(self.high_cut)/self.if_samp_rate()) ) self.bpf_pipe_file.flush() - + def get_bpf(self): return [self.low_cut, self.high_cut] + def set_squelch_level(self, squelch_level): + self.squelch_level=squelch_level + if self.running: + self.squelch_pipe_file.write( "%g\n"%(float(self.squelch_level)) ) + self.squelch_pipe_file.flush() + + def get_smeter_level(self): + if self.running: + line=self.smeter_pipe_file.readline() + return float(line[:-1]) + def mkfifo(self,path): try: os.unlink(path) except: pass - os.mkfifo(path) + os.mkfifo(path) def ddc_transition_bw(self): return self.ddc_transition_bw_rate*(self.if_samp_rate()/float(self.samp_rate)) def start(self): command_base=self.chain(self.demodulator) - + #create control pipes for csdr pipe_base_path="/tmp/openwebrx_pipe_{myid}_".format(myid=id(self)) - self.bpf_pipe = self.shift_pipe = None + self.bpf_pipe = self.shift_pipe = self.squelch_pipe = self.smeter_pipe = None if "{bpf_pipe}" in command_base: self.bpf_pipe=pipe_base_path+"bpf" self.mkfifo(self.bpf_pipe) if "{shift_pipe}" in command_base: self.shift_pipe=pipe_base_path+"shift" self.mkfifo(self.shift_pipe) + if "{squelch_pipe}" in command_base: + self.squelch_pipe=pipe_base_path+"squelch" + self.mkfifo(self.squelch_pipe) + if "{smeter_pipe}" in command_base: + self.smeter_pipe=pipe_base_path+"smeter" + self.mkfifo(self.smeter_pipe) #run the command command=command_base.format( bpf_pipe=self.bpf_pipe, shift_pipe=self.shift_pipe, decimation=self.decimation, \ last_decimation=self.last_decimation, fft_size=self.fft_size, fft_block_size=self.fft_block_size(), \ bpf_transition_bw=float(self.bpf_transition_bw)/self.if_samp_rate(), ddc_transition_bw=self.ddc_transition_bw(), \ - flowcontrol=int(self.samp_rate*2), start_bufsize=self.base_bufsize*self.decimation, nc_port=self.nc_port) + flowcontrol=int(self.samp_rate*2), start_bufsize=self.base_bufsize*self.decimation, nc_port=self.nc_port, \ + squelch_pipe=self.squelch_pipe, smeter_pipe=self.smeter_pipe ) print "[openwebrx-dsp-plugin:csdr] Command =",command #code.interact(local=locals()) @@ -175,35 +195,43 @@ class dsp_plugin: self.running = True #open control pipes for csdr and send initialization data - if self.bpf_pipe != None: + if self.bpf_pipe != None: self.bpf_pipe_file=open(self.bpf_pipe,"w") self.set_bpf(self.low_cut,self.high_cut) - if self.shift_pipe != None: + if self.shift_pipe != None: self.shift_pipe_file=open(self.shift_pipe,"w") self.set_offset_freq(self.offset_freq) + if self.squelch_pipe != None: + self.squelch_pipe_file=open(self.squelch_pipe,"w") + self.set_squelch_level(self.squelch_level) + if self.smeter_pipe != None: + self.smeter_pipe_file=open(self.smeter_pipe,"r") + fcntl.fcntl(self.smeter_pipe_file, fcntl.F_SETFL, os.O_NONBLOCK) def read(self,size): return self.process.stdout.read(size) - + def stop(self): - os.killpg(os.getpgid(self.process.pid), signal.SIGTERM) + os.killpg(os.getpgid(self.process.pid), signal.SIGTERM) #if(self.process.poll()!=None):return # returns None while subprocess is running #while(self.process.poll()==None): # #self.process.kill() # print "killproc",os.getpgid(self.process.pid),self.process.pid - # os.killpg(self.process.pid, signal.SIGTERM) - # + # os.killpg(self.process.pid, signal.SIGTERM) + # # time.sleep(0.1) if self.bpf_pipe: - try: - os.unlink(self.bpf_pipe) - except: - print "[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: " + self.bpf_pipe + try: os.unlink(self.bpf_pipe) + except: print "[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: " + self.bpf_pipe if self.shift_pipe: - try: - os.unlink(self.shift_pipe) - except: - print "[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: " + self.bpf_pipe + try: os.unlink(self.shift_pipe) + except: print "[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: " + self.shift_pipe + if self.squelch_pipe: + try: os.unlink(self.squelch_pipe) + except: print "[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: " + self.squelch_pipe + if self.smeter_pipe: + try: os.unlink(self.smeter_pipe) + except: print "[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: " + self.smeter_pipe self.running = False def restart(self): @@ -213,4 +241,3 @@ class dsp_plugin: def __del__(self): self.stop() del(self.process) -