Index: dialin/common/hd_defs.py =================================================================== diff -u -r350a114f0728459afcffd2faf0b0f04debaca36f -r8bc7a5336b8f69192918eafc465ee1094537f96d --- dialin/common/hd_defs.py (.../hd_defs.py) (revision 350a114f0728459afcffd2faf0b0f04debaca36f) +++ dialin/common/hd_defs.py (.../hd_defs.py) (revision 8bc7a5336b8f69192918eafc465ee1094537f96d) @@ -33,19 +33,13 @@ @unique class HDStandbyStates(DialinEnum): - STANDBY_START_STATE = 0 # Start standby. - STANDBY_WAIT_FOR_TREATMENT_STATE = 1 # Wait for treatment. - STANDBY_WAIT_FOR_DISINFECT_STATE = 2 # Wait for UI to send disinfect option. - STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE = 3 # Wait for DG flush command response. - STANDBY_WAIT_FOR_DG_FLUSH_TO_START_STATE = 4 # Wait for DG flush to start. - STANDBY_DG_FLUSH_IN_PROGRESS_STATE = 5 # DG flush operation is in progress - STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE = 6 # Wait for DG heat disinfect command response. - STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_TO_START_STATE = 7 # Wait for DG heat disinfect to start. - STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE = 8 # DG heat disinfect operation is in progress. - STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE = 9 # Wait for DG chemical disinfect command response. - STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_TO_START_STATE = 10 # Wait for DG chemical disinfect to start. - STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE = 11 # DG chemical disinfect operation is in progress - NUM_OF_STANDBY_STATES = 12 # Number of standby states (sub-modes) + STANDBY_START_STATE = 0 # Start standby (home actuators). + STANDBY_WAIT_FOR_TREATMENT_STATE = 1 # Wait for treatment. + STANDBY_WAIT_FOR_DISINFECT_STATE = 2 # Wait for UI to send disinfect option. + STANDBY_WAIT_FOR_DG_CLEANING_MODE_CMD_RESPONSE_STATE = 3 # Wait for DG cleaning mode command response state. + STANDBY_WAIT_FOR_DG_CLEANING_MODE_TO_START_STATE = 4 # Wait for DG cleaning mode to start state. + STANDBY_CLEANING_MODE_IN_PROGRESS_STATE = 5 # Cleaning mode in progress state. + NUM_OF_STANDBY_STATES = 6 # Number of standby states (sub-modes). @unique class HDInitStates(DialinEnum): Index: dialin/common/msg_ids.py =================================================================== diff -u -rd784180e6543330849bf7fbb6bd9acfd36323706 -r8bc7a5336b8f69192918eafc465ee1094537f96d --- dialin/common/msg_ids.py (.../msg_ids.py) (revision d784180e6543330849bf7fbb6bd9acfd36323706) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 8bc7a5336b8f69192918eafc465ee1094537f96d) @@ -223,6 +223,8 @@ MSG_ID_HD_SEND_CHEM_FLUSH_SAMPLE_PASS_FAIL_TO_DG = 0xC8 MSG_ID_DG_START_STOP_RO_PERMEATE_SAMPLE_MODE_CMD_REQUEST = 0xC9 MSG_ID_DG_RO_PERMEATE_SAMPLE_DATA = 0xCA + MSG_ID_HD_SEND_RO_PERMEATE_SAMPLE_DISPENSE_REQUEST_TO_DG = 0xCB + MSG_ID_DG_SEND_RO_PERMEATE_SAMPLE_DISPENSE_READY_TO_HD = 0xCD MSG_ID_CAN_ERROR_COUNT = 0x999 Index: dialin/dg/ro_permeate_sample.py =================================================================== diff -u -r12a7cb24fdb8f871aa4da49b859e0fef567255b1 -r8bc7a5336b8f69192918eafc465ee1094537f96d --- dialin/dg/ro_permeate_sample.py (.../ro_permeate_sample.py) (revision 12a7cb24fdb8f871aa4da49b859e0fef567255b1) +++ dialin/dg/ro_permeate_sample.py (.../ro_permeate_sample.py) (revision 8bc7a5336b8f69192918eafc465ee1094537f96d) @@ -1,13 +1,22 @@ -import struct from logging import Logger +from enum import unique from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import AbstractSubSystem, publish, DialinEnum from ..utils.conversions import integer_to_bytearray, bytearray_to_integer, bytearray_to_float +@unique +class ROPermeateDispenseMsgStatus(DialinEnum): + DISPENSE_MSG_READY = 0 + DISPENSE_MSG_DISPENSING = 1 + DISPENSE_MSG_CANCEL = 2 + DISPENSE_MSG_DISPENSE = 3 + NUM_OF_DISPENSE_MSG = 4 + + class ROPermeateSample(AbstractSubSystem): """ RO permeate sample class with APIs to set the timing of each of the stages. @@ -23,6 +32,7 @@ self.overall_elapsed_time = 0 self.state_elapsed_time = 0 self.dispensed_volume_ml = 0.0 + self.ro_permeate_dispense_message_status = 0 if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id @@ -40,6 +50,7 @@ self.overall_elapsed_time = 0 self.state_elapsed_time = 0 self.dispensed_volume_ml = 0.0 + self.ro_permeate_dispense_message_status = 0 def get_ro_permeate_sample_state(self) -> int: """ @@ -57,7 +68,26 @@ """ return self.dispensed_volume_ml - @publish(["ro_permeate_sample_state", "overall_elapsed_time", "state_elapsed_time", "dispensed_volume_ml"]) + def cmd_send_hd_dg_is_ready_to_dispense(self): + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_DG_SEND_RO_PERMEATE_SAMPLE_DISPENSE_READY_TO_HD.value) + + self.logger.debug("Sending to HD that DG is ready to dispense") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + @publish(["ro_permeate_sample_state", "overall_elapsed_time", "state_elapsed_time", "dispensed_volume_ml", + "ro_permeate_dispense_message_status"]) def _handler_ro_permeate_sample_sync(self, message, timestamp=0.0): """ Handles published RO permeate sample message @@ -70,8 +100,13 @@ state, index = bytearray_to_integer(payload, index, False) elapsed_time, index = bytearray_to_integer(payload, index, False) state_elapsed_time, index = bytearray_to_integer(payload, index, False) + dispensed_vol_ml, index = bytearray_to_float(payload, index, False) + dispense_msg, index = bytearray_to_integer(payload, index, False) self.ro_permeate_sample_state = state self.overall_elapsed_time = int(elapsed_time / 1000) self.state_elapsed_time = int(state_elapsed_time / 1000) + self.dispensed_volume_ml = dispensed_vol_ml + self.ro_permeate_dispense_message_status = dispense_msg + Index: tests/dg_nvm_scripts.py =================================================================== diff -u -rbddfb595199bfe5d01671d31c218a2f647f6d7d3 -r8bc7a5336b8f69192918eafc465ee1094537f96d --- tests/dg_nvm_scripts.py (.../dg_nvm_scripts.py) (revision bddfb595199bfe5d01671d31c218a2f647f6d7d3) +++ tests/dg_nvm_scripts.py (.../dg_nvm_scripts.py) (revision 8bc7a5336b8f69192918eafc465ee1094537f96d) @@ -27,12 +27,12 @@ # It creates a folder called DG_NV_Records in the destination that is called # If no address is provided, the default location is one folder above the dialin folder wherever it is installed # in your computer. - dg.sw_configs.cmd_get_dg_sw_config_record() + #dg.sw_configs.cmd_get_dg_sw_config_record() # Use cmd_set_dg_sw_config_record() set the changes back to firmware # This function requires an address for the excel report. Use the absolute address of your excel report like the # example below - # dg.sw_configs.cmd_update_dg_sw_config_record('/home/fw/projects/DG_NV_Records/2023-05-05-DG-SW-CONFIGS-Record.xlsx') + dg.sw_configs.cmd_update_dg_sw_config_record('/home/fw/projects/DG_NV_Records/2023-06-10-DG-SW-CONFIGS-Record.xlsx') # Use this function to reset the configuration records to all be 0 #dg.sw_configs.cmd_reset_dg_sw_config_record() @@ -112,14 +112,14 @@ if dg.cmd_log_in_to_dg(): - run_sw_configs_commands() + #run_sw_configs_commands() #run_calibration_commands() #run_system_commands() #run_usage_info_commands() - #run_service_commands() + run_service_commands() Index: tests/dg_tests.py =================================================================== diff -u -rbddfb595199bfe5d01671d31c218a2f647f6d7d3 -r8bc7a5336b8f69192918eafc465ee1094537f96d --- tests/dg_tests.py (.../dg_tests.py) (revision bddfb595199bfe5d01671d31c218a2f647f6d7d3) +++ tests/dg_tests.py (.../dg_tests.py) (revision 8bc7a5336b8f69192918eafc465ee1094537f96d) @@ -49,6 +49,7 @@ from dialin.hd.voltages import HDMonitoredVoltages from dialin.hd.pretreatment import PreTreatmentRsrvrState from dialin.common.dg_defs import DGFlushStates, DGHeatDisinfectActiveCoolStates, DGROPermeateSampleSates +from dialin.dg.ro_permeate_sample import ROPermeateDispenseMsgStatus from dialin.common.test_config_defs import DGTestConfigOptions, HDTestConfigOptions from time import sleep from datetime import datetime @@ -134,8 +135,11 @@ overall_elapsed_time = dg.ro_permeate_sample.overall_elapsed_time state_elapsed_time = dg.ro_permeate_sample.state_elapsed_time - info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, ' - .format(state, overall_elapsed_time, state_elapsed_time)) + info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, dispense_vol_ml, {:5.3f}, dispense_msg, {}, ' + 'dg_op_mode, {}, ' + .format(state, overall_elapsed_time, state_elapsed_time, dg.ro_permeate_sample.dispensed_volume_ml, + ROPermeateDispenseMsgStatus(dg.ro_permeate_sample.ro_permeate_dispense_message_status).name, + dg.dg_operation_mode)) return info @@ -331,9 +335,10 @@ def get_concentrate_pumps_info(): info = ('Bicarb_curr_speed, {:5.3f}, Bicarb_speed, {:5.3f}, Acid_curr_speed, {:5.3f}, Acid_speed, {:5.3f}, ' - 'CPo, {:5.3f}, CD1, {:5.3f}, CD2, {:5.3f}, CP1_state, {}, CP2_state, {}, CPi_status, {}, CPo_status, {}, ' - 'CD1_status, {}, CD2_status, {}, CP1_pulse, {:5.3f}, CP2_pulse, {:5.3f}, Acid_tgt_speed, {:5.3f}, ' - 'Bicarb_tgt_speed, {:5.3f}, CP1_parked, {}, CP1_park_fault, {}, CP2_parked, {}, CP2_park_fault, {}, ' + 'CPi, {:5.3f}, CPo, {:5.3f}, CD1, {:5.3f}, CD2, {:5.3f}, CP1_state, {}, CP2_state, {}, CPi_status, {}, ' + 'CPo_status, {}, CD1_status, {}, CD2_status, {}, CP1_pulse, {:5.3f}, CP2_pulse, {:5.3f}, ' + 'Acid_tgt_speed, {:5.3f}, Bicarb_tgt_speed, {:5.3f}, CP1_parked, {}, CP1_park_fault, {}, CP2_parked, {}, ' + 'CP2_park_fault, {}, ' .format(dg.concentrate_pumps.concentrate_pump_cp2_current_set_speed, dg.concentrate_pumps.concentrate_pump_cp2_measured_speed, dg.concentrate_pumps.concentrate_pump_cp1_current_set_speed, @@ -431,8 +436,16 @@ #dg.concentrate_pumps.cmd_concentrate_pump_broadcast_interval_override(50) #sleep(1) + dg.test_configs.cmd_set_test_config(DGTestConfigOptions.TEST_CONFIG_MIX_WITH_WATER.value) + sleep(0.5) + hd.test_configs.cmd_set_test_config(HDTestConfigOptions.TEST_CONFIG_USE_WET_CARTRIDGE.value) + sleep(0.5) + hd.test_configs.cmd_set_test_config(HDTestConfigOptions.TEST_CONFIG_SKIP_DISINFECT_AND_SERVICE_TX_BLOCKERS.value) + sleep(0.5) + hd.test_configs.cmd_set_test_config(HDTestConfigOptions.TEST_CONFIG_DISABLE_WET_SELFTEST_DISPLACEMENT_CHECK.value) + #dg.hd_proxy.cmd_start_stop_dg() - #sleep(1) + #sleep(4) #dg.hd_proxy.cmd_fill() @@ -711,15 +724,16 @@ #run_chemical_disinfect() - #hd.alarms.cmd_alarm_state_override(319, 1) + #hd.alarms.cmd_alarm_state_override(301, 1) + #dg.ro_permeate_sample.cmd_send_hd_dg_is_ready_to_dispense() #run_dg() # cmd_set_disinfect_ui_screen() - #collect_treatment_data() + collect_treatment_data() - run_ro_permeate_sample() + #run_ro_permeate_sample() #collect_hd_treatment() Index: tests/hd_nvm_scripts.py =================================================================== diff -u -r8ac75cccb937866cb13c49a97e91bb9e1060a9d8 -r8bc7a5336b8f69192918eafc465ee1094537f96d --- tests/hd_nvm_scripts.py (.../hd_nvm_scripts.py) (revision 8ac75cccb937866cb13c49a97e91bb9e1060a9d8) +++ tests/hd_nvm_scripts.py (.../hd_nvm_scripts.py) (revision 8bc7a5336b8f69192918eafc465ee1094537f96d) @@ -33,7 +33,7 @@ # Use cmd_update_hd_sw_config_record() set the changes back to firmware # This function requires an address for the excel report. Use the absolute address of your excel report like the # example below - hd.sw_configs.cmd_update_hd_sw_config_record('/home/fw/projects/HD_NV_Records/2023-05-14-HD-SW-CONFIGS-Record.xlsx') + hd.sw_configs.cmd_update_hd_sw_config_record('/home/fw/projects/HD_NV_Records/2023-06-10-HD-SW-CONFIGS-Record.xlsx') # Use this function to reset the configuration records to all be 0 #hd.sw_configs.cmd_reset_hd_sw_config_record()