Skip to content

Commit f5282cc

Browse files
authored
Merge pull request #80 from utdrmac/ruff_linting
Ruff linting 2.0 order imports & normalize quotes to "
2 parents 629af3e + b017bbd commit f5282cc

22 files changed

+457
-422
lines changed

classes/protocol_settings.py

Lines changed: 135 additions & 131 deletions
Large diffs are not rendered by default.

classes/transports/canbus.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
1-
import re
2-
import time
3-
import can
41
import asyncio
5-
import threading
6-
import platform
72
import os
3+
import platform
4+
import re
5+
import threading
6+
import time
7+
from collections import OrderedDict
8+
from typing import TYPE_CHECKING
89

10+
import can
911

12+
from defs.common import strtoint
1013

14+
from ..protocol_settings import Registry_Type, protocol_settings, registry_map_entry
1115
from .transport_base import transport_base
12-
from ..protocol_settings import Registry_Type, registry_map_entry, protocol_settings
13-
from defs.common import strtoint
14-
from collections import OrderedDict
1516

16-
from typing import TYPE_CHECKING
1717
if TYPE_CHECKING:
1818
from configparser import SectionProxy
1919

2020
class canbus(transport_base):
2121
''' canbus is a more passive protocol; todo to include active commands to trigger canbus responses '''
2222

23-
interface : str = 'socketcan'
23+
interface : str = "socketcan"
2424
''' bustype / interface for canbus device '''
2525

26-
port : str = ''
26+
port : str = ""
2727
''' 'can0' '''
2828

2929
baudrate : int = 500000
@@ -55,11 +55,11 @@ class canbus(transport_base):
5555
linux : bool = True
5656

5757

58-
def __init__(self, settings : 'SectionProxy', protocolSettings : 'protocol_settings' = None):
58+
def __init__(self, settings : "SectionProxy", protocolSettings : "protocol_settings" = None):
5959
super().__init__(settings, protocolSettings=protocolSettings)
6060

6161
#check if running on windows or linux
62-
self.linux = platform.system() != 'Windows'
62+
self.linux = platform.system() != "Windows"
6363

6464

6565
self.port = settings.get(["port", "channel"], "")
@@ -107,6 +107,7 @@ def setup_socketcan(self):
107107
print("socketcan setup not implemented for windows")
108108
return
109109

110+
# ruff: noqa: S605, S607
110111
self._log.info("restart and configure socketcan")
111112
os.system("ip link set can0 down")
112113
os.system("ip link set can0 type can restart-ms 100")
@@ -118,11 +119,12 @@ def is_socketcan_up(self) -> bool:
118119
return True
119120

120121
try:
121-
with open(f'/sys/class/net/{self.port}/operstate', 'r') as f:
122+
with open(f"/sys/class/net/{self.port}/operstate", "r") as f:
122123
state = f.read().strip()
123-
return state == 'up'
124124
except FileNotFoundError:
125125
return False
126+
else:
127+
return state == "up"
126128

127129
def start_loop(self):
128130
self.read_bus(self.bus)
@@ -182,30 +184,30 @@ def init_after_connect(self):
182184

183185
def read_serial_number(self) -> str:
184186
''' not so simple in canbus'''
185-
return ''
187+
return ""
186188
serial_number = str(self.read_variable("Serial Number", Registry_Type.HOLDING))
187189
print("read SN: " +serial_number)
188190
if serial_number:
189191
return serial_number
190192

191193
sn2 = ""
192194
sn3 = ""
193-
fields = ['Serial No 1', 'Serial No 2', 'Serial No 3', 'Serial No 4', 'Serial No 5']
195+
fields = ["Serial No 1", "Serial No 2", "Serial No 3", "Serial No 4", "Serial No 5"]
194196
for field in fields:
195197
self._log.info("Reading " + field)
196198
registry_entry = self.protocolSettings.get_holding_registry_entry(field)
197199
if registry_entry is not None:
198200
self._log.info("Reading " + field + "("+str(registry_entry.register)+")")
199201
data = self.read_modbus_registers(registry_entry.register, registry_type=Registry_Type.HOLDING)
200-
if not hasattr(data, 'registers') or data.registers is None:
202+
if not hasattr(data, "registers") or data.registers is None:
201203
self._log.critical("Failed to get serial number register ("+field+") ; exiting")
202204
exit()
203205

204206
serial_number = serial_number + str(data.registers[0])
205207

206-
data_bytes = data.registers[0].to_bytes((data.registers[0].bit_length() + 7) // 8, byteorder='big')
207-
sn2 = sn2 + str(data_bytes.decode('utf-8'))
208-
sn3 = str(data_bytes.decode('utf-8')) + sn3
208+
data_bytes = data.registers[0].to_bytes((data.registers[0].bit_length() + 7) // 8, byteorder="big")
209+
sn2 = sn2 + str(data_bytes.decode("utf-8"))
210+
sn3 = str(data_bytes.decode("utf-8")) + sn3
209211

210212
time.sleep(self.modbus_delay*2) #sleep inbetween requests so modbus can rest
211213

@@ -257,7 +259,7 @@ def read_variable(self, variable_name : str, registry_type : Registry_Type, entr
257259
''' read's variable from cache'''
258260
##clean for convinecne
259261
if variable_name:
260-
variable_name = variable_name.strip().lower().replace(' ', '_')
262+
variable_name = variable_name.strip().lower().replace(" ", "_")
261263

262264
registry_map = self.protocolSettings.get_registry_map(registry_type)
263265

classes/transports/modbus_base.py

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,20 @@
33
import os
44
import re
55
import time
6+
from typing import TYPE_CHECKING
7+
68
from pymodbus.exceptions import ModbusIOException
79

8-
from .transport_base import transport_base
9-
from ..protocol_settings import Data_Type, Registry_Type, registry_map_entry, protocol_settings
1010
from defs.common import strtobool
1111

12-
from typing import TYPE_CHECKING
12+
from ..protocol_settings import (
13+
Data_Type,
14+
Registry_Type,
15+
protocol_settings,
16+
registry_map_entry,
17+
)
18+
from .transport_base import transport_base
19+
1320
if TYPE_CHECKING:
1421
from configparser import SectionProxy
1522
try:
@@ -22,7 +29,7 @@ class modbus_base(transport_base):
2229

2330

2431
#this is specifically static
25-
clients : dict[str, 'BaseModbusClient'] = {}
32+
clients : dict[str, "BaseModbusClient"] = {}
2633
''' str is identifier, dict of clients when multiple transports use the same ports '''
2734

2835
#non-static here for reference, type hinting, python bs ect...
@@ -42,27 +49,27 @@ class modbus_base(transport_base):
4249
send_holding_register : bool = True
4350
send_input_register : bool = True
4451

45-
def __init__(self, settings : 'SectionProxy', protocolSettings : 'protocol_settings' = None):
52+
def __init__(self, settings : "SectionProxy", protocolSettings : "protocol_settings" = None):
4653
super().__init__(settings)
4754

48-
self.analyze_protocol_enabled = settings.getboolean('analyze_protocol', fallback=self.analyze_protocol_enabled)
49-
self.analyze_protocol_save_load = settings.getboolean('analyze_protocol_save_load', fallback=self.analyze_protocol_save_load)
55+
self.analyze_protocol_enabled = settings.getboolean("analyze_protocol", fallback=self.analyze_protocol_enabled)
56+
self.analyze_protocol_save_load = settings.getboolean("analyze_protocol_save_load", fallback=self.analyze_protocol_save_load)
5057

5158

5259
#get defaults from protocol settings
53-
if 'send_input_register' in self.protocolSettings.settings:
54-
self.send_input_register = strtobool(self.protocolSettings.settings['send_input_register'])
60+
if "send_input_register" in self.protocolSettings.settings:
61+
self.send_input_register = strtobool(self.protocolSettings.settings["send_input_register"])
5562

56-
if 'send_holding_register' in self.protocolSettings.settings:
57-
self.send_holding_register = strtobool(self.protocolSettings.settings['send_holding_register'])
63+
if "send_holding_register" in self.protocolSettings.settings:
64+
self.send_holding_register = strtobool(self.protocolSettings.settings["send_holding_register"])
5865

59-
if 'batch_delay' in self.protocolSettings.settings:
60-
self.modbus_delay = float(self.protocolSettings.settings['batch_delay'])
66+
if "batch_delay" in self.protocolSettings.settings:
67+
self.modbus_delay = float(self.protocolSettings.settings["batch_delay"])
6168

6269
#allow enable/disable of which registers to send
63-
self.send_holding_register = settings.getboolean('send_holding_register', fallback=self.send_holding_register)
64-
self.send_input_register = settings.getboolean('send_input_register', fallback=self.send_input_register)
65-
self.modbus_delay = settings.getfloat(['batch_delay', 'modbus_delay'], fallback=self.modbus_delay)
70+
self.send_holding_register = settings.getboolean("send_holding_register", fallback=self.send_holding_register)
71+
self.send_input_register = settings.getboolean("send_input_register", fallback=self.send_input_register)
72+
self.modbus_delay = settings.getfloat(["batch_delay", "modbus_delay"], fallback=self.modbus_delay)
6673
self.modbus_delay_setting = self.modbus_delay
6774

6875

@@ -94,22 +101,22 @@ def read_serial_number(self) -> str:
94101

95102
sn2 = ""
96103
sn3 = ""
97-
fields = ['Serial No 1', 'Serial No 2', 'Serial No 3', 'Serial No 4', 'Serial No 5']
104+
fields = ["Serial No 1", "Serial No 2", "Serial No 3", "Serial No 4", "Serial No 5"]
98105
for field in fields:
99106
self._log.info("Reading " + field)
100107
registry_entry = self.protocolSettings.get_holding_registry_entry(field)
101108
if registry_entry is not None:
102109
self._log.info("Reading " + field + "("+str(registry_entry.register)+")")
103110
data = self.read_modbus_registers(registry_entry.register, registry_type=Registry_Type.HOLDING)
104-
if not hasattr(data, 'registers') or data.registers is None:
111+
if not hasattr(data, "registers") or data.registers is None:
105112
self._log.critical("Failed to get serial number register ("+field+") ; exiting")
106113
exit()
107114

108115
serial_number = serial_number + str(data.registers[0])
109116

110-
data_bytes = data.registers[0].to_bytes((data.registers[0].bit_length() + 7) // 8, byteorder='big')
111-
sn2 = sn2 + str(data_bytes.decode('utf-8'))
112-
sn3 = str(data_bytes.decode('utf-8')) + sn3
117+
data_bytes = data.registers[0].to_bytes((data.registers[0].bit_length() + 7) // 8, byteorder="big")
118+
sn2 = sn2 + str(data_bytes.decode("utf-8"))
119+
sn3 = str(data_bytes.decode("utf-8")) + sn3
113120

114121
time.sleep(self.modbus_delay*2) #sleep inbetween requests so modbus can rest
115122

@@ -171,7 +178,7 @@ def read_data(self) -> dict[str, str]:
171178

172179
return info
173180

174-
def validate_protocol(self, protocolSettings : 'protocol_settings') -> float:
181+
def validate_protocol(self, protocolSettings : "protocol_settings") -> float:
175182
score_percent = self.validate_registry(Registry_Type.HOLDING)
176183
return score_percent
177184

@@ -197,13 +204,13 @@ def validate_registry(self, registry_type : Registry_Type = Registry_Type.INPUT)
197204
self._log.info("validation score: " + str(score) + " of " + str(maxScore) + " : " + str(round(percent)) + "%")
198205
return percent
199206

200-
def analyze_protocol(self, settings_dir : str = 'protocols'):
207+
def analyze_protocol(self, settings_dir : str = "protocols"):
201208
print("=== PROTOCOL ANALYZER ===")
202209
protocol_names : list[str] = []
203210
protocols : dict[str,protocol_settings] = {}
204211

205212
for file in glob.glob(settings_dir + "/*.json"):
206-
file = file.lower().replace(settings_dir, '').replace('/', '').replace('\\', '').replace('\\', '').replace('.json', '')
213+
file = file.lower().replace(settings_dir, "").replace("/", "").replace("\\", "").replace("\\", "").replace(".json", "")
207214
print(file)
208215
protocol_names.append(file)
209216

@@ -276,7 +283,7 @@ def analyze_protocol(self, settings_dir : str = 'protocols'):
276283
def evaluate_score(entry : registry_map_entry, val):
277284
score = 0
278285
if entry.data_type == Data_Type.ASCII:
279-
if val and not re.match('[^a-zA-Z0-9_-]', val): #validate ascii
286+
if val and not re.match("[^a-zA-Z0-9_-]", val): #validate ascii
280287
mod = 1
281288
if entry.concatenate:
282289
mod = len(entry.concatenate_registers)
@@ -357,10 +364,12 @@ def write_variable(self, entry : registry_map_entry, value : str, registry_type
357364
current_value = current_registers[entry.register]
358365

359366
if not self.protocolSettings.validate_registry_entry(entry, current_value):
360-
raise ValueError(f"Invalid value in register '{current_value}'. Unsafe to write")
367+
err = f"Invalid value in register '{current_value}'. Unsafe to write"
368+
raise ValueError(err)
361369

362370
if not self.protocolSettings.validate_registry_entry(entry, value):
363-
raise ValueError(f"Invalid new value, '{value}'. Unsafe to write")
371+
err = f"Invalid new value, '{value}'. Unsafe to write"
372+
raise ValueError(err)
364373

365374
#handle codes
366375
if entry.variable_name+"_codes" in self.protocolSettings.codes:
@@ -410,7 +419,7 @@ def write_variable(self, entry : registry_map_entry, value : str, registry_type
410419
def read_variable(self, variable_name : str, registry_type : Registry_Type, entry : registry_map_entry = None):
411420
##clean for convinecne
412421
if variable_name:
413-
variable_name = variable_name.strip().lower().replace(' ', '_')
422+
variable_name = variable_name.strip().lower().replace(" ", "_")
414423

415424
registry_map = self.protocolSettings.get_registry_map(registry_type)
416425

@@ -476,7 +485,7 @@ def read_modbus_registers(self, ranges : list[tuple] = None, start : int = 0, en
476485

477486
if isinstance(register, bytes) or register.isError() or isError: #sometimes weird errors are handled incorrectly and response is a ascii error string
478487
if isinstance(register, bytes):
479-
self._log.error(register.decode('utf-8'))
488+
self._log.error(register.decode("utf-8"))
480489
else:
481490
self._log.error(register.__str__)
482491
self.modbus_delay += self.modbus_delay_increament #increase delay, error is likely due to modbus being busy

classes/transports/modbus_rtu.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
1-
from classes.protocol_settings import Registry_Type, protocol_settings
2-
31
import inspect
42

3+
from classes.protocol_settings import Registry_Type, protocol_settings
54

65
try:
76
from pymodbus.client.sync import ModbusSerialClient
87
except ImportError:
98
from pymodbus.client import ModbusSerialClient
109

1110

12-
from .modbus_base import modbus_base
1311
from configparser import SectionProxy
12+
1413
from defs.common import find_usb_serial_port, get_usb_serial_port_info, strtoint
1514

15+
from .modbus_base import modbus_base
16+
17+
1618
class modbus_rtu(modbus_base):
1719
port : str = "/dev/ttyUSB0"
1820
addresses : list[int] = []
1921
baudrate : int = 9600
2022
client : ModbusSerialClient
2123

22-
pymodbus_slave_arg = 'unit'
24+
pymodbus_slave_arg = "unit"
2325

2426
def __init__(self, settings : SectionProxy, protocolSettings : protocol_settings = None):
2527
super().__init__(settings, protocolSettings=protocolSettings)
@@ -43,8 +45,8 @@ def __init__(self, settings : SectionProxy, protocolSettings : protocol_settings
4345
self.addresses = [address]
4446

4547
# pymodbus compatability; unit was renamed to address
46-
if 'slave' in inspect.signature(ModbusSerialClient.read_holding_registers).parameters:
47-
self.pymodbus_slave_arg = 'slave'
48+
if "slave" in inspect.signature(ModbusSerialClient.read_holding_registers).parameters:
49+
self.pymodbus_slave_arg = "slave"
4850

4951

5052
# Get the signature of the __init__ method
@@ -56,29 +58,29 @@ def __init__(self, settings : SectionProxy, protocolSettings : protocol_settings
5658
self.client = modbus_base.clients[client_str]
5759
return
5860

59-
if 'method' in init_signature.parameters:
60-
self.client = ModbusSerialClient(method='rtu', port=self.port,
61+
if "method" in init_signature.parameters:
62+
self.client = ModbusSerialClient(method="rtu", port=self.port,
6163
baudrate=int(self.baudrate),
62-
stopbits=1, parity='N', bytesize=8, timeout=2
64+
stopbits=1, parity="N", bytesize=8, timeout=2
6365
)
6466
else:
6567
self.client = ModbusSerialClient(
6668
port=self.port,
6769
baudrate=int(self.baudrate),
68-
stopbits=1, parity='N', bytesize=8, timeout=2
70+
stopbits=1, parity="N", bytesize=8, timeout=2
6971
)
7072

7173
#add to clients
7274
modbus_base.clients[client_str] = self.client
7375

7476
def read_registers(self, start, count=1, registry_type : Registry_Type = Registry_Type.INPUT, **kwargs):
7577

76-
if 'unit' not in kwargs:
77-
kwargs = {'unit': int(self.addresses[0]), **kwargs}
78+
if "unit" not in kwargs:
79+
kwargs = {"unit": int(self.addresses[0]), **kwargs}
7880

7981
#compatability
80-
if self.pymodbus_slave_arg != 'unit':
81-
kwargs['slave'] = kwargs.pop('unit')
82+
if self.pymodbus_slave_arg != "unit":
83+
kwargs["slave"] = kwargs.pop("unit")
8284

8385
if registry_type == Registry_Type.INPUT:
8486
return self.client.read_input_registers(address=start, count=count, **kwargs)
@@ -89,12 +91,12 @@ def write_register(self, register : int, value : int, **kwargs):
8991
if not self.write_enabled:
9092
return
9193

92-
if 'unit' not in kwargs:
93-
kwargs = {'unit': self.addresses[0], **kwargs}
94+
if "unit" not in kwargs:
95+
kwargs = {"unit": self.addresses[0], **kwargs}
9496

9597
#compatability
96-
if self.pymodbus_slave_arg != 'unit':
97-
kwargs['slave'] = kwargs.pop('unit')
98+
if self.pymodbus_slave_arg != "unit":
99+
kwargs["slave"] = kwargs.pop("unit")
98100

99101
self.client.write_register(register, value, **kwargs) #function code 0x06 writes to holding register
100102

0 commit comments

Comments
 (0)