summaryrefslogtreecommitdiff
path: root/dashboard_website/db.py
diff options
context:
space:
mode:
authorAnson Bridges <bridges.anson@gmail.com>2024-11-14 01:20:05 -0500
committerAnson Bridges <bridges.anson@gmail.com>2024-11-14 01:20:05 -0500
commit3f68ac783948c7d47974993854a1d317399d3b04 (patch)
treeb4c5413f54a5435b279977ba6835581bb4f36567 /dashboard_website/db.py
parent5d013db5968b4b1989a5b2eabf2ad651540240d9 (diff)
bug fixes from server testing, route previews, slight routing improvements
Diffstat (limited to 'dashboard_website/db.py')
-rw-r--r--dashboard_website/db.py83
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