move files to data folder
move files to data folder

<?php <?php
   
function view($sensorID) {  
$data = Array("sensorID" => $sensorID,  
);  
$timefrom = 1;  
$timeto = 1;  
$years = $this->Sensor_model->getSensorDataYears($sensorID, $timefrom, $timeto);  
foreach ($years as $year) {  
$yearsItem[] = Array("title" => $year['year'], "link" => "#",  
"onclick" => "getData('$sensorID'," . mktime(0, 0, 0, 1, 1, $year['year']) . "," . mktime(0, 0, 0, 12, 31, $year['year']) . ");");  
}  
$months = $this->Sensor_model->getSensorDataMonths($sensorID, $timefrom, $timeto);  
foreach ($months as $month) {  
$monthsItem[] = Array("title" => date("F", mktime(0, 0, 0, $month['month'], 10)) . ' ' . $month['year'], "link" => "#",  
"onclick" => "getData('$sensorID'," . mktime(0, 0, 0, $month['month'], 1, $month['year']) . "," . strtotime("+1 month", mktime(0, 0, 0, $month['month'], 1, $month['year'])) . ");");  
}  
$days = $this->Sensor_model->getSensorDataDays($sensorID, $timefrom, $timeto);  
foreach ($days as $day) {  
$daysItem[] = Array("title" => date("jS F", mktime(0, 0, 0, $day['month'], $day['day'])), "link" => "#",  
"onclick" => "getData('$sensorID'," . mktime(0, 0, 0, $day['month'], $day['day'], $day['year']) . "," . mktime(23, 59, 59, $day['month'], $day['day'], $day['year']) . ");");  
}  
   
$data['sidebar'] = Array("years" => $yearsItem, "months" => $monthsItem, "days" => $daysItem  
);  
$this->javascript = Array("flot/jquery.flot.min.js", "flot/jquery.flot.resize.min.js", "flot/jquery.flot.crosshair.min.js");  
$this->content = $this->load->view('pages/sensor/view', $data, true);  
$this->render_page();  
}  
   
function json_graph($sensorID, $timefrom, $timeto) { function json_graph($sensorID, $timefrom, $timeto) {
$values = $this->Sensor_model->getSensorValuesByHour($sensorID, $timefrom, $timeto); $values = getSensorValuesByHour($sensorID, $timefrom, $timeto);
$label = $sensorID; $label = $sensorID;
$data = Array(); $data = Array();
$tzoffset = $this->get_timezone_offset("UTC"); $tzoffset = $this->get_timezone_offset("UTC");
foreach ($values as $value) { foreach ($values as $value) {
$data[] = Array((strtotime($value['time']) + $tzoffset) * 1000, intval($value['avg'])); $data[] = Array((strtotime($value['time']) + $tzoffset) * 1000, intval($value['avg']));
} }
$this->output $this->output
->set_content_type('application/json') ->set_content_type('application/json')
->set_output(json_encode(Array("label" => $label, "data" => $data, ->set_output(json_encode(Array("label" => $label, "data" => $data,
"previous" => Array( "previous" => Array(
"from" => $timefrom - (24 * 60 * 60), "from" => $timefrom - (24 * 60 * 60),
"to" => $timefrom) "to" => $timefrom)
, ,
"next" => Array( "next" => Array(
"to" => $timeto + (24 * 60 * 60), "to" => $timeto + (24 * 60 * 60),
"from" => $timeto) "from" => $timeto)
) )
)); ));
} }
   
function json_data_description($sensorID, $timefrom, $timeto) { function json_data_description($sensorID, $timefrom, $timeto) {
$timefrom = strtotime($timefrom); $timefrom = strtotime($timefrom);
$timeto = strtotime($timeto); $timeto = strtotime($timeto);
$years = $this->Sensor_model->getSensorDataYears($sensorID, $timefrom, $timeto); $years = getSensorDataYears($sensorID, $timefrom, $timeto);
   
$months = $this->Sensor_model->getSensorDataMonths($sensorID, $timefrom, $timeto); $months = getSensorDataMonths($sensorID, $timefrom, $timeto);
$days = $this->Sensor_model->getSensorDataDays($sensorID, $timefrom, $timeto); $days = getSensorDataDays($sensorID, $timefrom, $timeto);
   
$this->output return json_encode(Array("years" => $years, "months" => $months, "days" => $days
->set_content_type('application/json') ));
->set_output(json_encode(Array("years" => $years, "months" => $months, "days" => $days  
)));  
} }
   
?> ?>
   
<?php <?php
date_default_timezone_set("Australia/Sydney"); date_default_timezone_set("Australia/Sydney");
$basePath = ""; $basePath = "";
  $DATA_DIR = "./data";
   
/** Returns the offset from the origin timezone to the remote timezone, in seconds. /** Returns the offset from the origin timezone to the remote timezone, in seconds.
* @param $remote_tz; * @param $remote_tz;
* @param $origin_tz; If null the servers current timezone is used as the origin. * @param $origin_tz; If null the servers current timezone is used as the origin.
* @return int; * @return int;
*/ */
function get_timezone_offset($remote_tz, $origin_tz = null) { function get_timezone_offset($remote_tz, $origin_tz = null) {
if ($origin_tz === null) { if ($origin_tz === null) {
if (!is_string($origin_tz = date_default_timezone_get())) { if (!is_string($origin_tz = date_default_timezone_get())) {
return false; // A UTC timestamp was returned -- bail out! return false; // A UTC timestamp was returned -- bail out!
} }
} }
$origin_dtz = new DateTimeZone($origin_tz); $origin_dtz = new DateTimeZone($origin_tz);
$remote_dtz = new DateTimeZone($remote_tz); $remote_dtz = new DateTimeZone($remote_tz);
$origin_dt = new DateTime("now", $origin_dtz); $origin_dt = new DateTime("now", $origin_dtz);
$remote_dt = new DateTime("now", $remote_dtz); $remote_dt = new DateTime("now", $remote_dtz);
$offset = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt); $offset = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt);
return $offset; return $offset;
} }
   
function getSensorValuesByHour($sensorID, $timeFrom, $timeTo) { function getSensorValuesByHour($sensorID, $timeFrom, $timeTo) {
$sql = 'select min(time) as time, min(value), max(value), avg(value), stddev(value) from sensor_values where sensor_id = ? $sql = 'select min(call_timestamp) as time, count(*), min(length), max(length), avg(length), stddev(length) from recordings
and extract(epoch from time) > ? and extract(epoch from time) < ? group by tgid, date_trunc(\'hour\', call_timestamp) order by time';
group by sensor_id, date_trunc(\'hour\', time) order by time';  
   
$query = $this->db->query($sql, Array($sensorID, $timeFrom, $timeTo)); $query = $this->db->query($sql, Array($sensorID, $timeFrom, $timeTo));
return $query->result_array(); return $query->result_array();
} }
   
function getSensorValuesByDay($sensorID, $dayFrom, $dayTo) { function getSensorValuesByDay($sensorID, $dayFrom, $dayTo) {
$sql = 'select min(time) as time, min(value), max(value), avg(value), stddev(value) from sensor_values where sensor_id = ? $sql = 'select min(time) as time, min(value), max(value), avg(value), stddev(value) from sensor_values where sensor_id = ?
group by sensor_id, date_trunc(\'day\', time) order by time'; group by sensor_id, date_trunc(\'day\', time) order by time';
   
$query = $this->db->query($sql, Array($sensorID)); $query = $this->db->query($sql, Array($sensorID));
return $query->result_array(); return $query->result_array();
} }
   
function getSensorDataYears($sensorID, $timeFrom, $timeTo) { function getSensorDataYears($sensorID, $timeFrom, $timeTo) {
$sql = "select distinct extract('year' from time) as year from sensor_values where sensor_id = ? order by year"; $sql = "select distinct extract('year' from call_timestamp) as year from recordings where tgid = ? order by year";
   
$query = $this->db->query($sql, Array($sensorID)); $query = $this->db->query($sql, Array($sensorID));
return $query->result_array(); return $query->result_array();
} }
   
function getSensorDataMonths($sensorID, $timeFrom, $timeTo) { function getSensorDataMonths($sensorID, $timeFrom, $timeTo) {
$sql = "select distinct extract('month' from time) as month, extract('year' from time) as year from sensor_values where sensor_id = ? order by year, month"; $sql = "select distinct extract('month' from time) as month, extract('year' from time) as year from sensor_values where sensor_id = ? order by year, month";
   
$query = $this->db->query($sql, Array($sensorID)); $query = $this->db->query($sql, Array($sensorID));
return $query->result_array(); return $query->result_array();
} }
   
function getSensorDataDays($sensorID, $timeFrom, $timeTo) { function getSensorDataDays($sensorID, $timeFrom, $timeTo) {
$sql = "select distinct extract('day' from time) as day, extract('month' from time) as month, extract('year' from time) as year from sensor_values where sensor_id = ? order by year,month,day"; $sql = "select distinct extract('day' from time) as day, extract('month' from time) as month, extract('year' from time) as year from sensor_values where sensor_id = ? order by year,month,day";
   
$query = $this->db->query($sql, Array($sensorID)); $query = $this->db->query($sql, Array($sensorID));
return $query->result_array(); return $query->result_array();
} }
   
function include_header($title) { function include_header($title) {
global $basePath; global $basePath;
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
   
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ --> <!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--> <!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]--> <!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]--> <!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en"> <!--<![endif]--> <!--[if gt IE 8]><!--> <html lang="en"> <!--<![endif]-->
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
   
<!-- Set the viewport width to device width for mobile --> <!-- Set the viewport width to device width for mobile -->
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
   
<title><?php echo $title; ?> - Scannr</title> <title><?php echo $title; ?> - Scannr</title>
   
<!-- Included CSS Files --> <!-- Included CSS Files -->
<link rel="stylesheet" href="<?php echo $basePath ?>stylesheets/foundation.css"> <link rel="stylesheet" href="<?php echo $basePath ?>stylesheets/foundation.css">
<link rel="stylesheet" href="<?php echo $basePath ?>stylesheets/app.css"> <link rel="stylesheet" href="<?php echo $basePath ?>stylesheets/app.css">
   
<!--[if lt IE 9]> <!--[if lt IE 9]>
<link rel="stylesheet" href="<?php echo $basePath ?>stylesheets/ie.css"> <link rel="stylesheet" href="<?php echo $basePath ?>stylesheets/ie.css">
<![endif]--> <![endif]-->
   
   
<!-- IE Fix for HTML5 Tags --> <!-- IE Fix for HTML5 Tags -->
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]--> <![endif]-->
   
</head> </head>
<body xmlns:schema="http://schema.org/" xmlns:foaf="http://xmlns.com/foaf/0.1/"> <body xmlns:schema="http://schema.org/" xmlns:foaf="http://xmlns.com/foaf/0.1/">
   
<!-- navBar --> <!-- navBar -->
<div id="navbar" class="container"> <div id="navbar" class="container">
<div class="row"> <div class="row">
<div class="four columns"> <div class="four columns">
<h1><a href="/">Disclosr</a></h1> <h1><a href="/">Disclosr</a></h1>
</div> </div>
<div class="eight columns hide-on-phones"> <div class="eight columns hide-on-phones">
<strong class="right"> <strong class="right">
<a href="getAgency.php">Agencies</a> <a href="getAgency.php">Agencies</a>
<a href="about.php">About/FAQ</a> <a href="about.php">About/FAQ</a>
</strong> </strong>
</div> </div>
</div> </div>
</div> </div>
<!-- /navBar --> <!-- /navBar -->
   
<!-- container --> <!-- container -->
<div class="container"> <div class="container">
<?php <?php
} }
   
function include_footer() { function include_footer() {
global $basePath; global $basePath;
?> ?>
   
</div> </div>
<!-- container --> <!-- container -->
   
   
   
   
<!-- Included JS Files --> <!-- Included JS Files -->
<script src="<?php echo $basePath; ?>js/foundation.js"></script> <script src="<?php echo $basePath; ?>js/foundation.js"></script>
<script src="<?php echo $basePath; ?>js/app.js"></script> <script src="<?php echo $basePath; ?>js/app.js"></script>
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script>window.jQuery || document.write('<script src="js/jquery-1.8.2.min.js"><\/script>')</script> <script>window.jQuery || document.write('<script src="js/jquery-1.8.2.min.js"><\/script>')</script>
   
<script type="text/javascript" src="<?php echo $basePath ?>js/flotr2/flotr2.js"></script> <script type="text/javascript" src="<?php echo $basePath ?>js/flotr2/flotr2.js"></script>
<?php <?php
if (strpos($_SERVER['SERVER_NAME'], ".gs")) { if (strpos($_SERVER['SERVER_NAME'], ".gs")) {
?> ?>
<script type="text/javascript"> <script type="text/javascript">
   
var _gaq = _gaq || []; var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-12341040-2']); _gaq.push(['_setAccount', 'UA-12341040-2']);
_gaq.push(['_trackPageview']); _gaq.push(['_trackPageview']);
   
(function() { (function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})(); })();
   
</script> </script>
   
</body> </body>
</html> </html>
   
<?php <?php
} }
} }
   
   
file:a/scannr.py -> file: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,os import sys,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"
MIN_LENGTH = 90000 MIN_LENGTH = 90000
   
   
def worker(filename, length): def worker(filename, length):
   
"""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-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
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,NONE,NONE,NONE #GLG,40078,NFM,0,0,CanberraBlackMnt,AustralianCapita,SES Ops 1,1,0,NONE,NONE,NONE
if (row[0] != 'GLG'): if (row[0] != 'GLG'):
print "uh oh" print "uh oh"
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]
"""http://initd.org/psycopg/docs/usage.html""" """http://initd.org/psycopg/docs/usage.html"""
cur = conn.cursor() cur = conn.cursor()
cur.execute("INSERT INTO recordings (filename,tgid,tgname,sitename,length) VALUES (%s, %s,%s, %s, %s)",(filename,tgid,tgname,sitename, length)) cur.execute("INSERT INTO recordings (filename,tgid,tgname,sitename,length) VALUES (%s, %s,%s, %s, %s)",(filename,tgid,tgname,sitename, length))
conn.commit() conn.commit()
cur.close() cur.close()
else: else:
print filename+" has no TGID" print filename+" has no TGID"
   
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 record_to_async_file(): def record_to_async_file():
"Records from the microphone and outputs the resulting data to `path`" "Records from the microphone and outputs the resulting data to `path`"
sample_width, data = snd.record() sample_width, data = snd.record()
print str(len(data)) print str(len(data))
if len(data) > MIN_LENGTH: if len(data) > MIN_LENGTH:
data = snd.pack('<' + ('h'*len(data)), *data) data = snd.pack('<' + ('h'*len(data)), *data)
path = filename path = "./data/"+filename
dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename, length=len(data)) dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename, length=len(data))
wf = wave.open(path, 'wb') wf = wave.open(path, 'wb')
wf.setnchannels(1) wf.setnchannels(1)
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( worker, signal='FILE_CREATED', sender=dispatcher.Any ) dispatcher.connect( worker, signal='FILE_CREATED', sender=dispatcher.Any )
   
print "Opening serial port..." print "Opening serial port..."
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")