--- 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() + + +