import ch.psi.pshell.device.PositionerConfig as PositionerConfig import ch.psi.pshell.device.Speedable as Speedable class PseudoMotor(PositionerBase, Speedable): def __init__(self, name): PositionerBase.__init__(self, name, PositionerConfig()) 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 3.0 positioner = PseudoMotor("PseudoMotor") add_device(positioner, True); show_panel(PseudoMotor) cscan(positioner, MachineCurrent, 0, 10, 1.0)