Log measurements
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -2,3 +2,5 @@
 | 
			
		||||
/.venv/
 | 
			
		||||
/.python-version
 | 
			
		||||
*.pyc
 | 
			
		||||
 | 
			
		||||
/logs/
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								load_controller/logger.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								load_controller/logger.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
			
		||||
import csv
 | 
			
		||||
import datetime
 | 
			
		||||
import sys
 | 
			
		||||
import time
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
from PySide6.QtCore import QObject, Signal, QTimer
 | 
			
		||||
 | 
			
		||||
from .bms import BMSData
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Logger(QObject):
 | 
			
		||||
    _data: BMSData
 | 
			
		||||
    _current: float
 | 
			
		||||
    _log_path: Path
 | 
			
		||||
    _start_time: float
 | 
			
		||||
 | 
			
		||||
    _timer: QTimer
 | 
			
		||||
 | 
			
		||||
    def __init__(self, bmsUpdated: Signal, currentUpdated: Signal):
 | 
			
		||||
        super().__init__(None)
 | 
			
		||||
 | 
			
		||||
        self._data = None
 | 
			
		||||
        self._current = None
 | 
			
		||||
 | 
			
		||||
        log_dir = Path(__file__).parent / ".." / "logs"
 | 
			
		||||
        if not log_dir.is_dir():
 | 
			
		||||
            log_dir.mkdir()
 | 
			
		||||
        self._log_path = log_dir / datetime.datetime.now().strftime(
 | 
			
		||||
            "%Y-%m-%d_%H:%M:%S.csv"
 | 
			
		||||
        )
 | 
			
		||||
        print(f"Logging to {self._log_path}")
 | 
			
		||||
        self._start_time = time.time()
 | 
			
		||||
 | 
			
		||||
        bmsUpdated.connect(self._updateBMS)
 | 
			
		||||
        currentUpdated.connect(self._updateCurrent)
 | 
			
		||||
 | 
			
		||||
        self._timer = QTimer()
 | 
			
		||||
        self._timer.timeout.connect(self._log_data)
 | 
			
		||||
        self._timer.start(500)
 | 
			
		||||
 | 
			
		||||
    def _log_data(self):
 | 
			
		||||
        if self._data is None or self._current is None:
 | 
			
		||||
            print("WARNING: no data to log", file=sys.stderr)
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        with open(self._log_path, "a") as fh:
 | 
			
		||||
            writer = csv.writer(fh)
 | 
			
		||||
            writer.writerow(
 | 
			
		||||
                [
 | 
			
		||||
                    time.time() - self._start_time,
 | 
			
		||||
                    self._data.error.value,
 | 
			
		||||
                    self._current,
 | 
			
		||||
                    *self._data.voltages,
 | 
			
		||||
                    *self._data.temperatures,
 | 
			
		||||
                ]
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
    def _updateBMS(self, data: BMSData):
 | 
			
		||||
        self._data = data
 | 
			
		||||
 | 
			
		||||
    def _updateCurrent(self, current: float):
 | 
			
		||||
        self._current = current
 | 
			
		||||
							
								
								
									
										2
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.py
									
									
									
									
									
								
							@ -8,6 +8,7 @@ from PySide6.QtWidgets import QApplication
 | 
			
		||||
 | 
			
		||||
from load_controller.gui import GUI
 | 
			
		||||
from load_controller.load import Load
 | 
			
		||||
from load_controller.logger import Logger
 | 
			
		||||
from load_controller.profile_handler import ProfileHandler
 | 
			
		||||
from load_controller.temperatures import Temperatures
 | 
			
		||||
from load_controller.bms import BMSEvalBoard
 | 
			
		||||
@ -29,6 +30,7 @@ def main(argv: list[str]) -> int:
 | 
			
		||||
    bms_thread.started.connect(bms.do_work)
 | 
			
		||||
    bms_thread.start()
 | 
			
		||||
 | 
			
		||||
    logger = Logger(bms.dataUpdated, profile_handler.currentChanged)
 | 
			
		||||
    gui = GUI(profile_handler, bms.dataUpdated)
 | 
			
		||||
 | 
			
		||||
    return app.exec()
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user