diff --git a/FASTory.py b/FASTory.py index 15e75bd..72a895d 100644 --- a/FASTory.py +++ b/FASTory.py @@ -1,45 +1,122 @@ import requests import socket +import json #{IP}/_services/{command} -_services = "/rest/services/" -_events = "/rest/events/" _ip = socket.gethostbyname(socket.gethostname()) +TEST = True + class Workstation: - def __init__(self,ip): - self.serviceurl = f'{ip}{_services}' - self.eventsurl = f'{ip}{_events}' + def __init__(self, ws_id, ip_rob, ip_cnv, answerurl, zspot_number): + self.id = ws_id + self.robot_ip = f"http://{ip_rob}" + self.conveyor_ip = f"http://{ip_cnv}" + self.answerurl = f"http://{answerurl}:8080" + self.pen_color = None + self.zspots = [-1]*zspot_number # -1 means the spot is empty + self.busy = False + self.order_ready = False + self.responses = { + 1 : "Success", + 2 : "Wrong status response", + 3 : "Conveyor is busy or spot is occupied", + 4 : "Connection problem: " + } def move12(self): - - return 0 + if self.busy == False and self.zspots[0] != -1 and self.zspots[1] == -1: + body = '{"destUrl" : ""}' + try: + response = requests.post(url=f"{self.conveyor_ip}/rest/services/TransZone12", data=body, timeout=1) + if response.status_code == 202: + self.busy = True + self.__move_pallet(1,2) + return (True, self.responses[1]) + return (False, self.responses[2]) + except requests.exceptions.RequestException as e: + return (False, self.responses[4]) + else: + return (False, self.responses[3]) def move23(self): - - return 0 - + if self.busy == False and self.zspots[1] != -1 and self.zspots[2] == -1: + body = '{"destUrl" : ""}' + try: + response = requests.post(url=f"{self.conveyor_ip}/rest/services/TransZone23", data=body, timeout=1) + if response.status_code == 202: + self.busy = True + self.__move_pallet(2,3) + return (True, self.responses[1]) + return (False, self.responses[2]) + except requests.exceptions.RequestException as e: + return (False, self.responses[4]) + else: + return (False, self.responses[3]) + def move35(self): - - return 0 + if self.busy == False and self.zspots[2] != -1 and self.zspots[4] == -1: + body = '{"destUrl" : ""}' + try: + response = requests.post(url=f"{self.conveyor_ip}/rest/services/TransZone35", data=body, timeout=1) + if response.status_code == 202: + self.busy = True + self.__move_pallet(3,5) + return (True, self.responses[1]) + return (False, self.responses[2]) + except requests.exceptions.RequestException as e: + return (False, self.responses[4]) + else: + return (False,self.responses[3]) def move14(self): - - return 0 + if self.busy == False and self.zspots[0] != -1 and self.zspots[3] == -1: + body = '{"destUrl" : ""}' + try: + response = requests.post(url=f"{self.conveyor_ip}/rest/services/TransZone14", data=body, timeout=1) + if response.status_code == 202: + self.busy = True + self.__move_pallet(1,4) + return (True, self.responses[1]) + return (False, self.responses[2]) + except requests.exceptions.RequestException as e: + return (False, self.responses[4]) + else: + return (False,self.responses[3]) def move45(self): - - return 0 + if self.busy == False and self.zspots[3] != -1 and self.zspots[4] == -1: + body = '{"destUrl" : ""}' + try: + response = requests.post(url=f"{self.conveyor_ip}/rest/services/TransZone45", data=body, timeout=1) + if response.status_code == 202: + self.busy = True + self.__move_pallet(4,5) + return (True, self.responses[1]) + return (False, self.responses[2]) + except requests.exceptions.RequestException as e: + return (False, self.responses[4]) + else: + return (False,self.responses[3]) - def get_status(self): - - return 0 + def load_pallets(self, spot, value): + self.zspots[spot-1] = value + + + def get_status(self, spot): + try: + response = requests.post(url=f"{self.conveyor_ip}/rest/services/Z{spot}", data='{}' ) + res = json.loads(response.text) + return res["PalletID"] + except requests.exceptions.RequestException as e: + return (False, self.responses[4]) def draw(self, receipe): - + self.order_ready = True + self.busy = True return 0 - #r="RED", g="GREEN", b="BLUE" + # r="RED", g="GREEN", b="BLUE" def select_pen(self, c): if c == "r" or c == "RED": s = "ChangePenRED" @@ -50,9 +127,32 @@ def select_pen(self, c): else: print("Undefined color") - command = f'{self.serviceurl}{s}' - requests.post(url=command) - return 0 + command = f'{self.robot_ip}/rest/services/{s}' + response = requests.post(url=command) + if response.status_code == 202: + self.pen_color = "RED" + + def get_pen_color(self): + try: + response = requests.get(url=f"{self.robot_ip}/rest/services/GetPenColor") + return response.json() + except requests.exceptions.RequestException as e: + return (False, self.responses[4]) + + def initialize(self): + for spot in range(len(self.zspots)): + self.zspots[spot] = self.get_status(spot+1) + + def ready(self): + self.busy = False + + def __move_pallet(self,spot1, target): + self.zspots[target-1] = self.zspots[spot1-1] + self.zspots[spot1-1] = -1 + + def get_spots(self): + return self.zspots + def check_IP(): try: @@ -61,11 +161,65 @@ def check_IP(): return ip except: print('Something happened with IP. Dunno lol:D') + +def viasualize(ws): + visu = f" /--[{ws.zspots[3]:3}]----------\\ \n-[{ws.zspots[4]:3}]----[{ws.zspots[2]:3}]-[{ws.zspots[1]:3}]---[{ws.zspots[0]:3}]" + print(visu) + print() + def main(): - ip = check_IP() - print("Currently connected to ", ip) - Workstation(ip).select_pen("r") - return 0 + print("Test script") + + print("Create WS") + ws = Workstation("10", "192.168.10.1", "192.168.10.2", "127.0.0.1",5) + + print("Initialize WS") + # ws.initialize() + print("WS spot pallet ids:") + viasualize(ws) -main() \ No newline at end of file + if -1 in ws.zspots: + print("Cnv empty, load pallets") + ws.load_pallets(1,"1") + ws.load_pallets(2,"2") + print() + viasualize(ws) + + print("move 12") + suc, msg = ws.move12() + print(msg) + viasualize(ws) + + print("move 23") + suc, msg = ws.move23() + print(msg) + viasualize(ws) + + print("move 14") + suc, msg = ws.move14() + print(msg) + viasualize(ws) + + print("toggle ws") + ws.ready() + + print("move 14") + suc, msg = ws.move14() + print(msg) + viasualize(ws) + + print("move 12") + suc, msg = ws.move35() + print(msg) + viasualize(ws) + + print("move 45") + suc, msg = ws.move45() + print(msg) + viasualize(ws) + + +if __name__ == '__main__': + main() + \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..84d7025 --- /dev/null +++ b/app.py @@ -0,0 +1,83 @@ +from flask import Flask, request +from FASTory import Workstation +import json +import time + +app = Flask(__name__) + +history = [] +running = True +orders = {} +order_id = 0 +workstations = {} +input_file = "fileWithFASTortyinfo" + +@app.post("/makeOrder/") +def make_order(): + if request: + jsonmessage = request.form + message = json.loads(jsonmessage) + print(message) + phone_model = message['phone'] + phone_color = message['color'] + create_order(phone_model,phone_color) + +@app.post("/kill/") +def stop(): + global running + if running: + running = False + return True + +def create_order(model, color): + global orders + global order_id + order = [model, color] + orders[order_id] = order + order_id += 1 + +def clear_order(order_id): + global orders + del orders[order_id] + +def move_workstation(ws): + ws.ready() + spots = ws.get_spots() + if spots[2] != -1 and ws.order_ready == False: + ws.draw(orders[order_id]) + elif spots[4] == -1 and spots[2] != -1: + suc, msg = ws.move35() + if not suc: + print(suc, msg) + elif spots[2] == -1 and spots[1] != -1: + suc, msg = ws.move23() + if not suc: + print(suc, msg) + elif spots[1] == -1 and spots[0] != -1: + suc, msg = ws.move12() + if not suc: + print(suc, msg) + elif spots[3] == -1 and spots[0] != -1: + suc, msg = ws.move14() + if not suc: + print(suc, msg) + elif spots[4] == -1 and spots[3] != -1: + suc, msg = ws.move45() + if not suc: + print(suc, msg) + else: + ws.load_pallet(1,order_id) + +def cycle_workstations(): + global workstations + for ws in workstations: + move_workstation(ws) + +def add_workstaion(ws_id, ip_rob, ip_cnv, answerurl, zspot_number): + global workstations + ws = Workstation(ws_id, ip_rob, ip_cnv, answerurl, zspot_number) + workstations.append(ws) + + +if __name__ == '__main__': + app.run(debug=True, port=8080)