Событийно-статусная система, расширяемая под хотелки

Тема в разделе "Arduino & Shields", создана пользователем DIYMan, 4 сен 2016.

  1. DIYMan

    DIYMan Guest

    Приветствую!

    Так уж получилось, что появился заказ на написание довольно сложной прошивки, с хотелками вида дальнейшей расширяемости, удобства сопровождения и т.д. и т.п. Короче, со всем тем, что в парадигму "напишу на честном С" (приветствую, коллега ;)) - если и вписывается, то с таким серьёзным скрипом, что ахтунг.

    Платформой выбрали Arduino Mega, чтоб - уж точно все хотелки, благо, изделие очень мелкосерийное. И, поскольку у меня уже накопился достаточно большой опыт разработки модульной архитектуры прошивки, решил я его применить и здесь, с учётом нюансов проекта.

    В аттаче - исходники, посмотрев которые, каждый может взять их за основу и убедиться, как при помощи штатных средств С++ можно легко сделать расширяемую событийно-статусную систему. Оговорюсь - то, что выложено - это не готовое решение, а лишь костяк для демонстрации того, как можно организовать опрос всех компонентов системы через определённые настраиваемые интервалы, как легко добавить поддержку любого типа датчика в систему, как при помощи событий передать событие всем подписчикам, заинтересованным в нём. Т.е. потенциал этого дела - не сказать, что огромен, но достаточен, чтобы покрыть 90% применений в той же робототехнике (да, угадали, пишу робота). Многого, конечно, ещё не реализовано, например, ещё продумываю понятие "статус системы" (возможно, надо будет веса статусов вводить, ещё чего-нибудь сейчас неочевидное и т.п.), ещё идут обдумки по механизму взаимодействия компонентов системы - работа только начата, собственно.

    Поэтому прошу воспринимать приложенное добро как справочный материал. Однако, тем не менее, рабочий - достаточно написать N модулей, которые можно связать между собой любыми типами событий - и система будет работать без единого delay и кучи кода в loop.

    Компилировал под версию IDE 1.6.7, код снабжён комментариями, в принципе - он простой, как тапок. Если кому будет полезен в плане обучения - буду рад. На вселенское знание и медаль "гуру" не претендую, лишь хочу поделиться опытом, при этом открыт для обоснованной критики ;)

    Дальнейшие разработки этого добра выкладывать, к сожалению, не планирую - проект на заказ, со всеми втекающими и вытекающими. Начальный этап - ни на что не влияет, как показывает практика: всё равно потом много чего добавится/удалится/изменится.

    Всем спасибо за проявленный интерес.
     

    Вложения:

    • Main.zip
      Размер файла:
      9,4 КБ
      Просмотров:
      188
    Alex19, AlexVS, ИгорьК и 3 другим нравится это.
  2. qwone

    qwone Гик

    А теперь осталось написать небольшой мануал для пользователя страниц на 100 и привести 10 примеров для использования. Сможите увлечь последователей, вы ведущий программист, задающий тон хотя бы в маленьком болоте. А если последователи потерялись, то каково бы не было ваше желание, толку от вашего проекта не будет. Кроме вас разумеется.
     
  3. DIYMan

    DIYMan Guest

    Я не ставлю перед собой такой цели ;) Тем более - увлекать кого-то куда-то.
     
  4. qwone

    qwone Гик

    Тогда зачем выкладывать на форум, если не увлекать. Иногда пригодится разжовывать буквально понятные вещи, да так что и сам нет нет да разберешься основательно.
    Код (C++):
    анекдот
    Разговор 2-х преподавателей:
    - Ну и группа мне в этом году попалась тупая!
    - А что так?
    - Представляешь себе, объясняю теорему - не понимают! Объясняю второй раз - не понимают!! В третий раз объясняю. Сам уже понял. А они не понимают...
     
  5. DIYMan

    DIYMan Guest

    Я вам чем-то обязан? Давайте я сам буду решать, чего мне выкладывать на форум, а чего - нет, ок?
     
  6. qwone

    qwone Гик

    Так решайте. По крайней мере у меня свой путь. Если я чего-то не пойму, то точно я это не буду использовать. А если чего мне не хватает, то если я не найду, то придумаю. Так что вы мне ничего не должны, тем более это что то не обязаны выкладывать.
     
  7. ostrov

    ostrov Гуру

    Спасибо за труд и публикацию, надо будет поковырять, может что то и заработает. )

    Но в чем то и оппонента понять можно, вот так взять и утащить в свой проект без описания сложновато будет. Даже камменты в коде мало помогут. Нужно время чтобы понять и перенять принцип, но кто то лучше потратит это время на создание своего принципа и подхода.
     
    DIYMan нравится это.
  8. Vad33

    Vad33 Капитан-оригинал

    Всегда полезно обмениваться опытом. Спс.

    Ну а халявщики и изобретатели велосипедов могут спокойно проходить мимо. :)
     
    ИгорьК и DIYMan нравится это.
  9. 9xA59kK

    9xA59kK Гик

    Сама идея отличная , пока автор присутствует на форуме хоть какая то обратная связь будет(надеюсь). И таких примеров бы побольше, без примеров все в разы труднее.
    Спасибо автору за труд и желание что то предоставить , поделиться опытом.
     
    DIYMan нравится это.
  10. DIYMan

    DIYMan Guest

    Конечно ;)
     
  11. AlexVS

    AlexVS Гик

    Спасибо. Посмотрим....., сейчас у меня как раз назрел "мониторинг инкубаторов", может чего полезного найду.
    ЗЫ с теплицей Вашей знаком.
     
    DIYMan нравится это.
  12. DIYMan

    DIYMan Guest

    Ещё недоделана :( Времени сейчас - ноль. Блин, там осталось допилить 1-Wire нормально, да SIM800 проверить, а всё никак.
     
  13. AlexVS

    AlexVS Гик

    Можно простой вопрос?
    Код (C++):
      // получаем интервал, прошедший с момента последнего вызова
      unsigned long curMillis = millis();
      uint16_t interval = curMillis - timeVal;
      timeVal = curMillis;
    Почему и для чего 1 переменная объявлена как unsigned long, а 2 - uint16_t ?
     
  14. DIYMan

    DIYMan Guest

    Потому что ожидается, что интервал между двумя вызовами функции Update не будет больше, чем 65 секунд :) Т.е. таких тормозов в системе быть не должно ;)
     
  15. AlexVS

    AlexVS Гик

    Понял, спасибо.