не рабочая версия

This commit is contained in:
Dmitry Borisenko
2022-08-23 13:06:01 +02:00
parent f7849894e5
commit 99e2fcfcb8
5 changed files with 808 additions and 750 deletions

View File

@@ -0,0 +1,3 @@
{
"scen": ""
}

View File

@@ -4,91 +4,91 @@
#include <map> #include <map>
class ExprAST { class ExprAST {
public: public:
virtual ~ExprAST(); virtual ~ExprAST();
virtual IoTValue* exec(); virtual IoTValue *exec();
virtual int setValue(IoTValue *val); // ret 0 - установка значения не поддерживается наследником virtual int setValue(IoTValue *val); // ret 0 - установка значения не поддерживается наследником
virtual bool hasEventIdName(String eventIdName); virtual bool hasEventIdName(String eventIdName);
}; };
class IoTScenario { class IoTScenario {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Lexer (Лексический анализатор) // Lexer (Лексический анализатор)
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
String IdentifierStr; // Заполняется, если tok_identifier String IdentifierStr; // Заполняется, если tok_identifier
float NumVal; // Заполняется, если tok_number float NumVal; // Заполняется, если tok_number
char LastChar = ' '; char LastChar = ' ';
/// gettok - Возвращает следующий токен из стандартного потока ввода. /// gettok - Возвращает следующий токен из стандартного потока ввода.
int gettok(); int gettok();
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Parser (Парсер или Синтаксический Анализатор) // Parser (Парсер или Синтаксический Анализатор)
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
/// CurTok/getNextToken - Предоставляет простой буфер токенов. CurTok - это текущий /// CurTok/getNextToken - Предоставляет простой буфер токенов. CurTok - это текущий
/// токен, просматриваемый парсером. getNextToken получает следующий токен от /// токен, просматриваемый парсером. getNextToken получает следующий токен от
/// лексического анализатора и обновляет CurTok. /// лексического анализатора и обновляет CurTok.
int CurTok; int CurTok;
int getNextToken(); int getNextToken();
/// BinopPrecedence - Содержит приоритеты для бинарных операторов /// BinopPrecedence - Содержит приоритеты для бинарных операторов
std::map<signed char, int> BinopPrecedence; std::map<signed char, int> BinopPrecedence;
/// GetTokPrecedence - Возвращает приоритет текущего бинарного оператора. /// GetTokPrecedence - Возвращает приоритет текущего бинарного оператора.
int GetTokPrecedence(); int GetTokPrecedence();
/// Error* - Это небольшие вспомогательные функции для обработки ошибок. /// Error* - Это небольшие вспомогательные функции для обработки ошибок.
ExprAST *Error(const char *Str); ExprAST *Error(const char *Str);
/// identifierexpr /// identifierexpr
/// ::= identifier /// ::= identifier
/// ::= identifier '(' expression* ')' /// ::= identifier '(' expression* ')'
ExprAST *ParseIdentifierExpr(String *IDNames); ExprAST *ParseIdentifierExpr(String *IDNames);
/// numberexpr ::= number /// numberexpr ::= number
ExprAST *ParseNumberExpr(); ExprAST *ParseNumberExpr();
/// parenexpr ::= '(' expression ')' /// parenexpr ::= '(' expression ')'
ExprAST *ParseParenExpr(); ExprAST *ParseParenExpr();
/// bracketsexpr ::= '{' expression '}' /// bracketsexpr ::= '{' expression '}'
ExprAST *ParseBracketsExpr(); ExprAST *ParseBracketsExpr();
/// quotesexpr ::= '"' expression '"' /// quotesexpr ::= '"' expression '"'
ExprAST *ParseQuotesExpr(); ExprAST *ParseQuotesExpr();
/// ifexpr ::= 'if' expression 'then' expression 'else' expression /// ifexpr ::= 'if' expression 'then' expression 'else' expression
ExprAST *ParseIfExpr(String* IDNames); ExprAST *ParseIfExpr(String *IDNames);
/// primary /// primary
/// ::= identifierexpr /// ::= identifierexpr
/// ::= numberexpr /// ::= numberexpr
/// ::= parenexpr /// ::= parenexpr
ExprAST *ParsePrimary(String* IDNames); ExprAST *ParsePrimary(String *IDNames);
/// binoprhs /// binoprhs
/// ::= ('+' primary)* /// ::= ('+' primary)*
ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames); ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames);
/// expression /// expression
/// ::= primary binoprhs /// ::= primary binoprhs
/// ///
ExprAST *ParseExpression(String *IDNames); ExprAST *ParseExpression(String *IDNames);
std::vector<ExprAST*> ScenarioElements; // корневые элементы дерава std::vector<ExprAST *> ScenarioElements; // корневые элементы дерава
String *strFromFile; String *strFromFile;
char getLastChar(); char getLastChar();
int strIterator = 0; int strIterator = 0;
void clearScenarioElements(); void clearScenarioElements();
public: public:
void loadScenario(String fileName); void loadScenario(String fileName);
void ExecScenario(String eventIdName); void ExecScenario(String eventIdName);
IoTScenario(); IoTScenario();
~IoTScenario(); ~IoTScenario();
}; };

View File

@@ -63,7 +63,7 @@ void setup() {
asyncUdpInit(); asyncUdpInit();
//загрузка сценария //загрузка сценария
iotScen.loadScenario("/scenario.txt"); iotScen.loadScenario("/scenario.json");
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}")); IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}"));
generateEvent("onStart", ""); generateEvent("onStart", "");

View File

@@ -63,7 +63,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
sendFileToWs("/items.json", num, 1024); sendFileToWs("/items.json", num, 1024);
sendFileToWs("/widgets.json", num, 1024); sendFileToWs("/widgets.json", num, 1024);
sendFileToWs("/config.json", num, 1024); sendFileToWs("/config.json", num, 1024);
sendFileToWs("/scenario.txt", num, 1024); sendFileToWs("/scenario.json", num, 1024);
standWebSocket.sendTXT(num, settingsFlashJson); standWebSocket.sendTXT(num, settingsFlashJson);
} }
//**сохранение**// //**сохранение**//
@@ -73,7 +73,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
clearConfigure(); clearConfigure();
Serial.println("Start config"); Serial.println("Start config");
configure("/config.json"); configure("/config.json");
iotScen.loadScenario("/scenario.txt"); iotScen.loadScenario("/scenario.json");
} }
//**сохранение**// //**сохранение**//
if (headerStr == "/tuoyal|") { if (headerStr == "/tuoyal|") {
@@ -81,13 +81,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
} }
//**сохранение**// //**сохранение**//
if (headerStr == "/oiranecs|") { if (headerStr == "/oiranecs|") {
if (length - headerLenth == 0) { writeFileUint8tByFrames("scenario.json", payload, length, headerLenth, 256);
SerialPrint("i", "WS", "Scenario file empty"); iotScen.loadScenario("/scenario.json");
writeFile("/scenario.txt", "");
} else {
writeFileUint8tByFrames("scenario.txt", payload, length, headerLenth, 256);
iotScen.loadScenario("/scenario.txt");
}
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}")); IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}"));
generateEvent("onStart", ""); generateEvent("onStart", "");

File diff suppressed because it is too large Load Diff