Skip to content
Snippets Groups Projects
Commit 41db7e82 authored by Andreas Bolin's avatar Andreas Bolin
Browse files

added a logger

parent 21a75cb1
No related branches found
No related tags found
1 merge request!78Add scheduler GUI
Pipeline #72724 passed
This commit is part of merge request !78. Comments created here will be created in the context of that merge request.
...@@ -111,5 +111,6 @@ _b_asic_debug_log.txt ...@@ -111,5 +111,6 @@ _b_asic_debug_log.txt
.qt_for_python/ .qt_for_python/
*.pyproject.user *.pyproject.user
*.pyproject *.pyproject
*/scheduler-gui/ui/ ui_*.py
TODO.txt TODO.txt
\ No newline at end of file *.log
\ No newline at end of file
...@@ -2,5 +2,10 @@ ...@@ -2,5 +2,10 @@
Graphical user interface for B-ASIC scheduler. Graphical user interface for B-ASIC scheduler.
""" """
from b_asic.schedule-gui.main_window import *
from b_asic.schedule-gui.schedule import * from .main_window import *
\ No newline at end of file from .scheduler import *
#__all__ = ['main_window', 'scheduler']
__version__ = '0.1'
__author__ = 'Andreas Bolin'
# This Python file uses the following encoding: utf-8
""" B-ASIC Scheduler-gui Logger Module.
Contains a logger that logs to the console and a file using levels. It is based
on the `logging` module and has predefined levels of logging.
Usage:
------
>>> import logger
>>> log = logger.getLogger()
>>> log.info('This is a log post with level INFO')
| Function call | Level | Numeric value |
|----------------|-----------|---------------|
| debug(str) | DEBUG | 10 |
| info(str) | INFO | 20 |
| warning(str) | WARNING | 30 |
| error(str) | ERROR | 40 |
| critical(str) | CRITICAL | 50 |
| exception(str) | ERROR | 40 |
The last `exception(str)` is used to capture exceptions output, that normally
won't be captured.
See https://docs.python.org/3/howto/logging.html for more information.
"""
from logging import Logger
import logging
import logging.handlers
import os
import sys
def getLogger(name: str='scheduler-gui.log', loglevel: str='DEBUG') -> Logger:
"""This function creates console- and filehandler and from those, creates a logger object.
Args:
name (str, optional): Logger-id and output filename. Defaults to 'scheduler-gui.log'.
loglevel (str, optional): The minimum level that the logger will log. Defaults to 'DEBUG'.
Returns:
Logger: 'logging.Logger' object.
"""
logger = logging.getLogger(name)
# if logger 'name' already exists, return it to avoid logging duplicate
# messages by attaching multiple handlers of the same type
if logger.handlers:
return logger
# if logger 'name' does not already exist, create it and attach handlers
else:
# set logLevel to loglevel or to INFO if requested level is incorrect
loglevel = getattr(logging, loglevel.upper(), logging.DEBUG)
logger.setLevel(loglevel)
# setup the console logger
c_fmt_date = '%T'
c_fmt = '[%(process)d] %(asctime)s %(filename)18s:%(lineno)-4s %(funcName)18s() %(levelname)-8s: %(message)s'
c_formatter = logging.Formatter(c_fmt, c_fmt_date)
c_handler = logging.StreamHandler()
c_handler.setFormatter(c_formatter)
c_handler.setLevel(logging.WARNING)
logger.addHandler(c_handler)
# setup the file logger
f_fmt_date = '%Y-%m-%dT%T%Z'
f_fmt = '%(asctime)s %(filename)18s:%(lineno)-4s %(funcName)18s() %(levelname)-8s: %(message)s'
f_formatter = logging.Formatter(f_fmt, f_fmt_date)
f_handler = logging.FileHandler(name, mode = 'w')
f_handler.setFormatter(f_formatter)
f_handler.setLevel(logging.DEBUG)
logger.addHandler(f_handler)
if logger.name == 'scheduler-gui.log':
logger.info('Running: %s %s',
os.path.basename(sys.argv[0]),
' '.join(sys.argv[1:]))
return logger
...@@ -13,6 +13,7 @@ from pathlib import Path ...@@ -13,6 +13,7 @@ from pathlib import Path
from typing import Any from typing import Any
#from matplotlib.pyplot import bar #from matplotlib.pyplot import bar
#from diagram import * #from diagram import *
import logger
import qtpy import qtpy
from qtpy import uic, QtCore, QtGui, QtWidgets from qtpy import uic, QtCore, QtGui, QtWidgets
...@@ -33,6 +34,8 @@ from qtpy.QtCore import ( ...@@ -33,6 +34,8 @@ from qtpy.QtCore import (
QRect) QRect)
log = logger.getLogger()
# Debug struff # Debug struff
if __debug__: if __debug__:
# Print some system version information # Print some system version information
...@@ -50,16 +53,19 @@ if __debug__: ...@@ -50,16 +53,19 @@ if __debug__:
# Autocompile the .ui form to a python file. # Autocompile the .ui form to a python file.
try: # PyQt5, try autocompile try: # PyQt5, try autocompile
from qtpy.uic import compileUiDir from qtpy.uic import compileUiDir
def _map_func(dir: str, file: str) -> tuple[str, str]: # def _map_func(dir: str, file: str) -> tuple[str, str]:
file_base,_ = os.path.splitext(file) # file_base,_ = os.path.splitext(file)
return (dir+'/ui/', file_base+'_ui.py') # return (dir+'/ui/', file_base+'_ui.py')
uic.compileUiDir('.', False, _map_func) # uic.compileUiDir('.', map=_map_func)
uic.compileUiDir('.', map=(lambda dir,file: dir, 'ui_' + file))
except: except:
try: # PySide2, try manual compile try: # PySide2, try manual compile
import subprocess import subprocess
OS = sys.platform os_ = sys.platform
if OS.startswith('linux'): if os_.startswith('linux'):
cmds = ["mkdir -p ui", "pyside2-uic -o ui/main_window_ui.py main_window.ui"] cmds = ["mkdir -p ui",
"pyside2-uic -o ui_main_window.py main_window.ui"]
for cmd in cmds: for cmd in cmds:
subprocess.call(cmd.split()) subprocess.call(cmd.split())
else: else:
...@@ -67,14 +73,14 @@ if __debug__: ...@@ -67,14 +73,14 @@ if __debug__:
raise SystemExit raise SystemExit
except: # Compile failed, look for pre-compiled file except: # Compile failed, look for pre-compiled file
try: try:
from ui.main_window_ui import Ui_MainWindow from ui_main_window import Ui_MainWindow
except: # Everything failed, exit except: # Everything failed, exit
print("ERROR: Could not import 'Ui_MainWindow'.") log.exception("Could not import 'Ui_MainWindow'.")
print("ERROR: Can't autocompile under", QT_API, "eviroment. Try to manual compile 'main_window.ui' to 'ui/main_window_ui.py'") log.exception("Can't autocompile under", QT_API, "eviroment. Try to manual compile 'main_window.ui' to 'ui/main_window_ui.py'")
os._exit(1) os._exit(1)
# Only availible when the form is compiled
from ui.main_window_ui import Ui_MainWindow from ui_main_window import Ui_MainWindow # Only availible when the form is compiled
...@@ -84,17 +90,16 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -84,17 +90,16 @@ class MainWindow(QMainWindow, Ui_MainWindow):
_settings: QSettings _settings: QSettings
def __init__(self): def __init__(self):
"""Initialize Schedule-gui.""" """Initialize Schedule-gui."""
super(MainWindow, self).__init__() super(MainWindow, self).__init__()
self._init_ui() self._init_ui()
self._init_graphics_view() self._init_graphics_view()
def _init_ui(self) -> None: def _init_ui(self) -> None:
"""Initialize the ui""" """Initialize the ui"""
self._settings = QSettings() self._settings = QSettings()
self.setupUi(self) self.setupUi(self)
...@@ -103,7 +108,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -103,7 +108,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.menu_load_sfg.triggered.connect(self.open) self.menu_load_sfg.triggered.connect(self.open)
self.menu_save_schedule.triggered.connect(self.save) self.menu_save_schedule.triggered.connect(self.save)
self.menu_quit.triggered.connect(self.close) self.menu_quit.triggered.connect(self.close)
self.menu_node_info.triggered.connect(self._toggle_component_info) self.menu_node_info.triggered.connect(self.toggle_component_info)
self.splitter_center.splitterMoved.connect(self._splitter_center_moved) self.splitter_center.splitterMoved.connect(self._splitter_center_moved)
# Setup event member functions # Setup event member functions
...@@ -121,7 +126,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -121,7 +126,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.splitter_center.setCollapsible(1, True) self.splitter_center.setCollapsible(1, True)
def _init_graphics_view(self) -> None: def _init_graphics_view(self) -> None:
"""Initialize the QGraphics""" """Initialize the QGraphics framework"""
self.graphic_scene = QGraphicsScene(self) self.graphic_scene = QGraphicsScene(self)
self.graphic_view.setScene(self.graphic_scene) self.graphic_view.setScene(self.graphic_scene)
self.graphic_view.setRenderHint(QPainter.Antialiasing) self.graphic_view.setRenderHint(QPainter.Antialiasing)
...@@ -153,7 +158,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -153,7 +158,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.update_statusbar(self.tr('Schedule saved successfully')) self.update_statusbar(self.tr('Schedule saved successfully'))
@Slot(bool) @Slot(bool)
def _toggle_component_info(self, checked: bool) -> None: def toggle_component_info(self, checked: bool) -> None:
"""This method toggles the right hand side info window.""" """This method toggles the right hand side info window."""
widths = list(self.splitter_center.sizes()) widths = list(self.splitter_center.sizes())
max_range = widths[0] + widths[1] max_range = widths[0] + widths[1]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment