Index: dialin/dg/fans.py =================================================================== diff -u -r42100367185571479b8e07191b2c423314f23aef -r7b757e5f7c3787ee2e8af80716767707ac2bab74 --- dialin/dg/fans.py (.../fans.py) (revision 42100367185571479b8e07191b2c423314f23aef) +++ dialin/dg/fans.py (.../fans.py) (revision 7b757e5f7c3787ee2e8af80716767707ac2bab74) @@ -130,7 +130,7 @@ """ return self.dg_fans_target_rpm - @publish(['target_duty_cycle', 'dg_fans_target_rpm', 'inlet_1_rpm', 'inlet_2_rpm', 'inlet_3_rpm', 'outlet_1_rpm', + @publish(['dg_fans_duty_cycle', 'dg_fans_target_rpm', 'inlet_1_rpm', 'inlet_2_rpm', 'inlet_3_rpm', 'outlet_1_rpm', 'outlet_2_rpm', 'outlet_3_rpm', 'rpm_alarm_time_offset']) def _handler_fans_sync(self, message): """ @@ -139,7 +139,7 @@ @param message: published thermistors message @return: none """ - self.target_duty_cycle = struct.unpack('f', bytearray( + self.dg_fans_duty_cycle = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.dg_fans_target_rpm = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] @@ -155,7 +155,7 @@ message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] self.outlet_3_rpm = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.rpm_alarm_time_offset = struct.unpack('f', bytearray( + self.rpm_alarm_time_offset = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] def cmd_fans_rpm_override(self, fan: int, rpm: float, reset: int = NO_RESET) -> int: Index: dialin/dg/sw_config.py =================================================================== diff -u -r115cccfba180844d47d6afd541f0af14043b8642 -r7b757e5f7c3787ee2e8af80716767707ac2bab74 --- dialin/dg/sw_config.py (.../sw_config.py) (revision 115cccfba180844d47d6afd541f0af14043b8642) +++ dialin/dg/sw_config.py (.../sw_config.py) (revision 7b757e5f7c3787ee2e8af80716767707ac2bab74) @@ -5,11 +5,12 @@ from collections import OrderedDict from enum import unique from logging import Logger +from time import sleep from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import AbstractSubSystem, DialinEnum, publish -from ..utils.nv_ops_utils import NVOpsUtils +from ..utils.nv_ops_utils import NVOpsUtils, Observer @unique @@ -76,7 +77,7 @@ return status - def cmd_request_dg_sw_config_record(self) -> int: + def _cmd_request_dg_sw_config_record(self) -> int: """ Handles getting DG software config record from firmware. @@ -244,6 +245,14 @@ return sw_configs, groups_byte_size - def cmd_get_dg_sw_config_record(self): + def cmd_get_dg_sw_config_record(self, report_address: str = None): - self._utilities.prepare_excel_report(self._FIRMWARE_STACK_NAME, self._NON_VOLATILE_RECORD_NAME) + # Create the excel report + self._utilities.prepare_excel_report(self._FIRMWARE_STACK_NAME, self._NON_VOLATILE_RECORD_NAME, report_address) + + self._cmd_request_dg_sw_config_record() + observer = Observer("dg_sw_config_record") + observer.update() + while not observer.received: + sleep(0.2) + Index: dialin/utils/nv_ops_utils.py =================================================================== diff -u -r115cccfba180844d47d6afd541f0af14043b8642 -r7b757e5f7c3787ee2e8af80716767707ac2bab74 --- dialin/utils/nv_ops_utils.py (.../nv_ops_utils.py) (revision 115cccfba180844d47d6afd541f0af14043b8642) +++ dialin/utils/nv_ops_utils.py (.../nv_ops_utils.py) (revision 7b757e5f7c3787ee2e8af80716767707ac2bab74) @@ -136,19 +136,21 @@ os.mkdir(self._workspace_dir) os.chdir(self._workspace_dir) - def prepare_excel_report(self, firmware_stack: str, record_name: str, directory: str = None): + def prepare_excel_report(self, firmware_stack: str, record_name: str, directory: str): """ Publicly accessible function to prepare the excel report @param firmware_stack: (str) firmware stack name (e.g. "HD" or "DG") @param record_name: (str) record type to check such as calibration, system, ... - @param directory: (str) the directory in which to write the excel document. The default is None + @param directory: (str) the directory in which to write the excel document. @return none """ path = '' is_report_found = False - # If the + # If a directory is provided and there is not a folder in that address, create the + # directory. Set the workspace directory to the provided directory. If a directory was not + # provided, create a workspace in the default position if not os.path.isdir(directory) and directory is not None: # Create the directory and go to it os.mkdir(directory) Index: tests/dg_tests.py =================================================================== diff -u -r115cccfba180844d47d6afd541f0af14043b8642 -r7b757e5f7c3787ee2e8af80716767707ac2bab74 --- tests/dg_tests.py (.../dg_tests.py) (revision 115cccfba180844d47d6afd541f0af14043b8642) +++ tests/dg_tests.py (.../dg_tests.py) (revision 7b757e5f7c3787ee2e8af80716767707ac2bab74) @@ -185,12 +185,12 @@ def get_dg_fans_info(): - info = ('Target_fans_DC, {:5.3f}, Inlet1_RPM, {:5.3f}, Outlet1_RPM, {:5.3f}, Inlet2_RPM, {:5.3f}, ' - 'Outlet2_RPM, {:5.3f}, Inlet3_RPM, {:5.3f}, Outlet3_RPM, {:5.3f}, Board_temp, {:5.3f}, ' + info = ('Target_fans_DC, {:5.3f}, Inlet1_RPM, {:5.3f}, Inlet2_RPM, {:5.3f}, Inlet3_RPM, {:5.3f}, ' + 'Outlet1_RPM, {:5.3f}, Outlet2_RPM, {:5.3f}, Outlet3_RPM, {:5.3f}, Board_temp, {:5.3f}, ' 'Power_supply_1, {:5.3f}, Power_supply_2, {:5.3f}, FPGA_temp, {:5.3f}, Load_cell_A1_B1, {:5.3f}, ' 'Load_cell_A2_B2, {:5.3f}, ' - .format(dg.fans.dg_fans_duty_cycle, dg.fans.inlet_1_rpm, dg.fans.inlet_2_rpm, dg.fans.inlet_2_rpm, - dg.fans.outlet_2_rpm, dg.fans.inlet_3_rpm, dg.fans.outlet_3_rpm, + .format(dg.fans.dg_fans_duty_cycle, dg.fans.inlet_1_rpm, dg.fans.inlet_2_rpm, dg.fans.inlet_3_rpm, + dg.fans.outlet_1_rpm, dg.fans.outlet_2_rpm, dg.fans.outlet_3_rpm, dg.thermistors.thermistors[ThermistorsNames.THERMISTOR_ONBOARD_NTC.name], dg.thermistors.thermistors[ThermistorsNames.THERMISTOR_POWER_SUPPLY_1.name], dg.thermistors.thermistors[ThermistorsNames.THERMISTOR_POWER_SUPPLY_2.name], @@ -448,7 +448,7 @@ sleep(1) -def test_fans_alarms(): +def test_hd_fans_alarms(): f = open("/home/fw/projects/dialin/tests/fans_issues.log", "w") counter = 0 while counter < 10: @@ -490,6 +490,45 @@ break +def test_dg_fans_alarms(): + f = open("/home/fw/projects/dialin/tests/dg_fans_issues.log", "w") + counter = 0 + for fan in range(6): + + dg.cmd_dg_software_reset_request() + sleep(1) + dg.alarms.clear_dialin_alarms() + + while True: + if dg.dg_operation_mode == DGOperationModes.DG_OP_MODE_STANDBY.value: + dg.cmd_log_in_to_dg() + sleep(1) + dg.fans.cmd_fans_data_broadcast_interval_override(50, reset=0) + sleep(1) + dg.fans.cmd_fans_rpm_override(fan, 1000.0, reset=0) + start_time = datetime.now() + i = 0 + while True: + info = str(fan) + ', ' + str(datetime.now() - start_time) + ', ' + get_dg_fans_info() + '\r' + print(info) + f.write(info) + + if dg.alarms.get_alarm_state(AlarmList.ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE.value): + print(counter, datetime.now() - start_time) + + hd.ui.cmd_ui_user_alarm_response(3) + break + + # if i > 4000 / 50: + # hd.ui.cmd_ui_user_alarm_response(3) + # break + # i += 1 + sleep(0.05) + + counter += 1 + break + + if __name__ == "__main__": dg = DG(log_level='DEBUG') @@ -507,15 +546,17 @@ # cmd_set_disinfect_ui_screen() - collect_treatment_data() + # collect_treatment_data() # collect_hd_treatment() - # test_fans_alarms() + # test_hd_fans_alarms() + test_dg_fans_alarms() +