2021-12-22 14:49:25 +01:00
# include "Main.h"
2022-04-24 11:59:52 +03:00
# include <time.h>
2022-08-25 19:24:56 +02:00
# include "classes/IoTDB.h"
2022-09-13 00:56:34 +02:00
# include "utils/Statistic.h"
2024-03-16 19:47:18 +03:00
# include "classes/IoTBench.h"
2024-09-20 12:45:17 +03:00
# ifndef LIBRETINY
2022-10-03 00:33:47 +03:00
# include <Wire.h>
2024-09-20 12:45:17 +03:00
# endif
2024-09-20 11:07:08 +03:00
# include "DebugTrace.h"
2023-10-17 22:21:13 +03:00
# if defined(esp32s2_4mb) || defined(esp32s3_16mb)
2023-05-27 02:02:33 +03:00
# include <USB.h>
# endif
2021-12-22 14:09:50 +01:00
2022-02-14 12:48:59 +03:00
IoTScenario iotScen ; // объект управления сценарием
2022-04-24 11:59:52 +03:00
String volStrForSave = " " ;
2023-09-05 00:20:03 +03:00
// unsigned long currentMillis; // это сдесь лишнее
// unsigned long prevMillis;
2022-04-24 11:59:52 +03:00
2023-02-17 22:21:10 +03:00
void elementsLoop ( ) {
// передаем управление каждому элементу конфигурации для выполнения своих функций
for ( std : : list < IoTItem * > : : iterator it = IoTItems . begin ( ) ; it ! = IoTItems . end ( ) ; + + it ) {
2024-02-26 23:29:02 +03:00
if ( benchTaskItem ) benchTaskItem - > preTaskFunction ( ( * it ) - > getID ( ) ) ;
2023-02-17 22:21:10 +03:00
( * it ) - > loop ( ) ;
2024-02-26 23:29:02 +03:00
if ( benchTaskItem ) benchTaskItem - > postTaskFunction ( ( * it ) - > getID ( ) ) ;
2023-02-17 22:21:10 +03:00
// if ((*it)->iAmDead) {
if ( ! ( ( * it ) - > iAmLocal ) & & ( * it ) - > getIntFromNet ( ) = = - 1 ) {
delete * it ;
IoTItems . erase ( it ) ;
break ;
}
}
handleOrder ( ) ;
handleEvent ( ) ;
}
2023-06-09 01:11:15 +02:00
# define SETUPBASE_ERRORMARKER 0
# define SETUPCONF_ERRORMARKER 1
# define SETUPSCEN_ERRORMARKER 2
# define SETUPINET_ERRORMARKER 3
# define SETUPLAST_ERRORMARKER 4
# define TICKER_ERRORMARKER 5
# define HTTP_ERRORMARKER 6
# define SOCKETS_ERRORMARKER 7
# define MQTT_ERRORMARKER 8
# define MODULES_ERRORMARKER 9
2023-02-17 22:21:10 +03:00
2023-06-09 01:11:15 +02:00
# define COUNTER_ERRORMARKER 4 // количество шагов счетчика
# define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс
2023-02-25 18:31:18 +03:00
2023-10-02 21:29:02 +03:00
# if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb)
2023-03-08 15:23:16 +03:00
2023-06-09 01:11:15 +02:00
static int IRAM_ATTR initErrorMarkerId = 0 ; // ИД маркера
2023-03-08 15:23:16 +03:00
static int IRAM_ATTR errorMarkerId = 0 ;
static int IRAM_ATTR errorMarkerCounter = 0 ;
2023-02-25 18:31:18 +03:00
hw_timer_t * My_timer = NULL ;
2023-06-09 01:11:15 +02:00
void IRAM_ATTR onTimer ( ) {
2023-02-25 18:31:18 +03:00
if ( errorMarkerCounter > = 0 ) {
if ( errorMarkerCounter > = COUNTER_ERRORMARKER ) {
errorMarkerId = initErrorMarkerId ;
errorMarkerCounter = - 1 ;
2023-06-09 01:11:15 +02:00
} else
2023-02-25 18:31:18 +03:00
errorMarkerCounter + + ;
2023-06-09 01:11:15 +02:00
}
2023-02-25 18:31:18 +03:00
}
2023-03-08 15:23:16 +03:00
# endif
2023-02-25 18:31:18 +03:00
void initErrorMarker ( int id ) {
2023-10-02 21:29:02 +03:00
# if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb)
2023-02-25 18:31:18 +03:00
initErrorMarkerId = id ;
errorMarkerCounter = 0 ;
2023-03-08 15:23:16 +03:00
# endif
2023-02-25 18:31:18 +03:00
}
void stopErrorMarker ( int id ) {
2023-10-02 21:29:02 +03:00
# if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb)
2023-02-25 18:31:18 +03:00
errorMarkerCounter = - 1 ;
2023-06-09 01:11:15 +02:00
if ( errorMarkerId )
SerialPrint ( " I " , " WARNING! " , " A lazy (freezing loop more than " + ( String ) ( COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000 ) + " ms) section has been found! With ID= " + ( String ) errorMarkerId ) ;
2023-02-25 18:31:18 +03:00
errorMarkerId = 0 ;
initErrorMarkerId = 0 ;
2023-03-08 15:23:16 +03:00
# endif
2023-02-25 18:31:18 +03:00
}
2021-12-22 14:09:50 +01:00
void setup ( ) {
2023-10-17 22:21:13 +03:00
# if defined(esp32s2_4mb) || defined(esp32s3_16mb)
2023-05-27 02:02:33 +03:00
USB . begin ( ) ;
2023-06-20 21:47:29 +02:00
# endif
2023-10-02 21:29:02 +03:00
# if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb)
2023-02-25 18:31:18 +03:00
My_timer = timerBegin ( 0 , 80 , true ) ;
timerAttachInterrupt ( My_timer , & onTimer , true ) ;
timerAlarmWrite ( My_timer , STEPPER_ERRORMARKER , true ) ;
timerAlarmEnable ( My_timer ) ;
2023-06-09 01:11:15 +02:00
// timerAlarmDisable(My_timer);
2023-02-25 18:31:18 +03:00
initErrorMarker ( SETUPBASE_ERRORMARKER ) ;
2023-03-08 15:23:16 +03:00
# endif
2023-02-25 18:31:18 +03:00
2021-12-22 14:09:50 +01:00
Serial . begin ( 115200 ) ;
Serial . flush ( ) ;
2024-09-20 11:07:08 +03:00
//----------- Отладка EXCEPTION (функции с заглушками для отключения) ---------
//Привязка коллбэк функции для вызова при перезагрузке
esp_register_shutdown_handler ( debugUpdate ) ;
// Печать или оправка отладочной информации
printDebugTrace ( ) ;
2021-12-22 14:09:50 +01:00
Serial . println ( ) ;
Serial . println ( F ( " --------------started---------------- " ) ) ;
2021-12-22 21:18:27 +01:00
2022-12-09 03:14:52 +01:00
// создание экземпляров классов
2023-06-19 18:04:00 +02:00
// myNotAsyncActions = new NotAsync(do_LAST);
2022-01-10 23:37:21 +01:00
2022-12-09 03:14:52 +01:00
// инициализация файловой системы
2021-12-22 14:09:50 +01:00
fileSystemInit ( ) ;
2022-09-19 01:41:15 +02:00
Serial . println ( F ( " ------------------------ " ) ) ;
Serial . println ( " FIRMWARE NAME " + String ( FIRMWARE_NAME ) ) ;
Serial . println ( " FIRMWARE VERSION " + String ( FIRMWARE_VERSION ) ) ;
Serial . println ( " WEB VERSION " + getWebVersion ( ) ) ;
2023-06-20 21:47:29 +02:00
const String buildTime = String ( BUILD_DAY ) + " . " + String ( BUILD_MONTH ) + " . " + String ( BUILD_YEAR ) + " " + String ( BUILD_HOUR ) + " : " + String ( BUILD_MIN ) + " : " + String ( BUILD_SEC ) ;
2023-06-19 18:04:00 +02:00
Serial . println ( " BUILD TIME " + buildTime ) ;
jsonWriteStr_ ( errorsHeapJson , F ( " bt " ) , buildTime ) ;
2022-09-19 01:41:15 +02:00
Serial . println ( F ( " ------------------------ " ) ) ;
2021-12-22 14:09:50 +01:00
2022-12-09 03:14:52 +01:00
// получение chip id
2022-02-02 23:39:41 +01:00
setChipId ( ) ;
2024-09-20 12:05:34 +03:00
verifyFirmware ( ) ;
2022-12-09 03:14:52 +01:00
// синхронизация глобальных переменных с flash
2021-12-22 23:47:35 +01:00
globalVarsSync ( ) ;
2023-02-25 18:31:18 +03:00
stopErrorMarker ( SETUPBASE_ERRORMARKER ) ;
2023-02-17 22:21:10 +03:00
2023-02-25 18:31:18 +03:00
initErrorMarker ( SETUPCONF_ERRORMARKER ) ;
2023-02-17 22:27:37 +03:00
// настраиваем i2c шину
int i2c , pinSCL , pinSDA , i2cFreq ;
jsonRead ( settingsFlashJson , " pinSCL " , pinSCL , false ) ;
jsonRead ( settingsFlashJson , " pinSDA " , pinSDA , false ) ;
jsonRead ( settingsFlashJson , " i2cFreq " , i2cFreq , false ) ;
jsonRead ( settingsFlashJson , " i2c " , i2c , false ) ;
if ( i2c ! = 0 ) {
2023-05-27 02:02:33 +03:00
# ifdef ESP32
2023-02-17 22:27:37 +03:00
Wire . end ( ) ;
Wire . begin ( pinSDA , pinSCL , ( uint32_t ) i2cFreq ) ;
2024-09-20 12:45:17 +03:00
# elif defined(ESP8266)
2023-02-17 22:27:37 +03:00
Wire . begin ( pinSDA , pinSCL ) ;
Wire . setClock ( i2cFreq ) ;
# endif
SerialPrint ( " i " , " i2c " , F ( " i2c pins overriding done " ) ) ;
}
2023-04-28 08:30:16 +03:00
2024-09-20 12:05:34 +03:00
if ( bootloop_panic_count > = 3 )
{
resetSettingsFlashByPanic ( ) ;
bootloop_panic_count = - 1 ;
}
if ( bootloop_panic_count = = - 1 )
SerialPrint ( " E " , " CORE " , F ( " CONFIG and SCENARIO reset !!! " ) ) ;
2023-04-28 08:30:16 +03:00
// настраиваем микроконтроллер
configure ( " /config.json " ) ;
2023-02-25 18:31:18 +03:00
2023-06-09 01:11:15 +02:00
stopErrorMarker ( SETUPCONF_ERRORMARKER ) ;
2023-02-25 18:31:18 +03:00
initErrorMarker ( SETUPSCEN_ERRORMARKER ) ;
2023-06-09 01:11:15 +02:00
2023-02-17 22:21:10 +03:00
// подготавливаем сценарии
iotScen . loadScenario ( " /scenario.txt " ) ;
// создаем событие завершения инициализации основных моментов для возможности выполнения блока кода при загрузке
createItemFromNet ( " onInit " , " 1 " , 1 ) ;
2024-02-26 23:29:02 +03:00
// elementsLoop(); //Для работы MQTT Брокера перенес ниже, иначе брокер падает если вызван до routerConnect();
2023-06-09 01:11:15 +02:00
2023-02-25 18:31:18 +03:00
stopErrorMarker ( SETUPSCEN_ERRORMARKER ) ;
initErrorMarker ( SETUPINET_ERRORMARKER ) ;
2024-02-26 23:29:02 +03:00
// подключаемся к роутеру
2021-12-24 22:49:06 +01:00
routerConnect ( ) ;
2022-12-09 03:14:52 +01:00
// инициализация асинхронного веб сервера и веб сокетов
2021-12-23 22:42:19 +01:00
# ifdef ASYNC_WEB_SERVER
asyncWebServerInit ( ) ;
2021-12-24 22:49:06 +01:00
# endif
# ifdef ASYNC_WEB_SOCKETS
2021-12-23 22:42:19 +01:00
asyncWebSocketsInit ( ) ;
# endif
2022-12-09 03:14:52 +01:00
// инициализация стандартного веб сервера и веб сокетов
2021-12-23 22:42:19 +01:00
# ifdef STANDARD_WEB_SERVER
standWebServerInit ( ) ;
2021-12-23 18:18:32 +01:00
# endif
2021-12-23 23:47:13 +01:00
# ifdef STANDARD_WEB_SOCKETS
standWebSocketsInit ( ) ;
# endif
2023-02-25 18:31:18 +03:00
stopErrorMarker ( SETUPINET_ERRORMARKER ) ;
2022-08-18 14:49:11 +02:00
2024-09-20 11:07:08 +03:00
bool postMsgTelegram ;
if ( ! jsonRead ( settingsFlashJson , " debugTrace " , postMsgTelegram , false ) ) postMsgTelegram = 1 ;
sendDebugTraceAndFreeMemory ( postMsgTelegram ) ;
2023-02-25 18:31:18 +03:00
initErrorMarker ( SETUPLAST_ERRORMARKER ) ;
2024-02-26 23:29:02 +03:00
elementsLoop ( ) ;
2023-02-25 18:31:18 +03:00
// NTP
ntpInit ( ) ;
2022-01-15 02:01:22 +01:00
2022-12-09 03:14:52 +01:00
// инициализация задач переодического выполнения
2022-02-08 16:47:17 +01:00
periodicTasksInit ( ) ;
2022-02-13 00:40:15 +01:00
2022-12-09 03:14:52 +01:00
// запуск работы udp
2023-06-09 01:11:15 +02:00
addThisDeviceToList ( ) ;
2024-09-20 12:45:17 +03:00
# ifdef UDP_ENABLED
2023-06-09 01:11:15 +02:00
udpListningInit ( ) ;
udpBroadcastInit ( ) ;
2024-09-20 12:45:17 +03:00
# endif
2022-04-28 16:00:14 +03:00
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
2023-02-08 11:20:58 +03:00
createItemFromNet ( " onStart " , " 1 " , 1 ) ;
2022-02-13 16:13:51 +01:00
2022-09-13 00:56:34 +02:00
stInit ( ) ;
2022-10-30 20:20:57 +03:00
// настраиваем секундные обслуживания системы
ts . add (
2022-11-22 15:07:29 +01:00
TIMES , 1000 , [ & ] ( void * ) {
2022-10-30 20:20:57 +03:00
// сохраняем значения IoTItems в файл каждую секунду, если были изменения (установлены маркеры на сохранение)
if ( needSaveValues ) {
syncValuesFlashJson ( ) ;
needSaveValues = false ;
}
2022-11-22 15:07:29 +01:00
2022-10-30 20:20:57 +03:00
// проверяем все элементы на тухлость
for ( std : : list < IoTItem * > : : iterator it = IoTItems . begin ( ) ; it ! = IoTItems . end ( ) ; + + it ) {
( * it ) - > checkIntFromNet ( ) ;
2022-11-22 15:07:29 +01:00
// Serial.printf("[ITEM] size: %d, id: %s, int: %d, intnet: %d\n", sizeof(**it), (*it)->getID(), (*it)->getInterval(), (*it)->getIntFromNet());
}
2022-10-30 20:20:57 +03:00
} ,
2022-11-22 15:07:29 +01:00
nullptr , true ) ;
2022-10-30 20:20:57 +03:00
2022-02-13 00:40:15 +01:00
// test
Serial . println ( " -------test start-------- " ) ;
Serial . println ( " --------test end--------- " ) ;
2023-02-25 18:31:18 +03:00
stopErrorMarker ( SETUPLAST_ERRORMARKER ) ;
2024-09-20 12:05:34 +03:00
bootloop_panic_count = 0 ;
2021-12-22 14:09:50 +01:00
}
void loop ( ) {
2022-10-12 03:14:55 +02:00
# ifdef LOOP_DEBUG
unsigned long st = millis ( ) ;
# endif
2024-02-26 23:29:02 +03:00
if ( benchLoadItem ) benchLoadItem - > preLoadFunction ( ) ;
if ( benchTaskItem ) benchTaskItem - > preTaskFunction ( " TickerScheduler " ) ;
2023-02-25 18:31:18 +03:00
initErrorMarker ( TICKER_ERRORMARKER ) ;
2021-12-23 17:55:46 +01:00
ts . update ( ) ;
2023-02-25 18:31:18 +03:00
stopErrorMarker ( TICKER_ERRORMARKER ) ;
2024-02-26 23:29:02 +03:00
if ( benchTaskItem ) benchTaskItem - > postTaskFunction ( " TickerScheduler " ) ;
if ( benchTaskItem ) benchTaskItem - > preTaskFunction ( " webServer " ) ;
2021-12-23 22:42:19 +01:00
# ifdef STANDARD_WEB_SERVER
2023-02-25 18:31:18 +03:00
initErrorMarker ( HTTP_ERRORMARKER ) ;
2021-12-23 22:42:19 +01:00
HTTP . handleClient ( ) ;
2023-02-25 18:31:18 +03:00
stopErrorMarker ( HTTP_ERRORMARKER ) ;
2021-12-23 22:42:19 +01:00
# endif
2024-02-26 23:29:02 +03:00
if ( benchTaskItem ) benchTaskItem - > postTaskFunction ( " webServer " ) ;
if ( benchTaskItem ) benchTaskItem - > preTaskFunction ( " webSocket " ) ;
2021-12-23 23:47:13 +01:00
# ifdef STANDARD_WEB_SOCKETS
2023-02-25 18:31:18 +03:00
initErrorMarker ( SOCKETS_ERRORMARKER ) ;
2021-12-23 23:47:13 +01:00
standWebSocket . loop ( ) ;
2023-02-25 18:31:18 +03:00
stopErrorMarker ( SOCKETS_ERRORMARKER ) ;
2021-12-23 23:47:13 +01:00
# endif
2024-02-26 23:29:02 +03:00
if ( benchTaskItem ) benchTaskItem - > postTaskFunction ( " webSocket " ) ;
if ( benchTaskItem ) benchTaskItem - > preTaskFunction ( " mqtt " ) ;
2023-02-25 18:31:18 +03:00
initErrorMarker ( MQTT_ERRORMARKER ) ;
2022-01-15 19:11:01 +01:00
mqttLoop ( ) ;
2023-02-25 18:31:18 +03:00
stopErrorMarker ( MQTT_ERRORMARKER ) ;
2024-02-26 23:29:02 +03:00
if ( benchTaskItem ) benchTaskItem - > postTaskFunction ( " mqtt " ) ;
2023-02-25 18:31:18 +03:00
initErrorMarker ( MODULES_ERRORMARKER ) ;
2023-02-17 22:21:10 +03:00
elementsLoop ( ) ;
2023-02-25 18:31:18 +03:00
stopErrorMarker ( MODULES_ERRORMARKER ) ;
2024-02-26 23:29:02 +03:00
if ( benchLoadItem ) benchLoadItem - > postLoadFunction ( ) ;
2022-11-22 15:07:29 +01:00
// #ifdef LOOP_DEBUG
// loopPeriod = millis() - st;
// if (loopPeriod > 2) Serial.println(loopPeriod);
// #endif
2021-12-22 14:09:50 +01:00
}
2022-10-02 01:06:25 +02:00
2022-12-09 03:14:52 +01:00
// отправка json
// #ifdef QUEUE_FROM_STR
// if (sendJsonFiles) sendJsonFiles->loop();
// #endif
2022-10-12 03:14:55 +02:00
// if(millis()%2000==0){
// //watch->settimeUnix(time(&iotTimeNow));
// Serial.println(watch->gettime("d-m-Y, H:i:s, M"));
// delay(1);
// }
2022-10-02 01:06:25 +02:00
// File dir = FileFS.open("/", "r");
// String out;
// printDirectory(dir, out);
// Serial.println(out);
//=======проверка очереди из структур=================
// myDB = new IoTDB;
// QueueItems myItem;
// myItem.myword = "word1";
// myDB->push(myItem);
// myItem.myword = "word2";
// myDB->push(myItem);
// myItem.myword = "word3";
// myDB->push(myItem);
// Serial.println(myDB->front().myword);
// Serial.println(myDB->front().myword);
// Serial.println(myDB->front().myword);
// Serial.println(FileList("lg"));