* Moved JSON formatting to own module, shared by telehttpd and telelogger.
authorUrban Wallasch <urban.wallasch@freenet.de>
Wed, 31 Jul 2019 17:23:14 +0000 (19:23 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Wed, 31 Jul 2019 17:23:14 +0000 (19:23 +0200)
* Switched telelogger output to unprocessed JSON.

Makefile
tele2json.c [new file with mode: 0644]
tele2json.h [new file with mode: 0644]
telehttpd.c
telelogger.c

index 2756cf511a2164300f21dc558a8f3d94fcb6f0a4..1b868caabd9226eb2f2e37ddf2f37ecbc284f358 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -26,8 +26,8 @@ endif
 
 COMMON_HDR := telemetry.h
 PLUGIN_SRC := teleshmem.cpp shmget.c
-HTTPD_OBJ  := telehttpd.o shmget.o net.o fserv.o
-LOGGER_OBJ := telelogger.o shmget.o
+HTTPD_OBJ  := telehttpd.o shmget.o net.o fserv.o tele2json.o
+LOGGER_OBJ := telelogger.o shmget.o tele2json.o
 
 .PHONY: all clean
 
diff --git a/tele2json.c b/tele2json.c
new file mode 100644 (file)
index 0000000..4a2f119
--- /dev/null
@@ -0,0 +1,69 @@
+#include <inttypes.h>
+
+#include "tele2json.h"
+
+size_t tele2json( char *buf, size_t size, const struct telemetry_state_t *tele ) {
+    size_t n = 0;
+
+#define CHKSIZE do{ if ( n >= size ) return 0; }while(0)
+    CHKSIZE;
+    n += snprintf( buf+n, size-n, "{\n" ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"game_id\": \"%s\",\n", tele->game_id ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"game_major_ver\": %u,\n", tele->game_major_ver ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"game_minor_ver\": %u,\n", tele->game_minor_ver ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"game_ver_warn\": %d,\n", (int)tele->game_ver_warn ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"paused\": %d,\n", (int)tele->paused ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"timestamp\": %"PRIu64",\n", tele->timestamp ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"game_time\": %u,\n", tele->game_time ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"x\": %f,\n", tele->x ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"y\": %f,\n", tele->y ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"z\": %f,\n", tele->z ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"heading\": %f,\n", tele->heading ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"pitch\": %f,\n", tele->pitch ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"roll\": %f,\n", tele->roll ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"speed\": %f,\n", tele->speed ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"cctrl\": %f,\n", tele->cctrl ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"rpm\": %f,\n", tele->rpm ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"gear\": %d,\n", tele->gear ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"gear_disp\": %d,\n", tele->gear_disp ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"gear_fwdcnt\": %u,\n", tele->truck_fwd_gear_cnt ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"clutch_eff\": %f,\n", tele->clutch_eff ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"shifter\": %d,\n", tele->shifter ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"fuel\": %f,\n", tele->fuel ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"fuel_warn\": %d,\n", (int)tele->fuel_warn ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"fuel_avg\": %f,\n", tele->fuel_avg ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"fuel_range\": %f,\n", tele->fuel_range ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"odometer\": %f,\n", tele->odometer ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"nav_dist\": %f,\n", tele->nav_dist ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"nav_eta\": %f,\n", tele->nav_eta ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"nav_slimit\": %f,\n", tele->nav_slimit ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"next_rest\": %d,\n", tele->next_rest ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"truck_brand\": \"%s\",\n", tele->truck_brand ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"truck_name\": \"%s\",\n", tele->truck_name ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"trailer_cnt\": %u,\n", tele->trailer_cnt ); CHKSIZE;
+
+    n += snprintf( buf+n, size-n, "  \"job_isvalid\": %d,\n", (int)tele->job_isvalid ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"job_deltime\": %u,\n", tele->job_deltime ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"job_income\": %"PRIu64",\n", tele->job_income ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"job_cargo_mass\": %f,\n", tele->job_cargo_mass ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"job_cargo\": \"%s\",\n", tele->job_cargo ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"job_source_city\": \"%s\",\n", tele->job_source_city ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "  \"job_destination_city\": \"%s\",\n", tele->job_destination_city ); CHKSIZE;
+
+    // add more here
+
+    n += snprintf( buf+n, size-n, "  \"dummy\": 0\n" ); CHKSIZE;
+    n += snprintf( buf+n, size-n, "}\n" ); CHKSIZE;
+    return n;
+#undef CHKSIZE
+}
+
+
diff --git a/tele2json.h b/tele2json.h
new file mode 100644 (file)
index 0000000..b36cc70
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef TELE2JSON_H_
+#define TELE2JSON_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+
+#include "telemetry.h"
+
+extern size_t tele2json( char *buf, size_t size, const struct telemetry_state_t *tele );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TELE2JSON_H_ */
index 076b818cd4810046d5434e70103d844dcb51d792..ff684b37f639e0ca51980b50e97bfa9739baddc2 100644 (file)
@@ -19,6 +19,7 @@
 #include "log.h"
 #include "shmget.h"
 #include "telemetry.h"
+#include "tele2json.h"
 
 static struct telemetry_state_t *telemetry;
 
@@ -54,65 +55,6 @@ enum respond_code {
     r_none
 };
 
-static void write_telejson( int fd ) {
-    char buf[512];
-    write(fd, buf, sprintf( buf, "{\n" ) );
-
-    write(fd, buf, sprintf( buf, "  \"game_id\": \"%s\",\n", telemetry->game_id ) );
-    write(fd, buf, sprintf( buf, "  \"game_major_ver\": %u,\n", telemetry->game_major_ver ) );
-    write(fd, buf, sprintf( buf, "  \"game_minor_ver\": %u,\n", telemetry->game_minor_ver ) );
-    write(fd, buf, sprintf( buf, "  \"game_ver_warn\": %d,\n", (int)telemetry->game_ver_warn ) );
-
-    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, "  \"heading\": %f,\n", telemetry->heading ) );
-    write(fd, buf, sprintf( buf, "  \"pitch\": %f,\n", telemetry->pitch ) );
-    write(fd, buf, sprintf( buf, "  \"roll\": %f,\n", telemetry->roll ) );
-
-    write(fd, buf, sprintf( buf, "  \"speed\": %f,\n", telemetry->speed ) );
-    write(fd, buf, sprintf( buf, "  \"cctrl\": %f,\n", telemetry->cctrl ) );
-    write(fd, buf, sprintf( buf, "  \"rpm\": %f,\n", telemetry->rpm ) );
-    write(fd, buf, sprintf( buf, "  \"gear\": %d,\n", telemetry->gear ) );
-    write(fd, buf, sprintf( buf, "  \"gear_disp\": %d,\n", telemetry->gear_disp ) );
-    write(fd, buf, sprintf( buf, "  \"gear_fwdcnt\": %u,\n", telemetry->truck_fwd_gear_cnt ) );
-    write(fd, buf, sprintf( buf, "  \"clutch_eff\": %f,\n", telemetry->clutch_eff ) );
-    write(fd, buf, sprintf( buf, "  \"shifter\": %d,\n", telemetry->shifter ) );
-
-    write(fd, buf, sprintf( buf, "  \"fuel\": %f,\n", telemetry->fuel ) );
-    write(fd, buf, sprintf( buf, "  \"fuel_warn\": %d,\n", (int)telemetry->fuel_warn ) );
-    write(fd, buf, sprintf( buf, "  \"fuel_avg\": %f,\n", telemetry->fuel_avg ) );
-    write(fd, buf, sprintf( buf, "  \"fuel_range\": %f,\n", telemetry->fuel_range ) );
-
-    write(fd, buf, sprintf( buf, "  \"odometer\": %f,\n", telemetry->odometer ) );
-    write(fd, buf, sprintf( buf, "  \"nav_dist\": %f,\n", telemetry->nav_dist ) );
-    write(fd, buf, sprintf( buf, "  \"nav_eta\": %f,\n", telemetry->nav_eta ) );
-    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, "  \"truck_brand\": \"%s\",\n", telemetry->truck_brand ) );
-    write(fd, buf, sprintf( buf, "  \"truck_name\": \"%s\",\n", telemetry->truck_name ) );
-
-    write(fd, buf, sprintf( buf, "  \"trailer_cnt\": %u,\n", telemetry->trailer_cnt ) );
-
-    write(fd, buf, sprintf( buf, "  \"job_isvalid\": %d,\n", (int)telemetry->job_isvalid ) );
-    write(fd, buf, sprintf( buf, "  \"job_deltime\": %u,\n", telemetry->job_deltime ) );
-    write(fd, buf, sprintf( buf, "  \"job_income\": %"PRIu64",\n", telemetry->job_income ) );
-    write(fd, buf, sprintf( buf, "  \"job_cargo_mass\": %f,\n", telemetry->job_cargo_mass ) );
-    write(fd, buf, sprintf( buf, "  \"job_cargo\": \"%s\",\n", telemetry->job_cargo ) );
-    write(fd, buf, sprintf( buf, "  \"job_source_city\": \"%s\",\n", telemetry->job_source_city ) );
-    write(fd, buf, sprintf( buf, "  \"job_destination_city\": \"%s\",\n", telemetry->job_destination_city ) );
-
-    // add more here
-
-    write(fd, buf, sprintf( buf, "  \"dummy\": 0\n" ) );
-    write(fd, buf, sprintf( buf, "}\n" ) );
-}
-
 static void respond(int fd, const char *req, int code) {
     char buf[4096];
     char origin[256];
@@ -144,7 +86,7 @@ static void respond(int fd, const char *req, int code) {
             write(fd, buf, sprintf(buf, "Access-Control-Allow-Origin: %s\r\n", origin));
             write(fd, buf, sprintf(buf, "Content-type: text/json\r\n"));
             write(fd, buf, sprintf(buf, "Connection: close\r\n\r\n"));
-            write_telejson(fd);
+            write( fd, buf, tele2json(buf, sizeof buf, telemetry) );
         }
         else {
             struct file_info_t fi;
index 5d292280cee96ac38d2e2ff461573ec04a5d7ab8..c97f2ae3f876e5507344d9b6da372fe66e498687 100644 (file)
 
 #include "shmget.h"
 #include "telemetry.h"
+#include "tele2json.h"
 
 static struct telemetry_state_t *telemetry;
 
-
-static const char *s2hms( int s ) {
-    static char buf[50];
-    sprintf( buf, "%02d:%02d:%02d", s / 3600, s % 3600 / 60, s % 60 );
-    return buf;
-}
-
-static const char *m2hm( int m ) {
-    static char buf[50];
-    sprintf( buf, "%02d:%02d", m / 60, m % 60 );
-    return buf;
-}
-
 static int log_console(void) {
+    char buf[4096];
     bool last_paused = telemetry->paused;
     uint64_t last_timestamp = telemetry->timestamp;
 
-    printf( "game id: %s version %u.%u (%s)\n" , telemetry->game_id,
-            telemetry->game_major_ver, telemetry->game_minor_ver,
-            telemetry->game_ver_warn ? "WARNING!" : "OK" );
-
     while ( 1 ) {
-        printf("paused: %s\n", telemetry->paused ? "yes" : "no" );
-
-        printf("timestamp: %"PRIu64"\n", telemetry->timestamp);
-    //    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",
-                    telemetry->x, telemetry->y, telemetry->z );
-            printf( "orientation: h:%.1f p:%.1f r:%.1f\n",
-                    telemetry->heading * 360.0, telemetry->pitch * 360.0, telemetry->roll * 360.0  );
-        }
-        else {
-            printf( "position: n.a.\n" );
-            printf( "orientation: n.a.\n" );
-        }
-
-        printf( "speed: %.1f km/h (%.1f m/s)\n", telemetry->speed * 3.6, telemetry->speed );
-        printf( "cctrl: %.1f km/h (%.1f m/s)\n", telemetry->cctrl * 3.6, telemetry->cctrl );
-        printf( "rpm: %.0f /min\n", telemetry->rpm );
-        printf( "gear: %d\n", telemetry->gear );
-        printf( "gear d: %d\n", telemetry->gear_disp );
-        printf( "fwd gear cnt: %u\n", telemetry->truck_fwd_gear_cnt );
-        printf( "clutch eff: %.1f\n", telemetry->clutch_eff );
-        printf( "shifter: %s\n", telemetry->shifter ? "manual" : "automatic" );
-
-        printf( "fuel: %.1f l\n", telemetry->fuel );
-        printf( "fuel warn: %s\n", telemetry->fuel_warn ? "yes" : "no" );
-        printf( "fuel average: %.1f l/100km\n", telemetry->fuel_avg * 100 );
-        printf( "fuel range: %.1f km\n", telemetry->fuel_range );
-
-        printf( "odometer: %.1f km\n", telemetry->odometer );
-        printf( "nav dist: %.1f km\n", telemetry->nav_dist / 1000 );
-        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( "truck brand: %s\n", telemetry->truck_brand );
-        printf( "truck model: %s\n", telemetry->truck_name );
-
-        printf( "trailer count: %u\n", telemetry->trailer_cnt );
-
-        if ( telemetry->job_isvalid ) {
-            printf( "job delivery time: %s\n", m2hm( telemetry->job_deltime - telemetry->game_time ) );
-            printf( "job income: %"PRIu64"\n", telemetry->job_income / 10 );
-            printf( "job cargo mass: %.1f t\n", telemetry->job_cargo_mass / 1000 );
-            printf( "job cargo: %s\n", telemetry->job_cargo );
-            printf( "job source city: %s\n", telemetry->job_source_city );
-            printf( "job destination city: %s\n", telemetry->job_destination_city );
-        }
-
-        puts("");
+        if ( tele2json( buf, sizeof buf, telemetry ) > 0 )
+            puts( buf );
 
         if ( last_paused ) {
             while ( telemetry->paused )