Easyelectronics.ru

Электроника для всех
Текущее время: 07 июл 2020, 22:20

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Периодический вывод информации.
СообщениеДобавлено: 10 дек 2018, 12:49 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
Допустим есть машина состояний
Код:
switch (state)
{
        case STATE_1:
            Parser_SendString(COM_USART, " STATE_1", 0);
        break;
        case STATE_2: 
            Parser_SendString(COM_USART, " STATE_2", 0);
        break;
        case STATE_2: 
            Parser_SendString(COM_USART, " STATE_3", 0);
        break;
}

Проблема что если я нахожусь в каком нибудь состоянии сообщение заплевывает мне терминал.
Я хочу послать его только раз. Скажем я введу флаг
Код:
if (do_once == 0)
{   
    do_once = 1;
    Parser_SendString(COM_USART, " STATE_1", 0);
}

И при переходе состояний обнулять флаг.
Но если я хочу применить тот же подход к другой машине состояний или в другом модуле я должен создать другой do_once.

Есть какие то другие решения?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Периодический вывод информации.
СообщениеДобавлено: 10 дек 2018, 12:56 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1630
Откуда: Курск
Может ввести промежуточные состояния? Отправили в терминал и перешли, образно говоря, в состояние 1.5, 2.5, 3.5


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Периодический вывод информации.
СообщениеДобавлено: 10 дек 2018, 13:26 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 188
jenya77 писал(а):
Допустим есть машина состояний [...] Проблема что если я нахожусь в каком нибудь состоянии сообщение заплевывает мне терминал.
Я хочу послать его только раз.


Код:
enum State {
   eStateInit = 0,
   eState1, eState2, eState3,
   eStateCount
};

static const char* st_pStateNames[eStateCount] = {
  "STATE_INIT", "STATE_1", "STATE_2", "STATE_3"
};

static enum State st_ePrevState = eStateInit;

[...]
 
  switch (state) {
[...]
    if (st_ePrevState != state) {
      Parser_SendString(COM_USART, st_pStateNames[state], 0);
      st_ePrevState = state;
    }
  }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Периодический вывод информации.
СообщениеДобавлено: 10 дек 2018, 13:31 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2775
Да много вариантов.
Если есть рама - написать функцию логирования, которая будет писать сообщение только если оно отличается от предыдущего (надо будет запоминать предыдущее).
Аналогично прошлому варианту, но можно дабы не сохранять строки, передавать текущее состояние как, например enum и в функции логирования запоминать уже просто число.
Можно написать функцию или макрос для смены состояния и логировать ей/им. Менять состояния только через эту функцию/макрос.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Периодический вывод информации.
СообщениеДобавлено: 10 дек 2018, 13:51 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
siarzhuk писал(а):
switch (state) {
[...]
if (st_ePrevState != state) {
Parser_SendString(COM_USART, st_pStateNames[state], 0);
st_ePrevState = state;
}
}
[/code]


выглядит как неплохой вариант. спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB