Skip to content
Snippets Groups Projects
home.py 10.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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 Common.gridDestinationEnum import GridDestinationEnum
    import plotly.graph_objs as go
    from Core.mothership import Mothership
    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}