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