From a3383092ed50cfc35c20271a7d76bf8b234f3244 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 24 Mar 2015 16:08:29 +1100 Subject: [PATCH] gsmd2: new 'clock' engine to monitor the time If we can get a time status from the GSM network, update system time to match. Signed-off-by: NeilBrown --- gsm/gsmd2.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/gsm/gsmd2.py b/gsm/gsmd2.py index 3bcfa7e..6f62476 100644 --- a/gsm/gsmd2.py +++ b/gsm/gsmd2.py @@ -1442,6 +1442,65 @@ add_engine(sms_recv()) ### # sms_send +### +# clock +# +CTZU=1 - auto timezone update +# +CTZR=1 - auto timezone report ??? +# +CCLK? - report time .. year might be '99' + +class clock(Engine): + def __init__(self): + Engine.__init__(self) + + def set_on(self, state): + if state: + self.retry(1000) + + def do_retry(self): + at_queue('+CTZU?', self.got_u, 1000) + at_queue('+CCLK?', self.got_clk, 1000) + + def got_u(self, line): + if not line: + self.retry(10000) + return False + m = re.match('\+CTZU: (\d)', line) + if m: + n = m.group(1) + if n != '1': + at_queue('+CTZU=1', self.didset, 2000) + return False + + def got_clk(self, line): + now = time.time() + if not line: + self.retry(30000) + return False + + m = re.match('\+CCLK: "(..)/(..)/(..),(..):(..):(..)\+([0-9]*)"', + line) + if m: + if m.group(1) == '99': + self.retry(60000) + return False + tm = time.struct_time([int(m.group(1))+2000, + int(m.group(2)), + int(m.group(3)), + int(m.group(4)), + int(m.group(5)), + int(m.group(6)), + 0,0,-1]) + then = time.mktime(tm) + if abs(now - then) > 30: + log("Time is ", time.strftime("%Y-%m-%d %H:%M:%S", tm)) + log("Time difference is", now-then) + if then > now: + os.system("date -s +%dseconds" % int(then-now)) + self.retry(10*60*1000) + return False + +add_engine(clock()) + c = gobject.main_context_default() while True: -- 2.39.5