⚠️ Forum Maintenance: Feb 6th, 8am - 14pm (UTC+2)

Raspberry Pi GPIO with C/C++ using 3rd party library pigpio

  • Hello Everyone,

    I have a problem with using 3rd party library pigpio.

    The application works well, i saw gpio value via qDebug() in Application Output screen but i can't set ui widget values at aFunction().

    When i used ui->cdNumber->display(RPM) in aFunction() i get error "invalid use of member ‘ui’ in static member function"

    How do I fix this problem? or How should I go about solving this problem?

    My qt Application:

    I added .pro file at below code.

    LIBS += -lpigpio -lrt -lpthread


    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #include <QMainWindow>
    #include "QDebug"
    #include <pigpio.h>
    #include <QTimer>
    namespace Ui {
    class MainWindow;
    class MainWindow : public QMainWindow
        explicit MainWindow(QWidget *parent = nullptr);
    public slots:
        Ui::MainWindow *ui;
        QTimer *ScreenRefreshing;
    private slots:
        static void aFunction(int gpio, int level, uint32_t tick);
        void Screen_Refreshing();
    #endif // MAINWINDOW_H


    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    MainWindow::MainWindow(QWidget *parent) :
        ui(new Ui::MainWindow)
        if (gpioInitialise() < 0)
            qDebug() << "pigpio initialisation failed";
            qDebug() << "pigpio initialised ok";
        gpioSetMode(20, PI_INPUT);
        gpioSetPullUpDown(20, PI_PUD_OFF);
        gpioSetAlertFunc(20, aFunction);
        ScreenRefreshing = new QTimer(this);
        connect(ScreenRefreshing, SIGNAL(timeout()), this, SLOT(Screen_Refreshing()));
        delete ui;
    void MainWindow::aFunction(int gpio, int level, uint32_t tick)
        double RPM = 0;
        if(gpio == 20)
            if(level == 1)
               static uint32_t lastTick = 0;
               if (lastTick)
                   qDebug() << "GPIO = " << gpio << "LEVEL = " << level << "Tick = " << tick;
                   RPM = (double(tick - lastTick) / 1000000.0) * 3600;
                   qDebug() << "RPM = " << RPM;
                   // ui->lcdNumber_Distance->display(RPM);  // ->>>>>>>>> "invalid use of member ‘ui’ in static member function"
                   //qDebug() << "2. Level = " << level;
                   //printf("%d 0.00\n", level);
               lastTick = tick;
    void MainWindow::Screen_Refreshing()
        // for test

    The function I use and its description:

    int gpioSetAlertFunc(unsigned user_gpio, gpioAlertFunc_t f)
    Registers a function to be called (a callback) when the specified GPIO changes state.
    user_gpio: 0-31
            f: the callback function
    Returns 0 if OK, otherwise PI_BAD_USER_GPIO.
    One callback may be registered per GPIO.
    The callback is passed the GPIO, the new level, and the tick.
    Parameter   Value    Meaning
    GPIO        0-31     The GPIO which has changed state
    level       0-2      0 = change to low (a falling edge)
                         1 = change to high (a rising edge)
                         2 = no level change (a watchdog timeout)
    tick        32 bit   The number of microseconds since boot
                         WARNING: this wraps around from
                         4294967295 to 0 roughly every 72 minutes
    The alert may be cancelled by passing NULL as the function.
    The GPIO are sampled at a rate set when the library is started.
    If a value isn't specifically set the default of 5 us is used.
    The number of samples per second is given in the following table.
                  per sec
             1  1,000,000
             2    500,000
    sample   4    250,000
    rate     5    200,000
    (us)     8    125,000
            10    100,000
    Level changes shorter than the sample rate may be missed.
    The thread which calls the alert functions is triggered nominally 1000 times per second. The active alert functions will be called once per level change since the last time the thread was activated. i.e. The active alert functions will get all level changes but there will be a latency.
    If you want to track the level of more than one GPIO do so by maintaining the state in the callback. Do not use gpioRead. Remember the event that triggered the callback may have happened several milliseconds before and the GPIO may have changed level many times since then.
    The tick value is the time stamp of the sample in microseconds, see gpioTick for more details.
    void aFunction(int gpio, int level, uint32_t tick)
       printf("GPIO %d became %d at %d", gpio, level, tick);
    // call aFunction whenever GPIO 4 changes state
    gpioSetAlertFunc(4, aFunction);

    Thanks in advance

  • Lifetime Qt Champion

    Hi and welcome to devnet,

    That's because you try to access a standard member variable from a static function.

    Take a look at the ir_receiver example of the pigpio project. It shows how to use a class with the callback with gpioSetAlertFuncEx.