diff --git a/src/Smaract_mcs2.py b/src/Smaract_mcs2.py index e209541b027b6d8a65465a8264c3334a4ab65c9d..3992b0a678d6499fd6f0d18e062559b31bd816e1 100755 --- a/src/Smaract_mcs2.py +++ b/src/Smaract_mcs2.py @@ -206,24 +206,29 @@ class Smaract_mcs2 (PyTango.Device_4Impl): print "Socket connection raised exception.\n" self.status_string = "Socket Failed: " + str(e) self.error_stream(self.status_string) + self.socket_alive = False #------------------------------------------------------------------ # Checks if the controller is connected. # Returns True/False #------------------------------------------------------------------ def socket_check(self): - if self.socket.state() != PyTango.DevState.ON: - # Try to reconnect once... - self.debug_stream("Socket not in ON, reconnect.") - self.socket_reconnect() - time.sleep(0.2) + try: if self.socket.state() != PyTango.DevState.ON: - self.set_state(PyTango.DevState.FAULT) - self.status_string = "Socket device not in ON state. INIT failed." - self.debug_stream("Socket still not in ON, init failed.") - return False - self.debug_stream("Socket device is in ON.") - return True + # Try to reconnect once... + self.debug_stream("Socket not in ON, reconnect.") + self.socket_reconnect() + time.sleep(0.2) + if self.socket.state() != PyTango.DevState.ON: + self.set_state(PyTango.DevState.FAULT) + self.status_string = "Socket device not in ON state. INIT failed." + self.debug_stream("Socket still not in ON, init failed.") + return False + self.debug_stream("Socket device is in ON.") + return True + except: + self.socket_alive = False + return False #------------------------------------------------------------------ # Write socket utility @@ -580,7 +585,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.socket_write(cmd_str) def is_Acceleration_allowed(self, req_type): - return req_type is PyTango.AttReqType.READ_REQ or (self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,) and self.sensor_present) + return req_type is PyTango.AttReqType.READ_REQ or (self.sensor_present and self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,)) def read_Velocity(self, attr): # self.debug_stream("In read_Velocity()") @@ -606,7 +611,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.socket_write(cmd_str) def is_Velocity_allowed(self, req_type): - return req_type is PyTango.AttReqType.READ_REQ or (self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,) and self.sensor_present) + return req_type is PyTango.AttReqType.READ_REQ or (self.sensor_present and self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,)) def read_HoldTime(self, attr): # self.debug_stream("In read_HoldTime()") @@ -629,7 +634,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.socket_write(cmd_str) def is_HoldTime_allowed(self, req_type): - return self.sensor_present + return req_type is PyTango.AttReqType.READ_REQ or (self.sensor_present and self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,)) def read_LSInvert(self, attr): # self.debug_stream("In read_LSInvert()") @@ -684,7 +689,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.socket_write(cmd_str) def is_LSOffset_allowed(self, req_type): - return req_type is PyTango.AttReqType.READ_REQ or (self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,) and self.sensor_present) + return req_type is PyTango.AttReqType.READ_REQ or (self.sensor_present and self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,)) def read_HighLimitPosition(self, attr): # self.debug_stream("In read_HighLimitPosition()") @@ -708,7 +713,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.socket_write(cmd_str) def is_HighLimitPosition_allowed(self, req_type): - return req_type is PyTango.AttReqType.READ_REQ or (self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,) and self.sensor_present) + return req_type is PyTango.AttReqType.READ_REQ or (self.sensor_present and self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,)) def read_LowLimitPosition(self, attr): # self.debug_stream("In read_LowLimitPosition()") @@ -732,7 +737,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.socket_write(cmd_str) def is_LowLimitPosition_allowed(self, req_type): - return req_type is PyTango.AttReqType.READ_REQ or (self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,) and self.sensor_present) + return req_type is PyTango.AttReqType.READ_REQ or (self.sensor_present and self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,)) def read_Amplitude(self, attr): # self.debug_stream("In read_Amplitude()") @@ -892,13 +897,14 @@ class Smaract_mcs2 (PyTango.Device_4Impl): PyTango.Except.throw_exception("Read Sensor Enabled Failed", "Unexpected reply format", "read_SensorEnabled()") attr.set_value(self.attr_SensorEnabled_read) - def write_SensorPowerMode(self, attr): # self.debug_stream("In write_SensorEnabled()") data = attr.get_write_value() cmd_str = ":CHAN" + self.chan + ":SENS:MODE " + str(data) self.socket_write(cmd_str) + def is_SensorPowerMode_allowed(self, req_type): + return req_type is PyTango.AttReqType.READ_REQ or (self.sensor_present and self.get_state() not in (PyTango.DevState.MOVING, PyTango.DevState.FAULT,)) def read_IsReferenced(self, attr): attr.set_value(self.attr_IsReferenced_read) @@ -907,7 +913,6 @@ class Smaract_mcs2 (PyTango.Device_4Impl): attr.set_value(self.attr_IsCalibrated_read) - #----------------------------------------------------------------------------- # Smaract_mcs2 command methods #----------------------------------------------------------------------------- @@ -945,9 +950,9 @@ class Smaract_mcs2 (PyTango.Device_4Impl): def Reference(self): self.debug_stream("In Reference()") - if self.attr_IsReferenced_read: - self.debug_stream("Already referenced. Do nothing.") - return + # if self.attr_IsReferenced_read: + # self.debug_stream("Already referenced. Do nothing.") + # return # Evaluate the last known physical position based on the values stored in tango db # and pick the referencing direction accordingly: # Referencing/Calibrating mode 0 is forward (default), 1 is backward @@ -1000,23 +1005,38 @@ class Smaract_mcs2 (PyTango.Device_4Impl): return self.sensor_present - def ForceReference(self, ref_mode): - self.debug_stream("In ForceReference()") - if self.attr_IsReferenced_read: - self.debug_stream("Already referenced. Do nothing.") - return - if ref_mode not in [0, 1]: - return + def ReferenceForward(self): + self.debug_stream("In ReferenceForward()") + # if self.attr_IsReferenced_read: + # self.debug_stream("Already referenced. Do nothing.") + # return + ref_mode = 0 cmd_str = ":CHAN" + self.chan + ":REF:OPT " + str(ref_mode) self.socket_write(cmd_str) # start actual referencing: cmd_str = ":REF" + self.chan self.socket_write(cmd_str) - def is_ForceReference_allowed(self): + def is_ReferenceForward_allowed(self): return self.sensor_present + def ReferenceBackward(self): + self.debug_stream("In ReferenceBackward()") + # if self.attr_IsReferenced_read: + # self.debug_stream("Already referenced. Do nothing.") + # return + ref_mode = 1 + cmd_str = ":CHAN" + self.chan + ":REF:OPT " + str(ref_mode) + self.socket_write(cmd_str) + # start actual referencing: + cmd_str = ":REF" + self.chan + self.socket_write(cmd_str) + + def is_ReferenceBackward_allowed(self): + return self.sensor_present + + def Go(self): # self.debug_stream("In Go()") if self.attr_NextPosition_read != self.attr_Position_read: @@ -1024,7 +1044,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.move_abs(self.attr_NextPosition_read) def is_Go_allowed(self): - return self.get_state() in (PyTango.DevState.ON,) and self.sensor_present + return self.sensor_present and self.get_state() in (PyTango.DevState.ON,) def StepUp(self): @@ -1111,7 +1131,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.socket_write(cmd_str) def is_DefinePosition_allowed(self): - return self.get_state() in (PyTango.DevState.ON,) and self.sensor_present + return self.sensor_present and self.get_state() in (PyTango.DevState.ON,) def GoToHighLimit(self): @@ -1122,7 +1142,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.move_abs(self.attr_HighLimitPosition_read) def is_GoToHighLimit_allowed(self): - return self.get_state() in (PyTango.DevState.ON,) and self.sensor_present + return self.sensor_present and self.get_state() in (PyTango.DevState.ON,) def GoToLowLimit(self): @@ -1133,7 +1153,7 @@ class Smaract_mcs2 (PyTango.Device_4Impl): self.move_abs(self.attr_LowLimitPosition_read) def is_GoToLowLimit_allowed(self): - return self.get_state() in (PyTango.DevState.ON,) and self.sensor_present + return self.sensor_present and self.get_state() in (PyTango.DevState.ON,) def Stop(self): @@ -1236,8 +1256,11 @@ class Smaract_mcs2Class(PyTango.DeviceClass): 'Reference': [[PyTango.DevVoid, "none"], [PyTango.DevVoid, "none"]], - 'ForceReference': - [[PyTango.DevShort, "direction 0=fwd, 1=bkw"], + 'ReferenceForward': + [[PyTango.DevShort, "none"], + [PyTango.DevVoid, "none"]], + 'ReferenceBackward': + [[PyTango.DevShort, "none"], [PyTango.DevVoid, "none"]], 'Go': [[PyTango.DevVoid, "none"], @@ -1295,7 +1318,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): positioners and in degrees/s^2 for rotary positioners. \ The valid range is 0..10. A value of 0 (default) deactivates \ the acceleration control feature.", - 'memorized':"false", + 'memorized':"true", }], 'Velocity': [[PyTango.DevDouble, @@ -1307,7 +1330,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): 'description': "Defines the speed in mm/s for linear positioners \ and in degrees/s for rotary positioners. The valid range is 0..100. \ A value of 0 (default) deactivates the speed control feature.", - 'memorized':"false", + 'memorized':"true", }], 'Frequency': [[PyTango.DevLong, @@ -1318,7 +1341,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): 'min value': "1", 'description': "Open-loop steps frequency in Hertz.\ The default value is 100. Used in stepper mode only.", - 'memorized':"false", + 'memorized':"true", }], 'Amplitude': [[PyTango.DevLong, @@ -1330,7 +1353,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): 'description': "Voltage in binary form, the valid range is 1..65535 \ A value of 65535 (max) equals to 100 Volts. Lower amplitude values \ result in a smaller step width. Used in stepper mode only.", - 'memorized':"false", + 'memorized':"true", }], 'Voltage': [[PyTango.DevDouble, @@ -1435,7 +1458,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): 'description': "If selected, write Position is disabled. \ Instead, the next position attribute must be set and \ Go command executed.", - 'memorized':"true" + 'memorized':"true", }], 'HighLimitPosition': [[PyTango.DevDouble, @@ -1444,7 +1467,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): { 'description': "High limit position in mm for linear sensors \ and in degrees for rotary sensors.", - 'memorized':"false", + 'memorized':"true", }], 'LowLimitPosition': [[PyTango.DevDouble, @@ -1453,7 +1476,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): { 'description': "Low limit position in mm for linear sensors \ and in degrees for rotary sensors.", - 'memorized':"false", + 'memorized':"true", }], 'PositionBackup': [[PyTango.DevDouble, @@ -1473,7 +1496,7 @@ class Smaract_mcs2Class(PyTango.DeviceClass): 'min value':"0", 'description': "Selects the mode. Must be either \ 0 (disabled), 1 (enabled) or 2 (powersave).", - 'memorized':"false", + 'memorized':"true", }], 'IsCalibrated': [[PyTango.DevBoolean,