Index: dialin/hd/service_record.py =================================================================== diff -u -racd09d02879e8add4cf7f694f5db8e423a76c341 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/service_record.py (.../service_record.py) (revision acd09d02879e8add4cf7f694f5db8e423a76c341) +++ dialin/hd/service_record.py (.../service_record.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -78,6 +78,7 @@ msg_id = MsgIds.MSG_ID_HD_SEND_SERVICE_RECORD.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_hd_service_sync) + self.hd_service_record_timestamp = 0.0 def cmd_reset_hd_service_record(self) -> bool: """ @@ -152,7 +153,7 @@ self.logger.error("Timeout!!!!") return False - def _handler_hd_service_sync(self, message): + def _handler_hd_service_sync(self, message, timestamp=0.0): """ Handles published HD system record messages. HD system records are captured for processing and updating the HD system record. @@ -188,9 +189,11 @@ self._is_getting_service_in_progress = False # If all the messages have been received, call another function to process the raw data self._utilities.process_received_record_from_fw(self.hd_service_record, self._raw_service_record) + self.hd_service_record_timestamp = timestamp self._handler_received_complete_hd_service_record() - @publish(["hd_service_record"]) + + @publish(["hd_service_record_timestamp","hd_service_record"]) def _handler_received_complete_hd_service_record(self): """ Publishes the received service record Index: dialin/hd/sw_configs.py =================================================================== diff -u -r45ef5740d52d0f744175ace8312d62c023abc1b9 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/sw_configs.py (.../sw_configs.py) (revision 45ef5740d52d0f744175ace8312d62c023abc1b9) +++ dialin/hd/sw_configs.py (.../sw_configs.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -114,6 +114,7 @@ msg_id = MsgIds.MSG_ID_HD_SEND_SW_CONFIG_RECORD.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_hd_sw_config_sync) + self.hd_sw_config_record_timestamp = 0.0 def cmd_reset_hd_sw_config_record(self) -> bool: """ @@ -158,7 +159,7 @@ self.logger.debug("Request cancelled: an existing request is in progress.") return False - def _handler_hd_sw_config_sync(self, message): + def _handler_hd_sw_config_sync(self, message, timestamp=0.0): """ Handles published HD software configuration record messages. HD software configuration records are captured for processing and updating the HD software configuration record. @@ -195,9 +196,10 @@ self._is_getting_sw_config_in_progress = False # If all the messages have been received, call another function to process the raw data self._utilities.process_received_record_from_fw(self.hd_sw_config_record, self._raw_sw_config_record) + self.hd_sw_config_record_timestamp = timestamp self._handler_received_complete_hd_sw_config_record() - @publish(["hd_sw_config_record"]) + @publish(["hd_sw_config_record_timestamp","hd_sw_config_record"]) def _handler_received_complete_hd_sw_config_record(self): """ Publishes the received software configuration record Index: dialin/hd/switches.py =================================================================== diff -u -racd09d02879e8add4cf7f694f5db8e423a76c341 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/switches.py (.../switches.py) (revision acd09d02879e8add4cf7f694f5db8e423a76c341) +++ dialin/hd/switches.py (.../switches.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -63,6 +63,7 @@ self.hd_switches_status = {HDSwitchesNames.FRONT_DOOR.name: HDSwitchStatus.CLOSED.value, HDSwitchesNames.PUMP_TRACK_SWITCH.name: HDSwitchStatus.CLOSED.value} + self.hd_switches_timestamp = 0.0 def get_switches_status(self) -> dict: """ @@ -72,8 +73,8 @@ """ return self.hd_switches_status - @publish(["hd_switches_status"]) - def _handler_switches_sync(self, message): + @publish(["hd_switches_timestamp", "hd_switches_status"]) + def _handler_switches_sync(self, message, timestamp=0.0): """ Handles published HD switches data messages. Switches data are captured for reference. @@ -87,6 +88,7 @@ self.hd_switches_status[HDSwitchesNames.FRONT_DOOR.name] = HDSwitchStatus(front_door).value self.hd_switches_status[HDSwitchesNames.PUMP_TRACK_SWITCH.name] = HDSwitchStatus(pump_track).value + self.hd_switches_timestamp = timestamp def cmd_hd_switch_status_override(self, switch: int, status: int, reset: int = NO_RESET) -> int: """ Index: dialin/hd/syringe_pump.py =================================================================== diff -u -r858a23ec52b7a982ca68588a80a39a775d16a315 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/syringe_pump.py (.../syringe_pump.py) (revision 858a23ec52b7a982ca68588a80a39a775d16a315) +++ dialin/hd/syringe_pump.py (.../syringe_pump.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -61,6 +61,7 @@ self.syringe_pump_encoder_status = 0 self.syringe_pump_adc_dac_status = 0 self.syringe_pump_adc_read_counter = 0 + self.hd_syringe_pump_timestamp = 0.0 def get_syringe_pump_state(self): """ @@ -189,14 +190,15 @@ """ return self.syringe_pump_adc_read_counter - @publish(["syringe_pump_state", "syringe_pump_set_rate_ml_hr", + @publish(["hd_syringe_pump_timestamp", + "syringe_pump_state", "syringe_pump_set_rate_ml_hr", "syringe_pump_meas_rate_ml_hr", "syringe_pump_position", "syringe_pump_volume_ml", "syringe_pump_home_v", "syringe_pump_switch_v", "syringe_pump_force_v", "heparin_state", "syringe_pump_safety_volume_ml", "syringe_pump_status", "syringe_pump_encoder_status", "syringe_pump_adc_dac_status", "syringe_pump_adc_read_counter"]) - def _handler_syringe_pump_data(self, message): + def _handler_syringe_pump_data(self, message, timestamp=0.0): """ Handles published syringe pump data messages. Syringe pump data are captured for reference. @@ -242,6 +244,7 @@ self.syringe_pump_encoder_status = (sts[0] & 0x00FF0000) >> 16 self.syringe_pump_adc_dac_status = (sts[0] & 0x0000FF00) >> 8 self.syringe_pump_adc_read_counter = (sts[0] & 0x000000FF) + self.hd_syringe_pump_timestamp = timestamp def cmd_syringe_pump_operation(self, operation: int = SyringePumpOperations.SYRINGE_PUMP_OP_STOP.value, rate: float = 0.0, Index: dialin/hd/system_record.py =================================================================== diff -u -racd09d02879e8add4cf7f694f5db8e423a76c341 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/system_record.py (.../system_record.py) (revision acd09d02879e8add4cf7f694f5db8e423a76c341) +++ dialin/hd/system_record.py (.../system_record.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -74,6 +74,7 @@ self._utilities = NVOpsUtils(logger=self.logger) # System main record self.hd_system_record = self._prepare_hd_system_record() + self.hd_system_record_timestamp = 0.0 if self.can_interface is not None: channel_id = DenaliChannels.hd_to_dialin_ch_id @@ -188,7 +189,7 @@ self.logger.error("Timeout!!!!") return False - def _handler_hd_system_sync(self, message): + def _handler_hd_system_sync(self, message, timestamp=0.0): """ Handles published HD system record messages. HD system records are captured for processing and updating the HD system record. @@ -225,9 +226,10 @@ self._is_getting_sys_in_progress = False # If all the messages have been received, call another function to process the raw data self._utilities.process_received_record_from_fw(self.hd_system_record, self._raw_system_record) + self.hd_system_record_timestamp = timestamp self._handler_received_complete_hd_system_record() - @publish(["hd_system_record"]) + @publish(["hd_system_record_timestamp","hd_system_record"]) def _handler_received_complete_hd_system_record(self): """ Publishes the received system record Index: dialin/hd/temperatures.py =================================================================== diff -u -racd09d02879e8add4cf7f694f5db8e423a76c341 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/temperatures.py (.../temperatures.py) (revision acd09d02879e8add4cf7f694f5db8e423a76c341) +++ dialin/hd/temperatures.py (.../temperatures.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -58,6 +58,7 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_temperatures_sync) + self.hd_temperatures_timestamp = 0.0 self.hd_temperatures = {HDTemperaturesNames.THERMISTOR_ONBOARD_NTC.name: 0.0, HDTemperaturesNames.THERMISTOR_POWER_SUPPLY_1.name: 0.0, HDTemperaturesNames.TEMPSENSOR_FPGA_BOARD.name: 0.0, @@ -72,8 +73,8 @@ """ return self.hd_temperatures - @publish(["hd_temperatures"]) - def _handler_temperatures_sync(self, message): + @publish(["hd_temperatures_timestamp","hd_temperatures"]) + def _handler_temperatures_sync(self, message,timestamp=0.0): """ Handles published HD temperatures data messages. Temperatures data are captured for reference. @@ -96,6 +97,7 @@ self.hd_temperatures[HDTemperaturesNames.TEMPSENSOR_FPGA_BOARD.name] = fpga_board_sensor self.hd_temperatures[HDTemperaturesNames.TEMPSENSOR_VENOUS_PRESS_TEMP.name] = venous_pressure_sensor_temp self.hd_temperatures[HDTemperaturesNames.TEMPSENSOR_ARTERIAL_PRESS_TEMP.name] = arterial_sensor + self.hd_temperatures_timestamp = timestamp def cmd_temperatures_value_override(self, sensor: int, value: float, reset: int = NO_RESET) -> int: """ Index: dialin/hd/ui_proxy.py =================================================================== diff -u -r45ef5740d52d0f744175ace8312d62c023abc1b9 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 45ef5740d52d0f744175ace8312d62c023abc1b9) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -158,6 +158,21 @@ MsgIds.MSG_ID_HD_DISINFECT_STANDBY_DATA.value, self._handler_disinfects_data_publish) + + self.hd_uf_settings_change_res_timestamp = 0.0 + self.hd_uf_settings_change_confirm_res_timestamp = 0.0 + self.hd_treatment_time_change_res_timestamp = 0.0 + self.hd_blood_dial_rate_change_res_timestamp = 0.0 + self.hd_treatment_param_change_ranges_res_timestamp = 0.0 + self.hd_version_res_timestamp = 0.0 + self.hd_new_treatment_params_timestamp = 0.0 + self.hd_new_treatment_params_res_timestamp = 0.0 + self.hd_saline_bolus_res_timestamp = 0.0 + self.hd_set_uf_volume_parameter_res_timestamp = 0.0 + self.hd_rinseback_cmd_res_timestamp = 0.0 + self.hd_recirc_res_timestamp = 0.0 + self.hd_tx_end_cmd_res_timestamp = 0.0 + self.hd_disinfection_standby_timestamp = 0.0 # initialize variables that will be populated by HD version response self.hd_version = None self.fpga_version = None @@ -444,10 +459,11 @@ return self.saline_bolus_request_bolus_volume @publish([ + "hd_version_res_timestamp" "hd_version", "fpga_version" ]) - def _handler_hd_version(self, message): + def _handler_hd_version(self, message, timestamp=0.0): """ Handler for response from HD regarding its version. @@ -484,11 +500,13 @@ if all([len(each) > 0 for each in [fpga_major, fpga_minor, fpga_id, fpga_lab]]): self.fpga_version = f"ID: {fpga_id[0]} v{fpga_major[0]}.{fpga_minor[0]}.{fpga_lab[0]}" self.logger.debug(f"HD FPGA VERSION: {self.fpga_version}") + self.hd_version_res_timestamp = timestamp @publish([ + "hd_new_treatment_params_timestamp", "treatment_parameters" ]) - def _handler_treatment_param_settings(self, message): + def _handler_treatment_param_settings(self, message, timestamp): """ Handler for UI msg containing user set treatment parameters. @@ -569,11 +587,13 @@ self.treatment_parameters[TreatmentParameters.TREATMENT_PARAM_HEPARIN_DISPENSE_RATE_ML_HR.value] = hdr[0] self.treatment_parameters[TreatmentParameters.TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME_ML.value] = hbv[0] self.treatment_parameters[TreatmentParameters.TREATMENT_PARAM_DIALYSATE_TEMPERATURE_C.value] = tmp[0] + self.hd_new_treatment_params_timestamp = timestamp @publish([ + "hd_set_uf_volume_parameter_res_timestamp" "treatment_parameters" ]) - def _handler_uf_volume_setting_response(self, message): + def _handler_uf_volume_setting_response(self, message, timestamp=0.0): """ Handler for UI msg containing user set ultrafiltration volume parameter. @@ -585,12 +605,14 @@ tmp = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])) self.treatment_parameters[TreatmentParameters.TREATMENT_PARAM_UF_VOLUME_L.value] = tmp[0] / 1000.0 + self.hd_set_uf_volume_parameter_res_timestamp = timestamp @publish([ + "hd_new_treatment_params_res_timestamp" "treatment_parameters_valid", "treatment_parameters_reject_reasons" ]) - def _handler_treatment_param_settings_response(self, message): + def _handler_treatment_param_settings_response(self, message, timestamp=0.0): """ Handler for response from HD regarding validation of treatment parameters. @@ -678,16 +700,18 @@ self.treatment_parameters_reject_reasons[TreatmentParameters.TREATMENT_PARAM_HEPARIN_DISPENSE_RATE_ML_HR.value] = hdr[0] self.treatment_parameters_reject_reasons[TreatmentParameters.TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME_ML.value] = hbv[0] self.treatment_parameters_reject_reasons[TreatmentParameters.TREATMENT_PARAM_DIALYSATE_TEMPERATURE_C.value] = tmp[0] + self.hd_new_treatment_params_res_timestamp = timestamp @publish([ + "hd_treatment_param_change_ranges_res_timestamp", "min_treatment_duration_min", "max_treatment_duration_min", "min_uf_volume_ml", "max_uf_volume_ml", "min_dialysate_flow_rate_ml_min", "max_dialysate_flow_rate_ml_min" ]) - def _handler_treatment_param_ranges(self, message): + def _handler_treatment_param_ranges(self, message, timestamp=0.0): """ Handler for response from HD regarding valid treatment parameter ranges. @@ -720,13 +744,15 @@ self.max_uf_volume_ml = maxufvol[0] self.min_dialysate_flow_rate_ml_min = mindialrt[0] self.max_dialysate_flow_rate_ml_min = maxdialrt[0] + self.hd_treatment_param_change_ranges_res_timestamp = timestamp @publish([ + "hd_saline_bolus_res_timestamp", "saline_bolus_request_succeeded", "saline_bolus_request_reject_reason", "saline_bolus_request_bolus_volume" ]) - def _handler_saline_bolus_response(self, message): + def _handler_saline_bolus_response(self, message, timestamp=0.0): """ Handler for response from HD regarding saline bolus request. @@ -751,14 +777,16 @@ if RequestRejectReasons.has_value(rea[0]): self.saline_bolus_request_reject_reason = RequestRejectReasons(rea[0]) self.saline_bolus_request_bolus_volume = vol[0] + self.hd_saline_bolus_res_timestamp = timestamp @publish([ + "hd_treatment_time_change_res_timestamp", "duration_change_succeeded", "duration_change_reject_reason", "duration_change_time_min", "duration_change_uf_vol_ml" ]) - def _handler_treatment_duration_change_response(self, message): + def _handler_treatment_duration_change_response(self, message, timestamp=0.0): """ Handler for response from HD regarding treatment duration change request. @@ -784,14 +812,16 @@ self.duration_change_reject_reason = RequestRejectReasons(rea[0]) self.duration_change_time_min = tim[0] self.duration_change_uf_vol_ml = vol[0] + self.hd_treatment_time_change_res_timestamp = timestamp @publish([ + "hd_blood_dial_rate_change_res_timestamp", "blood_and_dialysate_flow_rate_change_succeeded", "blood_and_dialysate_flow_rate_change_reject_reason", "target_blood_flow_rate", "target_dialysate_flow_rate" ]) - def _handler_blood_and_dialysate_change_response(self, message): + def _handler_blood_and_dialysate_change_response(self, message, timestamp=0.0): """ Handler for response from HD regarding blood & dialysate flow rate change request. @@ -821,8 +851,10 @@ self.blood_and_dialysate_flow_rate_change_reject_reason = RequestRejectReasons(rea[0]) self.target_blood_flow_rate = bld[0] self.target_dialysate_flow_rate = dil[0] + self.hd_blood_dial_rate_change_res_timestamp = timestamp @publish([ + "hd_uf_settings_change_res_timestamp", "uf_change_succeeded", "uf_change_reject_reason", "uf_change_volume_ml", @@ -831,7 +863,7 @@ "uf_change_rate_ml_min", "uf_change_rate_diff" ]) - def _handler_uf_change_response(self, message): + def _handler_uf_change_response(self, message, timestamp=0.0): """ Handler for response from HD regarding UF change request. @@ -879,13 +911,15 @@ self.uf_change_rate_diff = rtd[0] self.uf_old_rate_ml_min = ort[0] + self.hd_uf_settings_change_res_timestamp = timestamp - @publish(["uf_change_succeeded", + @publish(["hd_uf_settings_change_confirm_res_timestamp", + "uf_change_succeeded", "uf_change_reject_reason", "uf_change_volume_ml", "uf_change_time_min", "uf_change_rate_ml_min"]) - def _handler_uf_change_confirm_response(self, message): + def _handler_uf_change_confirm_response(self, message, timestamp=0.0): """ Handler for response from HD regarding UF change confirmation. @@ -919,12 +953,14 @@ self.uf_change_volume_ml = vol[0] / self.LITER_TO_ML_CONVERSION_FACTOR self.uf_change_time_min = tim[0] self.uf_change_rate_ml_min = rat[0] + self.hd_uf_settings_change_confirm_res_timestamp = timestamp @publish([ + "hd_rinseback_cmd_res_timestamp", "rinseback_cmd_succeeded", "rinseback_cmd_reject_reason", ]) - def _handler_rinseback_cmd_response(self, message): + def _handler_rinseback_cmd_response(self, message, timestamp=0.0): """ Handler for response from HD regarding rinseback user command. @@ -945,12 +981,14 @@ self.rinseback_cmd_succeeded = False if RequestRejectReasons.has_value(rea[0]): self.rinseback_cmd_reject_reason = RequestRejectReasons(rea[0]) + self.hd_rinseback_cmd_res_timestamp = timestamp @publish([ + "hd_recirc_res_timestamp", "recirc_cmd_succeeded", "recirc_cmd_reject_reason", ]) - def _handler_recirc_cmd_response(self, message): + def _handler_recirc_cmd_response(self, message, timestamp=0.0): """ Handler for response from HD regarding recirculate user command. @@ -971,12 +1009,14 @@ self.recirc_cmd_succeeded = False if RequestRejectReasons.has_value(rea[0]): self.recirc_cmd_reject_reason = RequestRejectReasons(rea[0]) + self.hd_recirc_res_timestamp = timestamp @publish([ + "hd_tx_end_cmd_res_timestamp", "treatment_end_cmd_succeeded", "treatment_end_cmd_reject_reason", ]) - def _handler_treatment_end_cmd_response(self, message: dict) -> None: + def _handler_treatment_end_cmd_response(self, message: dict, timestamp=0.0) -> None: """ Handler for response from HD regarding treatment end user command. @@ -997,6 +1037,7 @@ self.treatment_end_cmd_succeeded = False if RequestRejectReasons.has_value(rea[0]): self.treatment_end_cmd_reject_reason = RequestRejectReasons(rea[0]) + self.hd_tx_end_cmd_res_timestamp = timestamp def cmd_ui_checkin_with_hd(self) -> None: """ @@ -1680,8 +1721,8 @@ self.logger.debug("Setting DG service time.") self.can_interface.send(message, 0) - @publish(["disinfects_hd_submode", "disinfects_dg_mode"]) - def _handler_disinfects_data_publish(self, message: dict) -> None: + @publish(["hd_disinfection_standby_timestamp","disinfects_hd_submode", "disinfects_dg_mode"]) + def _handler_disinfects_data_publish(self, message: dict, timestamp=0.0) -> None: """ Handles published disinfect mode and submode that is published to UI @@ -1696,3 +1737,4 @@ self.disinfects_hd_submode = hd_state self.disinfects_dg_mode = dg_submode + self.hd_disinfection_standby_timestamp = timestamp Index: dialin/hd/valves.py =================================================================== diff -u -racd09d02879e8add4cf7f694f5db8e423a76c341 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/valves.py (.../valves.py) (revision acd09d02879e8add4cf7f694f5db8e423a76c341) +++ dialin/hd/valves.py (.../valves.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -116,6 +116,7 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_hd_valves_sync) + self.hd_valves_timestamp = 0.0 # A dictionary of the valves with the status self.valves_status = {ValvesEnum.VDI.name: {}, ValvesEnum.VDO.name: {}, ValvesEnum.VBA.name: {}, ValvesEnum.VBV.name: {}} @@ -367,8 +368,8 @@ self.logger.debug("Opening air trap valve timeout!!") return False - @publish(["valves_status", "hd_air_trap_status"]) - def _handler_hd_valves_sync(self, message: dict) -> None: + @publish(["hd_valves_timestamp","valves_status", "hd_air_trap_status"]) + def _handler_hd_valves_sync(self, message: dict, timestamp=0.0) -> None: """ Handles published HD valves data messages. HD valves data are captured for reference. @@ -408,3 +409,4 @@ 'PosA': pos_a, 'PosB': pos_b, 'PosC': pos_c, 'PWM': pwm} # Update the air trap valve's status self.hd_air_trap_status = air_trap + self.hd_valves_timestamp = timestamp \ No newline at end of file Index: dialin/hd/voltages.py =================================================================== diff -u -racd09d02879e8add4cf7f694f5db8e423a76c341 -r1701afaa244e7050e5b674f0ad237a438db2e861 --- dialin/hd/voltages.py (.../voltages.py) (revision acd09d02879e8add4cf7f694f5db8e423a76c341) +++ dialin/hd/voltages.py (.../voltages.py) (revision 1701afaa244e7050e5b674f0ad237a438db2e861) @@ -61,6 +61,7 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_monitored_voltages_sync) self.monitored_voltages = [0.0] * HDMonitoredVoltages.NUM_OF_MONITORED_VOLTAGE_LINES.value + self.hd_voltages_timestamp = 0.0 def get_monitored_voltages(self): """ @@ -70,8 +71,8 @@ """ return self.monitored_voltages - @publish(["monitored_voltages"]) - def _handler_monitored_voltages_sync(self, message): + @publish(["hd_voltages_timestamp","monitored_voltages"]) + def _handler_monitored_voltages_sync(self, message, timestamp=0.0): """ Handles published HD monitored voltages data messages. Voltage data are captured for reference. @@ -114,6 +115,7 @@ self.monitored_voltages[HDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.value] = vfc[0] self.monitored_voltages[HDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.value] = vfa[0] self.monitored_voltages[HDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.value] = vfp[0] + self.hd_voltages_timestamp = timestamp def cmd_monitored_voltage_override(self, signal: int = 0, volts: float = 0.0, reset: int = NO_RESET) -> int: """