Степан Митькин писал(а):
1. Нет отправки сообщения "Нет сети 220в".
2. Видимо, имеется путаница. Как автоматы у нас взаимодействуют?
Есть два варианта:
- через отправку сообщений
- через запись значений в разделяемые переменные
Сергей, какого подхода вы придерживаетесь? Это не ясно из диаграмм.
Конечно, из представленной единственной иллюстрации непонятно, как что взаимодействует.
Автоматов много. Все они вызываются поочередно в главном цикле.
Для взаимодействия автоматов есть "служба сообщений". Сообщения очень простые, в них нет ни адреса отправителя, ни адреса получателя, ни параметров. По сути - это битовые флаги. Для работы с сообщениями есть 3 функции:
send_mess( enum mess );
bool get_mess( enum mess );
void process_mess(void);
Первая "посылает" сообщение, вторая - "принимает". Список сообщений (enum) доступен всем автоматам. Любой автомат может послать любое сообщение, не заботясь о том, кто его примет. И любой автомат может принять любое сообщение, не имея понятия, кто его послал. Функция "process_mess" вызывается в главном цикле, после всех автоматов. Она выполняет 2 задачи:
- все посланные в текущем цикле сообщения становятся доступны для чтения всем автоматам в следующем цикле
- в конце следующего цикла эти сообщения уничтожаются.
Таким образом, неважно в каком порядке вызываются автоматы - любой автомат может принять любое сообщение.
Поэтому автомат контроля сети, если есть сеть - посылает сообщение "Есть сеть" в каждом цикле своей работы. Или не посылает, если сети нет. А сообщения "Нет сети" нету. Отсутствие сообщения "Есть сеть" говорит о том, что сети нет. Впрочем, тут свобода полная, легко можно сделать и отдельные сообщения "Есть сеть", "Нет сети". Наверное, даже так и лучше сделать. Изменения потребуют следующих правок
- внести в список (enum) новое сообщение .
- добавить в нужное место икону отправки этого сообщения
- добавить в нужное место икону приёма этого сообщения
Теперь по представленным Дракон схемам. Тут есть такие неявные соглашения:
1. Одна ветка - это одно состояние автомата.
2. Переход на другую ветку происходит при следующем вызове автомата.
3. Переход в самое начало ветки так-же происходит при следующем вызове автомата.
Именно 2 и 3 пункты не позволяют выносить в начало ветки сброс таймера.
Тут может быть только такое действие, которое нужно выполнять при каждом вызове автомата.
С уважением, Ефанов Сергей.