import json import time import sys from PIL import Image, ImageDraw from map_plot import image_filename, c2s_x, c2s_y from gps import GPS gps = GPS() CSIZE = 2 SEC = 60 img = Image.open('map_img/' + image_filename) draw = ImageDraw.Draw(img) t0 = 1435421469 t1 = 1435441950 for t in range(t0, t1, SEC): pos = gps.get(t) x = c2s_x(pos['long']) y = c2s_y(pos['lat']) draw.ellipse((x - CSIZE, y - CSIZE, x + CSIZE, y + CSIZE), outline=0) img.show()
mount_disk() while gps.date is None: logger.warning("Waiting for GPS for date") time.sleep(1.0) today = gps.date.strftime("%Y-%m-%d") existing = len([1 for i in os.listdir(DISK) if i.startswith(today)]) base = os.path.join(DISK, today + "_%s.log" % existing) logger.info("Saving in %s" % base) cnt = 0 now = datetime.datetime(gps.date.year, gps.date.month, gps.date.day, gps.time.hour, gps.time.minute, gps.time.second) header = [ "#started on %s UTC" % now.strftime("%c"), "#%8s %21s %13s %20s" % ("Time", gps.get("header"), sds.get("header"), dht.get("header")), "" ] with open(base, "w") as logfile: logfile.write(os.linesep.join(header)) while not quit_event.is_set(): try: data = "%8s %21s %13s %20s" % ( gps.time.isoformat(), gps.get("text"), sds.get("text"), dht.get("text")) logger.info(data) logfile.write(data + os.linesep) cnt += 1 if cnt % 60 == 0: logger.info("flush") logfile.flush()
class Main(responder.API): def __init__(self, *, port: str, baudrate: int, path: str = 'db', bs: int = 32, to: int = 5, http: int = 8080): super().__init__() pid = os.getpid() logger.info('*** NMEA Recorder startup (%d)' % pid) self.process: Dict[str, int] = {} self.process['main'] = pid self.ppp: Dict[str, Patrol] = {} self.ppp['main'] = Patrol(pid=pid) self.ready: bool = True self.g = GPS() self.ws = WebsocketServer(debug=True) self.qp = Queue() self.dbsession = DBSession(path=pathlib.Path(path), buffersize=bs, timeout=to) self.dbsession.start() self.process[self.dbsession.name] = self.dbsession.pid self.ppp[self.dbsession.name] = Patrol(pid=self.dbsession.pid) self.receiver = Receiver(port=port, baudrate=baudrate, qp=self.qp) self.receiver.start() self.process[self.receiver.name] = self.receiver.pid self.ppp[self.receiver.name] = Patrol(pid=self.receiver.pid) self.mc = fromUDP(quePoint=self.qp, mcip='239.192.0.1', mcport=60001) self.mc.start() self.process[self.mc.name] = self.mc.pid self.ppp[self.mc.name] = Patrol(pid=self.mc.pid) self.main = Thread(target=self.collector, name='MainLoop', daemon=True) self.main.start() self.p = Thread(target=self.patrol, name='Patrol', daemon=True) self.p.start() for k, v in self.ppp.items(): v.start() self.add_route('/ws', self.ws.wsserver, websocket=True) self.add_route('/', self.top) self.add_route('/main.js', self.mainJS) self.add_route('/classes.js', self.classes) self.add_event_handler('shutdown', self.cleanup) # notice! self.run(address='0.0.0.0', port=http) async def cleanup(self): self.dbsession.join() self.receiver.join() self.mc.join() logger.debug('... OK! shutdown') def top(self, req: responder.Request, resp: responder.Response): resp.content = self.template('index.html') def classes(self, req: responder.Request, resp: responder.Response): resp.content = self.template('classes.js') def mainJS(self, req: responder.Request, resp: responder.Response): resp.content = self.template('main.js') def collector(self): loop: bool = True try: while loop: try: raw: bytes = self.receiver.qp.get() except (KeyboardInterrupt, ) as e: break else: self.dbsession.qp.put(raw) part = raw.split(b'*') if len(part) > 1: main = part[0][1:] csum = int(part[1][:2], 16) calc = reduce(xor, main, 0) if calc != csum: logger.error('!!! bad checksum') else: item = main.split(b',') symbol = item[0] prefix = symbol[0:2] suffix = symbol[2:5] if prefix == b'GP': if suffix == b'RMC': location = self.g.get(item=item) ooo = { 'type': 'location', 'info': asdict(location) } self.ws.broadcast(message=json.dumps(ooo)) if location.valid: print(location) except KeyboardInterrupt as e: loop = False def patrol(self): loop: bool = True try: while loop: time.sleep(5) stats = {'type': 'stats', 'info': {}} # logger.info('--------------------------------------------------------------------') for k, v in self.ppp.items(): stats['info'][k] = asdict(v.stats) # logger.info(stats) self.ws.broadcast(message='%s' % json.dumps(stats, indent=2)) except KeyboardInterrupt as e: loop = False