#include <bluesense.h>
#include <stdlib.h>
#include <stdio.h>
bsSwitchInputDevice_rotaryEnum parsePort(char* s) {
char side = s[0];
uint8_t output = atoi(&s[1]);
switch (side) {
case 'A': {
switch (output) {
case 1: return bsSwitchInput_rA_1_2;
case 2: return bsSwitchInput_rA_1_2;
case 3: return bsSwitchInput_rA_3_4;
case 4: return bsSwitchInput_rA_3_4;
case 5: return bsSwitchInput_rA_5_6;
case 6: return bsSwitchInput_rA_5_6;
}
}
case 'B': {
switch (output) {
case 1: return bsSwitchInput_rB_1_2;
case 2: return bsSwitchInput_rB_1_2;
case 3: return bsSwitchInput_rB_3_4;
case 4: return bsSwitchInput_rB_3_4;
case 5: return bsSwitchInput_rB_5_6;
case 6: return bsSwitchInput_rB_5_6;
}
}
}
return bsSwitchInput_rA_1_2;
}
int main(int argc, char **argv) {
char *progname = *argv++; argc--;
if(argc < 2) {
fprintf(stderr, "\n");
fprintf(stderr, "Please re-run this example with an identifier and input\n");
fprintf(stderr, " as argument to specifiy which rotary to read.\n");
fprintf(stderr, "\n");
fprintf(stderr, "Usage: %s <identifier> <group>\n", progname);
fprintf(stderr, " eg.: %s 10 A1 will use a rotary on pins 1,2 on device 10\n", progname);
fprintf(stderr, " eg.: %s 10 A3 will use a rotary on pins 3,4 on device 10\n", progname);
fprintf(stderr, "\n");
fprintf(stderr, "To find out what devices are connected try the 'list_devices' example.\n");
fprintf(stderr, "\n");
return(1);
}
identifier_t id = atoi(argv[0]);
bsSwitchInputDevice_rotaryEnum rport = parsePort(argv[1]);
bsDeviceInterface_registeredDeviceInterfaces_t registered = bsDeviceInterface_allocInterfaceTable();
bsDeviceTable_table_t devices = bsDeviceTable_allocDeviceTable();
bsMaster_device_t master = bsMaster_allocMaster(registered,devices,0);
printf("Detecting device %d...\n", id);
fflush(stdout);
bsDeviceTable_deviceInfo_t dev = bsMaster_detectDevice(master, id, 5 * 1000 * 1000);
if(!dev) {
fprintf(stderr, "Device %d not found!\n", id);
bsMaster_freeMaster(master);
bsDeviceTable_freeDeviceTable(devices);
bsDeviceInterface_freeInterfaceTable(registered);
return(0);
}
bsSwitchInputDevice_specifics_t specDev = bsSwitchInputDevice_getDeviceSpecifics(dev);
bsSwitchInputDevice_requestNeedsRotary(specDev, rport, 1);
printf("Rotate beyond -100 or 100 to quit...\n");
fflush(stdout);
int32_t last;
uint32_t asyncYieldparam = 0;
for(last = 0; -100 < last && last < 100;) {
int32_t v = bsSwitchInputDevice_getLastSampledRotary(specDev, rport);
if(v != last) {
printf("Rotary [%s at %u] = %d\n", argv[1], id, v);
fflush(stdout);
last = v;
}
asyncYieldparam = bsMaster_aSyncYield(master,2000,asyncYieldparam);
}
bsSwitchInputDevice_requestNeedsRotary(specDev, rport, 0);
bsMaster_autoYield(master,100*1000,2000,asyncYieldparam);
bsMaster_freeMaster(master);
bsDeviceTable_freeDeviceTable(devices);
bsDeviceInterface_freeInterfaceTable(registered);
return(0);
}