load-controller/load_controller/logger.py

66 lines
1.7 KiB
Python

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.current,
self._data.current_integrated,
*self._data.voltages,
*self._data.temperatures,
]
)
def _updateBMS(self, data: BMSData):
self._data = data
def _updateCurrent(self, current: float):
self._current = current