Благодарю, постарайтесь пожалуйста воздерживаться от матов.
Речь идёт о дополнительном разбиение по аппаратным компонентам?
Типа:
if(event_indicator()){status_indicator();}
if(event_motor()){status_motor();}
if(event_svetodiodi()){status_svetodiodi();}
Речь идет о том, что основному циклу незачем знать, с какими event’ами работает какое устройство - это дело его внутренней кухни.
Берем случайный граф КА и внимательно разглядываем. Кружечки это состояния КА. А вот начало стрелочек это СОБЫТИЯ(ЕВЕНТЫ). И если внимательно посмотрим что в каждом состоянии свой комплект рассматриваемых евентов.А это значит что основному циклу надо знать в каком состоянии находится КА и какой комплект евентов рассматривать..
Ну и плюс отсутствие готовых рецептов перехода от delay() к millis(). По тем же циклам for, для той же умной гирлянды к примеру.
for(int i=0;i<111;i++){
//действие №1
delay(T1);
}
for(int i=0;i<222;i++){
//действие №2
delay(T2);
}
for(int i=0;i<333;i++){
//действие №3
delay(T3);
}
Не существует готовых рецептов перехода с языка Basic на язык Си/Си++. Просто for и delay() это фишки Basic. Да в Си их можно использовать, но они пипец как не эффективны.
Или есть, через учится, пробовать пытаться, даже если не хочется или не умеется.
я тут как-то код писал, нерешаемая проблема решилась использованием оператора GOTO (С++) )))
PS я не настоящий сталевар, если полностью всё переписать наверно можно было обойтись и без него, но это не точно
int T1=1000,T2=2000,T3=3000;
long Y=0;//переменная хранения моментов времени
int i=0;//счётчик
byte loop_=1;//счётчик последовательности delay();
void setup(){
}
void loop(){
if(loop_==1&&millis()-Y>T1){
Y=millis();
//действие №1
i++;if(i>111){i=0;loop_++;}
}
if(loop_==2&&millis()-Y>T2){
Y=millis();
//действие №2
i++;if(i>222){i=0;loop_++;}
}
if(loop_==3&&millis()-Y>T3){
Y=millis();
//действие №3
i++;if(i>333){i=0;loop_=1;}
}
}
Ну вот, как мне кажется эквивалент без делаев. Нужен счётчик для них в их скетчевой последовательности.
goto
, на самом деле.
Его можно ещё более креативно использовать - с массивом меток и по индексу переходить
А сама метка это что, слово?.. Когда то пробовал goto. Не везде можно метку ставить, вылазят ошибки какие то.
А что можно делать везде? Вон даже пукать и то не везде и не всегда можно
Отнюдь.
Основному циклу не нужно знать ни то, ни другое.
Это все внутренне дело КА.
Как раз “по циклам for” есть вполне конкретный рецепт: избавляться нужно от этих циклов.
Я в том смысле, что маловато тут информации почему-то.
Оставляя delay?
delay это тоже for.
Останется if и millis()
Ну например есть еще лямда функции
uint32_t past = 0;
void (*events)() = {
[]() {
if (millis() - past >= 500) {
past = millis();
Serial.println("Tyk");
}
}
};
void setup() {
Serial.begin(9600);
}
void loop() {
events();
}
Да, ваще, ни хрена уже не осталось! @anonimSimen вот мне как-то сказал, что из системы команд интеля даже команду POPA
убрали! Как теперь программировать-то?
И чем вам такой КА не нравится
uint32_t T1 = 100, T2 = 200, T3 = 300;
int i = 0;
void (*events)() = {};
int state;
uint32_t past;
void go(int s) {
state = s;
past = millis();
switch (s) {
case 1:
i = 0;
events = {[]() {
if (millis() - past >= T1) {
Serial.println("Do 1");
past = millis();
i++; if (i > 3) go(2);
}
}
};
break;
case 2:
i = 0;
events = {[]() {
if (millis() - past >= T2) {
Serial.println("Do 2");
past = millis();
i++; if (i > 3) go(3);
}
}
};
break;
case 3:
i = 0;
events = {[]() {
if (millis() - past >= T3) {
Serial.println("Do 3");
past = millis();
i++; if (i > 3) go(0);
}
}
};
break;
default:
events = {[]() {
Serial.println("End");
delay(1000);
}
};
break;
}
}
void setup() {
Serial.begin(9600);
go(1);
}
void loop() {
events();
}