Перейти к содержанию

Организация меню на 1602, помогите разобраться с библиотекой


Рекомендуемые сообщения

Здравствуйте!

Есть такой макет (на фото), есть библиотека "micromenu-v2":
https://github.com/abcminiuser/micromenu-v2
есть другая версия этой же библиотеки с описанием на русском
http://easyelectronics.ru/organizaciya-drevovidnogo-menyu.html
есть мой код:
https://github.com/Andrew-Garage/menu
Одна задача опрашивает кнопки, другая работает с дисплеем. При нажатии кнопки посылается соответствующее сообщение в задачу управления экраном.

Объясните мне как работает эта библиотека, чтобы я смог сделать меню по образцу как на фото. У меня проблема с пониманием дефайна, с помощью которого создаются все пункты меню ("micromenu-v2/MicroMenu.h" строки 21-29 и 41-46).

строки 21-29:

    typedef const struct Menu_Item {
        const struct Menu_Item *Next; /**< Pointer to the next menu item of this menu item */
        const struct Menu_Item *Previous; /**< Pointer to the previous menu item of this menu item */
        const struct Menu_Item *Parent; /**< Pointer to the parent menu item of this menu item */
        const struct Menu_Item *Child; /**< Pointer to the child menu item of this menu item */
        void (*SelectCallback)(void); /**< Pointer to the optional menu-specific select callback of this menu item */
        void (*EnterCallback)(void); /**< Pointer to the optional menu-specific enter callback of this menu item */
        const char Text[]; /**< Menu item text to pass to the menu display callback function */
    } Menu_Item_t;

 

строки 41-46:
 

#define MENU_ITEM(Name, Next, Previous, Parent, Child, SelectFunc, EnterFunc, Text) \

extern Menu_Item_t MENU_ITEM_STORAGE Next; \

extern Menu_Item_t MENU_ITEM_STORAGE Previous; \

extern Menu_Item_t MENU_ITEM_STORAGE Parent; \

extern Menu_Item_t MENU_ITEM_STORAGE Child; \

Menu_Item_t MENU_ITEM_STORAGE Name = {&Next, &Previous, &Parent, &Child, SelectFunc, EnterFunc, Text}

Да, я не очень в программировании, только учусь, чур не бросаться учебником. А если можно переведите на "пальцы" что тут написано?)
Про первый блок:
1) Это определен тип данных структура Menu_Item... из структур этой же структуры Menu_Item?
2) void (*SelectCallback) (void) а это как понять?
3) Menu_Item_t зачем нужен? Почему нельзя обращаться через .Next или .Parent?
Про второй блок:
1) Почему нельзя обращаться через .Next или .Parent?
2) Как слово "Name" (последняя строка) может объединять все предыдущие определения? По ссылкам?
3) И что вообще за значения передаются в MENU_ITEM? Где я должен их определить?

MENU_ITEM_STORAGE это задефайненый PROGMEM.
extern означает, что переменная определена где-то еще (что бы это не значило).

меню.jpg

20230304_162326.jpg

Изменено пользователем Андрей Гараж
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Аккумуляторы INR21700 от EVE Energy со стандартной и увеличенной емкостью

В Компэл представлены аккумуляторы 21700 с емкостями 4000 мА⋅ч и 5000 мА⋅ч (INR21700-40P и INR21700-50E, соответственно). Аккумуляторы INR21700-50E характеризуются повышенной емкостью и предназначены для  устройств с длительным сроком службы. Для приложений, где требуется экстремальный ток разряда до 30 или 50 А, подойдет аккумулятор INR21700-40P. Аккумуляторы INR21700 предназначены для  электротранспорта, а также для промышленных и бытовых приложений. Подробнее>>

 

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

16 часов назад, Андрей Гараж сказал:

1) Это определен тип данных структура Menu_Item... из структур этой же структуры Menu_Item?

2) void (*SelectCallback) (void) а это как понять?
3) Menu_Item_t зачем нужен? Почему нельзя обращаться через .Next или .Parent?

Тип данных Menu_Item_t, им описана одна строка меню, состоит из 4-х указателей на начала таких же данных: *Next, *Previous, *Parent, *Child.

2-х указателей: void (*SelectCallback)(void) и  void (*EnterCallback)(void) на функции SelectCallback(void) и EnterCallback(void) соответственно, чтобы можно было вызвать функцию по указателю.

и const char Text[].

Будешь обращаться например Menu_Item_t*  Menu1 =  Menu->Next

Или вызывать функцию  Menu1->EnterCallback()

Может быть несколько окон меню, в каждом окне по несколько строк меню. Next - следующая строка окна, Previous - предыдущая, Parent - предыдущее окно, Child - окно которое нужно вызвать для текущей строки, если оно есть.

  

16 часов назад, Андрей Гараж сказал:

Про второй блок:

Вызывая функцию например MENU_ITEM(Menu_1, Menu_2, Menu_3, NULL_MENU, Menu_1_1 , Level1Item1_Select, Level1Item1_Enter, "1"); создается строка меню

Menu_Item_t MENU_ITEM_STORAGE  Menu_1/*Name*/ = {Menu_2/*&Next*/, Menu_3/*&Previous*/, NULL_MENU/*&Parent*/, Menu_1_1/*&Child*/, Level1Item1_Select/*SelectFunc*/, Level1Item1_Enter/*EnterFunc*/, "1"/*Text*/}. 

Menu_1 - это будет имя этой строки окна меню, Menu_2 - имя следующей строки (Next) этого окна, Menu_3 - имя предыдущей строки (Previous) этого окна, NULL_MENU - нет уровня выше (Parent), Menu_1_1 - имя первой строки следующего окна меню  (Child),  Level1Item1_Select и Level1Item1_Enter - функции, "1" - текст стоки меню.

Сколько нужно строк (окон), для каждой из них нужно вызвать MENU_ITEM

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо за ответ. Оказалось так глубоко копать не надо.
Внес изменения в библиотеку "micromenu-v2" как на скринах. Удалил все, что связано с PROGMEM, и связанными с ней командами ("pgm_read_blablabla"). После этого сделал двухуровневое меню за полчаса. Видимо для ESP32 это работает только так, несмотря на то, что она понимает команды PROGMEM. Может проблема в разрядности "word"? Для AVR и ESP32 они 1 и 4 байта соответственно.
Правда #include "MicroMenu.h"  в теле скетча не работает, ошибки: undefined reference to `Menu_SetGenericWriteCallback(void (*)(char const*))'

Если сделать так,

extern "C"

{

#include "MicroMenu.h"

}

то все норм. Я не знаю почему так, но надеюсь кому-то пригодится.

1693456530_2.JPG.dfe02cb8cc673f2f9f08fa0ec2c2fb13.JPG

875584253_.JPG.8e70a16a12589c9afd89dda03a2a939d.JPG

Ссылка на комментарий
Поделиться на другие сайты

Помехоподавляющие пленочные конденсаторы Hongfa для бытовых и промышленных сетей

Компания Hongfa - один из лидеров азиатского рынка пленочных конденсаторов с полным циклом производства. Она выпускает пять серий помехоподавляющих конденсаторов этого типа как для бытовой, так и для трехфазной промышленной сети, а также для автомобильного применения. Продукция компании по ассортименту, параметрам и количеству серий конденсаторов ЭМП не уступает другим крупным производителям этого сегмента и может легко заменить ассортимент ушедших из РФ брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Ну вот! Походу, и на одном из левшиных гвоздиков выбиты Ваши пасортные данные, насмотря на пальцы-сосиски. Тут главно на дело рук своих смотреть вооружённым взглядом..., и можно будет увидеть "- ... пять звёздочек". С уважением, Сергей  
    • В китайском блоке питания? Обычно и заявленная мощность под вопросом.
    • Все подобные ЛБП, кроме выставленных параметров (напряжение и ток), характеризуются еще режимом работы: "CV" и "CC". Постоянное напряжение и постоянный ток соответственно. Эти режимы взаимно исключают друг друга. И всё происходит по закону дедушки Ома. Выставили напряжение 5 В, ток ограничения 2 А. Пока сопротивление нагрузки > 2,5 Ом источник находится в режиме постоянного напряжения (CV), и да, можно сказать, стабилизатор тока не работает. Подключили резистор 1 Ом, ток в цепи будет 2 А, как и был выставлен. Режим постоянного тока (СС). Но заметьте, напряжение при этом будет 2 В, а не 5 В как было установлено изначально. Получаем не работающий стабилизатор напряжения в этот момент времени.
    • Предположим подключена клавиатура 5х5. Инициализация пинов проведена. Необходимо поочередно устанавливать 1 на пинах с out0 по out4 и каждый раз считывать с in0 - in4 информацию. Данные действия проще проводить циклом.
    • Повышаешь выходное напряжение, снижается выходной ток, мощность то выходная остаётся прежней. Запас по мощности наверное есть, но какой и долго ли он проработает, вопрос.
    • Шоб нет - так-и да. Есть у меня лично и "мелкоскоп илекстрисский". Не часто но его пользую.
    • Тогда в магазин за втулочками.  Идти в магазин ради одной использованой втулочки нет смысла. (Тут подойдёт и пишущий узел от стержня (когда пистонов не было в продаже и в помине, у всего класса собирал пустые стержни...)) Как нет смысла допиливать  полсотни строительных  наконечников под требуемое количество втулок. Как там в киноклассике (кф Особенности национальной охоты) : " - Жить захочешь (Жизнь заставит), не так раскорячишься!!" Ох-хо-хо!!? Это Вы ещё под микроскопом с электроникой не работали!! Левша со своими гвоздиками для блошиных подковок может нервно курить в сторонке, потому как на шляпках евойных гвоздиков будут выбиты  фамилия и инициалы какого нибудь радиолюбителя. С уважением, Сергей
×
×
  • Создать...