diff --git a/src/gilles/gameloop/gameloop.c b/src/gilles/gameloop/gameloop.c index cbb6773..70025e1 100644 --- a/src/gilles/gameloop/gameloop.c +++ b/src/gilles/gameloop/gameloop.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "gameloop.h" @@ -17,7 +18,7 @@ #define DEFAULT_UPDATE_RATE 100 -#define ADDRESS "tcp://mqtt.brak:1883" +#define ADDRESS "tcp://localhost:1883" #define CLIENTID "gilles" #define TOPIC "telemetry" //#define PAYLOAD "Hello, MQTT!" @@ -144,6 +145,8 @@ int looper(Simulator simulator, Parameters* p) bool mqtt = p->mqtt; bool mqtt_connected = false; + long unix_time_start; + char time_buff[11]; MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_message pubmsg = MQTTClient_message_initializer; @@ -177,84 +180,82 @@ int looper(Simulator simulator, Parameters* p) char simstatus = (simdata->simstatus > 0) ? true : false; if (simdata->simstatus > 0 && simstatus != lastsimstatus) { - update_date(); - newdatestring = removeSpacesFromStr(datestring); + //update_date(); + unix_time_start = (unsigned long) time(NULL); + sprintf(time_buff, "%lu", unix_time_start); + //sprintf(time_buff, "%lu", (unsigned long)time(NULL)); + //newdatestring = removeSpacesFromStr(datestring); } lastsimstatus = simstatus; if (mqtt_connected == true && simdata->simstatus > 0) { - char payloads[16][10]; - - //sprintf(payloads[0], "telemetry,lap=%i,session=%s gas=%04f", simdata->lap, newdatestring, simdata->gas); - //sprintf(payloads[1], "telemetry,lap=%i,session=%s brake=%04f", simdata->lap, newdatestring, simdata->brake); - //sprintf(payloads[2], "telemetry,lap=%i,session=%s steer=%04f", simdata->lap, newdatestring, simdata->brake); - //sprintf(payloads[3], "telemetry,lap=%i,session=%s gear=%04i", simdata->lap, newdatestring, simdata->gear); - //sprintf(payloads[4], "telemetry,lap=%i,session=%s speed=%04i", simdata->lap, newdatestring, simdata->velocity); - - sprintf(payloads[0], "%04f", simdata->clutch); - sprintf(payloads[1], "%04f", simdata->brake); - sprintf(payloads[2], "%04f", simdata->gas); - sprintf(payloads[3], "%04f", simdata->handbrake); - sprintf(payloads[4], "%04f", simdata->steer); - sprintf(payloads[5], "%i", simdata->rpms); - sprintf(payloads[6], "%i", simdata->gear); - sprintf(payloads[7], "%04f", simdata->velocity * 0.2777778); - sprintf(payloads[8], "%08f", simdata->trackdistancearound); - sprintf(payloads[9], "%08f", simdata->worldposx); - sprintf(payloads[10], "%08f", simdata->worldposy); - sprintf(payloads[11], "%08f", simdata->worldposz); - sprintf(payloads[12], "%i", simdata->playerlaps); - sprintf(payloads[13], "%i", simdata->currentlapinseconds); - sprintf(payloads[14], "%i", simdata->lastlapinseconds); - sprintf(payloads[15], "%i", simdata->lapisvalid); - json_object *root = json_object_new_object(); if (!root) return 1; - // {"module":"log"} json_object *child = json_object_new_object(); - json_object_object_add(root, "time", json_object_new_string("1669657644794")); //unix time milliseconds - /* these get placed into the topic path - json_object_object_add(root, "CarModel", json_object_new_string(simdata->car)); - json_object_object_add(root, "GameName", json_object_new_string("Assetto Corsa (64 bit"))); - json_object_object_add(root, "SessionId", json_object_new_string("1669233672")); - json_object_object_add(root, "SessionTypeName", json_object_new_string("Practice")); - json_object_object_add(root, "TrackCode", json_object_new_string(simdata->track)); - */ + struct timeval tv; + gettimeofday(&tv, NULL); + unsigned long long millisecondsSinceEpoch = (unsigned long long)(tv.tv_sec) * 1000 + (unsigned long long)(tv.tv_usec) / 1000; - json_object_object_add(child, "Clutch", json_object_new_string(payloads[1])); - json_object_object_add(child, "Brake", json_object_new_string(payloads[1])); - json_object_object_add(child, "Throtte", json_object_new_string(payloads[2])); - json_object_object_add(child, "HandBrake", json_object_new_string(payloads[3])); - json_object_object_add(child, "SteeringAngle", json_object_new_string(payloads[4])); - json_object_object_add(child, "Rpms", json_object_new_string(payloads[5])); - json_object_object_add(child, "Gear", json_object_new_string(payloads[6])); - json_object_object_add(child, "SpeedMs", json_object_new_string(payloads[7])); - json_object_object_add(child, "DistanceRoundTrack", json_object_new_string(payloads[8])); - json_object_object_add(child, "WorldPosition_x", json_object_new_string(payloads[9])); - json_object_object_add(child, "WorldPosition_y", json_object_new_string(payloads[10])); - json_object_object_add(child, "WorldPosition_z", json_object_new_string(payloads[11])); - json_object_object_add(child, "CurrentLap", json_object_new_string(payloads[12])); - json_object_object_add(child, "CurrentLapTime", json_object_new_string(payloads[13])); - json_object_object_add(child, "LapTimePrevious", json_object_new_string(payloads[14])); - json_object_object_add(child, "CurrentLapIsValid", json_object_new_string(payloads[15])); - json_object_object_add(child, "PreviousLapWasValid", json_object_new_string("1")); + json_object_object_add(root, "time", json_object_new_int64(millisecondsSinceEpoch)); //unix time milliseconds + + const char* topic_root = "racing/gilles/TuxRacerX"; + //const char* game_name = "Assetto Corsa (64 bit)"; + const char* game_name = "assetto_64_bit"; + const char* session_type = "Practice"; + + json_object_object_add(child, "CarModel", json_object_new_string(simdata->car)); + json_object_object_add(child, "GameName", json_object_new_string(game_name)); + json_object_object_add(child, "SessionId", json_object_new_int(unix_time_start)); + json_object_object_add(child, "SessionTypeName", json_object_new_string("Practice")); + json_object_object_add(child, "TrackCode", json_object_new_string(simdata->track)); + + json_object_object_add(child, "Clutch", json_object_new_double(simdata->clutch)); + json_object_object_add(child, "Brake", json_object_new_double(simdata->brake)); + json_object_object_add(child, "Throtte", json_object_new_double(simdata->gas)); + json_object_object_add(child, "HandBrake", json_object_new_double(simdata->handbrake)); + json_object_object_add(child, "SteeringAngle", json_object_new_double(simdata->steer)); + json_object_object_add(child, "Rpms", json_object_new_int(simdata->rpms)); + json_object_object_add(child, "Gear", json_object_new_int(simdata->gear)); + json_object_object_add(child, "SpeedMs", json_object_new_double(simdata->velocity * 0.2777778)); + json_object_object_add(child, "DistanceRoundTrack", json_object_new_double(simdata->trackdistancearound)); + json_object_object_add(child, "WorldPosition_x", json_object_new_double(simdata->worldposx)); + json_object_object_add(child, "WorldPosition_y", json_object_new_double(simdata->worldposy)); + json_object_object_add(child, "WorldPosition_z", json_object_new_double(simdata->worldposz)); + json_object_object_add(child, "CurrentLap", json_object_new_int(simdata->playerlaps)); + json_object_object_add(child, "CurrentLapTime", json_object_new_int(simdata->currentlapinseconds)); + json_object_object_add(child, "LapTimePrevious", json_object_new_int(simdata->lastlapinseconds)); + json_object_object_add(child, "CurrentLapIsValid", json_object_new_int(simdata->lapisvalid)); + json_object_object_add(child, "PreviousLapWasValid", json_object_new_int(1)); json_object_object_add(root, "telemetry", child); slogi(json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY)); - for (int k =0; k < 5; k++) - { - pubmsg.payload = payloads[k]; - pubmsg.payloadlen = strlen(payloads[k]); - pubmsg.qos = QOS; - pubmsg.retained = 0; - MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); - } + // TODO: generate this topic string only once + char* topic = ( char* ) malloc(1 + strlen(topic_root) + strlen("/") + strlen(game_name) + strlen("/") + strlen(session_type) + + strlen("/") + strlen(simdata->car) + strlen("/") + strlen(simdata->track) + strlen("/") + 11); + strcpy(topic, topic_root); + strcat(topic, "/"); + strcat(topic, time_buff); + strcat(topic, "/"); + strcat(topic, game_name); + strcat(topic, "/"); + strcat(topic, simdata->track); + strcat(topic, "/"); + strcat(topic, simdata->car); + strcat(topic, "/"); + strcat(topic, session_type); + + pubmsg.payload = json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY); + pubmsg.payloadlen = strlen(json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY)); + pubmsg.qos= QOS; + pubmsg.retained = 0; + + MQTTClient_publishMessage(client, topic, &pubmsg, &token); } wclear(win1);