diff options
| author | Anson Bridges <bridges.anson@gmail.com> | 2024-11-14 01:20:05 -0500 |
|---|---|---|
| committer | Anson Bridges <bridges.anson@gmail.com> | 2024-11-14 01:20:05 -0500 |
| commit | 3f68ac783948c7d47974993854a1d317399d3b04 (patch) | |
| tree | b4c5413f54a5435b279977ba6835581bb4f36567 /dashboard_website/db.py | |
| parent | 5d013db5968b4b1989a5b2eabf2ad651540240d9 (diff) | |
bug fixes from server testing, route previews, slight routing improvements
Diffstat (limited to 'dashboard_website/db.py')
| -rw-r--r-- | dashboard_website/db.py | 83 |
1 files changed, 57 insertions, 26 deletions
diff --git a/dashboard_website/db.py b/dashboard_website/db.py index eec587d..6142fed 100644 --- a/dashboard_website/db.py +++ b/dashboard_website/db.py @@ -17,7 +17,7 @@ clues = [] bikes = [] clusters = [] routes = {"clusters": [], "cluster_times": {}, - "individual_routes": []} # geojson polylines, both between all the clusters + "individual_routes": [], "clue_clusters" : []} # geojson polylines, both between all the clusters preview_routes = {"clusters": [], "cluster_times": {}, # geojson polylines, both between all the clusters "individual_routes": [], "clue_clusters" : []} # except clue clusters which is a list of a list of clues assigned_clues = [] @@ -27,20 +27,28 @@ routes_last_changed = time.time() route_update_required = False currently_updating = False minimalRouting = False # if false, currently assigned clues +routesToCommit = False # if there exist preview routes to commit _bikes_changed = False # In case bikes or clues are enabled/disabled _clues_changed = False # during route calculation +_force_stop = False startup = False # def should_cancel_routing(): - global _bikes_changed, _clues_changed - if _bikes_changed or _clues_changed: - _bikes_changed = True - _clues_changed = True + global _bikes_changed, _clues_changed, _force_stop + if _bikes_changed or _clues_changed or _force_stop: + _bikes_changed = False + _clues_changed = False + _force_stop = False return True return False +def force_stop(): + global _force_stop, currently_updating + currently_updating = False + _force_stop = True + def is_route_update_required(): return route_update_required @@ -48,14 +56,20 @@ def is_route_update_required(): # a bike is added/removed # determines/assigns clusters, and assigns routes to bikes def updateRoutes_background(): # run in thread due to long runtime - global currently_updating, routes_last_changed, route_update_required, preview_routes, clusters, routes + global currently_updating, routes_last_changed, route_update_required, preview_routes, clusters, routesToCommit, _bikes_changed, _clues_changed print("Calculating clusters...") + _bikes_changed = False + _clues_changed = False + _force_stop = False preview_routes = {"clusters": [], "cluster_times": {}, "individual_routes": [], "clue_clusters" : []} # reset status, clusters, paths, times = router.getClusters(bikes, clues, homeBase, minimalRouting) if status != 0: print("Aborted routing.") + currently_updating = False + return -1 + - preview_routes['individual_routes'] = paths.copy() + preview_routes['individual_routes'] = [[] for bike in bikes] preview_routes['cluster_times'] = times preview_routes['clusters'] = paths preview_routes['clue_clusters'] = clusters @@ -63,16 +77,9 @@ def updateRoutes_background(): # run in thread due to long runtime if bikes[i].status != "DISABLED": preview_routes['individual_routes'][i] = router.getRouteHDPolyline(bikes[i], clusters[i][0]) - # set routes - TESTING - routes['individual_routes'] = paths.copy() - routes['cluster_times'] = times - routes['clusters'] = paths - for i, bike in enumerate(bikes): - if bike.status == "DISABLED": continue - bike.setCluster(clusters[i]) - routes_last_changed = time.time() print("Finished calculating clusters/routes.") + routesToCommit = True currently_updating = False route_update_required = False @@ -87,6 +94,22 @@ def updateRoutes(): # if necessary return 0 +def applyPreviewRoutes(): + global routes_last_changed, routesToCommit, preview_routes, routes + # set routes + routes['individual_routes'] = preview_routes['individual_routes'].copy() + routes['cluster_times'] = preview_routes['cluster_times'].copy() + routes['clusters'] = preview_routes['clusters'].copy() + routes['clue_clusters'] = preview_routes['clue_clusters'].copy() + for i, bike in enumerate(bikes): + if bike.status == "DISABLED": continue + bike.setCluster(routes['clue_clusters'][i]) + preview_routes = {"clusters": [], "cluster_times": {}, "individual_routes": [], "clue_clusters" : []} # reset + + + routesToCommit = False + routes_last_changed = time.time() + # interface functions def getTime(): return time.time() @@ -125,8 +148,12 @@ def getBikeCluePair(team_index): def getRoutesJSON(timestamp): if timestamp < 0 or routes_last_changed - timestamp > 0: - return routes - return False + preview_routes_t = preview_routes.copy() + routes_t = routes.copy() + del preview_routes_t["clue_clusters"] + del routes_t["clue_clusters"] + return preview_routes_t, routes_t + return False, False def pingBike(team_index, latitude, longitude): @@ -136,9 +163,10 @@ def pingBike(team_index, latitude, longitude): return 0 def setBikeEnabled(team_index, enabled): - global route_update_required + global route_update_required, _bikes_changed bike = bikes[team_index-1] route_update_required = True + _bikes_changed = True if enabled: bike.enable() else: @@ -163,7 +191,7 @@ def getCluesJSON(timestamp): def addClue(clue_name, clue_info, longitude, latitude, status="UNVISITED"): - global clues_last_changed, route_update_required + global clues_last_changed, route_update_required, _clues_changed for clue in clues: if clue.name == clue_name: return -1 # clue already exists @@ -171,21 +199,23 @@ def addClue(clue_name, clue_info, longitude, latitude, status="UNVISITED"): clues.append(newClue) clues_last_changed = time.time() route_update_required = True + _clues_changed = True return 0 def deleteClue(clue_name): - global route_update_required + global route_update_required, _clues_changed for i, clue in enumereate(clues): if clue.name == clue_name: clues.pop(i) clues_last_changed = time.time() route_update_required = True + _clues_changed = True break def visitClue(clue_name, unvisit=False): - global clues_last_changed, route_update_required + global clues_last_changed, route_update_required, _clues_changed for clue in clues: if clue.name == clue_name: if clue.status == "VISITED": @@ -196,7 +226,8 @@ def visitClue(clue_name, unvisit=False): return 3 # already visited clue.visit() clues_last_changed = time.time() - route_update_required + route_update_required = True + _clues_changed = True return 0 # OK return 2 # no clue @@ -261,6 +292,7 @@ def visitClueTeam(team_index, clue_name): def load(filename=None): + global route_update_required """ Loads all clues from a CSV file :param filename: name of CSV file @@ -290,11 +322,11 @@ def load(filename=None): except: return 1 clues_last_changed = time.time() - updateRoutes() + route_update_required = True return 0 def loadDirty(filename=None): - global clues_last_changed + global clues_last_changed, route_update_required if filename == None: return @@ -312,13 +344,12 @@ def loadDirty(filename=None): if len(latlong) != 2: continue latitude = float(latlong[0]) longitude = float(latlong[1]) - print(longitude) clues.append(Clue(latitude, longitude, name, info, "UNVISITED")) except: return 1 clues_last_changed = time.time() - updateRoutes() + route_update_required = True return 0 |
