Compiling Programs

Introduction

Programs created with MATRIX HAL allow you to directly access sensors and components on the MATRIX device through C++. This guide will show you how to create and run an LED demo in MATRIX HAL. The final result being a rainbow LED sequence.

Creating A Program

Making Your Project Directory

Use the following commands to create a folder to hold your MATRIX HAL projects, in the home directory ~/ of your MATRIX device.

cd ~/
mkdir matrix-hal-project
cd matrix-hal-project
Copy to clipboard

Create a file called app.cpp in your project folder, and paste the code below.

The following code turns the Everloop rainbow for 10 seconds.

/*
 * Everloop rainbow example
 */

/////////////////////////
// INCLUDE STATEMENTS //
///////////////////////

// System calls
#include <unistd.h>
// Input/output streams and functions
#include <iostream>
// Included for sin() function.
#include <cmath>

// Interfaces with Everloop
#include "matrix_hal/everloop.h"
// Holds data for Everloop
#include "matrix_hal/everloop_image.h"
// Communicates with MATRIX device
#include "matrix_hal/matrixio_bus.h"

int main() {
  ////////////////////
  // INITIAL SETUP //
  //////////////////

  // Create MatrixIOBus object for hardware communication
  matrix_hal::MatrixIOBus bus;
  // Initialize bus and exit program if error occurs
  if (!bus.Init()) return false;

  /////////////////
  // MAIN SETUP //
  ///////////////

  // Holds the number of LEDs on MATRIX device
  int ledCount = bus.MatrixLeds();
  // Create EverloopImage object, with size of ledCount
  matrix_hal::EverloopImage everloop_image(ledCount);
  // Create Everloop object
  matrix_hal::Everloop everloop;
  // Set everloop to use MatrixIOBus bus
  everloop.Setup(&bus);

  // Variables used for sine wave rainbow logic
  float counter = 0;
  const float freq = 0.375;

  // 10 sec loop for rainbow effect 250*40000 microsec = 10 sec
  for (int i = 0; i <= 250; i++) {
    // For each led in everloop_image.leds, set led value
    for (matrix_hal::LedValue &led : everloop_image.leds) {
      // Sine waves 120 degrees out of phase for rainbow
      led.red =
          (std::sin(freq * counter + (M_PI / 180 * 240)) * 155 + 100) / 10;
      led.green =
          (std::sin(freq * counter + (M_PI / 180 * 120)) * 155 + 100) / 10;
      led.blue = (std::sin(freq * counter + 0) * 155 + 100) / 10;
      // If MATRIX Creator, increment by 0.51
      if (ledCount == 35) {
        counter = counter + 0.51;
      }
      // If MATRIX Voice, increment by 1.01
      if (ledCount == 18) {
        counter = counter + 1.01;
      }
    }

    // Updates the LEDs
    everloop.Write(&everloop_image);

    // If i is 0 (first run)
    if (i == 0) {
      // Output everloop status to console
      std::cout << "Everloop set to rainbow for 10 seconds." << std::endl;
    }
    // If i is cleanly divisible by 25
    if ((i % 25) == 0) {
      std::cout << "Time remaining (s) : " << 10 - (i / 25) << std::endl;
    }

    // Sleep for 40000 microseconds
    usleep(40000);
  }

  // Updates the Everloop on the MATRIX device
  everloop.Write(&everloop_image);

  // For each led in everloop_image.leds, set led value to 0
  for (matrix_hal::LedValue &led : everloop_image.leds) {
    // Turn off Everloop
    led.red = 0;
    led.green = 0;
    led.blue = 0;
    led.white = 0;
  }

  // Updates the Everloop on the MATRIX device
  everloop.Write(&everloop_image);

  return 0;
}
Copy to clipboard

Compiling your Program

The command below will use g++ to link the libmatrix_creator_hal.so library file when compiling your program.

g++ -o app app.cpp -std=c++11 -lmatrix_creator_hal
Copy to clipboard

Running your Program

Run the following command to start the demo program.

cd ~/matrix-hal-project
./app
Copy to clipboard

Result

Next Steps

Now that everything is properly installed, view our function references to see what you can do with MATRIX HAL, or view the code examples.