add pynma and postgres
[scannr.git] / scannr.py
blob:a/scannr.py -> blob:b/scannr.py
  import logging
   
  logging.basicConfig(level=logging.DEBUG,
  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
  #python -m serial.tools.miniterm -p COM20 -e -b 115200 --cr
import psycopg2 import psycopg2
import sys,os import csv
  import sys
  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"
nma = pynma.PyNMA( "apikey(s)", "developerkey") last_call = (None, None, None)
conn = psycopg2.connect("dbname=test user=postgres") 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 """thread worker function
http://www.doughellmann.com/PyMOTW/threading/ 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
  """
  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
   
https://github.com/uskr/pynma  
   
http://stackoverflow.com/questions/1092531/event-system-in-python """  
print 'Worker for '+filename  
"""nma.push(application, event, description, (opt) url,)"""  
"""http://initd.org/psycopg/docs/usage.html"""  
#cur = conn.cursor()  
#cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",(100, "abc'def"))  
#conn.commit()  
#cur.close()  
   
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 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() sample_width, data = snd.record()
data = snd.pack('<' + ('h'*len(data)), *data) thr = threading.Thread(target=record_to_async_file, args=(sample_width, data, filename))
path = filename thr.start()
dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename)  
wf = wave.open(path, 'wb')  
wf.setnchannels(1)  
wf.setsampwidth(sample_width)  
wf.setframerate(snd.RATE)  
wf.writeframes(data)  
wf.close()  
print("done - result written to "+path)  
   
dispatcher.connect( filenameMaker, signal='SND_STARTED', sender=dispatcher.Any )  
dispatcher.connect( worker, signal='FILE_CREATED', sender=dispatcher.Any ) def record_to_async_file(sample_width, data, filename):
print "Scannr started..." "Records from the microphone and outputs the resulting data to `filename`"
  print "Recording complete"
  if len(data) > MIN_LENGTH:
  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(2)
  wf.setsampwidth(sample_width)
  wf.setframerate(snd.RATE)
  wf.writeframes(data)
  wf.close()
  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(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: while True:
print "ready to record" print "ready to record again"
record_to_async_file() do_record()
  ser.close()