Skittles Dispenser by Benjamin Kim and Alex Zdanov

Dependencies:   4DGL-uLCD-SE HC_SR04_Ultrasonic_Library LSM9DS1_Library_cal Servo mbed

main.cpp

Committer:
bkim334
Date:
2017-03-11
Revision:
0:2094aa9eeb53
Child:
1:1099d4500d8a

File content as of revision 0:2094aa9eeb53:

#include "mbed.h"
#include "LSM9DS1.h" //Accelerometer
#include "uLCD_4DGL.h" //LCD
#define MAX_BITS 100                 // max number of bits 
#define WEIGAND_WAIT_TIME  3000      // time to wait for another weigand pulse.  

int databits[MAX_BITS];    // stores all of the data bits
int bitCount;              // number of bits currently captured
int flagDone;              // goes low when data is currently being captured
int weigand_counter;        // countdown until we assume there are no more bits

unsigned long facilityCode=0;        // decoded facility code
unsigned long cardCode=0;            // decoded card code


DigitalOut LED_GREEN(p15);
DigitalIn dataIn(p10);
DigitalIn Clock(p5);


InterruptIn int0(p10);
InterruptIn int1(p5);

uLCD_4DGL uLCD(p28, p27, p29); // serial tx, serial rx, reset pin;
DigitalOut myled(LED1);

/*int LED_GREEN = 11;
int LED_RED = 12;
int BEEP_BEEP = 10;*/

// interrupt that happens when INTO goes low (0 bit)
void ISR_INT0()
{
    //uLCD.print("0");   // uncomment this line to display raw binary
    bitCount++;
    flagDone = 0;
    weigand_counter = WEIGAND_WAIT_TIME;

}

// interrupt that happens when INT1 goes low (1 bit)
void ISR_INT1()
{
    //uLCD.print("1");   // uncomment this line to display raw binary
    databits[bitCount] = 1;
    bitCount++;
    flagDone = 0;
    weigand_counter = WEIGAND_WAIT_TIME;
}

void setup()
{
    LED_GREEN = 1;
    myled = 1;
    uLCD.printf("RFID Reader Setup");
    int0.fall(&ISR_INT0);
    int1.fall(&ISR_INT1);
    /*pinMode(LED_RED, OUTPUT);
    pinMode(LED_GREEN, OUTPUT);
    pinMode(BEEP_BEEP, OUTPUT);
    digitalWrite(LED_RED, HIGH); // High = Off
    digitalWrite(BEEP_BEEP, HIGH); // High = off
    digitalWrite(LED_GREEN, LOW);  // Low = On
    pinMode(2, INPUT);     // DATA0 (INT0)
    pinMode(3, INPUT);     // DATA1 (INT1)

    uLCD.begin(9600);
    uLCD.println("RFID Readers");

    // binds the ISR functions to the falling edge of INTO and INT1
    attachInterrupt(0, ISR_INT0, FALLING);
    attachInterrupt(1, ISR_INT1, FALLING);
    */

    weigand_counter = WEIGAND_WAIT_TIME;
}

void printBits()
{
    uLCD.printf("FC = ");
    uLCD.printf("%lu", facilityCode);
    uLCD.printf(", CC = ");
    uLCD.printf("%lu", cardCode);
}

void loop()
{
    // This waits to make sure that there have been no more data pulses before processing data
    if (!flagDone) {
        if (--weigand_counter == 0)
            flagDone = 1;
    }

    // if we have bits and we the weigand counter went out
    if (bitCount > 0 && flagDone) {
        int i;

        uLCD.printf("Read ");
        uLCD.printf("%d", bitCount);
        uLCD.printf(" bits. ");

        if (bitCount == 35) {
            // 35 bit HID Corporate 1000 format
            // facility code = bits 2 to 14
            for (i=2; i<14; i++) {
                facilityCode <<=1;
                facilityCode |= databits[i];
            }

            // card code = bits 15 to 34
            for (i=14; i<34; i++) {
                cardCode <<=1;
                cardCode |= databits[i];
            }

            printBits();
        } else if (bitCount == 26) {
            // standard 26 bit format
            // facility code = bits 2 to 9
            for (i=1; i<9; i++) {
                facilityCode <<=1;
                facilityCode |= databits[i];
            }

            // card code = bits 10 to 23
            for (i=9; i<25; i++) {
                cardCode <<=1;
                cardCode |= databits[i];
            }

            printBits();
        } else {
            // you can add other formats if you want!
            // uLCD.println("Unable to decode.");
        }

        // cleanup and get ready for the next card
        bitCount = 0;
        facilityCode = 0;
        cardCode = 0;
        for (i=0; i<MAX_BITS; i++) {
            databits[i] = 0;
        }
    }
}



Serial pc(USBTX, USBRX);

AnalogIn in(p20); //Proximity
float voltage;

int IDNum;


int main()
{
    uLCD.cls();

    /*LSM9DS1 IMU(p9, p10, 0xD6, 0x3C);
    IMU.begin();
    if (!IMU.begin()) {
        pc.printf("Failed to communicate with LSM9DS1.\n");
    }*/
    
    setup();
    uLCD.printf("After Setup \n");
    
    while(1) {
        
        loop();
        
    }
}