From 2fe5e41963f97c7180d8fd1714dbb7703cca006b Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Thu, 15 May 2025 23:37:40 +0200 Subject: [PATCH 1/8] Fix power valid voltages setter scaling --- adafruit_ina3221.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index eaee34a..0dcfc49 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -427,19 +427,23 @@ def power_valid_limits(self) -> tuple: tuple: A tuple containing the lower and upper voltage limits in volts as (lower_limit, upper_limit). """ + # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18 + LSB = 8e-3 raw_value = self._get_register_bits(POWERVALID_LOWERLIMIT, 0, 16) - lower_limit = _to_signed(raw_value, 3, 16) * 8e-3 + lower_limit = _to_signed(raw_value, 3, 16) * LSB raw_value = self._get_register_bits(POWERVALID_UPPERLIMIT, 0, 16) - upper_limit = _to_signed(raw_value, 3, 16) * 8e-3 + upper_limit = _to_signed(raw_value, 3, 16) * LSB return lower_limit, upper_limit @power_valid_limits.setter def power_valid_limits(self, limits: tuple) -> None: if len(limits) != 2: raise ValueError("Must provide both lower and upper voltage limits.") - # convert to mV and twos-complement - lower_limit = _to_2comp(int(limits[0] * 1000), 3, 16) - upper_limit = _to_2comp(int(limits[1] * 1000), 3, 16) + # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18 + LSB = 8e-3 + # convert V to number of 8 mV steps and twos-complement + lower_limit = _to_2comp(int(limits[0] / LSB), 3, 16) + upper_limit = _to_2comp(int(limits[1] / LSB), 3, 16) self._set_register_bits(POWERVALID_LOWERLIMIT, 0, 16, lower_limit) self._set_register_bits(POWERVALID_UPPERLIMIT, 0, 16, upper_limit) From d84cb6a97af16552ef979a3a7f5a1e879fcb10be Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Fri, 16 May 2025 00:05:29 +0200 Subject: [PATCH 2/8] Add generic regvalue getter/setter --- adafruit_ina3221.py | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index 0dcfc49..a946724 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -429,10 +429,8 @@ def power_valid_limits(self) -> tuple: """ # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18 LSB = 8e-3 - raw_value = self._get_register_bits(POWERVALID_LOWERLIMIT, 0, 16) - lower_limit = _to_signed(raw_value, 3, 16) * LSB - raw_value = self._get_register_bits(POWERVALID_UPPERLIMIT, 0, 16) - upper_limit = _to_signed(raw_value, 3, 16) * LSB + lower_limit = self._register_value_getter(addr=POWERVALID_LOWERLIMIT, lsb=LSB, shift=3) + upper_limit = self._register_value_getter(addr=POWERVALID_UPPERLIMIT, lsb=LSB, shift=3) return lower_limit, upper_limit @power_valid_limits.setter @@ -441,11 +439,33 @@ def power_valid_limits(self, limits: tuple) -> None: raise ValueError("Must provide both lower and upper voltage limits.") # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18 LSB = 8e-3 - # convert V to number of 8 mV steps and twos-complement - lower_limit = _to_2comp(int(limits[0] / LSB), 3, 16) - upper_limit = _to_2comp(int(limits[1] / LSB), 3, 16) - self._set_register_bits(POWERVALID_LOWERLIMIT, 0, 16, lower_limit) - self._set_register_bits(POWERVALID_UPPERLIMIT, 0, 16, upper_limit) + self._register_value_setter(addr=POWERVALID_LOWERLIMIT, value=limits[0], lsb=LSB, shift=3) + self._register_value_setter(addr=POWERVALID_UPPERLIMIT, value=limits[1], lsb=LSB, shift=3) + + def _register_value_getter( + self, + addr: int, + bits: int = 16, + lsb: float = 1., + offset: int = 0, + shift: int = 0 + ) -> int: + raw_value = self._get_register_bits(reg=addr, offset=offset, len=bits) + value = _to_signed(raw_value, shift, bits) * lsb + return value + + def _register_value_setter( + self, + addr: int, + value: float|int, + bits: int = 16, + lsb: float = 1., + offset: int = 0, + shift: int = 0 + ) -> None: + # Convert the value into number of LSB-value steps and twos-complement + bitval = _to_2comp(int(value / lsb), shift, bits) + self._set_register_bits(reg=addr, offset=offset, len=bits, value=bitval) def _get_register_bits(self, reg, offset, len): """return given bits from register""" From 485e580f7135d4faf928ac7cd61264f8a1aa6b0e Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Fri, 16 May 2025 00:39:33 +0200 Subject: [PATCH 3/8] Add shunt voltage sum (limit) methods --- adafruit_ina3221.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index a946724..7a255c7 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -428,7 +428,7 @@ def power_valid_limits(self) -> tuple: in volts as (lower_limit, upper_limit). """ # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18 - LSB = 8e-3 + LSB = BUS_V_LSB lower_limit = self._register_value_getter(addr=POWERVALID_LOWERLIMIT, lsb=LSB, shift=3) upper_limit = self._register_value_getter(addr=POWERVALID_UPPERLIMIT, lsb=LSB, shift=3) return lower_limit, upper_limit @@ -438,10 +438,25 @@ def power_valid_limits(self, limits: tuple) -> None: if len(limits) != 2: raise ValueError("Must provide both lower and upper voltage limits.") # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18 - LSB = 8e-3 + LSB = BUS_V_LSB self._register_value_setter(addr=POWERVALID_LOWERLIMIT, value=limits[0], lsb=LSB, shift=3) self._register_value_setter(addr=POWERVALID_UPPERLIMIT, value=limits[1], lsb=LSB, shift=3) + @property + def shunt_voltage_sum(self) -> float: + LSB = SHUNT_V_LSB + return self._register_value_getter(addr=SHUNTVOLTAGE_SUM, lsb=LSB, shift=1) + + @property + def shunt_voltage_sum_limit(self) -> float: + LSB = SHUNT_V_LSB + return self._register_value_getter(addr=SHUNTVOLTAGE_SUM_LIMIT, lsb=LSB, shift=1) + + @shunt_voltage_sum_limit.setter + def shunt_voltage_sum_limit(self, limit: float|int) -> None: + LSB = SHUNT_V_LSB + self._register_value_setter(addr=POWERVALID_UPPERLIMIT, value=limit, lsb=LSB, shift=1) + def _register_value_getter( self, addr: int, @@ -449,7 +464,7 @@ def _register_value_getter( lsb: float = 1., offset: int = 0, shift: int = 0 - ) -> int: + ) -> float: raw_value = self._get_register_bits(reg=addr, offset=offset, len=bits) value = _to_signed(raw_value, shift, bits) * lsb return value From 8f3f5fb86b49da238c7d34799b786a6a77fc9291 Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Fri, 16 May 2025 03:17:14 +0200 Subject: [PATCH 4/8] Fix warning alert limit value scaling --- adafruit_ina3221.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index 7a255c7..a8b3d6f 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -256,11 +256,11 @@ def warning_alert_threshold(self) -> float: """ reg_addr = WARNING_ALERT_LIMIT_REGS[self._channel] threshold = self._device._get_register_bits(reg_addr, 3, 13) - return threshold / self._shunt_resistance + return threshold * SHUNT_V_LSB / self._shunt_resistance @warning_alert_threshold.setter def warning_alert_threshold(self, current: float) -> None: - threshold = int(current * self._shunt_resistance) + threshold = int(current * self._shunt_resistance / SHUNT_V_LSB) reg_addr = WARNING_ALERT_LIMIT_REGS[self._channel] self._device._set_register_bits(reg_addr, 3, 13, threshold) From b27eda5e7c4843f6e6808595189566458f66726b Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Fri, 16 May 2025 11:33:39 +0200 Subject: [PATCH 5/8] Fix ruff error PLR0913, >5 arguments in function def --- adafruit_ina3221.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index a8b3d6f..615651b 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -453,7 +453,7 @@ def shunt_voltage_sum_limit(self) -> float: return self._register_value_getter(addr=SHUNTVOLTAGE_SUM_LIMIT, lsb=LSB, shift=1) @shunt_voltage_sum_limit.setter - def shunt_voltage_sum_limit(self, limit: float|int) -> None: + def shunt_voltage_sum_limit(self, limit: float | int) -> None: LSB = SHUNT_V_LSB self._register_value_setter(addr=POWERVALID_UPPERLIMIT, value=limit, lsb=LSB, shift=1) @@ -462,9 +462,9 @@ def _register_value_getter( addr: int, bits: int = 16, lsb: float = 1., - offset: int = 0, shift: int = 0 ) -> float: + offset = 0 raw_value = self._get_register_bits(reg=addr, offset=offset, len=bits) value = _to_signed(raw_value, shift, bits) * lsb return value @@ -472,12 +472,12 @@ def _register_value_getter( def _register_value_setter( self, addr: int, - value: float|int, + value: float | int, bits: int = 16, lsb: float = 1., - offset: int = 0, shift: int = 0 ) -> None: + offset = 0 # Convert the value into number of LSB-value steps and twos-complement bitval = _to_2comp(int(value / lsb), shift, bits) self._set_register_bits(reg=addr, offset=offset, len=bits, value=bitval) From e45c006f40f876f9cb468dbf158649be05a4b9e4 Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Fri, 16 May 2025 12:01:35 +0200 Subject: [PATCH 6/8] Ruff: increase the max-args limit to 7 --- adafruit_ina3221.py | 13 ++----------- ruff.toml | 3 +++ 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index 615651b..c815059 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -458,11 +458,7 @@ def shunt_voltage_sum_limit(self, limit: float | int) -> None: self._register_value_setter(addr=POWERVALID_UPPERLIMIT, value=limit, lsb=LSB, shift=1) def _register_value_getter( - self, - addr: int, - bits: int = 16, - lsb: float = 1., - shift: int = 0 + self, addr: int, bits: int = 16, lsb: float = 1., shift: int = 0 ) -> float: offset = 0 raw_value = self._get_register_bits(reg=addr, offset=offset, len=bits) @@ -470,12 +466,7 @@ def _register_value_getter( return value def _register_value_setter( - self, - addr: int, - value: float | int, - bits: int = 16, - lsb: float = 1., - shift: int = 0 + self, addr: int, value: float | int, bits: int = 16, lsb: float = 1., shift: int = 0 ) -> None: offset = 0 # Convert the value into number of LSB-value steps and twos-complement diff --git a/ruff.toml b/ruff.toml index f3dc9c1..86007b3 100644 --- a/ruff.toml +++ b/ruff.toml @@ -94,5 +94,8 @@ ignore = [ "PLR0124", # comparison-with-itself ] +[lint.pylint] +max-args = 7 + [format] line-ending = "lf" From 5e0f608a93e13a0cdc4982d44c170ec67776a5e1 Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Fri, 16 May 2025 12:06:06 +0200 Subject: [PATCH 7/8] Remove trailing spaces --- adafruit_ina3221.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index c815059..24da209 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -451,7 +451,7 @@ def shunt_voltage_sum(self) -> float: def shunt_voltage_sum_limit(self) -> float: LSB = SHUNT_V_LSB return self._register_value_getter(addr=SHUNTVOLTAGE_SUM_LIMIT, lsb=LSB, shift=1) - + @shunt_voltage_sum_limit.setter def shunt_voltage_sum_limit(self, limit: float | int) -> None: LSB = SHUNT_V_LSB From 5b7e2128d73f5ce0ddfdebc68627bbfbe7a7cc94 Mon Sep 17 00:00:00 2001 From: "Bartosz M. Zabolotny" Date: Fri, 16 May 2025 12:12:50 +0200 Subject: [PATCH 8/8] Fix floats: 1. -> 1.0 --- adafruit_ina3221.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_ina3221.py b/adafruit_ina3221.py index 24da209..34f1f14 100644 --- a/adafruit_ina3221.py +++ b/adafruit_ina3221.py @@ -458,7 +458,7 @@ def shunt_voltage_sum_limit(self, limit: float | int) -> None: self._register_value_setter(addr=POWERVALID_UPPERLIMIT, value=limit, lsb=LSB, shift=1) def _register_value_getter( - self, addr: int, bits: int = 16, lsb: float = 1., shift: int = 0 + self, addr: int, bits: int = 16, lsb: float = 1.0, shift: int = 0 ) -> float: offset = 0 raw_value = self._get_register_bits(reg=addr, offset=offset, len=bits) @@ -466,7 +466,7 @@ def _register_value_getter( return value def _register_value_setter( - self, addr: int, value: float | int, bits: int = 16, lsb: float = 1., shift: int = 0 + self, addr: int, value: float | int, bits: int = 16, lsb: float = 1.0, shift: int = 0 ) -> None: offset = 0 # Convert the value into number of LSB-value steps and twos-complement