background-color: black;
color: white;
}
-
-x-content {
+x-page {
display: block;
width: 100%;
}
x-boxleft, x-boxright {
display: block;
- padding: 0.2em;
- margin: 0.1em;
border: none;
}
x-boxleft { float:left; }
x-boxright { float:right; }
.clear { clear:both; }
-
.cont {
+ min-width:15em;
+ padding: 0.2em;
border: solid 2px grey;
- min-width:13em;
- /*
- width:15em;
+}
+.bar {
min-width:15em;
- height:22em;
- min-height:22em;
- */
+}
+
+table, caption, tbody, tfoot, thead, tr, th, td {
+ width: auto;
+ height: auto;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ border-collapse: collapse;
+ outline: 0;
+ vertical-align: baseline;
+ background: transparent;
}
.aright { text-align: right; }
.aleft { text-align: left; }
+.acenter { text-align: center; }
.ajust { text-align: justify; }
.big { font-size: 8em; }
.medium { font-size: 4em; }
-.small { font-size: 2em; }
+.small { font-size: 2.5em; }
+.smaller { font-size: 1.8em; }
.tiny { font-size: 1.2em; }
.warn1 { color:#fd0; }
.setval { color:#0af; }
.hilite { background-color: #ff0; }
-
x-bar {
- display: none;
+ display: block;
clear: both;
- width: 90%;
+ width: 100%;
padding: 0.2em;
margin: 0.1em;
border: none;
<x-page id="page">
<x-boxleft id="speedo" class="cont">
- <x-boxright class="clear"><span class="big" id="speed">--</span><span class="tiny"> km/h</span></x-boxright>
- <x-boxleft class="clear">
- <svg width="50" height="50">
- <circle cx="25" cy="25" r="22" stroke="red" stroke-width="6" fill="white" id="nav_slimitsign"/>
- <text fill="#000" font-size="24" font-family="sans-serif" font-weight="normal" x="10" y="34" id="nav_slimit">---</text>
- </svg>
- </x-boxleft>
- <x-boxright><span class="medium setval" id="cctrl">-</span><span class="tiny"> km/h</span></x-boxright>
- <x-boxleft class="clear"><span class="small setval" id="gear">x</span><span class="tiny"> </span></x-boxleft>
- <x-boxright><span class="small" id="rpm">0</span><span class="tiny"> rpm</span></x-boxright>
- <x-boxright class="clear"><span class="small" id="odometer">-</span><span class="tiny"> km</span></x-boxright>
+ <table style="width:100%;">
+ <tr><td colspan="2" class="aright"><span class="big" id="speed">--</span></td><td><span class="tiny"> km/h</span></td></tr>
+ <tr>
+ <td class="small"><svg width="50" height="50">
+ <circle cx="25" cy="25" r="22" stroke="red" stroke-width="6" fill="white" id="nav_slimitsign"/>
+ <text fill="#000" font-size="24" font-family="sans-serif" font-weight="normal" x="10" y="34" id="nav_slimit">---</text>
+ </svg> </td>
+ <td class="aright"><span class="medium setval" id="cctrl">-</span></td><td><span class="tiny"> km/h</span></td>
+ </tr>
+ <tr><td><span class="small setval" id="gear">x</span></td><td class="aright"><span class="small" id="rpm">0</span></td><td><span class="tiny"> rpm</span></td></tr>
+ </table>
</x-boxleft>
<x-boxleft id="range" class="cont">
- <x-boxright class="clear"><span class="medium" id="fuel">-</span><span class="tiny"> l</span></x-boxright>
- <x-boxright class="clear"><span class="medium" id="fuel_range">-</span><span class="tiny"> km</span></x-boxright>
- <x-boxright class="clear"><span class="small" id="fuel_avg">-</span><span class="tiny"> l/100km</span></x-boxright>
+ <table style="width:100%;">
+ <tr><td class="tiny">Fuel</td><td class="aright"><span class="small" id="fuel">-</span></td><td><span class="tiny"> l</span></td></tr>
+ <tr><td class="tiny">Range</td><td class="aright"><span class="small" id="fuel_range">-</span></td><td><span class="tiny"> km</span></td></tr>
+ <tr><td class="tiny">Average</td><td class="aright" colspan="2"><span class="smaller" id="fuel_avg">-</span><span class="tiny"> l/100km</span></td></tr>
+ <tr><td class="tiny">Mileage</td><td class="aright" colspan="2"><span class="smaller" id="odometer">-</span><span class="tiny">km</span></td></tr>
+ </table>
</x-boxleft>
<x-boxleft id="odo" class="cont">
- <x-boxright class="clear"><span class="small" id="nav_dist">-</span><span class="tiny"> km</span></x-boxright>
- <x-boxright class="clear"><span class="small" id="nav_eta">-</span><span class="tiny"> eta</span></x-boxright>
- <x-boxright class="clear"><span class="small" id="next_rest">-</span><span class="tiny"> ttr</span></x-boxright>
+ <table style="width:100%;">
+ <tr><td class="tiny">Distance</td><td><span class="small" id="nav_dist">-</span><span class="tiny"> km</span></td></tr>
+ <tr><td class="tiny">ETA</td><td><span class="small" id="nav_eta">-</span></td></tr>
+ <tr><td class="tiny">Next rest</td><td><span class="small" id="next_rest">-</span></td></tr>
+ <tr><td class="tiny">Deadline</td><td><span class="small" id="job_ttd">-</span></td></tr>
+ </table>
</x-boxleft>
-<x-bar class="pause" id="pausebar">Paused</x-bar>
-<x-bar class="error" id="errbar"></x-bar>
+<x-boxleft id="range" class="bar clear">
+ <x-bar class="pause" id="pausebar">Paused</x-bar>
+ <x-bar class="error" id="errbar"></x-bar>
+</x-boxleft>
</x-page>
-<script>
+<script type="text/javascript">
function dgear(x, m) {
if ( x > 0 ) return ( m ? '' : 'A' ) + x;
}
}
+// Initialize element references:
+var speed = document.getElementById("speed");
+var ccgtrl = document.getElementById("cctrl");
+var gear = document.getElementById("gear");
+var rpm = document.getElementById("rpm");
+var odometer = document.getElementById("odometer");
+var fuel = document.getElementById("fuel");
+var fuel_range = document.getElementById("fuel_range");
+var fuel_avg = document.getElementById("fuel_avg");
+//
+var nav_dist = document.getElementById("nav_dist");
+var nav_eta = document.getElementById("nav_eta");
+var nav_slimit = document.getElementById("nav_slimit");
+var next_rest = document.getElementById("next_rest");
+var nav_slimitsign = document.getElementById("nav_slimitsign");
+//
+var job_ttd = document.getElementById("job_ttd");
+//
+var errbar = document.getElementById("errbar");
+var pausebar = document.getElementById("pausebar");
function loadDoc() {
xhttp.onreadystatechange = function() {
- var speed = document.getElementById("speed");
- var ccgtrl = document.getElementById("cctrl");
- var gear = document.getElementById("gear");
- var rpm = document.getElementById("rpm");
- var odometer = document.getElementById("odometer");
- var fuel = document.getElementById("fuel");
- var fuel_range = document.getElementById("fuel_range");
- var fuel_avg = document.getElementById("fuel_avg");
- var nav_dist = document.getElementById("nav_dist");
- var nav_eta = document.getElementById("nav_eta");
- var nav_slimit = document.getElementById("nav_slimit");
- var next_rest = document.getElementById("next_rest");
- var nav_slimitsign = document.getElementById("nav_slimitsign")
-
- var errbar = document.getElementById("errbar");
- var pausebar = document.getElementById("pausebar");
-
if (this.readyState == 4 && this.status == 200) {
var tele = JSON.parse(this.responseText);
next_rest.innerHTML = m2hm(tele.next_rest);
warn( next_rest, tele.next_rest < 1 ? 2 : tele.next_rest < 97 ? 1 : 0 );
+ job_ttd.innerHTML = m2hm(tele.job_deltime - tele.game_time);
+
if ( tele.nav_slimit > 0 ) {
nav_slimit.innerHTML = Math.round(tele.nav_slimit * 3.6);
nav_slimitsign.style.visibility = "visible";
xhttp.open("GET", "/json", true);
xhttp.send();
}
+
var xhttp = new XMLHttpRequest();
loadDoc();
window.setInterval(loadDoc, 333);
-</script>
+</script>
</body>
</html>
write(fd, buf, sprintf( buf, " \"paused\": %d,\n", (int)telemetry->paused ) );
write(fd, buf, sprintf( buf, " \"timestamp\": %"PRIu64",\n", telemetry->timestamp ) );
+ write(fd, buf, sprintf( buf, " \"game_time\": %u,\n", telemetry->game_time ) );
+
write(fd, buf, sprintf( buf, " \"x\": %f,\n", telemetry->x ) );
write(fd, buf, sprintf( buf, " \"y\": %f,\n", telemetry->y ) );
write(fd, buf, sprintf( buf, " \"z\": %f,\n", telemetry->z ) );
write(fd, buf, sprintf( buf, " \"nav_slimit\": %f,\n", telemetry->nav_slimit ) );
write(fd, buf, sprintf( buf, " \"next_rest\": %d,\n", telemetry->next_rest ) );
+ write(fd, buf, sprintf( buf, " \"job_deltime\": %u,\n", telemetry->job_deltime ) );
+
// add more here
write(fd, buf, sprintf( buf, " \"dummy\": 0\n" ) );
for (const scs_named_value_t *current = info->attributes; current->name; ++current) {
- // SCS_TELEMETRY_CONFIG_ATTRIBUTE_shifter_type
- // SCS_SHIFTER_TYPE_arcade
- // SCS_SHIFTER_TYPE_automatic
- // SCS_SHIFTER_TYPE_manual
- // SCS_SHIFTER_TYPE_hshifter
- if ( 0 == strcmp( current->name, SCS_TELEMETRY_CONFIG_ATTRIBUTE_shifter_type ) )
+ if ( 0 == strcmp( current->name, SCS_TELEMETRY_CONFIG_ATTRIBUTE_shifter_type ) ) {
+ // SCS_SHIFTER_TYPE_arcade
+ // SCS_SHIFTER_TYPE_automatic
+ // SCS_SHIFTER_TYPE_manual
+ // SCS_SHIFTER_TYPE_hshifter
telemetry->shifter = !strcmp( current->value.value_string.value, SCS_SHIFTER_TYPE_manual )
|| !strcmp( current->value.value_string.value, SCS_SHIFTER_TYPE_hshifter );
+ }
+ else if ( 0 == strcmp( current->name, SCS_TELEMETRY_CONFIG_ATTRIBUTE_delivery_time ) ) {
+ telemetry->job_deltime = current->value.value_u32.value;
+ }
-
+ // log configuration
log_print(" %s", current->name);
if (current->index != SCS_U32_NIL) {
log_print("[%u]", static_cast<unsigned>(current->index));
*static_cast<int *>(context) = value->value_s32.value;
}
+SCSAPI_VOID telemetry_store_u32(const scs_string_t name, const scs_u32_t index, const scs_value_t *const value, const scs_context_t context)
+{
+ // The SCS_TELEMETRY_CHANNEL_FLAG_no_value flag was not provided during registration
+ // so this callback is only called when a valid value is available.
+
+ assert(value);
+ assert(value->type == SCS_VALUE_TYPE_u32);
+ assert(context);
+ *static_cast<int *>(context) = value->value_u32.value;
+}
+
SCSAPI_VOID telemetry_store_bool(const scs_string_t name, const scs_u32_t index, const scs_value_t *const value, const scs_context_t context)
{
// The SCS_TELEMETRY_CHANNEL_FLAG_no_value flag was not provided during registration
// (SCS_RESULT_unsupported_type). For purpose of this example we ignore the failues
// so the unsupported channels will remain at theirs default value.
+ version_params->register_for_channel(SCS_TELEMETRY_CHANNEL_game_time, SCS_U32_NIL, SCS_VALUE_TYPE_u32, SCS_TELEMETRY_CHANNEL_FLAG_none, telemetry_store_u32, &telemetry->game_time);
+
version_params->register_for_channel(SCS_TELEMETRY_TRUCK_CHANNEL_world_placement, SCS_U32_NIL, SCS_VALUE_TYPE_dplacement, SCS_TELEMETRY_CHANNEL_FLAG_no_value, telemetry_store_dplacement, telemetry);
version_params->register_for_channel(SCS_TELEMETRY_TRUCK_CHANNEL_speed, SCS_U32_NIL, SCS_VALUE_TYPE_float, SCS_TELEMETRY_CHANNEL_FLAG_none, telemetry_store_float, &telemetry->speed);