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