C++

Top Page

Reply to this message
Author: Frédéric
Date:  
To: Guilde
Subject: C++
Hello,

Je développe une petite appli Arduino qui utilise cette librairie :

https://github.com/jonblack/arduino-menusystem

J'essaye d'implémenter cet exemple :

https://github.com/jonblack/arduino-menusystem/blob/master/examples/led_matrix/led_matrix.ino

de manière plus objet. Je voudrais que les callbacks on_xxx_selected()
deviennent les membres d'une classe où, en gros, je rapatrie tout ce qui
est après la ligne 88.

Mais ça ne marche pas, j'obtiens l'erreur :

--------------

/tmp/arduino_build_965784/sketch/myMenu.cpp: In constructor 'MyMenu::MyMenu(MyRenderer*)':
myMenu.cpp:12:39: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&MyMenu::on_time_selected' [-fpermissive]
     m_mi_time = new MenuItem("TIME", &on_time_selected);
                                       ^
myMenu.cpp:12:55: error: no matching function for call to 'MenuItem::MenuItem(const char [5], void (MyMenu::*)(MenuComponent*))'
     m_mi_time = new MenuItem("TIME", &on_time_selected);
                                                       ^
In file included from /tmp/arduino_build_965784/sketch/myMenu.h:4:0,
                 from /tmp/arduino_build_965784/sketch/myMenu.cpp:4:
/home/fma/Arduino/libraries/arduino-menusystem/MenuSystem.h:195:5: note: candidate: MenuItem::MenuItem(const char*, MenuComponent::SelectFnPtr)
     MenuItem(const char* name, SelectFnPtr select_fn);
     ^
/home/fma/Arduino/libraries/arduino-menusystem/MenuSystem.h:195:5: note:   no known conversion for argument 2 from 'void (MyMenu::*)(MenuComponent*)' to 'MenuComponent::SelectFnPtr {aka void (*)(MenuComponent*)}'


--------------

Du coup, j'ai essayé de déclarer ces callback static, mais là, j'obtiens :

--------------

myMenu.cpp:65:69: error: cannot declare member function 'static void MyMenu::on_time_selected(MenuComponent*)' to have static linkage [-fpermissive]
static void MyMenu::on_time_selected(MenuComponent* p_menu_component)

--------------

Une idée comment corriger ça ? J'ai joint la classe en question...

Merci d'avance pour vos lumières.

-- 
    Frédéric

/*
*/

#include "myMenu.h"


MyMenu::MyMenu(MyRenderer* myRenderer)
{
    m_myRenderer = myRenderer;


    m_ms = new MenuSystem((MenuComponentRenderer const&)m_myRenderer);
    m_mi_time = new MenuItem("TIME", &on_time_selected);
    m_mi_date = new MenuItem("DATE", &on_date_selected);
    m_mu_disp = new Menu("DISP*");
    m_mi_brightness = new MenuItem("BRTNS", &on_brightness_selected);
    m_mi_color = new MenuItem("COLOR", &on_color_selected);
}


void MyMenu::begin()
{
//     ledMatrix.clear();
//     ledMatrix.setfont(FONT_5x7);


    m_ms->get_root_menu().add_item(m_mi_time);
    m_ms->get_root_menu().add_item(m_mi_date);
    m_ms->get_root_menu().add_menu(m_mu_disp);
    m_mu_disp->add_item(m_mi_brightness);
    m_mu_disp->add_item(m_mi_color);
    m_ms->display();
}


void MyMenu::loop()
{
    char inChar;


    if ((inChar = Serial.read()) > 0) {
        switch (inChar) {


            case 'w':  // Previus item
                m_ms->prev();
                m_ms->display();
                break;


            case 's':  // Next item
                m_ms->next();
                m_ms->display();
                break;


            case 'a':  // Back presed
                m_ms->back();
                m_ms->display();
                break;


            case 'd':  // Select presed
                m_ms->select();
                m_ms->display();
                break;


            default:
                break;
        }
    }
}


static void MyMenu::on_time_selected(MenuComponent* p_menu_component)
{
    Serial.println("Time selected");
}


static void MyMenu::on_date_selected(MenuComponent* p_menu_component)
{
    Serial.println("Date selected");
}


static void MyMenu::on_brightness_selected(MenuComponent* p_menu_component)
{
    Serial.println("Brightness selected");
}


static void MyMenu::on_color_selected(MenuComponent* p_menu_component)
{
    Serial.println("Color selected");
}

#ifndef MYMENU_H
#define MYMENU_H

#include <MenuSystem.h>
// #include <i2cNavKey.h>

// // navKey pin
// #define I2CNAVKEY_INT_PIN 22;

class MyRenderer;


class MyMenu {
    public:
        MyMenu(MyRenderer* myRenderer);


        void begin();
        void loop();


        void render(Menu const& menu) const;


        void render_menu_item(MenuItem const& menu_item);
        void render_back_menu_item(BackMenuItem const& menu_item);
        void render_numeric_menu_item(NumericMenuItem const& menu_item);
        void render_menu(Menu const& menu) const;


    private:
        MyRenderer* m_myRenderer;


//         i2cNavKey* m_navKey;


        // Menu variables
        MenuSystem* m_ms;
        MenuItem* m_mi_time;
        MenuItem* m_mi_date;
        Menu* m_mu_disp;
        MenuItem* m_mi_brightness;
        MenuItem* m_mi_color;


        // Menu callback functions
        static void on_time_selected(MenuComponent* p_menu_component);
        static void on_date_selected(MenuComponent* p_menu_component);
        static void on_brightness_selected(MenuComponent* p_menu_component);
        static void on_color_selected(MenuComponent* p_menu_component);


        // Functions
        void serial_handler();
};


#endif