Bela
Real-time, ultra-low-latency audio and sensor processing system for BeagleBone Black
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
Trill/flex-default/render.cpp

Trill Flex Default Example

This is an example of how to communicate with the Trill Flex sensor using the Trill library. We will visualise the position of each touch in real time via the integrated Bela p5.js GUI.

This example is designed to work with the default flexible sensor which comes with Trill Flex. Connect the sensor to the base and then connect the base to the I2C pins on Bela.

The Trill sensor is scanned in an AuxiliaryTask running in parallel with the audio thread and the number of active touches, their position and size are stored in global variables.

Click the GUI button to see a visualisation of the sensor. Up to 5 touches position with touch size are displayed in the sketch.

/*
____ _____ _ _
| __ )| ____| | / \
| _ \| _| | | / _ \
| |_) | |___| |___ / ___ \
|____/|_____|_____/_/ \_\
http://bela.io
*/
#include <Bela.h>
#include <cmath>
#include <libraries/Trill/Trill.h>
#include <libraries/Gui/Gui.h>
#define NUM_TOUCH 5 // Number of touches on Trill sensor
// Gui object declaration
Gui gui;
// Trill object declaration
Trill touchSensor;
// Location of touches on Trill
float gTouchLocation[NUM_TOUCH] = { 0.0, 0.0, 0.0, 0.0, 0.0 };
// Size of touches on Trill
float gTouchSize[NUM_TOUCH] = { 0.0, 0.0, 0.0, 0.0, 0.0 };
// Number of active touches
int gNumActiveTouches = 0;
// Sleep time for auxiliary task
unsigned int gTaskSleepTime = 12000; // microseconds
// Time period (in seconds) after which data will be sent to the GUI
float gTimePeriod = 0.015;
/*
* Function to be run on an auxiliary task that reads data from the Trill sensor.
* Here, a loop is defined so that the task runs recurrently for as long as the
* audio thread is running.
*/
void loop(void*)
{
{
// Read locations from Trill sensor
touchSensor.readI2C();
gNumActiveTouches = touchSensor.getNumTouches();
for(unsigned int i = 0; i < gNumActiveTouches; i++) {
gTouchLocation[i] = touchSensor.touchLocation(i);
gTouchSize[i] = touchSensor.touchSize(i);
}
// For all inactive touches, set location and size to 0
for(unsigned int i = gNumActiveTouches; i < NUM_TOUCH; i++) {
gTouchLocation[i] = 0.0;
gTouchSize[i] = 0.0;
}
usleep(gTaskSleepTime);
}
}
bool setup(BelaContext *context, void *userData)
{
// Setup a Trill Flex sensor on i2c bus 1, using the default mode and address
if(touchSensor.setup(1, Trill::FLEX) != 0) {
fprintf(stderr, "Unable to initialise Trill Flex\n");
// return false;
}
touchSensor.printDetails();
// Set and schedule auxiliary task for reading sensor data from the I2C bus
// Setup GUI
gui.setup(context->projectName);
return true;
}
void render(BelaContext *context, void *userData)
{
static unsigned int count = 0;
for(unsigned int n = 0; n < context->audioFrames; n++) {
// Send number of touches, touch location and size to the GUI
// after some time has elapsed.
if(count >= gTimePeriod * context->audioSampleRate)
{
gui.sendBuffer(0, gNumActiveTouches);
gui.sendBuffer(1, gTouchLocation);
gui.sendBuffer(2, gTouchSize);
count = 0;
}
count++;
}
}
void cleanup(BelaContext *context, void *userData)
{}