Страница 3 из 4
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 09:40:06
WiseLord
Demiurg, вряд ли так просто получится. Размер всего проекта выходит около 5кБ, что больше ограничения 4кБ на размер кода в IAR.
Да и смысла под проприетарные компиляторы подстраиваться особого нет. Вы бы ещё CodeVision упомянули...
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 09:45:10
ARV
Demiurg писал(а):Попробовал запустить в AVR Toolchain, оказывается у вас зависимость от версии.
у меня зависимость от версии по минимуму, т.е. ниже определенной версии не будет поддержки __flash, а значит, и мои файлы не соберутся. но AVR Toolchain давно имеет соответствующую версию! почему у вас не собралось - не понимаю: я тестировал у себя от версии 4.9.2 и до 9.2.0
Demiurg писал(а):Это не моя личная хотелка.
это ваша личная хотелка - смотрите на
WiseLord, он буквально за 5 минут запустил и на своем AVR (я тестировал на меге8, а он на меге328), и на stm32, и никаких скомпилированных проектов ему не потребовалось. я предоставил полностью готовые примеры с готовыми makefile для atmega8, в комплекте с протеусом - хоть собирайте сами, хоть тестируйте готовое! а остальное - "за свой счет"
Demiurg писал(а):при этом без опроса флага готовности
самая порочная практика из всех, что я встречал - игнорировать рекомендации даташита, полагаясь на какие-то задержки. я так не делал, и не буду делать. и вам не советую

Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 10:48:58
Demiurg
Еб... Вы один из самых упоротых и узколобых собеседников. Это не эмоции. Мне есть с чем сравнивать. Я не знаю как вы пришли в программирование микроконтроллеров. Лично я, как и многие другие от железа. И программирование как таковое малая часть нашей деятельности. И вы сами по форумам видите, что у многих ситуация в разы хуже, чем у меня, к примеру.
Дисплеи по даташитам работают штатно, если соблюдать времянки. Без опроса флага готовности.
А впрочем, что я время теряю. По проекту меню откланиваюсь. ебитесь варитесь сами в собственном соку.
У меня на нынешний момент была единственная проблема - с необязательным параметром. Наверное пришло время решать её самому. Лично.
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 12:39:50
WiseLord
ARV, кстати, те модифицированные мною исходники не пробовали под windows собрать? Как avr, так и stm32 вариант?
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 12:47:52
ARV
нет, не пробовал. у меня как-то с GIT не складывается... только и могу поглядеть файлы в браузере. с stm32 вообще никак не связан (ни тулчейна нет, ни МК), а под AVR не увидел какой-то заметной разницы в ваших модификациях. даже несколько удивлен количеству "лишних" файлов

Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 13:01:35
WiseLord
ARV писал(а):у меня как-то с GIT не складывается
А что тогда вместо него предпочитаете? SVN?
Добавлено after 3 minutes 52 seconds:
ARV писал(а):даже несколько удивлен количеству "лишних" файлов
Всё эти файлы avr_fmenu.* - это файлы проекта, чтобы открыть код в QtCreator. По сути, они не нужны для сборки. Достаточно только в PATH иметь make и компилятор (avr-gcc и arm-none-eabi-gcc соответственно).
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 13:02:01
ARV
WiseLord писал(а):А что тогда вместо него предпочитаете?
вы будете смеяться: внешний диск
я использую Eclipse, и много раз хотел как-то приспособить либо встроенную в него возможность контроля версий, либо при помощи плагинов что-то подключить... но так и не уразумел, как всем этим добром пользоваться, чтобы "на кнопочку нажал - и готово". поэтому вот так как-то...
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 13:20:40
WiseLord
ARV писал(а):я использую Eclipse, и много раз хотел как-то приспособить либо встроенную в него возможность контроля версий, либо при помощи плагинов что-то подключить... но так и не уразумел, как всем этим добром пользоваться
А я пользуюсь QtCreator, в котором тоже есть поддержка разных систем контроля версий, но я эти функционалом не пользуюсь.
Вот и Вам я бы посоветовал изучить эти несколько команд консольного git, и пользоваться ими. А когда войдёте во вкус и поймёте, как это работает "снизу" - можно положить и IDE- шным функционалом пользоваться, если возникнет желание.
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 13:25:32
ARV
WiseLord писал(а):я бы посоветовал изучить эти несколько команд консольного git
да не вы первый мне это советуете... но я очень ленивый: это ж надо консоль открывать, команды вбивать... еще помнить их... не, мне или "кнопочку", или уж по-старинке - на внешний диск Total Commander-ом
сейчас я вообще все на внешнем диске держу: и проекты, и тулченый, и Eclipse (пользуюсь тем, что Eclipse можно обдурить, введя в него относительные пути)... зато могу на любом компе работать, хоть в гостях

Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 14:18:59
WiseLord
Нет, по мне - написание кода без истории и системы контроля версий - это просто мазохизм.
Помнить максимум десяток простых (двухсловных) команд - это проще, чем помнить для всего объёма кода, зачем вот в этом месте была заведена какая-то переменная год назад, и почему два года назад я вот тут сделал вот так.
Вот минимальный список команд - просто для локальной работы:
Код: Выделить всё
git init - создать в некотором рабочем каталоге git репозиторий
git add <относительный путь> - добавить текущие изменения в файл(ах)/каталогу в список для индексации
gid commit - зафиксировать список для индексации (создать коммит в истории с текущим состоянием дерева проекта)
git log - посмотреть историю коммитов
git show <хэш коммита> - посмотреть изменения, сделанные в этом комите.
Этого вполне достаточно просто для хранения истории своих изменений в каталоге "на внешнем диске"
А если захочется свой локальный репозиторий на тот же Github отправлять или оттуда забирать - то ещё понадобятся пара команд:
Код: Выделить всё
git push - отправить текущее состояние (последний коммит со всей историей) на удалённый сервер
git pull - забрать последние изменения с сервера (если, к примеру, работали на другой машине и пушили раньше оттуда на сервер)
А дальше уже есть другие "фишки", типа как работа с несколькими ветками кода - когда можно временно переключиться на другую ветку, сделать в ней пару "рабочих" коммитов, потом вернуться на основное состояние и работать дальше там. Но это уже после "вхождения во вкус".
Не так уж и сложно запомнить, как по мне.
А особая прелесть - когда есть несколько проектов с похожим кодом (кусками кода), и нужно изменения в одном проекте забрать в другой - тоже всё упрощается донельзя. Но это уже чуть более высокий уровень владения Git-ом.
Добавлено after 17 minutes 37 seconds:
А вот небольшая иллюстрация локальной работы с Git в изначально пустом каталоге:

Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт май 08, 2020 14:31:12
ARV
теорию я знаю. но применять её на практике... увы.
Eclipse дает мне возможность иметь локальную историю изменений, я насроил до 100 предыдущих вариантов - и мне пока хватает без всяких Git-ов.
а осальное для работы с Git в Eclipse совсем не интуитивно (для меня). а я уже устал заниматься тем, что всякий раз что-то углубленно изучать и настраивать только для того, чтобы потом пару раз поиспользовать.
мне бы кнопочку...
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Ср авг 19, 2020 21:38:57
Dimon456
В общем собрал все вместе:
Спойлер
Описание менюКод: Выделить всё
typedef const struct Menu_Item {
const struct Menu_Item *Next; /**< Указатель на следующий пункт меню этого пункта меню */
const struct Menu_Item *Previous; /**< Указатель на предыдущий пункт меню этого пункта меню */
const struct Menu_Item *Parent; /**< Указатель на родительский пункт меню этого пункта меню */
const struct Menu_Item *Child; /**< Указатель на дочерний пункт меню этого пункта меню */
const char id;
} Menu_Item_t;
у каждого пункта меню свой уникальный идентификатор id.
Самих функций здесь не много Код: Выделить всё
#define MENU_ITEM(Name, Next, Previous, Parent, Child, id) \
extern Menu_Item_t const Next; \
extern Menu_Item_t const Previous; \
extern Menu_Item_t const Parent; \
extern Menu_Item_t const Child; \
Menu_Item_t const Name = {&Next, &Previous, &Parent, &Child, id}
#define MENU_PARENT (Menu_GetCurrentMenu()->Parent)
#define MENU_CHILD (Menu_GetCurrentMenu()->Child)
#define MENU_NEXT (Menu_GetCurrentMenu()->Next)
#define MENU_PREVIOUS (Menu_GetCurrentMenu()->Previous)
extern Menu_Item_t NULL_MENU;
Menu_Item_t NULL_MENU = {0};
static void (*MenuWriteFunc)(const char* Text) = NULL;
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;
}
Само меню выглядит такКод: Выделить всё
MENU_ITEM(Menu_1, Menu_2, NULL_MENU, NULL_MENU, NULL_MENU, SETTING_ENTER); // Settings
MENU_ITEM(Menu_2, Menu_2_1, Menu_1, Menu_5, NULL_MENU, CALIBRATIONS_DEVICES); // Calibrations Devices
MENU_ITEM(Menu_2_1, Menu_2_1_1, Menu_2, Menu_2_2, Menu_2_1, CALIBRATION_VOLTMETER); // Calibration of the voltmeter
MENU_ITEM(Menu_2_2, Menu_2_2_1, Menu_2, Menu_2_2, Menu_2_1, CALIBRATION_AMMETER); // Calibration of the ammeter
MENU_ITEM(Menu_2_1_1, Menu_2_1_2, Menu_2_1, NULL_MENU, NULL_MENU, VOLTMETER_1); //
MENU_ITEM(Menu_2_1_2, Menu_2_1_1, Menu_2_1, NULL_MENU, NULL_MENU, VOLTMETER_2); //
навигация по менюКод: Выделить всё
Menu_Navigate(MENU_NEXT);
Menu_Navigate(MENU_PREVIOUS);
Menu_Navigate(MENU_CHILD);
Menu_Navigate(MENU_PARENT);
как я выше уже написал, у каждого меню свой уникальный идентификатор id, берется отсюдаКод: Выделить всё
STATE ( NOT, NULL ),
STATE (SETTING_ENTER, settings_enter ),
STATE (CALIBRATIONS_DEVICES, Calibrations_Devices ),
STATE (CALIBRATION_VOLTMETER, Calibration_Voltmeter ),
STATE (VOLTMETER_1, Voltmeter_1 ),
STATE (VOLTMETER_2, Voltmeter_2 ),
в основной программе я получаю этот id текущего пункта менюКод: Выделить всё
volatile Menu_Item_t* menu = &NULL_MENU;
menu = Menu_GetCurrentMenu();
id = menu->id;
if(id) proc_device(id);
и отправляю на исполнениеКод: Выделить всё
void proc_device (char id)
{
_proc_device = id;
proc_fsm_func (proc_device_func, _proc_device);
}
void proc_fsm_func (FUNC __flash *ptr_func, unsigned char s)
{
ptr_func [s] ();
}
const FUNC proc_device_func [PROC_DEVICE_STATES] =
{
#define STATE(name, func) func
#include "func.h"
#undef STATE
};
к примеру такКод: Выделить всё
// Menus function
void settings_enter(void)
{
lcd_gotoxy (4,0);
lcd_putstring ("Settings");
}
void Calibrations_Devices(void)
{
lcd_gotoxy (0,0);
lcd_putstring ("Calibrations");
lcd_gotoxy (0,1);
lcd_putstring ("Devices");
}
все просто и без всяких высоко интеллектуальных заморочек.
Последнее можно заменить наКод: Выделить всё
typedef enum{
standard_screen, //0 стандартный екран
setting_enter, // меню настроек
calibrations_devices, //
calibration_voltmeter, //
voltmeter_1, //
voltmeter_2, //
} display;
switch(id)
{
case setting_enter:
settings_enter();
break;
case calibrations_devices:
Calibrations_Devices();
break;
case calibration_voltmeter:
Calibration_Voltmeter();
break;
но мне показалось так интересней.
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Ср авг 19, 2020 22:12:36
ARV
ну так это у вас полчилоь классическое меню, без возможности делать динамичекое название пункта, без встроенного редактирования параметров...
по id перебирать варианты... оно, конечно, полезно, но скучновато...
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Чт авг 20, 2020 05:20:23
Dimon456
Я же вам писал, запятую поставьте там где мне надо
Спойлер
МенюКод: Выделить всё
// Menus Name | Next | Prev | Parent | Child | SelectFunction
MENU_ITEM(Menu_5_1_1, NULL_MENU, Menu_5_1, NULL_MENU, NULL_MENU, T_VOLTAGES); ///
Опрос кнопок, на BTN_SHRT1 и BTN_SHRT2 энкодер виситКод: Выделить всё
if (button == BTN_SHRT4) {
lcd_clear();//очистка LCD и перевод курсора в 0.0
Menu_Navigate(MENU_NEXT);
if(id == T_VOLTAGES) { if(table_u++ == U_33) table_u = U_33; }
}
if (button == BTN_SHRT3) {
lcd_clear();//очистка LCD и перевод курсора в 0.0
Menu_Navigate(MENU_PREVIOUS);
}
if (button == BTN_SHRT2) {
switch(id)
{
case CALIBRATIONS_DEVICES:
case CALIBRATION_TABLE:
case CALIBRATION_VOLTMETER:
case CALIBRATION_AMMETER:
case TABLE_VOLTAGES:
case TABLE_CURRENT:
lcd_clear();//очистка LCD и перевод курсора в 0.0
Menu_Navigate(MENU_CHILD);
break;
default: break;
}
if(id == T_VOLTAGES) {variable[table_u].U_table--; variable[table_u].U_table = normalize (((int16_t)variable[table_u].U_table), ((int16_t)(0)), ((int16_t)(UImax_pwm)));}
}
if (button == BTN_SHRT1) {
switch(id)
{
case CALIBRATIONS_DEVICES:
case CALIBRATION_TABLE:
case CALIBRATION_VOLTMETER:
case CALIBRATION_AMMETER:
case TABLE_VOLTAGES:
case TABLE_CURRENT:
lcd_clear();//очистка LCD и перевод курсора в 0.0
Menu_Navigate(MENU_PARENT);
break;
default: break;
}
if(id == T_VOLTAGES) {variable[table_u].U_table++; variable[table_u].U_table = normalize (((int16_t)variable[table_u].U_table), ((int16_t)(0)), ((int16_t)(UImax_pwm)));}
}
вывод функцииКод: Выделить всё
void T_voltages (void)
{
lcd_gotoxy (0, 0);
lcd_putstring("Set");
lcd_gotoxy (13, 0);
sprintf (string_out,"%02dV",(uint8_t)table_u);
lcd_putstring (string_out);
lcd_gotoxy (0, 1);
sprintf (string_out,"DAC=%04d",variable[table_u].U_table);
lcd_putstring (string_out);
lcd_gotoxy (9,1);
sprintf (string_out,"\"%2d.%02d\"", x_u_izm/100, (x_u_izm)%100);
lcd_putstring (string_out);
}
А еще и поморгать чем нибудь, к примеру такКод: Выделить всё
if((millis() - previousMillis) > 500){
previousMillis = millis();
blink = !blink;
}
lcd_gotoxy (0,1);
if (blink) lcd_putchar(0x22); else lcd_putchar(0x20);
lcd_gotoxy (1, 1);
sprintf (string_out,"%04d",Imax_adc);
lcd_putstring_flash (string_out);
lcd_gotoxy (5,1);
if (blink) lcd_putchar(0x22); else lcd_putchar(0x20);
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Чт авг 20, 2020 09:16:43
ARV
Dimon456 писал(а):запятую поставьте там где мне надо

???????????
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Чт авг 20, 2020 13:36:01
Dimon456
ARV, все равно чуть ли не для каждого пункта меню вы будете писать свою функцию, универсальности здесь нет и не зачем усложнять высокоинтеллектуальными кодами в которых трудно разобраться.
Попробуйте написать мой пункт меню T_voltages на своем FlexMenu с тем же алгоритмом и стем же отображением на lcd?
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Чт авг 20, 2020 14:04:52
ARV
Dimon456 писал(а):все равно
отнюдь.
я задумал упростить типичные пункты меню, сделав из сразу готовыми фукнциями. при этом возможность сделать свою уникальную для вывода уникального содержимого так же имеется. вы же исключили в принципе возможность упрощения чего-либо. так что не все равно. в качестве универсального решения вы предложили самое примитивное. да, оно 100% универсально - бери напильник и допиливай под себя.
я преложил решение, которое хоть на 10%, но позволяет обойтись без напильника. множество настроек могут быть реализованы изначальным вариантом FlexMenu практически без усиилий программиста, разве что описать тип данных придется, и выделить ячейки EEPROM под них.
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт авг 21, 2020 08:54:21
OKF
[uquote="ARV",url="/forum/viewtopic.php?p=3838646#p3838646"]
Demiurg писал(а):при этом без опроса флага готовности
самая порочная практика из всех, что я встречал - игнорировать рекомендации даташита, полагаясь на какие-то задержки. я так не делал, и не буду делать. и вам не советую

[/uquote]
Да ладно! Все времена выполнения команд как раз таки в ДШ чётко расписаны. Да и к чему эти излишние телодвижения с готовностью и с дополнительным пином?
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт авг 21, 2020 09:56:46
ARV
А в чем сакральный смысл наличия бита готовности, если можно по задержкам?
Имхо, дело в том, что задержки указываются для определенных условий, например, тактовой частоты контроллера дисплея. А разные производители разных дисплеев вольны выбирать разные частоты... И разработчик обречен на штудирование документации при каждой смене поставщика или производителя... Или разработчик делает по готовности, и спит спокойно при любых ветрах перемен.
Что практичнее?
Re: FlexMenu - решение вопросов меню. Зацените.
Добавлено: Пт авг 21, 2020 12:09:41
Dimon456
ARV, я даже и не думал что так будет работать
Спойлер
idКод: Выделить всё
STATE (STANDARD_SCREEN, standard_screen ), //
STATE (MODE_BP, standard_screen ), //
STATE (POWER, standard_screen ), //
STATE (CHARGE, standard_screen ), //
STATE (OPERATION, standard_screen ), //
STATE (TIMING, standard_screen ), //
менюКод: Выделить всё
// Menus Name | Next | Prev | Parent | Child | SelectFunction
MENU_ITEM(Menu_0, Menu_0_2, NULL_MENU, NULL_MENU, NULL_MENU, STANDARD_SCREEN); //
MENU_ITEM(Menu_0_2, Menu_0_3, NULL_MENU, NULL_MENU, NULL_MENU, MODE_BP); //
MENU_ITEM(Menu_0_3, Menu_0_4, NULL_MENU, NULL_MENU, NULL_MENU, POWER); //
MENU_ITEM(Menu_0_4, Menu_0_5, NULL_MENU, NULL_MENU, NULL_MENU, CHARGE); //
MENU_ITEM(Menu_0_5, Menu_0_6, NULL_MENU, NULL_MENU, NULL_MENU, OPERATION); //
MENU_ITEM(Menu_0_6, Menu_0, NULL_MENU, NULL_MENU, NULL_MENU, TIMING); //
сама функцияКод: Выделить всё
void standard_screen (void)
{
lcd_gotoxy (0,0);
sprintf (string_out,...;
lcd_putstring (string_out);
lcd_gotoxy (9,0);
sprintf (string_out,...;
lcd_putstring (string_out);
lcd_gotoxy (0,1);
sprintf (string_out,...;
lcd_putstring (string_out);
//дополнительная информация
lcd_gotoxy (9, 1);
if(id==STANDARD_SCREEN){ //
sprintf (string_out,...;
lcd_putstring (string_out);
}
if(id==MODE_BP){ //
sprintf (string_out,...;
lcd_putstring (string_out);
}
if(id==POWER){ //
sprintf (string_out,...;
lcd_putstring (string_out);
}
if(id==CHARGE){ //
sprintf (string_out,...;
lcd_putstring (string_out);
}
if(id==OPERATION){ //
sprintf (string_out,...;
lcd_putstring (string_out);
}
if(id==TIMING){ //
sprintf (string_out,...;
lcd_putstring (string_out);
}
}