LCD CX65 и организация меню

Подключение разных дисплейчиков
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

LCD CX65 и организация меню

Сообщение Arcanum »

Заимел 5 штук дисплеев cx65. таки освоил как его подключать и даже вывел тестовую программу. и даже связал всё это удовольствие с RTOS
теперь у меня на него грандиозные планы: хочу сделать меню древовидной структуры.
то есть как в телефоне список пунктов и подпунктов и изменение параметров .
клавиатура 4х4 на тактовых кнопках (будет второй вариант на основе capsens, но это дело ближнего будущего).

конкретно сейчас промежуточный отчёт о достигнутом.
что сейчас могёт код:
инициализировать дисплей.
вывести 10 строк на дисплей.
по приёму символов "2" и "8" через UART двигать курсор по этим 10 строкам упираясь в "край" экрана.
каждое движение курсора - перерисовывание текущих 10 строк заново с инверсией цвета фона и шрифта при текущем положении курсора.
сейчас затык длиной в неделю(с перерывом на работу и отмечание др) на таком моменте:
как быть если элементов меню больше чем 10 строк что может показать экран? на ум приходит только "страницы"
то есть отображаются на первой странице элементы от 0 до 9, на вротой странице 10-19 и так далее...
в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.
активно подглядываю в код автора сей статьи - http://geektimes.ru/post/255020/ но там так всё замудрено что только повесится. конечно автор молодец и иногда помогает советом. но только в крайнем случае.
кто может подсказать как сделать или в какую сторону рыть??
полная тема http://forum.easyelectronics.ru/viewtop ... 56&t=23957
Вложения
Clock_2_LCD_IR_RTOS_V2.7z
(55.55 КБ) 486 скачиваний
Аватара пользователя
Fahivec
писатель, читатель
писатель, читатель
Сообщения: 121
Зарегистрирован: 30 дек 2014, 02:17
Откуда: Из-за речки

Re: LCD CX65 и организация меню

Сообщение Fahivec »

Arcanum писал(а):в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.
Ну и где же тут "дикая" математика? Деление чисел, это все таже старая добрая арифметика.
А в вашем случае дикости быть совершенно не должно, вы же пишете код не на ассемблере :lol:

При движении курсора совершенно незачем перерисовывать все 10 строк. Достаточно перерисовать только две: предыдущий и последующий пункты меню.
Что касается страниц - это, наверное, самый простой вариант. Можно еще представить меню, как единый многострочечный текст, а на экран выводить только часть текста вокруг активного пункта меню. Тогда - да, придется весь экран "перерисовывать".
Там в easyelectronics есть же уже статьи и темы в форуме, плюс достаточно много ссылок.

Я свои менюшки писал на ассемблере исходя из разъяснений в указанных темах и могу однозначно заявить: управление меню и его отображение действительно не совсем простая задача (а для тех, кто с ними только начинает - совсем не простая!) и места в коде занимет много.

Но задача эта решаема!
Тест пройден! :geek:
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: LCD CX65 и организация меню

Сообщение Arcanum »

Fahivec писал(а):
Arcanum писал(а):в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.
Ну и где же тут "дикая" математика? Деление чисел, это все таже старая добрая арифметика.
А в вашем случае дикости быть совершенно не должно, вы же пишете код не на ассемблере :lol:

При движении курсора совершенно незачем перерисовывать все 10 строк. Достаточно перерисовать только две: предыдущий и последующий пункты меню.
Что касается страниц - это, наверное, самый простой вариант. Можно еще представить меню, как единый многострочечный текст, а на экран выводить только часть текста вокруг активного пункта меню. Тогда - да, придется весь экран "перерисовывать".
Там в easyelectronics есть же уже статьи и темы в форуме, плюс достаточно много ссылок.

Я свои менюшки писал на ассемблере исходя из разъяснений в указанных темах и могу однозначно заявить: управление меню и его отображение действительно не совсем простая задача (а для тех, кто с ними только начинает - совсем не простая!) и места в коде занимет много.

Но задача эта решаема!
а будьте добры представить пример сей арифметики и примерного алгоритма, пожалуйста.
Аватара пользователя
Fahivec
писатель, читатель
писатель, читатель
Сообщения: 121
Зарегистрирован: 30 дек 2014, 02:17
Откуда: Из-за речки

Re: LCD CX65 и организация меню

Сообщение Fahivec »

Я понимаю ваш сарказм :)
Пример алгоритма приводить не буду, зачем повторять то, что описано в оговоренных выше источниках?

Что касается арифметики, тут действительно нет сложностей для программирования на Си и прочих высокоуровневых языках. А при использовании готовых мат.библиотек - и на ассемблере.

Вот вы предполагали использовать страничное меню. Попробую с ним.
Количество элементов (пунктов) есть константа. Пусть ей будет присвоено имя Menu_max.
Количество страниц будет зависеть от заданного размера меню и является тоже константой. Назовем ее Page_max.
Как они между собой связаны, понятно - делением на 10, т.е. на кол-во отображаемых элементов меню.
Значит: Page_max = целое от (Menu_max/10) + 1 (округление в большую сторону). Это вычисление произойдет однажды при компиляции, поскольку описано в определениях. Здесь и далее предполагаем, что нулевых значений не будет, поэтому + 1.

Номер текущей (отображаемой) страницы есть переменная, назовем ее Page_Nr.
Текущий (выбранный) элемент меню тоже переменная. Присвоим ей имя Menu_Nr.
Еще понадобится переменная - указатель на номер строки в текущей странице меню. Пусть ее имя будет Menu_P
Вот для корректного отображения вам и понадобятся вычисления этих переменных, сводящиеся к следующему:
Page_Nr = целое от (Menu_Nr/10) + 1
Menu_P = Menu_Nr - Page_Nr
А с какого элемента начинается отображаемая страница, тоже просто: Page_Nr х 10 - 9
:)
С Новым Годом!
Тест пройден! :geek:
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: LCD CX65 и организация меню

Сообщение Arcanum »

количество элементов не статично.

думаю как сделать процедуру прорисовки n строк на экран (экраны разные могут быть + изменяемый размер шрифта) если количество элементов меню больше n.
на выходе должна получится процедура у которой будут входные параметры: n,m, курсор_позиция, строки для отображения.

это нужно для отображения не только элементов корневого меню, но и отобраажения "папок", приложений и строк конфигурации. что-то примерно как на видео в статье на гиктаймс
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: LCD CX65 и организация меню

Сообщение Arcanum »

Fahivec писал(а): Количество элементов (пунктов) есть константа. Пусть ей будет присвоено имя Menu_max.
Количество страниц будет зависеть от заданного размера меню и является тоже константой. Назовем ее Page_max.
Как они между собой связаны, понятно - делением на 10, т.е. на кол-во отображаемых элементов меню.
Значит: Page_max = целое от (Menu_max/10) + 1 (округление в большую сторону). Это вычисление произойдет однажды при компиляции, поскольку описано в определениях. Здесь и далее предполагаем, что нулевых значений не будет, поэтому + 1.

Номер текущей (отображаемой) страницы есть переменная, назовем ее Page_Nr.
Текущий (выбранный) элемент меню тоже переменная. Присвоим ей имя Menu_Nr.
Еще понадобится переменная - указатель на номер строки в текущей странице меню. Пусть ее имя будет Menu_P
Вот для корректного отображения вам и понадобятся вычисления этих переменных, сводящиеся к следующему:
Page_Nr = целое от (Menu_Nr/10) + 1
Menu_P = Menu_Nr - Page_Nr
А с какого элемента начинается отображаемая страница, тоже просто: Page_Nr х 10 - 9
с арифметикой разобрался. единственный вопрос который мешает приступить к реализации - как быть с последней страницей если она не заполнена до конца? допустим страниц пять,на четырёх по 12(10,8 какая разница - пробую написать "универсальное меню" ) элементов, а на пятой только 7.
цикл прорисовки строк на экран без проблем заполнит от 0 до СТРОК_НА_ЭКРАН. но как быть в этом случае?
ещё вопрос:
Page_Nr х 10 - 9
с этим всё прекрасно! именно это я искал и над этим думал (видимо плохо я думал). но что делать если строк на экран не 10, а 12 или и вовсе 4?
пишу и понимаю что дурак. можно просто поступить:
Page_Nr х 10 - 9 = Page_Nr х N - (N-1)
и Вас с Наступившим!
Аватара пользователя
Fahivec
писатель, читатель
писатель, читатель
Сообщения: 121
Зарегистрирован: 30 дек 2014, 02:17
Откуда: Из-за речки

Re: LCD CX65 и организация меню

Сообщение Fahivec »

Я выше оговорился:
..предполагаем, что нулевых значений не будет, поэтому + 1.
Если же принять, что (нумерация вагонов...) нумерация пунктов и страниц меню начинается с нуля (что очень даже логично), то арифметика упрощается на это самое "+ 1" и в конце " - 9".

Я, кстати, допустил ошибку в Menu_P = Menu_Nr - Page_Nr. Получается, что для 15-го пункта и второй страницы (к примеру) номер отображаемой строчки будет равен 13 !
Поэтому должно быть: Menu_P = Menu_Nr - (Page_Nr х 10)
как быть с последней страницей если она не заполнена до конца?
Перед прорисовкой очистить экран.
Тест пройден! :geek:
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: LCD CX65 и организация меню

Сообщение Arcanum »

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

Код: Выделить всё

#define TEXT_ROW_DISP 10			// количество строк на экране в длину. для меню. не более длины экрана в пикселях делёное на длину символа в пикселях.  176/14=12

#define MENU_STRINGS 23			// общее количество строк в меню. для меню


 uint8_t MENU_Pages_All = (MENU_STRINGS/TEXT_ROW_DISP);											// общее количество страниц	
 uint8_t MENU_Page_Current = (_CursorAbs/TEXT_ROW_DISP);										// текущая страница
 uint8_t MENU_String_TOP = (MENU_Page_Current*(TEXT_ROW_DISP-(TEXT_ROW_DISP-1)));				// начальный эемент прорисовки строк меню на текущей странице
 uint8_t MENU_Page_Current_Cursor_Position = _CursorAbs - (MENU_Page_Current*TEXT_ROW_DISP);	// позиция курсора на текущей странице
 
все эти переменные в теле одной функции. меню не статично, и даже параметр MENU_STRINGS будет динамичным. пока я вникаю и сделал так как есть.
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: LCD CX65 и организация меню

Сообщение Arcanum »

конечный вид вычисления переменных который заработал:

Код: Выделить всё

 
 uint8_t MENU_Pages_All = (MENU_STRINGS/TEXT_ROW_DISP);											// общее количество страниц	
 uint8_t MENU_Page_Current = (_CursorAbs/TEXT_ROW_DISP);										// текущая страница
 uint8_t MENU_String_TOP = (MENU_Page_Current*TEXT_ROW_DISP);				// начальный эемент прорисовки строк меню на текущей странице
 uint8_t MENU_Page_Current_Cursor_Position = _CursorAbs - (MENU_Page_Current*TEXT_ROW_DISP);	// позиция курсора на текущей странице
 
что-то сам додумал но за наводку спасибо!
с задачей прорисоки и навигации меню разобрались.
следующая задача:
натянуть структуру "файлов" как в статье http://geektimes.ru/post/255020/
видео о том как работет в конце статьи
Arcanum
Читатель
Читатель
Сообщения: 32
Зарегистрирован: 04 окт 2015, 19:43

Re: LCD CX65 и организация меню

Сообщение Arcanum »

нус... очередной промежуточный отчёт!
что есть сейчас и какие проблемы
есть сейчас:
1) страницы. если пунктов меню в два/три/n раз больше чем может отобразить экран то цикл прорисовки сам сориентируется и выведет курсор на нужной странице.
2) навигация по страницам. прикрутил дополнительно перелистиывание страниц по кнопкам вправо/влево (6/4). каждый раз при перелистывании курсор становится на первый пункт меню текущей страниц.
проблема:пример. 35 пунктов меню. 4 страницы соответственно. цикл рисует от 0 до 10 строк на экране. каждый раз строки перерисвоваются. но! на последней страницы рисуются только 5 строк из 10. то есть 5 элементов четвёртой страницы нарисовались но при этом нижние пять элементов предыдущей страницы остались и видны. было озвучено предложение очищать экран каждый раз перед отрисовкой строк. но это приводит к тому что экран очень неприятно моргает.
как быть господа?

форумы собсуждения этой темы
http://forum.easyelectronics.ru/viewtop ... 4491dfddf8
http://www.radiohlam.ru/forum/viewtopic.php?f=5&t=3537
http://forum.cxem.net/index.php?showtopic=157723&hl=
http://electronix.ru/forum/index.php?sh ... &p=1393328&
Вложения
Clock_2_LCD_IR_RTOS_V2.7z
(57.73 КБ) 463 скачивания
Последний раз редактировалось Arcanum 06 янв 2016, 10:53, всего редактировалось 1 раз.
Ответить