FlexMenu: Структуры данных

FlexMenu
Структуры данных
Структуры данных с их кратким описанием.
C menu_item | пункт меню
C prop_enum_t | Определение свойства: вариант выбора
C prop_i16_t | Определение свойства: целое 16 бит со знаком
C prop_i8_t | Определение свойства: целое 8 бит со знаком
C prop_u16_t | Определение свойства: целое 16 бит без знака
C prop_u8_t | Определение свойства: целое 8 бит без знака
C property_t | обобщенное свойство
Создано системой doxygen 1.8.18


FlexMenu: Файл avr_helper.h

Файл avr_helper.h

См. исходные тексты.

Подробное описание

Макросы для часто требующихся действий при разработке ПО для микроконтроллеров емейства AVR.

Автор
ARV

См. определение в файле avr_helper.h


FlexMenu: Исходный файл avr_helper.h

avr_helper.h
См. документацию.
1
10 #ifndef AVR_CONST_H_
11 #define AVR_CONST_H_
12
13 // вспомогательные общие макросы
14 #define _CONCAT_(x,y) x ## y
15 #define CONCAT(y,x) _CONCAT_(y,x)
17
19 #define DDR(x) CONCAT(DDR,x)
20 #define PORT(x) CONCAT(PORT,x)
22 #define PIN(x) CONCAT(PIN,x)
24
26 #define INIT(x) static void __attribute__((naked, used, section(".init" #x))) CONCAT(_init_, __COUNTER__) (void)
27 #define DONE(x) static void __attribute__((naked, used, section(".fini" #x))) CONCAT(_fini_, __COUNTER__) (void)
29
31 #define AUTOINIT() INIT(2)
32 #define MAIN() int __attribute__((OS_main)) main(void)
34 #define NOINIT __attribute__((section(".noinit")))
36
37 // совместимые типы для целых чисел
38 typedef uint8_t U8;
39 typedef uint16_t U16;
40 typedef uint32_t U32;
41 typedef int8_t S8;
42 typedef int16_t S16;
43 typedef int32_t S32;
44
45 // делители тактовой для АЦП
46 #define ADC_DIV_2 _BV(ADPS0)
47 #define ADC_DIV_4 _BV(ADPS1)
48 #define ADC_DIV_8 (_BV(ADBP0) | _BV(ADPS1))
49 #define ADC_DIV_16 _BV(ADPS2)
50 #define ADC_DIV_32 (_BV(ADPS0) | _BV(ADPS2))
51 #define ADC_DIV_64 (_BV(ADPS2) | _BV(ADPS1))
52 #define ADC_DIV_128 (_BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2))
53
54 // события для автозапуска АЦП
56 #define ADC_TRIG_FRUN 0
57 #define ADC_TRIG_ACOMP _BV(ADTS0)
59 #define ADC_TRIG_INT0 _BV(ADTS1)
61 #define ADC_TRIG_T0_COMPA (_BV(ADTS0) | _BV(ADTS1))
63 #define ADC_TRIG_T0_OVF _BV(ADTS2)
65 #define ADC_TRIG_T1_COMPB (_BV(ADTS2) | _BV(ADTS0))
67 #define ADC_TRIG_T0_COMPB ADC_TRIG_T1_COMPB
69 #define ADC_TRIG_T1_OVF (_BV(ADTS2) | _BV(ADTS1))
71 #define ADC_TRIG_PCI ADC_TRIG_T1_OVF
73 #define ADC_TRIG_T1_CAPTURE (_BV(ADTS2) | _BV(ADTS0) | _BV(ADTS1))
75
76 // каналы АЦП
77 #define ADC_0 0
78 #define ADC_1 1
79 #define ADC_2 2
80 #define ADC_3 3
81 #define ADC_4 4
82 #define ADC_5 5
83 #define ADC_6 6
84 #define ADC_7 7
85
86 #if defined(__AVR_ATmega88__) || defined(__AVR_ATmega48__) || defined(__AVR_ATmega168)
87 #define ADC_BANDGAP 15
88 #define ADC_GND 16
89 #endif
90
91 #if defined(__AVR_ATmega128__)
92 #define ADC_0_DIF_0_G10 8
93 #define ADC_1_DIF_0_G10 9
94 #define ADC_0_DIF_0_G200 10
95 #define ADC_1_DIF_0_G200 11
96 #define ADC_2_DIF_2_G10 12
97 #define ADC_3_DIF_2_G10 13
98 #define ADC_2_DIF_2_G20 14
99 #define ADC_3_DIF_2_G200 15
100 #define ADC_0_DIF_1_G1 16
101 #define ADC_1_DIF_1_G1 17
102 #define ADC_2_DIF_1_G1 18
103 #define ADC_3_DIF_1_G1 19
104 #define ADC_4_DIF_1_G1 20
105 #define ADC_5_DIF_1_G1 21
106 #define ADC_6_DIF_1_G1 22
107 #define ADC_7_DIF_1_G1 23
108 #define ADC_0_DIF_2_G1 24
109 #define ADC_1_DIF_2_G1 25
110 #define ADC_2_DIF_2_G1 26
111 #define ADC_3_DIF_2_G1 27
112 #define ADC_4_DIF_2_G1 28
113 #define ADC_5_DIF_2_G1 29
114 #define ADC_BANDGAP 30
115 #define ADC_GND 31
116 #endif
117
118 #if defined(__AVR_ATtiny26__)
119 #define ADC_REF_AVCC 0
120 #define ADC_REF_EXTERNAL _BV(REFS0)
121 #define ADC_REF_INT_NO_ECAP _BV(REFS1)
122 #define ADC_REF_INT_WITH_ECAP (_BV(REFS1) | _BV(REFS0))
123 #else
124 #define ADC_REF_EXTERNAL 0
125 #define ADC_REF_AVCC _BV(REFS0)
126 #define ADC_REF_INT_WITH_ECAP (_BV(REFS1) | _BV(REFS0))
127 #endif
128
129
130 // аналоговый компаратор - момент возникновения прерываний
131 #define AC_INT_ON_TOGGLE 0
132 #define AC_INT_ON_FALLING _BV(ACIS1)
133 #define AC_INT_ON_RISING (_BV(ACIS1) | _BV(ACIS0))
134
135 // таймеры
136 // предделители тактовой
137 #define TIMER_CLK_DIV_1 1
138 #define TIMER_CLK_DIV_8 2
139 #define TIMER_CLK_DIV_64 3
140 #define TIMER_CLK_DIV_256 4
141 #define TIMER_CLK_DIV_1024 5
142 #define TIMER_CLK_EXT_FALL 6
143 #define TIMER_CLK_EXT_RISE 7
144 #define TIMER_CLK_DIV(x) CONCAT(TIMER_CLK_DIV_,x)
145
146 // режимы работы выходов OCx - вместо параметра t ввести номер канала таймера,
147 // например 0 - нулевой таймер, 1А - первый таймер канал А
148 #define TIMER_OC_NONE(t) 0
149 #define TIMER_OC_TOGGLE(t) _BV(COM ## t ## 0)
150 #define TIMER_OC_CLEAR(t) _BV(COM ## t ## 1)
151 #define TIMER_OC_SET(t) _BV(COM ## t ## 0) | _BV(COM ## t ## 1)
152
153 // внешние прерывания - условия срабатывания
154 // вместо i поставить номер запроса прерывания 0 или 1
155 #define EXINT_LOWLEVEL(i) 0
156 #define EXINT_CHANGE(i) _BV(ISC ## i ## 0)
157 #define EXINT_FALLING(i) _BV(ISC ## i ## 1)
158 #define EXINT_RISING(i) _BV(ISC ## i ## 0) | _BV(ISC ## i ## 1)
159
160 // делители тактовой SPI
161 #define SPI_CLK_DIV_4 0
162 #define SPI_CLK_DIV_16 _BV(SPR0)
163 #define SPI_CLK_DIV_64 _BV(SPR1)
164 #define SPI_CLK_DIV_128 _BV(SPR0) | _BV(SPR1)
165
166 // модуль TWI
167 // предделитель тактовой
168 #define TWI_CLK_DIV_1 0
169 #define TWI_CLK_DIV_4 _BV(TWPS0)
170 #define TWI_CLK_DIV_16 _BV(TWPS1)
171 #define TWI_CLK_DIV_64 _BV(TWPS0) | _BV(TWPS1)
172
173 #endif /* AVR_CONST_H_ */


FlexMenu: Алфавитный указатель структур данных

Алфавитный указатель структур данных
m | p
m
p
prop_i16_t prop_u8_t
prop_i8_t property_t
menu_item prop_enum_t prop_u16_t
m | p


FlexMenu: Файл com_io.c

Функции
Файл com_io.c
#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "com_io.h"
#include "avr_helper.h"
#include <stdio.h>
#include <util/setbaud.h>

См. исходные тексты.

Функции

INIT (7)

Подробное описание

Реализует "интерфейс по умолчанию" для функций printf() и т.п. По умлочанию устанавливаетя скорость, задаваемая макросом BAUD, и модуль USART1 (если их 2)

Автор
ARV
Дата
05.02.2009 ...
Версия
1.0 beta
Авторство
2008 © ARV. All rights reserved. Для компиляции требуется:
  1. WinAVR-20080411 или более новая версия

См. определение в файле com_io.c

Функции

◆ INIT()

INIT ( 7 )

Функция настройки параметров USART и инициализации ввода-вывода.

Автоматическая инициализация модуля.

Вызывать из основного модуля эту функцию не нужно.

См. определение в файле com_io.c строка 74


FlexMenu: Исходный файл com_io.c

com_io.c
См. документацию.
1
14 #include <avr/io.h>
15 #include <avr/wdt.h>
16 #include <util/delay.h>
17 #include "com_io.h"
18 #include "avr_helper.h"
19 #include <stdio.h>
20
22 static int uart_putchar(char c, FILE *stream);
23 #if ONLY_OUT == 0
24 static int uart_getchar(FILE *stream);
25 #endif
26
28 #if ONLY_OUT != 0
29 static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
30 #else
31 static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
32 #endif
33
40 //static
41 int uart_putchar(char c, FILE *stream){
42 if (c == '\n')
43 uart_putchar('\r', stream);
44 while(bit_is_clear(UCSRA, UDRE))
45 #if USE_WDT != 0
46 wdt_reset();
47 #endif
48 ;
49 UDR = c;
50 return 0;
51 }
52
53 #if ONLY_OUT == 0
54 //static
55 int uart_getchar(FILE *stream){
56 while(bit_is_clear(UCSRA, RXC))
57 #if USE_WDT != 0
58 wdt_reset();
59 #endif
60 ;
61 return UDR;
62 }
63 #endif
64
65 void print_line(char c, uint8_t count){
66 while(count--)putchar(c);
67 }
68
69
73 INIT(7){
76 UCSRA = 0;
77 #include <util/setbaud.h>
78 UBRRH = UBRRH_VALUE;
79 UBRRL = UBRRL_VALUE;
80 #if USE_2X
81 UCSRA |= (1 << U2X);
82 #else
83 UCSRA &= ~(1 << U2X);
84 #endif
85 UCSRB |= _BV(TXEN);
86 #if ONLY_OUT == 0
87 UCSRB |= _BV(RXEN);
88 #endif
89 UCSRC = 0x86;
90
91 stdout = &mystdout;
92 stdin = stdout;
93 }
94
95
96
97
com_io.h
Заголовочный файл библиотеки ввода-вывода для USART.
INIT
INIT(7)
Функция настройки параметров USART и инициализации ввода-вывода.
Definition: com_io.c:74
avr_helper.h
Вспомогательные макросы для работы с AVR.


FlexMenu: Файл com_io.h

Файл com_io.h
#include <stdio.h>

См. исходные тексты.

Подробное описание

Автор
ARV
Дата
05.02.2009
Версия
1.0 beta
Авторство
2008 © ARV. All rights reserved. Для компиляции требуется:
  1. WinAVR-20080411 или более новая версия

См. определение в файле com_io.h


FlexMenu: Исходный файл com_io.h

com_io.h
См. документацию.
1
14 #ifndef COM_IO_H_
15 #define COM_IO_H_
16
17 #include <stdio.h>
18
20 #define USE_WDT 0
21
23 #define ONLY_OUT 1
24
26 #define BAUD 38400UL
27
28 void putch(char c);
29 #endif /* COM_IO_H_ */


FlexMenu: Файлы

Файлы
Полный список документированных файлов.
avr_helper.h | Вспомогательные макросы для работы с AVR
com_io.c | Библиотека ввода-вывода для USART
com_io.h | Заголовочный файл библиотеки ввода-вывода для USART
fmenu.c | Реализация системы меню
fmenu.h | Определения системы меню
fmenu_config.h | Конфигурация FlexMenu
fproperty.c | Реализация системы свойств
fproperty.h | Определения системы свойств
lcd.c |
lcd.h |
lcd_out.c | Модуль вывода меню на символьный ЖКИ
terminal_out.c | Модуль вывода на терминал через USART
test.c | Тестовый проект для демонстрации возможностей системы FlexMenu
ver.h | Определения, зависящие от версии компилятора, и общее описание проекта


FlexMenu: Файл fmenu.c

Функции | Переменные
Файл fmenu.c
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
#include "avr_helper.h"
#include "fmenu.h"
#include "fproperty.h"

См. исходные тексты.

Функции

void | store_menu_properties (_mem menu_item_t *item)
void | load_menu_properties (_mem menu_item_t *item)
void | init_menu (_mem menu_item_t *menu, bool load_props)
bool | do_menu (menu_event_t ev)

Переменные

_mem menu_item_t * menu_first

Подробное описание

Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 4.9.x или более новая версия

См. определение в файле fmenu.c

Функции

◆ do_menu()

bool do_menu ( menu_event_t ev )

навигация и управление

Аргументы
ev событие управления меню
Возвращает
true, если работа с меню должна продолжаться, false в противном случае

См. определение в файле fmenu.c строка 119

Перекрестные ссылки menu_current, MEV_ENTER, MITEM_CMD, MITEM_PROP, NONE и menu_item::type.

◆ init_menu()

void init_menu | ( | _mem menu_item_t * | menu,
 |  | bool | load_props
 | ) |  |
Заметки
функция выводит меню

См. определение в файле fmenu.c строка 110

Перекрестные ссылки load_menu_properties(), menu_current, menu_first, NONE и paint_menu().

◆ load_menu_properties()

void load_menu_properties ( _mem menu_item_t * item )
Заметки
функция рекурсивно обходит дерево меню, поэтому не стоит увлекаться глубиной вложенности субменю, чтобы не переполнить стек

См. определение в файле fmenu.c строка 90

Перекрестные ссылки load_property(), MITEM_PROP и NONE.

Используется в init_menu().

◆ store_menu_properties()

void store_menu_properties ( _mem menu_item_t * item )
Заметки
функция рекурсивно обходит дерево меню, поэтому не стоит увлекаться глубиной вложенности субменю, чтобы не переполнить стек

См. определение в файле fmenu.c строка 64

Переменные

◆ menu_first

_mem menu_item_t* menu_first

вспомогательная переменная для сохранения первого отображаемого пункта меню

Заметки
эта переменная может использоватьс в функции paint_menu. эта переменная всегда имеет значение &NONE, если происходит инициализация меню, погружение в субменю или возврат из субменю - этот факт можно использовать внутри paint_menu, например, для отслеживания необходимости очистки экрана.

См. определение в файле fmenu.c строка 21

Используется в init_menu() и paint_menu().


FlexMenu: Исходный файл fmenu.c

fmenu.c
См. документацию.
1
13 #include <avr/io.h>
14 #include <string.h>
15 #include <avr/pgmspace.h>
16 #include "avr_helper.h"
17 #include "fmenu.h"
18 #include "fproperty.h"
19
20 _mem menu_item_t NONE = {0};
21 _mem menu_item_t *menu_first;
22 _mem menu_item_t *menu_current = &NONE;
23
24 static void strcpy_f(char *dest, const __memx char *src, uint8_t len){
25 while(len-- && *src)
26 *dest++ = *src++;
27 }
28
29 void get_item_text(char *buf, _mem menu_item_t *item){
30 #if defined(ENABLE_PROPERTIES)
31 char *tmp;
32 #endif
33 memset(buf, ' ', MENU_TEXT_LEN);
34 buf[MENU_TEXT_LEN] = 0;
35
36 if(item != &NONE){
37 #if defined(ENABLE_MITEM_USER)
38 if(item->type == MITEM_USER){
39 item->user_name(buf);
40 return;
41 }
42 #endif
43 // имя пункта слева
44 strcpy_f(buf+SPACE_LEFT, item->name, MENU_TEXT_LEN);
45 switch(item->type){
46 #if defined(ENABLE_PROPERTIES)
47 case MITEM_PROP:
48 // представление свойства - справа
49 tmp = property_as_text(item->prop);
50 strcpy_f(buf + MENU_TEXT_LEN - SPACE_RIGHT - strlen(tmp), tmp, PROP_WIDTH);
51 break;
52 #endif
53 case MITEM_SUBM:
54 // субменю отмечается спецсимволом
55 buf[MENU_TEXT_LEN-1 - SPACE_RIGHT] = SUBMENU_SYMBOL;
56 break;
57 }
58 }
59 }
60
61 #if defined(ENABLE_PROPERTIES)
62 void store_menu_properties(_mem menu_item_t *item){
65
66 while(item->next != &NONE){
67 // ищем пункты со свойствами
68 if(item->type == MITEM_PROP){
69 // и сохраняем найденные свойства
70 store_property(item->prop);
71 } else
72
73 if(item->type == MITEM_SUBM){
74 // погружаемся на уровень субменю и сохраняем его свойства
75 store_menu_properties(item->sub);
76 }
77 item = item->next;
78 }
79 }
80
81 static bool notify_prop(_mem menu_item_t *pm){
82 if(pm->func != NULL)
83 return pm->func(pm->type == MITEM_CMD ? NULL : ((_mem property_t *)pm->prop)->var);
84 else
85 return true;
86 }
87
90 void load_menu_properties(_mem menu_item_t *item){
91
92 while(item->next != &NONE){
93 // ищем пункты со свойствами
94 if(item->type == MITEM_PROP){
95 // загружаем найденные
96 load_property(item->prop);
97 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
98 notify_prop(item);
99 #endif
100 } else if(item->type == MITEM_SUBM){
101 // для субменю повторяем то же самое
102 load_menu_properties(item->sub);
103 }
104 item = item->next;
105 }
106 }
107 #endif
108
110 void init_menu(_mem menu_item_t *menu, bool load_props){
111 #if defined(ENABLE_PROPERTIES)
112 if(load_props) load_menu_properties(menu);
113 #endif
114 menu_current = menu;
115 menu_first = &NONE;
116 paint_menu();
117 }
118
119 bool do_menu(menu_event_t ev){
120 if((menu_current == NULL) || (menu_current == &NONE)) return false;
121 switch(ev){
122 case MEV_ENTER: // активация пункта
123 switch(menu_current->type){
124 case MITEM_CMD:
125 #if defined(ENABLE_PROPERTIES)
126 case MITEM_PROP:
127 if(notify_prop(menu_current)) break;
128 return false;
129 #else
130 return menu_current->func(NULL);
131 #endif
132 case MITEM_SUBM:
133 // для субменю просто входим в него
134 menu_current = menu_current->sub;
135 menu_first = &NONE; //menu_current;
136 break;
137 }
138 paint_menu();
139 break;
140 case MEV_ESCAPE:
141 if(menu_current->parent != &NONE){
142 menu_first = &NONE;
143 menu_current = menu_current->parent;//menu_first;
144 paint_menu();
145 } else return false;
146 break;
147 case MEV_NEXT:
148 if(menu_current->next != &NONE){
149 menu_current = menu_current->next;
150 paint_menu();
151 }
152 break;
153 case MEV_PREV:
154 if(menu_current->prev != &NONE){
155 menu_current = menu_current->prev;
156 paint_menu();
157 }
158 break;
159 #if defined(ENABLE_PROPERTIES)
160 case MEV_INC:
161 if(menu_current->type == MITEM_PROP){
162 property_edit(menu_current->prop, 1);
163 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
164 notify_prop(menu_current);
165 #endif
166 paint_menu();
167 }
168 #if defined(ENABLE_MITEM_USER)
169 else if(menu_current->type == MITEM_USER){
170 menu_current->user_edit(1);
171 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
172 notify_prop(menu_current);
173 #endif
174 paint_menu();
175 }
176 #endif
177 break;
178 case MEV_DEC:
179 if(menu_current->type == MITEM_PROP){
180 property_edit(menu_current->prop, -1);
181 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
182 notify_prop(menu_current);
183 #endif
184 paint_menu();
185 }
186 #if defined(ENABLE_MITEM_USER)
187 else if(menu_current->type == MITEM_USER){
188 menu_current->user_edit(-1);
189 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
190 notify_prop(menu_current);
191 #endif
192 paint_menu();
193 }
194 #endif
195 break;
196 #if defined(ENABLE_BIG_STEP_EDIT)
197 case MEV_BIG_INC:
198 if(menu_current->type == MITEM_PROP){
199 property_edit(menu_current->prop, BIG_DELTA);
200 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
201 notify_prop(menu_current);
202 #endif
203 paint_menu();
204 }
205 #if defined(ENABLE_MITEM_USER)
206 else if(menu_current->type == MITEM_USER){
207 menu_current->user_edit(BIG_DELTA);
208 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
209 notify_prop(menu_current);
210 #endif
211 paint_menu();
212 }
213 #endif
214 break;
215 case MEV_BIG_DEC:
216 if(menu_current->type == MITEM_PROP){
217 property_edit(menu_current->prop, -BIG_DELTA);
218 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
219 notify_prop(menu_current);
220 #endif
221 paint_menu();
222 }
223 #if defined(ENABLE_MITEM_USER)
224 else if(menu_current->type == MITEM_USER){
225 menu_current->user_edit(-BIG_DELTA);
226 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
227 notify_prop(menu_current);
228 #endif
229 paint_menu();
230 }
231 #endif
232 break;
233 #endif
234 #endif
235 case MEV_NONE:
236 default:
237 break;
238 }
239 return true;
240 }
241
MEV_PREV
@ MEV_PREV
перемещение к предыдущему пункту
Definition: fmenu.h:182
fproperty.h
Определения системы свойств
MITEM_SUBM
@ MITEM_SUBM
пункт-субменю
Definition: fmenu.h:63
load_property
void load_property(_mem property_t *prop)
Definition: fproperty.c:180
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
MEV_DEC
@ MEV_DEC
уменьшение значения свойства на 1.
Definition: fmenu.h:184
do_menu
bool do_menu(menu_event_t ev)
Definition: fmenu.c:119
SUBMENU_SYMBOL
#define SUBMENU_SYMBOL
Definition: fmenu_config.h:52
menu_item
пункт меню
Definition: fmenu.h:67
MEV_ENTER
@ MEV_ENTER
активация пункта
Definition: fmenu.h:179
menu_item::prop
_mem void * prop
ссылка на свзанное свойство
Definition: fmenu.h:80
paint_menu
void paint_menu(void)
Definition: lcd_out.c:37
property_as_text
char * property_as_text(_mem property_t *prop)
Definition: fproperty.c:45
menu_item::next
_mem struct menu_item * next
ссылка на следующий пункт в списке
Definition: fmenu.h:70
menu_item::func
notify_func func
функция-обработчик команды
Definition: fmenu.h:73
store_property
void store_property(_mem property_t *prop)
Definition: fproperty.c:151
menu_first
_mem menu_item_t * menu_first
Definition: fmenu.c:21
MEV_INC
@ MEV_INC
увеличение значения свойства на 1.
Definition: fmenu.h:183
menu_item::type
uint8_t type
тип пункта
Definition: fmenu.h:68
MEV_BIG_INC
@ MEV_BIG_INC
ускоренное увеличение свойства
Definition: fmenu.h:187
MITEM_PROP
@ MITEM_PROP
пункт-свойство
Definition: fmenu.h:62
NONE
_mem menu_item_t NONE
идентификатор "отсутствующего" пункта меню для ссылок в списке
Definition: fmenu.c:20
BIG_DELTA
#define BIG_DELTA
шаг приращения значения свойства при ускоренном редактировании
Definition: fmenu.h:174
PROP_WIDTH
#define PROP_WIDTH
Definition: fmenu_config.h:64
avr_helper.h
Вспомогательные макросы для работы с AVR.
SPACE_RIGHT
#define SPACE_RIGHT
Definition: fmenu_config.h:46
menu_item::parent
_mem struct menu_item * parent
ссылка на "родительский" пункт подменю
Definition: fmenu.h:71
MEV_BIG_DEC
@ MEV_BIG_DEC
ускоренное уменьшение свойства
Definition: fmenu.h:188
menu_item::sub
_mem struct menu_item * sub
ссылка на дочернее субменю
Definition: fmenu.h:82
store_menu_properties
void store_menu_properties(_mem menu_item_t *item)
Definition: fmenu.c:64
fmenu.h
Определения системы меню
menu_current
_mem menu_item_t * menu_current
текущий пункт меню, который следует выделить при отрисовке меню в функции paint_menu.
Definition: fmenu.c:22
property_edit
void property_edit(_mem property_t *prop, int16_t delta)
Definition: fproperty.c:109
init_menu
void init_menu(_mem menu_item_t *menu, bool load_props)
Definition: fmenu.c:110
MEV_NEXT
@ MEV_NEXT
перемещение к следующему пункту
Definition: fmenu.h:181
MEV_NONE
@ MEV_NONE
отсутствие действия
Definition: fmenu.h:178
MITEM_CMD
@ MITEM_CMD
пункт-команда
Definition: fmenu.h:61
SPACE_LEFT
#define SPACE_LEFT
Definition: fmenu_config.h:40
MEV_ESCAPE
@ MEV_ESCAPE
выход из меню (субменю)
Definition: fmenu.h:180
menu_event_t
menu_event_t
событие управления меню
Definition: fmenu.h:177
property_t
обобщенное свойство
Definition: fproperty.h:129
MENU_TEXT_LEN
#define MENU_TEXT_LEN
Definition: fmenu_config.h:58
get_item_text
void get_item_text(char buf[MENU_TEXT_LEN+1], _mem menu_item_t *item)
load_menu_properties
void load_menu_properties(_mem menu_item_t *item)
Definition: fmenu.c:90
menu_item::prev
_mem struct menu_item * prev
ссылка на предыдущий пункт в списке
Definition: fmenu.h:69


FlexMenu: Файл fmenu.h

Структуры данных | Макросы | Определения типов | Функции | Переменные
Файл fmenu.h
#include <stdbool.h>
#include "fmenu_config.h"

См. исходные тексты.

Структуры данных

struct menu_item

Макросы

#define | MENU_CMD(_ident, _name, _parent, _prev, _next, _func)
#define | MENU_SUB(_ident, _name, _parent, _prev, _next, _sub)
#define | MENU_PROP(_ident, _name, _parent, _prev, _next, _func, _prop)

Определения типов

typedef bool(* notify_func) (void *p)

Функции

void | init_menu (_mem menu_item_t *menu, bool load_props)
bool | do_menu (menu_event_t ev)
void | store_menu_properties (_mem menu_item_t *item)
void | load_menu_properties (_mem menu_item_t *item)
void | get_item_text (char buf[MENU_TEXT_LEN+1], _mem menu_item_t *item)
void | paint_menu (void)

Переменные

_mem menu_item_t * menu_first

Типы

◆ notify_func

typedef bool(* notify_func) (void *p)

тип функции-обработчика событий меню

Заметки
для пунктов меню типа MITEM_CMD в функцию будет передан параметр NULL, для пунктов типа MENU_PROP параметр p будет содержать указатель на значение свойства.
Аргументы
p указатель на данные
Возвращает
true, если следует продолжить работу с меню, false, если следует завершить работу с меню.

См. определение в файле fmenu.h строка 57

Перечисления

◆ menu_event_t

enum menu_event_t

событие управления меню

Элементы перечислений
MEV_NONE | отсутствие действия
MEV_ENTER | активация пункта
MEV_ESCAPE | выход из меню (субменю)
MEV_NEXT | перемещение к следующему пункту
MEV_PREV | перемещение к предыдущему пункту
MEV_INC | увеличение значения свойства на 1.
MEV_DEC | уменьшение значения свойства на 1.
MEV_BIG_INC | ускоренное увеличение свойства
MEV_BIG_DEC | ускоренное уменьшение свойства

См. определение в файле fmenu.h строка 177

◆ mitem_t

enum mitem_t

тип пунктов меню

Элементы перечислений
MITEM_CMD | пункт-команда
MITEM_PROP | пункт-свойство
MITEM_SUBM | пункт-субменю

См. определение в файле fmenu.h строка 60

Функции

◆ do_menu()

bool do_menu ( menu_event_t ev )

навигация и управление

Аргументы
ev событие управления меню
Возвращает
true, если работа с меню должна продолжаться, false в противном случае

См. определение в файле fmenu.c строка 119

Перекрестные ссылки menu_current, MEV_ENTER, MITEM_CMD, MITEM_PROP, NONE и menu_item::type.

◆ get_item_text()

void get_item_text | ( | char | buf[MENU_TEXT_LEN+1],
 |  | _mem menu_item_t * | item
 | ) |  |

получение текстовой строки с представлением указанного пункта меню для реализации пользовательской функции paint_menu

Аргументы
buf | буфер, принимающий текст
item | указатель на пункт меню
Заметки
размер буфера должен быть не менее MENU_TEXT_LEN+1

◆ init_menu()

void init_menu | ( | _mem menu_item_t * | menu,
 |  | bool | load_props
 | ) |  |

Инициализация системы меню

Аргументы
menu | первый пункт главного меню
load_props | если true, то автоматически будут загружены все свойства, используеме в меню
Заметки
функция выводит меню

См. определение в файле fmenu.c строка 110

Перекрестные ссылки load_menu_properties(), menu_current, menu_first, NONE и paint_menu().

◆ load_menu_properties()

void load_menu_properties ( _mem menu_item_t * item )

загрузка из EEPROM значений всех свойств, связанных с меню (по всей иерархии)

Аргументы
item первый элемент списка меню
Заметки
функция рекурсивно обходит дерево меню, поэтому не стоит увлекаться глубиной вложенности субменю, чтобы не переполнить стек

См. определение в файле fmenu.c строка 90

Перекрестные ссылки load_property(), MITEM_PROP и NONE.

Используется в init_menu().

◆ paint_menu()

void paint_menu ( void )

отрисовка меню

Заметки
данная функция должна быть реализована пользователем

См. определение в файле lcd_out.c строка 37

Перекрестные ссылки menu_current, menu_first и NONE.

Используется в init_menu().

◆ store_menu_properties()

void store_menu_properties ( _mem menu_item_t * item )

сохранение в EEPOM значений всех свойств, связанных с меню (по всей иерархии)

Аргументы
item первый элемент списка меню
Заметки
функция рекурсивно обходит дерево меню, поэтому не стоит увлекаться глубиной вложенности субменю, чтобы не переполнить стек

См. определение в файле fmenu.c строка 64

Переменные

◆ menu_first

_mem menu_item_t* menu_first

вспомогательная переменная для сохранения первого отображаемого пункта меню

Заметки
эта переменная может использоватьс в функции paint_menu. эта переменная всегда имеет значение &NONE, если происходит инициализация меню, погружение в субменю или возврат из субменю - этот факт можно использовать внутри paint_menu, например, для отслеживания необходимости очистки экрана.

См. определение в файле fmenu.c строка 21

Используется в init_menu() и paint_menu().


FlexMenu: Исходный файл fmenu.h

fmenu.h
См. документацию.
1
41 #ifndef FMENU_H_
42 #define FMENU_H_
43
44 #include <stdbool.h>
45 #include "fmenu_config.h"
46
47
57 typedef bool (*notify_func)(void* p);
58
60 typedef enum {
61 MITEM_CMD,
62 MITEM_PROP,
63 MITEM_SUBM
64 } mitem_t;
65
67 typedef const struct menu_item {
68 uint8_t type;
69 _mem struct menu_item *prev;
70 _mem struct menu_item *next;
71 _mem struct menu_item *parent;
72 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
73 notify_func func;
74 #endif
75 union{
76 #if !defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
77 notify_func func;
78 #endif
79 #if defined(ENABLE_PROPERTIES)
80 _mem void *prop;
81 #endif
82 _mem struct menu_item *sub;
83 };
84 const char name[];
85 } menu_item_t;
86
92 extern _mem menu_item_t *menu_first;
94 extern _mem menu_item_t *menu_current;
95
96 // вспомогаельные макросы
118 #define MENU_CMD(_ident, _name, _parent, _prev, _next, _func) \
119 extern _mem menu_item_t _parent; \
120 extern _mem menu_item_t _prev; \
121 extern _mem menu_item_t _next; \
122 _mem menu_item_t _ident = {.type = MITEM_CMD, .prev = &_prev, .next = &_next, .parent = &_parent, .func = _func, .name = _name}
123
134 #define MENU_SUB(_ident, _name, _parent, _prev, _next, _sub) \
135 extern _mem menu_item_t _parent; \
136 extern _mem menu_item_t _prev; \
137 extern _mem menu_item_t _next; \
138 extern _mem menu_item_t _sub; \
139 _mem menu_item_t _ident = {.type = MITEM_SUBM, .prev = &_prev, .next = &_next, .func = NULL, .parent = &_parent, .sub = &_sub, .name = _name}
140
141 #if defined(ENABLE_PROPERTIES)
142
154 #if defined(ENABLE_NOTIFY_ON_CHANGE_PROPERTY)
155 #define MENU_PROP(_ident, _name, _parent, _prev, _next, _func, _prop) \
156 extern _mem menu_item_t _parent; \
157 extern _mem menu_item_t _prev; \
158 extern _mem menu_item_t _next; \
159 _mem menu_item_t _ident = {.type = MITEM_PROP, .prev = &_prev, .next = &_next, .parent = &_parent, .func = (void*)_func, .prop = (_mem void*)&_prop, .name = _name}
160 #else
161 #define MENU_PROP(_ident, _name, _parent, _prev, _next, _prop) \
162 extern _mem menu_item_t _parent; \
163 extern _mem menu_item_t _prev; \
164 extern _mem menu_item_t _next; \
165 _mem menu_item_t _ident = {.type = MITEM_PROP, .prev = &_prev, .next = &_next, .parent = &_parent, .prop = (_mem void*)&_prop, .name = _name}
166 #endif
167
168 #endif
169
171 extern _mem menu_item_t NONE;
172
174 #define BIG_DELTA 10
175
177 typedef enum {
178 MEV_NONE,
179 MEV_ENTER,
180 MEV_ESCAPE,
181 MEV_NEXT,
182 MEV_PREV,
183 MEV_INC,
184 MEV_DEC,
185 #if !__DOXYGEN__
186 #if defined(ENABLE_BIG_STEP_EDIT)
187 MEV_BIG_INC,
188 MEV_BIG_DEC
189 #endif
190 #endif
191 } menu_event_t;
192
198 void init_menu(_mem menu_item_t *menu, bool load_props);
199
205 bool do_menu(menu_event_t ev);
206
207 #if defined(ENABLE_PROPERTIES)
208
212 void store_menu_properties(_mem menu_item_t *item);
213
218 void load_menu_properties(_mem menu_item_t *item);
219
220 #endif
221
229 void get_item_text(char buf[MENU_TEXT_LEN+1], _mem menu_item_t *item);
230
235 void paint_menu(void);
236
237 #endif /* FMENU_H_ */
MEV_PREV
@ MEV_PREV
перемещение к предыдущему пункту
Definition: fmenu.h:182
menu_item_t
const struct menu_item menu_item_t
пункт меню
MITEM_SUBM
@ MITEM_SUBM
пункт-субменю
Definition: fmenu.h:63
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
MEV_DEC
@ MEV_DEC
уменьшение значения свойства на 1.
Definition: fmenu.h:184
menu_item
пункт меню
Definition: fmenu.h:67
MEV_ENTER
@ MEV_ENTER
активация пункта
Definition: fmenu.h:179
load_menu_properties
void load_menu_properties(_mem menu_item_t *item)
Definition: fmenu.c:90
menu_item::prop
_mem void * prop
ссылка на свзанное свойство
Definition: fmenu.h:80
paint_menu
void paint_menu(void)
Definition: lcd_out.c:37
menu_current
_mem menu_item_t * menu_current
текущий пункт меню, который следует выделить при отрисовке меню в функции paint_menu.
Definition: fmenu.c:22
menu_item::next
_mem struct menu_item * next
ссылка на следующий пункт в списке
Definition: fmenu.h:70
menu_item::func
notify_func func
функция-обработчик команды
Definition: fmenu.h:73
do_menu
bool do_menu(menu_event_t ev)
Definition: fmenu.c:119
MEV_INC
@ MEV_INC
увеличение значения свойства на 1.
Definition: fmenu.h:183
menu_item::type
uint8_t type
тип пункта
Definition: fmenu.h:68
MEV_BIG_INC
@ MEV_BIG_INC
ускоренное увеличение свойства
Definition: fmenu.h:187
MITEM_PROP
@ MITEM_PROP
пункт-свойство
Definition: fmenu.h:62
init_menu
void init_menu(_mem menu_item_t *menu, bool load_props)
Definition: fmenu.c:110
menu_item::parent
_mem struct menu_item * parent
ссылка на "родительский" пункт подменю
Definition: fmenu.h:71
MEV_BIG_DEC
@ MEV_BIG_DEC
ускоренное уменьшение свойства
Definition: fmenu.h:188
menu_item::sub
_mem struct menu_item * sub
ссылка на дочернее субменю
Definition: fmenu.h:82
notify_func
bool(* notify_func)(void *p)
Definition: fmenu.h:57
fmenu_config.h
Конфигурация FlexMenu.
mitem_t
mitem_t
тип пунктов меню
Definition: fmenu.h:60
MEV_NEXT
@ MEV_NEXT
перемещение к следующему пункту
Definition: fmenu.h:181
menu_item::name
const char name[]
текст пункта
Definition: fmenu.h:84
menu_first
_mem menu_item_t * menu_first
Definition: fmenu.c:21
MEV_NONE
@ MEV_NONE
отсутствие действия
Definition: fmenu.h:178
MITEM_CMD
@ MITEM_CMD
пункт-команда
Definition: fmenu.h:61
MEV_ESCAPE
@ MEV_ESCAPE
выход из меню (субменю)
Definition: fmenu.h:180
menu_event_t
menu_event_t
событие управления меню
Definition: fmenu.h:177
store_menu_properties
void store_menu_properties(_mem menu_item_t *item)
Definition: fmenu.c:64
NONE
_mem menu_item_t NONE
идентификатор "отсутствующего" пункта меню для ссылок в списке
Definition: fmenu.c:20
MENU_TEXT_LEN
#define MENU_TEXT_LEN
Definition: fmenu_config.h:58
get_item_text
void get_item_text(char buf[MENU_TEXT_LEN+1], _mem menu_item_t *item)
menu_item::prev
_mem struct menu_item * prev
ссылка на предыдущий пункт в списке
Definition: fmenu.h:69


FlexMenu: Файл fmenu_config.h

Макросы
Файл fmenu_config.h
#include "ver.h"

См. исходные тексты.

Макросы

#define | PLACE_CONST_IN_FLASH
#define | DISPLAY_WIDTH 16
#define | SPACE_LEFT 1
#define | SPACE_RIGHT 0
#define | SUBMENU_SYMBOL '>'
#define | MENU_TEXT_LEN DISPLAY_WIDTH
#define | PROP_WIDTH (MENU_TEXT_LEN / 2)
#define | ENABLE_PROPERTIES
#define | ENABLE_I16_PROPERTIES
#define | ENABLE_U16_PROPERTIES
#define | ENABLE_BOOL_PROPERTIES
#define | ENABLE_ENUM_PROPERTIES
#define | ENABLE_NOTIFY_ON_CHANGE_PROPERTY
#define | ENABLE_BIG_STEP_EDIT

Подробное описание

Файл содержит набор макросов, позволяющих провести "тонкую" настройку проекта, для обеспечения наилучшего соотношения "объем памяти / возможности" и ряд вспомогательных макросов, используемых в проекте.

Макросы, начинающиеся на ENABLE_ - это переключатели возможностей. Если соответстввующая возможность не требуется, следует заремарить соответствущий макрос, если нужна - ремарку снять.

Автор
ARV
Дата
1 мая 2020 г.
Авторство
2020 © ARV. All rights reserved.

См. определение в файле fmenu_config.h

Макросы

◆ DISPLAY_WIDTH

#define DISPLAY_WIDTH 16

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

См. определение в файле fmenu_config.h строка 35

◆ ENABLE_BIG_STEP_EDIT

#define ENABLE_BIG_STEP_EDIT

разрешить обработку событий редактирования свойств MEV_BIG_INC и MEV_BIG_DEC

См. определение в файле fmenu_config.h строка 104

◆ ENABLE_BOOL_PROPERTIES

#define ENABLE_BOOL_PROPERTIES

разрешить булевы свойства (см. PROP_BOOL)

См. определение в файле fmenu_config.h строка 89

◆ ENABLE_ENUM_PROPERTIES

#define ENABLE_ENUM_PROPERTIES

разрешить свойства типа выбор из списка вариантов (см. PROP_ENUM)

См. определение в файле fmenu_config.h строка 94

◆ ENABLE_I16_PROPERTIES

#define ENABLE_I16_PROPERTIES

разрешить 16-битные знаковые свойства (см. PROP_I16)

См. определение в файле fmenu_config.h строка 79

◆ ENABLE_NOTIFY_ON_CHANGE_PROPERTY

#define ENABLE_NOTIFY_ON_CHANGE_PROPERTY

разрешить функцию уведомления об изменении значения свойства (см. notify_func)

См. определение в файле fmenu_config.h строка 99

◆ ENABLE_PROPERTIES

#define ENABLE_PROPERTIES

разрешить свойства

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

См. определение в файле fmenu_config.h строка 74

◆ ENABLE_U16_PROPERTIES

#define ENABLE_U16_PROPERTIES

разрешить 16-битные беззнаковые свойства (см. PROP_U16)

См. определение в файле fmenu_config.h строка 84

◆ MENU_TEXT_LEN

#define MENU_TEXT_LEN DISPLAY_WIDTH

ограничитель длины текста пункта меню в символах рекомендуется связывать значение этого макроса с размерами ЖКИ или иного средства отображения меню

См. определение в файле fmenu_config.h строка 59

◆ PLACE_CONST_IN_FLASH

#define PLACE_CONST_IN_FLASH

макрос для размещение всех константных структур и т.п. данных меню и свойств в памяти программ. заремарить, если все надо размещать в ОЗУ

Заметки
размещение в ОЗУ незначительно уменьшает размер кода и увеличивает быстродействие, но при этом расходует значительно больше ОЗУ

См. определение в файле fmenu_config.h строка 28

◆ PROP_WIDTH

#define PROP_WIDTH (MENU_TEXT_LEN / 2)

ограничитель длины текста, представляющего значение свойства, в символах рекомендуется связывать значение этого макроса с размерами ЖКИ или иного средства отображения меню

См. определение в файле fmenu_config.h строка 65

◆ SPACE_LEFT

#define SPACE_LEFT 1

количество пробелов слева от текста пункта меню

См. определение в файле fmenu_config.h строка 41

◆ SPACE_RIGHT

#define SPACE_RIGHT 0

количество пробелов справа от текста пункта меню

См. определение в файле fmenu_config.h строка 47

◆ SUBMENU_SYMBOL

#define SUBMENU_SYMBOL '>'

символ, используемый для пометки пункта-субменю, выводится в крайней правой позиции строки с текстом пункта

См. определение в файле fmenu_config.h строка 53


FlexMenu: Исходный файл fmenu_config.h

fmenu_config.h
См. документацию.
1
18 #ifndef FMENU_CONFIG_H_
19 #define FMENU_CONFIG_H_
20
27 #define PLACE_CONST_IN_FLASH
28
34 #define DISPLAY_WIDTH 16
35
40 #define SPACE_LEFT 1
41
46 #define SPACE_RIGHT 0
47
52 #define SUBMENU_SYMBOL '>'
53
58 #define MENU_TEXT_LEN DISPLAY_WIDTH
59
64 #define PROP_WIDTH (MENU_TEXT_LEN / 2)
65
73 #define ENABLE_PROPERTIES
74
78 #define ENABLE_I16_PROPERTIES
79
83 #define ENABLE_U16_PROPERTIES
84
88 #define ENABLE_BOOL_PROPERTIES
89
93 #define ENABLE_ENUM_PROPERTIES
94
98 #define ENABLE_NOTIFY_ON_CHANGE_PROPERTY
99
103 #define ENABLE_BIG_STEP_EDIT
104
105 #include "ver.h"
106
107 #endif /* FMENU_CONFIG_H_ */
ver.h
Определения, зависящие от версии компилятора, и общее описание проекта


FlexMenu: Файл fproperty.c

Функции
Файл fproperty.c
#include <avr/io.h>
#include "avr_helper.h"
#include "fproperty.h"
#include <stdlib.h>
#include <string.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include "lcd.h"

См. исходные тексты.

Функции

char * | property_as_text (_mem property_t *prop)
void | property_edit (_mem property_t *prop, int16_t delta)
void | store_property (_mem property_t *prop)
void | load_property (_mem property_t *prop)

Подробное описание

Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 4.9.x или более новая версия

См. определение в файле fproperty.c

Функции

◆ load_property()

void load_property ( _mem property_t * prop )

считывание значения свойства из EEPROM

Аргументы
prop считываемое свойство

См. определение в файле fproperty.c строка 180

Перекрестные ссылки NOSTORE, PR_BOOL, PR_ENUM, PR_H16, PR_H8, PR_I16, PR_I8, PR_U16, PR_U8 и menu_item::prop.

Используется в load_menu_properties().

◆ property_as_text()

char* property_as_text ( _mem property_t * prop )

текстовое представление свойства

Аргументы
prop указатель на свойство
Возвращает
указатель на текстовый вид свойства

См. определение в файле fproperty.c строка 45

◆ property_edit()

void property_edit | ( | _mem property_t * | prop,
 |  | int16_t | delta
 | ) |  |

редактор свойства

Аргументы
prop | указатель на свойство
delta | приращение значения свойства
Заметки
для булева свойства значение delta игнорируется

См. определение в файле fproperty.c строка 109

Перекрестные ссылки PR_H8, PR_U8 и menu_item::prop.

◆ store_property()

void store_property ( _mem property_t * prop )

запись значения свойства в EEPROM

Аргументы
prop записываемое свойство

См. определение в файле fproperty.c строка 151

Перекрестные ссылки NOSTORE, PR_BOOL, PR_ENUM, PR_H16, PR_H8, PR_I16, PR_I8, PR_U16, PR_U8 и menu_item::prop.


FlexMenu: Исходный файл fproperty.c

fproperty.c
См. документацию.
1
13 #include <avr/io.h>
14 #include "avr_helper.h"
15 #include "fproperty.h"
16 #include <stdlib.h>
17 #include <string.h>
18 #include <avr/pgmspace.h>
19 #include <avr/eeprom.h>
20
21 #include "lcd.h"
22
23 #if defined(ENABLE_PROPERTIES)
24
25 static char tmpstr[DISPLAY_WIDTH+1];
26
27 #if defined(ENABLE_I16_PROPERTIES) || defined(ENABLE_U16_PROPERTIES)
28 typedef int32_t big_int;
29 #define ITOA(x,y,z) ltoa(x,y,z)
30 #else
31 typedef int16_t big_int;
32 #define ITOA(x,y,z) itoa(x,y,z)
33 #endif
34
35 static char* num_text(big_int num){
36 ITOA(num, tmpstr, 10);
37 return tmpstr;
38 }
39
40 static char* hex_text(big_int num, uint8_t dig){
41 ITOA(num, tmpstr, 16);
42 return tmpstr;
43 }
44
45 char* property_as_text(_mem property_t *prop){
46 tmpstr[0] = 0;
47 switch(prop->type){
48 case PR_U8:
49 return num_text(*(uint8_t*)prop->var);
50 #if defined(ENABLE_U16_PROPERTIES)
51 case PR_U16:
52 return num_text(*(uint16_t*)prop->var);
53 case PR_H16:
54 return hex_text(*(uint16_t*)prop->var, 4);
55 #endif
56 case PR_I8:
57 return num_text(*(int8_t*)prop->var);
58 #if defined(ENABLE_I16_PROPERTIES)
59 case PR_I16:
60 return num_text(*(int16_t*)prop->var);
61 #endif
62 case PR_H8:
63 return hex_text(*(uint8_t*)prop->var, 2);
64 #if defined(ENABLE_BOOL_PROPERTIES)
65 case PR_BOOL:
66 #if defined(PLACE_CONST_IN_FLASH)
67 strcpy_P(tmpstr, ((_mem prop_bool_t*)prop)->values[*(bool*)prop->var]);
68 #else
69 strcpy(tmpstr, ((_mem prop_bool_t*)prop)->values[*(bool*)prop->var]);
70 #endif
71 break;
72 #endif
73 #if defined(ENABLE_ENUM_PROPERTIES)
74 case PR_ENUM:
75 #if defined(PLACE_CONST_IN_FLASH)
76 strcpy_P(tmpstr, ((_mem prop_enum_t*)prop)->values[*(uint8_t*)prop->var]);
77 #else
78 strcpy(tmpstr, ((_mem prop_enum_t*)prop)->values[*(uint8_t*)prop->var]);
79 #endif
80 #endif
81 default:
82 break;
83 }
84 return tmpstr;
85 }
86
87 static big_int normalize(big_int d, big_int min, big_int max){
88 if (d > max)
89 d = max;
90 else if (d < min)
91 d = min;
92 return d;
93 }
94
95 static big_int default_val(big_int d, big_int min, big_int max){
96 if((d < min) || (d > max)) {
97 #if DEFAULT_PROP_VAL == DEF_MIN
98 return min;
99 #elif DEFAULT_PROP_VAL == DEF_MAX
100 return max;
101 #else
102 return (min + max) / 2;
103 #endif
104 }
105 return d;
106 }
107
108
109 void property_edit(_mem property_t *prop, int16_t delta){
110 big_int tmp;
111
112 switch(prop->type){
113 case PR_U8:
114 case PR_H8:
115 tmp = *(uint8_t*)prop->var + delta;
116 *(uint8_t*)prop->var = normalize(tmp, ((_mem prop_u8_t*)prop)->min, ((_mem prop_u8_t*)prop)->max);
117 break;
118 #if defined(ENABLE_U16_PROPERTIES)
119 case PR_U16:
120 case PR_H16:
121 tmp = *(uint16_t*)prop->var + (big_int)delta;
122 *(uint16_t*)prop->var = normalize(tmp, ((_mem prop_u16_t*)prop)->min, ((_mem prop_u16_t*)prop)->max);
123 break;
124 #endif
125 case PR_I8:
126 tmp = *(int8_t*)prop->var + delta;
127 *(int8_t*)prop->var = normalize(tmp, ((_mem prop_i8_t*)prop)->min, ((_mem prop_i8_t*)prop)->max);
128 break;
129 #if defined(ENABLE_I16_PROPERTIES)
130 case PR_I16:
131 tmp = *(int16_t*)prop->var + (big_int)delta;
132 *(int16_t*)prop->var = normalize(tmp, ((_mem prop_i16_t*)prop)->min, ((_mem prop_i16_t*)prop)->max);
133 break;
134 #endif
135 #if defined(ENABLE_BOOL_PROPERTIES)
136 case PR_BOOL:
137 *(bool*)prop->var = ! *(bool*)prop->var;
138 break;
139 #endif
140 #if defined(ENABLE_ENUM_PROPERTIES)
141 case PR_ENUM:
142 if(delta > 1) delta = 1;
143 else if(delta < -1) delta = -1;
144
145 *(uint8_t*)prop->var = normalize(*(uint8_t*)prop->var + delta, 0, ((_mem prop_enum_t*)prop)->cnt);
146 break;
147 #endif
148 }
149 }
150
151 void store_property(_mem property_t *prop){
152 if(prop->store == NOSTORE) return;
153
154 switch(prop->type){
155 case PR_I8:
156 case PR_U8:
157 case PR_H8:
158 #if defined(ENABLE_ENUM_PROPERTIES)
159 case PR_ENUM:
160 #endif
161 eeprom_update_block((uint8_t*)prop->var, prop->store, sizeof(uint8_t));
162 break;
163 #if defined(ENABLE_I16_PROPERTIES)
164 case PR_I16:
165 #endif
166 #if defined(ENABLE_U16_PROPERTIES)
167 case PR_U16:
168 case PR_H16:
169 #endif
170 eeprom_update_block((uint16_t*)prop->var, prop->store, sizeof(uint16_t));
171 break;
172 #if defined(ENABLE_BOOL_PROPERTIES)
173 case PR_BOOL:
174 eeprom_update_block((bool*)prop->var, prop->store, sizeof(bool));
175 break;
176 #endif
177 }
178 }
179
180 void load_property(_mem property_t *prop){
181
182 if(prop->store == NOSTORE) return;
183
184 switch(prop->type){
185 case PR_U8:
186 case PR_I8:
187 case PR_H8:
188 #if defined(ENABLE_ENUM_PROPERTIES)
189 case PR_ENUM:
190 #endif
191 eeprom_read_block(prop->var, prop->store, sizeof(uint8_t));
192 break;
193 #if defined(ENABLE_U16_PROPERTIES)
194 case PR_U16:
195 case PR_H16:
196 #endif
197 #if defined(ENABLE_I16_PROPERTIES)
198 case PR_I16:
199 #endif
200 eeprom_read_block(prop->var, prop->store, sizeof(uint16_t));
201 break;
202 #if defined(ENABLE_BOOL_PROPERTIES)
203 case PR_BOOL:
204 eeprom_read_block(prop->var, prop->store, sizeof(bool));
205 break;
206 #endif
207 }
208
209 #if DEFAULT_PROP_VAL < DEF_ANY
210 // приведение к допустимому диапазону по умолчанию
211 switch(prop->type){
212 case PR_U8:
213 case PR_H8:
214 *(uint8_t*)prop->var = default_val(*(uint8_t*)prop->var, ((_mem prop_u8_t*)prop)->min, ((_mem prop_u8_t*)prop)->max);
215 break;
216 case PR_I8:
217 *(int8_t*)prop->var = default_val(*(int8_t*)prop->var, ((_mem prop_i8_t*)prop)->min, ((_mem prop_i8_t*)prop)->max);
218 break;
219 #if defined(ENABLE_ENUM_PROPERTIES)
220 case PR_ENUM:
221 *(uint8_t*)prop->var = default_val(*(uint8_t*)prop->var, 0, ((_mem prop_enum_t*)prop)->cnt);
222 break;
223 #endif
224 #if defined(ENABLE_BOOL_PROPERTIES)
225 case PR_BOOL:
226 *(bool*)prop->var = default_val(*(bool*)prop->var, false, true);
227 break;
228 #endif
229 #if defined(ENABLE_U16_PROPERTIES)
230 case PR_U16:
231 case PR_H16:
232 *(uint16_t*)prop->var = default_val(*(uint16_t*)prop->var, ((_mem prop_u16_t*)prop)->min, ((_mem prop_u16_t*)prop)->max);
233 break;
234 #endif
235 #if defined(ENABLE_I16_PROPERTIES)
236 case PR_I16:
237 *(int16_t*)prop->var = default_val(*(int16_t*)prop->var, ((_mem prop_i16_t*)prop)->min, ((_mem prop_i16_t*)prop)->max);
238 break;
239 #endif
240 }
241 #endif
242 }
243
244 #endif
fproperty.h
Определения системы свойств
PR_U8
@ PR_U8
целое 8 бит без знака
Definition: fproperty.h:89
load_property
void load_property(_mem property_t *prop)
Definition: fproperty.c:180
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
prop_i8_t
Определение свойства: целое 8 бит со знаком
Definition: fproperty.h:141
prop_enum_t
Определение свойства: вариант выбора
Definition: fproperty.h:167
menu_item::prop
_mem void * prop
ссылка на свзанное свойство
Definition: fmenu.h:80
property_as_text
char * property_as_text(_mem property_t *prop)
Definition: fproperty.c:45
store_property
void store_property(_mem property_t *prop)
Definition: fproperty.c:151
PR_ENUM
@ PR_ENUM
вариант из перечисления
Definition: fproperty.h:110
PR_I8
@ PR_I8
целое 8 бит со знаком
Definition: fproperty.h:90
avr_helper.h
Вспомогательные макросы для работы с AVR.
property_edit
void property_edit(_mem property_t *prop, int16_t delta)
Definition: fproperty.c:109
NOSTORE
#define NOSTORE
свойства, значение которых не должно сохраняться, должны получить это значение в качестве адреса EEPR...
Definition: fproperty.h:324
prop_i16_t
Определение свойства: целое 16 бит со знаком
Definition: fproperty.h:158
PR_BOOL
@ PR_BOOL
булево
Definition: fproperty.h:105
PR_U16
@ PR_U16
целое 16 бит без знака
Definition: fproperty.h:94
DISPLAY_WIDTH
#define DISPLAY_WIDTH
Definition: fmenu_config.h:34
prop_u8_t
Определение свойства: целое 8 бит без знака
Definition: fproperty.h:134
property_t
обобщенное свойство
Definition: fproperty.h:129
PR_H8
@ PR_H8
целое 8 бит в виде HEX.
Definition: fproperty.h:91
PR_I16
@ PR_I16
целое 16 бит со знаком
Definition: fproperty.h:100
PR_H16
@ PR_H16
целое 16 бит в виде HEX.
Definition: fproperty.h:95
prop_u16_t
Определение свойства: целое 16 бит без знака
Definition: fproperty.h:149


FlexMenu: Файл fproperty.h

Структуры данных | Макросы | Функции
Файл fproperty.h
#include <stdbool.h>
#include "fmenu_config.h"

См. исходные тексты.

Структуры данных

struct | property_t
struct | prop_u8_t
struct | prop_i8_t
struct | prop_u16_t
struct | prop_i16_t
struct | prop_enum_t

Макросы

#define | PROPERTY_FIELDS
#define | PROP_U8(_var, _eadr, _min, _max) (_mem prop_u8_t){.type = PR_U8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_I8(_var, _eadr, _min, _max) (_mem prop_i8_t){.type = PR_I8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_U16(_var, _eadr, _min, _max) (_mem prop_u16_t){.type = PR_U16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_H16(_var, _eadr, _min, _max) (_mem prop_u16_t){.type = PR_H16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_I16(_var, _eadr, _min, _max) (_mem prop_i16_t){.type = PR_I16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_H8(_var, _eadr, _min, _max) (_mem prop_u8_t){.type = PR_H8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_BOOL(_var, _eadr, ...) (_mem prop_bool_t){.type = PR_BOOL, .var = &_var, .store = _eadr, .cnt = 2, .values = fs(__VA_ARGS__)}
#define | PROP_ENUM(_var, _eadr, _cnt, ...) (_mem prop_enum_t){.type = PR_ENUM, .var = &_var, .store = _eadr, .cnt = _cnt, .values = fs(__VA_ARGS__)}
#define | DEFAULT_PROP_VAL DEF_MIN

Функции

char * | property_as_text (_mem property_t *prop)
void | property_edit (_mem property_t *prop, int16_t delta)
void | load_property (_mem property_t *prop)
void | store_property (_mem property_t *prop)

Макросы

◆ DEFAULT_PROP_VAL

#define DEFAULT_PROP_VAL DEF_MIN

режим нормирования считанных из EEPROM значений свойств:
один из DEF_MIN, DEF_MAX, DEF_MID или DEF_ANY

Заметки
нормирование по умолчанию используется при считывании значений свойств функцией load_property в том случае, если из EEPROM считано значение, не попадающее в допустимый диапазон (такое бывает, например, при первом запуске, когда содержимое EEPROM еще не инициализировано)

См. определение в файле fproperty.h строка 310

◆ PROPERTY_FIELDS

#define PROPERTY_FIELDS
Макроопределение:
prop_type_t type; \
void *var; \
void *store

Общие поля всех свойств:
type тип свойства
var указатель на переменную со значением
store адрес сохранения в EEPROM

См. определение в файле fproperty.h строка 124

Перечисления

◆ prop_type_t

enum prop_type_t

тип свойства

Элементы перечислений
PR_U8 | целое 8 бит без знака
PR_I8 | целое 8 бит со знаком
PR_H8 | целое 8 бит в виде HEX.
PR_U16 | целое 16 бит без знака
PR_H16 | целое 16 бит в виде HEX.
PR_I16 | целое 16 бит со знаком
PR_BOOL | булево
PR_ENUM | вариант из перечисления

См. определение в файле fproperty.h строка 88

Функции

◆ load_property()

void load_property ( _mem property_t * prop )

считывание значения свойства из EEPROM

Аргументы
prop считываемое свойство

См. определение в файле fproperty.c строка 180

Перекрестные ссылки NOSTORE, PR_BOOL, PR_ENUM, PR_H16, PR_H8, PR_I16, PR_I8, PR_U16, PR_U8 и menu_item::prop.

Используется в load_menu_properties().

◆ property_as_text()

char* property_as_text ( _mem property_t * prop )

текстовое представление свойства

Аргументы
prop указатель на свойство
Возвращает
указатель на текстовый вид свойства

См. определение в файле fproperty.c строка 45

◆ property_edit()

void property_edit | ( | _mem property_t * | prop,
 |  | int16_t | delta
 | ) |  |

редактор свойства

Аргументы
prop | указатель на свойство
delta | приращение значения свойства
Заметки
для булева свойства значение delta игнорируется

См. определение в файле fproperty.c строка 109

Перекрестные ссылки PR_H8, PR_U8 и menu_item::prop.

◆ store_property()

void store_property ( _mem property_t * prop )

запись значения свойства в EEPROM

Аргументы
prop записываемое свойство

См. определение в файле fproperty.c строка 151

Перекрестные ссылки NOSTORE, PR_BOOL, PR_ENUM, PR_H16, PR_H8, PR_I16, PR_I8, PR_U16, PR_U8 и menu_item::prop.

prop_type_t
prop_type_t
тип свойства
Definition: fproperty.h:88


FlexMenu: Исходный файл fproperty.h

fproperty.h
См. документацию.
1
79 #ifndef FPROPERTY_H_
80 #define FPROPERTY_H_
81
82 #include <stdbool.h>
83 #include "fmenu_config.h"
84
85 #if defined(ENABLE_PROPERTIES)
86
88 typedef enum {
89 PR_U8,
90 PR_I8,
91 PR_H8,
92 #if !__DOXYGEN__
93 #if defined(ENABLE_U16_PROPERTIES)
94 PR_U16,
95 PR_H16,
96 #endif
97 #endif
98 #if !__DOXYGEN__
99 #if defined(ENABLE_I16_PROPERTIES)
100 PR_I16,
101 #endif
102 #endif
103 #if !__DOXYGEN__
104 #if defined(ENABLE_BOOL_PROPERTIES)
105 PR_BOOL,
106 #endif
107 #endif
108 #if !__DOXYGEN__
109 #if defined(ENABLE_ENUM_PROPERTIES)
110 PR_ENUM
111 #endif
112 #endif
113 } prop_type_t;
114
123 #define PROPERTY_FIELDS \
124 prop_type_t type; \
125 void *var; \
126 void *store
127
129 typedef struct {
130 PROPERTY_FIELDS;
131 } property_t;
132
134 typedef struct {
135 PROPERTY_FIELDS;
136 uint8_t min;
137 uint8_t max;
138 } prop_u8_t;
139
141 typedef struct {
142 PROPERTY_FIELDS;
143 int8_t min;
144 int8_t max;
145 } prop_i8_t;
146
147 #if defined(ENABLE_U16_PROPERTIES)
148 typedef struct {
150 PROPERTY_FIELDS;
151 uint16_t min;
152 uint16_t max;
153 } prop_u16_t;
154 #endif
155
156 #if defined(ENABLE_I16_PROPERTIES)
157 typedef struct {
159 PROPERTY_FIELDS;
160 int16_t min;
161 int16_t max;
162 } prop_i16_t;
163 #endif
164
165 #if defined(ENABLE_ENUM_PROPERTIES) || defined(ENABLE_BOOL_PROPERTIES)
166 typedef struct {
168 PROPERTY_FIELDS;
169 uint8_t cnt;
170 _mem pchar_f *values;
171 } prop_enum_t;
172 #endif
173
174 #if defined(ENABLE_BOOL_PROPERTIES)
175 typedef prop_enum_t prop_bool_t;
177 #endif
178
179 // вспомогательные макросы для удобного формирования параметров свойств
180
188 #define PROP_U8(_var, _eadr, _min, _max) \
189 (_mem prop_u8_t){.type = PR_U8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
190
198 #define PROP_I8(_var, _eadr, _min, _max) \
199 (_mem prop_i8_t){.type = PR_I8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
200
201 #if defined(ENABLE_U16_PROPERTIES)
202
209 #define PROP_U16(_var, _eadr, _min, _max) \
210 (_mem prop_u16_t){.type = PR_U16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
211
219 #define PROP_H16(_var, _eadr, _min, _max) \
220 (_mem prop_u16_t){.type = PR_H16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
221 #endif
222
223 #if defined(ENABLE_I16_PROPERTIES)
224
231 #define PROP_I16(_var, _eadr, _min, _max) \
232 (_mem prop_i16_t){.type = PR_I16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
233 #endif
234
242 #define PROP_H8(_var, _eadr, _min, _max) \
243 (_mem prop_u8_t){.type = PR_H8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
244
245 #define fs(...) ((_mem pchar_f[]){__VA_ARGS__})
246
247 #if defined(ENABLE_BOOL_PROPERTIES)
248
261 #define PROP_BOOL(_var, _eadr, ...) \
262 (_mem prop_bool_t){.type = PR_BOOL, .var = &_var, .store = _eadr, .cnt = 2, .values = fs(__VA_ARGS__)}
263 #endif
264
265 #if defined(ENABLE_ENUM_PROPERTIES)
266
274 #define PROP_ENUM(_var, _eadr, _cnt, ...) \
275 (_mem prop_enum_t){.type = PR_ENUM, .var = &_var, .store = _eadr, .cnt = _cnt, .values = fs(__VA_ARGS__)}
276 #endif
277
283 char* property_as_text(_mem property_t *prop);
284
291 void property_edit(_mem property_t *prop, int16_t delta);
292
293 // варианты приведения значения свойства к допустимому диапазону после считывания
295 #define DEF_MIN 0
296 #define DEF_MAX 1
298 #define DEF_MID 2
300 #define DEF_ANY 3
302
309 #define DEFAULT_PROP_VAL DEF_MIN
310
315 void load_property(_mem property_t *prop);
316
321 void store_property(_mem property_t *prop);
322
324 #define NOSTORE ((void*)-1)
325
326 #endif
327 #endif /* FPROPERTY_H_ */
PR_U8
@ PR_U8
целое 8 бит без знака
Definition: fproperty.h:89
prop_enum_t::cnt
uint8_t cnt
количество вариантов для выбора
Definition: fproperty.h:169
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
prop_u8_t::max
uint8_t max
максимально допустимое значение
Definition: fproperty.h:137
prop_bool_t
prop_enum_t prop_bool_t
Определение свойства: булево
Definition: fproperty.h:176
prop_i8_t
Определение свойства: целое 8 бит со знаком
Definition: fproperty.h:141
prop_type_t
prop_type_t
тип свойства
Definition: fproperty.h:88
prop_enum_t
Определение свойства: вариант выбора
Definition: fproperty.h:167
PROPERTY_FIELDS
#define PROPERTY_FIELDS
Definition: fproperty.h:123
prop_u8_t::min
uint8_t min
минимально допустимое значение
Definition: fproperty.h:136
property_edit
void property_edit(_mem property_t *prop, int16_t delta)
Definition: fproperty.c:109
load_property
void load_property(_mem property_t *prop)
Definition: fproperty.c:180
PR_ENUM
@ PR_ENUM
вариант из перечисления
Definition: fproperty.h:110
prop_enum_t::values
_mem pchar_f * values
массив строк-вариантов (см. PROP_BOOL)
Definition: fproperty.h:170
prop_i16_t::max
int16_t max
максимально допустимое значение
Definition: fproperty.h:161
PR_I8
@ PR_I8
целое 8 бит со знаком
Definition: fproperty.h:90
property_as_text
char * property_as_text(_mem property_t *prop)
Definition: fproperty.c:45
store_property
void store_property(_mem property_t *prop)
Definition: fproperty.c:151
prop_u16_t::max
uint16_t max
максимально допустимое значение
Definition: fproperty.h:152
fmenu_config.h
Конфигурация FlexMenu.
prop_i16_t::min
int16_t min
минимально допустимое значение
Definition: fproperty.h:160
prop_i16_t
Определение свойства: целое 16 бит со знаком
Definition: fproperty.h:158
PR_BOOL
@ PR_BOOL
булево
Definition: fproperty.h:105
property_t::PROPERTY_FIELDS
PROPERTY_FIELDS
см. Общие_поля
Definition: fproperty.h:130
PR_U16
@ PR_U16
целое 16 бит без знака
Definition: fproperty.h:94
prop_i8_t::min
int8_t min
минимально допустимое значение
Definition: fproperty.h:143
prop_u16_t::min
uint16_t min
минимально допустимое значение
Definition: fproperty.h:151
prop_u8_t
Определение свойства: целое 8 бит без знака
Definition: fproperty.h:134
property_t
обобщенное свойство
Definition: fproperty.h:129
PR_H8
@ PR_H8
целое 8 бит в виде HEX.
Definition: fproperty.h:91
pchar_f
_mem char * pchar_f
указатель на константный символ
Definition: ver.h:57
prop_i8_t::max
int8_t max
максимально допустимое значение
Definition: fproperty.h:144
PR_I16
@ PR_I16
целое 16 бит со знаком
Definition: fproperty.h:100
PR_H16
@ PR_H16
целое 16 бит в виде HEX.
Definition: fproperty.h:95
prop_u16_t
Определение свойства: целое 16 бит без знака
Definition: fproperty.h:149


FlexMenu: Поля структур

Список всех документированных членов структур данных со ссылками на документацию по структуре для каждого члена.
  • cnt : prop_enum_t
  • func : menu_item
  • max : prop_i16_t , prop_i8_t , prop_u16_t , prop_u8_t
  • min : prop_i16_t , prop_i8_t , prop_u16_t , prop_u8_t
  • name : menu_item
  • next : menu_item
  • parent : menu_item
  • prev : menu_item
  • prop : menu_item
  • PROPERTY_FIELDS : property_t
  • sub : menu_item
  • type : menu_item
  • values : prop_enum_t


FlexMenu: Поля структур - Переменные

  • cnt : prop_enum_t
  • func : menu_item
  • max : prop_i16_t , prop_i8_t , prop_u16_t , prop_u8_t
  • min : prop_i16_t , prop_i8_t , prop_u16_t , prop_u8_t
  • name : menu_item
  • next : menu_item
  • parent : menu_item
  • prev : menu_item
  • prop : menu_item
  • PROPERTY_FIELDS : property_t
  • sub : menu_item
  • type : menu_item
  • values : prop_enum_t


FlexMenu: Список членов всех файлов

Список всех документированных функций, переменных, макроопределений, перечислений и определений типов со ссылками на документацию.

- _ -

  • _mem : ver.h

- a -

  • ADC_TRIG_ACOMP : avr_helper.h
  • ADC_TRIG_FRUN : avr_helper.h
  • ADC_TRIG_INT0 : avr_helper.h
  • ADC_TRIG_PCI : avr_helper.h
  • ADC_TRIG_T0_COMPA : avr_helper.h
  • ADC_TRIG_T0_COMPB : avr_helper.h
  • ADC_TRIG_T0_OVF : avr_helper.h
  • ADC_TRIG_T1_CAPTURE : avr_helper.h
  • ADC_TRIG_T1_COMPB : avr_helper.h
  • ADC_TRIG_T1_OVF : avr_helper.h
  • AUTOINIT : avr_helper.h

- b -

  • BAUD : com_io.h
  • BIG_DELTA : fmenu.h

- c -

  • CONCAT : avr_helper.h

- d -

  • DDR : avr_helper.h
  • DEF_ANY : fproperty.h
  • DEF_MAX : fproperty.h
  • DEF_MID : fproperty.h
  • DEF_MIN : fproperty.h
  • DEFAULT_PROP_VAL : fproperty.h
  • DISPLAY_WIDTH : fmenu_config.h
  • do_menu() : fmenu.c , fmenu.h
  • DONE : avr_helper.h

- e -

  • ENABLE_BIG_STEP_EDIT : fmenu_config.h
  • ENABLE_BOOL_PROPERTIES : fmenu_config.h
  • ENABLE_ENUM_PROPERTIES : fmenu_config.h
  • ENABLE_I16_PROPERTIES : fmenu_config.h
  • ENABLE_NOTIFY_ON_CHANGE_PROPERTY : fmenu_config.h
  • ENABLE_PROPERTIES : fmenu_config.h
  • ENABLE_U16_PROPERTIES : fmenu_config.h

- g -

  • get_event() : test.c
  • get_item_text() : fmenu.h

- i -

  • INIT : avr_helper.h , com_io.c
  • init_menu() : fmenu.c , fmenu.h

- l -

  • load_menu_properties() : fmenu.c , fmenu.h
  • load_property() : fproperty.c , fproperty.h

- m -

  • MAIN : avr_helper.h
  • MENU_CMD : fmenu.h
  • menu_current : fmenu.h , fmenu.c
  • menu_event_t : fmenu.h
  • menu_first : fmenu.c , fmenu.h
  • menu_item_t : fmenu.h
  • MENU_PROP : fmenu.h
  • MENU_SUB : fmenu.h
  • MENU_TEXT_LEN : fmenu_config.h
  • MEV_BIG_DEC : fmenu.h
  • MEV_BIG_INC : fmenu.h
  • MEV_DEC : fmenu.h
  • MEV_ENTER : fmenu.h
  • MEV_ESCAPE : fmenu.h
  • MEV_INC : fmenu.h
  • MEV_NEXT : fmenu.h
  • MEV_NONE : fmenu.h
  • MEV_PREV : fmenu.h
  • MITEM_CMD : fmenu.h
  • MITEM_PROP : fmenu.h
  • MITEM_SUBM : fmenu.h
  • mitem_t : fmenu.h

- n -

  • NOINIT : avr_helper.h
  • NONE : fmenu.c , fmenu.h
  • NOSTORE : fproperty.h
  • notify_func : fmenu.h

- o -

  • ONLY_OUT : com_io.h

- p -

  • paint_menu() : fmenu.h , lcd_out.c , terminal_out.c
  • pchar_f : ver.h
  • PIN : avr_helper.h
  • PLACE_CONST_IN_FLASH : fmenu_config.h
  • PORT : avr_helper.h
  • PR_BOOL : fproperty.h
  • PR_ENUM : fproperty.h
  • PR_H16 : fproperty.h
  • PR_H8 : fproperty.h
  • PR_I16 : fproperty.h
  • PR_I8 : fproperty.h
  • PR_U16 : fproperty.h
  • PR_U8 : fproperty.h
  • PROP_BOOL : fproperty.h
  • prop_bool_t : fproperty.h
  • PROP_ENUM : fproperty.h
  • PROP_H16 : fproperty.h
  • PROP_H8 : fproperty.h
  • PROP_I16 : fproperty.h
  • PROP_I8 : fproperty.h
  • prop_type_t : fproperty.h
  • PROP_U16 : fproperty.h
  • PROP_U8 : fproperty.h
  • PROP_WIDTH : fmenu_config.h
  • property_as_text() : fproperty.c , fproperty.h
  • property_edit() : fproperty.h , fproperty.c
  • PROPERTY_FIELDS : fproperty.h

- s -

  • SPACE_LEFT : fmenu_config.h
  • SPACE_RIGHT : fmenu_config.h
  • store_menu_properties() : fmenu.h , fmenu.c
  • store_property() : fproperty.c , fproperty.h
  • str_f : ver.h
  • SUBMENU_SYMBOL : fmenu_config.h

- u -

  • USE_WDT : com_io.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- a -

  • AC_INT_ON_FALLING : avr_helper.h
  • AC_INT_ON_RISING : avr_helper.h
  • AC_INT_ON_TOGGLE : avr_helper.h
  • ADC_0 : avr_helper.h
  • ADC_1 : avr_helper.h
  • ADC_2 : avr_helper.h
  • ADC_3 : avr_helper.h
  • ADC_4 : avr_helper.h
  • ADC_5 : avr_helper.h
  • ADC_6 : avr_helper.h
  • ADC_7 : avr_helper.h
  • ADC_DIV_128 : avr_helper.h
  • ADC_DIV_16 : avr_helper.h
  • ADC_DIV_2 : avr_helper.h
  • ADC_DIV_32 : avr_helper.h
  • ADC_DIV_4 : avr_helper.h
  • ADC_DIV_64 : avr_helper.h
  • ADC_DIV_8 : avr_helper.h
  • ADC_REF_AVCC : avr_helper.h
  • ADC_REF_EXTERNAL : avr_helper.h
  • ADC_REF_INT_WITH_ECAP : avr_helper.h
  • ADC_TRIG_ACOMP : avr_helper.h
  • ADC_TRIG_FRUN : avr_helper.h
  • ADC_TRIG_INT0 : avr_helper.h
  • ADC_TRIG_PCI : avr_helper.h
  • ADC_TRIG_T0_COMPA : avr_helper.h
  • ADC_TRIG_T0_COMPB : avr_helper.h
  • ADC_TRIG_T0_OVF : avr_helper.h
  • ADC_TRIG_T1_CAPTURE : avr_helper.h
  • ADC_TRIG_T1_COMPB : avr_helper.h
  • ADC_TRIG_T1_OVF : avr_helper.h
  • AUTOINIT : avr_helper.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- b -

  • BAUD : com_io.h
  • beep() : test.c
  • BIG_DELTA : fmenu.h
  • big_int : fproperty.c


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- c -

  • CONCAT : avr_helper.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- d -

  • DDR : avr_helper.h , lcd.c
  • DEF_ANY : fproperty.h
  • DEF_MAX : fproperty.h
  • DEF_MID : fproperty.h
  • DEF_MIN : fproperty.h
  • DEFAULT_PROP_VAL : fproperty.h
  • DELAY : test.c
  • delay : lcd.c
  • DISPLAY_WIDTH : fmenu_config.h
  • do_menu() : fmenu.h , fmenu.c
  • done() : test.c
  • DONE : avr_helper.h


FlexMenu: Список членов всех файлов

- _ -

  • _mem : ver.h

- a -

  • ADC_TRIG_ACOMP : avr_helper.h
  • ADC_TRIG_FRUN : avr_helper.h
  • ADC_TRIG_INT0 : avr_helper.h
  • ADC_TRIG_PCI : avr_helper.h
  • ADC_TRIG_T0_COMPA : avr_helper.h
  • ADC_TRIG_T0_COMPB : avr_helper.h
  • ADC_TRIG_T0_OVF : avr_helper.h
  • ADC_TRIG_T1_CAPTURE : avr_helper.h
  • ADC_TRIG_T1_COMPB : avr_helper.h
  • ADC_TRIG_T1_OVF : avr_helper.h
  • AUTOINIT : avr_helper.h

- b -

  • BAUD : com_io.h
  • BIG_DELTA : fmenu.h

- c -

  • CONCAT : avr_helper.h

- d -

  • DDR : avr_helper.h
  • DEF_ANY : fproperty.h
  • DEF_MAX : fproperty.h
  • DEF_MID : fproperty.h
  • DEF_MIN : fproperty.h
  • DEFAULT_PROP_VAL : fproperty.h
  • DISPLAY_WIDTH : fmenu_config.h
  • DONE : avr_helper.h

- e -

  • ENABLE_BIG_STEP_EDIT : fmenu_config.h
  • ENABLE_BOOL_PROPERTIES : fmenu_config.h
  • ENABLE_ENUM_PROPERTIES : fmenu_config.h
  • ENABLE_I16_PROPERTIES : fmenu_config.h
  • ENABLE_NOTIFY_ON_CHANGE_PROPERTY : fmenu_config.h
  • ENABLE_PROPERTIES : fmenu_config.h
  • ENABLE_U16_PROPERTIES : fmenu_config.h

- i -

  • INIT : avr_helper.h

- m -

  • MAIN : avr_helper.h
  • MENU_CMD : fmenu.h
  • MENU_PROP : fmenu.h
  • MENU_SUB : fmenu.h
  • MENU_TEXT_LEN : fmenu_config.h

- n -

  • NOINIT : avr_helper.h
  • NOSTORE : fproperty.h

- o -

  • ONLY_OUT : com_io.h

- p -

  • PIN : avr_helper.h
  • PLACE_CONST_IN_FLASH : fmenu_config.h
  • PORT : avr_helper.h
  • PROP_BOOL : fproperty.h
  • PROP_ENUM : fproperty.h
  • PROP_H16 : fproperty.h
  • PROP_H8 : fproperty.h
  • PROP_I16 : fproperty.h
  • PROP_I8 : fproperty.h
  • PROP_U16 : fproperty.h
  • PROP_U8 : fproperty.h
  • PROP_WIDTH : fmenu_config.h
  • PROPERTY_FIELDS : fproperty.h

- s -

  • SPACE_LEFT : fmenu_config.h
  • SPACE_RIGHT : fmenu_config.h
  • SUBMENU_SYMBOL : fmenu_config.h

- u -

  • USE_WDT : com_io.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- e -

  • ems : test.c
  • ENABLE_BIG_STEP_EDIT : fmenu_config.h
  • ENABLE_BOOL_PROPERTIES : fmenu_config.h
  • ENABLE_ENUM_PROPERTIES : fmenu_config.h
  • ENABLE_I16_PROPERTIES : fmenu_config.h
  • ENABLE_NOTIFY_ON_CHANGE_PROPERTY : fmenu_config.h
  • ENABLE_PROPERTIES : fmenu_config.h
  • ENABLE_U16_PROPERTIES : fmenu_config.h
  • ESC : terminal_out.c
  • eu8 : test.c
  • EXINT_CHANGE : avr_helper.h
  • EXINT_FALLING : avr_helper.h
  • EXINT_LOWLEVEL : avr_helper.h
  • EXINT_RISING : avr_helper.h


FlexMenu: Список членов всех файлов

  • menu_event_t : fmenu.h
  • mitem_t : fmenu.h
  • prop_type_t : fproperty.h


FlexMenu: Список членов всех файлов

  • MEV_BIG_DEC : fmenu.h
  • MEV_BIG_INC : fmenu.h
  • MEV_DEC : fmenu.h
  • MEV_ENTER : fmenu.h
  • MEV_ESCAPE : fmenu.h
  • MEV_INC : fmenu.h
  • MEV_NEXT : fmenu.h
  • MEV_NONE : fmenu.h
  • MEV_PREV : fmenu.h
  • MITEM_CMD : fmenu.h
  • MITEM_PROP : fmenu.h
  • MITEM_SUBM : fmenu.h
  • PR_BOOL : fproperty.h
  • PR_ENUM : fproperty.h
  • PR_H16 : fproperty.h
  • PR_H8 : fproperty.h
  • PR_I16 : fproperty.h
  • PR_I8 : fproperty.h
  • PR_U16 : fproperty.h
  • PR_U8 : fproperty.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- f -

  • first_func() : lcd_out.c , terminal_out.c , test.c
  • fs : fproperty.h


FlexMenu: Список членов всех файлов

  • do_menu() : fmenu.c , fmenu.h
  • get_event() : test.c
  • get_item_text() : fmenu.h
  • INIT() : com_io.c
  • init_menu() : fmenu.c , fmenu.h
  • load_menu_properties() : fmenu.c , fmenu.h
  • load_property() : fproperty.c , fproperty.h
  • paint_menu() : fmenu.h , lcd_out.c , terminal_out.c
  • property_as_text() : fproperty.c , fproperty.h
  • property_edit() : fproperty.c , fproperty.h
  • store_menu_properties() : fmenu.c , fmenu.h
  • store_property() : fproperty.c , fproperty.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- g -

  • get_event() : test.c
  • get_item_text() : fmenu.h , fmenu.c


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- i -

  • INIT : avr_helper.h , com_io.c
  • init_menu() : fmenu.h , fmenu.c
  • ITOA : fproperty.c


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- l -

  • last_func() : lcd_out.c , terminal_out.c , test.c
  • LCD_BUSY : lcd.h
  • LCD_CGRAM : lcd.h
  • LCD_CLR : lcd.h
  • lcd_clrscr() : lcd.h , lcd.c
  • lcd_command() : lcd.c , lcd.h
  • LCD_CONTROLLER_KS0073 : lcd.h
  • lcd_data() : lcd.c , lcd.h
  • LCD_DATA0_PIN : lcd.h
  • LCD_DATA0_PORT : lcd.h
  • LCD_DATA1_PIN : lcd.h
  • LCD_DATA1_PORT : lcd.h
  • LCD_DATA2_PIN : lcd.h
  • LCD_DATA2_PORT : lcd.h
  • LCD_DATA3_PIN : lcd.h
  • LCD_DATA3_PORT : lcd.h
  • LCD_DDRAM : lcd.h
  • LCD_DISP_LENGTH : lcd.h
  • LCD_DISP_OFF : lcd.h
  • LCD_DISP_ON : lcd.h
  • LCD_DISP_ON_BLINK : lcd.h
  • LCD_DISP_ON_CURSOR : lcd.h
  • LCD_DISP_ON_CURSOR_BLINK : lcd.h
  • lcd_e_delay : lcd.c
  • lcd_e_high : lcd.c
  • lcd_e_low : lcd.c
  • LCD_E_PIN : lcd.h
  • LCD_E_PORT : lcd.h
  • lcd_e_toggle : lcd.c
  • LCD_ENTRY_DEC : lcd.h
  • LCD_ENTRY_DEC_SHIFT : lcd.h
  • LCD_ENTRY_INC : lcd.h
  • LCD_ENTRY_INC_ : lcd.h
  • LCD_ENTRY_INC_SHIFT : lcd.h
  • LCD_ENTRY_MODE : lcd.h
  • LCD_ENTRY_SHIFT : lcd.h
  • LCD_FUNCTION : lcd.h
  • LCD_FUNCTION_10DOTS : lcd.h
  • LCD_FUNCTION_2LINES : lcd.h
  • LCD_FUNCTION_4BIT_1LINE : lcd.h
  • LCD_FUNCTION_4BIT_2LINES : lcd.h
  • LCD_FUNCTION_8BIT : lcd.h
  • LCD_FUNCTION_8BIT_1LINE : lcd.h
  • LCD_FUNCTION_8BIT_2LINES : lcd.h
  • LCD_FUNCTION_DEFAULT : lcd.c
  • lcd_getxy() : lcd.c
  • lcd_gotoxy() : lcd.c , lcd.h
  • lcd_home() : lcd.h , lcd.c
  • LCD_HOME : lcd.h
  • lcd_init() : lcd.c , lcd.h
  • LCD_IO_MODE : lcd.h
  • LCD_LINE_LENGTH : lcd.h
  • LCD_LINES : lcd.h
  • LCD_MODE_DEFAULT : lcd.h
  • LCD_MOVE : lcd.h
  • LCD_MOVE_CURSOR_LEFT : lcd.h
  • LCD_MOVE_CURSOR_RIGHT : lcd.h
  • LCD_MOVE_DISP : lcd.h
  • LCD_MOVE_DISP_LEFT : lcd.h
  • LCD_MOVE_DISP_RIGHT : lcd.h
  • LCD_MOVE_RIGHT : lcd.h
  • LCD_ON : lcd.h
  • LCD_ON_BLINK : lcd.h
  • LCD_ON_CURSOR : lcd.h
  • LCD_ON_DISPLAY : lcd.h
  • LCD_PORT : lcd.h
  • lcd_putc() : lcd.h , lcd.c
  • lcd_puts() : lcd.c , lcd.h
  • lcd_puts_p() : lcd.c , lcd.h
  • lcd_puts_P : lcd.h
  • lcd_rs_high : lcd.c
  • lcd_rs_low : lcd.c
  • LCD_RS_PIN : lcd.h
  • LCD_RS_PORT : lcd.h
  • lcd_rw_high : lcd.c
  • lcd_rw_low : lcd.c
  • LCD_RW_PIN : lcd.h
  • LCD_RW_PORT : lcd.h
  • LCD_START_LINE1 : lcd.h
  • LCD_START_LINE2 : lcd.h
  • LCD_START_LINE3 : lcd.h
  • LCD_START_LINE4 : lcd.h
  • LCD_WRAP_LINES : lcd.h
  • load() : test.c
  • load_menu_properties() : fmenu.c , fmenu.h
  • load_property() : fproperty.h , fproperty.c


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- m -

  • MAIN : avr_helper.h , test.c
  • MENU_CMD() : test.c , fmenu.h , test.c
  • menu_current : fmenu.c , fmenu.h
  • menu_event_t : fmenu.h
  • menu_first : fmenu.h , fmenu.c
  • menu_item_t : fmenu.h
  • MENU_PROP : fmenu.h , test.c
  • MENU_SUB() : test.c , fmenu.h , test.c
  • MENU_TEXT_LEN : fmenu_config.h
  • MEV_BIG_DEC : fmenu.h
  • MEV_BIG_INC : fmenu.h
  • MEV_DEC : fmenu.h
  • MEV_ENTER : fmenu.h
  • MEV_ESCAPE : fmenu.h
  • MEV_INC : fmenu.h
  • MEV_NEXT : fmenu.h
  • MEV_NONE : fmenu.h
  • MEV_PREV : fmenu.h
  • MITEM_CMD : fmenu.h
  • MITEM_PROP : fmenu.h
  • MITEM_SUBM : fmenu.h
  • mitem_t : fmenu.h
  • motor() : test.c
  • motor_state : test.c


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- n -

  • NOINIT : avr_helper.h
  • NONE : fmenu.c , fmenu.h
  • NOSTORE : fproperty.h
  • notify_func : fmenu.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- o -

  • ONLY_OUT : com_io.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- p -

  • paint_menu() : fmenu.h , lcd_out.c , terminal_out.c
  • pchar_f : ver.h
  • PIN : avr_helper.h , lcd.c
  • PLACE_CONST_IN_FLASH : fmenu_config.h
  • PORT : avr_helper.h
  • PR_BOOL : fproperty.h
  • PR_ENUM : fproperty.h
  • PR_H16 : fproperty.h
  • PR_H8 : fproperty.h
  • PR_I16 : fproperty.h
  • PR_I8 : fproperty.h
  • PR_U16 : fproperty.h
  • PR_U8 : fproperty.h
  • print_line() : com_io.c
  • PROP_BOOL : fproperty.h
  • prop_bool_t : fproperty.h
  • PROP_ENUM : fproperty.h
  • PROP_H16 : fproperty.h
  • PROP_H8 : fproperty.h
  • PROP_I16 : fproperty.h
  • PROP_I8 : fproperty.h
  • prop_type_t : fproperty.h
  • PROP_U16 : fproperty.h
  • PROP_U8 : fproperty.h
  • PROP_WIDTH : fmenu_config.h
  • property_as_text() : fproperty.h , fproperty.c
  • property_edit() : fproperty.h , fproperty.c
  • PROPERTY_FIELDS : fproperty.h
  • putch() : com_io.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- s -

  • S16 : avr_helper.h
  • S32 : avr_helper.h
  • S8 : avr_helper.h
  • save() : test.c
  • sf : test.c
  • SPACE_LEFT : fmenu_config.h
  • SPACE_RIGHT : fmenu_config.h
  • SPI_CLK_DIV_128 : avr_helper.h
  • SPI_CLK_DIV_16 : avr_helper.h
  • SPI_CLK_DIV_4 : avr_helper.h
  • SPI_CLK_DIV_64 : avr_helper.h
  • store_menu_properties() : fmenu.h , fmenu.c
  • store_property() : fproperty.h , fproperty.c
  • str_f : ver.h
  • SUBMENU_SYMBOL : fmenu_config.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- t -

  • TERMINAL_CLR : terminal_out.c
  • TERMINAL_GOTO_XY : terminal_out.c
  • TERMINAL_HIDE_CUR : terminal_out.c
  • TERMINAL_NOSEL : terminal_out.c
  • TERMINAL_SEL : terminal_out.c
  • TIMER_CLK_DIV : avr_helper.h
  • TIMER_CLK_DIV_1 : avr_helper.h
  • TIMER_CLK_DIV_1024 : avr_helper.h
  • TIMER_CLK_DIV_256 : avr_helper.h
  • TIMER_CLK_DIV_64 : avr_helper.h
  • TIMER_CLK_DIV_8 : avr_helper.h
  • TIMER_CLK_EXT_FALL : avr_helper.h
  • TIMER_CLK_EXT_RISE : avr_helper.h
  • TIMER_OC_CLEAR : avr_helper.h
  • TIMER_OC_NONE : avr_helper.h
  • TIMER_OC_SET : avr_helper.h
  • TIMER_OC_TOGGLE : avr_helper.h
  • TWI_CLK_DIV_1 : avr_helper.h
  • TWI_CLK_DIV_16 : avr_helper.h
  • TWI_CLK_DIV_4 : avr_helper.h
  • TWI_CLK_DIV_64 : avr_helper.h


FlexMenu: Список членов всех файлов

  • menu_item_t : fmenu.h
  • notify_func : fmenu.h
  • pchar_f : ver.h
  • prop_bool_t : fproperty.h
  • str_f : ver.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- u -

  • U16 : avr_helper.h
  • U32 : avr_helper.h
  • U8 : avr_helper.h
  • u8 : test.c
  • USE_WDT : com_io.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- v -

  • vfr : test.c
  • VOID_OUTPUT_FUNC : lcd.h


FlexMenu: Список членов всех файлов

  • menu_current : fmenu.c , fmenu.h
  • menu_first : fmenu.c , fmenu.h
  • NONE : fmenu.c , fmenu.h


FlexMenu: Список членов всех файлов

Список всех функций, переменных, макроопределений, перечислений и определений типов со ссылками на файлы, к которым они принадлежат.

- x -

  • XTAL : lcd.h


FlexMenu: LCD library

LCD library
#include <lcd.h>

Originally based on Volker Oth's LCD library, changed lcd_init(), added additional constants for lcd_command(), added 4-bit I/O mode, improved and optimized code.

Library can be operated in memory mapped mode (LCD_IO_MODE=0) or in 4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not supported.

Memory mapped mode compatible with Kanda STK200, but supports also generation of R/W signal through A8 address line.

Автор
Peter Fleury pfleu.nosp@m.ry@g.nosp@m.mx.ch http://jump.to/fleury
См. также
The chapter Interfacing a HD44780 Based LCD to an AVR on my home page.
Заметки
Modifyed by ARV: added some options for output fuctions.


FlexMenu: Вспомогательные макросы

Макросы
Вспомогательные макросы

Макросы

#define | MENU_CMD(_ident, _name, _parent, _prev, _next, _func)
#define | MENU_SUB(_ident, _name, _parent, _prev, _next, _sub)
#define | MENU_PROP(_ident, _name, _parent, _prev, _next, _func, _prop)
#define | PROP_U8(_var, _eadr, _min, _max) (_mem prop_u8_t){.type = PR_U8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_I8(_var, _eadr, _min, _max) (_mem prop_i8_t){.type = PR_I8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_U16(_var, _eadr, _min, _max) (_mem prop_u16_t){.type = PR_U16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_H16(_var, _eadr, _min, _max) (_mem prop_u16_t){.type = PR_H16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_I16(_var, _eadr, _min, _max) (_mem prop_i16_t){.type = PR_I16, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_H8(_var, _eadr, _min, _max) (_mem prop_u8_t){.type = PR_H8, .var = &_var, .store = _eadr, .min = _min, .max = _max}
#define | PROP_BOOL(_var, _eadr, ...) (_mem prop_bool_t){.type = PR_BOOL, .var = &_var, .store = _eadr, .cnt = 2, .values = fs(__VA_ARGS__)}
#define | PROP_ENUM(_var, _eadr, _cnt, ...) (_mem prop_enum_t){.type = PR_ENUM, .var = &_var, .store = _eadr, .cnt = _cnt, .values = fs(__VA_ARGS__)}

Подробное описание

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

При помощи вспомогательных макросов это делается значительно проще.

Макросы

◆ MENU_CMD

#define MENU_CMD | ( | _ident,
 |  | _name,
 |  | _parent,
 |  | _prev,
 |  | _next,
 |  | _func
 | ) |
Макроопределение:
extern _mem menu_item_t _parent; \
extern _mem menu_item_t _prev; \
extern _mem menu_item_t _next; \
_mem menu_item_t _ident = {.type = MITEM_CMD, .prev = &_prev, .next = &_next, .parent = &_parent, .func = _func, .name = _name}

Создание пункта-команды
параметры:
_ident иденификатор пункта (для ссылок в связном списке)
_name текст пунтка
_parent ссылка на идентификатор родительского пункта (NONE, если пункт принадлежит главному меню)
_prev ссылка на идентификатор предыдущего пункта (NONE, если пункт первый в списке)
_next ссылка на идентификатор следующего пункта (NONE, если пункт последний в списке)
_func функция типа notify_func, вызывается при получении события MEV_ENTER

См. определение в файле fmenu.h строка 119

◆ MENU_PROP

#define MENU_PROP | ( | _ident,
 |  | _name,
 |  | _parent,
 |  | _prev,
 |  | _next,
 |  | _func,
 |  | _prop
 | ) |
Макроопределение:
extern _mem menu_item_t _parent; \
extern _mem menu_item_t _prev; \
extern _mem menu_item_t _next; \
_mem menu_item_t _ident = {.type = MITEM_PROP, .prev = &_prev, .next = &_next, .parent = &_parent, .func = (void*)_func, .prop = (_mem void*)&_prop, .name = _name}

Создание пункта-свойства
параметры:
_ident иденификатор пункта (для ссылок в связном списке)
_name текст пунтка
_parent ссылка на идентификатор родительского пункта (NONE, если пункт принадлежит главному меню)
_prev ссылка на идентификатор предыдущего пункта (NONE, если пункт первый в списке)
_next ссылка на идентификатор следующего пункта (NONE, если пункт последний в списке)
_func функция типа notify_func, вызывается при при каждом изменении свойства и при получении события MEV_ENTER (только если активирована опция) ENABLE_NOTIFY_ON_CHANGE_PROPERTY _prop сылка (адрес) на свойство

См. определение в файле fmenu.h строка 156

◆ MENU_SUB

#define MENU_SUB | ( | _ident,
 |  | _name,
 |  | _parent,
 |  | _prev,
 |  | _next,
 |  | _sub
 | ) |
Макроопределение:
extern _mem menu_item_t _parent; \
extern _mem menu_item_t _prev; \
extern _mem menu_item_t _next; \
extern _mem menu_item_t _sub; \
_mem menu_item_t _ident = {.type = MITEM_SUBM, .prev = &_prev, .next = &_next, .func = NULL, .parent = &_parent, .sub = &_sub, .name = _name}

Создание пункта-субменю
параметры:
_ident иденификатор пункта (для ссылок в связном списке)
_name текст пунтка
_parent ссылка на идентификатор родительского пункта (NONE, если пункт принадлежит главному меню)
_prev ссылка на идентификатор предыдущего пункта (NONE, если пункт первый в списке)
_next ссылка на идентификатор следующего пункта (NONE, если пункт последний в списке)
_sub ссылка на первый пункт списка-субменю (NONE недопустимо)

См. определение в файле fmenu.h строка 135

◆ PROP_BOOL

#define PROP_BOOL | ( | _var,
 |  | _eadr,
 |  | ...
 | ) | (_mem prop_bool_t){.type = PR_BOOL, .var = &_var, .store = _eadr, .cnt = 2, .values = fs(__VA_ARGS__)}

Определение свойства: булево значение
_var имя переменной
_eadr адрес переменной в EEPROM для сохранения значения свойства
_values массив типа _mem pchar_f[] , хранящий стоки, соответствующие значениям свойства (см. пример)

_mem pchar_f bool_txt[] = {
(str_f){"OFF"}, // строка для значения false
(str_f){"ON"} // строка для значения true
};
Заметки
количество элементов этого массива должно быть всегда равно 2

См. определение в файле fproperty.h строка 262

◆ PROP_ENUM

#define PROP_ENUM | ( | _var,
 |  | _eadr,
 |  | _cnt,
 |  | ...
 | ) | (_mem prop_enum_t){.type = PR_ENUM, .var = &_var, .store = _eadr, .cnt = _cnt, .values = fs(__VA_ARGS__)}

Определение свойства: вариант из перечисления
_var имя переменной
_cnt количество вариантов _eadr адрес переменной в EEPROM для сохранения значения свойства
_values массив типа _mem pchar_f[] , хранящий стоки, соответствующие значениям свойства (см. пример для PROP_BOOL)

Заметки
количество элементов в этом массиве должно быть равно количеству вариантов _cnt !

См. определение в файле fproperty.h строка 275

◆ PROP_H16

#define PROP_H16 | ( | _var,
 |  | _eadr,
 |  | _min,
 |  | _max
 | ) | (_mem prop_u16_t){.type = PR_H16, .var = &_var, .store = _eadr, .min = _min, .max = _max}

Определение свойства: число 16 бит без знака, отображаемое в HEX
_var имя переменной
_eadr адрес переменной в EEPROM для сохранения значения свойства
_min минимально допустимое значение
_max максимально допустимое значение

См. определение в файле fproperty.h строка 220

◆ PROP_H8

#define PROP_H8 | ( | _var,
 |  | _eadr,
 |  | _min,
 |  | _max
 | ) | (_mem prop_u8_t){.type = PR_H8, .var = &_var, .store = _eadr, .min = _min, .max = _max}

Определение свойства: число 8 бит без знака, отображаемое в HEX
_var имя переменной
_eadr адрес переменной в EEPROM для сохранения значения свойства
_min минимально допустимое значение
_max максимально допустимое значение

См. определение в файле fproperty.h строка 243

◆ PROP_I16

#define PROP_I16 | ( | _var,
 |  | _eadr,
 |  | _min,
 |  | _max
 | ) | (_mem prop_i16_t){.type = PR_I16, .var = &_var, .store = _eadr, .min = _min, .max = _max}

Определение свойства: число 16 бит со знаком
_var имя переменной
_eadr адрес переменной в EEPROM для сохранения значения свойства
_min минимально допустимое значение
_max максимально допустимое значение

См. определение в файле fproperty.h строка 232

◆ PROP_I8

#define PROP_I8 | ( | _var,
 |  | _eadr,
 |  | _min,
 |  | _max
 | ) | (_mem prop_i8_t){.type = PR_I8, .var = &_var, .store = _eadr, .min = _min, .max = _max}

Определение свойства: число 8 бит со знаком
_var имя переменной
_eadr адрес переменной в EEPROM для сохранения значения свойства
_min минимально допустимое значение
_max максимально допустимое значение

См. определение в файле fproperty.h строка 199

◆ PROP_U16

#define PROP_U16 | ( | _var,
 |  | _eadr,
 |  | _min,
 |  | _max
 | ) | (_mem prop_u16_t){.type = PR_U16, .var = &_var, .store = _eadr, .min = _min, .max = _max}

Определение свойства: число 16 бит без знака
_var имя переменной
_eadr адрес переменной в EEPROM для сохранения значения свойства
_min минимально допустимое значение
_max максимально допустимое значение

См. определение в файле fproperty.h строка 210

◆ PROP_U8

#define PROP_U8 | ( | _var,
 |  | _eadr,
 |  | _min,
 |  | _max
 | ) | (_mem prop_u8_t){.type = PR_U8, .var = &_var, .store = _eadr, .min = _min, .max = _max}

Определение свойства: число 8 бит без знака
_var имя переменной
_eadr адрес переменной в EEPROM для сохранения значения свойства
_min минимально допустимое значение
_max максимально допустимое значение

См. определение в файле fproperty.h строка 189

MITEM_SUBM
@ MITEM_SUBM
пункт-субменю
Definition: fmenu.h:63
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
menu_item
пункт меню
Definition: fmenu.h:67
menu_item::type
uint8_t type
тип пункта
Definition: fmenu.h:68
MITEM_PROP
@ MITEM_PROP
пункт-свойство
Definition: fmenu.h:62
MITEM_CMD
@ MITEM_CMD
пункт-команда
Definition: fmenu.h:61
pchar_f
_mem char * pchar_f
указатель на константный символ
Definition: ver.h:57
str_f
_mem char str_f[]
строка константных символов
Definition: ver.h:59


FlexMenu: Концепция меню

Концепция меню

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

Принцип использования меню:
  • Создание связного списка пунктов меню при помощи вспомогательных макросов
  • Для реализации многоуровневых меню следует создать несколько связных списков, и в "главном" (соответствующем главному меню) поместить ссылки на списки подпунктов.
  • Инициализаци "главного" меню функцией init_menu
  • Получение от органов управления событий меню и обработка их функцией do_menu
  • После завершения работы с системой меню сохранение всех свойств функцией store_menu_properties
Заметки
Инициализация свойств может быть сделана автоматически при инициализации меню, или же в любой иной момент времени функцией load_menu_properties.
Меню может состоять из трех типов элементов:
  • Команда - при активации этого пункта вызывается назначенная функция (см. MENU_CMD)
  • Свойство - в строке текста этого пункта присутствует значение свойства (см. Концепция свойств), которое можно сразу же изменять (см. MENU_PROP), при этом может быть вызвана функция типа notify_func, которая может сразу обработать изменение значения свойства.
  • Субменю - при активации этого пункта меню происходит переход на вложенное меню (см. MENU_SUB)
Заметки
Код функции paint_menu зависит от системы отображения информации, и в текущей редакции присутствует - пользователь должен сам разработать эту функцию в соответствии с собственными предпочтениями. Для этой функции доступны глобальные переменные menu_first - первый элемент текущего меню и menu_current - текущий выбранный пункт.
Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 4.9.x или более новая версия


FlexMenu: Концепция свойств

Концепция свойств

Концепция "свойств" расширяет понятие переменной, хранящей какое-либо "настраиваемое" значение для разрабатываемого устройства. Работа со свойствами, а не с переменными, освобождает разработчика от рутинных действий по интерактивному изменению значений при помощи системы меню, сохранению параметров в EEPROM и/или считыванию их оттуда.

Реализованы следующие типы свойств:

  • Числа 8-битные и 16-битные с представлением в виде дестичных чисел или HEX (см. PROP_U8, PROP_I8, PROP_U16, PROP_I16, PROP_H8, PROP_H16)
  • Логическое (булево) значение (см. PROP_BOOL)
  • Выбор из списка вариантов (см. PROP_ENUM)

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

Использование свойств очень несложно:

  • Определение переменных, хранящих значения, резервирование областей EEPROM для сохранения их значений
  • Определение свойств при помощи вспомогательных макросов PROP_U8, PROP_I8, PROP_U16, PROP_I16, PROP_H8, PROP_H16. При необходимости дополнительно определяются массивы с текстовыми константами для представления значений свойств.
  • Интеграцию свойств в систему интерактивного меню (см. Концепция меню).

Для экономии ОЗУ все свойства и связанные с ними строковые константы размещаются в памяти программ.

#include "fproperty.h"
#include <avr/eeprom.h>
uint8_t bright; // заданная ркость
EEMEM uint8_t e_bright; // резервирование памяти \b EEPROM для хранения заданной яркости
bool power; // режим питания нагрузки
_mem pchar_f bool_txt[] = {
(str_f){"OFF"}, // строка для значения false
(str_f){"ON"} // строка для значения true
};
_mem property_t* _mem prop_array[] = {
(_mem property_t *)&PROP_U8(bright, &e_bright, 0, 12),
(_mem property_t *)&PROP_BOOL(power, NOSTORE, bool_txt)
};

В показанном примере создается массив из 2-x свойств: целочисленного беззнакового значения в пределах от 0 до 12 и булева, отображаемого текстом OFF/ON соответственно для false/true . Значение NOSTORE показвает, что сохранение значений свойств в EEPROM не реализуется.

Описанные в виде массива свойства могут передаваться в систему меню именно как элементы массива, т.е. примерно так:

MITEM_PROP(mm_0, "TEST", NONE, NONE, NONE, prop_array[0]);

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

int16_t foo;
MITEM_PROP(mm_0, "TEST", NONE, NONE, NONE, PROP_I16(foo, NOSTORE, -20, 20));

Переменные, связанные со свойствами, используются в программе, как обычно. Поскольку их назначение - хранить "конфигурационные" данные программы, не рекомендуется изменять их значение непосредственно. Для изменения этих переменных следует использовать систему меню, реализующую процесс интерактивного редактирования этих значений.

Заметки
Если вам не требуется система меню, выигрыша от системы свойств получить не получится никакого.
Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 4.9.x или более новая версия
fproperty.h
Определения системы свойств
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
PROP_U8
#define PROP_U8(_var, _eadr, _min, _max)
Definition: fproperty.h:188
PROP_I16
#define PROP_I16(_var, _eadr, _min, _max)
Definition: fproperty.h:231
MITEM_PROP
@ MITEM_PROP
пункт-свойство
Definition: fmenu.h:62
NONE
_mem menu_item_t NONE
идентификатор "отсутствующего" пункта меню для ссылок в списке
Definition: fmenu.c:20
NOSTORE
#define NOSTORE
свойства, значение которых не должно сохраняться, должны получить это значение в качестве адреса EEPR...
Definition: fproperty.h:324
PROP_BOOL
#define PROP_BOOL(_var, _eadr,...)
Definition: fproperty.h:261
property_t
обобщенное свойство
Definition: fproperty.h:129
pchar_f
_mem char * pchar_f
указатель на константный символ
Definition: ver.h:57
str_f
_mem char str_f[]
строка константных символов
Definition: ver.h:59


FlexMenu: меню

меню

описание Подробнее...

описание

Система меню предназначена для интерактивного управления параметрами и режимами работы разрабоаываемого устройства. В качестве вдохновления была использована система MicroMenu
Принцип меню:
  • Создание связного списка пунктов меню при помощи вспомогательных макросов
  • Для реализации многоуровневых меню следует создать несколько связных списков, и в "главном" (соответствующем главному меню) поместить ссылки на списки подпунктов.
  • Инициализаци "главного" меню функцией init_menu
  • Получение от органов упралвления событий меню и обработка их функцией do_menu
  • После завершения работы с системой меню сохранение всех свойств функцией store_menu_properties
Заметки
Инициализация свойств может быть сделана автоматически при инициализации меню, или же в любой иной момент времени, включая выполнение соответствующей команды меню.
Код функции paint_menu зависит от системы отображения информации, и в текущем файле не присутствует - пользователь должен сам разработать эту функцию в соответствии с собственными предпочтениями.
Меню может состоять из трех типов элементов:
  • Команда - при активации этого пункта вызывается назначенная функция
  • Свойство - в строке текста этого пункта присутствует значение свойства, которое можно сразу же изменять
  • Субменю - при активации этого пункта меню происходит переход на вложенное меню.
Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 6.3.0 или более новая версия
Концепция "свойств" расширяет понятие переменной, хранящей какое-либо "настраиваемое" значение для разрабатываемого устройства. Работа со свойствами, а не с переменными, освобождает разработчика от рутинных действий по интерактивному изменению значений при помощи системы меню, сохранению параметров в EEPROM и/или считыванию их оттуда.
Свойство характеризуется несколькими параметрами, отличающимися в зависимости от типа свойства. Например, числовое свойство характеризуется границами допустимых значений (минимум и максимум), а логическое (булево) характеризуется текстом, который будет показан при интерактивном редактировании значения.
Использование свойств очень несложно:
  • Определение переменных, хранящих значения, резервирование областей EEPROM для сохранения их значений.
  • Определение свойств при помощи вспомогательных макросов. При необходимости дополнительно определяются массивы с текстовыми константами для представления значений свойств.
  • Интеграцию свойств в систему интерактивного меню.
Для экономии ОЗУ все свойства и связанные с ними строковые константы размещаются в памяти программ.
uint8_t bright;
bool power;
_fmem pchar_f bool_txt[] = {
(str_f){"OFF"}, // строка для значения false
(str_f){"ON"} // строка для значения true
};
_fmem property_t* _fmem prop_array[] = {
(_fmem property_t *)&PROP_U8(bright, NOSTORE, 0, 12),
(_fmem property_t *)&PROP_BOOL(power, NOSTORE, bool_txt)
};
В показанном примере создается массив из свойств: целочисленного беззнакового значения в пределах от 0 до 12 и булева, отображаемого текстом OFF/ON соответственно для false/true . Значение NOSTORE показвает, что сохранение значений свойств в EEPROM не реализуется.
Описанные в виде массива свойства могут передаваться в систему меню именно как элементы массива, т.е. примерно так: prop_array[0] . Можно определить свойства и в виде "переменных", тогда передавать в систему меню нужно будет имена этих переменных:
_fmem property_t bright_prop = PROP_U8(bright, NOSTORE, 0, 12); // в меню передавать &bright_prop
Переменные, связанные со свойствами, используются в программе, как обычно. Поскольку их назначение - хранить "конфигурационные" данные программы, не рекомендуется изменять их значение непосредственно. Для изменения этих переменных следует использовать систему меню, реализующую процесс интерактивного редактирования этих значений.
Заметки
Если вам не требуется система меню, выигрыша от системы свойств получить не получится никакого.
Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 6.3.0 или более новая версия
pchar_f
_fmem char * pchar_f
Definition: ver.h:18
str_f
_fmem char str_f[]
Definition: ver.h:19
bool_txt
_fmem pchar_f bool_txt[]
Definition: test.c:25
_fmem
#define _fmem
Definition: ver.h:17
PROP_U8
#define PROP_U8(_var, _eadr, _min, _max)
Definition: fproperty.h:137
NOSTORE
#define NOSTORE
свойства, значение которых не должно сохраняться, должны получить это значение в качестве адреса EEPR...
Definition: fproperty.h:249
property_t
обобщенное свойство
Definition: fproperty.h:87
prop_array
_fmem property_t *_fmem prop_array[]
Definition: test.c:30
PROP_BOOL
#define PROP_BOOL(_var, _eadr, _values)
Definition: fproperty.h:196


FlexMenu: \brief меню

\brief меню
Система меню предназначена для интерактивного управления параметрами и режимами работы
разрабоаываемого устройства. В качестве вдохновления была использована система MicroMenu
Принцип меню:
  • Создание связного списка пунктов меню при помощи вспомогательных макросов
  • Для реализации многоуровневых меню следует создать несколько связных списков, и в "главном" (соответствующем главному меню) поместить ссылки на списки подпунктов.
  • Инициализаци "главного" меню функцией init_menu
  • Получение от органов упралвления событий меню и обработка их функцией do_menu
  • После завершения работы с системой меню сохранение всех свойств функцией store_menu_properties
Заметки
Инициализация свойств может быть сделана автоматически при инициализации меню, или же в любой иной момент времени, включая выполнение соответствующей команды меню.
Код функции #paint_menu зависит от системы отображения информации, и в текущем файле не присутствует -
пользователь должен сам разработать эту функцию в соответствии с собственными предпочтениями.
Меню может состоять из трех типов элементов:
  • Команда - при активации этого пункта вызывается назначенная функция
  • Свойство - в строке текста этого пункта присутствует значение свойства, которое можно сразу же изменять
  • Субменю - при активации этого пункта меню происходит переход на вложенное меню.
Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 6.3.0 или более новая версия


FlexMenu: Свойства

Свойства

свойства Подробнее...

свойства

Концепция "свойств" расширяет понятие переменной, хранящей какое-либо "настраиваемое" значение для разрабатываемого устройства. Работа со свойствами, а не с переменными, освобождает разработчика от рутинных действий по интерактивному изменению значений при помощи системы меню, сохранению параметров в EEPROM и/или считыванию их оттуда.
Свойство характеризуется несколькими параметрами, отличающимися в зависимости от типа свойства. Например, числовое свойство характеризуется границами допустимых значений (минимум и максимум), а логическое (булево) характеризуется текстом, который будет показан при интерактивном редактировании значения.
Использование свойств очень несложно:
  • Определение переменных, хранящих значения, резервирование областей EEPROM для сохранения их значений.
  • Определение свойств при помощи вспомогательных макросов. При необходимости дополнительно определяются массивы с текстовыми константами для представления значений свойств.
  • Интеграцию свойств в систему интерактивного меню.
Для экономии ОЗУ все свойства и связанные с ними строковые константы размещаются в памяти программ.
uint8_t bright;
bool power;
_fmem pchar_f bool_txt[] = {
(str_f){"OFF"}, // строка для значения false
(str_f){"ON"} // строка для значения true
};
_fmem property_t* _fmem prop_array[] = {
(_fmem property_t *)&PROP_U8(bright, NOSTORE, 0, 12),
(_fmem property_t *)&PROP_BOOL(power, NOSTORE, bool_txt)
};
В показанном примере создается массив из свойств: целочисленного беззнакового значения в пределах от 0 до 12 и булева, отображаемого текстом OFF/ON соответственно для false/true . Значение NOSTORE показвает, что сохранение значений свойств в EEPROM не реализуется.
Описанные в виде массива свойства могут передаваться в систему меню именно как элементы массива, т.е. примерно так: prop_array[0] . Можно определить свойства и в виде "переменных", тогда передавать в систему меню нужно будет имена этих переменных:
_fmem property_t bright_prop = PROP_U8(bright, NOSTORE, 0, 12); // в меню передавать &bright_prop
Переменные, связанные со свойствами, используются в программе, как обычно. Поскольку их назначение - хранить "конфигурационные" данные программы, не рекомендуется изменять их значение непосредственно. Для изменения этих переменных следует использовать систему меню, реализующую процесс интерактивного редактирования этих значений.
Заметки
Если вам не требуется система меню, выигрыша от системы свойств получить не получится никакого.

\buthor ARV

Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 6.3.0 или более новая версия
pchar_f
_fmem char * pchar_f
Definition: ver.h:23
str_f
_fmem char str_f[]
Definition: ver.h:24
bool_txt
_fmem pchar_f bool_txt[]
Definition: test.c:27
_fmem
#define _fmem
Definition: ver.h:22
PROP_U8
#define PROP_U8(_var, _eadr, _min, _max)
Definition: fproperty.h:136
NOSTORE
#define NOSTORE
свойства, значение которых не должно сохраняться, должны получить это значение в качестве адреса EEPR...
Definition: fproperty.h:248
property_t
обобщенное свойство
Definition: fproperty.h:86
prop_array
_fmem property_t *_fmem prop_array[]
Definition: test.c:32
PROP_BOOL
#define PROP_BOOL(_var, _eadr, _values)
Definition: fproperty.h:195


FlexMenu: Титульная страница

FlexMenu Документация

FlexMenu - это библиотека расширенной системы меню, реализующей возможности интерактивного редактирования значений переменных.

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

FlexMenu в отличие от многих известных реализация подобно системы, сразу отображает в списке параметров их значения (поддерживаются целочисленные значения до 16-бит, логические (булевы) и выбираемые из списка вариантов), и так же сразу позволяет их изменять, что положительно сказывается на пользовательском интерфейсе. При этом от программиста требуется минимум усилий.

Подробности:
  • Концепция меню
  • Концепция свойств
  • Вспомогательные макросы

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

Идея меню в виде связного списка взята из MicroMenu

Автор
ARV
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.


FlexMenu: Файл lcd.c

Функции
Файл lcd.c
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"

Функции

void | lcd_command (uint8_t cmd)
void | lcd_data (uint8_t data)
void | lcd_gotoxy (uint8_t x, uint8_t y)
void | lcd_putc (char c)
void | lcd_puts (const char *s)
void | lcd_puts_p (const char *progmem_s)
void | lcd_init (uint8_t dispAttr)

Макросы

◆ DDR

#define DDR ( x ) (*(&x - 1)) /* address of data direction register of port x */

◆ delay

#define delay ( us ) _delayFourCycles( ( ( 1*(XTAL/4000) )*us)/1000 )

◆ lcd_e_delay

#define lcd_e_delay ( ) __asm__ __volatile__( "rjmp 1f\n 1:" );

◆ lcd_e_high

#define lcd_e_high ( ) LCD_E_PORT |= _BV(LCD_E_PIN);

◆ lcd_e_low

#define lcd_e_low ( ) LCD_E_PORT &= ~_BV(LCD_E_PIN);

◆ lcd_e_toggle

#define lcd_e_toggle ( ) toggle_e()

◆ LCD_FUNCTION_DEFAULT

#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES

◆ lcd_rs_high

#define lcd_rs_high ( ) LCD_RS_PORT |= _BV(LCD_RS_PIN)

◆ lcd_rs_low

#define lcd_rs_low ( ) LCD_RS_PORT &= ~_BV(LCD_RS_PIN)

◆ lcd_rw_high

#define lcd_rw_high ( ) LCD_RW_PORT |= _BV(LCD_RW_PIN)

◆ lcd_rw_low

#define lcd_rw_low ( ) LCD_RW_PORT &= ~_BV(LCD_RW_PIN)

◆ PIN

#define PIN ( x ) (*(&x - 2)) /* address of input register of port x */

Функции

◆ lcd_clrscr()

void lcd_clrscr ( void )

Clear display and set cursor to home position.

◆ lcd_command()

void lcd_command ( uint8_t cmd )

Send LCD controller instruction command.

Аргументы
cmd instruction to send to LCD controller, see HD44780 data sheet
Возвращает
none

◆ lcd_data()

void lcd_data ( uint8_t data )

Send data byte to LCD controller.

Similar to lcd_putc(), but without interpreting LF

Аргументы
data byte to send to LCD controller, see HD44780 data sheet
Возвращает
none

◆ lcd_getxy()

int lcd_getxy ( void )

◆ lcd_gotoxy()

void lcd_gotoxy | ( | uint8_t | x,
 |  | uint8_t | y
 | ) |  |

Set cursor to specified position.

Аргументы
x horizontal position
(0: left most position)
y vertical position
(0: first line)
Возвращает
none

◆ lcd_home()

void lcd_home ( void )

Set cursor to home position.

◆ lcd_init()

void lcd_init ( uint8_t dispAttr )

Initialize display and select type of cursor.

Аргументы
dispAttr LCD_DISP_OFF display off
LCD_DISP_ON display on, cursor off
LCD_DISP_ON_CURSOR display on, cursor on
LCD_DISP_ON_CURSOR_BLINK display on, cursor on flashing
Возвращает
none

◆ lcd_putc()

void lcd_putc ( char c )

Display character at current cursor position.

Аргументы
c character to be displayed
Возвращает
none

◆ lcd_puts()

void lcd_puts ( const char * s )

Display string without auto linefeed.

Аргументы
s string to be displayed
Возвращает
none

◆ lcd_puts_p()

void lcd_puts_p ( const char * progmem_s )

Display string from program memory without auto linefeed.

Аргументы
progmem_s string from program memory be be displayed
Возвращает
none
См. также
lcd_puts_P


FlexMenu: Исходный файл lcd.c

lcd.c
1 /****************************************************************************
2 Title : HD44780U LCD library
3 Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
4 File: $Id: lcd.c,v 1.14.2.1 2006/01/29 12:16:41 peter Exp $
5 Software: AVR-GCC 3.3
6 Target: any AVR device, memory mapped mode only for AT90S4414/8515/Mega
7
8 DESCRIPTION
9 Basic routines for interfacing a HD44780U-based text lcd display
10
11 Originally based on Volker Oth's lcd library,
12 changed lcd_init(), added additional constants for lcd_command(),
13 added 4-bit I/O mode, improved and optimized code.
14
15 Library can be operated in memory mapped mode (LCD_IO_MODE=0) or in
16 4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not supported.
17
18 Memory mapped mode compatible with Kanda STK200, but supports also
19 generation of R/W signal through A8 address line.
20
21 USAGE
22 See the C include lcd.h file for a description of each function
23
24 *****************************************************************************/
25 #include <inttypes.h>
26 #include <avr/io.h>
27 #include <avr/pgmspace.h>
28 #include "lcd.h"
29
30 /*
31 ** constants/macros
32 */
33 #define DDR(x) (*(&x - 1)) /* address of data direction register of port x */
34 #if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
35 /* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
36 #define PIN(x) ( &PORTF==&(x) ? _SFR_IO8(0x00) : (*(&x - 2)) )
37 #else
38 #define PIN(x) (*(&x - 2)) /* address of input register of port x */
39 #endif
40
41
42 #if LCD_IO_MODE
43 #define lcd_e_delay() __asm__ __volatile__( "rjmp 1f\n 1:" );
44 #define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
45 #define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
46 #define lcd_e_toggle() toggle_e()
47 #define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
48 #define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
49 #define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
50 #define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
51 #endif
52
53 #if LCD_IO_MODE
54 #if LCD_LINES==1
55 #define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
56 #else
57 #define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
58 #endif
59 #else
60 #if LCD_LINES==1
61 #define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
62 #else
63 #define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
64 #endif
65 #endif
66
67 #if LCD_CONTROLLER_KS0073
68 #if LCD_LINES==4
69
70 #define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x24 /* |0|010|0100 4-bit mode extension-bit RE = 1 */
71 #define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x20 /* |0|000|1001 4 lines mode */
72 #define KS0073_4LINES_MODE 0x09 /* |0|001|0000 4-bit mode, extension-bit RE = 0 */
73
74 #endif
75 #endif
76
77 /*
78 ** function prototypes
79 */
80 #if LCD_IO_MODE
81 static void toggle_e(void);
82 #endif
83
84 /*
85 ** local functions
86 */
87
88
89
90 /*************************************************************************
91 delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
92 *************************************************************************/
93 static inline void _delayFourCycles(unsigned int __count)
94 {
95 if ( __count == 0 )
96 __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles
97 else
98 __asm__ __volatile__ (
99 "1: sbiw %0,1" "\n\t"
100 "brne 1b" // 4 cycles/loop
101 : "=w" (__count)
102 : "0" (__count)
103 );
104 }
105
106
107 /*************************************************************************
108 delay for a minimum of <us> microseconds
109 the number of loops is calculated at compile-time from MCU clock frequency
110 *************************************************************************/
111 #define delay(us) _delayFourCycles( ( ( 1*(XTAL/4000) )*us)/1000 )
112
113
114 #if LCD_IO_MODE
115 /* toggle Enable Pin to initiate write */
116 static void toggle_e(void)
117 {
118 lcd_e_high();
119 lcd_e_delay();
120 lcd_e_low();
121 }
122 #endif
123
124
125 /*************************************************************************
126 Low-level function to write byte to LCD controller
127 Input: data byte to write to LCD
128 rs 1: write data
129 0: write instruction
130 Returns: none
131 *************************************************************************/
132 #if LCD_IO_MODE
133 static void lcd_write(uint8_t data,uint8_t rs)
134 {
135 unsigned char dataBits ;
136
137
138 if (rs) { /* write data (RS=1, RW=0) */
139 lcd_rs_high();
140 } else { /* write instruction (RS=0, RW=0) */
141 lcd_rs_low();
142 }
143 lcd_rw_low();
144
145 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
146 && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
147 {
148 /* configure data pins as output */
149 DDR(LCD_DATA0_PORT) |= 0x0F;
150
151 /* output high nibble first */
152 dataBits = LCD_DATA0_PORT & 0xF0;
153 LCD_DATA0_PORT = dataBits |((data>>4)&0x0F);
154 lcd_e_toggle();
155
156 /* output low nibble */
157 LCD_DATA0_PORT = dataBits | (data&0x0F);
158 lcd_e_toggle();
159
160 /* all data pins high (inactive) */
161 LCD_DATA0_PORT = dataBits | 0x0F;
162 }
163 else
164 {
165 /* configure data pins as output */
166 DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
167 DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
168 DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
169 DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
170
171 /* output high nibble first */
172 LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
173 LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
174 LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
175 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
176 if(data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
177 if(data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
178 if(data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
179 if(data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
180 lcd_e_toggle();
181
182 /* output low nibble */
183 LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
184 LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
185 LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
186 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
187 if(data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
188 if(data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
189 if(data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
190 if(data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
191 lcd_e_toggle();
192
193 /* all data pins high (inactive) */
194 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
195 LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
196 LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
197 LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
198 }
199 }
200 #else
201 #define lcd_write(d,rs) if (rs) *(volatile uint8_t*)(LCD_IO_DATA) = d; else *(volatile uint8_t*)(LCD_IO_FUNCTION) = d;
202 /* rs==0 -> write instruction to LCD_IO_FUNCTION */
203 /* rs==1 -> write data to LCD_IO_DATA */
204 #endif
205
206
207 /*************************************************************************
208 Low-level function to read byte from LCD controller
209 Input: rs 1: read data
210 0: read busy flag / address counter
211 Returns: byte read from LCD controller
212 *************************************************************************/
213 #if LCD_IO_MODE
214 static uint8_t lcd_read(uint8_t rs)
215 {
216 uint8_t data;
217
218
219 if (rs)
220 lcd_rs_high(); /* RS=1: read data */
221 else
222 lcd_rs_low(); /* RS=0: read busy flag */
223 lcd_rw_high(); /* RW=1 read mode */
224
225 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
226 && ( LCD_DATA0_PIN == 0 )&& (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
227 {
228 DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */
229
230 lcd_e_high();
231 lcd_e_delay();
232 data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first */
233 lcd_e_low();
234
235 lcd_e_delay(); /* Enable 500ns low */
236
237 lcd_e_high();
238 lcd_e_delay();
239 data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */
240 lcd_e_low();
241 }
242 else
243 {
244 /* configure data pins as input */
245 DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
246 DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
247 DDR(LCD_DATA2_PORT) &= ~_BV(LCD_DATA2_PIN);
248 DDR(LCD_DATA3_PORT) &= ~_BV(LCD_DATA3_PIN);
249
250 /* read high nibble first */
251 lcd_e_high();
252 lcd_e_delay();
253 data = 0;
254 if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x10;
255 if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x20;
256 if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x40;
257 if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x80;
258 lcd_e_low();
259
260 lcd_e_delay(); /* Enable 500ns low */
261
262 /* read low nibble */
263 lcd_e_high();
264 lcd_e_delay();
265 if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x01;
266 if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x02;
267 if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x04;
268 if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x08;
269 lcd_e_low();
270 }
271 return data;
272 }
273 #else
274 #define lcd_read(rs) (rs) ? *(volatile uint8_t*)(LCD_IO_DATA+LCD_IO_READ) : *(volatile uint8_t*)(LCD_IO_FUNCTION+LCD_IO_READ)
275 /* rs==0 -> read instruction from LCD_IO_FUNCTION */
276 /* rs==1 -> read data from LCD_IO_DATA */
277 #endif
278
279
280 /*************************************************************************
281 loops while lcd is busy, returns address counter
282 *************************************************************************/
283 static uint8_t lcd_waitbusy(void)
284
285 {
286 register uint8_t c;
287
288 /* wait until busy flag is cleared */
289 while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {}
290
291 /* the address counter is updated 4us after the busy flag is cleared */
292 delay(2);
293
294 /* now read the address counter */
295 return (lcd_read(0)); // return address counter
296
297 }/* lcd_waitbusy */
298
299
300 /*************************************************************************
301 Move cursor to the start of next line or to the first line if the cursor
302 is already on the last line.
303 *************************************************************************/
304 static inline void lcd_newline(uint8_t pos)
305 {
306 register uint8_t addressCounter;
307
308
309 #if LCD_LINES==1
310 addressCounter = 0;
311 #endif
312 #if LCD_LINES==2
313 if ( pos < (LCD_START_LINE2) )
314 addressCounter = LCD_START_LINE2;
315 else
316 addressCounter = LCD_START_LINE1;
317 #endif
318 #if LCD_LINES==4
319 #if KS0073_4LINES_MODE
320 if ( pos < LCD_START_LINE2 )
321 addressCounter = LCD_START_LINE2;
322 else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3) )
323 addressCounter = LCD_START_LINE3;
324 else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4) )
325 addressCounter = LCD_START_LINE4;
326 else
327 addressCounter = LCD_START_LINE1;
328 #else
329 if ( pos < LCD_START_LINE3 )
330 addressCounter = LCD_START_LINE2;
331 else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4) )
332 addressCounter = LCD_START_LINE3;
333 else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) )
334 addressCounter = LCD_START_LINE4;
335 else
336 addressCounter = LCD_START_LINE1;
337 #endif
338 #endif
339 lcd_command((1<<LCD_DDRAM)+addressCounter);
340
341 }/* lcd_newline */
342
343
344 /*
345 ** PUBLIC FUNCTIONS
346 */
347
348 /*************************************************************************
349 Send LCD controller instruction command
350 Input: instruction to send to LCD controller, see HD44780 data sheet
351 Returns: none
352 *************************************************************************/
353 void lcd_command(uint8_t cmd)
354 {
355 lcd_waitbusy();
356 lcd_write(cmd,0);
357 }
358
359
360 /*************************************************************************
361 Send data byte to LCD controller
362 Input: data to send to LCD controller, see HD44780 data sheet
363 Returns: none
364 *************************************************************************/
365 void lcd_data(uint8_t data)
366 {
367 lcd_waitbusy();
368 lcd_write(data,1);
369 }
370
371
372
373 /*************************************************************************
374 Set cursor to specified position
375 Input: x horizontal position (0: left most position)
376 y vertical position (0: first line)
377 Returns: none
378 *************************************************************************/
379 void lcd_gotoxy(uint8_t x, uint8_t y)
380 {
381 #if LCD_LINES==1
382 lcd_command((1<<LCD_DDRAM) | (LCD_START_LINE1+x));
383 #endif
384 #if LCD_LINES==2
385 if ( y==0 )
386 lcd_command((1<<LCD_DDRAM) | (LCD_START_LINE1+x));
387 else
388 lcd_command((1<<LCD_DDRAM) | (LCD_START_LINE2+x));
389 #endif
390 #if LCD_LINES==4
391 if ( y==0 )
392 lcd_command((1<<LCD_DDRAM) | (LCD_START_LINE1+x));
393 else if ( y==1)
394 lcd_command((1<<LCD_DDRAM) | (LCD_START_LINE2+x));
395 else if ( y==2)
396 lcd_command((1<<LCD_DDRAM) | (LCD_START_LINE3+x));
397 else /* y==3 */
398 lcd_command((1<<LCD_DDRAM) | (LCD_START_LINE4+x));
399 #endif
400
401 }/* lcd_gotoxy */
402
403
404 /*************************************************************************
405 *************************************************************************/
406 int lcd_getxy(void)
407 {
408 return lcd_waitbusy();
409 }
410
411
412 /*************************************************************************
413 Clear display and set cursor to home position
414 *************************************************************************/
415 void lcd_clrscr(void)
416 {
417 lcd_command(1<<LCD_CLR);
418 }
419
420
421 /*************************************************************************
422 Set cursor to home position
423 *************************************************************************/
424 void lcd_home(void)
425 {
426 lcd_command(1<<LCD_HOME);
427 }
428
429
430 /*************************************************************************
431 Display character at current cursor position
432 Input: character to be displayed
433 Returns: none
434 *************************************************************************/
435 void lcd_putc(char c)
436 {
437 uint8_t pos;
438
439
440 pos = lcd_waitbusy(); // read busy-flag and address counter
441 if (c=='\n')
442 {
443 lcd_newline(pos);
444 }
445 else
446 {
447 #if LCD_WRAP_LINES==1
448 #if LCD_LINES==1
449 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
450 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
451 }
452 #elif LCD_LINES==2
453 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
454 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
455 }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){
456 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
457 }
458 #elif LCD_LINES==4
459 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
460 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
461 }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
462 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
463 }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
464 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
465 }else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
466 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
467 }
468 #endif
469 lcd_waitbusy();
470 #endif
471 lcd_write(c, 1);
472 }
473
474 }/* lcd_putc */
475
476
477 /*************************************************************************
478 Display string without auto linefeed
479 Input: string to be displayed
480 Returns: none
481 *************************************************************************/
482 #if VOID_OUTPUT_FUNC != 0
483 uint8_t
484 #else
485 void
486 #endif
487 lcd_puts(const char *s)
488 /* print string on lcd (no auto linefeed) */
489 {
490 register char c;
491 register uint8_t cnt = 0;
492
493 while ( (c = *s++) ) {
494 lcd_putc(c);
495 cnt++;
496 }
497 #if VOID_OUTPUT_FUNC != 0
498 return cnt;
499 #endif
500
501 }/* lcd_puts */
502
503
504 /*************************************************************************
505 Display string from program memory without auto linefeed
506 Input: string from program memory be be displayed
507 Returns: none
508 *************************************************************************/
509 #if VOID_OUTPUT_FUNC != 0
510 uint8_t
511 #else
512 void
513 #endif
514 lcd_puts_p(const char *progmem_s)
515 /* print string from program memory on lcd (no auto linefeed) */
516 {
517 register uint8_t cnt = 0;
518 register char c;
519
520 while ( (c = pgm_read_byte(progmem_s++)) ) {
521 lcd_putc(c);
522 cnt++;
523 }
524 #if VOID_OUTPUT_FUNC != 0
525 return cnt;
526 #endif
527
528 }/* lcd_puts_p */
529
530
531 /*************************************************************************
532 Initialize display and select type of cursor
533 Input: dispAttr LCD_DISP_OFF display off
534 LCD_DISP_ON display on, cursor off
535 LCD_DISP_ON_CURSOR display on, cursor on
536 LCD_DISP_CURSOR_BLINK display on, cursor on flashing
537 Returns: none
538 *************************************************************************/
539 void lcd_init(uint8_t dispAttr)
540 {
541 #if LCD_IO_MODE
542 /*
543 * Initialize LCD to 4 bit I/O mode
544 */
545
546 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
547 && ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
548 && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)
549 && (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
550 {
551 /* configure all port bits as output (all LCD lines on same port) */
552 DDR(LCD_DATA0_PORT) |= 0x7F;
553 }
554 else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
555 && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
556 {
557 /* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
558 DDR(LCD_DATA0_PORT) |= 0x0F;
559 DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
560 DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
561 DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
562 }
563 else
564 {
565 /* configure all port bits as output (LCD data and control lines on different ports */
566 DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
567 DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
568 DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
569 DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
570 DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
571 DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
572 DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
573 }
574 delay(16000); /* wait 16ms or more after power-on */
575
576 /* initial write to lcd is 8bit */
577 LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // _BV(LCD_FUNCTION)>>4;
578 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // _BV(LCD_FUNCTION_8BIT)>>4;
579 lcd_e_toggle();
580 delay(4992); /* delay, busy flag can't be checked here */
581
582 /* repeat last command */
583 lcd_e_toggle();
584 delay(64); /* delay, busy flag can't be checked here */
585
586 /* repeat last command a third time */
587 lcd_e_toggle();
588 delay(64); /* delay, busy flag can't be checked here */
589
590 /* now configure for 4bit mode */
591 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); // LCD_FUNCTION_4BIT_1LINE>>4
592 lcd_e_toggle();
593 delay(64); /* some displays need this additional delay */
594
595 /* from now the LCD only accepts 4 bit I/O, we can use lcd_command() */
596 #else
597 /*
598 * Initialize LCD to 8 bit memory mapped mode
599 */
600
601 /* enable external SRAM (memory mapped lcd) and one wait state */
602 MCUCR = _BV(SRE) | _BV(SRW);
603
604 /* reset LCD */
605 delay(16000); /* wait 16ms after power-on */
606 lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
607 delay(4992); /* wait 5ms */
608 lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
609 delay(64); /* wait 64us */
610 lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
611 delay(64); /* wait 64us */
612 #endif
613
614 #if KS0073_4LINES_MODE
615 /* Display with KS0073 controller requires special commands for enabling 4 line mode */
616 lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
617 lcd_command(KS0073_4LINES_MODE);
618 lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
619 #else
620 lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */
621 #endif
622 lcd_command(LCD_DISP_OFF); /* display off */
623 lcd_clrscr(); /* display clear */
624 lcd_command(LCD_MODE_DEFAULT); /* set entry mode */
625 lcd_command(dispAttr); /* display/cursor control */
626
627 }/* lcd_init */
DDR
#define DDR(x)
обращение к порту направления ввода-вывода по символу
Definition: avr_helper.h:19
PIN
#define PIN(x)
обращение к порту ввода по символу
Definition: avr_helper.h:23


FlexMenu: Файл lcd.h

Файл lcd.h
#include <inttypes.h>
#include <avr/pgmspace.h>

См. исходные тексты.

Макросы

Definitions for MCU Clock Frequency

Adapt the MCU clock frequency in Hz to your target.

#define | XTAL 4000000
Definition for LCD controller type

Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.

#define | LCD_CONTROLLER_KS0073 0
Definitions for Display Size

Change these definitions to adapt setting to your display

#define | LCD_LINES 2
#define | LCD_DISP_LENGTH 16
#define | LCD_LINE_LENGTH /*0x40*/40
#define | LCD_START_LINE1 0x80
#define | LCD_START_LINE2 0xC0
#define | LCD_START_LINE3 0x94
#define | LCD_START_LINE4 0xD4
#define | LCD_WRAP_LINES 0
#define | LCD_IO_MODE 1
Definitions for 4-bit IO mode

Change LCD_PORT if you want to use a different port for the LCD pins.

The four LCD data lines and the three control lines RS, RW, E can be on the same port or on different ports. Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on different ports.

Normally the four data lines should be mapped to bit 0..3 on one port, but it is possible to connect these data lines in different order or even on different ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.

#define | LCD_PORT PORTB
#define | LCD_DATA0_PORT LCD_PORT
#define | LCD_DATA1_PORT LCD_PORT
#define | LCD_DATA2_PORT LCD_PORT
#define | LCD_DATA3_PORT LCD_PORT
#define | LCD_DATA0_PIN 4
#define | LCD_DATA1_PIN 5
#define | LCD_DATA2_PIN 6
#define | LCD_DATA3_PIN 7
#define | LCD_RS_PORT LCD_PORT
#define | LCD_RS_PIN 1
#define | LCD_RW_PORT LCD_PORT
#define | LCD_RW_PIN 2
#define | LCD_E_PORT LCD_PORT
#define | LCD_E_PIN 3
Definitions for LCD command instructions

The constants define the various LCD controller instructions which can be passed to the function lcd_command(), see HD44780 data sheet for a complete description.

Functions

void | lcd_init (uint8_t dispAttr)
void | lcd_gotoxy (uint8_t x, uint8_t y)
void | lcd_putc (char c)
void | lcd_puts (const char *s)
void | lcd_puts_p (const char *progmem_s)
void | lcd_command (uint8_t cmd)
void | lcd_data (uint8_t data)

Макросы

◆ LCD_BUSY

#define LCD_BUSY 7 /* DB7: LCD is busy */

◆ LCD_CGRAM

#define LCD_CGRAM 6 /* DB6: set CG RAM address */

◆ LCD_CLR

#define LCD_CLR 0 /* DB0: clear display */

◆ LCD_CONTROLLER_KS0073

#define LCD_CONTROLLER_KS0073 0

Use 0 for HD44780 controller, 1 for KS0073 controller

◆ LCD_DATA0_PIN

#define LCD_DATA0_PIN 4

pin for 4bit data bit 0

◆ LCD_DATA0_PORT

#define LCD_DATA0_PORT LCD_PORT

port for 4bit data bit 0

◆ LCD_DATA1_PIN

#define LCD_DATA1_PIN 5

pin for 4bit data bit 1

◆ LCD_DATA1_PORT

#define LCD_DATA1_PORT LCD_PORT

port for 4bit data bit 1

◆ LCD_DATA2_PIN

#define LCD_DATA2_PIN 6

pin for 4bit data bit 2

◆ LCD_DATA2_PORT

#define LCD_DATA2_PORT LCD_PORT

port for 4bit data bit 2

◆ LCD_DATA3_PIN

#define LCD_DATA3_PIN 7

pin for 4bit data bit 3

◆ LCD_DATA3_PORT

#define LCD_DATA3_PORT LCD_PORT

port for 4bit data bit 3

◆ LCD_DDRAM

#define LCD_DDRAM 7 /* DB7: set DD RAM address */

◆ LCD_DISP_LENGTH

#define LCD_DISP_LENGTH 16

visibles characters per line of the display

◆ LCD_DISP_OFF

#define LCD_DISP_OFF 0x08 /* display off */

◆ LCD_DISP_ON

#define LCD_DISP_ON 0x0C /* display on, cursor off */

◆ LCD_DISP_ON_BLINK

#define LCD_DISP_ON_BLINK 0x0D /* display on, cursor off, blink char */

◆ LCD_DISP_ON_CURSOR

#define LCD_DISP_ON_CURSOR 0x0E /* display on, cursor on */

◆ LCD_DISP_ON_CURSOR_BLINK

#define LCD_DISP_ON_CURSOR_BLINK 0x0F /* display on, cursor on, blink char */

◆ LCD_E_PIN

#define LCD_E_PIN 3

pin for Enable line

◆ LCD_E_PORT

#define LCD_E_PORT LCD_PORT

port for Enable line

◆ LCD_ENTRY_DEC

#define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */

◆ LCD_ENTRY_DEC_SHIFT

#define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */

◆ LCD_ENTRY_INC

#define LCD_ENTRY_INC 1 /* DB1: 1=increment, 0=decrement */

◆ LCD_ENTRY_INC_

#define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */

◆ LCD_ENTRY_INC_SHIFT

#define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */

◆ LCD_ENTRY_MODE

#define LCD_ENTRY_MODE 2 /* DB2: set entry mode */

◆ LCD_ENTRY_SHIFT

#define LCD_ENTRY_SHIFT 0 /* DB2: 1=display shift on */

◆ LCD_FUNCTION

#define LCD_FUNCTION 5 /* DB5: function set */

◆ LCD_FUNCTION_10DOTS

#define LCD_FUNCTION_10DOTS 2 /* DB2: 5x10 font (0->5x7 font) */

◆ LCD_FUNCTION_2LINES

#define LCD_FUNCTION_2LINES 3 /* DB3: two lines (0->one line) */

◆ LCD_FUNCTION_4BIT_1LINE

#define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */

◆ LCD_FUNCTION_4BIT_2LINES

#define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */

◆ LCD_FUNCTION_8BIT

#define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */

◆ LCD_FUNCTION_8BIT_1LINE

#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */

◆ LCD_FUNCTION_8BIT_2LINES

#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */

◆ LCD_HOME

#define LCD_HOME 1 /* DB1: return to home position */

◆ LCD_IO_MODE

#define LCD_IO_MODE 1

0: memory mapped mode, 1: IO port mode

◆ LCD_LINE_LENGTH

#define LCD_LINE_LENGTH /*0x40*/40

internal line length of the display

◆ LCD_LINES

#define LCD_LINES 2

number of visible lines of the display

◆ LCD_MODE_DEFAULT

#define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )

◆ LCD_MOVE

#define LCD_MOVE 4 /* DB4: move cursor/display */

◆ LCD_MOVE_CURSOR_LEFT

#define LCD_MOVE_CURSOR_LEFT 0x10 /* move cursor left (decrement) */

◆ LCD_MOVE_CURSOR_RIGHT

#define LCD_MOVE_CURSOR_RIGHT 0x14 /* move cursor right (increment) */

◆ LCD_MOVE_DISP

#define LCD_MOVE_DISP 3 /* DB3: move display (0-> cursor) ? */

◆ LCD_MOVE_DISP_LEFT

#define LCD_MOVE_DISP_LEFT 0x18 /* shift display left */

◆ LCD_MOVE_DISP_RIGHT

#define LCD_MOVE_DISP_RIGHT 0x1C /* shift display right */

◆ LCD_MOVE_RIGHT

#define LCD_MOVE_RIGHT 2 /* DB2: move right (0-> left) ? */

◆ LCD_ON

#define LCD_ON 3 /* DB3: turn lcd/cursor on */

◆ LCD_ON_BLINK

#define LCD_ON_BLINK 0 /* DB0: blinking cursor ? */

◆ LCD_ON_CURSOR

#define LCD_ON_CURSOR 1 /* DB1: turn cursor on */

◆ LCD_ON_DISPLAY

#define LCD_ON_DISPLAY 2 /* DB2: turn display on */

◆ LCD_PORT

#define LCD_PORT PORTB

port for the LCD lines

◆ lcd_puts_P

#define lcd_puts_P ( __s ) lcd_puts_p(PSTR(__s))

macros for automatically storing string constant in program memory

◆ LCD_RS_PIN

#define LCD_RS_PIN 1

pin for RS line

◆ LCD_RS_PORT

#define LCD_RS_PORT LCD_PORT

port for RS line

◆ LCD_RW_PIN

#define LCD_RW_PIN 2

pin for RW line

◆ LCD_RW_PORT

#define LCD_RW_PORT LCD_PORT

port for RW line

◆ LCD_START_LINE1

#define LCD_START_LINE1 0x80

DDRAM address of first char of line 1

◆ LCD_START_LINE2

#define LCD_START_LINE2 0xC0

DDRAM address of first char of line 2

◆ LCD_START_LINE3

#define LCD_START_LINE3 0x94

14 DDRAM address of first char of line 3

◆ LCD_START_LINE4

#define LCD_START_LINE4 0xD4

54 DDRAM address of first char of line 4

◆ LCD_WRAP_LINES

#define LCD_WRAP_LINES 0

0: no wrap, 1: wrap at end of visibile line

◆ VOID_OUTPUT_FUNC

#define VOID_OUTPUT_FUNC 0

Если этот макрос НЕ НОЛЬ, то функции вывода на индикатор возвращают количество выведенных символов

◆ XTAL

#define XTAL 4000000

clock frequency in Hz, used to calculate delay timer

Функции

◆ lcd_clrscr()

void lcd_clrscr ( void )

Clear display and set cursor to home position.

◆ lcd_command()

void lcd_command ( uint8_t cmd )

Send LCD controller instruction command.

Аргументы
cmd instruction to send to LCD controller, see HD44780 data sheet
Возвращает
none

◆ lcd_data()

void lcd_data ( uint8_t data )

Send data byte to LCD controller.

Similar to lcd_putc(), but without interpreting LF

Аргументы
data byte to send to LCD controller, see HD44780 data sheet
Возвращает
none

◆ lcd_gotoxy()

void lcd_gotoxy | ( | uint8_t | x,
 |  | uint8_t | y
 | ) |  |

Set cursor to specified position.

Аргументы
x horizontal position
(0: left most position)
y vertical position
(0: first line)
Возвращает
none

◆ lcd_home()

void lcd_home ( void )

Set cursor to home position.

◆ lcd_init()

void lcd_init ( uint8_t dispAttr )

Initialize display and select type of cursor.

Аргументы
dispAttr LCD_DISP_OFF display off
LCD_DISP_ON display on, cursor off
LCD_DISP_ON_CURSOR display on, cursor on
LCD_DISP_ON_CURSOR_BLINK display on, cursor on flashing
Возвращает
none

◆ lcd_putc()

void lcd_putc ( char c )

Display character at current cursor position.

Аргументы
c character to be displayed
Возвращает
none

◆ lcd_puts()

void lcd_puts ( const char * s )

Display string without auto linefeed.

Аргументы
s string to be displayed
Возвращает
none

◆ lcd_puts_p()

void lcd_puts_p ( const char * progmem_s )

Display string from program memory without auto linefeed.

Аргументы
progmem_s string from program memory be be displayed
Возвращает
none
См. также
lcd_puts_P


FlexMenu: Исходный файл lcd.h

lcd.h
1 #ifndef LCD_H
2 #define LCD_H
3 /*************************************************************************
4 Title : C include file for the HD44780U LCD library (lcd.c)
5 Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
6 File: $Id: lcd.h,v 1.13.2.2 2006/01/30 19:51:33 peter Exp $
7 Software: AVR-GCC 3.3
8 Hardware: any AVR device, memory mapped mode only for AT90S4414/8515/Mega
9 ***************************************************************************/
10
34 #define VOID_OUTPUT_FUNC 0
36
39 #if (__GNUC__ * 100 + __GNUC_MINOR__) < 303
40 #error "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !"
41 #endif
42
43 #include <inttypes.h>
44 #include <avr/pgmspace.h>
45
50 #ifdef F_CPU
51 #define XTAL F_CPU
52 #else
53 #define XTAL 4000000
54 #endif
55
56
61 #define LCD_CONTROLLER_KS0073 0
67 #define LCD_LINES 2
68 #define LCD_DISP_LENGTH 16
69 #define LCD_LINE_LENGTH /*0x40*/40
70 #define LCD_START_LINE1 0x80
71 #define LCD_START_LINE2 0xC0
72 #define LCD_START_LINE3 0x94
73 #define LCD_START_LINE4 0xD4
74 #define LCD_WRAP_LINES 0
77 #define LCD_IO_MODE 1
78 #if LCD_IO_MODE
79
93 //#if defined(STK500)
94 #define LCD_PORT PORTB
95 #define LCD_DATA0_PORT LCD_PORT
96 #define LCD_DATA1_PORT LCD_PORT
97 #define LCD_DATA2_PORT LCD_PORT
98 #define LCD_DATA3_PORT LCD_PORT
99 #define LCD_DATA0_PIN 4
100 #define LCD_DATA1_PIN 5
101 #define LCD_DATA2_PIN 6
102 #define LCD_DATA3_PIN 7
103 #define LCD_RS_PORT LCD_PORT
104 #define LCD_RS_PIN 1
105 #define LCD_RW_PORT LCD_PORT
106 #define LCD_RW_PIN 2
107 #define LCD_E_PORT LCD_PORT
108 #define LCD_E_PIN 3
109 /*
110 #else
111 #define LCD_PORT PORTC *< port for the LCD lines
112 #define LCD_DATA0_PORT LCD_PORT *< port for 4bit data bit 0
113 #define LCD_DATA1_PORT LCD_PORT *< port for 4bit data bit 1
114 #define LCD_DATA2_PORT LCD_PORT *< port for 4bit data bit 2
115 #define LCD_DATA3_PORT LCD_PORT *< port for 4bit data bit 3
116 #define LCD_DATA0_PIN 4 *< pin for 4bit data bit 0
117 #define LCD_DATA1_PIN 5 *< pin for 4bit data bit 1
118 #define LCD_DATA2_PIN 6 *< pin for 4bit data bit 2
119 #define LCD_DATA3_PIN 7 *< pin for 4bit data bit 3
120 #define LCD_RS_PORT LCD_PORT *< port for RS line
121 #define LCD_RS_PIN 1 *< pin for RS line
122 #define LCD_RW_PORT LCD_PORT *< port for RW line
123 #define LCD_RW_PIN 2 *< pin for RW line
124 #define LCD_E_PORT LCD_PORT *< port for Enable line
125 #define LCD_E_PIN 3 *< pin for Enable line
126 #endif
127 */
128
129
130 #elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || \
131 defined(__AVR_ATmega8515__)|| defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || \
132 defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
133 /*
134 * memory mapped mode is only supported when the device has an external data memory interface
135 */
136 #define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */
137 #define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */
138 #define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */
139 #else
140 #error "external data memory interface not available for this device, use 4-bit IO port mode"
141
142 #endif
143
144
151 /* instruction register bit positions, see HD44780U data sheet */
152 #define LCD_CLR 0 /* DB0: clear display */
153 #define LCD_HOME 1 /* DB1: return to home position */
154 #define LCD_ENTRY_MODE 2 /* DB2: set entry mode */
155 #define LCD_ENTRY_INC 1 /* DB1: 1=increment, 0=decrement */
156 #define LCD_ENTRY_SHIFT 0 /* DB2: 1=display shift on */
157 #define LCD_ON 3 /* DB3: turn lcd/cursor on */
158 #define LCD_ON_DISPLAY 2 /* DB2: turn display on */
159 #define LCD_ON_CURSOR 1 /* DB1: turn cursor on */
160 #define LCD_ON_BLINK 0 /* DB0: blinking cursor ? */
161 #define LCD_MOVE 4 /* DB4: move cursor/display */
162 #define LCD_MOVE_DISP 3 /* DB3: move display (0-> cursor) ? */
163 #define LCD_MOVE_RIGHT 2 /* DB2: move right (0-> left) ? */
164 #define LCD_FUNCTION 5 /* DB5: function set */
165 #define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */
166 #define LCD_FUNCTION_2LINES 3 /* DB3: two lines (0->one line) */
167 #define LCD_FUNCTION_10DOTS 2 /* DB2: 5x10 font (0->5x7 font) */
168 #define LCD_CGRAM 6 /* DB6: set CG RAM address */
169 #define LCD_DDRAM 7 /* DB7: set DD RAM address */
170 #define LCD_BUSY 7 /* DB7: LCD is busy */
171
172 /* set entry mode: display shift on/off, dec/inc cursor move direction */
173 #define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */
174 #define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */
175 #define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */
176 #define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */
177
178 /* display on/off, cursor on/off, blinking char at cursor position */
179 #define LCD_DISP_OFF 0x08 /* display off */
180 #define LCD_DISP_ON 0x0C /* display on, cursor off */
181 #define LCD_DISP_ON_BLINK 0x0D /* display on, cursor off, blink char */
182 #define LCD_DISP_ON_CURSOR 0x0E /* display on, cursor on */
183 #define LCD_DISP_ON_CURSOR_BLINK 0x0F /* display on, cursor on, blink char */
184
185 /* move cursor/shift display */
186 #define LCD_MOVE_CURSOR_LEFT 0x10 /* move cursor left (decrement) */
187 #define LCD_MOVE_CURSOR_RIGHT 0x14 /* move cursor right (increment) */
188 #define LCD_MOVE_DISP_LEFT 0x18 /* shift display left */
189 #define LCD_MOVE_DISP_RIGHT 0x1C /* shift display right */
190
191 /* function set: set interface data length and number of display lines */
192 #define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */
193 #define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */
194 #define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
195 #define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
196
197
198 #define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )
199
200
201
215 extern void lcd_init(uint8_t dispAttr);
216
217
221 extern void lcd_clrscr(void);
222
223
227 extern void lcd_home(void);
228
229
237 extern void lcd_gotoxy(uint8_t x, uint8_t y);
238
239
245 extern void lcd_putc(char c);
246
247
253 extern
254 #if VOID_OUTPUT_FUNC != 0
255 uint8_t
256 #else
257 void
258 #endif
259 lcd_puts(const char *s);
260
261
268 extern
269 #if VOID_OUTPUT_FUNC != 0
270 uint8_t
271 #else
272 void
273 #endif
274 lcd_puts_p(const char *progmem_s);
275
281 extern void lcd_command(uint8_t cmd);
282
283
291 extern void lcd_data(uint8_t data);
292
293
297 #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s))
298
300 #endif //LCD_H


FlexMenu: Файл lcd_out.c

Функции
Файл lcd_out.c
#include <avr/io.h>
#include "avr_helper.h"
#include "lcd.h"
#include "fmenu.h"
#include "fproperty.h"

См. исходные тексты.

Функции

void paint_menu ()

Подробное описание

Поддержка вывода на символьный ЖКИ реализуется сторонней библиотекой

Автор
ARV
Дата
5 мая 2020 г.
Авторство
2020 © ARV. All rights reserved.

См. определение в файле lcd_out.c

Функции

◆ paint_menu()

void paint_menu ( void )

отрисовка меню

Заметки
данная функция должна быть реализована пользователем

См. определение в файле lcd_out.c строка 37

Перекрестные ссылки menu_current, menu_first и NONE.


FlexMenu: Исходный файл lcd_out.c

lcd_out.c
См. документацию.
1
13 #include <avr/io.h>
14 #include "avr_helper.h"
15 #include "lcd.h"
16 #include "fmenu.h"
17 #include "fproperty.h"
18
19 static _mem menu_item_t* lines[LCD_LINES];
20 static char text[DISPLAY_WIDTH+1];
21
22 static bool visibled(_mem menu_item_t* from, _mem menu_item_t* item){
23 for(uint8_t i=0; i<LCD_LINES; i++){
24 if(item == from) return true;
25 if(from != &NONE) from = from->next;
26 }
27 return false;
28 }
29
30 static void fill_lines(_mem menu_item_t* from){
31 for(uint8_t i=0; i<LCD_LINES; i++){
32 lines[i] = from;
33 if(from != &NONE) from = from->next;
34 }
35 }
36
37 void paint_menu(){
38 // если произошла смена меню/субменю
39 if(menu_first == &NONE){
40 menu_first = menu_current;
41 fill_lines(menu_current);
42 }
43
44 // поиск пунктов меню, которые необходимо отобразить так, чтобы был виден текущий пункт
45 if(!visibled(lines[0], menu_current)){
46 if(visibled(lines[0]->prev, menu_current))
47 fill_lines(lines[0]->prev);
48 else
49 fill_lines(lines[0]->next);
50 }
51
52 // вывод видимых пунктов меню
53 for(uint8_t y=0; y<LCD_LINES; y++){
54 get_item_text(text, lines[y]);
55 if(lines[y] == menu_current) text[0] = '>';
56 lcd_gotoxy(0, y);
57 lcd_puts(text);
58 }
59 }
60
61 void first_func(void){
62 lcd_init(LCD_DISP_ON);
63 }
64
65 void last_func(void){
66 lcd_clrscr();
67 lcd_puts_P("DEMO STOPPED\nBYE! :-)");
68 }
fproperty.h
Определения системы свойств
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
menu_item
пункт меню
Definition: fmenu.h:67
menu_item::next
_mem struct menu_item * next
ссылка на следующий пункт в списке
Definition: fmenu.h:70
menu_first
_mem menu_item_t * menu_first
Definition: fmenu.c:21
NONE
_mem menu_item_t NONE
идентификатор "отсутствующего" пункта меню для ссылок в списке
Definition: fmenu.c:20
avr_helper.h
Вспомогательные макросы для работы с AVR.
fmenu.h
Определения системы меню
menu_current
_mem menu_item_t * menu_current
текущий пункт меню, который следует выделить при отрисовке меню в функции paint_menu.
Definition: fmenu.c:22
paint_menu
void paint_menu()
Definition: lcd_out.c:37
DISPLAY_WIDTH
#define DISPLAY_WIDTH
Definition: fmenu_config.h:34
get_item_text
void get_item_text(char buf[MENU_TEXT_LEN+1], _mem menu_item_t *item)


FlexMenu: Группы

Группы
Полный список групп.
LCD library | Basic routines for interfacing a HD44780U-based text LCD display
Вспомогательные макросы | Макросы, упрощающие определение сложных структур
Концепция меню | Описание системы меню
Концепция свойств | Описание концепции свойств


FlexMenu: Структура menu_item

Структура menu_item

#include <fmenu.h>

Подробное описание

См. определение в файле fmenu.h строка 67

Объявления и описания членов структуры находятся в файле:
  • fmenu.h


FlexMenu: Структура property_t

Структура property_t

#include <fproperty.h>

Подробное описание

См. определение в файле fproperty.h строка 129

Объявления и описания членов структуры находятся в файле:
  • fproperty.h


FlexMenu: Структура prop_enum_t

Структура prop_enum_t

#include <fproperty.h>

Подробное описание

См. определение в файле fproperty.h строка 167

Объявления и описания членов структуры находятся в файле:
  • fproperty.h


FlexMenu: Структура prop_i16_t

Структура prop_i16_t

#include <fproperty.h>

Подробное описание

См. определение в файле fproperty.h строка 158

Объявления и описания членов структуры находятся в файле:
  • fproperty.h


FlexMenu: Структура prop_i8_t

Структура prop_i8_t

#include <fproperty.h>

Подробное описание

См. определение в файле fproperty.h строка 141

Объявления и описания членов структуры находятся в файле:
  • fproperty.h


FlexMenu: Структура prop_u16_t

Структура prop_u16_t

#include <fproperty.h>

Подробное описание

См. определение в файле fproperty.h строка 149

Объявления и описания членов структуры находятся в файле:
  • fproperty.h


FlexMenu: Структура prop_u8_t

Структура prop_u8_t

#include <fproperty.h>

Подробное описание

См. определение в файле fproperty.h строка 134

Объявления и описания членов структуры находятся в файле:
  • fproperty.h


FlexMenu: Файл terminal.c

Функции
Файл terminal.c
#include <avr/io.h>
#include "avr_helper.h"
#include "fmenu.h"
#include "fproperty.h"
#include <stdio.h>
#include <avr/pgmspace.h>

Функции

void paint_menu ()

Подробное описание

Автор
ARV
Дата
3 мая 2020 г.
Авторство
2020 © ARV. All rights reserved.

Макросы

◆ ESC

#define ESC "\033"

◆ TERMINAL_CLR

#define TERMINAL_CLR PSTR(ESC "[c" ESC "[2J" ESC "[0m")

◆ TERMINAL_GOTO_XY

#define TERMINAL_GOTO_XY PSTR(ESC "[%d;%dH")

◆ TERMINAL_HIDE_CUR

#define TERMINAL_HIDE_CUR PSTR(ESC "[?25l")

◆ TERMINAL_NOSEL

#define TERMINAL_NOSEL PSTR(ESC "[40m")

◆ TERMINAL_SEL

#define TERMINAL_SEL PSTR(ESC "[47m" ESC "[30m")

Функции

◆ first_func()

void first_func ( void )

◆ last_func()

void last_func ( void )

◆ paint_menu()

void paint_menu ( void )

отрисовка меню

Заметки
данная функция должна быть реализована пользователем


FlexMenu: Файл test.c

Функции
Файл test.c
#include <avr/io.h>
#include "avr_helper.h"
#include "fmenu.h"
#include "fproperty.h"
#include <avr/eeprom.h>
#include <util/delay.h>
#include "lcd.h"

См. исходные тексты.

Функции

menu_event_t get_event (void)

Подробное описание

В файле описана тестовая система меню, определены функции для некоторых команд меню, а так же реализована простейшая поддержка 6-кнопочной клавиатуры для навигации по пунктам меню. Для отображения должен использоваться один из вспомогательных модулей:

  • terminal_out.c - модуль для вывода на внешний терминал через USART (дополнительно используется модуль com_io.c)
  • lcd_out.c - модуль для ввода на символьный ЖКИ (дополнительно используется модуль поддержки ЖКИ lcd.c)
Автор
ARV
Дата
27 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 4.9.x или более новая версия

См. определение в файле test.c

Функции

◆ get_event()

menu_event_t get_event ( void )

генерация событий меню для навигации

Возвращает
событие меню

См. определение в файле test.c строка 109

Перекрестные ссылки MEV_NONE.


FlexMenu: Исходный файл test.c

test.c
См. документацию.
1
20 #include <avr/io.h>
21 #include "avr_helper.h"
22 #include "fmenu.h"
23 #include "fproperty.h"
24 #include <avr/eeprom.h>
25 #include <util/delay.h>
26 #include "lcd.h"
27
28 bool motor_state;
29 EEMEM bool ems;
30 EEMEM uint8_t eu8;
31 uint8_t u8;
32 int16_t vfr = -12;
33
34 // подача звукового сигнала без выхода из меню
35 bool beep(void* p){
36 PORTD |= _BV(PD4);
37 _delay_ms(300);
38 PORTD &= ~_BV(PD4);
39 return true;
40 }
41
42 // подача звукового сигнала и выход из меню
43 bool done(void* p){
44 return !beep(p);
45 }
46
47 bool motor(bool* state){
48 if(*state)
49 PORTD |= _BV(PD5);
50 else
51 PORTD &= ~_BV(PD5);
52 return true;
53 }
54
55 #define sf(x) (str_f){x}
56
57 bool save(void *p);
58 bool load(void *p);
59
60 // главное меню
61 // id name parent prev next func|subm property
62 MENU_CMD( mm_1, "BEEP", NONE, NONE, mm_2, beep);
63 MENU_PROP(mm_2, "TEST", NONE, mm_1, mm_3, NULL, PROP_U8(u8, NOSTORE, 0, 12));
64 MENU_PROP(mm_3, "MOTOR", NONE, mm_2, mm_4, motor, PROP_BOOL(motor_state, NOSTORE, sf("STOP"), sf("RUN")));
65 MENU_SUB( mm_4, "SUBMENU", NONE, mm_3, mm_5, sm_1);
66 MENU_PROP(mm_5, "TEMPERATURE", NONE, mm_4, mm_6, NULL, PROP_I16(vfr, NOSTORE, -20, 20));
67 MENU_CMD( mm_6, "LOAD", NONE, mm_5, mm_7, load);
68 MENU_CMD( mm_7, "SAVE & EXIT", NONE, mm_6, NONE, save);
69
70 bool save(void *p){
71 store_menu_properties(&mm_1);
72 return false;
73 }
74
75 bool load(void *p){
76 load_menu_properties(&mm_1);
77 return true;
78 }
79
80 // субменю
81 MENU_CMD( sm_1, "STOP DEMO 1", mm_4, NONE, sm_2, done);
82 MENU_CMD( sm_2, "STOP DEMO 2", mm_4, sm_1, sm_3, done);
83 MENU_SUB( sm_3, "STOP SUB", mm_4, sm_2, NONE, ssm_1);
84
85 // субменю
86 MENU_CMD(ssm_1, "SUB STOP DEMO 1", sm_3, NONE, ssm_2, done);
87 MENU_CMD(ssm_2, "SUB STOP DEMO 2", sm_3, ssm_1, ssm_3, done);
88 MENU_CMD(ssm_3, "SUB STOP DEMO 3", sm_3, ssm_2, NONE, done);
89
94 static uint8_t get_pins(void){
95 uint8_t pin = ~PINC & 0x7F;
96 _delay_ms(10);
97 if (pin != (~PINC & 0x7F))
98 return 0;
99 else
100 return pin;
101 }
102
103 #define DELAY 30
104
109 menu_event_t get_event(void){
110 static menu_event_t key = MEV_NONE;
111 static uint8_t prev;
112 static uint8_t delay = DELAY;
113 uint8_t pin = get_pins();
114
115 if(pin == 0){
116 delay = DELAY;
117 key = MEV_NONE;
118 } else if(pin != prev){
119 switch(pin){
120 case 1: key = MEV_NEXT; break;
121 case 2: key = MEV_DEC; break;
122 case 4: key = MEV_ENTER; break;
123 case 8: key = MEV_INC; break;
124 case 16: key = MEV_ESCAPE; break;
125 case 32: key = MEV_PREV; break;
126 default:
127 key = MEV_NONE;
128 delay = DELAY;
129 }
130 } else {
131 // реализован простейший автоповтор с ускорением: чем больше удерживается кнопка, тем чаще генерируется событие
132 for(uint8_t i=delay; i && (get_pins() == pin); i--) _delay_ms(10);
133 if(get_pins() == pin){
134 if(delay > 10) delay -= 5;
135 return key;
136 }
137 else key = MEV_NONE;
138 }
139 prev = pin;
140 return key;
141 }
142
143 // эти две функции должны быть определены в выбранном модуле вывода меню
144 void first_func(void); // инициализация модуля вывода
145 void last_func(void); // завершающая функция
146
147 MAIN(){
148 // примитивная настройка портов
149 PORTC = 0xFF;
150 DDRD = 0xFF;
151 // инициализация модуля вывода
152 first_func();
153 // инициализация меню
154 init_menu(&mm_1, false);
155 // навигация по меню
156 while(do_menu(get_event()));
157 // завершение работы
158 last_func();
159 }
MEV_PREV
@ MEV_PREV
перемещение к предыдущему пункту
Definition: fmenu.h:182
fproperty.h
Определения системы свойств
MEV_DEC
@ MEV_DEC
уменьшение значения свойства на 1.
Definition: fmenu.h:184
do_menu
bool do_menu(menu_event_t ev)
Definition: fmenu.c:119
get_event
menu_event_t get_event(void)
Definition: test.c:109
MEV_ENTER
@ MEV_ENTER
активация пункта
Definition: fmenu.h:179
PROP_U8
#define PROP_U8(_var, _eadr, _min, _max)
Definition: fproperty.h:188
PROP_I16
#define PROP_I16(_var, _eadr, _min, _max)
Definition: fproperty.h:231
MEV_INC
@ MEV_INC
увеличение значения свойства на 1.
Definition: fmenu.h:183
MENU_SUB
#define MENU_SUB(_ident, _name, _parent, _prev, _next, _sub)
Definition: fmenu.h:134
NONE
_mem menu_item_t NONE
идентификатор "отсутствующего" пункта меню для ссылок в списке
Definition: fmenu.c:20
avr_helper.h
Вспомогательные макросы для работы с AVR.
MENU_PROP
#define MENU_PROP(_ident, _name, _parent, _prev, _next, _func, _prop)
Definition: fmenu.h:155
store_menu_properties
void store_menu_properties(_mem menu_item_t *item)
Definition: fmenu.c:64
MENU_CMD
#define MENU_CMD(_ident, _name, _parent, _prev, _next, _func)
Definition: fmenu.h:118
fmenu.h
Определения системы меню
init_menu
void init_menu(_mem menu_item_t *menu, bool load_props)
Definition: fmenu.c:110
MEV_NEXT
@ MEV_NEXT
перемещение к следующему пункту
Definition: fmenu.h:181
NOSTORE
#define NOSTORE
свойства, значение которых не должно сохраняться, должны получить это значение в качестве адреса EEPR...
Definition: fproperty.h:324
MEV_NONE
@ MEV_NONE
отсутствие действия
Definition: fmenu.h:178
PROP_BOOL
#define PROP_BOOL(_var, _eadr,...)
Definition: fproperty.h:261
MEV_ESCAPE
@ MEV_ESCAPE
выход из меню (субменю)
Definition: fmenu.h:180
menu_event_t
menu_event_t
событие управления меню
Definition: fmenu.h:177
load_menu_properties
void load_menu_properties(_mem menu_item_t *item)
Definition: fmenu.c:90
MAIN
#define MAIN()
макрос для определения компактной версии функции main()
Definition: avr_helper.h:33


FlexMenu: Файл version.h

Файл version.h

<введите краткую информацию об этом файле здесь> Подробнее...

См. исходные тексты.

Подробное описание

<введите краткую информацию об этом файле здесь>

<введите более подробную информацию об этом файле здесь>

Автор
ARV
Заметки
<введите примечания здесь>
Дата
29 апр. 2020 г.
Авторство
2020 © ARV. All rights reserved.

Для компиляции требуется:

  1. avr-gcc 6.3.0 или более новая версия


FlexMenu: Исходный файл version.h

version.h
См. документацию.
1
15 #ifndef VERSION_H_
16 #define VERSION_H_
17
18
19
20 #endif /* VERSION_H_ */


FlexMenu: Файл ver.h

Файл ver.h

См. исходные тексты.


FlexMenu: Исходный файл ver.h

ver.h
См. документацию.
1
38 #ifndef VER_H_
39 #define VER_H_
40
41 // гарантируется работа только со свежими версиями тулчейна AVR-GCC
42 // после тестирования с другими версиями компиляторов необходимо дополнить здесь проверку
43 // соответствия версии компилятора
44 #if defined(__AVR__) && ((__GNUC__ == 4) && (__GNUC_MINOR__ < 9)) || (__GNUC__ < 4)
45 #error "AVR-GCC version must be higher than 4.9.x"
46 #endif
47
48 #if defined(PLACE_CONST_IN_FLASH)
49 #define _mem const __flash
51 #else
52 #define _mem const
54 #endif
55
57 typedef _mem char * pchar_f;
59 typedef _mem char str_f[];
60
61 #endif /* VER_H_ */
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
pchar_f
_mem char * pchar_f
указатель на константный символ
Definition: ver.h:57
str_f
_mem char str_f[]
строка константных символов
Definition: ver.h:59


FlexMenu: Файл terminal_out.c

Функции
Файл terminal_out.c
#include <avr/io.h>
#include "avr_helper.h"
#include "fmenu.h"
#include "fproperty.h"
#include <stdio.h>
#include <avr/pgmspace.h>

См. исходные тексты.

Функции

void paint_menu ()

Подробное описание

Тестовый проект следует использовать с терминальной программой, в которую микроконтрроллер будет выводить систему меню. Терминальная программа должна поддерживать команды терминала VT100. Такой программой является, например, putty

Автор
ARV
Дата
3 мая 2020 г.
Авторство
2020 © ARV. All rights reserved.

См. определение в файле terminal_out.c

Функции

◆ paint_menu()

void paint_menu ( void )

отрисовка меню

Заметки
данная функция должна быть реализована пользователем

См. определение в файле terminal_out.c строка 41

Используется в init_menu().


FlexMenu: Исходный файл terminal_out.c

terminal_out.c
См. документацию.
1
15 #include <avr/io.h>
16 #include "avr_helper.h"
17 #include "fmenu.h"
18 #include "fproperty.h"
19 #include <stdio.h>
20 #include <avr/pgmspace.h>
21
22 #define ESC "\033"
23 #define TERMINAL_HIDE_CUR PSTR(ESC "[?25l")
24 #define TERMINAL_CLR PSTR(ESC "[c" ESC "[2J" ESC "[0m")
25 #define TERMINAL_GOTO_XY PSTR(ESC "[%d;%dH")
26 #define TERMINAL_SEL PSTR(ESC "[47m" ESC "[30m")
27 #define TERMINAL_NOSEL PSTR(ESC "[40m")
28
29 // инициализация не требуется
30 void first_func(void){
31
32 }
33
34 // в конце вывод сообщения
35 void last_func(void){
36 printf_P(TERMINAL_CLR);
37 printf_P(PSTR("DEMO STOPPED\nBYE! :-)"));
38 }
39
40 // вывод меню
41 void paint_menu(){
42 char text[DISPLAY_WIDTH+1];
43
44 _mem menu_item_t *cur;
45 static _mem menu_item_t *first;
46
47 // если меню/субменю обновилось
48 if(menu_first == &NONE){
49 printf_P(TERMINAL_CLR);
50 first = menu_current;
51 // ищем первый пункт текущего меню/субменю
52 while(first->prev != &NONE) first = first->prev;
53 menu_first = first;
54 }
55
56 printf_P(TERMINAL_HIDE_CUR);
57 printf_P(TERMINAL_GOTO_XY, 0, 0);
58 cur = first;
59 // выводим все пункты
60 for(uint8_t y=0; y < DISPLAY_WIDTH; y++){
61 if(cur == &NONE) break;
62 get_item_text(text, cur);
63 // выделение текущего пункта делается командами терминала
64 if(cur == menu_current)
65 printf_P(TERMINAL_SEL);
66 else
67 printf_P(TERMINAL_NOSEL);
68 printf_P(PSTR("%s\n" ESC "[0m"), text);
69 cur = cur->next;
70 }
71 }
72
73
fproperty.h
Определения системы свойств
_mem
#define _mem
префикс для размещения констант в ОЗУ
Definition: ver.h:53
menu_item
пункт меню
Definition: fmenu.h:67
menu_first
_mem menu_item_t * menu_first
Definition: fmenu.c:21
NONE
_mem menu_item_t NONE
идентификатор "отсутствующего" пункта меню для ссылок в списке
Definition: fmenu.c:20
avr_helper.h
Вспомогательные макросы для работы с AVR.
fmenu.h
Определения системы меню
menu_current
_mem menu_item_t * menu_current
текущий пункт меню, который следует выделить при отрисовке меню в функции paint_menu.
Definition: fmenu.c:22
DISPLAY_WIDTH
#define DISPLAY_WIDTH
Definition: fmenu_config.h:34
get_item_text
void get_item_text(char buf[MENU_TEXT_LEN+1], _mem menu_item_t *item)
menu_item::prev
_mem struct menu_item * prev
ссылка на предыдущий пункт в списке
Definition: fmenu.h:69
paint_menu
void paint_menu()
Definition: terminal_out.c:41