Added preliminary support for sending telemetry data to local mqtt server

This commit is contained in:
Paul Dino Jones 2023-01-27 10:36:54 +00:00
parent 04656badb3
commit 8c8febe27b
6 changed files with 79 additions and 16 deletions

View File

@ -17,6 +17,7 @@ set(CMAKE_BUILD_TYPE Debug)
project(gilles)
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--no-as-needed -ldl")
find_package(eclipse-paho-mqtt-c REQUIRED)
add_subdirectory(src/gilles/gameloop)
add_subdirectory(src/gilles/simulatorapi)
@ -24,7 +25,7 @@ add_subdirectory(src/gilles/helper)
add_subdirectory(src/gilles/slog)
add_executable(gilles src/gilles/gilles.c)
target_link_libraries(gilles m ${LIBUSB_LIBRARY} ncurses argtable2 config gameloop helper slog simulatorapi)
target_link_libraries(gilles m ncurses argtable2 config gameloop helper slog simulatorapi eclipse-paho-mqtt-c::paho-mqtt3c)
# used for enabling additional compiler options if supported

View File

@ -1,7 +1,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
#include <signal.h>
#include <MQTTClient.h>
#include "gameloop.h"
#include "../helper/parameters.h"
@ -12,6 +14,13 @@
#define DEFAULT_UPDATE_RATE 100
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "gilles"
#define TOPIC "telemetry"
//#define PAYLOAD "Hello, MQTT!"
#define QOS 0
#define TIMEOUT 10000L
WINDOW* win1;
WINDOW* win2;
WINDOW* win3;
@ -82,7 +91,7 @@ int curses_init()
box(win4, 0, 0);
}
int looper(Simulator simulator)
int looper(Simulator simulator, Parameters* p)
{
SimData* simdata = malloc(sizeof(SimData));
@ -100,11 +109,56 @@ int looper(Simulator simulator)
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;
while (go == true)
{
simdatamap(simdata, simmap, simulator);
if (mqtt_connected == true)
{
char payloads[6][20];
sprintf(payloads[0], "gas, lap=%i, %04f", simdata->lap, simdata->gas);
sprintf(payloads[1], "brake, lap=%i, %04f", simdata->lap, simdata->brake);
sprintf(payloads[2], "steer, lap=%i, %04f", simdata->lap, simdata->brake);
sprintf(payloads[3], "gear, lap=%i, %04i", simdata->lap, simdata->gear);
sprintf(payloads[4], "speed, lap=%i, %04i", simdata->lap, simdata->velocity);
for (int k =0; k < 6; k++)
{
pubmsg.payload = payloads[k];
pubmsg.payloadlen = strlen(payloads[k]);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
}
}
wclear(win1);
wclear(win2);
wclear(win3);
@ -505,6 +559,12 @@ int looper(Simulator simulator)
delwin(win1);
endwin();
if (mqtt_connected == true)
{
MQTTClient_disconnect(client, 10000);
}
MQTTClient_destroy(&client);
free(simdata);
free(simmap);

View File

@ -1,4 +1,4 @@
#include "../helper/parameters.h"
#include "../helper/confighelper.h"
int looper (Simulator simulator);
int looper (Simulator simulator, Parameters* p);

View File

@ -110,7 +110,7 @@ int main(int argc, char** argv)
config_setting_lookup_float(config_device, "thresh2", &m->thresh2);
}
*/
looper(1);
looper(1, p);
free(config_file_str);
free(cache_dir_str);

View File

@ -15,21 +15,21 @@ ConfigError getParameters(int argc, char** argv, Parameters* p)
// set return structure defaults
p->program_action = 0;
p->max_revs = 0;
p->mqtt = false;
p->verbosity_count = 0;
// setup argument handling structures
const char* progname = "csimtelem";
const char* progname = "gilles";
struct arg_lit* arg_verbosity1 = arg_litn("v","verbose", 0, 2, "increase logging verbosity");
struct arg_lit* arg_verbosity2 = arg_litn("v","verbose", 0, 2, "increase logging verbosity");
struct arg_lit* arg_verbosity = arg_litn("v","verbose", 0, 2, "increase logging verbosity");
struct arg_rex* cmd1 = arg_rex1(NULL, NULL, "play", NULL, REG_ICASE, NULL);
struct arg_str* arg_sim = arg_strn("s", "sim", "<gamename>", 0, 1, NULL);
struct arg_lit* arg_mqtt = arg_lit0("S", NULL, "send data to local mqtt server");
struct arg_lit* help = arg_litn(NULL,"help", 0, 1, "print this help and exit");
struct arg_lit* vers = arg_litn(NULL,"version", 0, 1, "print version information and exit");
struct arg_end* end = arg_end(20);
void* argtable[] = {cmd1,arg_sim,arg_verbosity1,help,vers,end};
void* argtable[] = {cmd1,arg_sim,arg_verbosity,arg_mqtt,help,vers,end};
int nerrors;
@ -46,7 +46,11 @@ ConfigError getParameters(int argc, char** argv, Parameters* p)
{
p->program_action = A_PLAY;
p->sim_string = arg_sim->sval[0];
p->verbosity_count = arg_verbosity1->count;
p->verbosity_count = arg_verbosity->count;
if (arg_mqtt->count > 0)
{
p->mqtt = true;
}
exitcode = E_SUCCESS_AND_DO;
}

View File

@ -1,13 +1,13 @@
#ifndef _PARAMETERS_H
#define _PARAMETERS_H
#include <stdbool.h>
typedef struct
{
int program_action;
const char* sim_string;
const char* save_file;
int max_revs;
int granularity;
bool mqtt;
int verbosity_count;
}
Parameters;
@ -15,8 +15,6 @@ Parameters;
typedef enum
{
A_PLAY = 0,
A_CONFIG_TACH = 1,
A_CONFIG_SHAKER = 2
}
ProgramAction;