46 } __attribute__((packed));
75 static void print(
IOStream& outs, zero_or_many_P var,
bool selected, uint8_t bv);
94 static void print(
IOStream& outs, int_range_P var,
bool selected);
127 static const uint8_t STACK_MAX = 8;
143 void on_key_down(uint8_t nr, zero_or_many_P var);
154 } __attribute__((packed));
168 m_stack[m_top] = root;
177 void on_key_down(uint8_t nr);
194 if (flag) m_out <<
clear << *
this;
229 m_walker->on_key_down(nr);
240 class RotaryButton :
public Button {
263 virtual void on_change(uint8_t
type)
292 m_sw(walker, scheduler, sw)
302 virtual void on_event(uint8_t
type, uint16_t direction);
326 #define MENU_BEGIN(var,name) \ 327 const char var ## _name[] __PROGMEM = name; \ 328 const Menu::item_P var ## _list[] __PROGMEM = { 336 #define MENU_ITEM(var) \ 343 #define MENU_END(var) \ 346 const Menu::item_list_t var __PROGMEM = { \ 349 (str_P) var ## _name \ 359 #define MENU_SYMB(var,name) \ 360 const char var ## _name[] __PROGMEM = name; \ 361 const Menu::item_t var __PROGMEM = { \ 363 (str_P) var ## _name \ 380 #define MENU_ENUM_BEGIN(var) \ 381 const Menu::item_P var ## _list[] __PROGMEM = { 388 #define MENU_ENUM_ITEM(var) \ 395 #define MENU_ENUM_END(var) \ 406 #define MENU_ONE_OF(type,var,name,value) \ 407 const char var ## _name[] __PROGMEM = name; \ 408 const Menu::one_of_t var __PROGMEM = { \ 411 (str_P) var ## _name \ 424 #define MENU_ZERO_OR_MANY(type,var,name,value) \ 425 const char var ## _name[] __PROGMEM = name; \ 426 const Menu::zero_or_many_t var __PROGMEM = { \ 428 Menu::ZERO_OR_MANY, \ 429 (str_P) var ## _name \ 443 #define MENU_INT_RANGE(var,name,low,high,value) \ 444 const char var ## _name[] __PROGMEM = name; \ 445 const Menu::int_range_t var __PROGMEM = { \ 448 (str_P) var ## _name \ 461 #define MENU_ACTION(var,name,obj) \ 462 const char var ## _name[] __PROGMEM = name; \ 463 const Menu::action_t var __PROGMEM = { \ 466 (str_P) var ## _name \
IOStream & operator<<(IOStream &outs, SPI::Clock rate)
const class prog_str * str_P
IOStream & clear(IOStream &outs)