working example of callback with date passing inside and outside

This commit is contained in:
Dmitry Borisenko
2020-08-24 15:09:43 +03:00
parent e44d2dc793
commit ce7c550410
3 changed files with 43 additions and 13 deletions

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#include <Arduino.h>
#include <stdint.h> #include <stdint.h>
#include <functional> #include <functional>
@@ -8,22 +8,26 @@
// должен быть метод без результата и без параметров. // должен быть метод без результата и без параметров.
// Новый тип мы называем AsynсActionCb - хотя можешь назвать вообще как нравиться а что значит callBack // Новый тип мы называем AsynсActionCb - хотя можешь назвать вообще как нравиться а что значит callBack
//а как вызывать callback и когда их много? когда нужно вызывать например 10 разных из класса? typedef std::function<void()> AsyncActionCb; //метод без результата и параметров
//
typedef std::function<void(void*)> AsyncActionCb; //метод без результата и параметров typedef std::function<bool(const String)> AsyncParamActionCb; //метод без результата и параметров
class AsyncActions { class AsyncActions {
private: private:
long count; long count;
AsyncActionCb _cb; AsyncActionCb _cb;
AsyncParamActionCb _pcb;
public: public:
AsyncActions(); AsyncActions();
void loop(); void loop();
void setCallback(AsyncActionCb cb) { //передаем внутрь класса функцию любую void функцию без агрументов void setCallback(AsyncActionCb cb) { //передаем внутрь класса функцию любую void функцию без агрументов
_cb = cb; _cb = cb;
} }
};
void setCallback(AsyncParamActionCb cb) { //передаем внутрь класса функцию любую void функцию с аргументами
_pcb = cb;
}
};
extern AsyncActions* async; extern AsyncActions* async;

View File

@@ -5,9 +5,28 @@ AsyncActions::AsyncActions(){};
void AsyncActions::loop() { void AsyncActions::loop() {
count++; count++;
if (count > 5000) { if (count > 5000) {
if(_cb) _cb; //что означает эта запись? это и есть вызов callback? // Проверяем что переменная содержит указатель - не пустая не null
// и непосредственно вызываем то, на что это указывает
// просто пишем имя - без () - это указатель на фунецию.
// () - вызываем функцию - с пустым набором параметров
if (_cb != NULL) {
_cb();
}
//или ровно тоже самое
//if (_cb) _cb();
if (_pcb) {
if (_pcb("SomeTextValue")) {
Serial.print("Got true!");
} else {
Serial.print("Got false!");
}
}
count = 0; count = 0;
} }
} }
AsyncActions* async; AsyncActions* async;

View File

@@ -1,4 +1,5 @@
#include "Bus/BusScannerFactory.h" #include "Bus/BusScannerFactory.h"
#include "Class/AsyncActions.h"
#include "Class/Switch.h" #include "Class/Switch.h"
#include "Cmd.h" #include "Cmd.h"
#include "DeviceList.h" #include "DeviceList.h"
@@ -6,7 +7,6 @@
#include "HttpServer.h" #include "HttpServer.h"
#include "Init.h" #include "Init.h"
#include "Utils/Timings.h" #include "Utils/Timings.h"
#include "Class/AsyncActions.h"
void not_async_actions(); void not_async_actions();
@@ -69,7 +69,8 @@ void setup() {
udp_init(); udp_init();
#endif #endif
ts.add(TEST, 1000 * 60, [&](void*) { pm.info(printMemoryStatus()); }, nullptr, true); ts.add(
TEST, 1000 * 60, [&](void*) { pm.info(printMemoryStatus()); }, nullptr, true);
just_load = false; just_load = false;
initialized = true; initialized = true;
@@ -77,14 +78,20 @@ void setup() {
async = new AsyncActions(); async = new AsyncActions();
//async->setCallback([&](void*) { //async->setCallback([&](void*) {
// //
// //
//}); //});
async->setCallback(myCallback); // async->setCallback([]() {
Serial.println("123");
});
async->setCallback([](const String str) {
Serial.println(str);
return false;
});
} }
void loop() { void loop() {