#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2018 # Matthias P. Braendli, matthias.braendli@mpb.li # # http://www.opendigitalradio.org # # This file is part of ODR-DabMod. # # ODR-DabMod is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # ODR-DabMod is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ODR-DabMod. If not, see . import configuration import os.path import cherrypy from cherrypy.process import wspbus, plugins import argparse from jinja2 import Environment, FileSystemLoader from api import API import zmqrc import dpd env = Environment(loader=FileSystemLoader('templates')) base_js = ["js/odr.js"] class Root: def __init__(self, config_file): self.config_file = config_file self.conf = configuration.Configuration(self.config_file) self.mod_rc = zmqrc.ModRemoteControl("localhost") self.api = API(self.mod_rc, cherrypy.engine) self.api.subscribe() @cherrypy.expose def index(self): raise cherrypy.HTTPRedirect('/home') @cherrypy.expose def about(self): tmpl = env.get_template("about.html") return tmpl.render(tab='about', js=base_js, is_login=False) @cherrypy.expose def home(self): tmpl = env.get_template("home.html") return tmpl.render(tab='home', js=base_js, is_login=False) @cherrypy.expose def rcvalues(self): tmpl = env.get_template("rcvalues.html") js = base_js + ["js/odr-rcvalues.js"] return tmpl.render(tab='rcvalues', js=js, is_login=False) @cherrypy.expose def modulator(self): tmpl = env.get_template("modulator.html") js = base_js + ["js/odr-modulator.js"] return tmpl.render(tab='modulator', js=js, is_login=False) @cherrypy.expose def predistortion(self): tmpl = env.get_template("predistortion.html") js = base_js + ["js/odr-predistortion.js"] return tmpl.render(tab='predistortion', js=js, is_login=False) class DPDPlugin(plugins.SimplePlugin): def __init__(self, bus): plugins.SimplePlugin.__init__(self, bus) self.dpd = dpd.DPD() def start(self): self.bus.subscribe("dpd-capture", self.trigger_capture) self.bus.subscribe("dpd-calibrate", self.trigger_calibrate) def stop(self): self.bus.unsubscribe("dpd-capture", self.trigger_capture) self.bus.unsubscribe("dpd-calibrate", self.trigger_calibrate) def trigger_capture(self, param): print("trigger_capture({})".format(param)) def trigger_calibrate(self, param): cherrypy.engine.publish('dpd-calibration-result', self.dpd.capture_calibration()) if __name__ == '__main__': parser = argparse.ArgumentParser(description='ODR-DabMod Web GUI') parser.add_argument('-c', '--config', default="ui-config.json", help='configuration filename') cli_args = parser.parse_args() config = configuration.Configuration(cli_args.config) if config.config is None: print("Configuration file is missing or is not readable - {}".format(cli_args.config)) sys.exit(1) if config.config['global']['daemon']: cherrypy.process.plugins.Daemonizer(cherrypy.engine).subscribe() accesslog = os.path.realpath(os.path.join(config.config['global']['logs_directory'], 'access.log')) errorlog = os.path.realpath(os.path.join(config.config['global']['logs_directory'], 'error.log')) cherrypy.config.update({ 'engine.autoreload.on': True, 'server.socket_host': config.config['global']['host'], 'server.socket_port': int(config.config['global']['port']), 'request.show_tracebacks' : True, 'tools.sessions.on': False, 'tools.encode.on': True, 'tools.encode.encoding': "utf-8", 'log.access_file': accesslog, 'log.error_file': errorlog, 'log.screen': True, }) staticdir = os.path.realpath(config.config['global']['static_directory']) DPDPlugin(cherrypy.engine).subscribe() cherrypy.tree.mount( Root(cli_args.config), config={ '/': { }, '/css': { 'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(staticdir, u"css/") }, '/js': { 'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(staticdir, u"js/") }, '/fonts': { 'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(staticdir, u"fonts/") }, '/favicon.ico': { 'tools.staticfile.on': True, 'tools.staticfile.filename': os.path.join(staticdir, u"fonts/favicon.ico") }, } ) cherrypy.engine.start() cherrypy.engine.block()