no message

This commit is contained in:
2015-11-18 20:35:48 -06:00
committed by Anthony Correa
parent 6ad007f1d7
commit 0ffbf5a2dd
5 changed files with 117 additions and 76 deletions

View File

@@ -2,7 +2,7 @@
refresh camera local = 10 refresh camera local = 10
refresh camera transmit = 15 refresh camera transmit = 15
refresh barometer local = 1 refresh barometer local = 2
refresh barometer transmit = 2 refresh barometer transmit = 2
refresh gps local = 2 refresh gps local = 2
@@ -22,11 +22,11 @@ baud rate = 9600
[server settings] [server settings]
use_lan = True use_lan = True
url = "http://home.ascorrea.com" url = http://home.ascorrea.com
server_port = 5010 server_port = 5010
data_path = "upload-data" data_path = upload-data
image_path = "missions" image_path = missions
ping_path = "ping" ping_path = ping
[local storage settings] [local storage settings]
photo path = /home/pi/scripts/spaceballoon/photos photo path = /home/pi/scripts/spaceballoon/photos

View File

@@ -79,7 +79,7 @@ class Datalogger():
else: else:
l = self._record[k] l = self._record[k]
for item in l: for item in l:
logger.debug("item: {}".format(self._record)) logger.debug("item: {}".format(self._record), extra={'MISSION_TIME': self._mt.now(), 'MISSION_ID':self._mt.name})
item['at']=self._mt.to_absolutetime(item['mt']) item['at']=self._mt.to_absolutetime(item['mt'])
item['mid']=self._mt.name item['mid']=self._mt.name
header = add_keys_if_necessary(self.log_path, item) header = add_keys_if_necessary(self.log_path, item)
@@ -88,6 +88,7 @@ class Datalogger():
writer = csv.DictWriter(log, keys, extrasaction='ignore') writer = csv.DictWriter(log, keys, extrasaction='ignore')
writer.writerow(item) writer.writerow(item)
log.close() log.close()
logger.info('Barometer data recorded',extra={'MISSION_TIME': self._mt.now(), 'MISSION_ID':self._mt.name})
elif k is 'i': elif k is 'i':
if self._record[k] is tuple: if self._record[k] is tuple:
l = [self._record[k]] l = [self._record[k]]
@@ -95,19 +96,19 @@ class Datalogger():
l = self._record[k] l = self._record[k]
for item in l: for item in l:
# Form is ('name', file object, 'type') # Form is ('name', file object, 'type')
logger.info('item is {}'.format(type(item)))
filename = item[0] filename = item[0]
file = base64.b64decode(bytes(item[1],'ascii')) file = base64.b64decode(bytes(item[1],'ascii'))
folder = os.path.join(self.photo_path, self._mt.mid) folder = os.path.join(self.photo_path, self._mt.mid)
file_path = os.path.join(self.photo_path, folder , filename) file_path = os.path.join(self.photo_path, folder, filename)
if not os.path.exists(folder): if not os.path.exists(folder):
os.makedirs(folder) os.makedirs(folder)
with open(os.path.join(self.photo_path, filename), 'wb') as f: with open(file_path, 'wb') as f:
f.write(file) f.write(file)
# file.save(os.path.join(self.photo_path, filename)) # file.save(os.path.join(self.photo_path, filename))
logger.info('Image data recorded',extra={'MISSION_TIME': self._mt.now(), 'MISSION_ID':self._mt.name})
return 'success' return 'success'
@@ -145,12 +146,12 @@ class Datareporter():
self.inet = self.SimInetGSM(self.port, logger) self.inet = self.SimInetGSM(self.port, logger)
logger.info('ip = {0}'.format(self.inet.ip)) logger.info('ip = {0}'.format(self.inet.ip), extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
logger.debug('attaching GPRS') logger.debug('attaching GPRS', extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
if not self.inet.attachGPRS('wholesale', '', '', 1): if not self.inet.attachGPRS('wholesale', '', '', 1):
logger.error('error attaching GPRS') logger.error('error attaching GPRS', extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
return False return False
#register mission number to server #register mission number to server
@@ -178,20 +179,20 @@ class Datareporter():
path = '{0}/{1}'.format(self.image_path,self.mt.mid) path = '{0}/{1}'.format(self.image_path,self.mt.mid)
if self.use_lan: if self.use_lan:
logger.info ('Sending transpondence using LAN') logger.info ('Sending transpondence using LAN', extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
response = requests.post('{0}:{1}/{2}'.format(self.url, self.server_port, path), data=m.read(), headers={'Content-Type': m.content_type}) response = requests.post('{0}:{1}/{2}'.format(self.url, self.server_port, path), data=m.read(), headers={'Content-Type': m.content_type})
pass pass
elif not self.use_lan: elif not self.use_lan:
logger.info ('Sending transpondence using modem') logger.info ('Sending transpondence using modem', extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
# logger.debug('attaching GPRS') # logger.debug('attaching GPRS')
# if not self.inet.attachGPRS('wholesale', '', '', 1): # if not self.inet.attachGPRS('wholesale', '', '', 1):
# logger.error('error attaching GPRS') # logger.error('error attaching GPRS')
# return False # return False
logger.debug('ip = {0}'.format(self.inet.ip)) logger.debug('ip = {0}'.format(self.inet.ip), extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
logger.debug('making HTTP POST request') logger.debug('making HTTP POST request', extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
if not self.inet.httpPOST( if not self.inet.httpPOST(
self.url, self.url,
@@ -200,7 +201,7 @@ class Datareporter():
m.to_string(), m.to_string(),
contentType=m.content_type contentType=m.content_type
): ):
logger.error('error making HTTP POST: {0}'.format(self.inet.errorText)) logger.error('error making HTTP POST: {0}'.format(self.inet.errorText), extra={'MISSION_TIME': self.mt.now(), 'MISSION_ID':self.mt.name})
return False return False
if self.inet.httpResponse is not None: if self.inet.httpResponse is not None:

View File

@@ -1,7 +1,7 @@
__author__ = 'asc' __author__ = 'asc'
debug = True debug = True
from random import random from random import random
import Adafruit_BMP.BMP085 as BMP085
import configparser import configparser
import time import time
import logging import logging
@@ -17,7 +17,7 @@ class Camera:
high_quality_compression_pct=85, high_quality_compression_pct=85,
debug = False, debug = False,
**kwargs): **kwargs):
logger.debug("Initializing camera") logger.info("Initializing camera", extra={'MISSION_TIME': "", 'MISSION_ID':""})
time.sleep(1) time.sleep(1)
self.low_quality_resolution = low_quality_resolution self.low_quality_resolution = low_quality_resolution
self.low_quality_compression_pct = low_quality_compression_pct self.low_quality_compression_pct = low_quality_compression_pct
@@ -25,14 +25,14 @@ class Camera:
self.high_quality_compression_pct = high_quality_compression_pct self.high_quality_compression_pct = high_quality_compression_pct
self.kwargs=kwargs self.kwargs=kwargs
self._debug = debug self._debug = debug
if self._debug == False: if not self._debug:
import picamera import picamera
self._cam = picamera.PiCamera(resolution=high_quality_resolution) self._cam = picamera.PiCamera(resolution=high_quality_resolution)
# if "vflip" in kwargs.keys(): # if "vflip" in kwargs.keys():
for k in kwargs.keys(): for k in kwargs.keys():
setattr(self._cam, k, kwargs.get(k)) setattr(self._cam, k, kwargs.get(k))
logger.debug("Camera intialized") logger.debug("Camera intialized", extra={'MISSION_TIME': "", 'MISSION_ID':""})
pass pass
@property @property
@@ -46,7 +46,7 @@ class Camera:
r = {} r = {}
if not self._debug: if not self._debug:
if not no_high_quality: if not no_high_quality:
logger.debug('Taking high quality photo') logger.debug('Taking high quality photo', extra={'MISSION_TIME': "", 'MISSION_ID':""})
self._cam.capture("temp_img_hi.jpg", self._cam.capture("temp_img_hi.jpg",
resize=self.high_quality_resolution, resize=self.high_quality_resolution,
quality=self.high_quality_compression_pct, quality=self.high_quality_compression_pct,
@@ -56,7 +56,7 @@ class Camera:
# img_hi = base64.b64encode(f.read()) # img_hi = base64.b64encode(f.read())
img_hi = str(base64.b64encode(f.read()),'ascii') img_hi = str(base64.b64encode(f.read()),'ascii')
r['hi']=("{}_hi.jpg".format(name), img_hi, "image/jpeg") r['hi']=("{}_hi.jpg".format(name), img_hi, "image/jpeg")
logger.debug('High quality photo taken') logger.debug('High quality photo taken', extra={'MISSION_TIME': "", 'MISSION_ID':""})
if not no_low_quality: if not no_low_quality:
time.sleep(1) time.sleep(1)
@@ -70,29 +70,31 @@ class Camera:
img_lo = str(base64.b64encode(f.read()),'ascii') img_lo = str(base64.b64encode(f.read()),'ascii')
# img_lo = str(f.read()) # img_lo = str(f.read())
r['lo']=("{}_lo.jpg".format(name), img_lo, "image/jpeg") r['lo']=("{}_lo.jpg".format(name), img_lo, "image/jpeg")
logger.debug('Low quality photo taken') logger.debug('Low quality photo taken', extra={'MISSION_TIME': "", 'MISSION_ID':""})
else: else:
if not no_high_quality: if not no_high_quality:
with open("temp_img_hi.jpg", 'rb') as f: with open("temp_img_hi.jpg", 'rb') as f:
img_hi = str(base64.b64encode(f.read()),'ascii') img_hi = str(base64.b64encode(f.read()),'ascii')
# img_hi = str(f.read(),'ascii') # img_hi = str(f.read(),'ascii')
r['hi']=("{}_hi.jpg".format(name), img_hi, "image/jpeg") r['hi']=("{}_hi.jpg".format(name), img_hi, "image/jpeg")
logger.info('High quality photo taken') logger.info('High quality photo taken', extra={'MISSION_TIME': "", 'MISSION_ID':""})
if not no_low_quality: if not no_low_quality:
with open("temp_img_lo.jpg", 'rb') as f: with open("temp_img_lo.jpg", 'rb') as f:
img_lo = str(base64.b64encode(f.read()),'ascii') img_lo = str(base64.b64encode(f.read()),'ascii')
# img_lo = str(f.read()) # img_lo = str(f.read())
r['lo']=("{}_lo.jpg".format(name), img_lo, "image/jpeg") r['lo']=("{}_lo.jpg".format(name), img_lo, "image/jpeg")
logger.info('Low quality photo taken') logger.info('Low quality photo taken', extra={'MISSION_TIME': "", 'MISSION_ID':""})
return r return r
class Barometer: class Barometer:
def __init__(self): def __init__(self, debug=False):
logger.debug("Intializing barometer") logger.debug("Intializing barometer", extra={'MISSION_TIME': "", 'MISSION_ID':""})
self.bmp = BMP085.BMP085() if not debug:
logger.debug("Barometer intilized") import Adafruit_BMP.BMP085 as BMP085
self.bmp = BMP085.BMP085()
logger.debug("Barometer intilized", extra={'MISSION_TIME': "", 'MISSION_ID':""})
pass pass
@property @property
@@ -126,16 +128,21 @@ class Barometer:
return alt return alt
def read(self): def read(self):
logger.debug("Reading from barometer") logger.debug("Reading from barometer", extra={'MISSION_TIME': "", 'MISSION_ID':""})
#refresh each instrument #refresh each instrument
alt = self.altitude if not debug:
press = self.pressure alt = self.altitude
temp = self.temperature press = self.pressure
temp = self.temperature
else:
temp = random()*100
press = random()
alt = random()*100000
result = {"a":alt, result = {"a":alt,
"t":temp, "t":temp,
"p":press, "p":press,
} }
logger.debug("Barometer reads {}".format(result)) logger.debug("Barometer reads {}".format(result), extra={'MISSION_TIME': "", 'MISSION_ID':""})
return result return result

View File

@@ -2,23 +2,23 @@
keys=root,datahandling,instruments keys=root,datahandling,instruments
[handlers] [handlers]
keys=fileHandler, consoleHandler keys=consoleHandler, rootHandler, instrumentsHandler, datahandlingHandler
[formatters] [formatters]
keys=myFormatter keys=myFormatter
[logger_root] [logger_root]
level=DEBUG level=DEBUG
handlers=consoleHandler, fileHandler handlers=consoleHandler, rootHandler
[logger_datahandling] [logger_datahandling]
level=INFO level=INFO
handlers=fileHandler handlers=datahandlingHandler
qualname=datahandling qualname=datahandling
[logger_instruments] [logger_instruments]
level=INFO level=INFO
handlers=fileHandler handlers=instrumentsHandler
qualname=instruments qualname=instruments
[handler_consoleHandler] [handler_consoleHandler]
@@ -32,6 +32,21 @@ class=FileHandler
formatter=myFormatter formatter=myFormatter
args=("config.log",) args=("config.log",)
[handler_rootHandler]
class=FileHandler
formatter=myFormatter
args=("main_log.txt",)
[handler_instrumentsHandler]
class=FileHandler
formatter=myFormatter
args=("instruments_log.txt",)
[handler_datahandlingHandler]
class=FileHandler
formatter=myFormatter
args=("datahandling_log.txt",)
[formatter_myFormatter] [formatter_myFormatter]
format=[%(asctime)-15s] %(name)-25s %(levelname)-8s %(message)s format=[%(asctime)-15s] [%(MISSION_TIME)-10s] %(MISSION_ID)-10s %(name)-25s %(levelname)-8s %(message)s
datefmt= datefmt=%Y-%m-%d %H:%M:%S

88
main.py
View File

@@ -6,29 +6,25 @@ import logging.handlers,logging.config
from instruments import Barometer, Camera from instruments import Barometer, Camera
from datahandling import Datalogger, Datareporter from datahandling import Datalogger, Datareporter
from system import System as System from system import System as System
import threading from threading import Timer
from datahandling import Record from datahandling import Record
from mission import Mission from mission import Mission
import random import random
import string import string
# class ContextFilter(logging.Filter):
# """
# This is a filter which injects contextual information into the log.
# """
# def filter(self, record):
# record.MYVAR = MYVAR
# return True
logging.config.fileConfig('logging.ini') logging.config.fileConfig('logging.ini')
log = logging.getLogger(__name__) log = logging.getLogger('root')
# log = logging.basicConfig() log.addFilter(logging.Filter('root'))
# log1 = logging.getLogger("instruments") # log.addFilter(ContextFilter())
# log2 = logging.getLogger("datahandling")
# handler = logging.handlers.RotatingFileHandler('spaceballoon.log', backupCount=5)
formatter = logging.Formatter('[%(asctime)-25s] %(name)-15s %(levelname)-8s %(message)s')
# handler.setFormatter(formatter)
# log.addHandler(handler)
# log1.addHandler(handler)
# log2.addHandler(handler)
log.setLevel(logging.DEBUG)
# log1.setLevel(logging.DEBUG)
# log2.setLevel(logging.INFO)
#start-up #start-up
#log denotes write to local, report denotes sending to server #log denotes write to local, report denotes sending to server
@@ -41,13 +37,13 @@ mission = Mission()
reporter = Datareporter ( reporter = Datareporter (
missiontime = mission, missiontime = mission,
use_lan = True, use_lan = True,
url = "http://home.ascorrea.com", url = url,
server_port = 5010, server_port = 5010,
data_path = "upload-data", data_path = data_path,
image_path = "missions", image_path = image_path,
ping_path = "ping", ping_path = ping_path,
com_port_name="/dev/ttyAMA0", com_port_name=com_port_name,
baud_rate = 9600 baud_rate = baud_rate
) )
t = Record({'zt':mission.timezero}) t = Record({'zt':mission.timezero})
@@ -61,15 +57,15 @@ notebook = Datalogger (
log_path=log_path, log_path=log_path,
photo_path=photo_path) photo_path=photo_path)
log.debug ("System started") log.debug ("System started", extra={'MISSION_TIME': "", 'MISSION_ID':""})
#system check #system check
system = System() system = System()
log.debug (system.stats) log.debug (system.stats, extra={'MISSION_TIME': "", 'MISSION_ID':""})
#set mission time #set mission time
log.info("Mission {} started, time zero is {}".format(mission.name, mission.timezero)) log.info("Mission {} started, time zero is {}".format(mission.name, mission.timezero), extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
#intiate mission #intiate mission
@@ -86,37 +82,55 @@ camera = Camera (low_quality_compression_pct=low_quality_compression_pct,
vflip=False, vflip=False,
hflip=False, hflip=False,
exposure_mode='sports', exposure_mode='sports',
# debug=True debug=True
) )
#todo test barometer #todo test barometer
barometer = Barometer() barometer = Barometer(debug=True)
#todo test GPS, log, report #todo test GPS, log, report
#todo check for errors, throw exception if error #todo check for errors, throw exception if error
def scheduler (interval, worker_func, iterations = 0): class scheduler ():
if iterations != 1:
threading.Timer (
interval,
scheduler, [interval, worker_func, 0 if iterations == 0 else iterations-1]
).start ()
worker_func () def __init__(self, interval, function, *args, **kwargs):
self._timer = None
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.is_running = False
self.start()
def _run(self):
self.is_running = False
self.start()
self.function(*self.args, **self.kwargs)
def start(self):
if not self.is_running:
self._timer = Timer(self.interval, self._run)
self._timer.start()
self.is_running = True
def stop(self):
self._timer.cancel()
self.is_running = False
def update_barometer_local(): def update_barometer_local():
global bar global bar
bar = barometer.read() bar = barometer.read()
bar.update({'mt':mission.now()}) bar.update({'mt':mission.now()})
record = Record(bar.copy(),'b') record = Record(bar.copy(),'b')
log.info('Updating barometer...',extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
notebook.log(record) notebook.log(record)
def update_image_local(): def update_image_local():
global img global img
img = camera.capture(name=mission.now()) img = camera.capture(name=mission.now())
record = Record([img.get('hi'), img.get('lo')], 'i') record = Record([img.get('hi'), img.get('lo')], 'i')
log.info('Updating image...', extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
notebook.log(record) notebook.log(record)
def submit_report(): def submit_report():
@@ -128,17 +142,21 @@ def submit_report():
# reporter.create_transpondence() # reporter.create_transpondence()
if not transpondence: if not transpondence:
log.info('Creating transpondence',extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
transpondence = Record() transpondence = Record()
if (counter % refresh_barometer_transmit) == 0: if (counter % refresh_barometer_transmit) == 0:
log.info('Adding barometer data to transpondence',extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
transpondence.add(bar,'b') transpondence.add(bar,'b')
if (counter % refresh_camera_transmit) == 0: if (counter % refresh_camera_transmit) == 0:
log.info('Adding image to transpondence',extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
transpondence.add(img.get('lo'),'i') transpondence.add(img.get('lo'),'i')
log.info('Sending transpondence', extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
transpondence = reporter.send(transpondence) #returns none on success, (bad practice?) transpondence = reporter.send(transpondence) #returns none on success, (bad practice?)
counter += 1 counter += 1
log.info('Counter = {}'.format(counter)) log.debug('Counter = {}'.format(counter), extra={'MISSION_TIME': mission.now(), 'MISSION_ID':mission.name})
counter=1 counter=1