This repository was archived by the owner on Oct 15, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.py
188 lines (138 loc) · 5.51 KB
/
main.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import atexit
import logging
import os
import signal
import sys
from datetime import datetime, timedelta
from logging import handlers
from time import sleep
from traceback import format_exc
try:
from sense_hat import SenseHat
except ImportError: # Not on pi
pass
from data_manager.data_manager import DataManager
from image import image
# Some constants
max_attempts = 3
img_path = "./data/imgs/"
db_path = "./data/database.sqlite"
image.path = img_path
log_filename = "astro.log"
# Logging setup
logger = logging.getLogger('astro')
logger.setLevel(logging.DEBUG)
# How the logs are going to look
formatter = logging.Formatter(
'%(levelname)s:%(asctime)s:%(filename)s:%(funcName)s:%(message)s')
# Creates a new log file every time it runs
should_roll_over = os.path.isfile(log_filename)
filehandler = logging.handlers.RotatingFileHandler(log_filename, mode='w', backupCount=10)
if should_roll_over: # log already exists, roll over!
filehandler.doRollover()
filehandler.setFormatter(formatter)
filehandler.setLevel(logging.DEBUG)
# Log to console
outputhandler = logging.StreamHandler(sys.stdout)
outputhandler.setFormatter(formatter)
outputhandler.setLevel(logging.INFO)
logger.addHandler(filehandler)
logger.addHandler(outputhandler)
class main:
stop = False
cycle = 0
def __init__(self):
logger.info('main init')
atexit.register(self.stop_prosses)
signal.signal(signal.SIGTERM, self.stop_prosses)
# Test if the data and imgs path exist
if not os.path.exists(img_path):
logger.info("Data path not exist, create folders")
os.makedirs(img_path)
self.data_manager = DataManager(db_path, img_path)
try:
self.sense = SenseHat()
except (OSError, NameError): # On pi without hat, or not testing on pi
self.sense = __import__('fake_sense').SenseHat()
logger.warning('Running without sense-hat')
self.start_time = datetime.utcnow()
self.stop_time = self.start_time + timedelta(hours=2, minutes=58)
logger.info('Program will end on {}'.format(self.stop_time))
self.data_manager.create_table() # TODO: if false (error) return
logger.debug('function main init end, starting manager')
# Start main loop
self.manager()
def get_compass(self):
logger.debug('function get_compass start')
for i in range(0, max_attempts):
try:
# Get axes with z ["z"], y ["y"], x ["x"]
logger.debug('Returned compass info')
return self.sense.get_compass_raw()
except Exception as e:
logger.critical('Could not get compass data: {}'.format(format_exc()))
logger.debug('function get_compass end')
return None
def get_img(self):
logger.debug('function get_img start')
for i in range(0, max_attempts):
try:
logger.info('Captured image')
img = image.Image.capture_image()
return img
except Exception as e:
logger.critical('Could not get image: {}'.format(format_exc()))
logger.debug('function get_img end')
return None
def save_to_db(self, img_name, img_score, magnetic_field_raw):
logger.debug('function save_to_db start')
for i in range(0, max_attempts):
try:
logger.debug('Saving to db')
self.data_manager.insert_data(
img_name, img_score, magnetic_field_raw)
break
except Exception as e:
logger.critical('Could not save to database: {}'.format(format_exc()))
logger.debug('function save_to_db end')
return None
def remove_bad_score_img(self):
logger.debug('function remove_bad_score start')
for i in range(0, max_attempts):
try:
bad_row = self.data_manager.get_bad_score()
# 0 : id, 1 : img name
logger.info("Bad id: {}, Bad img name: {}".format(str(bad_row[0]), str(bad_row[1])))
self.data_manager.remove_img_size(bad_row[1])
self.data_manager.delete_img(bad_row[1])
self.data_manager.delete_row(bad_row[0])
break
except Exception as e:
logger.critical('Could not remove image: {}'.format(format_exc()))
logger.debug('function remove_bad_score start')
return None
def stop_prosses(self):
logger.info('function stop_prosess start')
self.stop = True
def manager(self):
'''Main loop function'''
logger.info('function manager start')
while (not self.stop) and (self.stop_time > datetime.utcnow()):
self.cycle += 1
self.sense.show_message(str(self.cycle))
logger.info("On cycle "+str(self.cycle))
logger.info("Getting compass")
compass_list = self.get_compass()
logger.info("Getting img")
img = self.get_img()
logger.info("Save to db")
self.save_to_db(img.id, img.score, compass_list)
self.data_manager.add_img_size(img.id) # Tracks file size
del compass_list, img # free memory
while not self.data_manager.storage_available():
logger.info("Remove bad img")
self.remove_bad_score_img()
self.data_manager.close()
logger.debug('function manager end')
if __name__ == "__main__":
main()