Skip to content
Snippets Groups Projects
home.py 10.6 KiB
Newer Older
mosesafr's avatar
mosesafr committed
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

mosesafr's avatar
mosesafr committed
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}