* Added game_time to telemetry.
authorUrban Wallasch <urban.wallasch@freenet.de>
Sat, 27 Jul 2019 19:35:22 +0000 (21:35 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Sat, 27 Jul 2019 19:35:22 +0000 (21:35 +0200)
* Added delivery_time to telemetry and display.
* Reworked display formatting, CSS and JavaScript.

dash.html
telehttpd.c
telelogger.c
telemetry.h
teleshmem.cpp

index 354d022cc25ce7548d1964fe975797df409a9289..0af7d3b7d9d71c8ca235382aac9d09d1a897347b 100644 (file)
--- a/dash.html
+++ b/dash.html
@@ -12,40 +12,48 @@ html, body {
   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; }
@@ -53,11 +61,10 @@ x-boxright { float:right; }
 .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;
@@ -79,37 +86,45 @@ x-bar {
 <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">&nbsp;</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>&nbsp;&nbsp;</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;
@@ -152,26 +167,29 @@ function warn(elem, lvl) {
   }
 }
 
+// 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);
 
@@ -208,6 +226,8 @@ function loadDoc() {
       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";
@@ -230,10 +250,11 @@ function loadDoc() {
   xhttp.open("GET", "/json", true);
   xhttp.send();
 }
+
 var xhttp = new XMLHttpRequest();
 loadDoc();
 window.setInterval(loadDoc, 333);
-</script>
 
+</script>
 </body>
 </html>
index b8229d0a18b9295f30d6b071737584e4630923e5..69f9454d8d407a2ff8d9eae750efa4c18464056f 100644 (file)
@@ -65,6 +65,8 @@ static void write_telejson( int fd ) {
 
     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 ) );
@@ -91,6 +93,8 @@ static void write_telejson( int fd ) {
     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" ) );
index a4c744fdde692c67dd4b88a5a2fe460d2050cc0e..b74457248bad5e20df2e1421d78286ec268e3269 100644 (file)
@@ -41,6 +41,7 @@ static int log_console(void) {
     //    uint64_t raw_rendering_timestamp;
     //    uint64_t raw_simulation_timestamp;
     //    uint64_t raw_paused_simulation_timestamp;
+        printf( "game_time: %u\n", telemetry->game_time );
 
         if ( telemetry->placement_available ) {
             printf( "position: %.3f, %.3f, %.3f\n",
@@ -71,6 +72,7 @@ static int log_console(void) {
         printf( "nav eta: %s\n", s2hms( telemetry->nav_eta ) );
         printf( "nav limit: %.1f km/h\n", telemetry->nav_slimit * 3.6 );
         printf( "next rest: %s\n", m2hm( telemetry->next_rest ) );
+        printf( "time till delivery: %s\n", m2hm( telemetry->job_deltime - telemetry->game_time ) );
 
         puts("");
 
index b1dba1d82b96cf95733e260bc2f641d4d20a5fd4..ea6a12abc84b7b7208ef90067869d169b45d7ab4 100644 (file)
@@ -15,6 +15,8 @@ struct telemetry_state_t {
     uint64_t raw_simulation_timestamp;
     uint64_t raw_paused_simulation_timestamp;
 
+    unsigned game_time; // minutes since beginning of first in-game day
+
     // truck placement and orientation
     bool    placement_available;
     double  x;
@@ -42,6 +44,8 @@ struct telemetry_state_t {
     float   nav_eta;    // navigation time in s
     float   nav_slimit; // navigation speed limit in m/s
     int     next_rest;  // time to next rest stop in minutes
+
+    unsigned job_deltime; // job deadline in minutes (see game_time)
 };
 
 #endif /* TELEMETRY_H_ */
index a0b19d2d5af84a5c869ddfbcfa04fccc6d062827..df1c0ff430f98a2d84ef60a9ff48d18787bd70d2 100644 (file)
@@ -165,16 +165,19 @@ SCSAPI_VOID telemetry_configuration(const scs_event_t event, const void *const e
 
     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));
@@ -330,6 +333,17 @@ SCSAPI_VOID telemetry_store_s32(const scs_string_t name, const scs_u32_t 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
@@ -442,6 +456,8 @@ SCSAPI_RESULT scs_telemetry_init(const scs_u32_t version, const scs_telemetry_in
     // (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);