@@ -256,11 +256,11 @@ def warning_alert_threshold(self) -> float:
256256 """
257257 reg_addr = WARNING_ALERT_LIMIT_REGS [self ._channel ]
258258 threshold = self ._device ._get_register_bits (reg_addr , 3 , 13 )
259- return threshold / self ._shunt_resistance
259+ return threshold * SHUNT_V_LSB / self ._shunt_resistance
260260
261261 @warning_alert_threshold .setter
262262 def warning_alert_threshold (self , current : float ) -> None :
263- threshold = int (current * self ._shunt_resistance )
263+ threshold = int (current * self ._shunt_resistance / SHUNT_V_LSB )
264264 reg_addr = WARNING_ALERT_LIMIT_REGS [self ._channel ]
265265 self ._device ._set_register_bits (reg_addr , 3 , 13 , threshold )
266266
@@ -427,21 +427,51 @@ def power_valid_limits(self) -> tuple:
427427 tuple: A tuple containing the lower and upper voltage limits
428428 in volts as (lower_limit, upper_limit).
429429 """
430- raw_value = self . _get_register_bits ( POWERVALID_LOWERLIMIT , 0 , 16 )
431- lower_limit = _to_signed ( raw_value , 3 , 16 ) * 8e-3
432- raw_value = self ._get_register_bits ( POWERVALID_UPPERLIMIT , 0 , 16 )
433- upper_limit = _to_signed ( raw_value , 3 , 16 ) * 8e-3
430+ # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18
431+ LSB = BUS_V_LSB
432+ lower_limit = self ._register_value_getter ( addr = POWERVALID_LOWERLIMIT , lsb = LSB , shift = 3 )
433+ upper_limit = self . _register_value_getter ( addr = POWERVALID_UPPERLIMIT , lsb = LSB , shift = 3 )
434434 return lower_limit , upper_limit
435435
436436 @power_valid_limits .setter
437437 def power_valid_limits (self , limits : tuple ) -> None :
438438 if len (limits ) != 2 :
439439 raise ValueError ("Must provide both lower and upper voltage limits." )
440- # convert to mV and twos-complement
441- lower_limit = _to_2comp (int (limits [0 ] * 1000 ), 3 , 16 )
442- upper_limit = _to_2comp (int (limits [1 ] * 1000 ), 3 , 16 )
443- self ._set_register_bits (POWERVALID_LOWERLIMIT , 0 , 16 , lower_limit )
444- self ._set_register_bits (POWERVALID_UPPERLIMIT , 0 , 16 , upper_limit )
440+ # LSB value is 8 mV -- Datasheet: 8.6.2.17/.18
441+ LSB = BUS_V_LSB
442+ self ._register_value_setter (addr = POWERVALID_LOWERLIMIT , value = limits [0 ], lsb = LSB , shift = 3 )
443+ self ._register_value_setter (addr = POWERVALID_UPPERLIMIT , value = limits [1 ], lsb = LSB , shift = 3 )
444+
445+ @property
446+ def shunt_voltage_sum (self ) -> float :
447+ LSB = SHUNT_V_LSB
448+ return self ._register_value_getter (addr = SHUNTVOLTAGE_SUM , lsb = LSB , shift = 1 )
449+
450+ @property
451+ def shunt_voltage_sum_limit (self ) -> float :
452+ LSB = SHUNT_V_LSB
453+ return self ._register_value_getter (addr = SHUNTVOLTAGE_SUM_LIMIT , lsb = LSB , shift = 1 )
454+
455+ @shunt_voltage_sum_limit .setter
456+ def shunt_voltage_sum_limit (self , limit : float | int ) -> None :
457+ LSB = SHUNT_V_LSB
458+ self ._register_value_setter (addr = POWERVALID_UPPERLIMIT , value = limit , lsb = LSB , shift = 1 )
459+
460+ def _register_value_getter (
461+ self , addr : int , bits : int = 16 , lsb : float = 1.0 , shift : int = 0
462+ ) -> float :
463+ offset = 0
464+ raw_value = self ._get_register_bits (reg = addr , offset = offset , len = bits )
465+ value = _to_signed (raw_value , shift , bits ) * lsb
466+ return value
467+
468+ def _register_value_setter (
469+ self , addr : int , value : float | int , bits : int = 16 , lsb : float = 1.0 , shift : int = 0
470+ ) -> None :
471+ offset = 0
472+ # Convert the value into number of LSB-value steps and twos-complement
473+ bitval = _to_2comp (int (value / lsb ), shift , bits )
474+ self ._set_register_bits (reg = addr , offset = offset , len = bits , value = bitval )
445475
446476 def _get_register_bits (self , reg , offset , len ):
447477 """return given bits from register"""
0 commit comments