class HandlerForMessageFromWebSocket(): def __init__(self, ws_client, serial_client, robot_id, server_ip): self.ws_client = ws_client self.serial_client = serial_client self.robot_id = robot_id self.server_ip = server_ip self.auto_take = None def process(self, message): print str(datetime.now()), " From WebSocket:\n" + message try: decoded = ujson.loads(message) if "command" in decoded: if decoded["command"] == Protocols.commands[8]: RobotInfo.auto_take = not RobotInfo.auto_take if RobotInfo.auto_take: self.auto_take = AutoTakeThread() RobotInfo.interval = decoded["content"]["interval"] RobotInfo.rotation = decoded["content"]["rotation"] self.auto_take.set_config(self.server_ip, self.robot_id, RobotInfo.interval, RobotInfo.rotation) self.auto_take.set_go(True) self.auto_take.start() else: self.auto_take.set_go(False) self.auto_take = None elif decoded["command"] == Protocols.commands[1]: self.serial_client.write("@r\n") elif decoded["command"] == Protocols.commands[2]: RobotInfo.turn_a = not RobotInfo.turn_a self.serial_client.write("@a\n") elif decoded["command"] == Protocols.commands[4]: self.serial_client.write("@l\n") elif decoded["command"] == Protocols.commands[5]: RobotInfo.model_e = not RobotInfo.model_e if RobotInfo.model_e: if RobotInfo.model_t: self.serial_client.write("@t\n") RobotInfo.model_t = False self.serial_client.write("@t\n") elif decoded["command"] == Protocols.commands[6]: RobotInfo.model_t = not RobotInfo.model_t if RobotInfo.model_t: if RobotInfo.model_e: self.serial_client.write("@e\n") RobotInfo.model_e = False self.serial_client.write("@t\n") elif decoded["command"] == Protocols.commands[0]: info = ujson.dumps(RobotInfo) self.ws_client.send(ujson.dumps(ControlMessage("topic.robot.status", info))) elif decoded["command"] == Protocols.commands[3]: RobotInfo.do_explore = not RobotInfo.do_explore self.serial_client.write("@u\n") elif decoded["command"] == Protocols.commands[7]: RobotInfo.do_roomba = not RobotInfo.do_roomba self.serial_client.write("@j\n") elif decoded["command"] == Protocols.commands[9]: RobotInfo.rotation = decoded["content"]["rotation"] ImageUploader.take_and_upload("one_photo.jpg", "400", "300", str(RobotInfo.rotation), self.server_ip, self.robot_id) elif decoded["command"] == Protocols.commands[10]: distance = decoded["content"]["driveDistance"] velocity = decoded["content"]["driveVelocity"] degrees = decoded["content"]["driveDegrees"] radius = decoded["content"]["driveRadius"] if distance > 0 and velocity > 0 and degrees == 0 and radius == 0: # go straight serial_command = "@x" + str(distance*10).zfill(4) + str(velocity).zfill(4) + "\n" elif distance == 0 and velocity > 0 and degrees != 0 and radius == 0: # go pivot serial_command = "@p" + str(degrees).zfill(4) + str(velocity).zfill(4) + "\n" elif distance > 0 and velocity > 0 and degrees == 0 and radius != 0: # go around serial_command = "@v" + str(distance).zfill(4) + str(radius).zfill(4) + str(velocity).zfill( 4) + "\n" else: print "Invalid driving command" self.ws_client.send( ujson.dumps(ControlMessage("topic.execute", ujson.dumps([self.robot_id, False])))) return print "Driving command (test): " + serial_command self.serial_client.write(serial_command) elif decoded["command"] == Protocols.commands[11]: self.serial_client.write("@w\n") elif decoded["command"] == Protocols.commands[12]: # shoo width = decoded["content"]["checkWidth"] speed = decoded["content"]["checkSpeed"] flight_distance = decoded["content"]["flightDistance"] flight_speed = decoded["content"]["flightSpeed"] randomness = decoded["content"]["randomness"] if ActionThreads.action_thread is not None: raise Exception("Previous ActionThread is not finished yet") ActionThreads.action_thread = ActionShooThread() ActionThreads.action_thread.set_config(width, speed, flight_distance, flight_speed, randomness, self.serial_client, self.ws_client, self.robot_id) ActionThreads.action_thread.start() elif decoded["command"] == Protocols.commands[13]: # greet width = decoded["content"]["checkWidth"] speed = decoded["content"]["checkSpeed"] repeat = decoded["content"]["checkRepeat"] randomness = decoded["content"]["randomness"] if ActionThreads.action_thread is not None: raise Exception("Previous ActionThread is not finished yet") ActionThreads.action_thread = ActionGreetThread() ActionThreads.action_thread.set_config(width, speed, repeat, randomness, self.serial_client, self.ws_client, self.robot_id) ActionThreads.action_thread.start() elif decoded["command"] == Protocols.commands[14]: degree = decoded["content"]["cameraTilt"] # need to write the degree value to serial serial_command = "@m" + str(degree).zfill(4) + "\n" self.serial_client.write(serial_command) else: raise Exception("Unknown command") print "Current Robot Status:", ujson.dumps(RobotInfo), "\n" self.ws_client.send( ujson.dumps(ControlMessage("topic.execute", ujson.dumps([self.robot_id, True])))) except Exception as e: print "Exception in HandlerForMessageFromWebSocket: ", e self.ws_client.send( ujson.dumps(ControlMessage("topic.execute", ujson.dumps([self.robot_id, False]))))
class HandlerForMessageFromWebSocket(): def __init__(self, ws_client, serial_client, robot_id, server_ip): self.ws_client = ws_client self.serial_client = serial_client self.robot_id = robot_id self.server_ip = server_ip self.auto_take = None def process(self, message): print str(datetime.now()), " From WebSocket:\n" + message try: decoded = ujson.loads(message) if "command" in decoded: # TURN ON AUTO TAKE OF PHOTOS if decoded["command"] == Protocols.commands[8]: RobotInfo.auto_take = not RobotInfo.auto_take if RobotInfo.auto_take: self.auto_take = AutoTakeThread() RobotInfo.interval = decoded["content"]["interval"] RobotInfo.rotation = decoded["content"]["rotation"] self.auto_take.set_config(self.server_ip, self.robot_id, RobotInfo.interval, RobotInfo.rotation) self.auto_take.set_go(True) self.auto_take.start() else: self.auto_take.set_go(False) self.auto_take = None # RESET ARDUINO elif decoded["command"] == Protocols.commands[1]: self.serial_client.write("@r\n") # TOGGLE QUICK SCRIPT TURN (THIS SHOULD BE CHANGED) elif decoded["command"] == Protocols.commands[2]: RobotInfo.turn_a = not RobotInfo.turn_a self.serial_client.write("@a\n") # 360 DEGREE TURN elif decoded["command"] == Protocols.commands[4]: self.serial_client.write("@h\n") # TURN ON MODEL E DATA COLLECTION elif decoded["command"] == Protocols.commands[5]: RobotInfo.model_e = not RobotInfo.model_e if RobotInfo.model_e: if RobotInfo.model_t: self.serial_client.write("@t\n") RobotInfo.model_t = False self.serial_client.write("@e\n") # TURN ON MODEL T DATA COLLECTION elif decoded["command"] == Protocols.commands[6]: RobotInfo.model_t = not RobotInfo.model_t if RobotInfo.model_t: if RobotInfo.model_e: self.serial_client.write("@e\n") RobotInfo.model_e = False self.serial_client.write("@t\n") # REPORT STATUS (CHECK ON WHAT THIS DOES) elif decoded["command"] == Protocols.commands[0]: info = ujson.dumps(RobotInfo) self.ws_client.send(ujson.dumps(ControlMessage("topic.robot.status", info))) # RUN EXPLORATION SCRIPT (OUTMODED) elif decoded["command"] == Protocols.commands[3]: RobotInfo.do_explore = not RobotInfo.do_explore self.serial_client.write("@u\n") # RUN ROOMBA COVER SCRIPT elif decoded["command"] == Protocols.commands[7]: RobotInfo.do_roomba = not RobotInfo.do_roomba self.serial_client.write("@j\n") # TAKE ONE PHOTO elif decoded["command"] == Protocols.commands[9]: RobotInfo.rotation = decoded["content"]["rotation"] ImageUploader.take_and_upload("one_photo.jpg", "400", "300", str(RobotInfo.rotation), self.server_ip, self.robot_id) # DRIVE elif decoded["command"] == Protocols.commands[10]: distance = decoded["content"]["driveDistance"] velocity = decoded["content"]["driveVelocity"] degrees = decoded["content"]["driveDegrees"] radius = decoded["content"]["driveRadius"] if distance != 0 and degrees == 0 and radius == 0: #and velocity > 0 # go straight serial_command = "@x" + str(distance).zfill(4) + str(velocity).zfill(4) + "\n" elif distance == 0 and degrees != 0 and radius == 0: #and velocity > 0 # go pivot serial_command = "@p" + str(degrees).zfill(4) + str(velocity).zfill(4) + "\n" elif distance != 0 and degrees == 0 and radius != 0: #and velocity > 0 # go around serial_command = "@v" + str(distance).zfill(4) + str(radius).zfill(4) + str(velocity).zfill( 4) + "\n" else: print "Invalid driving command" self.ws_client.send( ujson.dumps(ControlMessage("topic.execute", ujson.dumps([self.robot_id, False])))) return print "Driving command (test): " + serial_command self.serial_client.write(serial_command) #test self.ws_client.send( ujson.dumps( ControlMessage("topic.current.heading", ujson.dumps([self.robot_id, serial_command])))) #test self.ws_client.send( ujson.dumps( ControlMessage("topic.rear.distance", ujson.dumps([self.robot_id, 0])))) # STOP elif decoded["command"] == Protocols.commands[11]: self.serial_client.write("@w\n") # SHOO BEHAVIOR elif decoded["command"] == Protocols.commands[12]: # shoo width = decoded["content"]["checkWidth"] speed = decoded["content"]["checkSpeed"] flight_distance = decoded["content"]["flightDistance"] flight_speed = decoded["content"]["flightSpeed"] randomness = decoded["content"]["randomness"] if ActionThreads.action_thread is not None: raise Exception("Previous ActionThread is not finished yet") ActionThreads.action_thread = ActionShooThread() ActionThreads.action_thread.set_config(width, speed, flight_distance, flight_speed, randomness, self.serial_client, self.ws_client, self.robot_id) ActionThreads.action_thread.start() # GREET BEHAVIOR elif decoded["command"] == Protocols.commands[13]: # greet width = decoded["content"]["checkWidth"] speed = decoded["content"]["checkSpeed"] repeat = decoded["content"]["checkRepeat"] randomness = decoded["content"]["randomness"] if ActionThreads.action_thread is not None: raise Exception("Previous ActionThread is not finished yet") ActionThreads.action_thread = ActionGreetThread() ActionThreads.action_thread.set_config(width, speed, repeat, randomness, self.serial_client, self.ws_client, self.robot_id) ActionThreads.action_thread.start() # CAMERA TILT elif decoded["command"] == Protocols.commands[14]: degree = decoded["content"]["cameraTilt"] # need to write the degree value to serial serial_command = "@m" + str(degree).zfill(4) + "\n" self.serial_client.write(serial_command) # BEEP elif decoded["command"] == Protocols.commands[15]: self.serial_client.write("@b\n") # SCAN (NEED TO BUILD IT ON ARDUINO) elif decoded["command"] == Protocols.commands[16]: # to-do: "scan" command self.serial_client.write("\n") else: raise Exception("Unknown command") print "Current Robot Status:", ujson.dumps(RobotInfo), "\n" self.ws_client.send( ujson.dumps(ControlMessage("topic.execute", ujson.dumps([self.robot_id, True])))) except Exception as e: print "Exception in HandlerForMessageFromWebSocket: ", e self.ws_client.send( ujson.dumps(ControlMessage("topic.execute", ujson.dumps([self.robot_id, False]))))