From 148b829852278e6eaed6357f6d69b2690ad8262f Mon Sep 17 00:00:00 2001 From: Joseph Malloch Date: Tue, 23 Aug 2022 15:25:30 -0300 Subject: [PATCH] Clean up for macos trackpad driver and sensel morph driver. --- .../macbook_trackpad_mapper.c | 47 +++++++-- input/sensel_morph/src/mpr.morph.c | 99 ++++++++++++++----- 2 files changed, 113 insertions(+), 33 deletions(-) diff --git a/input/macbook_trackpad/macbook_trackpad_mapper.c b/input/macbook_trackpad/macbook_trackpad_mapper.c index cbaa0cb..5286257 100644 --- a/input/macbook_trackpad/macbook_trackpad_mapper.c +++ b/input/macbook_trackpad/macbook_trackpad_mapper.c @@ -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 @@ -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; @@ -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); @@ -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 (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); diff --git a/input/sensel_morph/src/mpr.morph.c b/input/sensel_morph/src/mpr.morph.c index 70623ea..61504e0 100644 --- a/input/sensel_morph/src/mpr.morph.c +++ b/input/sensel_morph/src/mpr.morph.c @@ -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; @@ -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; @@ -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); @@ -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); @@ -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 (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}; @@ -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; @@ -147,6 +164,33 @@ 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 @@ -154,6 +198,7 @@ int main(int argc, char **argv) senselWriteReg(handle, 0xD0, 1, val); senselClose(handle); +done: // unregister from mapping graph mpr_dev_free(dev); return 0;