3 Commits
6 changed files with 182 additions and 121 deletions
+1 -1
View File
@@ -24,7 +24,7 @@ add_subdirectory(src/gilles/helper)
add_subdirectory(src/gilles/slog) add_subdirectory(src/gilles/slog)
add_executable(gilles src/gilles/gilles.c) add_executable(gilles src/gilles/gilles.c)
target_link_libraries(gilles m ncursesw argtable2 config gameloop helper slog simulatorapi eclipse-paho-mqtt-c::paho-mqtt3c json-c) target_link_libraries(gilles m ncursesw argtable2 config gameloop helper slog simulatorapi eclipse-paho-mqtt-c::paho-mqtt3c pthread json-c)
# used for enabling additional compiler options if supported # used for enabling additional compiler options if supported
include(CheckCXXCompilerFlag) include(CheckCXXCompilerFlag)
+152 -117
View File
@@ -125,138 +125,28 @@ void update_date()
sprintf(datestring, "%.24s", asctime (timeinfo)); sprintf(datestring, "%.24s", asctime (timeinfo));
} }
int looper(Simulator simulator, Parameters* p) void* looper(void* thargs)
{ {
Parameters* p = (Parameters*) thargs;
SimData* simdata = malloc(sizeof(SimData)); SimData* simdata = malloc(sizeof(SimData));
SimMap* simmap = malloc(sizeof(SimMap)); SimMap* simmap = malloc(sizeof(SimMap));
int error = siminit(simdata, simmap, simulator); int error = siminit(simdata, simmap, 1);
if (error != GILLES_ERROR_NONE) if (error != GILLES_ERROR_NONE)
{ {
slogf("Fatal error getting simulator data"); slogf("Fatal error getting simulator data");
return error; //return error;
} }
curses_init(); curses_init();
timeout(DEFAULT_UPDATE_RATE); timeout(DEFAULT_UPDATE_RATE);
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;
MQTTClient_deliveryToken token;
int rc;
// Create a new MQTT client
MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
// Connect to the MQTT server
if (mqtt == true)
{
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
MQTTClient_disconnect(client, 10000);
sloge("Failed to connect, return code %d", rc);
//exit(-1);
}
mqtt_connected = true;
}
int go = true; int go = true;
char lastsimstatus = false; char lastsimstatus = false;
while (go == true) while (go == true)
{ {
simdatamap(simdata, simmap, simulator); simdatamap(simdata, simmap, 1);
char* newdatestring;
char simstatus = (simdata->simstatus > 0) ? true : false;
if (simdata->simstatus > 0 && simstatus != lastsimstatus)
{
//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)
{
json_object *root = json_object_new_object();
if (!root)
return 1;
json_object *child = json_object_new_object();
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(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));
// 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); wclear(win1);
wclear(win2); wclear(win2);
@@ -663,6 +553,151 @@ int looper(Simulator simulator, Parameters* p)
delwin(win1); delwin(win1);
endwin(); endwin();
free(simdata);
free(simmap);
//return 0;
}
void* b4madmqtt(void* thargs)
{
Parameters* p = (Parameters*) thargs;
SimData* simdata = malloc(sizeof(SimData));
SimMap* simmap = malloc(sizeof(SimMap));
long unix_time_start;
char time_buff[11];
int error = siminit(simdata, simmap, 1);
if (error != GILLES_ERROR_NONE)
{
slogf("Fatal error getting simulator data");
//return error;
}
bool mqtt = p->mqtt;
bool mqtt_connected = false;
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
// Create a new MQTT client
MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
// Connect to the MQTT server
if (mqtt == true)
{
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
MQTTClient_disconnect(client, 10000);
sloge("Failed to connect, return code %d", rc);
return NULL;
//exit(-1);
}
mqtt_connected = true;
}
int go = false;
if (mqtt_connected == true)
{
go = true;
}
char lastsimstatus = false;
while (go == true && p->program_state == 1)
{
char simstatus = (simdata->simstatus > 0) ? true : false;
if (simdata->simstatus > 0 && simstatus != lastsimstatus)
{
//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;
simdatamap(simdata, simmap, 1);
if (mqtt_connected == true && simdata->simstatus > 0)
{
json_object *root = json_object_new_object();
//if (!root)
// return;
json_object *child = json_object_new_object();
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(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));
// 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);
char* payload1;
sprintf(payload1, json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY));
pubmsg.payload = payload1;
//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.payloadlen = strlen(payload1);
pubmsg.qos= QOS;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, topic, &pubmsg, &token);
}
}
if (mqtt_connected == true) if (mqtt_connected == true)
{ {
MQTTClient_disconnect(client, 10000); MQTTClient_disconnect(client, 10000);
@@ -671,6 +706,6 @@ int looper(Simulator simulator, Parameters* p)
free(simdata); free(simdata);
free(simmap); free(simmap);
return NULL;
return 0; //return 0;
} }
+2 -1
View File
@@ -1,4 +1,5 @@
#include "../helper/parameters.h" #include "../helper/parameters.h"
#include "../helper/confighelper.h" #include "../helper/confighelper.h"
int looper (Simulator simulator, Parameters* p); void* looper(void* params);
void* b4madmqtt(void* params);
+25 -1
View File
@@ -4,6 +4,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <libconfig.h> #include <libconfig.h>
#include <pthread.h>
#include "gameloop/gameloop.h" #include "gameloop/gameloop.h"
#include "helper/parameters.h" #include "helper/parameters.h"
@@ -46,6 +47,7 @@ int main(int argc, char** argv)
goto cleanup_final; goto cleanup_final;
} }
gs->program_action = p->program_action; gs->program_action = p->program_action;
p->program_state = 1;
char* home_dir_str = gethome(); char* home_dir_str = gethome();
create_user_dir("/.config/"); create_user_dir("/.config/");
@@ -80,7 +82,29 @@ int main(int argc, char** argv)
slog_disable(SLOG_DEBUG); slog_disable(SLOG_DEBUG);
} }
looper(1, p); pthread_t ui_thread;
pthread_t mqtt_thread;
if (pthread_create(&ui_thread, NULL, &looper, p) != 0)
{
printf("Uh-oh!\n");
return -1;
}
if (p->mqtt == true)
{
if (pthread_create(&mqtt_thread, NULL, &b4madmqtt, p) != 0)
{
printf("Uh-oh!\n");
return -1;
}
}
pthread_join(ui_thread, NULL);
p->program_state = -1;
if (p->mqtt == true)
{
pthread_join(mqtt_thread, NULL);
}
free(config_file_str); free(config_file_str);
free(cache_dir_str); free(cache_dir_str);
+1
View File
@@ -6,6 +6,7 @@
typedef struct typedef struct
{ {
int program_action; int program_action;
int program_state;
const char* sim_string; const char* sim_string;
bool mqtt; bool mqtt;
int verbosity_count; int verbosity_count;