Code Download
The code and documentation is available on GitHub by clicking the green button below. Select Download Zip to get the code and documentation.
Code Review
The first part is the data reading loop, which grabs the first ~80 non-zero bytes. We have to toss out the zeros as they are just buffers on the edge of the magstripe. There should be at least 4 but we don't use them so they get ignored in the loop.
// for lots more info, see // http://stripesnoop.sourceforge.net/devel/magtek-app.pdf void loop() { // wait till the card ready pin is low while (digitalRead(CARD2)); uint8_t zeros = 0; uint8_t parityok = 0; // card was swiped! // check clocked in data for (uint8_t t1 = 0; t1 < TRACK1_LEN; t1++) { track1[t1] = 0; for (uint8_t b=0; b < BYTELENGTH; b++) { // wait while clock is high while (digitalRead(CLOCK2) && !digitalRead(CARD2)); // we sample on the falling edge! uint8_t x = digitalRead(DATA2); if (!x) { // data is LSB and inverted! track1[t1] |= _BV(b); } // heep hanging out while its low while (!digitalRead(CLOCK2) && !digitalRead(CARD2)); } if ((t1 == 0) && (track1[t1] == 0)) { // get rid of leading 0's zeros++; t1--; continue; } // we must have some leading zeros! if (zeros < 4) { t1--; continue; } // if the second byte is a zero, theres noise, backtrack if ((t1 == 1) && (track1[t1] == 0)) { t1 = -1; zeros = 1; continue; } } // all the data is read into the track1 buffer // shift left until we have no more starting zero bits! while ((track1[0] & 0x1) == 0 ) { shifttrack(track1, scratch, LEFT); }
And here is the part after the parsing where we use the Teensy's built in Keyboard emulation to plug the data right into the virtual terminal. Note how it takes the raw data from the track and uses Keyboard.print() to output it as well as tab through the browser entries.
// FIND PAN uint8_t i=2; while ((track1[i] & 0x3F) != 0x3E) { #ifdef SERIAL Serial.print((track1[i] & 0x3F)+0x20, BYTE); #endif #ifdef KEYBOARD Keyboard.print((track1[i] & 0x3F)+0x20, BYTE); #endif i++; }
#ifdef KEYBOARD Keyboard.print('\t'); Keyboard.print(m1, BYTE); Keyboard.print(m2, BYTE); Keyboard.print(y1, BYTE); Keyboard.print(y2, BYTE); Keyboard.print('\t'); // tab to amount Keyboard.print('\t'); // tab to invoice Keyboard.print('\t'); // tab to description Keyboard.print("HOPE conference kits from Adafruit.com"); Keyboard.print('\t'); // tab to customer ID Keyboard.print('\t'); // tab to first name Keyboard.print(fname); Keyboard.print('\t'); // tab to last name Keyboard.print(lname); for (uint8_t i=0; i<5; i++) { Keyboard.set_modifier(MODIFIERKEY_SHIFT); Keyboard.set_key1(KEY_TAB); Keyboard.send_now(); Keyboard.set_modifier(0); Keyboard.set_key1(0); Keyboard.send_now(); } #endif beep(PIEZO, 4000, 200);
Page last edited March 08, 2024
Text editor powered by tinymce.