我正在编写一个类来通过esp32上的字符串输入(串行,Web界面,telnet等)访问全局变量。因此,我的variableAccess类具有一个表示变量地址的属性和一个指定数据类型的枚举(在下面的示例代码中,仅将int和float简化为该枚举)。 然后可以通过setValue / readValue方法设置/读取变量。 在初始化期间,将创建variableAccess对象并将其存储在向量“ allVariables”中
现在解决我的问题:我希望所有那些variableAccess-objects提供一个处理函数“ wi_handle”,然后可以将其传递给WebServer方法,但是由于“无效使用非静态成员”,我遇到了错误功能'。经过研究之后,我现在理解了为什么“ wi_handle”必须是静态的,但是我仍然不确定如何实现我必须实现的功能(在网络界面上创建子域和相应的处理程序)。
我的代码:
#include <vector>
#include <locale>
#ifndef WebServer
#include <WebServer.h>
#endif
#ifndef server(80)
WebServer server(80);
#endif
enum ACCESS {NONE, READ, WRITE, READWRITE};
enum DATATYPE {INT,FLT};
class Variabel_Access {
public:
Variabel_Access(int *varPointer, String varName, ACCESS pAccess);
Variabel_Access(float *varPointer, String varName, ACCESS pAccess);
long int variablePointer;
String variableName;
ACCESS variableAccess;
DATATYPE datatype;
String readValue();
String setValue(String value);
//WI start
void wi_handle ();
//WI end
};
Variabel_Access::Variabel_Access (int* varPointer, String varName, ACCESS varAccess=READWRITE) {
variablePointer=(long int) varPointer;
variableName=varName;
variableAccess=varAccess;
datatype=INT;
}
Variabel_Access::Variabel_Access (float* varPointer, String varName, ACCESS varAccess=READWRITE) {
variablePointer=(long int) varPointer;
variableName=varName;
variableAccess=varAccess;
datatype=FLT;
}
String Variabel_Access::readValue () {
if (!(variableAccess==READ || variableAccess==READWRITE)) {
return "ERROR: no access";
}
switch(datatype) {
case INT:{
int& i = *reinterpret_cast<int*>(variablePointer);
return String(i);}
case FLT:{
float& f = *reinterpret_cast<float*>(variablePointer);
return String(f);}
default:{
return "ERROR: type error";}
}
}
String Variabel_Access::setValue (String valuestring) {
if (!(variableAccess==WRITE || variableAccess==READWRITE)) {
return "ERROR: no access";
}
String response="";
switch(datatype) {
case INT:{
int value = atoi(valuestring.c_str());
*(int*)(variablePointer)=value;
return "done";}
case FLT:{
float value = atof(valuestring.c_str());
*(float*)(variablePointer)=value;
return "done";}
default:{
return "ERROR: type error";}
}
}
void Variabel_Access::wi_handle () {
String value=readValue();
server.send(200, "text/plane", value);
}
std::vector<Variabel_Access> all_variables;
int integer_variable=100;
float float_variable=19.17;
void setup() {
all_variables.push_back( Variabel_Access( &integer_variable, "myInteger", READ) );
all_variables.push_back( Variabel_Access( &float_variable, "myFloat") );
for (int i=0; i<all_variables.size();i++) {
server.on("/"+all_variables[i].variableName, all_variables[i].wi_handle);
}
}
void loop() {
delay(10000);
}
如WebServer.h中所述编辑: webserver.on():
typedef std::function<void(void)> THandlerFunction;
void on(const String &uri, THandlerFunction handler);