/*
 * File Name: BUFFER.h 
*/
            /***********************************************************************************************************************************
                                                       --------Truth Table for Quad 74126 BUFFER Chip----------
            /***********************************************************************************************************************************/     
                                                /*    En      Input | Output #1 Output #2 Output #3 Output #4
                                                      1         1   |    1         1         1         1      Test 1  
                                                      1         0   |    0         0         0         0      Test 2
                                                      0         1   |    Z         Z         Z         Z      Test 3
                                                      0         0   |    Z         Z         Z         Z      Test 4
                                                 */
boolean BUFFER()
{
                                                                     /*      ------------      */  
                                                int buf_A1=FP;       /*  1A  |   \_/    | VCC  */  int bufVcc=FP+1;
                                                int buf_B1=FP+2;     /*  1B  |          | 4B   */  int buf_A4=FP+3;    
                                                int buf_R1=FP+4;     /*  1Y  |          | 4A   */  int buf_B4=FP+5;
                                                int buf_A2=FP+6;     /*  2A  |          | 4Y   */  int buf_R4=FP+7; 
                                                int buf_B2=FP+8;     /*  2B  |          | 3B   */  int buf_A3=FP+9;
                                                int buf_R2=FP+10;    /*  2Y  |          | 3A   */  int buf_B3=FP+11; 
                                                int bufGND=FP+12;    /*  GND |          | 3Y   */  int buf_R3=FP+13; 
                                                                     /*      ------------      */ 
                                                                             int buf_G1;
                                                                             int buf_G2;
                                                                             int buf_G3;
                                                                             int buf_G4;
                                                                         boolean test1 = false;
                                                                         boolean test2 = false;
                                                                         boolean test3 = false;
                                                                         boolean test4 = false;
          
                                                          pinMode(buf_A1, OUTPUT);  pinMode(bufVcc, OUTPUT);
                                                          pinMode(buf_B1, OUTPUT);  pinMode(buf_B4, OUTPUT);
                                                          pinMode(buf_R1, INPUT);   pinMode(buf_A4, OUTPUT);
                                                          pinMode(buf_A2, OUTPUT);  pinMode(buf_R4, INPUT);
                                                          pinMode(buf_B2, OUTPUT);  pinMode(buf_B3, OUTPUT);
                                                          pinMode(buf_R2, INPUT);   pinMode(buf_A3, OUTPUT);
                                                          pinMode(bufGND, OUTPUT);  pinMode(buf_R3, INPUT);

/**********************************************************************************
            ------------------------TEST 1------------------------
 **********************************************************************************/
        delay(readDelay);

        Serial.println("Testing with inputs 1 1");
        digitalWrite(bufGND, LOW); digitalWrite(bufVcc, HIGH);
        delay(readDelay);

        digitalWrite(buf_A1, HIGH); digitalWrite(buf_B1, HIGH);
        digitalWrite(buf_A2, HIGH); digitalWrite(buf_B2, HIGH);
        digitalWrite(buf_A3, HIGH); digitalWrite(buf_B3, HIGH);
        digitalWrite(buf_A4, HIGH); digitalWrite(buf_B4, HIGH);
        delay(readDelay);
        
        buf_G1 = digitalRead(buf_R1); Serial.print("Gate 1: "); Serial.print(buf_G1);
        buf_G2 = digitalRead(buf_R2); Serial.print("\nGate 2: "); Serial.print(buf_G2);
        buf_G3 = digitalRead(buf_R3); Serial.print("\nGate 3: "); Serial.print(buf_G3);
        buf_G4 = digitalRead(buf_R4); Serial.print("\nGate 4: "); Serial.print(buf_G4);
        
        if(buf_G1 == 1 && 
           buf_G2 == 1 && 
           buf_G3 == 1 && 
           buf_G4 == 1)
        {
            test1 = true;
        } 
        Serial.print("\nResult: ");
        Serial.println(test1);
              
/**********************************************************************************
            ------------------------TEST 2------------------------
 **********************************************************************************/
        Serial.println("Testing with inputs 1 0");
        digitalWrite(bufGND, LOW); digitalWrite(bufVcc, HIGH);
        delay(readDelay);

        digitalWrite(buf_A1, HIGH); digitalWrite(buf_B1, LOW);
        digitalWrite(buf_A2, HIGH); digitalWrite(buf_B2, LOW);
        digitalWrite(buf_A3, HIGH); digitalWrite(buf_B3, LOW);
        digitalWrite(buf_A4, HIGH); digitalWrite(buf_B4, LOW);
        delay(readDelay);
        
        buf_G1 = digitalRead(buf_R1); Serial.print("Gate 1: "); Serial.print(buf_G1);
        buf_G2 = digitalRead(buf_R2); Serial.print("\nGate 2: "); Serial.print(buf_G2);
        buf_G3 = digitalRead(buf_R3); Serial.print("\nGate 3: "); Serial.print(buf_G3);
        buf_G4 = digitalRead(buf_R4); Serial.print("\nGate 4: "); Serial.print(buf_G4);
        
        if(buf_G1 == 0 && 
           buf_G2 == 0 && 
           buf_G3 == 0 && 
           buf_G4 == 0)
        {
            test2 = true;
        } 
        Serial.print("\nResult: ");
        Serial.println(test2);

/**********************************************************************************
            ------------------------TEST 3------------------------
 **********************************************************************************/
        Serial.println("Testing with inputs 0 1");
        digitalWrite(bufGND, LOW); digitalWrite(bufVcc, HIGH);
        delay(readDelay);
     
        digitalWrite(buf_A1, LOW); digitalWrite(buf_B1, HIGH);
        digitalWrite(buf_A2, LOW); digitalWrite(buf_B2, HIGH);
        digitalWrite(buf_A3, LOW); digitalWrite(buf_B3, HIGH);
        digitalWrite(buf_A4, LOW); digitalWrite(buf_B4, HIGH);
        delay(readDelay);

         // Put 0 onto floating output nodes. Otherwise stray voltage can be read as high.
        pinMode(buf_R1, OUTPUT); pinMode(buf_R2, OUTPUT);
        pinMode(buf_R3, OUTPUT); pinMode(buf_R4, OUTPUT);
        digitalWrite(buf_R1, LOW); digitalWrite(buf_R2, LOW);
        digitalWrite(buf_R3, LOW); digitalWrite(buf_R4, LOW);
        delay(readDelay);
        // Reset buffer outputs to inputs to read voltages.  
        pinMode(buf_R1, INPUT); pinMode(buf_R2, INPUT);
        pinMode(buf_R3, INPUT); pinMode(buf_R4, INPUT);

        buf_G1 = digitalRead(buf_R1); Serial.print("Gate 1: "); Serial.print(buf_G1);
        buf_G2 = digitalRead(buf_R2); Serial.print("\nGate 2: "); Serial.print(buf_G2);
        buf_G3 = digitalRead(buf_R3); Serial.print("\nGate 3: "); Serial.print(buf_G3);
        buf_G4 = digitalRead(buf_R4); Serial.print("\nGate 4: "); Serial.print(buf_G4);
        
        if(buf_G1 == 0 && 
           buf_G2 == 0 && 
           buf_G3 == 0 && 
           buf_G4 == 0)
        {
            test3 = true;
        } 
        Serial.print("\nResult: ");
        Serial.println(test3);

/**********************************************************************************
            ------------------------TEST 4------------------------
 **********************************************************************************/
        Serial.println("Testing with inputs 0 0");
        digitalWrite(bufGND, LOW); digitalWrite(bufVcc, HIGH);
        delay(readDelay);

        digitalWrite(buf_A1, LOW); digitalWrite(buf_B1, LOW);
        digitalWrite(buf_A2, LOW); digitalWrite(buf_B2, LOW);
        digitalWrite(buf_A3, LOW); digitalWrite(buf_B3, LOW);
        digitalWrite(buf_A4, LOW); digitalWrite(buf_B4, LOW);
        delay(readDelay);
 
         // Put 0 onto floating output nodes. Otherwise stray voltage can be read as high.
        pinMode(buf_R1, OUTPUT); pinMode(buf_R2, OUTPUT);
        pinMode(buf_R3, OUTPUT); pinMode(buf_R4, OUTPUT);
        digitalWrite(buf_R1, LOW); digitalWrite(buf_R2, LOW);
        digitalWrite(buf_R3, LOW); digitalWrite(buf_R4, LOW);
        delay(readDelay);
        // Reset buffer outputs to inputs to read voltages.  
        pinMode(buf_R1, INPUT); pinMode(buf_R2, INPUT);
        pinMode(buf_R3, INPUT); pinMode(buf_R4, INPUT);
       
        buf_G1 = digitalRead(buf_R1); Serial.print("Gate 1: "); Serial.print(buf_G1);
        buf_G2 = digitalRead(buf_R2); Serial.print("\nGate 2: "); Serial.print(buf_G2);
        buf_G3 = digitalRead(buf_R3); Serial.print("\nGate 3: "); Serial.print(buf_G3);
        buf_G4 = digitalRead(buf_R4); Serial.print("\nGate 4: "); Serial.print(buf_G4);
        
        if(buf_G1 == 0 && 
           buf_G2 == 0 && 
           buf_G3 == 0 && 
           buf_G4 == 0)
        {
            test4 = true;
        } 
        Serial.print("\nResult: "); 
        Serial.println(test4);

/**********************************************************************************
            ------------------------BUFFER RESULTS------------------------
 **********************************************************************************/
        if(test1 == true && 
           test2 == true && 
           test3 == true && 
           test4 == true)
        {
          test1 = test2 = test3 = test4 = false;
          return 1;
        }
        else
        {
          test1 = test2 = test3 = test4 = false;
          return 0;
        }
}
