Skip to content

Commit

Permalink
Make the persistent config more modular and simpler
Browse files Browse the repository at this point in the history
  • Loading branch information
bjpirt committed Dec 21, 2023
1 parent cf71c64 commit fb6a4c8
Show file tree
Hide file tree
Showing 19 changed files with 128 additions and 320 deletions.
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
Expand Down Expand Up @@ -130,6 +129,5 @@ dmypy.json
.picowgo
.vscode
build/out
config.json
config_json.py
initial_config.py
ui/node_modules
36 changes: 0 additions & 36 deletions config.default.json

This file was deleted.

56 changes: 5 additions & 51 deletions config.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,9 @@
import os
import json
from lib import PersistentConfig
from initial_config import config


def exists(filename: str) -> bool:
try:
os.stat(filename)
return True
except OSError:
return False


class Config:
def __init__(self, file="config.json"):
self.__file = file
class Config (PersistentConfig):
def __init__(self):
# Initialise the defaults

# The number of modules in the pack
Expand Down Expand Up @@ -127,7 +118,7 @@ def __init__(self, file="config.json"):
# How long between sending a full update
self.mqtt_full_output_interval: float = 120.0

self.read()
super().__init__(config)

@property
def high_voltage_alert_level(self):
Expand All @@ -144,40 +135,3 @@ def low_voltage_alert_level(self):
@property
def low_voltage_fault_level(self):
return self.cell_low_voltage_setpoint - self.voltage_fault_offset

def get_dict(self):
return {k: v for k, v in self.__dict__.items() if not k.startswith("_")}

def read(self):
data = None
if exists(self.__file):
with open(self.__file, 'r', encoding="UTF-8") as file:
data = file.read()
else:
try:
# pylint: disable=E0401
import config_json # type: ignore
data = bytearray(config_json.data()).decode()
except ModuleNotFoundError:
print("Error reading default python config")

if data:
new_config = json.loads(data)
self.update(new_config)

def set_value(self, key: str, value):
if hasattr(self, key):
if type(getattr(self, key)) == type(value) or type(value) == type(None):
setattr(self, key, value)
else:
print(f"Config types did not match: {key} ({type(getattr(self, key))}) ({type(value)})")
else:
print("Attribute does not exist")

def update(self, new_config: dict) -> None:
for (key, value) in new_config.items():
self.set_value(key, value)

def save(self):
with open(self.__file, 'w', encoding="utf-8") as file:
json.dump(self.get_dict(), file)
1 change: 1 addition & 0 deletions lib/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .persistent_config import PersistentConfig as PersistentConfig
48 changes: 48 additions & 0 deletions lib/persistent_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import os
import json


def exists(filename: str) -> bool:
try:
os.stat(filename)
return True
except OSError:
return False


class PersistentConfig:
def __init__(self, initial_config={}, file="config.json"):
self.__file = file

self.update(initial_config)
self.read()

def get_dict(self):
return {k: v for k, v in self.__dict__.items() if not k.startswith("_")}

def read(self):
data = None
if exists(self.__file):
with open(self.__file, 'r', encoding="UTF-8") as file:
data = file.read()
if data:
new_config = json.loads(data)
self.update(new_config)

def set_value(self, key: str, value):
if hasattr(self, key):
if type(getattr(self, key)) == type(value) or type(value) == type(None):
setattr(self, key, value)
else:
print(
f"Config types did not match: {key} ({type(getattr(self, key))}) ({type(value)})")
else:
print("Attribute does not exist")

def update(self, new_config: dict) -> None:
for (key, value) in new_config.items():
self.set_value(key, value)

def save(self):
with open(self.__file, 'w', encoding="utf-8") as file:
json.dump(self.get_dict(), file)
2 changes: 1 addition & 1 deletion platforms/cpython/pyBms.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
baud = int(sys.argv[2])

serialPort = serial.Serial(port, baud, timeout=0.1)
config = Config("config.local.json")
config = Config()
gateway = TeslaModelSNetworkGateway(serialPort, config)
pack = TeslaModelSBatteryPack(gateway, config)
bms = Bms(pack, config)
Expand Down
154 changes: 0 additions & 154 deletions scripts/data_to_py.py

This file was deleted.

4 changes: 2 additions & 2 deletions test/battery/tesla_model_s/test_TeslaModelSBatteryModule.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ def write_register(self, address: int, register: int, value: int, attempts: int
class TeslaModelSBatteryModuleTestCase(unittest.TestCase):

def setUp(self):
c = Config("config.default.json")
self.mockGateway = FakeGateway(None, Config("config.default.json"))
c = Config()
self.mockGateway = FakeGateway(None, Config())
self.mockGateway.write_register = MagicMock(return_value=True)
self.module = TeslaModelSBatteryModule(1, self.mockGateway, c)
return super().setUp()
Expand Down
4 changes: 2 additions & 2 deletions test/battery/tesla_model_s/test_TeslaModelSBatteryPack.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ def write_register(self, address: int, register: int, value: int, attempts: int
class TeslaModelSBatteryPackTestCase(unittest.TestCase):

def setUp(self):
self.mockGateway = FakeGateway(None, Config("config.default.json"))
self.mockGateway = FakeGateway(None, Config())
self.mockGateway.write_register = MagicMock(return_value=True)
self.config = Config("config.default.json")
self.config = Config()
self.config.module_count = 2
return super().setUp()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def setUp(self):
self.serial = FakeSerial()
self.serial.write = MagicMock()
self.gateway = TeslaModelSNetworkGateway(
self.serial, Config("config.default.json"))
self.serial, Config())
return super().setUp()

def test_write_register(self):
Expand Down
2 changes: 1 addition & 1 deletion test/battery/test_BatteryCell.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

class BatteryCellTestCase(unittest.TestCase):
def setUp(self):
c = Config("config.default.json")
c = Config()
c.over_voltage_hysteresis_time = 0.01
self.cell = BatteryCell(c)

Expand Down
2 changes: 1 addition & 1 deletion test/battery/test_BatteryModule.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

class BatteryModuleTestCase(unittest.TestCase):
def setUp(self):
c = Config("config.default.json")
c = Config()
c.over_voltage_hysteresis_time = 0.01
self.module = BatteryModule(c)
for i in range(4):
Expand Down
2 changes: 1 addition & 1 deletion test/battery/test_BatteryPack.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

class BatteryPackTestCase(unittest.TestCase):
def setUp(self):
self.config = Config("config.default.json")
self.config = Config()
self.config.parallel_string_count = 2
self.config.over_voltage_hysteresis_time = 0.01
self.pack = BatteryPack(self.config)
Expand Down
Loading

0 comments on commit fb6a4c8

Please sign in to comment.