parallelise serial port usage and I/O for writing sounds files
[scannr.git] / scannr.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s\t%(levelname)s\t%(message)s')
 
import snd
import time
from datetime import date
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,os
 
 
sys.path.insert(0, os.path.join(os.path.dirname(__file__) or '.', 'pynma'))
import pynma
 
filename = "demo.wav"
MIN_LENGTH = 90000
 
 
def worker(filename, length):
 
    """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
"""
    print 'Worker for '+filename
    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'):
            print "uh oh"
        if (row[1] != ''):  
            tgid = row[1]
            #nma.push("scannr", "ping", filename, "http://www.google.com")
            tgname = row[7]
            sitename = row[5]
            """http://initd.org/psycopg/docs/usage.html"""
            cur = conn.cursor()
            cur.execute("INSERT INTO recordings (filename,tgid,tgname,sitename,length) VALUES (%s, %s,%s, %s, %s)",(filename,tgid,tgname,sitename, length))
            conn.commit()
            cur.close()
        else:
            print filename+" has no TGID"
 
    return
 
def filenameMaker():
    global filename
    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`"
    sample_width, data = snd.record()
    print str(len(data))
    if len(data) > MIN_LENGTH:
        data = snd.pack('<' + ('h'*len(data)), *data)
        path = "./data/"+filename
        dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename, length=len(data))
        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( 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 again"
    record_to_async_file()
ser.close()