import socket from GCode_Interpreterdc import GCodeToMotors class Hardware: def __init__(self): pass def probe(self, gtm: GCodeToMotors): return def realize(self, gtm: GCodeToMotors): return class SimuHardware(Hardware): def __init__(self, bind): self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.setblocking(False) self.s.bind(bind) def probe(self, gtm): self.s.send("request") self.s.listen() while 1: try: encoder_x = (int)(socket.SocketIO(self.s).readline()) except: pass encoder_y = (int)(socket.SocketIO(self.s).readline()) encoder_z = (int)(socket.SocketIO(self.s).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") 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)