Group 3, Year 3 HWU

Dependencies:   MCP23017 WattBob_TextLCD mbed

main.cpp

Committer:
campbell101
Date:
2013-12-04
Revision:
0:717026d23b8e

File content as of revision 0:717026d23b8e:

#include "mbed.h"
#include "MCP23017.h"
#include <string>
using namespace std;

DigitalOut FPGA1(p8);
DigitalOut FPGA2(p9);
DigitalOut FPGA3(p10);
DigitalOut FPGA4(p11);

DigitalIn sorter_Tube(p5);
DigitalIn AAA_tube(p6);
InterruptIn voltage_Checker_Tube(p7);

Ticker AAA_checker;
AnalogIn diode_bridge(p16);
Serial pc(USBTX, USBRX);


uint8_t mode;
uint8_t in_Voltage_Checker;
uint16_t AA_sorted;          //Amount of AA sorted
uint16_t AA_uncharged;          //Amount of uncharged AA
uint16_t AAA_sorted;         //Amount of AAA sorted
uint8_t servo_maintenance;
float voltage;
    
void receive() 
{
   char c = pc.getc();
    if(c == 'S')//Normal Mode
    {
        mode = 1;
    }
    else if(c == 'M')//Maintenance Mode
    {
        mode = 2;
    }
    else if(c == 'A' && mode == 2)
    {
    servo_maintenance = 1;
    }
    
    else if(c == 'B' && mode == 2)
    {
        servo_maintenance = 2;

    }
    
    else if(c == 'C' && mode == 2)
    {
       servo_maintenance = 3;

    }
    else if(c == 'D' && mode == 2)
    {
       servo_maintenance = 4;

    }
    else if(c == 'N')//Emergency Stop
    {
        while(1){;}
    }
    else if (c == 'B')//Safe Stop
    {
        mode = 0;
    }
}

void AAA_passed()
{
    if(AAA_tube == 1)
    {
        AAA_sorted++;
    }
}

void in_Checker()
{
    in_Voltage_Checker = 1;

}

float average_analog(int no_of_averages)
{
    int i = 0;
    float average = 0;
    for ( i = 0; i < no_of_averages; i++)            
        {
            average += diode_bridge.read();
           wait(0.001);    // wait 1mS between reading inputs
        }
    return average/i;
}

void update_pc()
{
    AAA_checker.detach();
    
    string serial_out;
 
 
    char voltage_buffer[4];
   sprintf(voltage_buffer, "%0.3f", voltage);
 
   char AA_sorted_buffer[2];
   sprintf(AA_sorted_buffer, "%d", AA_sorted);
    
    
   char AA_uncharged_buffer[2];
   sprintf(AA_uncharged_buffer , "%d", AA_uncharged);

   char AAA_sorted_buffer[2];
   sprintf(AAA_sorted_buffer , "%d", AAA_sorted);
   
  
   
  
   if(mode == 2)
   {
   char sorter_tube_sensor = sorter_Tube.read();
   char AAA_tube_sensor = AAA_tube.read();
   
   char sorter_tube_buffer[2];
   sprintf(sorter_tube_buffer , "%d", sorter_tube_sensor);
   
   char AAA_tube_buffer[2];
   sprintf(AAA_tube_buffer , "%d", AAA_tube_sensor);
   
   pc.putc('A');
   pc.putc(sorter_tube_buffer[0]);
   pc.putc('B');
   pc.putc(AAA_tube_buffer[0]);
   pc.putc('C');
   pc.putc(in_Voltage_Checker);
   }
   
   
   pc.putc('W');
   pc.putc(voltage_buffer[0]);
   pc.putc(voltage_buffer[1]);
   pc.putc(voltage_buffer[2]);  
   pc.putc(voltage_buffer[3]);
   
   pc.putc('X');
   pc.putc(AA_sorted_buffer[0]);
   pc.putc(AA_sorted_buffer[1]);
   pc.putc('Y');
   pc.putc(AA_uncharged_buffer[0]);
   pc.putc(AA_uncharged_buffer[1]);
   pc.putc('Z');
   pc.putc(AAA_sorted_buffer[0]);
   pc.putc(AAA_sorted_buffer[1]);
   pc.putc(';');
   pc.putc('\0');
   pc.putc('\r');
   pc.putc('\n');
   wait(0.5);
       AAA_checker.attach(&AAA_passed, 0.1);  
}


void voltage_checker()
{
        AA_sorted++;
        in_Voltage_Checker = 0;
        FPGA4 = 1;     
        wait(0.5);
        FPGA4 = 0;
        voltage = average_analog(100);

        //pc.printf("%f\n", voltage);  
        wait(1);
        if (voltage < 0.2)
        {
        AA_uncharged++;
           FPGA2 = 1;
           wait(2);
           FPGA2 = 0; 
        }
        else
        {
           FPGA3 = 1;
           wait(2);
           FPGA3 = 0;
        }
}
int main() {
   pc.attach(&receive);             //Attach PC receive interrupt
   voltage_Checker_Tube.rise(&in_Checker);
   AAA_checker.attach(&AAA_passed, 0.1); 
   while(1) {
    if(mode == 1)
    {
     if(sorter_Tube == 1)
        {
            FPGA1 = 1;
            wait(1);
            FPGA1 = 0;
            wait(3);
        
            if(in_Voltage_Checker == 1)
            {
                voltage_checker();
                update_pc();   
            }
             
        }
    }
    else if(mode == 2)
    {
        

        switch(servo_maintenance)
        {
        case 1:
           FPGA1 = 1;
            wait(1);
            FPGA1 = 0;
        break;
        
        case 2:
            FPGA2 = 1;
            wait(2);
            FPGA2 = 0;
        break;
        
        case 3:
            FPGA3 = 1;
            wait(2);
            FPGA3 = 0;
        break;
        
        case 4:
            FPGA4 = 1;
            wait(1);
            FPGA4 = 0;
            wait(0.5);
            voltage_checker();
        break;
        }
        update_pc();
        servo_maintenance = 0;
        wait(4);
    }
   }
    
}