Ensemble Graphics Toolkit: Timers

Last modified by Microchip on 2024/01/08 15:34

Introduction

In this training, you will learn how to construct a Periodic and One-Shot Timer. As a bonus, you will also learn how to display the CPU usage on the WVGA Display.

Steps

  • Create a New Source File
  • Periodic Timer
  • One-Shot Timer

Prerequisites

You have prepared the Host PC with all the development software tools and Ensemble Graphics Toolkit source code as explained in:

You have installed and prepared the Eclipse IDE for C/C++ Developers as explained in:

Back to Top

Create a New Source File

In this section, you will be creating a new timer.cpp source file that you will build in this and later training, demonstrating the following:

​In this training, you will use EgtProject and the settings you entered in the Ensemble Graphics Toolkit -- First Application using Eclipse IDE training.

Start the Eclipse IDE.

Eclipse will ask you to select a directory for your workspace. Accept the default directory and click on the Launch button.

Eclipse IDE launcher

Eclipse will launch the previous workspace you configured.

Eclipse Previous Workspace


You will be adding a new source file with the name: timer.cpp. If you have a *.cpp source file from a previous Ensemble Graphics Toolkit training, perform the following steps:

Right-click in the *.cpp window and select Resource Configurations > Exclude from Build…

The Exclude from build window will open:

Eclipse exclude from build

Select Debug and Release and click on the OK button.

The selected *.cpp will be excluded from the build.


Right-click on EgtProject and select Clean Project.

Right-click on EgtProject and select New > Source File.

The New Source File window will open:

Timer: New Source File


Enter "timer.cpp" into the Source file: text box. Click on the Finish button.

A new source file tab timers.cpp is created within the EgtProject.


Enter the following source code to the timers.cpp window pane:

#include <egt/ui>
#include
<iostream>
using namespace std;
using namespace egt;

int main(int argc, const char ** argv)
{
  Application app;
  TopWindow window;
  Button button(window, "Press Me");
  center(button);

  window.show();
 return app.run();
}

Save your program by selecting File > Save. You may also save by pressing CTRL + S.

You have completed adding a new source file to EgtProject.

Back to Top

Periodic Timer

In this section, you will modify and build the timer.cpp source code that you entered in the previous section to construct a Periodic Timer and display the CPU usage.

Modify the timer.cpp source code by adding the following lines of code as shown:

#include <egt/ui>
#include
<iostream>
using namespace std;
using namespace egt;

int main(int argc, const char ** argv)
{
    Application app;
    TopWindow window;
    Button button(window, "Press Me");
    center(button);

   //periodic timer
   Label CPUlabel("CPU:---", Rect(0, 0, 100, 50));
    window.add(bottom(CPUlabel));
    egt::experimental::CPUMonitorUsage tools;
    PeriodicTimer cputimer(std::chrono::seconds(1));
    cputimer.on_timeout([ & CPUlabel, & tools]() {
        cout << "periodic timer fired!" << endl;
        tools.update();
        ostringstream ss;
        ss << "CPU: " << static_cast < int > (tools.usage()) << "%";
        CPUlabel.text(ss.str());
    });
    cputimer.start();

    window.show();
   return app.run();
}

Save your program by selecting File > Save. You may also save by pressing CTRL + S.

To build the project, hover over EgtProject, right-click, and select Build Project from the menu. Or you can click on the Build icon.

The Console window (bottom pane) will display the build progress.


To set run properties, hover over EgtProject, right-click and select Run As > Run Configurations… from the menu.

In the left-hand pane, select EgtProject Debug (under C/C++ Remote Application).

Timer: Debug Configurations


In the Run Configurations window, enter the following in the Remote Absolute File Path for C/C++ Application: text box:

/root/timer

​You may see the previous program /root/???? here. Replace it with /root/timer.

This is the location the timer.cpp executable will be loaded and run on the target.


Click on the Apply button.

Click on the Run button.

Observe the WVGA Display on the target:

The timer.cpp executable is running remotely on the target.

Observe the Press Me button in the center of the WVGA Display and observe the status “periodic timer fire!” every three seconds on the Console.

Also, observe the CPU usage in the bottom left corner of the WVGA Display.

​periodic timer fired!
periodic timer fired!
periodic timer fired!

EGT Display: CPU Usage in the bottom left of the WVGA Display

PeriodicTimer class

From ~/egt/docs/html/annotated.html, click on the PeriodicTimer class. All the functions, attributes, and constructors associated with the class are documented here.

The PeriodicTimer will keep firing at the duration interval until it is stopped by calling cancel().

On_timeout

This function allows you to add a handler callback function to be called when the timer times out. This function may be called any number of times to add handlers.

CPUMonitorUsage

From ~/egt/docs/html/annotated.html, click on the CPUMonitorUsage class. All the functions, attributes, and constructors associated with the Dialog class are documented here.

This class allows users to monitor the CPU usage of the system.


To stop the program, press the Stop button (upper left hand, just below the menu bar).

​Before you start another session, be sure to stop the current session.

Back to Top

One-Shot Timer

In this section, you will modify and build the timer.cpp source code to construct a One-Shot Timer that will fire after three seconds.

Modify the timer.cpp source code by adding the following lines of code as shown:

#include <egt/ui>
#include
<iostream>
using namespace std;
using namespace egt;

int main(int argc, const char ** argv)
{
    Application app;
    TopWindow window;
    Button button(window, "Press Me");
    center(button);

   //One-shot timer
   Timer timer1(std::chrono::seconds(3));
    timer1.on_timeout([]()
    {
        cout << "One shot timer fired!" << endl;
    });
    timer1.start();

   //periodic timer
   Label CPUlabel("CPU:---", Rect(0, 0, 100, 50));
    window.add(bottom(CPUlabel));
    egt::experimental::CPUMonitorUsage tools;
    PeriodicTimer cputimer(std::chrono::seconds(1));
    cputimer.on_timeout([ & CPUlabel, & tools]() {
        cout << "periodic timer fired!" << endl;
        tools.update();
        ostringstream ss;
        ss << "CPU: " << static_cast < int > (tools.usage()) << "%";
        CPUlabel.text(ss.str());
    });
    cputimer.start();

    window.show();
   return app.run();
}

Save your program by selecting File > Save. You may also save by pressing CTRL + S.

To build the project, hover over EgtProject, right-click and select Build Project from the menu, or you can click on the Build icon.

The Console window (bottom pane) will display the build progress.


Click on the Run button.

Observe the WVGA Display on the target:

The timer.cpp executable is running remotely on the target.

Observe the target Console for the status “One shot timer fired” after a period of three seconds.

​# /root/timer; exitOne shot timer fired

Timer class

From ~/egt/docs/html/annotated.html, click on the Timer class. All the functions, attributes, and constructors associated with the class are documented here.

The Basic One-shot timer will fire once after the specified duration.

On_timeout

This function allows you to add a handler callback function to be called when the timer times out. This function may be called any number of times to add handlers.


To stop the program, press the Stop button (upper left hand, just below the menu bar).

​Before you start another session, be sure to stop the current session.

Back to Top

Summary

In this training, you learned how to construct a Periodic and One-Shot Timer. As a bonus, you also learned how to display the CPU usage on the WVGA Display.

Back to Top

What’s Next?

There’s plenty more to learn. Here are some additional Ensemble Graphics Toolkit training resources to help you gain more knowledge and skills:

Back to Top