import ch.psi.pshell.device.PositionerConfig as PositionerConfig import ch.psi.pshell.device.ControlledSpeedable as ControlledSpeedable class PseudoMotor(PositionerBase, ControlledSpeedable): def __init__(self, name): PositionerBase.__init__(self, name, PositionerConfig()) self.velocity = self.getDefaultSpeed() self.rbck = 0.0 self.setp = 0.0 self.settime = time.time() def doRead(self): return self.setp def doWrite(self, val): self.setp = val self.settime = time.time() def doReadReadback(self): offset = self.setp - self.rbck d = (self.speed * (time.time() - self.settime)) d = min(d, abs(offset)) self.rbck = self.rbck + d if offset>0 else self.rbck -d self.settime = time.time() return self.rbck def getSpeed(self): return self.velocity def setSpeed(self, speed): self.velocity=speed def getDefaultSpeed(self): return 1.0 def getMinSpeed(self): return 0.1 def getMaxSpeed(self): return 10.0 positioner = PseudoMotor("PseudoMotor") add_device(positioner, True); show_panel(PseudoMotor) cscan(positioner, MachineCurrent, 0, 10, 1.0, time=5.0)