Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 312
1

Создание скелета меню

13.08.2019, 22:23. Просмотров 516. Ответов 18

Коллеги всем доброго дня, встал вопрос о создании меню.
Хотелось бы послушать, каким образом "правильно" создавать скелет.
Меню планируется многоуровневым каждое подменю будет нести за собой ряд настроек.

Как я это вижу, для данной цели вполне подойдет использование конструкции switch.
Язык С++
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2019, 22:23
Ответы с готовыми решениями:

Создание меню
Жаль нет такого раздела, что-то вроде "Программирование", "Алгоритмы и решения". Спрошу здесь....

Создание меню, заполнение связей на Си... Как?
Двустрочный дисплей и 4 кнопки курсора подключены к контроллеру. Надо написать большое древовидное...

Создание персонажа и скелета для него
Здравствуйте! Не могли бы вы подсказать новичку программу для создания моделей, персонажей (не...

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

[collada] Как получить bind shape из visual_scene ,а не из контроллера скелета?
Для скелетной анимации нужны 3 вещи: обратная трансформация для каждой кости ,вершина и поза...

18
Humanoid
Почетный модератор
10076 / 3945 / 367
Регистрация: 12.06.2008
Сообщений: 11,531
13.08.2019, 23:21 2
Это действительно имеет отношение к микроконтроллерам? Или вы разделом ошиблись? В любом случае не было бы лишним уточнить, что за меню, куда и как вы его собираетесь выводить и т.п.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 312
14.08.2019, 00:37  [ТС] 3
Ну скажем, прямого отношения к ним конечно не имеет, но в моем случае база выглядит такой STM32F103C8T6+ OLED (SPI), навигация либо энкодер с кнопкой либо 3 кнопки. Я думаю эта тема будет полезна как некий экскурс в части этой темы и поделок на базе микроконтроллеров.

Может есть уже готовые библиотеки, просто стало интересно, и куда проще, чем изобретать велосипед!
0
COKPOWEHEU
1573 / 1066 / 248
Регистрация: 09.09.2017
Сообщений: 4,385
14.08.2019, 12:06 4
Скорее, должно быть дерево, где каждый узел - пункт меню, который содержит "указатели" на соседей слева и справа, плюс "указатель" на родительский узел и на дочернее поддерево. Вместо дочернего поддерева у листьев будет собственно функционал пункта.
"указатели" не просто так в кавычках. Скорее всего, это будут просто индексы в массиве.
Цитата Сообщение от GaFBich Посмотреть сообщение
навигация либо энкодер с кнопкой либо 3 кнопки.
тогда отдельный "указатель" на родителя не нужен, вместо этого добавить пункт "наверх", для которого поддеревом будет родительское поддерево.
Код
[0]={.prev=2, .next=.1, .child=3}, [1]={.prev=0, .next=2, .child=6}, [2]={.prev=1, .next=0, .child=8},
//поддерево для [0]->
[3]={.prev=5, .next=4, .child=9}, [4]={.prev=3, .next=5, .child=10}, [5]={.prev=4, .next=3, .child=0/*наверх*/},
//поддерево для [1]->
[6]={.prev=7, .next=7, .child=-1/*лист, тут вызов функции*/}, [7]={.prev=6, .next=6, .child=1/*наверх*/},
//поддерево для [2]->
[8]={.prev=8, .next=8, .child=3},
//поддерево для [3]->
[9]=...
//поддерево для [4]->
[10]=...
0
14.08.2019, 12:06
_SayHello
723 / 430 / 138
Регистрация: 30.07.2015
Сообщений: 1,444
15.08.2019, 16:39 5
GaFBich, баловался как то с OLED дисплейчиком. В проект правда так и не поставил меню - не пригодилось. Но деалал так:
менюшка по которой можн опо четырем направлениям ходить
C++
1
2
3
4
5
6
7
8
9
10
typedef struct menuItem
{
    int id;
    char *name;
    char select;
    struct menuItem *up;
    struct menuItem *right;
    struct menuItem *left;
    struct menuItem *down;
} menuItem;
Инициализируем явно все пункты меню
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
         menuItem m[6] = { { 1, "  Методики", 0, NULL, NULL, NULL, NULL },
                     {  2, "  Параметры", 0, NULL, NULL, NULL, NULL },
                     {  3, "  Время", 0, NULL, NULL, NULL, NULL },
                     {  4, "  Menu 4", 0, NULL, NULL, NULL, NULL },
                     {  5, "  Menu 5", 0, NULL, NULL, NULL, NULL },
                     {  6, "  Menu 6", 0, NULL, NULL, NULL, NULL } };
 
     menuItem m1[3] = {{ 11, "  Методика 1", 1, NULL, NULL, NULL, NULL },
                      { 12, "  Методика 2", 1, NULL, NULL, NULL, NULL },
                      { 13, "  Методика 3", 1, NULL, NULL, NULL, NULL }};
 
 
 
     menuItem m2[3] = { { 21, "  Датчик", 1, NULL, NULL, NULL, NULL },
                       { 22, "  Магнетроны", 1, NULL, NULL, NULL, NULL },
                       { 23, "  Индикация", 1, NULL, NULL, NULL, NULL } };
 
     menuItem m3[3] = { { 31, "  Текущее время", 1, NULL, NULL, NULL, NULL },
                       { 32, "  Текущая дата", 1, NULL, NULL, NULL, NULL },
                       { 33, "  Настройка", 1, NULL, NULL, NULL, NULL } };
 
     menuItem m4[3] = { { 41, "  Menu 4-1", 1, NULL, NULL, NULL, NULL },
                       { 42, "  Menu 4-2", 1, NULL, NULL, NULL, NULL },
                       { 43, "  Menu 4-3", 1, NULL, NULL, NULL, NULL } };
 
     menuItem m5[3] = { { 51, "  Menu 5-1", 1, NULL, NULL, NULL, NULL },
                       { 52, "  Menu 5-2", 1, NULL, NULL, NULL, NULL },
                       { 53, "  Menu 5-3", 1, NULL, NULL, NULL, NULL } };
 
     menuItem m6[3] = { { 61, "  Menu 6-1", 1, NULL, NULL, NULL, NULL },
                       { 62, "  Menu 6-2", 1, NULL, NULL, NULL, NULL },
                       { 63, "  Menu 6-3", 1, NULL, NULL, NULL, NULL } };
Устанавливаем зависимости уровней и подуровней:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
   m[0].down = &m[1];
    m[0].right = &m1[0];
    // Настройка М2
    m[1].up = &m[0];
    m[1].right = &m2[0];
    m[1].down = &m[2];
    // Настройка М3
    m[2].up = &m[1];
    m[2].right = &m3[0];
    m[2].down = &m[3];
    // Настройка М4
    m[3].up = &m[2];
    m[3].right = &m4[0];
    m[3].down = &m[4];
    // Настройка М5
    m[4].up = &m[3];
    m[4].right = &m5[0];
    m[4].down = &m[5];
    // Настройка М6
    m[5].up = &m[4];
    m[5].right = &m6[0];
 
    // Второй уровень меню M1
    // Настройка М11
    m1[0].left = &m[0];
    m1[0].down = &m1[1];
    // Настройка М12
    m1[1].up = &m1[0];
    m1[1].down = &m1[2];
    m1[1].left = &m[0];
    // Настройка М13
    m1[2].up = &m1[1];
    m1[2].left = &m[0];
 
    // Второй уровень меню M2
    // Настройка М21
    m2[0].left = &m[0];
    m2[0].down = &m2[1];
    // Настройка М22
    m2[1].up = &m2[0];
    m2[1].down = &m2[2];
    m2[1].left = &m[0];
    // Настройка М23
    m2[2].up = &m2[1];
    m2[2].left = &m[0];
 
    // Второй уровень меню M3
    // Настройка М31
    m3[0].left = &m[0];
    m3[0].down = &m3[1];
    // Настройка М32
    m3[1].up = &m3[0];
    m3[1].down = &m3[2];
    m3[1].left = &m[0];
    // Настройка М33
    m3[2].up = &m3[1];
    m3[2].left = &m[0];
 
    // Второй уровень меню M4
    // Настройка М41
    m4[0].left = &m[0];
    m4[0].down = &m4[1];
    // Настройка М42
    m4[1].up = &m4[0];
    m4[1].down = &m4[2];
    m4[1].left = &m[0];
    // Настройка М43
    m4[2].up = &m4[1];
    m4[2].left = &m[0];
 
    // Второй уровень меню M5
    // Настройка М51
    m5[0].left = &m[0];
    m5[0].down = &m5[1];
    // Настройка М52
    m5[1].up = &m5[0];
    m5[1].down = &m5[2];
    m5[1].left = &m[0];
    // Настройка М53
    m5[2].up = &m5[1];
    m5[2].left = &m[0];
 
    // Второй уровень меню M6
    // Настройка М61
    m6[0].left = &m[0];
    m6[0].down = &m6[1];
    // Настройка М62
    m6[1].up = &m6[0];
    m6[1].down = &m6[2];
    m6[1].left = &m[0];
    // Настройка М63
    m6[2].up = &m6[1];
    m6[2].left = &m[0];

Устанавливаем начальное положение:
C++
1
    menuItem *curItem = &m[0];    // Тут мы будем хранить указатель на текущее меню
Гоняем по меню так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
switch(ButtonPressedID)
{
    case UP:
    {
        if(curItem->up)
        {
            curItem = curItem->up;
            //обновляем дисплей            
        }
        break:
    }
    case DOWN:
    {
        if(curItem->down)
        {
            curItem = curItem->down;
            //обновляем дисплей            
        }
        break:
    }
    case RIGHT:
    {
        if(curItem->right)
        {
            curItem = curItem->up;
            //обновляем дисплей            
        }
        break:
    }
    case LEFT:
    {
        if(curItem->left)
        {
            curItem = curItem->left;
            //обновляем дисплей            
        }
        break:
    }   
    case ENTER:
    {
        if(curItem->id == TASK_ONE)
            //do TASK_ONE        
        break:
    }  
    default:
        break;
}
Из минусов, надо руками инициализировать каждый пункт меню.
Из плюсов, добавление новых функций или новых подпунктов в проект, будет намоооого проща чем используя Switch.
Переходы могут быть гибкие, можно удобно организовать переход из любого меню в любое подменю.

Добавлено через 3 минуты
Про Switch я не шучу, я как то добавлял в сторонний проект пару подпунктов на трехуровневое меню. Мне не понравилось.
0
ValeryS
Модератор
7821 / 5820 / 758
Регистрация: 14.02.2011
Сообщений: 19,953
Завершенные тесты: 1
15.08.2019, 17:17 6
Цитата Сообщение от GaFBich Посмотреть сообщение
Язык С++
смотри в сторону виртуальных функций, но нужны ли плюсы на микроконтроллере это вопрос

Добавлено через 3 минуты
_SayHello, вот у тебя указатели на меню следующего уровня
Цитата Сообщение от _SayHello Посмотреть сообщение
C
1
2
3
4
struct menuItem *up;
 struct menuItem *right;
 struct menuItem *left;
 struct menuItem *down;
и все равны NULL зачем были введены в структуру?
0
_SayHello
723 / 430 / 138
Регистрация: 30.07.2015
Сообщений: 1,444
15.08.2019, 17:28 7
ValeryS,
Цитата Сообщение от ValeryS Посмотреть сообщение
смотри в сторону виртуальных функций
а как помогут виртуальные функции в создании скелета меню? Не могу сообразить.
Цитата Сообщение от ValeryS Посмотреть сообщение
но нужны ли плюсы на микроконтроллере это вопрос
Мне кажется сейчас под С++ подразумевают и С, главное что не asm)) Во многих вакансиях пишут что-то вроде: "...опыт написания программ под stm32 на С\С++". Спрашиваешь, что конкретно делается на С++, в ответ код на С)))
Хотя на хабре любители метапрограммирования делают интересные обертки на шаблонах и constexpr.
А так, контейнеры и STL особо не поюзать из за отсутсвия аллокатора памяти (ну или самому написать) и как то сразу С++ почти вырождается в С))

Добавлено через 1 минуту
ValeryS,
Цитата Сообщение от ValeryS Посмотреть сообщение
и все равны NULL зачем были введены в структуру?
Просто такая инициализация, я сначала все пункты и подпункты проинициализировал, а потом их друг в друга впихал. Специально свернул портянку ниже.
0
ValeryS
Модератор
7821 / 5820 / 758
Регистрация: 14.02.2011
Сообщений: 19,953
Завершенные тесты: 1
15.08.2019, 18:12 8
Цитата Сообщение от _SayHello Посмотреть сообщение
Специально свернул портянку ниже.
так поэтому я и не заметил
Цитата Сообщение от _SayHello Посмотреть сообщение
а как помогут виртуальные функции в создании скелета меню?
ну я так делал,правда не на микроконтроллере
создается класс базовый абстрактный типа
C++
1
2
3
4
5
6
7
8
9
10
class absClassItem
{
 int id;
public:
virtual void DrawItem()=0;
virtual void PressLeft()=0;
virtual void PressRight()=0;
virtual void PressEnter()=0;
virtual void PressEsc()=0;
}
потом наследовался от него и переопределял функции
0
COKPOWEHEU
1573 / 1066 / 248
Регистрация: 09.09.2017
Сообщений: 4,385
16.08.2019, 10:46 9
Цитата Сообщение от ValeryS Посмотреть сообщение
ну я так делал,правда не на микроконтроллере
Это лишние накладные расходы. Для компа еще ладно, там памяти и быстродействия хватает. А вот на контроллерах беда.
По похожей причине в своем примере я не использовал для "указателей" полноценные указатели, а только индексы в массиве: 1 байт вместо 2.
0
ValeryS
Модератор
7821 / 5820 / 758
Регистрация: 14.02.2011
Сообщений: 19,953
Завершенные тесты: 1
16.08.2019, 15:24 10
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Для компа еще ладно, там памяти и быстродействия хватает.
современные камни покруче будут чем тот же intel486, а ведь там С++ использовался
0
_SayHello
16.08.2019, 15:26
  #11

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
современные камни покруче будут чем тот же intel486, а ведь там С++ использовался
да начнется холивар свидетелей С++ и свидетелей асма=)

0
COKPOWEHEU
1573 / 1066 / 248
Регистрация: 09.09.2017
Сообщений: 4,385
17.08.2019, 01:38 12
Цитата Сообщение от ValeryS Посмотреть сообщение
современные камни покруче будут чем тот же intel486, а ведь там С++ использовался
Это какие контроллеры вы имеете в виду?
Учитывая вопрос ТСа, я бы предположил что-то попроще, вроде AVR или PIC, а у них скорость порядка 1 МГц и память порядка 1 кБ. Нет, существуют, конечно, и ARM, и ПЛИС, но вот начинать с них изучение контроллеров явно не стоит
0
ValeryS
Модератор
7821 / 5820 / 758
Регистрация: 14.02.2011
Сообщений: 19,953
Завершенные тесты: 1
17.08.2019, 07:15 13
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это какие контроллеры вы имеете в виду?
STM32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
с них изучение контроллеров явно не стоит
вопрос спорный, я вот вообще начинал с 0х51, но это когда было
0
COKPOWEHEU
1573 / 1066 / 248
Регистрация: 09.09.2017
Сообщений: 4,385
17.08.2019, 10:23 14
Цитата Сообщение от ValeryS Посмотреть сообщение
STM32
Но ведь не с 7 серии, а с 0 или 1. И даже они слабо подходят в учебных целях: уж больно накручены и плохо подходят для самодельных плат.
Лично я считаю примитивные контроллеры крайне полезными именно для понимания принципа работы процессора. На них видно, как у машины в мозгах биты щелкают. На x86 и даже ARM это далеко не так очевидно.
Цитата Сообщение от ValeryS Посмотреть сообщение
вопрос спорный, я вот вообще начинал с 0х51, но это когда было

Не по теме:

Почему 0x51?

Я с ними дела не имел, но разве они такие уж сложные? Мне казалось, сравнимы с теми же PIC или AVR.
0
ValeryS
Модератор
7821 / 5820 / 758
Регистрация: 14.02.2011
Сообщений: 19,953
Завершенные тесты: 1
17.08.2019, 11:07 15
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
почему 0x51
да потому что звались чисто интеловские 8051 8031(или я что то забыл)
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
но разве они такие уж сложные
не сложные но .... УФ стирание! написал програмку, не понравилась,минут 20 стираешь
это уж потом появилась атмеловская 89с51, электрическое стирание, берег как зерницу ока
а потом они стали дешевле и доступнее чем интеловские 8051
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мне казалось, сравнимы с теми же PIC или AVR.
с пиками никогда не работал, сначала не было доступа, а сейчас как то на СТМки сел
а вот AVR, пришлось начинать практически с 0 совершенно другая идеология
вот такой мой путь
большой комп, ассемблер 8086, достаточно глубоко, ДОС на уровне системных прерываний и железа
переучиваюсь,51, ассемблер
переучиваюсь, AVR, ассемблер, но уже не так глубоко
переучиваюсь, STM32, ассемблер только чтобы знать команды, ничего серьезного не написал
STM8, ассемблер вообще не знаю
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
На них видно, как у машины в мозгах биты щелкают.
а нужно ли сейчас это???
нет знать конечно не мешает, но разбираться в тонкостях....
пока все выучил, уже новая архитектура на подходе
0
locm
17.08.2019, 14:01
  #16

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Лично я считаю примитивные контроллеры крайне полезными именно для понимания принципа работы процессора. На них видно, как у машины в мозгах биты щелкают.
Для этого МК должен поддерживать аппаратную отладку, которой в простых МК обычно нет. Без нее не увидеть как "у машины в мозгах биты щелкают". Программные стимуляторы не в счет. Это не МК.

0
COKPOWEHEU
1573 / 1066 / 248
Регистрация: 09.09.2017
Сообщений: 4,385
17.08.2019, 14:20 17
Цитата Сообщение от ValeryS Посмотреть сообщение
да потому что звались чисто интеловские 8051 8031(или я что то забыл)
часто видел запись x51, где под x понимается любой префикс, но не hex-подобную 0x51.
Цитата Сообщение от ValeryS Посмотреть сообщение
а нужно ли сейчас это???
нет знать конечно не мешает, но разбираться в тонкостях....
Это пусть каждый решает для себя. Мне, например, было интересно понять как это работает. На примере х86 ассемблера это далеко не так очевидно. Кому-то и Ардуины хватает, кто-то лепит сложные проекты на raspberry pi, ни там ни там особое знание железа не критично. Именно поэтому я и писал про учебные цели. Чтобы не смотреть на проц как на кусок магии. Разумеется, речь не идет про тонкости: я имел в виду только общее представление, чтобы понимать как это вообще работает, и не бояться ассемблера.
Цитата Сообщение от locm Посмотреть сообщение
Для этого МК должен поддерживать аппаратную отладку
Однозначно - нет. Аппаратная отладка может быть ограниченно полезна для каких-то других задач, но в обучении она бесполезна. Собственно, мы с вами это уже обсуждали.
0
locm
17.08.2019, 14:34
  #18

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Аппаратная отладка может быть ограниченно полезна для каких-то других задач, но в обучении она бесполезна.
Я про
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
На них видно, как у машины в мозгах биты щелкают.
Аппаратная отладка нужна чтобы увидеть это.

0
COKPOWEHEU
1573 / 1066 / 248
Регистрация: 09.09.2017
Сообщений: 4,385
17.08.2019, 18:49 19
Не воспринимайте настолько буквально. Я говорил только о том, что контроллеры удобны для понимания работы процессора вообще. Как устроен стек, регистры, АЛУ, периферия, прерывания и все прочее на примере конкретного ядра. Как всякие высокоуровневые вещи вроде циклов, указателей, функций и структур реализуются отдельными простейшими командами.
Теоретически, для этого можно использовать любой ассемблер, некоторые даже пытаются х86... сколько я видел, безуспешно.
0
17.08.2019, 18:49
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2019, 18:49

Создание меню (чтобы открывались ссылки на вкладках меню)
есть FAQ?

Создание нового меню в меню Файл в Excel
Небольшое вступление: я решил сделать надстройку для Excel, при ее установке в меню 'Файл' должен...

Обозначение "скелета" програмы
Что обозначает uses crt,graph; Ни в одной программе я его ещё не писал, где его нужно применять?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru