mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-13 15:50:59 +00:00
Merge branch 'master' of ssh://localhost:12347/home/trac/git
This commit is contained in:
commit
a4ef7755ce
6 files changed
+149
-81
No files matched your search
@@ -14,6 +14,7 @@ class URIConfigurator(object):
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.do_log = log
|
||||
self.expedition = None
|
||||
|
||||
def copy(self):
|
||||
inst = URIConfigurator(self.host, self.port)
|
||||
|
||||
@@ -29,10 +29,9 @@ class LiveDataReceiver(threading.Thread):
|
||||
self.updatecount = 0
|
||||
|
||||
self.running = False
|
||||
self.paused = False
|
||||
|
||||
# start thread paused - in real life there should only
|
||||
# be one race running and therefore we only need one running listener
|
||||
self.paused = True
|
||||
self.error = ''
|
||||
|
||||
threading.Thread.__init__(self)
|
||||
|
||||
@@ -75,11 +74,14 @@ class LiveDataReceiver(threading.Thread):
|
||||
|
||||
self.last_update = datetime.datetime.now()
|
||||
self.updatecount = updatecount
|
||||
self.error = ''
|
||||
|
||||
except Exception, ex:
|
||||
# print error but do not kill thread as this could be recoverable (connection problems, ...)
|
||||
log.error('Error in thread for %s %s' % (self.eventname, self.racename), exc_info=True)
|
||||
|
||||
self.error = str(ex)
|
||||
|
||||
if str(ex).find('Race not found')>=0:
|
||||
# if race is not found then pause
|
||||
log.error(' Pausing listener because race is invalid.')
|
||||
@@ -90,7 +92,7 @@ class LiveDataReceiver(threading.Thread):
|
||||
time.sleep(5)
|
||||
|
||||
# avoid hammering java server - can occur if call does not block correctly or by using a delayed call
|
||||
time.sleep(4)
|
||||
time.sleep(5)
|
||||
|
||||
log.info('STOP listener for %s:%s (%s, %s)' % (self.host, self.port, self.eventname, self.racename))
|
||||
|
||||
|
||||
@@ -111,6 +111,17 @@ class BaseView(object):
|
||||
return self.session['listener-conf'].copy()
|
||||
return None
|
||||
|
||||
def expeditionPort(self):
|
||||
conf = self.listenerConf()
|
||||
if conf.host.startswith('test') or conf.port == '8887':
|
||||
return '2011'
|
||||
elif conf.host.startswith('dev') or conf.port == '8886':
|
||||
return '2010'
|
||||
elif conf.host.startswith('prod1') or conf.port == '8888':
|
||||
return '2013'
|
||||
elif conf.host.startswith('prod2') or conf.port == '8889':
|
||||
return '2014'
|
||||
|
||||
def currentRace(self):
|
||||
if not self.session.has_key('current-race'):
|
||||
return None
|
||||
|
||||
@@ -156,6 +156,23 @@ def configureListener(context, request):
|
||||
delay = request.POST.get('delay', '')
|
||||
startListenerThreads(conf, eventlist, delay)
|
||||
|
||||
if request.POST.get('expedition_port'):
|
||||
expedition_port = request.POST.get('expedition_port')
|
||||
|
||||
# persist expedition port
|
||||
view.session['listener-conf'].expedition = expedition_port
|
||||
|
||||
for event in eventlist:
|
||||
eventname = event['name']
|
||||
for race in event['races']:
|
||||
racename = race['name']
|
||||
|
||||
conf.setContext(config.ADMIN)
|
||||
conf.setCommand(config.START_EXP_WIND)
|
||||
conf.setParameters(dict(port=expedition_port, eventname=eventname, racename=racename))
|
||||
conf.trigger()
|
||||
log.info('Configured expedition wind for event %s, race %s on port %s' % (eventname, racename, expedition_port))
|
||||
|
||||
except Exception, ex:
|
||||
return view.yieldMessage('Could not gather any data! Seems that Java listener is not ready yet. Please reconnect. Error: %s' % str(ex))
|
||||
|
||||
@@ -256,7 +273,7 @@ def configuredListeners(context, request):
|
||||
out.append( {'host': listener.host, 'port': listener.port,
|
||||
'eventname': listener.eventname, 'last_update': listener.last_update and listener.last_update.strftime('%d.%m %H:%M:%S') or '-',
|
||||
'paused' : listener.paused, 'running': listener.running, 'xid' : str(key),
|
||||
'racename': listener.racename} )
|
||||
'racename': listener.racename, 'error': listener.error} )
|
||||
|
||||
return out
|
||||
|
||||
@@ -664,6 +681,7 @@ def loadRacesForEvent(context, request):
|
||||
|
||||
data = jsonByUrl(conf)
|
||||
|
||||
races = data.sort(lambda x,y:cmp(x['name'], y['name']))
|
||||
return render_to_response('templates/java-connector-select-races.pt', {'races' : data, 'view': view}, request=request)
|
||||
|
||||
@jsonize
|
||||
|
||||
@@ -3,14 +3,46 @@
|
||||
When <i>stopping listener</i> it will trigger two methods: If you select a race it will call stoprace, if no race is selected it will call stopevent.</div>
|
||||
|
||||
<form method="POST" action="/++/configureListener">
|
||||
<tal:if condition="not view.listenerStarted()">
|
||||
<tal:if condition="view.listenerStarted() or request.params.get('debug')">
|
||||
Event:
|
||||
<select name="event">
|
||||
<tal:for repeat="event view.allEvents()">
|
||||
<option value="${event.name}">${event.name}</option>
|
||||
</tal:for>
|
||||
</select>
|
||||
|
||||
Race:
|
||||
<select name="race">
|
||||
<option value=""></option>
|
||||
<tal:for repeat="race view.allRacesFor()">
|
||||
<option value="${race}">${race}</option>
|
||||
</tal:for>
|
||||
</select>
|
||||
<br/><br/>
|
||||
<fieldset>
|
||||
<legend>Leaderboard</legend>
|
||||
<input type="submit" name="leaderboard-default-event" style="background-color: green; color: white;" value="Set selected event as Leaderboard default"/>
|
||||
<br/><br/>Leaderboard-Default: ${view.currentLeaderboardEvent() and view.currentLeaderboardEvent().name or 'N/A'}
|
||||
<a target="_blank" href="${request.application_url}/@@/leaderboard-live">» Show Leaderboard</a>
|
||||
</fieldset>
|
||||
<br/><br/>
|
||||
<fieldset>
|
||||
<legend>Handling</legend>
|
||||
<input type="submit" name="listener-event-refresh" value="(Re) load event data"/>
|
||||
<input type="submit" name="disconnect-server" value="Disconnect your session"/>
|
||||
|
||||
<input type="submit" name="listener-stop" value="Stop Server (for whole event or single race)" style="background-color: #cc3300;"/>
|
||||
|
||||
</fieldset>
|
||||
</tal:if>
|
||||
|
||||
<tal:if condition="not view.listenerStarted()">
|
||||
<fieldset>
|
||||
<legend>1. Connection</legend>
|
||||
<div class="field">
|
||||
<span>Host and Port:</span><br/>
|
||||
<input type="text" id="serverhost" name="host"/> <input id="serverport" type="text" name="port"/>
|
||||
<select name="hostport" id="hostport" onchange="$('#serverhost').val($('#hostport option:selected').attr('host'));$('#serverport').val($('#hostport option:selected').attr('port'))">
|
||||
<select name="hostport" id="hostport" onchange="$('#serverhost').val($('#hostport option:selected').attr('host'));$('#serverport').val($('#hostport option:selected').attr('port'));$('input[name=expedition_port]').attr('value', $('#hostport option:selected').attr('expedition'))">
|
||||
<option host="" port=""></option>
|
||||
<option host="dev.kielweek.web4sap.com" port="80" expedition="2010">DEV-EXTERN ${view.serverStatus('dev.kielweek.web4sap.com', '80')}</option>
|
||||
<option host="test.kielweek.web4sap.com" port="80" expedition="2011">TEST-EXTERN ${view.serverStatus('test.kielweek.web4sap.com', '80')}</option>
|
||||
@@ -25,20 +57,29 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
|
||||
|
||||
<div class="field">
|
||||
<span>Use given delay (UTCnow() - n Seconds) for loading race data</span><br/>
|
||||
<input type="text" name="delay" value="" />
|
||||
<input type="text" name="delay" value="30" />
|
||||
</div>
|
||||
|
||||
<input type="submit" name="listener-event-refresh" value="Connect to already running server" /><br/><br/>
|
||||
</fieldset>
|
||||
</tal:if>
|
||||
|
||||
<br/><br/>
|
||||
<fieldset>
|
||||
<legend>2. Event Configuration</legend>
|
||||
|
||||
<tal:if condition="view.listenerStarted()">
|
||||
<div class="field">
|
||||
<span>Configured on ${view.listenerConf().host}:${view.listenerConf().port}</span>
|
||||
<input id="serverhost" type="hidden" name="host" value="${view.listenerConf().host}"/><input id="serverport" type="hidden" name="port" value="${view.listenerConf().port}"/>
|
||||
</div>
|
||||
</tal:if>
|
||||
|
||||
<div class="field">
|
||||
<span>URL to event configuration</span><br/>
|
||||
<input class="large" type="text" name="eventJSONURL" id="eventJSONURL" value=""/>
|
||||
|
||||
<select name="eventJSONURLselect" onchange="$('input[name=eventJSONURL]').val($('select[name=eventJSONURLselect] option:selected').val())">
|
||||
<option value=""></option>
|
||||
<option value="http://germanmaster.traclive.dk/events/event_20110609_KielerWoch/jsonservice.php">Kiel Week</option>
|
||||
<option value="http://germanmaster.traclive.dk/events/event_20110505_SailingTea/jsonservice.php">STG Training</option>
|
||||
</select>
|
||||
@@ -51,6 +92,7 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
|
||||
</fieldset>
|
||||
|
||||
<div id="extended-conf" style="display:none;">
|
||||
<br/><br/>
|
||||
<fieldset>
|
||||
<legend>3. Race Configuration </legend>
|
||||
|
||||
@@ -60,7 +102,6 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
|
||||
<span>Live-Connection (host:port):</span><br/>
|
||||
<input class="large" type="text" name="liveURI" value="" />
|
||||
<select name="liveURIselect" onchange="$('input[name=liveURI]').val($('select[name=liveURIselect] option:selected').val())">
|
||||
<option value=""></option>
|
||||
<option value="tcp://germanmaster.traclive.dk:1520">Kiel Week</option>
|
||||
<option value="tcp://sapsimulation.tracdev.dk:4420">J80 Race 12</option>
|
||||
<option value="tcp://germanmaster.traclive.dk:4400">STG Training</option>
|
||||
@@ -71,7 +112,6 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
|
||||
<span>Data-Connection (host:port):</span><br/>
|
||||
<input class="large" type="text" name="storedURI" value="" />
|
||||
<select name="storedURIselect" onchange="$('input[name=storedURI]').val($('select[name=storedURIselect] option:selected').val())">
|
||||
<option value=""></option>
|
||||
<option value="tcp://germanmaster.traclive.dk:1521">Kiel Week</option>
|
||||
<option value="tcp://sapsimulation.tracdev.dk:4421">J80 Race 12</option>
|
||||
<option value="tcp://germanmaster.traclive.dk:4401">STG Training</option>
|
||||
@@ -79,6 +119,7 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<br/><br/>
|
||||
<fieldset>
|
||||
<legend>4. Admin Configuration</legend>
|
||||
|
||||
@@ -98,62 +139,36 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
|
||||
<div class="field">
|
||||
<input type="checkbox" name="start_expedition" checked="checked" />
|
||||
<span>Start UDP expedition wind listener</span><br/>
|
||||
<input type="hidden" name="expedition_port" value=""/>
|
||||
<input tal:condition="not view.listenerStarted()" type="hidden" name="expedition_port" value=""/>
|
||||
<input tal:condition="view.listenerStarted()" type="hidden" name="expedition_port" value="${view.expeditionPort()}"/>
|
||||
</div>
|
||||
|
||||
<input type="submit" name="listener-start" value="Connect to TracTrac"/>
|
||||
<input type="submit" name="listener-start" value="Push configuration and listen"/>
|
||||
</fieldset>
|
||||
|
||||
<br/><br/>
|
||||
<fieldset tal:condition="view.listenerStarted()">
|
||||
<legend>Averaging</legend>
|
||||
<div>
|
||||
Current Averaging: <span id="averaging">...</span>
|
||||
</div>
|
||||
<div class="field">
|
||||
<span>Set averaging interval (in millis) for</span><br/>
|
||||
Speed: <input type="text" name="averagingSpeed" value="20000"/> Wind: <input type="text" name="averagingWind" value="20000"/>
|
||||
</div>
|
||||
|
||||
<input type="button" value="Load Averaging (needs unpaused listener for the selected race)" onclick="GET('showAveraging', {eventname: $('select[name=event] option:selected').val(), racename: $('select[name=race] option:selected').val()}, function(data) {$('#averaging').html(data)});"/>
|
||||
<input type="submit" name="set-averaging" value="Set Averaging (for selected race)"/>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</tal:if>
|
||||
|
||||
<tal:if condition="view.listenerStarted() or request.params.get('debug')">
|
||||
Event:
|
||||
<select name="event">
|
||||
<tal:for repeat="event view.allEvents()">
|
||||
<option value="${event.name}">${event.name}</option>
|
||||
</tal:for>
|
||||
</select>
|
||||
|
||||
Race:
|
||||
<select name="race">
|
||||
<option value=""></option>
|
||||
<tal:for repeat="race view.allRacesFor()">
|
||||
<option value="${race}">${race}</option>
|
||||
</tal:for>
|
||||
</select>
|
||||
<br/><br/>
|
||||
<fieldset>
|
||||
<legend>Handling</legend>
|
||||
<input type="submit" name="listener-event-refresh" value="(Re) load event data"/>
|
||||
<input type="submit" name="disconnect-server" value="Disconnect your session"/>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('select[name=eventJSONURLselect]').change();
|
||||
$('select[name=liveURIselect]').change();
|
||||
$('select[name=storedURIselect]').change();
|
||||
});
|
||||
</script>
|
||||
|
||||
<input type="submit" name="listener-stop" value="Stop Server" style="background-color: #cc3300;"/>
|
||||
|
||||
</fieldset>
|
||||
<br/>
|
||||
<fieldset>
|
||||
<legend>Leaderboard</legend>
|
||||
<input type="submit" name="leaderboard-default-event" style="background-color: green; color: white;" value="Set event as Leaderboard default"/>
|
||||
Leaderboard-Default: ${view.currentLeaderboardEvent() and view.currentLeaderboardEvent().name or 'N/A'}
|
||||
<a target="_blank" href="${request.application_url}/@@/leaderboard-live">» Show Leaderboard</a>
|
||||
<br/>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<br/>
|
||||
<fieldset>
|
||||
<legend>Averaging</legend>
|
||||
<div>
|
||||
Current Averaging: <span id="averaging">...</span>
|
||||
</div>
|
||||
<div class="field">
|
||||
<span>Set averaging interval (in millis) for</span><br/>
|
||||
Speed: <input type="text" name="averagingSpeed" value="20000"/> Wind: <input type="text" name="averagingWind" value="20000"/>
|
||||
</div>
|
||||
|
||||
<input type="button" value="Load Averaging (needs unpaused listener for the selected race)" onclick="GET('showAveraging', {eventname: $('select[name=event] option:selected').val(), racename: $('select[name=race] option:selected').val()}, function(data) {$('#averaging').html(data)});"/>
|
||||
<input type="submit" name="set-averaging" value="Set Averaging (for selected race)"/>
|
||||
</fieldset>
|
||||
|
||||
</tal:if>
|
||||
</form>
|
||||
@@ -19,25 +19,26 @@
|
||||
</div>
|
||||
|
||||
<div style="text-align: right;margin: 13px 1px 13px 1px;">
|
||||
<form method="POST" action="/++/configureListener">
|
||||
<div id="listeners-container">
|
||||
<select id="listeners">
|
||||
<option>Loading....</option>
|
||||
</select> <br/>
|
||||
<div align="right">
|
||||
<input type="button" value="UnPause" onclick="GET('unPauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="Pause" onclick="GET('pauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="UnPause ALL" onclick="GET('unPauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="Pause ALL" onclick="GET('pauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="Stop" onclick="GET('stopListener', {tid: $('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
|
||||
<form method="POST" action="/++/configureListener">
|
||||
<div id="listeners-container">
|
||||
<select id="listeners">
|
||||
<option>Loading....</option>
|
||||
</select> <br/>
|
||||
<div align="right">
|
||||
<input type="button" value="UnPause" onclick="GET('unPauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="Pause" onclick="GET('pauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="UnPause ALL" onclick="GET('unPauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="Pause ALL" onclick="GET('pauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
<input type="button" value="Stop" onclick="GET('stopListener', {tid: $('#listeners option:selected').val()}, loadListeners)"/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="tabs">
|
||||
@@ -52,8 +53,19 @@
|
||||
<li><a href="/@@/leaderboard"><span>Leaderboard</span></a></li>
|
||||
<li><a href="/@@/live-info"><span>Live Info</span></a></li>
|
||||
<li><a href="/@@/database-stats"><span>DB</span></a></li>
|
||||
<li><a href="#tab-error"><span>Errors</span></a></li>
|
||||
</ul>
|
||||
|
||||
<div id="tab-error">
|
||||
<div class="help">
|
||||
If any errors occur then they will show up here.
|
||||
</div>
|
||||
|
||||
<div style="margin: 10px;font-size: 14px;" id="errors">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="tab-simulator">
|
||||
<div class="help">
|
||||
Here you can control the TracTrac simulator. This application does not the state of the running
|
||||
@@ -84,9 +96,18 @@
|
||||
function loadListeners() {
|
||||
if (run_listener == true)
|
||||
$('#listeners').html('<option>Checking server...</option>');
|
||||
$('#errors').html(' ');
|
||||
|
||||
GET('configuredListeners', {}, function(data) {
|
||||
options = '';
|
||||
|
||||
$('#listeners').css('color', '');
|
||||
|
||||
for (d in data) {
|
||||
if (data[d].error) {
|
||||
$('#listeners').css('color', 'red');
|
||||
$('#errors').html($('#errors').html() + '<br/><b>' + data[d].eventname + ' ' + data[d].racename + '</b><br/><pre>' + data[d].error + '</pre>');
|
||||
}
|
||||
options += format('<option value="'+data[d].xid+'">{host}:{port} | {eventname} | {racename} | U: {last_update} P: {paused}</option>', data[d]);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user