int TapGet(tc, ti)
struct tapconnect tc;
struct tapinfo *ti;
TapGet(tc,ti)
TapGet()
detects, and provides detailed information about, taps. An option for
audio feedback is provided. The clock must be running. At least 5
msec should be allowed for
TapGet()
to initialize the hardware. If
TapGet()
detects an error, an explanatory message is placed in ti.error, and -1
is returned. Potential error messages include:
CLOCK_NOT_RUNNING UNRECOG_CLOCK_RATE CANNOT START SAMPLING TAP_TIMEOUT FIRST_EVENT_NOT_LO_THRESH_ON SECOND_EVENT_NOT_HI_THRESH_ON THIRD_EVENT_NOT_HI_THRESH_OFF FOURTH_EVENT_NOT_LO_THRESH_OFF
struct tapconnect tc provides necessary information about wiring, audio feedback, and thresholds. TapGet() treats this structure as read-only. struct tapconnect is declared in tapbox_u.h as:
struct tapconnect { int hand; /* TAPBOX_HAND_LEFT || _RIGHT */ unsigned maxwait; /* timeout when clock hits maxwait */ unsigned *sound; /* SoundPlay()-compatible object */ int da_hi_channel; /* D/A channel: set high thresh */ short da_hi_thresh; /* D/A value: high thresh */ int ad_peak_channel; /* A/D channel: read peak force */ unsigned obuf_reset; /* output bit: reset circuit */ unsigned ibuf_low; /* input bit: low thresh */ unsigned ibuf_high; /* input bit: high thresh */ };If no audible feedback is desired, set click to NULL. The click will begin playing when the high threshold is crossed.
struct tapinfo *ti holds the result of a tap detection. struct tapinfo is declared in tapbox_u.h as:
struct tapinfo { unsigned LowOn; /* time of low onset */ unsigned LowOff; /* time of low offset */ unsigned HighOn; /* time of high onset */ unsigned HighOff; /* time of high offset */ int peak; /* value of peak force */ char error[30]; /* error message (if any) */ };
#include <stdio_p.h> #include <tapbox_u.h> #include <mpict_p.h> #include <clock_u.h> #include <ibuf_u.h> #include <dmasound_u.h> #define BUTTONBIT 1 /* input bit #1 causes tap monitoring */ #define FOOTBIT 14 /* input bit #14 causes tap monitoring */ void TapDisplay(ti) struct tapinfo ti; { PICT l_tap[3], t_tap[3]; PICT l_error, t_error; char str[3][50]; int i, y; sprintf(str[0]," %5s %5s %5s", "ON", "OFF", "PEAK"); sprintf(str[1],"LOW: %5u %5u %5d", ti.LowOn, ti.LowOff, ti.peak); sprintf(str[2],"HIGH: %5u %5u", ti.HighOn, ti.HighOff); for (i=0; i<3; i++) { printf("%s\\n",str[i]); y = -512 - (i * 150); l_tap[i] = mktext(str[i],7); t_tap[i] = mktop(-2000, y, l_tap[i]); vad(t_tap[i]); } if (strcmp(ti.error,"")) { printf("%s\\n",ti.error); l_error = mktext(ti.error,7); t_error = mktop(-1000,0,l_error); vad(t_error); } while(ibufx(BUTTONBIT)==0 && ibufx(FOOTBIT)==0); ver(); for (i=0; i<3; i++) { frpic(t_tap[i]); frpic(l_tap[i]); } if (strcmp(ti.error,"")) { frpic(l_error); frpic(t_error); } } int main() { struct tapinfo ti; /* tap device setup */ struct tapconnect tc; /* tap results */ unsigned *click; /* audible feedback */ unsigned channel = DMA_SOUND_BOTH; /* binaural monophonic */ double freq = 3000.0; /* 3000 Hz */ double cycles = 15.0; /* = 5 msec */ double amp = 1536.0; /* high amplitude */ double ramp = 1.0; /* 1 msec ramp (on each end) */ printf("Grab a left tap and display info on console and Megatek.\\n"); printf("Press foot pedal to go on to the next tap\\n"); click = ToneSinCreate(channel, freq, cycles, amp, ramp); tc.hand = TAPBOX_HAND_LEFT; /* hand for tapping */ tc.maxwait = 20000; /* timeout when clock hits maxwait */ tc.sound = click; /* audio feedback */ tc.da_hi_channel = 4; /* D/A channel: set high thresh */ tc.da_hi_thresh = 128; /* D/A value: high thresh */ tc.ad_peak_channel = 3; /* A/D channel: read peak force */ tc.obuf_reset = 1; /* output bit: reset circuit */ tc.ibuf_low = 7; /* input bit: low thresh */ tc.ibuf_high = 9; /* input bit: high thresh */ for (;;) { ckreset(CKR_1MS); ckstart; TapGet(tc,&ti); ckstop; TapDisplay(ti); } }