import socket import os import GCode_Interpreterdc import simulator class Hardware: def __init__(self): pass def probe(self, gtm): return def realize(self, gtm): return class SimuHardware(Hardware): def __init__(self, bind): super().__init__() self.s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.s.connect(bind) def probe(self, gtm): self.s.send("request".encode()) encoder_x = int(socket.SocketIO(self.s, "rw").readline()) encoder_y = int(socket.SocketIO(self.s, "rw").readline()) encoder_z = int(socket.SocketIO(self.s, "rw").readline()) last_x, last_y, last_z = gtm.current_steps # We are now at some position which realizes the encoder positions # curr_x = encoder_x + k*X_MOTOR_STEPS # |curr_x - last_x| <= 1/2 * X_MOTOR_STEPS curr_x = encoder_x + (last_x // gtm.X_MOTOR_STEPS) * gtm.X_MOTOR_STEPS if curr_x - last_x > .5 * gtm.X_MOTOR_STEPS: curr_x -= gtm.X_MOTOR_STEPS curr_y = encoder_y + (last_y // gtm.Y_MOTOR_STEPS) * gtm.Y_MOTOR_STEPS if curr_y - last_y > .5 * gtm.Y_MOTOR_STEPS: curr_y -= gtm.Y_MOTOR_STEPS curr_z = encoder_z + (last_z // gtm.Z_MOTOR_STEPS) * gtm.Z_MOTOR_STEPS if curr_z - last_z > .5 * gtm.Z_MOTOR_STEPS: curr_z -= gtm.Z_MOTOR_STEPS # Note that if we don't probe regularly enough, we lose track of the position # Really, we should be able to set_steps gtm.set_position([curr_x / gtm.X_STEPS_PER_MM, curr_y / gtm.Y_STEPS_PER_MM, curr_z / gtm.Z_STEPS_PER_MM]) def realize(self, gtm): self.s.send("realize".encode()) if gtm.throttle_x == 0: self.s.send(gtm.x_direction + " 0") else: self.s.send(gtm.x_direction + " " + gtm.FAST_XY_FEEDRATE / gtm.x_throttle) if gtm.throttle_y == 0: self.s.send(gtm.y_direction + " 0") else: self.s.send(gtm.y_direction + " " + gtm.FAST_XY_FEEDRATE / gtm.y_throttle) if gtm.throttle_z == 0: self.s.send(gtm.z_direction + " 0") else: self.s.send(gtm.z_direction + " " + gtm.FAST_Z_FEEDRATE / gtm.z_throttle) if __name__ == '__main__': bind = "tmp.txt" # sim = simulator.Simulator(bind) sh = SimuHardware(bind) gtm1 = GCode_Interpreterdc.GCodeToMotors sh.probe(gtm1)