Disclaimer: I'm not a good coder so if you see anything that seems odd, please do tell me so I can learn and optimize the code 
#include <LiquidCrystal.h>
#include "M2tk.h"
#include "utility/m2ghlc.h"
//=================Input/Output setup=================
uint8_t user_up_pin = 2;
uint8_t user_down_pin = 3;
uint8_t user_select_pin = 8;
//=================LCD setup=================
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
const int contrastPin = 10;
//=================Parameters and variables=================
//-------Variables to keep track of the timing of recent interrupts-------
unsigned long button_time = 0;
unsigned long last_button_time = 0;
//-------Device and command names-------
const int buffer_size = 13; //set buffer size
const int name_size = 12; //set max name size to 11 chars
String menu_sub_dot = String(". "); //used for sub menus
//Device 1
char device1_name[name_size] = "Empty slot1";
char device1_menu_name_char[buffer_size]; //char array to hold the menu name for device to be shown in the menu
String device1_name_string = device1_name; //The name of Device
String device1_menu_name = String(); //String with the menu name for device
bool device1_status = true;
//Device 2
char device2_menu_name_char[buffer_size];
String device2_name = String("Empty slot2");
String device2_menu_name = String();
bool device2_status = false;
//Device 3
char device3_menu_name_char[buffer_size];
String device3_name = String("Empty slot3");
String device3_menu_name = String();
bool device3_status = false;
//=================Menu setup=================
//-----------------Forward declarations of the toplevel elements-------
M2_EXTERN_HLIST(top_el_device_menu);
M2_EXTERN_HLIST(top_el_device1_menu);
M2_EXTERN_HLIST(top_el_device2_menu);
M2_EXTERN_HLIST(top_el_device3_menu);
extern M2tk m2;
//-----------------Menu elements-------
M2_ROOT(el_splash_screen, NULL, "VeAr Remote", &top_el_device_menu); //Splash screen for startup
M2_ALIGN(el_centered_splash_screen, NULL, &el_splash_screen);
M2_SPACECB(top_el_device1_cb, NULL, is_device1_empty); //Checks if there is any device on device slot device menu
M2_SPACECB(top_el_device2_cb, NULL, is_device2_empty);
M2_SPACECB(top_el_device3_cb, NULL, is_device3_empty);
char buffer[name_size]; //buffer to hold the new name
M2_TEXT(el_add_device1_name_text,"a0f2", buffer, name_size);
M2_BUTTON(el_ok, "", " OK ", fn_add_device_name_ok);
M2_LIST(add_device1_list) = {&el_add_device1_name_text, &el_ok};
M2_VLIST(el_add_device1, NULL, add_device1_list);
//-------Overall menu structure for devices-------
m2_xmenu_entry xmenu_data_device[] =
{
{ "Choose device", NULL, NULL},
{ device1_menu_name_char, &top_el_device1_cb, NULL},
{ device2_menu_name_char, &top_el_device2_cb, NULL},
{ device3_menu_name_char, &top_el_device3_cb, NULL},
{ "Add device", NULL, NULL },
{ device1_menu_name_char, &el_add_device1, NULL},
{ device2_menu_name_char, &top_el_device2_cb, NULL},
{ device3_menu_name_char, &top_el_device3_cb, NULL},
{ "Remove device", NULL, NULL },
{ NULL, NULL, NULL },
};
// This is the main menu dialog box
uint8_t el_device_first = 0;
uint8_t el_device_cnt = 2;
// M2_X2LMENU definition
M2_X2LMENU(el_device_strlist, "l2e1w12", &el_device_first, &el_device_cnt, xmenu_data_device, '+','-','\0');
M2_VSB(el_device_vsb, "l2W2r1", &el_device_first, &el_device_cnt);
M2_LIST(list_device) = { &el_device_strlist, &el_device_vsb };
M2_HLIST(top_el_device_menu, NULL, list_device);
//-------Overall menu structure for device 1-------
m2_xmenu_entry xmenu_data_device1[] =
{
{ "Commands left", NULL, NULL},
{ "Add Command", NULL, NULL },
{ ". Command 1", NULL, NULL},
{ ". Command 2", NULL, NULL},
{ ". Command 3", NULL, NULL},
{ "Remove command", NULL, NULL },
{ "Main menu", &top_el_device_menu, NULL},
{ NULL, NULL, NULL },
};
// This is the main menu dialog box
uint8_t el_device1_first = 0;
uint8_t el_device1_cnt = 2;
// M2_X2LMENU definition
M2_X2LMENU(el_device1_strlist, "l2e1w12", &el_device1_first, &el_device1_cnt, xmenu_data_device1, '+','-','\0');
M2_VSB(el_device1_vsb, "l2W2r1", &el_device1_first, &el_device1_cnt);
M2_LIST(list_device1) = { &el_device1_strlist, &el_device1_vsb };
M2_HLIST(top_el_device1_menu, NULL, list_device1);
//-------Overall menu structure for device 2-------
m2_xmenu_entry xmenu_data_device2[] =
{
{ "Commands left", NULL, NULL},
{ "Add Command", NULL, NULL },
{ ". Command 1", NULL, NULL},
{ ". Command 2", NULL, NULL},
{ ". Command 3", NULL, NULL},
{ "Remove command", NULL, NULL },
{ "Main menu", &top_el_device_menu, NULL},
{ NULL, NULL, NULL },
};
// This is the main menu dialog box
uint8_t el_device2_first = 0;
uint8_t el_device2_cnt = 2;
// M2_X2LMENU definition
M2_X2LMENU(el_device2_strlist, "l2e1w12", &el_device2_first, &el_device2_cnt, xmenu_data_device2, '+','-','\0');
M2_VSB(el_device2_vsb, "l2W2r1", &el_device2_first, &el_device2_cnt);
M2_LIST(list_device2) = { &el_device2_strlist, &el_device2_vsb };
M2_HLIST(top_el_device2_menu, NULL, list_device2);
//-------Overall menu structure for device 3-------
m2_xmenu_entry xmenu_data_device3[] =
{
{ "Commands left", NULL, NULL},
{ "Add Command", NULL, NULL },
{ ". Command 1", NULL, NULL},
{ ". Command 2", NULL, NULL},
{ ". Command 3", NULL, NULL},
{ "Remove command", NULL, NULL },
{ "Main menu", &top_el_device_menu, NULL},
{ NULL, NULL, NULL },
};
// This is the main menu dialog box
uint8_t el_device3_first = 0;
uint8_t el_device3_cnt = 2;
// M2_X2LMENU definition
M2_X2LMENU(el_device3_strlist, "l2e1w12", &el_device3_first, &el_device3_cnt, xmenu_data_device3, '+','-','\0');
M2_VSB(el_device3_vsb, "l2W2r1", &el_device3_first, &el_device3_cnt);
M2_LIST(list_device3) = { &el_device3_strlist, &el_device3_vsb };
M2_HLIST(top_el_device3_menu, NULL, list_device3);
//-------m2 object and constructor-------
M2tk m2(&el_centered_splash_screen, m2_es_arduino, m2_eh_4bs, m2_gh_lc);
void setup(){
//Menu setup
m2_SetLiquidCrystal(&lcd, 16, 2);
//LCD setup
pinMode(contrastPin, OUTPUT);
analogWrite(contrastPin, 60);
lcd.createChar(0, degree);
//User input setup and attach of interrupts
PCICR |= (1<<PCIE0); //Enable interrupt on pin 8
PCMSK0 |= (1<<PCINT0); //Tell pin 8 to search for a change in state
MCUCR = (1<<ISC01) | (1<<ISC00); //The change is set to FALLING
attachInterrupt(0, user_input_up, FALLING); //Interrupt on pin 2
attachInterrupt(1, user_input_down, FALLING); //Interrupt on pin 3
pinMode(user_up_pin, INPUT_PULLUP); //activating internal pullup resistor
pinMode(user_down_pin, INPUT_PULLUP); //activating internal pullup resistor
pinMode(user_select_pin, INPUT_PULLUP); //activating internal pullup resistor
//Write the menu to LCD
m2.draw();
}
void loop(){
//-------Update menu titles-------
device1_name_string = device1_name;
device1_menu_name = menu_sub_dot + device1_name_string;
device1_menu_name.toCharArray(device1_menu_name_char, buffer_size);
device2_menu_name = menu_sub_dot + device2_name;
device2_menu_name.toCharArray(device2_menu_name_char, buffer_size);
device3_menu_name = menu_sub_dot + device3_name;
device3_menu_name.toCharArray(device3_menu_name_char, buffer_size);
}
//=================Functions=================
void user_input_up(){
button_time = millis();
if (button_time - last_button_time > 250){
m2.setKey(M2_KEY_PREV);
m2.checkKey();
if ( m2.handleKey() )
m2.draw();
last_button_time = button_time;
}
}
void user_input_down(){
button_time = millis();
if (button_time - last_button_time > 250){
m2.setKey(M2_KEY_NEXT);
m2.checkKey();
if ( m2.handleKey() )
m2.draw();
last_button_time = button_time;
}
}
ISR(PCINT0_vect) { //interrupt on pin 8 is set to be a SELECT function
button_time = millis();
if (button_time - last_button_time > 250){
m2.setKey(M2_KEY_SELECT);
m2.checkKey();
if ( m2.handleKey() )
m2.draw();
last_button_time = button_time;
}
}
void is_device1_empty(m2_el_fnarg_p fnarg){
if(device1_status){
m2_SetRoot(&top_el_device1_menu);
}
else{
m2_SetRootExtended(&top_el_device_menu, 0, 0);
}
m2.setKey(M2_KEY_SELECT);
m2.checkKey();
if ( m2.handleKey() )
m2.draw();
}
void is_device2_empty(m2_el_fnarg_p fnarg){
if(device2_status){
m2_SetRoot(&top_el_device2_menu);
}
else{
m2_SetRootExtended(&top_el_device_menu, 0, 0);
}
m2.setKey(M2_KEY_SELECT);
m2.checkKey();
if ( m2.handleKey() )
m2.draw();
}
void is_device3_empty(m2_el_fnarg_p fnarg){
if(device3_status){
m2_SetRoot(&top_el_device3_menu);
}
else{
m2_SetRootExtended(&top_el_device_menu, 0, 0);
}
m2.setKey(M2_KEY_SELECT);
m2.checkKey();
if ( m2.handleKey() )
m2.draw();
}
void fn_add_device_name_ok(m2_el_fnarg_p fnarg){
strcpy(device1_name,buffer);
buffer[name_size];
device1_status = 1;
m2_SetRoot(&top_el_device_menu);
}