0

I am doing a display class using 2*8 lcd on an arduino to display and navigate my menu using MenuBackend library but i can make instance of these variables. I tried using static variable it did not work either.

here is the codes

GPSMenu.h :

#ifndef GPSMENU_h
#define GPSMENU_h
#include "Arduino.h"
#include <MenuBackend.h>
#include <LiquidCrystal.h>

class GPSMenu
{
public:
GPSMenu(LiquidCrystal* lcd);

  void navigateMenus( byte read);

  private:
  void menuChangeEvent(MenuChangeEvent changed);
  void menuUseEvent(MenuUseEvent used);
  void menuSetup();
  LiquidCrystal *_lcd;

  MenuBackend menu =  MenuBackend(menuUseEvent,menuChangeEvent);

  //beneath is the list of menu items needed to build the menu
  MenuItem Battery     = MenuItem(menu, "Battery ", 1);//----usable
  MenuItem Iteneraire  = MenuItem(menu, "Itener  ", 1);
  MenuItem Start       = MenuItem(menu, "Start   ", 2);//----usable
  MenuItem Stop        = MenuItem(menu, "Stop    ", 2);//----usable
  MenuItem FileOpn     = MenuItem(menu, "FileOpn ", 2);
  MenuItem NewFile     = MenuItem(menu, "NewFile ", 3);//----usable
  MenuItem OverWr      = MenuItem(menu, "OverWr  ", 3);//----usable
  MenuItem PtOpn       = MenuItem(menu, "PtOpn   ", 2);
  MenuItem Seconde_1   = MenuItem(menu, "Court   ", 3);//----usable
  MenuItem Secondes_15 = MenuItem(menu, "Moyen   ", 3);//----usable
  MenuItem Minute_1    = MenuItem(menu, "Long    ", 3);//----usable
  MenuItem GPSData     = MenuItem(menu, "GPSData ", 1);
  MenuItem Coord       = MenuItem(menu, "Coord   ", 2);//----usable
  MenuItem Time        = MenuItem(menu, "Time    ", 2);//----usable
  MenuItem Status      = MenuItem(menu, "Status  ", 2);//----usable
  MenuItem SpdAlti     = MenuItem(menu, "SpdAlti ", 2);//----usable
  MenuItem Filemnger   = MenuItem(menu, "Filemngr", 1);//----usable

};

#endif

GPSMenu.cpp:

#include "Arduino.h"
#include <MenuBackend.h>    //MenuBackend library - copyright by Alexander Brevig
#include <LiquidCrystal.h>  //this library is included in the Arduino IDE
#include "GPSMenu.h"  //this library is included in the Arduino IDE

GPSMenu::GPSMenu(LiquidCrystal* lcd){
 _lcd = lcd;
 _lcd->begin(8, 2);
 _lcd->clear();
  GPSMenu::menuSetup();

}

//this function builds the menu and connects the correct items together
void GPSMenu::menuSetup()
{
  //add the file menu to the menu root
  menu.getRoot().add(Battery);
  Battery.addRight(Iteneraire).addRight(GPSData ).addRight(Filemnger);
  Iteneraire.add(Start ).addRight(Stop).addRight(FileOpn).addRight(PtOpn);
  GPSData.add(Coord).addRight(Time).addRight(Status).addRight(SpdAlti);
  FileOpn.add(NewFile).addRight(OverWr);
  PtOpn.add(Seconde_1).addRight(Secondes_15).addRight(Minute_1);
}

//  This is where you define a behaviour for a menu item

void GPSMenu::menuUseEvent(MenuUseEvent used)
 {
   _lcd->setCursor(0, 0);
   _lcd->print(used.item.getName());
   _lcd->setCursor(0, 1);
   _lcd->print("Used    ");
}
/*
  Here we get a notification whenever the user changes the menu
  That is, when the menu is navigated
*/
void GPSMenu::menuChangeEvent(MenuChangeEvent changed)
{
  _lcd->setCursor(0, 0);
  _lcd->print(changed.from.getName());
  _lcd->setCursor(0, 1);
  _lcd->print(changed.to.getName());
}

void GPSMenu::navigateMenus( byte read) {
  MenuItem currentMenu=menu.getCurrent();

  switch (read){

  case 1:

    if(!(currentMenu.hasAfterChildren())){  //if the current menu has a child and has been pressed enter then menu navigate to item below
      menu.use();
    }
    else{  //otherwise, if menu has no child and has been pressed enter the current menu is used
      menu.moveDown();
    }
    break;

  case 2:
    menu.moveLeft();

    break;
  case 3:
    menu.moveRight();

    break;
  case 4:
    menu.moveUp();
    break;
  }
}

And the errors on my terminal :

In file included from GPSMenu.cpp:4:0:
GPSMenu.h:20:46: error: ‘void GPSMenu::menuUseEvent(MenuUseEvent)’ cannot appear in a constant-expression
       static MenuBackend menu =  MenuBackend(menuUseEvent,menuChangeEvent);
                                              ^
GPSMenu.h:20:59: error: ‘void GPSMenu::menuChangeEvent(MenuChangeEvent)’ cannot appear in a constant-expression
       static MenuBackend menu =  MenuBackend(menuUseEvent,menuChangeEvent);
                                                           ^
GPSMenu.h:20:74: error: invalid in-class initialization of static data member of non-integral type ‘MenuBackend’
       static MenuBackend menu =  MenuBackend(menuUseEvent,menuChangeEvent);
                                                                          ^
GPSMenu.h:20:74: error: initializer invalid for static member with constructor
GPSMenu.h:20:74: note: (an out of class initialization is required)
GPSMenu.h:23:46: error: ‘GPSMenu::menu’ cannot appear in a constant-expression
       static MenuItem Battery     = MenuItem(menu, "Battery ", 1);//----usable
                                              ^
GPSMenu.h:23:65: error: invalid in-class initialization of static data member of non-integral type ‘MenuItem’
       static MenuItem Battery     = MenuItem(menu, "Battery ", 1);//----usable
                                                                 ^
GPSMenu.h:23:65: error: initializer invalid for static member with constructor
GPSMenu.h:24:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Iteneraire  = MenuItem(menu, "Itener  ", 1);
                                                          ^
GPSMenu.h:25:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Start       = MenuItem(menu, "Start   ", 2);//----usable
                                                          ^
GPSMenu.h:26:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Stop        = MenuItem(menu, "Stop    ", 2);//----usable
                                                          ^
GPSMenu.h:27:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem FileOpn     = MenuItem(menu, "FileOpn ", 2);
                                                          ^
GPSMenu.h:28:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem NewFile     = MenuItem(menu, "NewFile ", 3);//----usable
                                                          ^
GPSMenu.h:29:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem OverWr      = MenuItem(menu, "OverWr  ", 3);//----usable
                                                          ^
GPSMenu.h:30:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem PtOpn       = MenuItem(menu, "PtOpn   ", 2);
                                                          ^
GPSMenu.h:31:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Seconde_1   = MenuItem(menu, "Court   ", 3);//----usable
                                                          ^
GPSMenu.h:32:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Secondes_15 = MenuItem(menu, "Moyen   ", 3);//----usable
                                                          ^
GPSMenu.h:33:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Minute_1    = MenuItem(menu, "Long    ", 3);//----usable
                                                          ^
GPSMenu.h:34:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem GPSData     = MenuItem(menu, "GPSData ", 1);
                                                          ^
GPSMenu.h:35:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Coord       = MenuItem(menu, "Coord   ", 2);//----usable
                                                          ^
GPSMenu.h:36:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Time        = MenuItem(menu, "Time    ", 2);//----usable
                                                          ^
GPSMenu.h:37:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Status      = MenuItem(menu, "Status  ", 2);//----usable
                                                          ^
GPSMenu.h:38:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem SpdAlti     = MenuItem(menu, "SpdAlti ", 2);//----usable
                                                          ^
GPSMenu.h:39:58: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
       MenuItem Filemnger   = MenuItem(menu, "Filemngr", 1);//----usable

1 Answer 1

1

You can't set the value of a variable in the header file (class definition).

class foo
{
  int a = 1;  // This doesn't work
};

This works

class foo2
{
  static int b;
};
int foo2::b = 2;
3
  • why do we have to precise int in :int foo2::b = 2; since we have allready declared b as int. I did what you said but i get In file included from GPSMenu.cpp:4:0: GPSMenu.h:59:70: error: invalid use of non-static member function MenuBackend GPSMenu::menu = MenuBackend(menuUseEvent,menuChangeEvent); Commented May 31, 2017 at 13:18
  • why do you have to declare int again in int foo2::b = 2; I don't know, but I d know it doesn't work if you don't. That's because GPSMenu::menu is not a static member. Commented May 31, 2017 at 14:15
  • GPSMenu::menu is declated as static ... in the class public: GPSMenu(LiquidCrystal* lcd); void navigateMenus( byte read); static MenuBackend menu; static MenuItem Battery; ect..... and outside it MenuBackend GPSMenu::menu = MenuBackend(menuUseEvent,menuChangeEvent); MenuItem GPSMenu::Battery= MenuItem(menu, "Battery ", 1); ect... Commented May 31, 2017 at 15:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.