Index: dialin/hd/battery.py =================================================================== diff -u -re56dc8e8243fb7f7a4600e093898bc008633a53f -rae72ee4038fc1abcdc6f5928c12c3af9f496bd9e --- dialin/hd/battery.py (.../battery.py) (revision e56dc8e8243fb7f7a4600e093898bc008633a53f) +++ dialin/hd/battery.py (.../battery.py) (revision ae72ee4038fc1abcdc6f5928c12c3af9f496bd9e) @@ -23,6 +23,7 @@ from ..utils.checks import check_broadcast_interval_override_ms from ..utils.conversions import integer_to_bytearray, float_to_bytearray +BATTERY_MAH_2_MWH_FACTOR = 14.7 #< Conversion factor for mAh to mWh. class HDBattery(AbstractSubSystem): """ @@ -41,25 +42,26 @@ if self.can_interface is not None: channel_id = DenaliChannels.hd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_HD_BATTERY_MANAGEMENT_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, msg_id, - self._handler_battery_sync) + self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_battery_manager_sync) + msg_id = MsgIds.MSG_ID_HD_BATTERY_STATUS_DATA.value + self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_battery_status_sync) + + #values from battery status message + self.RemainingCapacity = 0 + self.BatteryStatus = 0 + self.BatteryChargerStatus = 0 - self.RemainingCapacity1 = 0 - self.BatteryStatus1 = 0 + #values from battery manager message self.RemainingCapacityAlarm = 0 self.RemainingTimeAlarm = 0 self.BatteryMode = 0 self.AtRate = 0 - self.RemainingCapacity2 = 0 - self.BatteryStatus2 = 0 self.AtRateTimeToFull = 0 self.AtRateTimeToEmpty = 0 self.AtRateOK = 0 self.Temperature = 0 self.Voltage = 0 self.Current = 0 - self.RemainingCapacity3 = 0 - self.BatteryStatus3 = 0 self.AverageCurrent = 0 self.MaxError = 0 self.RelativeStateOfCharge = 0 @@ -69,38 +71,33 @@ self.AverageTimeToEmpty = 0 self.AverageTimeToFull = 0 self.ChargingCurrent = 0 - self.RemainingCapacity4 = 0 - self.BatteryStatus4 = 0 self.ChargingVoltage = 0 self.CycleCount = 0 self.DesignCapacity = 0 self.DesignVoltage = 0 self.SpecificationInfo = 0 self.ManufactureDate = 0 self.SerialNumber = 0 - self.RemainingCapacity5 = 0 - self.BatteryStatus5 = 0 self.ManufacturerName = "" self.DeviceName = "" self.DeviceChemistry = "" - self.allvalues = [ - [self.RemainingCapacity1, "RemainingCapacity1", "int", "mAh"], - [self.BatteryStatus1, "BatteryStatus1", "bits", None], + self.status_values = [ + [self.RemainingCapacity, "RemainingCapacity", "mah", "mWh"], + [self.BatteryStatus, "BatteryStatus", "bits", None], + [self.BatteryChargerStatus, "BatteryChargerStatus", "bits", None]] + + self.manager_values = [ [self.RemainingCapacityAlarm, "RemainingCapacityAlarm", "int", "mAh"], [self.RemainingTimeAlarm, "RemainingTimeAlarm", "int", "minutes"], [self.BatteryMode, "BatteryMode", "bits", None], [self.AtRate, "AtRate", "int", "mA"], - [self.RemainingCapacity2, "RemainingCapacity2", "int", "mAh"], - [self.BatteryStatus2, "BatteryStatus2", "bits", None], [self.AtRateTimeToFull, "AtRateTimeToFull", "int", "minutes"], [self.AtRateTimeToEmpty, "AtRateTimeToEmpty", "int", "minutes"], [self.AtRateOK, "AtRateOK", "bool", None], [self.Temperature, "Temperature", "temperature", "degC"], [self.Voltage, "Voltage", "int", "mV"], [self.Current, "Current", "int", "mA"], - [self.RemainingCapacity3, "RemainingCapacity3", "int", "mAh"], - [self.BatteryStatus3, "BatteryStatus3", "bits", None], [self.AverageCurrent, "AverageCurrent", "int", "mA"], [self.MaxError, "MaxError", "int", "percent"], [self.RelativeStateOfCharge, "RelativeStateOfCharge", "int", "percent"], @@ -110,25 +107,22 @@ [self.AverageTimeToEmpty, "AverageTimeToEmpty", "int", "minutes"], [self.AverageTimeToFull, "AverageTimeToFull", "int", "minutes"], [self.ChargingCurrent, "ChargingCurrent", "int", "mA"], - [self.RemainingCapacity4, "RemainingCapacity4", "int", "mAh"], - [self.BatteryStatus4, "BatteryStatus4", "bits", None], [self.ChargingVoltage, "ChargingVoltage", "int", "mV"], [self.CycleCount, "CycleCount", "int", "percent"], [self.DesignCapacity, "DesignCapacity", "int", "mAh"], [self.DesignVoltage, "DesignVoltage", "int", "mV"], [self.SpecificationInfo, "SpecificationInfo", "int", None], [self.ManufactureDate, "ManufactureDate", "int", "percent"], [self.SerialNumber, "SerialNumber", "int", None], - [self.RemainingCapacity5, "RemainingCapacity5", "int", "mAh"], - [self.BatteryStatus5, "BatteryStatus5", "bits", None], [self.ManufacturerName, "ManufacturerName", "string", None], [self.DeviceName, "DeviceName", "string", None], [self.DeviceChemistry, "DeviceChemistry", "string", None]] """@publish([ ]) """ - def _handler_battery_sync(self, message): + + def _handler_battery_status_sync(self, message): """ Handles published battery data messages. Battery data are captured for reference. @@ -138,32 +132,81 @@ """ #first unpack all of the values into byte arrays index = 6 - for value in self.all_values: - value[0] = bytearray(message['message'][index, index+4]) + field_size = 4 #32 bit unsigned integers + for value in self.status_values: + value[0] = bytearray(message['message'][index, index+field_size]) + index += field_size #parse according to type of data - for value in self.all_values: + for value in self.status_values: if value[2] == "int": - value[0] = struct.unpack('H', value[0]) + value[0] = struct.unpack('HH', value[0])[0] + if value[2] == "mah": + temp = struct.unpack('HH', value[0])[0] + value[0] = temp * BATTERY_MAH_2_MWH_FACTOR elif value[2] == "string": value[0] = struct.unpack('s', value[0]) elif value[2] == "temperature": - temp = struct.unpack('H', value[0]) + temp = struct.unpack('HH', value[0])[0] value[0] = temp / 10.0 elif value[2] == "bool": - temp = struct.unpack('H', value[0]) + temp = struct.unpack('HH', value[0])[0] value[0] = "False" if temp > 0: value[0] = "True" elif value[2] == "bits": #convert integer to string representing bits - temp = struct.unpack('H', value[0]) + temp = struct.unpack('HH', value[0])[0] value[0] = format(temp, 'b') #print out the converted values - for value in self.all_values: + for value in self.status_values: units = value[3] if not units: units = "" print (value[1], value[0], units) + + def _handler_battery_manager_sync(self, message): + """ + Handles published battery data messages. Battery data are captured + for reference. + + @param message: published battery data message + @return: none + """ + #first unpack all of the values into byte arrays + index = 6 + field_size = 4 #32 bit unsigned integers + for value in self.manager_values: + value[0] = bytearray(message['message'][index, index+field_size]) + index += field_size + + #parse according to type of data + for value in self.manager_values: + if value[2] == "int": + value[0] = struct.unpack('HH', value[0])[0] + if value[2] == "mah": + temp = struct.unpack('HH', value[0])[0] + value[0] = temp * BATTERY_MAH_2_MWH_FACTOR + elif value[2] == "string": + value[0] = struct.unpack('s', value[0]) + elif value[2] == "temperature": + temp = struct.unpack('HH', value[0])[0] + value[0] = temp / 10.0 + elif value[2] == "bool": + temp = struct.unpack('HH', value[0])[0] + value[0] = "False" + if temp > 0: + value[0] = "True" + elif value[2] == "bits": + #convert integer to string representing bits + temp = struct.unpack('HH', value[0])[0] + value[0] = format(temp, 'b') + + #print out the converted values + for value in self.manager_values: + units = value[3] + if not units: + units = "" + print (value[1], value[0], units)