This commit is contained in:
gac-S_Changer
2018-11-07 11:36:38 +01:00
parent bc78e8fd40
commit 92574c1341
23 changed files with 749 additions and 63 deletions

View File

@@ -5,15 +5,19 @@ import json
class Hexiposi(DiscretePositionerBase):
def __init__(self, name, url):
DiscretePositionerBase.__init__(self, name, ["A","B","C","D","E","F"])
self.PORT_SET=8002
self.PORT_GET=8002
if not url.startswith("http://"):
url = "http://" + url
if not url.endswith("/"):
url = url + "/"
self.url = url
if not url.endswith(":"):
url = url + ":"
self.url_set = url + str (self.PORT_SET)+ "/hexiposi/"
self.url_get = url + str (self.PORT_GET)+ "/hexiposi/"
self.moved = True
self.homing_state = State.Disabled
self.rback = self.UNKNOWN_POSITION
self.timeout = 3.0
self.offline = False
def doInitialize(self):
super(Hexiposi, self).doInitialize()
@@ -25,40 +29,46 @@ class Hexiposi(DiscretePositionerBase):
return json.loads(response.text)
def get_status(self):
self.status = self.get_response(requests.get(url=self.url+"get", timeout=self.timeout))
self.estop = self.status["estop"]
self.homed = self.status["homed"]
self.error = self.status["errorCode"]
self.remote = self.status["mode"] == "remote"
self.moving = self.status["errorCode"]
self.pos = self.status["position"]
self.moving = self.status["moving"]
self.offset = self.status["offset"]
self.dpos = self.status["discretePosition"]
if (self.homed==False): rback = self.UNKNOWN_POSITION
elif self.dpos == 1: rback = "A"
elif self.dpos == 2: rback = "B"
elif self.dpos == 4: rback = "C"
elif self.dpos == 8: rback = "D"
elif self.dpos == 16: rback = "E"
elif self.dpos == 32: rback = "F"
else: rback = self.UNKNOWN_POSITION
if (rback == self.UNKNOWN_POSITION) or (rback != self.rback):
self.moved = True
self.rback = rback
return self.status
try:
self.status = self.get_response(requests.get(url=self.url_get+"get", timeout=self.timeout))
self.estop = self.status["estop"]
self.homed = self.status["homed"]
self.error = self.status["errorCode"]
self.remote = self.status["mode"] == "remote"
self.moving = self.status["errorCode"]
self.pos = self.status["position"]
self.moving = self.status["moving"]
self.offset = self.status["offset"]
self.dpos = self.status["discretePosition"]
if (self.homed==False): rback = self.UNKNOWN_POSITION
elif self.dpos == 1: rback = "A"
elif self.dpos == 2: rback = "B"
elif self.dpos == 4: rback = "C"
elif self.dpos == 8: rback = "D"
elif self.dpos == 16: rback = "E"
elif self.dpos == 32: rback = "F"
else: rback = self.UNKNOWN_POSITION
if (rback == self.UNKNOWN_POSITION) or (rback != self.rback):
self.moved = True
self.rback = rback
self.offline = False
return self.status
except:
self.offline = True
self.updateState()
raise
def set_deadband(self, value = 0.1): #degrees
ret = self.get_response(requests.get(url=self.url+"setDeadband?deadband=" + str(value), timeout=self.timeout))
ret = self.get_response(requests.get(url=self.url_set+"setDeadband?deadband=" + str(value), timeout=self.timeout))
if ret["deadbandOutput"] == value:
return value
raise Excepiton("Error setting deadband: " + str(ret))
def move_pos(self, pos):
return self.get_response(requests.get(url=self.url+"set?pos=" + str(pos), timeout=self.timeout))
return self.get_response(requests.get(url=self.url_set+"set?pos=" + str(pos), timeout=self.timeout))
def move_home(self):
ret = self.get_response(requests.get(url=self.url+"set?home=1", timeout=self.timeout))
ret = self.get_response(requests.get(url=self.url_set+"set?home=1", timeout=self.timeout))
try:
self.waitState(self.homing_state,1200)
except:
@@ -66,10 +76,10 @@ class Hexiposi(DiscretePositionerBase):
return ret
def stop_move(self):
return self.get_response(requests.get(url=self.url+"set?stop=1", timeout=self.timeout))
return self.get_response(requests.get(url=self.url_set+"set?stop=1", timeout=self.timeout))
def set_offset(self, offset):
return self.get_response(requests.get(url=self.url+"setOffset?offset="+str(offset), timeout=self.timeout))
return self.get_response(requests.get(url=self.url_set+"setOffset?offset="+str(offset), timeout=self.timeout))
def doUpdate(self):
self.get_status()
@@ -124,7 +134,9 @@ class Hexiposi(DiscretePositionerBase):
# return self.moving == False
def updateState(self):
if self.homed == False:
if self.offline:
self.setState(State.Offline)
elif self.homed == False:
self.setState(self.homing_state)
elif self.moving:
self.setState(State.Busy)
@@ -133,8 +145,8 @@ class Hexiposi(DiscretePositionerBase):
#http://myriotell:8002/hexiposi/get
dev = Hexiposi("hexiposi", "myriotell:8002/hexiposi")
#http://myriotell:8003/hexiposi/get
dev = Hexiposi("hexiposi", "myriotell")
add_device(dev, True)
hexiposi.polling=1000

View File

@@ -28,7 +28,8 @@ class RobotSC(RobotTCP):
RobotTCP.__init__(self, name, server, timeout, retries)
self.set_tasks(["getDewar", "putDewar", "putGonio", "getGonio", "recover", "moveDewar", "moveCold", "movePark", "moveGonio","moveHeater", "moveScanner","moveHome", "moveAux"])
self.set_known_points(["pPark", "pGonio", "pDewar", "pGonioG", "pScan", "pHeater", "pHeat", "pHeatB", "pScanStop","pHelium", "pHome", "pCold", "pAux"])
self.setPolling(DEFAULT_ROBOT_POLLING)
self.setPolling(DEFAULT_ROBOT_POLLING)
self.setSimulated()
def move_dewar(self):
self.start_task('moveDewar')

View File

@@ -141,6 +141,8 @@ class RobotTCP(TcpDevice, Stoppable):
raise Exception("Exceeded maximum message size")
self.getLogger().finer("TX = '" + str(tx)+ "'")
if (self.trailer != None): tx = tx + self.trailer
if self.isSimulated():
return ""
rx = self.sendReceive(tx, msg_id, self.trailer , 0, self.timeout if timeout is None else timeout, self.retries)
rx=rx[:-1] #Remove 0A
self.getLogger().finer("RX = '" + str(rx) + "'")
@@ -257,14 +259,20 @@ class RobotTCP(TcpDevice, Stoppable):
self.set_trsf(trsf, name+".trsf")
def eval_int(self, cmd):
if self.isSimulated():
return 0
self.evaluate("tcp_n=" + cmd)
return self.get_int()
def eval_float(self, cmd):
if self.isSimulated():
return 0.0
self.evaluate("tcp_n=" + cmd)
return self.get_float()
def eval_bool(self, cmd):
if self.isSimulated():
return False
self.evaluate("tcp_b=" + cmd)
return self.get_bool()
@@ -547,6 +555,8 @@ class RobotTCP(TcpDevice, Stoppable):
self.execute('kill', str(name), timeout=5000)
def get_task_status(self, name):
if self.isSimulated():
return (-1,"Stopped")
code = self.eval_int('taskStatus("' + str(name)+ '")')
#TODO: String assignments in $exec causes application to freeze
#status = self
@@ -575,7 +585,6 @@ class RobotTCP(TcpDevice, Stoppable):
self.check_task()
if self.current_task is not None:
print "Ongoing task: " + self.current_task
if (not self.settled) or (self.current_task is not None): self.setState(State.Busy)
elif not self.empty: self.setState(State.Paused)
else: self.setState(State.Ready)
@@ -584,12 +593,19 @@ class RobotTCP(TcpDevice, Stoppable):
try:
start = time.time()
cur_task = self.current_task #Can change in background so cache it
sts = self.execute("get_status", cur_task)
if self.isSimulated():
sts = [1, 1,"1", 100, "1", "1", 0, 0, \
0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, \
]
else:
sts = self.execute("get_status", cur_task)
self._update_working_mode(int(sts[0]), int(sts[1]))
self.powered = sts[2] == "1"
self.speed = int(sts[3])
self.empty = sts[4] == "1"
self.settled = sts[5] == "1"
#TODO: add tool open
if cur_task is not None:
if int(sts[6]) < 0:
@@ -602,14 +618,14 @@ class RobotTCP(TcpDevice, Stoppable):
self.joint_pos[i] = float(sts[8 + i])
for i in range(6):
self.cartesian_pos[i] = float(sts[14 + i])
ev_index = 20 #7
ev = sts[ev_index] if len(sts)>ev_index else ""
if len(ev.strip()) >0:
self.getLogger().info(ev)
self.on_event(ev)
self._update_state()
self._update_state()
self.reset = False
self.setCache({"powered": self.powered,
"speed": self.speed,
@@ -621,6 +637,7 @@ class RobotTCP(TcpDevice, Stoppable):
"open": self.tool_open,
"pos": self.get_current_point_cached() if self.state==State.Ready else None #TODO: make it calculated in robot by polling funtion
}, None)
if self.cartesian_motors_enabled:
for m in self.cartesian_motors:
m.readback.update()

View File

@@ -6,6 +6,8 @@ class SmartMagnet(DeviceBase):
"restingCurrent":0.0,
"mountCurrent":0.0,
"unmountCurrent":0.0,
"reverseCurrent":0.0,
"reverseTime":0.0,
}))
def doInitialize(self):
@@ -89,8 +91,8 @@ class SmartMagnet(DeviceBase):
def set_unmount_current(self):
self.set_current(self.config.getFieldValue("unmountCurrent"))
def set_remanence_current(self):
self.set_current(self.config.getFieldValue("remanenceCurrent"))
def set_reverse_current(self):
self.set_current(self.config.getFieldValue("reverseCurrent"))
def set_default_current(self):
if self.is_mounted():
@@ -104,6 +106,10 @@ class SmartMagnet(DeviceBase):
#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)