Index: leahi_dialin/common/msg_ids.py =================================================================== diff -u -r2f5eb156493bb326016ef7b921d1b05debfc5f3b -r8bcac0e6e7960de5d9bdf925bbf5581cdc97df31 --- leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 2f5eb156493bb326016ef7b921d1b05debfc5f3b) +++ leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 8bcac0e6e7960de5d9bdf925bbf5581cdc97df31) @@ -202,6 +202,7 @@ MSG_ID_TD_BARO_PRESSURE_OVERRIDE = 0x8041 MSG_ID_TD_TEMPERATURE_OVERRIDE = 0x8042 MSG_ID_TD_TEMPERATURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0x8043 + MSG_ID_TD_EJECTOR_OPT_SENSOR_OVERRIDE_REQUEST = 0x8044 MSG_ID_TD_TRAINING_TEST_OVERRIDE_REQUEST = 0x8999 Index: leahi_dialin/common/td_defs.py =================================================================== diff -u -r175101bed0d998f3e0c6ff24d90603acb0106e4d -r8bcac0e6e7960de5d9bdf925bbf5581cdc97df31 --- leahi_dialin/common/td_defs.py (.../td_defs.py) (revision 175101bed0d998f3e0c6ff24d90603acb0106e4d) +++ leahi_dialin/common/td_defs.py (.../td_defs.py) (revision 8bcac0e6e7960de5d9bdf925bbf5581cdc97df31) @@ -249,7 +249,9 @@ class TDEjectorAttributes(DialinEnum): STATE = 0 # Ejector State to command SET_SPEED = 1 # Ejector Set Speed - NUM_OF_EJECTOR_ATTRIBUTES = 2 # Number of Ejector Attributes + OPT_SNSR_RETRACT = 2 # Ejector optical sensor retract + OPT_SNSR_ENGAGE = 3 # Ejector optical sensor engage + NUM_OF_EJECTOR_ATTRIBUTES = 4 # Number of Ejector Attributes @unique class TDPressureSensorNames(DialinEnum): Index: leahi_dialin/td/modules/ejector.py =================================================================== diff -u -rec8a2600b9e8cf6fe7e02c200a1c24221ca86863 -r8bcac0e6e7960de5d9bdf925bbf5581cdc97df31 --- leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision ec8a2600b9e8cf6fe7e02c200a1c24221ca86863) +++ leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 8bcac0e6e7960de5d9bdf925bbf5581cdc97df31) @@ -51,7 +51,9 @@ self.h5_motor = { TDEjectorNames.H5_MOTOR.name: { TDEjectorAttributes.STATE.name: 0, - TDEjectorAttributes.SET_SPEED.name: 0.0 + TDEjectorAttributes.SET_SPEED.name: 0.0, + TDEjectorAttributes.OPT_SNSR_RETRACT: 0, + TDEjectorAttributes.OPT_SNSR_ENGAGE: 0 } } self.td_ejector_timestamp = 0 @@ -68,6 +70,10 @@ message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.h5_motor[TDEjectorNames.H5_MOTOR.name][TDEjectorAttributes.SET_SPEED.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + self.h5_motor[TDEjectorNames.H5_MOTOR.name][TDEjectorAttributes.OPT_SNSR_RETRACT.name] = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + self.h5_motor[TDEjectorNames.H5_MOTOR.name][TDEjectorAttributes.OPT_SNSR_ENGAGE.name] = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] self.td_ejector_timestamp = timestamp @@ -175,4 +181,49 @@ return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + return False + + def cmd_ejector_optical_sensor_override(self, sensor: int, sensor_active: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the ejector optical sensor override command + . + Constraints: + Must be logged into TD. + Optical sensor retract ID = 0 + Optical sensor engage ID = 1 + + Sensor active (engage) = 0 + Sensor inactive (retract) = 1 + + @param sensor: int - sensor ID + @param sensor_active: int - override to be active or inactive + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sen = integer_to_bytearray(sensor) + active = integer_to_bytearray(sensor_active) + payload = rst + active + sen + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, + message_id=MsgIds.MSG_ID_TD_EJECTOR_OPT_SENSOR_OVERRIDE_REQUEST.value, + payload=payload) + + self.logger.debug("Override sensor ID {} to {}".format(sen, active)) + + # 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 = "Override sensor {} to {}".format(sen, active) + self.logger.debug(str_res) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False