Change mqtt output to b4mad format

This commit is contained in:
Paul Dino Jones 2023-04-01 12:47:33 -04:00
parent ae7e54c253
commit 0ac2ce935c
1 changed files with 63 additions and 62 deletions

View File

@ -4,6 +4,7 @@
#include <ncurses.h> #include <ncurses.h>
#include <signal.h> #include <signal.h>
#include <time.h> #include <time.h>
#include <sys/time.h>
#include <MQTTClient.h> #include <MQTTClient.h>
#include "gameloop.h" #include "gameloop.h"
@ -17,7 +18,7 @@
#define DEFAULT_UPDATE_RATE 100 #define DEFAULT_UPDATE_RATE 100
#define ADDRESS "tcp://mqtt.brak:1883" #define ADDRESS "tcp://localhost:1883"
#define CLIENTID "gilles" #define CLIENTID "gilles"
#define TOPIC "telemetry" #define TOPIC "telemetry"
//#define PAYLOAD "Hello, MQTT!" //#define PAYLOAD "Hello, MQTT!"
@ -144,6 +145,8 @@ int looper(Simulator simulator, Parameters* p)
bool mqtt = p->mqtt; bool mqtt = p->mqtt;
bool mqtt_connected = false; bool mqtt_connected = false;
long unix_time_start;
char time_buff[11];
MQTTClient client; MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer; MQTTClient_message pubmsg = MQTTClient_message_initializer;
@ -177,84 +180,82 @@ int looper(Simulator simulator, Parameters* p)
char simstatus = (simdata->simstatus > 0) ? true : false; char simstatus = (simdata->simstatus > 0) ? true : false;
if (simdata->simstatus > 0 && simstatus != lastsimstatus) if (simdata->simstatus > 0 && simstatus != lastsimstatus)
{ {
update_date(); //update_date();
newdatestring = removeSpacesFromStr(datestring); 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; lastsimstatus = simstatus;
if (mqtt_connected == true && simdata->simstatus > 0) 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(); json_object *root = json_object_new_object();
if (!root) if (!root)
return 1; return 1;
// {"module":"log"}
json_object *child = json_object_new_object(); 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 struct timeval tv;
json_object_object_add(root, "CarModel", json_object_new_string(simdata->car)); gettimeofday(&tv, NULL);
json_object_object_add(root, "GameName", json_object_new_string("Assetto Corsa (64 bit"))); unsigned long long millisecondsSinceEpoch = (unsigned long long)(tv.tv_sec) * 1000 + (unsigned long long)(tv.tv_usec) / 1000;
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));
*/
json_object_object_add(child, "Clutch", json_object_new_string(payloads[1])); json_object_object_add(root, "time", json_object_new_int64(millisecondsSinceEpoch)); //unix time milliseconds
json_object_object_add(child, "Brake", json_object_new_string(payloads[1]));
json_object_object_add(child, "Throtte", json_object_new_string(payloads[2])); const char* topic_root = "racing/gilles/TuxRacerX";
json_object_object_add(child, "HandBrake", json_object_new_string(payloads[3])); //const char* game_name = "Assetto Corsa (64 bit)";
json_object_object_add(child, "SteeringAngle", json_object_new_string(payloads[4])); const char* game_name = "assetto_64_bit";
json_object_object_add(child, "Rpms", json_object_new_string(payloads[5])); const char* session_type = "Practice";
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, "CarModel", json_object_new_string(simdata->car));
json_object_object_add(child, "DistanceRoundTrack", json_object_new_string(payloads[8])); json_object_object_add(child, "GameName", json_object_new_string(game_name));
json_object_object_add(child, "WorldPosition_x", json_object_new_string(payloads[9])); json_object_object_add(child, "SessionId", json_object_new_int(unix_time_start));
json_object_object_add(child, "WorldPosition_y", json_object_new_string(payloads[10])); json_object_object_add(child, "SessionTypeName", json_object_new_string("Practice"));
json_object_object_add(child, "WorldPosition_z", json_object_new_string(payloads[11])); json_object_object_add(child, "TrackCode", json_object_new_string(simdata->track));
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, "Clutch", json_object_new_double(simdata->clutch));
json_object_object_add(child, "LapTimePrevious", json_object_new_string(payloads[14])); json_object_object_add(child, "Brake", json_object_new_double(simdata->brake));
json_object_object_add(child, "CurrentLapIsValid", json_object_new_string(payloads[15])); json_object_object_add(child, "Throtte", json_object_new_double(simdata->gas));
json_object_object_add(child, "PreviousLapWasValid", json_object_new_string("1")); 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); json_object_object_add(root, "telemetry", child);
slogi(json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY)); slogi(json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY));
for (int k =0; k < 5; k++) // TODO: generate this topic string only once
{ char* topic = ( char* ) malloc(1 + strlen(topic_root) + strlen("/") + strlen(game_name) + strlen("/") + strlen(session_type)
pubmsg.payload = payloads[k]; + strlen("/") + strlen(simdata->car) + strlen("/") + strlen(simdata->track) + strlen("/") + 11);
pubmsg.payloadlen = strlen(payloads[k]); 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.qos= QOS;
pubmsg.retained = 0; pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
} MQTTClient_publishMessage(client, topic, &pubmsg, &token);
} }
wclear(win1); wclear(win1);