From a65dcb007e1274ba5c1786f864e72dfb1da81212 Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Wed, 31 Jul 2019 19:23:14 +0200 Subject: [PATCH] * Moved JSON formatting to own module, shared by telehttpd and telelogger. * Switched telelogger output to unprocessed JSON. --- Makefile | 4 +-- tele2json.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ tele2json.h | 18 +++++++++++++ telehttpd.c | 62 ++----------------------------------------- telelogger.c | 75 +++------------------------------------------------- 5 files changed, 95 insertions(+), 133 deletions(-) create mode 100644 tele2json.c create mode 100644 tele2json.h diff --git a/Makefile b/Makefile index 2756cf5..1b868ca 100644 --- 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 index 0000000..4a2f119 --- /dev/null +++ b/tele2json.c @@ -0,0 +1,69 @@ +#include + +#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 index 0000000..b36cc70 --- /dev/null +++ b/tele2json.h @@ -0,0 +1,18 @@ +#ifndef TELE2JSON_H_ +#define TELE2JSON_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "telemetry.h" + +extern size_t tele2json( char *buf, size_t size, const struct telemetry_state_t *tele ); + +#ifdef __cplusplus +} +#endif + +#endif /* TELE2JSON_H_ */ diff --git a/telehttpd.c b/telehttpd.c index 076b818..ff684b3 100644 --- a/telehttpd.c +++ b/telehttpd.c @@ -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; diff --git a/telelogger.c b/telelogger.c index 5d29228..c97f2ae 100644 --- a/telelogger.c +++ b/telelogger.c @@ -10,85 +10,18 @@ #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 ) -- 2.30.2