Commit c65e5fcf authored by Eric Duminil's avatar Eric Duminil
Browse files

Some lambda examples

parent 00798414
...@@ -118,6 +118,15 @@ namespace csv_writer { ...@@ -118,6 +118,15 @@ namespace csv_writer {
Serial.println(); Serial.println();
sensor_commands::defineIntCallback("csv", setCSVinterval, " 60 (Sets CSV writing interval, in s)"); sensor_commands::defineIntCallback("csv", setCSVinterval, " 60 (Sets CSV writing interval, in s)");
sensor_commands::defineIntCallback("double", [](int32_t x) {
Serial.print("2 * ");
Serial.print(x);
Serial.print(" = ");
Serial.println(2 * x);
}, " (Say Hello;)");
sensor_commands::defineCallback("hello", []() {
Serial.println("SAY HELLO");
}, " (Say Hello;)");
sensor_commands::defineCallback("format_filesystem", formatFilesystem, " (Deletes the whole filesystem.)"); sensor_commands::defineCallback("format_filesystem", formatFilesystem, " (Deletes the whole filesystem.)");
} }
......
...@@ -37,6 +37,10 @@ namespace mqtt { ...@@ -37,6 +37,10 @@ namespace mqtt {
mqttClient.setServer(config::mqtt_server, config::mqtt_port); mqttClient.setServer(config::mqtt_server, config::mqtt_port);
sensor_commands::defineIntCallback("mqtt", setMQTTinterval, " 60 (Sets MQTT sending interval, in s)"); sensor_commands::defineIntCallback("mqtt", setMQTTinterval, " 60 (Sets MQTT sending interval, in s)");
sensor_commands::defineCallback("publish", []() {
Serial.println(F("Forcing MQTT publish now."));
last_sent_at = -config::sending_interval;
}, " (Force publish now)");
} }
void publish(const String &timestamp, int16_t co2, float temperature, float humidity) { void publish(const String &timestamp, int16_t co2, float temperature, float humidity) {
...@@ -97,16 +101,12 @@ namespace mqtt { ...@@ -97,16 +101,12 @@ namespace mqtt {
//TODO: Move this logic to a separate class, which could be used by Serial/MQTT/WebServer //TODO: Move this logic to a separate class, which could be used by Serial/MQTT/WebServer
if (messageString == "publish") { if (messageString == "night_mode") {
Serial.println(F("Forcing MQTT publish now."));
last_sent_at = 0;
} else if (messageString == "night_mode") {
led_effects::toggleNightMode(); led_effects::toggleNightMode();
} else if (messageString == "local_ip") { } else if (messageString == "local_ip") {
sendInfoAboutLocalNetwork(); sendInfoAboutLocalNetwork();
} else if (messageString == "reset") { } else if (messageString == "reset") {
ESP.restart(); // softer than ESP.reset() ESP.restart(); // softer than ESP.reset()
} else {
} }
} }
......
...@@ -13,16 +13,18 @@ namespace sensor_commands { ...@@ -13,16 +13,18 @@ namespace sensor_commands {
void (*voidFunction)(void); void (*voidFunction)(void);
}; };
const char *doc; const char *doc;
bool has_parameter;
}; };
Callback callbacks[MAX_CALLBACKS]; Callback callbacks[MAX_CALLBACKS];
//NOTE: Probably possible to DRY //NOTE: Probably possible to DRY (with templates?)
void defineCallback(const char *name, void (*function)(void), const char *doc) { void defineCallback(const char *name, void (*function)(void), const char *doc) {
if (callbacks_count < MAX_CALLBACKS) { if (callbacks_count < MAX_CALLBACKS) {
callbacks[callbacks_count].name = name; callbacks[callbacks_count].name = name;
callbacks[callbacks_count].voidFunction = function; callbacks[callbacks_count].voidFunction = function;
callbacks[callbacks_count].doc = doc; callbacks[callbacks_count].doc = doc;
callbacks[callbacks_count].has_parameter = false;
callbacks_count++; callbacks_count++;
} else { } else {
Serial.println(F("Too many callbacks have been defined.")); Serial.println(F("Too many callbacks have been defined."));
...@@ -34,13 +36,14 @@ namespace sensor_commands { ...@@ -34,13 +36,14 @@ namespace sensor_commands {
callbacks[callbacks_count].name = name; callbacks[callbacks_count].name = name;
callbacks[callbacks_count].intFunction = function; callbacks[callbacks_count].intFunction = function;
callbacks[callbacks_count].doc = doc; callbacks[callbacks_count].doc = doc;
callbacks[callbacks_count].has_parameter = true;
callbacks_count++; callbacks_count++;
} else { } else {
Serial.println(F("Too many callbacks have been defined.")); Serial.println(F("Too many callbacks have been defined."));
} }
} }
uint8_t parseCommand(const char *command, char *function_name, int32_t &parameter) { uint8_t parseCommand(const char *command, char *function_name, int32_t &argument) {
char split_command[MAX_COMMAND_SIZE]; char split_command[MAX_COMMAND_SIZE];
strlcpy(split_command, command, MAX_COMMAND_SIZE); strlcpy(split_command, command, MAX_COMMAND_SIZE);
Serial.print(F("Received : '")); Serial.print(F("Received : '"));
...@@ -58,13 +61,13 @@ namespace sensor_commands { ...@@ -58,13 +61,13 @@ namespace sensor_commands {
uint8_t code = 0; uint8_t code = 0;
if (arg) { if (arg) {
char *end; char *end;
parameter = strtol(arg, &end, 10); argument = strtol(arg, &end, 10);
if (*end) { if (*end) {
// Second argument isn't a number // Second argument isn't a number
code = 2; code = 2;
} }
} else { } else {
// No parameter // No argument
code = 2; code = 2;
} }
return code; return code;
...@@ -82,17 +85,22 @@ namespace sensor_commands { ...@@ -82,17 +85,22 @@ namespace sensor_commands {
void run(const char *command) { void run(const char *command) {
char function_name[MAX_COMMAND_SIZE]; char function_name[MAX_COMMAND_SIZE];
int32_t parameter = 0; int32_t argument = 0;
parseCommand(command, function_name, parameter); bool has_argument;
has_argument = (parseCommand(command, function_name, argument) == 0);
for (uint8_t i = 0; i < callbacks_count; i++) { for (uint8_t i = 0; i < callbacks_count; i++) {
if (!strcmp(function_name, callbacks[i].name)) { if (!strcmp(function_name, callbacks[i].name) && has_argument == callbacks[i].has_parameter) {
Serial.print("Calling : "); Serial.print("Calling : ");
Serial.print(function_name); Serial.print(function_name);
if (has_argument) {
Serial.print("("); Serial.print("(");
Serial.print(parameter); Serial.print(argument);
Serial.println(")"); Serial.println(")");
callbacks[i].intFunction(parameter); callbacks[i].intFunction(argument);
} else {
callbacks[i].voidFunction();
}
return; return;
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment