Index: dialin/common/msg_ids.py =================================================================== diff -u -rb031f612a81d0333bf78a7e4675e5d0a0aeb6d1d -rae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc --- dialin/common/msg_ids.py (.../msg_ids.py) (revision b031f612a81d0333bf78a7e4675e5d0a0aeb6d1d) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision ae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc) @@ -316,7 +316,7 @@ MSG_ID_PRESSURE_SEND_INTERVAL_OVERRIDE = 0XA007 MSG_ID_RO_MEASURED_FLOW_OVERRIDE = 0XA009 MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE = 0XA00A - MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE = 0XA00B + MSG_ID_DRAIN_PUMP_SET_RPM = 0XA00B MSG_ID_DRAIN_PUMP_SEND_INTERVAL_OVERRIDE = 0XA00C MSG_ID_LOAD_CELLL_SEND_INTERVAL_OVERRIDE = 0XA00D MSG_ID_VALVE_STATE_OVERRIDE = 0XA00E @@ -373,6 +373,7 @@ MSG_ID_FILTER_FLUSH_TIME_PERIOD_OVERRIDE = 0XA042 MSG_ID_DG_FANS_RPM_OVERRIDE = 0xA043 MSG_ID_DG_STOP_RTC_CLOCK = 0xA045 + MSG_ID_DG_DRAIN_PUMP_MEASURED_RPM_OVERRIDE = 0xA046 MSG_ID_HD_DEBUG_EVENT = 0XFFF1 MSG_ID_DG_DEBUG_EVENT = 0XFFF2 MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0XFFFF Index: dialin/dg/drain_pump.py =================================================================== diff -u -rb5ebd4c79b40e896e806e3495c7548466731bcd1 -rae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc --- dialin/dg/drain_pump.py (.../drain_pump.py) (revision b5ebd4c79b40e896e806e3495c7548466731bcd1) +++ dialin/dg/drain_pump.py (.../drain_pump.py) (revision ae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc) @@ -57,6 +57,7 @@ self.dac_value = 0 self.drain_pump_state = 0 self.current_drain_pump_rpm = 0 + self.target_drain_pump_outlet_pressure = 0.0 def get_target_drain_pump_rpm(self): """ @@ -107,11 +108,14 @@ message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] curr_rpm = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] + tgt_prsr = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] self.target_drain_pump_rpm = tgt_rpm self.dac_value = dac self.drain_pump_state = state self.current_drain_pump_rpm = curr_rpm + self.target_drain_pump_outlet_pressure = tgt_prsr def cmd_drain_pump_set_outlet_target_pressure(self, pressure: float) -> int: """ @@ -146,39 +150,79 @@ self.logger.debug("Timeout!!!!") return False - def cmd_drain_pump_speed_set_point_override(self, speed: int) -> int: + def cmd_drain_pump_set_rpm(self, rpm: int) -> int: """ - Constructs and sends the drain pump speed set point override command + Constructs and sends the drain pump speed set command Constraints: Must be logged into DG. - @param speed: (int) speed set point (in RPM) to override with + @param rpm: (int) speed set point (in RPM) to override with @return: 1 if successful, zero otherwise """ - spd = integer_to_bytearray(speed) + spd = integer_to_bytearray(rpm) payload = spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE.value, + message_id=MsgIds.MSG_ID_DRAIN_PUMP_SET_RPM.value, payload=payload) - self.logger.debug("Override drain pump speed set point") + self.logger.debug("Setting the drain pump RPM") # Send message received_message = self.can_interface.send(message) # If there is no content... if received_message is not None: - self.logger.debug("Drain pump set point overridden to " + str(speed) + " RPM: " + + self.logger.debug("Drain pump RPM set to " + str(rpm) + " RPM: " + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) # response payload is OK or not OK return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: self.logger.debug("Timeout!!!!") return False + def cmd_drain_pump_measured_rpm_override(self, rpm: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the drain pump measured RPM override command. + Constraints: + Must be logged into DG. + Given RPM must be within 300 <= RPM <= 3000 + + @param rpm: (int) rpm to override with + @param reset: (int) 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + r = integer_to_bytearray(rpm) + payload = rst + r + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_DRAIN_PUMP_MEASURED_RPM_OVERRIDE.value, + payload=payload) + + self.logger.debug("Override drain pump measured RPM") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(rpm) + self.logger.debug( + "Drain pump measured RPM overridden to " + str_res + " RPM " + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + def cmd_drain_pump_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the drain pump data publication override command. Index: dialin/dg/heaters.py =================================================================== diff -u -ra901fe931c08daea69337c1f44135637a764ce7a -rae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc --- dialin/dg/heaters.py (.../heaters.py) (revision a901fe931c08daea69337c1f44135637a764ce7a) +++ dialin/dg/heaters.py (.../heaters.py) (revision ae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc) @@ -63,6 +63,7 @@ self.primary_heaters_target_temperature = 0.0 self.trimmer_heater_target_temperature = 0.0 self.primary_heater_state = 0 + self.primary_efficiency = 0 if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id @@ -110,7 +111,7 @@ return self.trimmer_heater_target_temperature @publish(["main_primary_heater_duty_cycle", "small_primary_heater_duty_cycle", "trimmer_heater_duty_cycle", - "primary_heaters_target_temperature", "trimmer_heater_target_temperature"]) + "primary_heaters_target_temperature", "trimmer_heater_target_temperature", "primary_efficiency"]) def _handler_heaters_sync(self, message): """ Handles published heaters message @@ -130,13 +131,18 @@ message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] primary_heater_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + trimmer_heater_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] + primary_eff = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] self.main_primary_heater_duty_cycle = main_primary_heater_pwm self.small_primary_heater_duty_cycle = small_primary_heater_pwm self.trimmer_heater_duty_cycle = trimmer_heater_pwm self.primary_heaters_target_temperature = primary_heaters_temp self.trimmer_heater_target_temperature = trimmer_heater_temp self.primary_heater_state = primary_heater_state + self.primary_efficiency = primary_eff def cmd_start_stop_primary_heater(self, state: int = HeatersStartStop.STOP.name) -> None: """ Index: dialin/dg/rtc.py =================================================================== diff -u -rb031f612a81d0333bf78a7e4675e5d0a0aeb6d1d -rae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc --- dialin/dg/rtc.py (.../rtc.py) (revision b031f612a81d0333bf78a7e4675e5d0a0aeb6d1d) +++ dialin/dg/rtc.py (.../rtc.py) (revision ae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc) @@ -72,12 +72,9 @@ @return: None """ - stop = 1 - payload = integer_to_bytearray(stop) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_DG_STOP_RTC_CLOCK.value, - payload=payload) + message_id=MsgIds.MSG_ID_DG_STOP_RTC_CLOCK.value) self.logger.debug("Stopping the DG RTC") Index: tests/dg_heat_and_chemical_disinfect_test.py =================================================================== diff -u -r840ed25b933e32a993cadfe0d0c44343573c84cb -rae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc --- tests/dg_heat_and_chemical_disinfect_test.py (.../dg_heat_and_chemical_disinfect_test.py) (revision 840ed25b933e32a993cadfe0d0c44343573c84cb) +++ tests/dg_heat_and_chemical_disinfect_test.py (.../dg_heat_and_chemical_disinfect_test.py) (revision ae4c305558f0e0dd2fd5326fa4d5ba9edca84fcc) @@ -140,10 +140,11 @@ def get_heaters_info(): info = ('Pri_main_DC, {:5.3f}, Pri_small_DC, {:5.3f}, Pri_state, {}, Trimmer_DC, {:5.3f}, ' - 'Primary_target_temp, {:5.3f}, Trimmer_target_temp, {:5.3f}, '. + 'Primary_target_temp, {:5.3f}, Trimmer_target_temp, {:5.3f}, Primary_eff, {:5.3f}, '. format(dg.heaters.main_primary_heater_duty_cycle, dg.heaters.small_primary_heater_duty_cycle, dg.heaters.primary_heater_state, dg.heaters.trimmer_heater_duty_cycle, - dg.heaters.primary_heaters_target_temperature, dg.heaters.trimmer_heater_target_temperature)) + dg.heaters.primary_heaters_target_temperature, dg.heaters.trimmer_heater_target_temperature, + dg.heaters.primary_efficiency)) return info @@ -297,7 +298,7 @@ f.close() break - elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_RECIRCULATE.name and \ + elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_GEN_IDLE.name and \ dg.dg_operation_sub_mode == 2 and counter == 1: if recirc_delay < 5: @@ -312,21 +313,21 @@ recirc_delay = 1 counter += 1 - elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_RECIRCULATE.name and \ + elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_GEN_IDLE.name and \ dg.dg_operation_sub_mode == 2 and counter == 2: dg.hd_proxy.cmd_drain(tare_load_cell=True) counter += 1 timer = 1 - elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_RECIRCULATE.name and \ + elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_GEN_IDLE.name and \ dg.dg_operation_sub_mode == 2 and counter == 3: timer += 1 if timer > 4: dg.hd_proxy.cmd_fill(volume=1700) counter += 1 - elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_RECIRCULATE.name and \ + elif DGOperationModes(dg.dg_operation_mode).name == DGOperationModes.DG_OP_MODE_GEN_IDLE.name and \ dg.dg_operation_sub_mode == 2 and counter == 4: counter = 1 run_number += 1 @@ -553,14 +554,40 @@ # run_chemical_disinfect() - # run_dg() + #run_dg() # run_ro_pump_duty_cycles() # cmd_set_disinfect_ui_screen() # cmd_test_heaters() - collect_treatment_data() + # collect_treatment_data() + print(dg.rtc.get_rtc_epoch()) + + sleep(0.1) + + #dg.rtc.cmd_stop_rtc() + + dg.rtc.cmd_set_rtc_time_and_date(45, 27, 17, 4, 11, 2021) + + """ + sleep(6) + + print(dg.rtc.get_rtc_epoch()) + + sleep(1) + + dg.rtc.cmd_set_rtc_time_and_date(22, 18, 17, 4, 11, 2021) + + while True: + print(dg.rtc.get_rtc_epoch()) + sleep(1) + """ + + + + +