micromenu-v2

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: micromenu-v2

Сообщение ARV »

я одного понять не могу: зачем sprintf, если формат %s? можно же сразу вывести строку при помощи lcd_str_out...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: micromenu-v2

Сообщение Dimon456 »

Не знаю как у вас там все реализовано, отсюда не видно.

Где-то так надо:

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

Объявляете
Menu_Item_t* menu = &NULL_MENU;

получаете позицию пункта меню
menu = Menu_GetCurrentMenu();

и выводите на экран
lcd_clear();
lcd_gotoxy(0,0);   
lcd_str_out(menu->Text);
Реклама
Land
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Re: micromenu-v2

Сообщение Land »

[uquote="ARV",url="/forum/viewtopic.php?p=4208253#p4208253"]я одного понять не могу: зачем sprintf, если формат %s? можно же сразу вывести строку при помощи lcd_str_out...[/uquote]
Каким образом? lcd_str_out(Text) выдает ту же хрень. Может быть эта хрень реально и лежит по адресу... Как бы это проверить?

Добавлено after 3 minutes 1 second:
[uquote="Dimon456",url="/forum/viewtopic.php?p=4208337#p4208337"]lcd_str_out(menu->Text);[/code][/uquote]
я не очень понял, что это за конструкция. Компилятор ругается Error invalid type argument of '->' (have 'int')
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: micromenu-v2

Сообщение Карбофос »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4208337#p4208337"]

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

lcd_str_out(menu->Text);
[/uquote]

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

const char* ptr = menu->Text;
while(char c = pgm_read_byte(ptr++))
  putc(c);
Разные области памяти.
Последний раз редактировалось Карбофос Сб апр 02, 2022 17:06:47, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: micromenu-v2

Сообщение Dimon456 »

Выложите свой проект вместе с протеусом, в архив zip и сюда.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: micromenu-v2

Сообщение ARV »

если у вас текст меню хранится в flash, то для sprintf надо формат %S использовать, а не %s
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Land
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Re: micromenu-v2

Сообщение Land »

ARV, вам очередное спасибо. В таком виде:

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

static void Generic_Write(const char* Text)
{
	if (Text)		
		lcd_clear();		
		sprintf(string_M, "%S", Text);
		lcd_gotoxy(0,0);	
		lcd_str_out(string_M);
}
заработало. А прямой вывод через lcd_str_out -- ни в какую.
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: micromenu-v2

Сообщение Карбофос »

[uquote="Land",url="/forum/viewtopic.php?p=4208414#p4208414"]ARV, вам очередное спасибо[/uquote]
Да ты, сначала, научись правильно говорить "спасибо".
Видишь под именем автора поста "+" - так нажми его, придурок.
Land
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Re: micromenu-v2

Сообщение Land »

[uquote="Карбофос",url="/forum/viewtopic.php?p=4208423#p4208423"]Видишь под именем автора поста "+" - так нажми его, придурок.[/uquote]
иди по маршруту корабля.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: micromenu-v2

Сообщение Dimon456 »

Карбофос, за плюсики работаешь?
Ну так, держи тебе плюс.
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: micromenu-v2

Сообщение Карбофос »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4208436#p4208436"]Карбофос, за плюсики работаешь?
Ну так, держи тебе плюс.[/uquote]
1. я не работаю.
2. где "плюс"?
3.
Land писал(а):[uquote="Карбофос",url="/forum/viewtopic.php?p=4208423#p4208423"]Видишь под именем автора поста "+" - так нажми его, придурок.[/uquote]
иди по маршруту корабля.
Ты сюда ещё придешь.
Изображение
Вложения
1.png
(21.45 КБ) 581 скачивание
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: micromenu-v2

Сообщение Dimon456 »

Карбофос писал(а):2. где "плюс"?
У мну не доступна эта "функция", не могу не плюс не минус поставить.
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: micromenu-v2

Сообщение Карбофос »

Dimon456, вы очень хороший специалист. Это моё мнение о Вас.
Пожалуйста, не держите на меня зла.

Добавлено after 35 minutes 42 seconds:
[uquote="Land",url="/forum/viewtopic.php?p=4208435#p4208435"]иди по маршруту корабля.[/uquote]
У меня есть встречное предложение.
Вы на хуй давно ходили?

Независимо от вашего ответа, у читателей форума уже должно сложиться представление о вас.
Просто придурок.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: micromenu-v2

Сообщение Demiurg »

Карбофос, вы соответствуете своему нику? Если в че, я про токсичность. Весенне-осеннее обострение? Лишний грамм в мозг упал? Что ругаешься?
Land
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Re: micromenu-v2

Сообщение Land »

Карбофос идет означенным курсом. У нормальных прошу помощи продолжить разбираться с меню.
Собственно вот в таком виде у меня сейчас выглядит файл MicroMenu.c
Спойлер

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

#ifndef LIBRARY
	#define LIBRARY
		#include "define.h"
		#include "stdio.h"
		#include "globals.h"
		#include "axlib/type_var.h"
		#include "MicroMenu.h"
		#include "Menu_def_func.h"

#endif

	#define BUTTON_UP_STATE		(PIND & (1<<PD6))
	#define BUTTON_DOWN_STATE	(PINB & (1<<PB1))
	#define BUTTON_LEFT_STATE	(PIND & (1<<PD7))
	#define BUTTON_RIGHT_STATE	(PINB & (1<<PB0))

	
	uint8_t BUTTON;
	char string_M[14] = {0};


/** This is used when an invalid menu handle is required in
 *  a \ref MENU_ITEM() definition, i.e. to indicate that a
 *  menu has no linked parent, child, next or previous entry.
 */
Menu_Item_t PROGMEM NULL_MENU = {0};

/** \internal
 *  Указатель на общую функцию отображения текста меню
 * обратный вызов, для отображения настроенного текста пункта меню
 * если не задана функция отображения, специфичная для меню
 * в пункте меню выбора.
 */
static void (*MenuWriteFunc)(const char* Text) = NULL;

/** \internal
 *  Указатель на текущий выбранный пункт меню.
 */
static Menu_Item_t* CurrentMenuItem = &NULL_MENU;


Menu_Item_t* Menu_GetCurrentMenu(void)
{
	return CurrentMenuItem;
}

void Menu_Navigate(Menu_Item_t* const NewMenu)
{
	if ((NewMenu == &NULL_MENU) || (NewMenu == NULL))
		return;

	CurrentMenuItem = NewMenu;

	if (MenuWriteFunc)
		MenuWriteFunc(CurrentMenuItem->Text);

	void (*SelectCallback)(void) = MENU_ITEM_READ_POINTER(&CurrentMenuItem->SelectCallback);

	if (SelectCallback)
		SelectCallback();
}

void Menu_SetGenericWriteCallback(void (*WriteFunc)(const char* Text))
{
	MenuWriteFunc = WriteFunc;
	Menu_Navigate(CurrentMenuItem);
}

void Menu_EnterCurrentItem(void)
{
	if ((CurrentMenuItem == &NULL_MENU) || (CurrentMenuItem == NULL))
		return;

	void (*EnterCallback)(void) = MENU_ITEM_READ_POINTER(&CurrentMenuItem->EnterCallback);

	if (EnterCallback)
		EnterCallback();
}

extern enum ButtonValues
{
	BUTTON_NONE,
	BUTTON_UP,
	BUTTON_DOWN,
	BUTTON_LEFT,
	BUTTON_RIGHT
};

enum ButtonValues GetButtonPress(void)
{
	skan_key();
	return BUTTON;
}
/*** END DUMY CODE ***/

/** Generic function to write the text of a menu.
 *
 *  \param[in] Text   Text of the selected menu to write, in \ref MENU_ITEM_STORAGE memory space*/
 
static void Generic_Write(const char* Text)
{
	if (Text)		
		lcd_clear();		
		sprintf(string_M, "%S", Text);
		lcd_gotoxy(0,0);	
		lcd_str_out(string_M);
}
//			NAME	NEXT(DOWN)	PREVIOS(UP)	   PARENT(LEFT)	CHILD(RIGHT)	SELECT				ENTER				TEXT:
MENU_ITEM(	Menu_1,		Menu_2,		Menu_6,		NULL_MENU,	Menu_1_1,	NULL				  , NULL			 , "SET_DATE");
MENU_ITEM(	Menu_2,		Menu_3,		Menu_1,		NULL_MENU,	Menu_2_1,	NULL	              , NULL             , "SET_TIME");
MENU_ITEM(	Menu_3,		Menu_4,		Menu_2,		NULL_MENU,	Menu_3_1,	NULL	              , NULL             , "SET_OPEN");
MENU_ITEM(	Menu_4,		Menu_5,		Menu_3,		NULL_MENU,	Menu_4_1,	NULL	              , NULL             , "SET_CLOSE");
MENU_ITEM(	Menu_5,		Menu_6,		Menu_4,		NULL_MENU,	Menu_5_1,	NULL	              , NULL             , "SET_TEMPR");
MENU_ITEM(	Menu_6,		Menu_1,		Menu_5,		NULL_MENU,	Menu_6_1,	NULL	              , NULL             , "SET_BRIGHTNES");


MENU_ITEM(	Menu_1_1,	NULL_MENU,	NULL_MENU,	Menu_1,		Menu_1_2,	day_of_month_Select	, day_of_month_Enter, "DAY_OF_MONTH");
MENU_ITEM(	Menu_1_2,	NULL_MENU,	NULL_MENU,	Menu_1_1,	Menu_1_3,	month_Select		, month_Enter		, "MONTH");
MENU_ITEM(	Menu_1_3,	NULL_MENU,	NULL_MENU,	Menu_1_2,	Menu_1_4,	year_Select			, year_Enter		, "YEAR");
MENU_ITEM(	Menu_1_4,	NULL_MENU,	NULL_MENU,	Menu_1_3,	Menu_1,		day_Select			, day_Enter			, "DAY");
MENU_ITEM(	Menu_1_5,	NULL_MENU,	NULL_MENU,	Menu_1_4,	NULL_MENU,	save				, NULL				, "SAVE");

MENU_ITEM(	Menu_2_1,	NULL_MENU,	NULL_MENU,	Menu_2,		Menu_1_2,	hours_Select		, hours_Enter		, "HOURS");
MENU_ITEM(	Menu_2_2,	NULL_MENU,	NULL_MENU,	Menu_2_1,	Menu_2,		minutes_Select		, minutes_Enter		, "MINUTES");
MENU_ITEM(	Menu_2_3,	NULL_MENU,	NULL_MENU,	Menu_2_2,	NULL_MENU,	save				, NULL				, "SAVE");

MENU_ITEM(	Menu_3_1,	NULL_MENU,	NULL_MENU,	Menu_3,		Menu_3_2,	open_hours_Select	, open_hours_Enter	, "OPEN_HOURS");
MENU_ITEM(	Menu_3_2,	NULL_MENU,	NULL_MENU,	Menu_3_1,	Menu_3,		open_minutes_Select	, open_minutes_Enter, "OPEN_MINUTES");
MENU_ITEM(	Menu_3_3,	NULL_MENU,	NULL_MENU,	Menu_3_2,	NULL_MENU,	save				, NULL				, "SAVE");

MENU_ITEM(	Menu_4_1,	NULL_MENU,	NULL_MENU,	Menu_4,		Menu_4_2,	close_hours_Select	, close_hours_Enter	, "CLOSE_HOURS");
MENU_ITEM(	Menu_4_2,	NULL_MENU,	NULL_MENU,	Menu_4_1,	Menu_4,		close_minutes_Select, close_minutes_Enter, "CLOSE_MINUTE");
MENU_ITEM(	Menu_4_3,	NULL_MENU,	NULL_MENU,	Menu_4_2,	NULL_MENU,	save				, NULL				, "SAVE");

MENU_ITEM(	Menu_5_1,	NULL_MENU,	NULL_MENU,	Menu_5,		Menu_5,		degress_Select		, degress_Enter		, "DEGRESS_C");
MENU_ITEM(	Menu_5_2,	NULL_MENU,	NULL_MENU,	Menu_5_1,	NULL_MENU,	save				, NULL				, "SAVE");

MENU_ITEM(	Menu_6_1,	NULL_MENU,	NULL_MENU,	Menu_6,		Menu_6,		brightnes_Select	, brightnes_Enter	, "BRIGHTNES");
MENU_ITEM(	Menu_6_2,	NULL_MENU,	NULL_MENU,	Menu_6_1,	NULL_MENU,	save				, NULL				, "SAVE");



void menu_RUN(void)
{		
	Menu_SetGenericWriteCallback(Generic_Write);
	Menu_Navigate(&Menu_1);

	switch (GetButtonPress())
		{
			case BUTTON_UP:
			Menu_Navigate(MENU_PREVIOUS);
			break;
			case BUTTON_DOWN:
			Menu_Navigate(MENU_NEXT);
			break;
			case BUTTON_LEFT:
			Menu_Navigate(MENU_PARENT);
			break;
			case BUTTON_RIGHT:
			Menu_Navigate(MENU_CHILD);
			break;
			default:
			break;
		}
	//return 0;
}
в main.c я по прерыванию с кнопки вызываю функцию menu_RUN() в MicroMenu.c.

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

if((flag_BUTTON)|(flag_BUTTON_TICK))	
			{
				LCD_backlight_ON; 
				flag_BUTTON = _OFF;
				flag_BUTTON_TICK = _OFF;
				seconds = 0;
				flag_WAIT = _ON;
				menu_RUN();
			} else;
Если я понимаю правильно, дальше идет обращение за значением кнопки в функцию

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

enum ButtonValues GetButtonPress(void)
{
	skan_key();
	return BUTTON;
}
которая обращается к обработчику собственно кнопок skan_key(), из которого и получает значение нажатой кнопки. Вопрос собственно в том, правильно ли я понимаю последовательность необходимых событий? Потому, что у меня получается при первом же обращении к menu_RUN() я получаю вывод элемента меню, а затем из обработчика кнопок возвращается значение нажатой кнопки. И я понимаю, что не понимаю. Или мне надо сначала получить код нажатой кнопки, а уже потом вызывать обработку меню? Но все равно сначала произойдет обращение к Menu_1, а затем в swith будет выбран переход по кнопке :dont_know:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: micromenu-v2

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

Re: micromenu-v2

Сообщение НовыйДень »

Пасаны, зачем ругаетесь? :)
На деле, чтобы понять работу механизма менюшки, надо изучить в языке Си тему про указатели и массив указателей и указатели на функции. И после этого все премудрсти раскроются.
Менюшки как обычно делаются то. Для кнопок создается массив указателей на функции, реализующие действия по нажатиям. И в зависимости от текущего режима меню каждой кнопке присваивается определенный указатель на исполняемую функцию. Навигация по пунктам менюшки - это одна группа указателей. Изменение параметра в пункте менюшки - другая группа указателей.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: micromenu-v2

Сообщение Demiurg »

To Land. MicroMenu это структура данных. За счёт макросов стало проще создавать развитое меню. Не более. Не менее.
Дальше идёт организация программных модулей. Взаимосвязи. Пусть у нас дисплей. Кнопочки. Ну и что то там делать. Давай посмотрим на программу как на конечный автомат. С подчинёнными КА.

Main:
Proc_Device (); // целевой модуль.
Proc_Button (); // обработка кнопок.
Proc_Info_Service (); // модуль обработки кодов кнопок. Обработка меню. Вывод в буфер дисплея. Именно в этом модуле используется MicroMenu.
Proc_Display (); // модуль аппаратной части дисплея.

Все эти обработчики - конечные автоматы. Пусть Proc_Info_Service в каком то состоянии. В этом состоянии в том числе ждём нажатия кнопки или сочетание, чтобы войти в меню. Есть условие входа в меню? Установка состояния меню. В этом состоянии уже ждём свой набор кодов кнопок. Пусть, скажем, установка часов.

Ну и так далее. В каждом состоянии используются callback-и MicroMenu. Plus, Minus, Prev, Next, Enter.
Последний раз редактировалось Demiurg Пн апр 04, 2022 03:13:41, всего редактировалось 2 раза.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15564
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: micromenu-v2

Сообщение BOB51 »

[uquote="НовыйДень",url="/forum/viewtopic.php?p=4208978#p4208978"]Пасаны, зачем ругаетесь? :)
На деле, чтобы понять работу механизма менюшки, надо изучить в языке Си тему про указатели и массив указателей и указатели на функции. И после этого все премудрсти раскроются.
Менюшки как обычно делаются то. Для кнопок создается массив указателей на функции, реализующие действия по нажатиям. И в зависимости от текущего режима меню каждой кнопке присваивается определенный указатель на исполняемую функцию. Навигация по пунктам менюшки - это одна группа указателей. Изменение параметра в пункте менюшки - другая группа указателей.[/uquote]
Там будет два подраздела - первый сами "векторные кнопы", второй блок взаимосвязи программ, обеспечивающих "вкладки устройств".
Под ассемблером заметно удобнее ("микровиндовс" с иконками и под ассемблером я уже делал
https://radiokot.ru/forum/viewtopic.php ... 8#p1830978
https://radiokot.ru/forum/viewtopic.php ... 2#p2151072
https://radiokot.ru/forum/viewtopic.php ... 7#p2198317
) и кода поменьше.
А вот под СИ/С++ это таки досада - объем кода весьма огорчает (правда то адуринья - но тот же GCC).
Уровень "векторно-программируемых кноп" при одном "устройстве"(тестовые светики) вот тут
https://radiokot.ru/forum/viewtopic.php ... 2#p4208592
остается проработать "магазин устройств" для нескольких задач, у каждой из которых свои "менюшки"/алгоритмы управления для кнопок/комбинаций кноп.
Для СИ/С++ главная головная боль в таком случае именно в корректной "разноске" задач каждого устройства по своим файлам,
поскольку текста там весьма моного...
8)
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: micromenu-v2

Сообщение Dimon456 »

Как все сложно: автоматы кнопки векторы С++ классы, а по проще нет ни чего?
Ответить

Вернуться в «AVR»