mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-04 03:13:49 +00:00
Merge branch 'master' of ssh://localhost:12347/home/trac/git
This commit is contained in:
commit
72aedaea6f
9 files changed
+35
-42
No files matched your search
@@ -30,11 +30,9 @@ Simon
|
|||||||
+ Prüfen, warum in der Map Anzeige manchmal ein Competitor doppelt ist
|
+ Prüfen, warum in der Map Anzeige manchmal ein Competitor doppelt ist
|
||||||
+ Wind aus der Map löschen wenn der sich geändert hat
|
+ Wind aus der Map löschen wenn der sich geändert hat
|
||||||
+ Simulator mit Speed = 1 anschmeissen und dann prüfen was passiert
|
+ Simulator mit Speed = 1 anschmeissen und dann prüfen was passiert
|
||||||
+ Prüfen warum im live leaderbaord manchmal 4 legs angezeigt werden
|
+ Prüfen warum im live leaderbaord manchmal 4 legs angezeigt werden (max ist 2+1)
|
||||||
+ Prüfen warum der Listener thread manchmal nicht richtig gestoppt wird (disconnect sollte auch thread stoppen)
|
+ Prüfen warum der Listener thread manchmal nicht richtig gestoppt wird
|
||||||
+ Datenbank nicht einfach so löschen (Wind Positionen)
|
+ Infinity oder große Werte als Ankerindikatoren anzeigen im UI
|
||||||
+ Infinity oder große Werte als Ankerindikatoren erkennen und anzeigen können
|
|
||||||
+ Anzeige Truebearing bei Wind-Informationen
|
|
||||||
+ MongoDB als Windsource bei addrace oder addevent einstellbar machen
|
+ MongoDB als Windsource bei addrace oder addevent einstellbar machen
|
||||||
+ Anzeigen im Leaderboard ob der Wind up oder down ist (competitor.values wäre ein guter platz dafür)
|
+ Anzeigen im Leaderboard ob der Wind up oder down ist (competitor.values wäre ein guter platz dafür)
|
||||||
+ Implementierung Leaderboard auf Basis HTML Designer
|
+ Implementierung Leaderboard auf Basis HTML Designer
|
||||||
|
|||||||
+7
@@ -57,6 +57,13 @@ public class RaceTrackerImpl implements Listener, RaceTracker {
|
|||||||
throws URISyntaxException, MalformedURLException, FileNotFoundException {
|
throws URISyntaxException, MalformedURLException, FileNotFoundException {
|
||||||
// Read event data from configuration file
|
// Read event data from configuration file
|
||||||
tractracEvent = KeyValue.setup(paramURL);
|
tractracEvent = KeyValue.setup(paramURL);
|
||||||
|
|
||||||
|
// can happen that tractrac event is null (occurs when there is no internet connection)
|
||||||
|
// so lets raise some meaningful exception
|
||||||
|
if (tractracEvent == null) {
|
||||||
|
throw new RuntimeException("Connection failed. Could not connect to " + paramURL);
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize data controller using live and stored data sources
|
// Initialize data controller using live and stored data sources
|
||||||
controller = new DataController(liveURI, storedURI, this);
|
controller = new DataController(liveURI, storedURI, this);
|
||||||
// Start live and stored data streams
|
// Start live and stored data streams
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ class URIConfigurator(object):
|
|||||||
def trigger(self, request=None):
|
def trigger(self, request=None):
|
||||||
if self.do_log is True:
|
if self.do_log is True:
|
||||||
log.info('Triggering URI %s' % self.URI())
|
log.info('Triggering URI %s' % self.URI())
|
||||||
return urllib2.urlopen(self.URI())
|
return urllib2.urlopen(self.URI()).read()
|
||||||
|
|
||||||
def jsonByUrl(configurator):
|
def jsonByUrl(configurator):
|
||||||
""" Connects to specified REST service and returns parsed data """
|
""" Connects to specified REST service and returns parsed data """
|
||||||
|
|||||||
@@ -36,11 +36,11 @@ def setupDatabases():
|
|||||||
databases[dbname] = db
|
databases[dbname] = db
|
||||||
connections[dbname] = conn
|
connections[dbname] = conn
|
||||||
|
|
||||||
for collection in d['collections']:
|
for collection in d['collections'][0].strip().split(' '):
|
||||||
collections[collection] = mongokit.Collection(db, collection)
|
collections[collection] = mongokit.Collection(db, collection)
|
||||||
collection2connection[collection] = conn
|
collection2connection[collection] = conn
|
||||||
|
|
||||||
LOG.info('Attached collections: %s' % ', '.join(collections))
|
LOG.info('Attached collections to database %s: %s' % (dbname, ', '.join(d['collections'])))
|
||||||
|
|
||||||
def getCollection(collection):
|
def getCollection(collection):
|
||||||
""" Return a MongoDB collection by its name """
|
""" Return a MongoDB collection by its name """
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
from database import databases, collections
|
from database import databases, collections
|
||||||
|
|
||||||
|
import logging
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
def dbStats():
|
def dbStats():
|
||||||
result = dict()
|
result = dict()
|
||||||
for dbname in databases:
|
for dbname in databases:
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ threaded_listener = {}
|
|||||||
def dropDB(context, request):
|
def dropDB(context, request):
|
||||||
from sailing.db.monitoring import dropDB
|
from sailing.db.monitoring import dropDB
|
||||||
dropDB()
|
dropDB()
|
||||||
|
|
||||||
return HTTPFound(location='/')
|
return HTTPFound(location='/')
|
||||||
|
|
||||||
def startListenerThreads(conf, eventlist):
|
def startListenerThreads(conf, eventlist):
|
||||||
@@ -55,30 +54,6 @@ def startListenerThreads(conf, eventlist):
|
|||||||
threaded_listener[key] = t
|
threaded_listener[key] = t
|
||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
# addEvent
|
|
||||||
def configureListener(context, request):
|
|
||||||
host = request.POST.get('host', 'localhost')
|
|
||||||
port = request.POST.get('port', '8888')
|
|
||||||
|
|
||||||
lock = threading.Lock()
|
|
||||||
|
|
||||||
view = core.BaseView(context, request)
|
|
||||||
|
|
||||||
conf = URIConfigurator(host, port)
|
|
||||||
view.session['listener-conf'] = conf
|
|
||||||
|
|
||||||
if request.POST.get('listener-start', None):
|
|
||||||
conf.setContext(config.ADMIN) dead threads
|
|
||||||
lstn = threaded_listener.get(key, None)
|
|
||||||
if lstn and lstn.running is False and lstn.is_alive() is False:
|
|
||||||
del threaded_listener[key]
|
|
||||||
|
|
||||||
# now there should be only running threads left
|
|
||||||
if not threaded_listener.has_key(key):
|
|
||||||
t = provider.LiveDataReceiver(conf.host, conf.port, event['name'], racename)
|
|
||||||
threaded_listener[key] = t
|
|
||||||
t.start()
|
|
||||||
|
|
||||||
# addEvent
|
# addEvent
|
||||||
def configureListener(context, request):
|
def configureListener(context, request):
|
||||||
host = request.POST.get('host', 'localhost')
|
host = request.POST.get('host', 'localhost')
|
||||||
@@ -94,7 +69,6 @@ def configureListener(context, request):
|
|||||||
if request.POST.get('listener-start', None):
|
if request.POST.get('listener-start', None):
|
||||||
conf.setContext(config.ADMIN)
|
conf.setContext(config.ADMIN)
|
||||||
|
|
||||||
|
|
||||||
if request.POST.get('eventJSONURL'):
|
if request.POST.get('eventJSONURL'):
|
||||||
conf.setCommand(config.ADD_EVENT)
|
conf.setCommand(config.ADD_EVENT)
|
||||||
conf.setParameters(dict(eventJSONURL=request.POST.get('eventJSONURL'),
|
conf.setParameters(dict(eventJSONURL=request.POST.get('eventJSONURL'),
|
||||||
@@ -119,6 +93,10 @@ def configureListener(context, request):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
result = conf.trigger()
|
result = conf.trigger()
|
||||||
|
|
||||||
|
if result.find('Exception')>0:
|
||||||
|
raise Exception, 'Server triggered exception: %s' % result[:550]
|
||||||
|
|
||||||
except Exception, ex:
|
except Exception, ex:
|
||||||
return view.yieldMessage('Error: %s' % str(ex))
|
return view.yieldMessage('Error: %s' % str(ex))
|
||||||
|
|
||||||
@@ -166,7 +144,6 @@ def configureListener(context, request):
|
|||||||
if racename:
|
if racename:
|
||||||
conf.setCommand(config.STOP_RACE)
|
conf.setCommand(config.STOP_RACE)
|
||||||
conf.setParameters(dict(eventname=eventname, racename=racename))
|
conf.setParameters(dict(eventname=eventname, racename=racename))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
conf.setCommand(config.STOP_EVENT)
|
conf.setCommand(config.STOP_EVENT)
|
||||||
conf.setParameters(dict(eventname=eventname))
|
conf.setParameters(dict(eventname=eventname))
|
||||||
@@ -176,8 +153,6 @@ def configureListener(context, request):
|
|||||||
del view.session['listener-conf']
|
del view.session['listener-conf']
|
||||||
view.session.save()
|
view.session.save()
|
||||||
|
|
||||||
# not using get_ident here because we need to be able
|
|
||||||
# to get a listener by knowing the event and race
|
|
||||||
key = hash('%s-%s-%s-%s' % (conf.host, conf.port, eventname, racename))
|
key = hash('%s-%s-%s-%s' % (conf.host, conf.port, eventname, racename))
|
||||||
if threaded_listener.has_key(key):
|
if threaded_listener.has_key(key):
|
||||||
threaded_listener[key].running = False
|
threaded_listener[key].running = False
|
||||||
@@ -194,7 +169,7 @@ def configureListener(context, request):
|
|||||||
eventlist = provider.eventConfiguration(conf)
|
eventlist = provider.eventConfiguration(conf)
|
||||||
|
|
||||||
if model.EventImpl.queryCount() == 0:
|
if model.EventImpl.queryCount() == 0:
|
||||||
return view.yieldMessage('Seems that there are no events that can be shown! Server not started?')
|
return view.yieldMessage('Seems that there are no events that can be shown! Listener not started?')
|
||||||
|
|
||||||
# start listener thread if this is not yet active
|
# start listener thread if this is not yet active
|
||||||
startListenerThreads(conf, eventlist)
|
startListenerThreads(conf, eventlist)
|
||||||
@@ -216,8 +191,7 @@ def configuredListeners(context, request):
|
|||||||
out = []
|
out = []
|
||||||
for key, listener in threaded_listener.items():
|
for key, listener in threaded_listener.items():
|
||||||
out.append( {'host': listener.host, 'port': listener.port,
|
out.append( {'host': listener.host, 'port': listener.port,
|
||||||
'eventname': listener.eventname,
|
'eventname': listener.eventname, 'last_update': listener.last_update and listener.last_update.strftime('%d.%m %H:%M:%S') or '-',
|
||||||
'last_update': listener.last_update and listener.last_update.strftime('%d.%m %H:%M:%S') or '-',
|
|
||||||
'paused' : listener.paused, 'running': listener.running, 'id' : key,
|
'paused' : listener.paused, 'running': listener.running, 'id' : key,
|
||||||
'racename': listener.racename} )
|
'racename': listener.racename} )
|
||||||
|
|
||||||
@@ -291,7 +265,6 @@ def mapCompetitors(context, request):
|
|||||||
|
|
||||||
data = jsonByUrl(conf)
|
data = jsonByUrl(conf)
|
||||||
|
|
||||||
# sort by current ranks (if available)
|
|
||||||
if data.get('ranks'):
|
if data.get('ranks'):
|
||||||
data = data['ranks']
|
data = data['ranks']
|
||||||
data.sort(lambda x,y: cmp(x['rank'], y['rank']))
|
data.sort(lambda x,y: cmp(x['rank'], y['rank']))
|
||||||
|
|||||||
@@ -53,6 +53,14 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<span>Persistent store where to persist wind tracks</span><br/>
|
||||||
|
<select name="windstore">
|
||||||
|
<option value="empty">Do not persist wind</option>
|
||||||
|
<option value="mongo">MongoDB Persister</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<input type="checkbox" name="drop_db" />
|
<input type="checkbox" name="drop_db" />
|
||||||
<span>Drop Database before connect</span><br/>
|
<span>Drop Database before connect</span><br/>
|
||||||
|
|||||||
@@ -22,7 +22,9 @@
|
|||||||
<tal:for repeat="track wind['EXPEDITION'][:10]">
|
<tal:for repeat="track wind['EXPEDITION'][:10]">
|
||||||
<b>${view.millisToDatetime(track['timepoint'])}</b>
|
<b>${view.millisToDatetime(track['timepoint'])}</b>
|
||||||
Bearing: ${track['truebearingdeg']}
|
Bearing: ${track['truebearingdeg']}
|
||||||
|
Dampened Bearing: ${track['dampenedtruebearingdeg']}
|
||||||
Speed: ${track['knotspeed']}
|
Speed: ${track['knotspeed']}
|
||||||
|
Dampened Speed: ${track['dampenedknotspeed']}
|
||||||
LatDeg: ${track.get('latdeg', 'N/A')}
|
LatDeg: ${track.get('latdeg', 'N/A')}
|
||||||
LngDeg: ${track.get('lngdeg', 'N/A')}<br/>
|
LngDeg: ${track.get('lngdeg', 'N/A')}<br/>
|
||||||
</tal:for>
|
</tal:for>
|
||||||
@@ -39,7 +41,9 @@
|
|||||||
<tal:for repeat="track wind['WEB'][:10]">
|
<tal:for repeat="track wind['WEB'][:10]">
|
||||||
<b>${view.millisToDatetime(track['timepoint'])}</b>
|
<b>${view.millisToDatetime(track['timepoint'])}</b>
|
||||||
Bearing: ${track['truebearingdeg']}
|
Bearing: ${track['truebearingdeg']}
|
||||||
|
Dampened Bearing: ${track['dampenedtruebearingdeg']}
|
||||||
Speed: ${track['knotspeed']}
|
Speed: ${track['knotspeed']}
|
||||||
|
Dampened Speed: ${track['dampenedknotspeed']}
|
||||||
LatDeg: ${track.get('latdeg', 'N/A')}
|
LatDeg: ${track.get('latdeg', 'N/A')}
|
||||||
LngDeg: ${track.get('lngdeg', 'N/A')}<br/>
|
LngDeg: ${track.get('lngdeg', 'N/A')}<br/>
|
||||||
</tal:for>
|
</tal:for>
|
||||||
|
|||||||
@@ -24,5 +24,5 @@ port = ${conf:mongodb_port}
|
|||||||
dbname = biography
|
dbname = biography
|
||||||
username =
|
username =
|
||||||
password =
|
password =
|
||||||
collections = competitors
|
collections = competitor_info
|
||||||
|
|
||||||
Reference in new issue
Block a user