Ignore short silent clips
[scannr.git] / scannr.py
blob:a/scannr.py -> blob:b/scannr.py
--- a/scannr.py
+++ b/scannr.py
@@ -1,6 +1,7 @@
 import logging
+
 logging.basicConfig(level=logging.DEBUG,
-                    format='%(asctime)s\t%(levelname)s\t%(message)s')
+    format='%(asctime)s\t%(levelname)s\t%(message)s')
 
 import snd
 import time
@@ -8,45 +9,136 @@
 import threading
 from pydispatch import dispatcher
 import wave
+import serial
+#python -m serial.tools.miniterm -p COM20 -e -b 115200 --cr
+import psycopg2
+import csv
+import sys
+import os
+
+
+sys.path.insert(0, os.path.join(os.path.dirname(__file__) or '.', 'pynma'))
+import pynma
 
 filename = "demo.wav"
+last_call = (None, None, None)
 MIN_LENGTH = 90000
+lock = threading.RLock()
 
-def worker(filename):
+
+def get_call():
+    global lock
+    with lock:
+        ser.write("GLG\r")
+        line = ser.readline()   # read a '\n' terminated line
+        print line
+        reader = csv.reader([line])
+        for row in reader:
+            #GLG,40078,NFM,0,0,CanberraBlackMnt,AustralianCapita,SES Ops 1,1,0
+            #,NONE,NONE,NONE
+            if (row[0] != 'GLG' or row[1] == ''):
+                print "uh oh"
+                return (None, None, None)
+            if (row[1] != ''):
+                tgid = row[1]
+                #nma.push("scannr", "ping", filename, "http://www.google.com")
+                tgname = row[7]
+                sitename = row[5]
+                return (tgid, tgname, sitename)
+
+
+def log_recording(tgid, tgname, sitename, filename, length):
+    cur = conn.cursor()
+    cur.execute("INSERT INTO recordings \
+    (tgid, tgname, sitename, filename, length)\
+     VALUES (%s, %s, %s, %s, %s)", ( tgid, tgname, sitename, filename, length))
+    conn.commit()
+    cur.close()
+
+
+def tgid_worker():
+    global last_call
+    last_call = get_call()
+
+
+def save_worker(filename, length):
+    global last_call
     """thread worker function
     http://www.doughellmann.com/PyMOTW/threading/
     https://github.com/uskr/pynma
 ffmpeg -i 2012-09-29-1348911268.34-demo.wav -ar 8000 -ab 4.75k test.3gp
-http://stackoverflow.com/questions/2559746/getting-error-while-converting-wav-to-amr-using-ffmpeg
+http://stackoverflow.com/questions/2559746/getting-error-while-converting-
+wav-to-amr-using-ffmpeg
 """
-    print 'Worker for '+filename
-    
+    print 'Worker for ' + filename
+    (oldtgid, oldtgname, oldsitename) = last_call
+    (tgid, tgname, sitename) = get_call()
+    if oldtgid == tgid:
+        if tgid is None or tgid == '':
+            print filename + " has no TGID"
+        else:
+            log_recording(tgid, tgname, sitename, filename, length)
+    else:
+        if tgid is None or tgid == '':
+            print filename + " has no TGID"
+        else:
+            log_recording(tgid, tgname, sitename, filename, length)
+        if oldtgid is None or oldtgid == '':
+            print filename + " has no old TGID"
+        else:
+            log_recording(oldtgid, oldtgname, oldsitename, filename, length)
     return
+
 
 def filenameMaker():
     global filename
-    filename = date.today().isoformat()+'-'+str(time.time())+'-demo.wav'
+    filename = date.today().isoformat() + '-' + str(time.time()) + '-demo.wav'
 
-def record_to_async_file():
-    "Records from the microphone and outputs the resulting data to `path`"
+
+def do_record():
+    #global filename
     sample_width, data = snd.record()
-    print str(len(data))
+    thr = threading.Thread(target=record_to_async_file, args=(sample_width, data, filename))
+    thr.start()
+
+
+def record_to_async_file(sample_width, data, filename):
+    "Records from the microphone and outputs the resulting data to `filename`"
+    print "Recording complete"
     if len(data) > MIN_LENGTH:
-        data = snd.pack('<' + ('h'*len(data)), *data)
-        path = filename
-        dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename)
+        print "Recording being saved..."
+        dispatcher.send(signal='FILE_CREATED', sender=filename, filename=filename, length=len(data))
+        print str(len(data))
+        data = snd.pack('<' + ('h' * len(data)), *data)
+        path = "./data/" + filename
         wf = wave.open(path, 'wb')
-        wf.setnchannels(1)
+        wf.setnchannels(2)
         wf.setsampwidth(sample_width)
         wf.setframerate(snd.RATE)
         wf.writeframes(data)
         wf.close()
-        print("done - result "+str(len(data))+" frames written to "+path)
+        del wf
+        print("done - result " + str(len(data)) + " frames written to " + path)
+    del data
 
-dispatcher.connect( filenameMaker, signal='SND_STARTED', sender=dispatcher.Any )
-dispatcher.connect( worker, signal='FILE_CREATED', sender=dispatcher.Any )
-print "Scannr started..."
+dispatcher.connect(filenameMaker, signal='SND_STARTED', sender=dispatcher.Any)
+dispatcher.connect(tgid_worker, signal='SND_STARTED', sender=dispatcher.Any)
+dispatcher.connect(save_worker, signal='FILE_CREATED', sender=dispatcher.Any)
+
+print "Opening serial port..."
+if sys.platform.startswith('darwin'):
+    ser = serial.Serial('/dev/tty.usbserial-FTB3VL83', 112500, timeout=1)
+elif sys.platform.startswith('win32'):
+    ser = serial.Serial('COM20', 112500, timeout=1)
+print "Loading notifymyandroid..."
+nma = pynma.PyNMA("a6f50f76119eda33befe4325b4b9e1dd25eef7bad2868e4f")
+print "Connecting database..."
+conn = psycopg2.connect("dbname=scannr user=postgres password=snmc")
+print "Scannr started."
 while True:
-    print "ready to record"
-    record_to_async_file()
-    
+    print "ready to record again"
+    do_record()
+ser.close()
+
+
+