diff --git a/CMakeLists.txt b/CMakeLists.txt index d3ca152..c49d785 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ add_subdirectory(src/gilles/helper) add_subdirectory(src/gilles/slog) 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) +target_link_libraries(gilles m ncursesw argtable2 config gameloop helper slog simulatorapi eclipse-paho-mqtt-c::paho-mqtt3c pthread) # used for enabling additional compiler options if supported include(CheckCXXCompilerFlag) diff --git a/src/gilles/gameloop/gameloop.c b/src/gilles/gameloop/gameloop.c index 26882b5..ece1b7d 100644 --- a/src/gilles/gameloop/gameloop.c +++ b/src/gilles/gameloop/gameloop.c @@ -120,82 +120,28 @@ void update_date() sprintf(datestring, "%.24s", asctime (timeinfo)); } -int looper(Simulator simulator, Parameters* p) +void* looper(void* thargs) { - + Parameters* p = (Parameters*) thargs; SimData* simdata = malloc(sizeof(SimData)); SimMap* simmap = malloc(sizeof(SimMap)); - int error = siminit(simdata, simmap, simulator); + int error = siminit(simdata, simmap, 1); if (error != GILLES_ERROR_NONE) { slogf("Fatal error getting simulator data"); - return error; + //return error; } curses_init(); timeout(DEFAULT_UPDATE_RATE); - 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); - //exit(-1); - } - mqtt_connected = true; - } - int go = true; char lastsimstatus = false; while (go == true) { - simdatamap(simdata, simmap, simulator); - - char* newdatestring; - char simstatus = (simdata->simstatus > 0) ? true : false; - if (simdata->simstatus > 0 && simstatus != lastsimstatus) - { - update_date(); - newdatestring = removeSpacesFromStr(datestring); - } - lastsimstatus = simstatus; - - if (mqtt_connected == true && simdata->simstatus > 0) - { - char payloads[5][60]; - 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); - - 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); - } - } + simdatamap(simdata, simmap, 1); wclear(win1); wclear(win2); @@ -602,6 +548,90 @@ int looper(Simulator simulator, Parameters* p) delwin(win1); 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)); + + 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); + //exit(-1); + } + mqtt_connected = true; + } + + int go = false; + if (mqtt_connected == true) + { + go = true; + } + char lastsimstatus = false; + while (go == true && p->program_state == 1) + { + simdatamap(simdata, simmap, 1); + + char* newdatestring; + char simstatus = (simdata->simstatus > 0) ? true : false; + if (simdata->simstatus > 0 && simstatus != lastsimstatus) + { + update_date(); + newdatestring = removeSpacesFromStr(datestring); + } + lastsimstatus = simstatus; + + if (mqtt_connected == true && simdata->simstatus > 0) + { + char payloads[5][60]; + 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); + + 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); + } + } + + } if (mqtt_connected == true) { MQTTClient_disconnect(client, 10000); @@ -611,5 +641,5 @@ int looper(Simulator simulator, Parameters* p) free(simdata); free(simmap); - return 0; + //return 0; } diff --git a/src/gilles/gameloop/gameloop.h b/src/gilles/gameloop/gameloop.h index 2a631a2..4910300 100644 --- a/src/gilles/gameloop/gameloop.h +++ b/src/gilles/gameloop/gameloop.h @@ -1,4 +1,5 @@ #include "../helper/parameters.h" #include "../helper/confighelper.h" -int looper (Simulator simulator, Parameters* p); +void* looper(void* params); +void* b4madmqtt(void* params); diff --git a/src/gilles/gilles.c b/src/gilles/gilles.c index 0f0ad22..9aff526 100644 --- a/src/gilles/gilles.c +++ b/src/gilles/gilles.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "gameloop/gameloop.h" #include "helper/parameters.h" @@ -46,6 +47,7 @@ int main(int argc, char** argv) goto cleanup_final; } gs->program_action = p->program_action; + p->program_state = 1; char* home_dir_str = gethome(); create_user_dir("/.config/"); @@ -80,7 +82,29 @@ int main(int argc, char** argv) 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(cache_dir_str); diff --git a/src/gilles/helper/parameters.h b/src/gilles/helper/parameters.h index d7952b9..3cf9304 100644 --- a/src/gilles/helper/parameters.h +++ b/src/gilles/helper/parameters.h @@ -6,6 +6,7 @@ typedef struct { int program_action; + int program_state; const char* sim_string; bool mqtt; int verbosity_count;