]> git.neil.brown.name Git - plato.git/commitdiff
gsmd2: new 'clock' engine to monitor the time
authorNeilBrown <neil@brown.name>
Tue, 24 Mar 2015 05:08:29 +0000 (16:08 +1100)
committerNeilBrown <neil@brown.name>
Tue, 24 Mar 2015 05:08:29 +0000 (16:08 +1100)
If we can get a time status from the GSM network,
update system time to match.

Signed-off-by: NeilBrown <neil@brown.name>
gsm/gsmd2.py

index 3bcfa7e8c6aeaf05274dd8969bd1207fe926fef7..6f624767c9643cee41c83ba270aec13c3a5ad191 100644 (file)
@@ -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: