KillSwitchDuino - добавил полнофункциональное меню аля ESC

Ссылка на проект
github.com/NailAlex/KillSwitchDuino

Наконец то написал меню так как хотелось - чтобы ветвистость и количество пунктов можно было конструировать в коде просто и быстро.

В меню можно попасть 3 раза жмакнув вниз тумблером(нормальное состояние тумблера принято за верхнее тобишь зажигание ВКЛ) в течении первых 5 секунд после инициации(свитч пискнет соответствующим звуком по тому положению какое имеет тумблер). Можно конечно добавить какое-нибудь музло после включения как во всех ESC сделано - это совсем не проблема 😁

После входа проиграется 5 нотная мелодия главного меню где будут доступны 5 пунктов(1-5 коротких пиков) куда можно попасть переключением вниз после проигрывания морзянки пункта. При входе во все подменю проигрывается 2 или 3 нотная мелодия. Все подменю:

  • подменю калибровки канала RX
  • подменю выбора типа батареи(LiFE/LiPO)
  • подменю включения функции выключения зажигания если пропал сигнал RX (или остается по предыдущему состоянию)
  • подменю сброса конфигурации на значения по умолчанию
  • выход в нормальный режим

В каждом подменю последний пункт - выход наверх без изменений. Из-за этого любое собственное меню не должно иметь менее 2 пунктов.

Функция выключения зажигания если пропал сигнал RX пока еще не допилена, так как тут надо немного подумать над дебагом и визуализацией. Чуть позже допилю.

В коде, реализация меню сделана блочно-независимо через переменную SystemMode и отдельные процедуры для каждого субменю. Скетч не крутится в этой процедуре до выхода, а проходит ее насквозь возвращаясь в главный цикл и проходя все по кругу. Таким образом получилось рендерить текущие шаги в Serial, нормально видеть навигацию, а также очень просто добавлять пункты и функционал к ним. Выбор пункта меню произведется если пользователь жмакнул на тумблер в течение 3 секунд после проигрывания морзянки текущего пункта. Для этого меню имеет собственный программный обработчик факта нажатий, число которых он забирает из обработчика прерывания.

Калибровка замысловатая вышла, но иначе было никак - отработка процедуры один раз давала бредовые значения считанной длины импульса PPM сигнала. Херня в общем выходила. Потому калибровка реализована также со сквозным проходом Main Loop-а и несколькими стадиями с циклическим считыванием на стадии когда соответствующая фаза. Можно там считать сумму и среднее арифметическое вычислять для надежности показаний - но так тоже работает, а лучше максимальное значение получать и его присваивать потом, так еще надежней. Суть калибровки - получить значение PPMSwitchLevel конкретно для текущего генератора PPM сигнала(приемника). Если у него(приемника) дефолтный диапазон 1000-2000мкс, то считаются именно эти длины и граница переключения получится 1500мс(всегда считается центр между мин-максом), если будет какой то приемник с расширенным диапазоном сигнала 800-2200, то выйдет те же 1500, а вот если канал какой то несимметричный(бывают всякие извращения) то граница будет по центру между этими извращенными мин-максами.

Переключение типа батареи идет на лету, соответственно все границы Level1 и Level2 меняются после выбора типа батареи. В связи с этим надо быть аккуратным если переключать c LiFE на LiPO при подключенной батарейке LiFE - может сработать вольт защита(софт или Имперский марш) по выходу из меню в нормальный режим.

Таким образом меню получается простым в освоении и расширении по необходимости.

ТЕСТОВЫЕ ЗНАЧЕНИЕ Level1 в 6.6В по LiFe по прежнему активны пока девайс в стадии отладки.

Начинаю травить пару плат, и ваять девайсы себе на парателегу и коллеге на самолет, а то в выходные уже хочется полетать с электронными ништяками 😁

  • 1244