* Switched telelogger output to unprocessed JSON.
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
--- /dev/null
+#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
+}
+
+
--- /dev/null
+#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_ */
#include "log.h"
#include "shmget.h"
#include "telemetry.h"
+#include "tele2json.h"
static struct telemetry_state_t *telemetry;
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];
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;
#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 )