Skip to content

Commit

Permalink
Clean up for macos trackpad driver and sensel morph driver.
Browse files Browse the repository at this point in the history
  • Loading branch information
malloch committed Aug 23, 2022
1 parent 62260ce commit 148b829
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 33 deletions.
47 changes: 41 additions & 6 deletions input/macbook_trackpad/macbook_trackpad_mapper.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Adaptation of MacBook Multitouch code by Erling Ellingsen: *
/* Adaptation of MacBook Multitouch code by Erling Ellingsen: *
* http://www.steike.com/code/multitouch/ */

#include <math.h>
Expand Down Expand Up @@ -32,6 +32,7 @@ MTDeviceRef MTDeviceCreateDefault();
void MTRegisterContactFrameCallback(MTDeviceRef, MTContactCallbackFunction);
void MTDeviceStart(MTDeviceRef, int); // thanks comex

const char* default_name = "touchpad";
mpr_dev mdev = 0;
mpr_sig countSig = 0;
mpr_sig angleSig = 0;
Expand Down Expand Up @@ -88,6 +89,14 @@ int callback(int device, Finger *data, int nFingers, double timestamp, int frame
mpr_sig_set_value(velocitySig, f->identifier, 2, MPR_FLT, pair);

mpr_sig_set_value(areaSig, f->identifier, 1, MPR_FLT, &f->size);

if (f->size > 1) {
// calculate pan/rotate/zoom

// pan = avg velocity scaled by current zoom level

// zoom = average expansion/contraction around mutual centre
}
}
else {
mpr_sig_release_inst(angleSig, f->identifier);
Expand Down Expand Up @@ -132,14 +141,40 @@ void ctrlc(int sig)
done = 1;
}

int main(int argc, char **argv) {

if (argc > 1 && 0 == strcmp(argv[1], "-q"))
verbose = 0;
int main(int argc, char **argv)
{
int i, j;
const char* dev_name = default_name;
for (i = 1; i < argc; i++) {
if (argv[i] && argv[i][0] == '-') {
int len = strlen(argv[i]);
for (j = 1; j < len; j++) {
switch (argv[i][j]) {
case 'h':
printf("macbook_trackpad_mapper.c: possible arguments "
"-q quiet (suppress output), "
"-h help, "
"--alias <string> (default: '%s')\n", default_name);
return 1;
break;
case 'q':
verbose = 0;
break;
case '-':
if (++j < len && strcmp(argv[i]+j, "alias")==0)
if (++i < argc)
dev_name = argv[i];
break;
default:
break;
}
}
}
}

signal(SIGINT, ctrlc);

mdev = mpr_dev_new("touchpad", 0);
mdev = mpr_dev_new(dev_name, 0);
add_signals();
while (!mpr_dev_get_is_ready(mdev)) {
mpr_dev_poll(mdev, 0);
Expand Down
99 changes: 72 additions & 27 deletions input/sensel_morph/src/mpr.morph.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
#include "sensel_device.h"
#include "mapper/mapper.h"

const char *default_name = "morph";
SENSEL_HANDLE handle = NULL;
SenselDeviceList list;
SenselSensorInfo sensor_info;
SenselFrameData *frame = NULL;
unsigned int last_n_contacts = 0;
int verbose = 1;
int done = 0;

mpr_dev dev;
Expand All @@ -25,6 +27,16 @@ mpr_sig axes;
mpr_sig velocity;
mpr_time time;

static void eprintf(const char *format, ...)
{
va_list args;
if (!verbose)
return;
va_start(args, format);
vprintf(format, args);
va_end(args);
}

void loop()
{
unsigned int n_frames = 0;
Expand All @@ -39,7 +51,7 @@ void loop()
if (!frame->n_contacts && !last_n_contacts)
continue;
else if (frame->n_contacts != last_n_contacts)
printf("num_contacts: %d\n", frame->n_contacts);
eprintf("num_contacts: %d\n", frame->n_contacts);

mpr_sig_set_value(num_contacts, 0, 1, MPR_INT32, &frame->n_contacts);
mpr_sig_set_value(acceleration, 0, 3, MPR_INT32, &frame->accel_data);
Expand All @@ -60,7 +72,7 @@ void loop()
mpr_sig_set_value(area, id, 1, MPR_FLT, &sc.area);
break;
default:
printf("releasing instance %d\n", id);
eprintf("releasing instance %d\n", id);
mpr_sig_release_inst(position, id);
mpr_sig_release_inst(velocity, id);
mpr_sig_release_inst(orientation, id);
Expand All @@ -84,39 +96,44 @@ void ctrlc(int sig)

int main(int argc, char **argv)
{
int i, j, connected = 0;
const char *dev_name = default_name;
signal(SIGINT, ctrlc);

// connect to Sensel Morph
printf("Looking for Sensel Morph device...\n");
while (!done) {
senselGetDeviceList(&list);
if (list.num_devices) {
break;
for (i = 1; i < argc; i++) {
if (argv[i] && argv[i][0] == '-') {
int len = strlen(argv[i]);
for (j = 1; j < len; j++) {
switch (argv[i][j]) {
case 'h':
printf("mpr.morph.c: possible arguments "
"-q quiet (suppress output), "
"-h help, "
"--alias <string> (default: '%s')\n", default_name);
return 1;
break;
case 'q':
verbose = 0;
break;
case '-':
if (++j < len && strcmp(argv[i]+j, "alias")==0)
if (++i < argc)
dev_name = argv[i];
break;
default:
break;
}
}
}
sleep(1);
}

// create libmapper device
printf("Joining mapping graph... ");
dev = mpr_dev_new("morph", NULL);
eprintf("Joining mapping graph... ");
dev = mpr_dev_new(dev_name, NULL);
while (!done && !mpr_dev_get_is_ready(dev)) {
mpr_dev_poll(dev, 100);
}
printf(" registered!\n");

// open connection to Sensel Morph
senselOpenDeviceByID(&handle, list.devices[0].idx);
// setup for contact and accelerometer data
senselSetFrameContent(handle, FRAME_CONTENT_CONTACTS_MASK | FRAME_CONTENT_ACCEL_MASK);
// pre-allocate a frame of data
senselAllocateFrameData(handle, &frame);
// start scanning
senselStartScanning(handle);

// force the serial connection to remain open
// https://forum.sensel.com/t/pausing-e-g-in-a-debugger-causes-all-subsequent-apis-to-fail/219/15
unsigned char val[1] = { 255 };
senselWriteReg(handle, 0xD0, 1, val);
eprintf(" registered!\n");

// add signals
int mini[2] = {0, 0}, maxi[2] = {16, 16};
Expand All @@ -134,7 +151,7 @@ int main(int argc, char **argv)
maxf[0] = 33360;
area = mpr_sig_new(dev, MPR_DIR_OUT, "instrument/contact/area", 1, MPR_FLT,
"mm^2", minf, maxf, &num_inst, NULL, 0);
maxf[0] = 8192;
maxf[0] = 400;
force = mpr_sig_new(dev, MPR_DIR_OUT, "instrument/contact/force", 1,
MPR_FLT, NULL, minf, maxf, &num_inst, NULL, 0);
maxf[0] = 360;
Expand All @@ -147,13 +164,41 @@ int main(int argc, char **argv)
velocity = mpr_sig_new(dev, MPR_DIR_OUT, "instrument/contact/velocity", 2,
MPR_FLT, "mm/sec", NULL, NULL, &num_inst, NULL, 0);

// connect to Sensel Morph
eprintf("Looking for Sensel Morph device...\n");
while (!done) {
senselGetDeviceList(&list);
if (list.num_devices) {
connected = 1;
break;
}
mpr_dev_poll(dev, 100);
}
if (!connected)
goto done;

// open connection to Sensel Morph
senselOpenDeviceByID(&handle, list.devices[0].idx);
// setup for contact and accelerometer data
senselSetFrameContent(handle, FRAME_CONTENT_CONTACTS_MASK | FRAME_CONTENT_ACCEL_MASK);
// pre-allocate a frame of data
senselAllocateFrameData(handle, &frame);
// start scanning
senselStartScanning(handle);

// force the serial connection to remain open
// https://forum.sensel.com/t/pausing-e-g-in-a-debugger-causes-all-subsequent-apis-to-fail/219/15
unsigned char val[1] = { 255 };
senselWriteReg(handle, 0xD0, 1, val);

loop();

// allow serial connection to close
val[0] = 0;
senselWriteReg(handle, 0xD0, 1, val);
senselClose(handle);

done:
// unregister from mapping graph
mpr_dev_free(dev);
return 0;
Expand Down

0 comments on commit 148b829

Please sign in to comment.