Index: dialin/common/msg_defs.py =================================================================== diff -u -r5a37805d29dc8d0a1013b5bde6855b3cde9ee853 -ra3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision 5a37805d29dc8d0a1013b5bde6855b3cde9ee853) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision a3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2) @@ -77,8 +77,8 @@ MSG_ID_DG_HEAT_DISINFECT_DATA = 0x37 # DG heat disinfection publish data MSG_ID_UI_START_TREATMENT = 0x38 # UI user request to initiate a treatment MSG_ID_HD_START_TREATMENT_RESPONSE = 0x39 # HD response to user request to initiate a treatment - MSG_ID_HD_VALVES_DATA = 0x3B # HD broadcast of valves data - MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0x3A # UI user confirmation of treatment parameters + MSG_ID_HD_VALVES_DATA = 0x3A # HD broadcast of valves data + MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0x3B # UI user confirmation of treatment parameters MSG_ID_UI_TREATMENT_END_REQUEST = 0x3C # UI user treatment end request MSG_ID_HD_TREATMENT_END_RESPONSE = 0x3D # HD response to user request to end treatment MSG_ID_HD_AIR_TRAP_DATA = 0x003E # HD broadcast of air trap data @@ -96,6 +96,7 @@ MSG_ID_DG_CALIBRATION_DATA = 0x4A # DG broadcast calibration data MSG_ID_HD_HEPARIN_PAUSE_RESUME_RESPONSE = 0x4C # HD Heparin Pause/Resume Response MSG_ID_HD_HEPARIN_DATA = 0x4D # HD Broadcast heparin data + MSG_ID_UI_PRE_TREATMENT_UF_REQUEST = 0x4F # UI UF Initialization Request MSG_ID_HD_PRE_TREATMENT_UF_RESPONSE = 0x50 # HD response to user request to adjust the ultrafiltration in pre-treatment MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing @@ -214,6 +215,7 @@ MSG_ID_DG_DEBUG_EVENT = 0xFFF2 # DG debug event text to be logged in event log END_OF_MSG_IDS = 0xFFF3 # End of system message IDs + MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0XFFFF # Generic acknowledge @unique class RequestRejectReasons(DialinEnum): Index: dialin/protocols/CAN.py =================================================================== diff -u -rf3ea3f9a7864df4f448b60a3192ca83c51c4e881 -ra3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2 --- dialin/protocols/CAN.py (.../CAN.py) (revision f3ea3f9a7864df4f448b60a3192ca83c51c4e881) +++ dialin/protocols/CAN.py (.../CAN.py) (revision a3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2) @@ -69,7 +69,7 @@ return {'channel_id': channel_id, 'message': message} @staticmethod - def build_message(channel_id=0, message_id=0, payload=None): + def build_message(channel_id=0, message_id=0, payload=None, seq=None): """ Builds a Denali message @@ -86,7 +86,10 @@ if 0 <= message_id <= DenaliMessage.MAX_MSG_ID_NUMBER: # Add a zero seq # for dialin messages for now - seq_no = 0 + if seq is not None: + seq_no = seq + else: + seq_no = 0 message_seq_in_bytes = seq_no.to_bytes(2, byteorder=DenaliMessage.BYTE_ORDER) message_list += [message_seq_in_bytes[0]] Index: dialin/ui/hd_simulator.py =================================================================== diff -u -r5a37805d29dc8d0a1013b5bde6855b3cde9ee853 -ra3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2 --- dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision 5a37805d29dc8d0a1013b5bde6855b3cde9ee853) +++ dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision a3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2) @@ -177,6 +177,9 @@ MsgIds.MSG_ID_UI_START_TREATMENT.value, self._handler_ui_start_treatment) self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_UI_PRE_TREATMENT_UF_REQUEST.value, + self._handler_ui_pre_treatment_uf_request) + self.can_interface.register_receiving_publication_function(channel_id, MsgIds.MSG_ID_UI_NEW_TREATMENT_PARAMS.value, self._handler_ui_validate_parameters) self.can_interface.register_receiving_publication_function(channel_id, @@ -329,14 +332,54 @@ self.logger.debug("Received UI confirmation of Treatment Parameters. ") + self.logger.debug("Priming ...") state = 0 total_seconds = 100 for seconds_remaining in range(total_seconds, -1, -1): if seconds_remaining % (total_seconds // 3) == 0: state += 1 self.cmd_send_priming_time_remaining(state, seconds_remaining, total_seconds) sleep(0.05) + self.logger.debug("Finished priming.") + def _handler_ui_pre_treatment_uf_request(self, message): + """ + Handles the ui pre treatment uf request and sends a response + @param message: The ui pretreatment uf request message + @return: None + """ + + START_POS = DenaliMessage.PAYLOAD_START_INDEX + END_POS = START_POS + 4 + + uf_volume = struct.unpack('f', bytearray( + message['message'][START_POS:END_POS]))[0] + + print("Received UF Volume: {0} mL".format(uf_volume)) + + self.cmd_send_acknowledge(message) + self.cmd_send_uf_treatment_response(1, 0, uf_volume) + + def cmd_send_acknowledge(self, message: dict): + """ + Sends a generic acknowledge + + @param message: (dict) The message that was sent we need to ACK + @return: None + """ + seq = struct.unpack('h', bytearray( + message['message'][DenaliMessage.MSG_SEQ_INDEX:DenaliMessage.MSG_ID_INDEX]))[0] + + # send back empty payload since this is an ACK + payload = bytearray() + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=MsgIds.MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK.value, + payload=payload, + seq=-seq) + + self.can_interface.send(message, 0) + def _handler_ui_start_treatment(self, message): """ Handler function to start a treatment @@ -401,7 +444,7 @@ def cmd_send_uf_treatment_response(self, accepted, reason, volume): """ Sends the uf volume adjustment response message in pre-treatment - :param accepted: (bool) the acceptance + :param accepted: (uint) the acceptance, 1 = accepted, 0 = rejected :param reason: (uint) the reason for rejection :param volume: (float) the acceptable/accepted ultrafiltration volume :return: none Index: tests/test_gen_requirements.py =================================================================== diff -u -r287af45040e35882e001fb3ea835f304007870c4 -ra3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2 --- tests/test_gen_requirements.py (.../test_gen_requirements.py) (revision 287af45040e35882e001fb3ea835f304007870c4) +++ tests/test_gen_requirements.py (.../test_gen_requirements.py) (revision a3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2) @@ -121,18 +121,23 @@ dg = DG() modules = [ - dg.hd_proxy, - dg.load_cells, - dg.pressures, - dg.reservoirs, - dg.valves, - dg.ro_pump, - dg.drain_pump, - dg.heaters, - dg.temperature_sensors, - dg.conductivity_sensors, - dg.accel, - dg.alarms + # dg.hd_proxy, + # dg.load_cells, + # dg.pressures, + # dg.reservoirs, + # dg.valves, + # dg.ro_pump, + # dg.drain_pump, + # dg.heaters, + # dg.temperature_sensors, + # dg.conductivity_sensors, + # dg.accel, + dg.alarms, + dg.concentrate_pumps, + dg.fans, + dg.heat_disinfect, + dg.thermistors, + dg.uv_reactors, ] gen_publish_requirements(modules) @@ -141,4 +146,4 @@ if __name__ == '__main__': generate_dg_requirements() - generate_hd_requirements() + # generate_hd_requirements() Index: tests/test_hd_simulator.py =================================================================== diff -u -r91dc90bd009bdbf5621dcaa1bc12ab3d691673f7 -ra3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2 --- tests/test_hd_simulator.py (.../test_hd_simulator.py) (revision 91dc90bd009bdbf5621dcaa1bc12ab3d691673f7) +++ tests/test_hd_simulator.py (.../test_hd_simulator.py) (revision a3f3f5ca6fcb24a47bb3056878bb8ff9e3642fd2) @@ -133,7 +133,8 @@ def test_start_confirm_end_treatment(): - hd_simulator = HDSimulator(log_level="PRINT_ONLY") + hd_simulator = HDSimulator(log_level="DEBUG") + hd_simulator.alarms_simulator.cmd_send_clear_alarms() observer = StartTreatmentObserver() hd_simulator.attach(observer)