from concurrent.futures import thread import dash from dash import html,dcc, callback from dash.dependencies import Input, Output, State import dash_bootstrap_components as dbc import plotly.express as px import pandas as pandas from Core.mothership import Mothership from Core.gridDestinationEnum import GridDestinationEnum import plotly.graph_objs as go mothership = Mothership("/") """ UI Components """ location_dropdown = html.Div(dcc.Dropdown(mothership.get_destinations(), "Location A", id = "location-dropdown")) move_button = html.Div(dbc.Button("Move", size ="lg", n_clicks=0, type='submit', id='Move-button', style={'border-width': '0px', 'font-size': '14px', 'font-family': 'Arial', 'background-color': '#3DADFF', 'border-color' : '#FFFFFF'} )) stop_button = html.Div(dbc.Button( "Stop", size ="lg", n_clicks=0, type='submit', title = "Stop", id='Stop-button', style={'border-width': '0px', 'font-size': '14px', 'font-family': 'Arial', 'background-color': '#3DADFF', 'border-color' : '#FFFFFF'} )) base_image_button = html.Div(dbc.Button( "Take Base Image", size ="lg", n_clicks=0, type='submit', title = "Base", id='Base-Image-button', style={'border-width': '0px', 'font-size': '14px', 'font-family': 'Arial', 'background-color': '#3DADFF', 'border-color' : '#FFFFFF'} )) detect_drone_button = html.Div(dbc.Button( "Detect Drone", size ="lg", n_clicks=0, type='submit', title = "Detect", id='Detect-Drone-button', style={'border-width': '0px', 'font-size': '14px', 'font-family': 'Arial', 'background-color': '#3DADFF', 'border-color' : '#FFFFFF'} )) """ UI Layout """ layout = html.Div( [ dbc.Row(dbc.Col(html.Div(html.H3("Factory Automation", style = {"textAlign":"center"}))), justify = "around", style = {"margin-top":"1rem"}), html.Br(), dbc.Row( [ dbc.Row( [ dbc.Col( [ dbc.Row( [ dbc.Card( dbc.CardBody( [ dbc.Row( [ html.H4("Drone Detection", className = "card-title", style = {"textAlign":"center"}) ], justify = "center" ), dbc.Row( [ dcc.Graph(id = 'grid-feed') ] ) ] ) ) ] ), dbc.Row( [ dbc.Col([base_image_button]), dbc.Col([detect_drone_button]) ], style = {"margin-top":"2rem"} ), dbc.Row( [ html.Div(children='', id='output-user-drone-detect-action'), ] ) ], xs = 5, sm = 5, md = 5, lg = 5, xl = 5 ), dbc.Col( [ dbc.Row( [ dbc.Card( dbc.CardBody( [ dbc.Row( [ html.H4("Grid Status", className = "card-title", style = {"textAlign":"center"}) ], justify = "center" ), dbc.Row( [ dcc.Graph(id = 'grid-heatmap') ] ) ] ) ) ] ), dbc.Row( [ dbc.Col( [ location_dropdown ], xs = 7, sm = 7, md = 7, lg = 7, xl = 7, ), dbc.Col( [ move_button ], xs = 2, sm = 2, md = 2, lg = 2, xl = 2 ), dbc.Col( [ stop_button ], xs = 2, sm = 2, md = 2, lg = 2, xl = 2 ), dcc.Store(id = "user-input") ], style = {"margin-top":"2rem"} ), dbc.Row( [ html.Div(children='', id='output-user-action'), html.Div(children='', id='output-user-stop-action'), dcc.Interval(id = 'interval-component', interval=500, n_intervals =0), dcc.Interval(id = 'interval-component-two', interval=2000, n_intervals =0) ] ) ], xs = 5, sm = 5, md = 5, lg = 5, xl = 5 ) ], justify = "around" ) ] ) ] ) dash.register_page(__name__, path = '/') """ Grid status call backs """ @callback(Output("grid-heatmap", "figure", allow_duplicate=True), [Input("interval-component", "n_intervals")], allow_duplicate = True, prevent_initial_call = True) def update_grid(n_intervals): # Get Current Grid Status current_grid, grid_labels = mothership.get_grid_status() heatmap = go.Heatmap(z=current_grid, colorscale ='Viridis', text = grid_labels, colorbar = dict()) layout = go.Layout() return {"data":[heatmap], "layout":layout} @callback(Output("grid-heatmap", "figure", allow_duplicate=True), [Input("location-dropdown", "value")], allow_duplicate = True, prevent_initial_call = True) def update_grid(value): # Get Current Grid Status mothership.reset_grid_status() current_grid, grid_labels = mothership.a_star_get_status(value) heatmap = go.Heatmap(z=current_grid, colorscale ='Viridis', text = grid_labels) layout = go.Layout(showlegend = False) return {"data":[heatmap], "layout":layout} @callback( Output("output-user-drone-detect-action", "children", allow_duplicate=True), [Input("Move-button", "n_clicks")], [State("location-dropdown", "value")], allow_duplicate = True, prevent_initial_call = True ) def move_location(n_clicks, value): if n_clicks > 0: mothership.move_to_destination() mothership.reset_grid_status() return "Moved to " + value @callback( Output("output-user-action", "children", allow_duplicate=True), [Input("Stop-button", "n_clicks")], allow_duplicate = True, prevent_initial_call = True ) def cancel(n_clicks): if n_clicks > 0: mothership.halt_drone() print("Stopping") return "Stopping Robot" """ Drone Tracking call backs """ @callback( Output("output-user-drone-detect-action", "children", allow_duplicate=True), [Input("Base-Image-button", "n_clicks")], allow_duplicate = True, prevent_initial_call = True ) def take_base_image(n_clicks): print(n_clicks) if n_clicks > 0: mothership.take_base_image() print("Taking base image") return "Updated Base Image" @callback( Output("output-user-drone-detect-action", "children", allow_duplicate=True), [Input("Detect-Drone-button", "n_clicks")], allow_duplicate = True, prevent_initial_call = True ) def cancel(n_clicks): if n_clicks > 0: drone_coordinates = mothership.track_drone() print("Drone detect at ", drone_coordinates) return "Drone detected" @callback(Output("grid-feed", "figure", allow_duplicate=True), [Input("interval-component-two", "n_intervals")], allow_duplicate = True, prevent_initial_call = True) def update_grid(n_intervals): # Get Current Grid feed current_grid = mothership.get_grid_feed() #print(current_grid.shape) img = go.Heatmap(z=current_grid, colorscale ='Viridis') layout = go.Layout() return {"data":[img], "layout":layout}