123 lines
3.8 KiB
Python
123 lines
3.8 KiB
Python
class SmartMagnet(DeviceBase):
|
|
def __init__(self, name):
|
|
#DeviceBase.__init__(self, name, get_context().pluginManager.getDynamicClass("SmartMagnetConfig")())
|
|
DeviceBase.__init__(self, name, DeviceConfig({
|
|
"holdingCurrent":0.0,
|
|
"restingCurrent":0.0,
|
|
"mountCurrent":0.0,
|
|
"unmountCurrent":0.0,
|
|
"reverseCurrent":0.0,
|
|
"reverseTime":0.0,
|
|
}))
|
|
|
|
def doInitialize(self):
|
|
super(SmartMagnet, self).doInitialize()
|
|
self.get_current()
|
|
|
|
def set_current(self, current):
|
|
self.setCache(current, None)
|
|
smc_current.write(current)
|
|
|
|
def get_current(self):
|
|
cur = smc_current.read()
|
|
self.setCache(cur, None)
|
|
return cur
|
|
|
|
def get_current_rb(self):
|
|
self.assert_status()
|
|
return smc_current_rb.read()
|
|
|
|
def get_status(self):
|
|
return smc_magnet_status.read()
|
|
|
|
def assert_status(self):
|
|
if self.get_status() == False:
|
|
raise Exception("Smart Magnet is in faulty status.")
|
|
|
|
def is_mounted(self):
|
|
self.assert_status()
|
|
m1 = smc_mounted_1.read()
|
|
m2 = smc_mounted_2.read()
|
|
if m2==m1:
|
|
raise Exception("Smart Magnet has invalid detection.")
|
|
return m2
|
|
|
|
def set_supress(self, value):
|
|
smc_sup_det.write(value)
|
|
|
|
def get_supress(self):
|
|
return smc_sup_det.read()
|
|
|
|
def check_mounted(self, idle_time =1.0, timeout = -1, interval = 0.01):
|
|
self.assert_status()
|
|
start = time.time()
|
|
last = None
|
|
while True:
|
|
try:
|
|
det = self.is_mounted()
|
|
except:
|
|
det = None
|
|
if det != last:
|
|
settling_timestamp = time.time()
|
|
last = det
|
|
else:
|
|
if det is not None:
|
|
if (time.time()-settling_timestamp > idle_time):
|
|
return det
|
|
if timeout >= 0:
|
|
if (time.time() - start) > timeout:
|
|
raise Exception("Timeout waiting for Smart Magnet detection.")
|
|
time.sleep(interval)
|
|
|
|
|
|
def doUpdate(self):
|
|
try:
|
|
if self.is_mounted():
|
|
self.setState(State.Busy)
|
|
else:
|
|
self.setState(State.Ready)
|
|
except:
|
|
self.setState(State.Fault)
|
|
|
|
def set_holding_current(self):
|
|
self.set_current(self.config.getFieldValue("holdingCurrent"))
|
|
|
|
def set_resting_current(self):
|
|
self.set_current(self.config.getFieldValue("restingCurrent"))
|
|
|
|
def set_mount_current(self):
|
|
self.set_current(self.config.getFieldValue("mountCurrent"))
|
|
|
|
def set_unmount_current(self):
|
|
self.set_current(self.config.getFieldValue("unmountCurrent"))
|
|
|
|
def set_reverse_current(self):
|
|
self.set_current(self.config.getFieldValue("reverseCurrent"))
|
|
|
|
def set_default_current(self):
|
|
if self.is_mounted():
|
|
self.set_holding_current()
|
|
else:
|
|
self.set_resting_current()
|
|
|
|
def is_resting_current(self):
|
|
return self.get_current() == self.config.getFieldValue("restingCurrent")
|
|
|
|
|
|
#Setting resting current to better detect sample
|
|
def enforce_sample_detection(self):
|
|
reverse_wait = float(self.config.getFieldValue("reverseTime"))
|
|
if reverse_wait >0:
|
|
self.set_reverse_current()
|
|
time.sleep(reverse_wait)
|
|
if not self.is_resting_current():
|
|
self.set_resting_current()
|
|
time.sleep(0.2)
|
|
|
|
|
|
add_device(SmartMagnet("smart_magnet"), force = True)
|
|
|
|
smart_magnet.polling = 1000
|
|
|
|
smart_magnet.set_default_current()
|