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