Returning to clean state after 0.5s if not synchronized
diff --git a/python/clock_offset_control.py b/python/clock_offset_control.py
index 4cf1e6f..db8f93b 100644
--- a/python/clock_offset_control.py
+++ b/python/clock_offset_control.py
@@ -22,6 +22,7 @@
from numpy import *
from gnuradio import gr
import pmt
+from threading import Timer
class clock_offset_control(gr.basic_block):
"""
@@ -41,6 +42,8 @@
self.ppm_estimate = -1e6
self.first_measurement = True
self.counter = 0
+ self.last_state = ""
+ self.timer = Timer(0.5, self.conditional_reset)
def process_measurement(self,msg):
if pmt.is_tuple(msg):
@@ -50,15 +53,19 @@
ppm = -freq_offset/self.fc*1.0e6
state = pmt.symbol_to_string(pmt.tuple_ref(msg,2))
- if abs(ppm) > 50:
+ self.last_state = state
+
+ if abs(ppm) > 100: #safeguard against flawed measurements
ppm = 0
self.reset()
if state == "fcch_search":
msg_ppm = pmt.from_double(ppm)
self.message_port_pub(pmt.intern("ppm"), msg_ppm)
-
- if state == "synchronized":
+ self.timer.cancel()
+ self.timer = Timer(0.5, self.conditional_reset)
+ self.timer.start()
+ elif state == "synchronized":
if self.first_measurement:
self.ppm_estimate = ppm
self.first_measurement = False
@@ -71,11 +78,18 @@
self.message_port_pub(pmt.intern("ppm"), msg_ppm)
else:
self.counter=self.counter+1
-
- if state == "sync_loss":
+ elif state == "sync_loss":
self.reset()
msg_ppm = pmt.from_double(0.0)
self.message_port_pub(pmt.intern("ppm"), msg_ppm)
+
+ def conditional_reset(self):
+ if self.last_state != "synchronized":
+# print "conditional reset"
+ self.reset()
+ msg_ppm = pmt.from_double(0.0)
+ self.message_port_pub(pmt.intern("ppm"), msg_ppm)
+
def reset(self):
self.ppm_estimate = -1e6
self.counter = 0