SIMON

Dependencies:   mbed tsi_sensor

main.cpp

Committer:
gonzaloMS
Date:
2019-06-19
Revision:
0:31131c8fdcfb
Child:
1:6cb3e90ec4f3

File content as of revision 0:31131c8fdcfb:

#include "mbed.h"

enum{MUESTRA,MUESTRA2,NO_MUESTRA,NO_MUESTRA2,NO_INGRESA,INGRESA,ESPERA,FAIL};

const int MaxElem=5;

DigitalOut ledR(LED1);
DigitalOut ledG(LED2);
DigitalOut ledB(LED3);

DigitalIn E1r(D2);
DigitalIn E2r(D3);
DigitalIn E3r(D4);
DigitalIn reseteo(D5);

Ticker pantalla;
Ticker leer;
Ticker Interludio;

int HG=1;
int E1;
int E2;
int E3;

int i=0;
int i2=0;
int i3=0;
int i4=0;
int iMuestra=0;

int a=0;
int b=0;
int c=0;

int estadosSecuencia;
int estadosConfirm;

int CT=0;
int EP;
int LED;

int print=0;

int contar=0;

int j;
int x;
int w;
int p;
int l=0;

int vecR[MaxElem];
int vecG[MaxElem];
int vecB[MaxElem];
int vecE1[MaxElem];
int vecE2[MaxElem];
int vecE3[MaxElem];

void generadorSecuencia();
void detectorPulsado();
void confirmacion();
void leerFuncion();
void cutled();
void pantalleate();

int main(void) {
    reseteo.mode(PullUp);
    ledR=1;
    ledG=1;
    ledB=1;
    leer.attach(&leerFuncion,0.4);
    Interludio.attach(&cutled,0.2);
    pantalla.attach(&pantalleate,1);
    while (true) {
        if(reseteo==0)
        {
            for(j=0;j<MaxElem;j++){
                vecR[j]=0;
                vecG[j]=0;
                vecB[j]=0;
                vecE1[j]=0;
                vecE2[j]=0;
                vecE3[j]=0;
            }
            CT=0;
            HG=0;
            EP=0;
            l=0;
            contar=0;
            print=0;
            LED=0;
            a=0;
            b=0;
            c=0;
            i=0;
            i2=0;
            i3=0;
            i4=0;
            estadosSecuencia=NO_MUESTRA;
            estadosConfirm=NO_INGRESA;
            
            
        }
        if(CT<=MaxElem)
        {
            if(print==1)
            {
                printf("Cant. Total Secuencia:%d \n",CT);
                printf("Cant. Total de veces Ingresado:%d \n",i2);
                printf("Cant. Total de veces que fue correcto lo ingresado:%d \n",i3);
                printf("Secuencia a lograr: \n");
                for(p=0;p<=(CT-1);p++)
                {
                    if(CT==MaxElem+1)
                    {
                        break;   
                    }
                    printf("%d %d %d \n",vecR[p],vecG[p],vecB[p]);   
                }  
                printf("\n \n");
                print=0;   
            }
            if(l==1)
            {
            detectorPulsado();
            generadorSecuencia();
            confirmacion();
            l=0;
            }
        }
        else
        {
            if(l==1)
            {
                printf("Por favor, empiece otra vez \n");
                l=0;  
            }
        }
    }
}

void pantalleate()
{
    print=1;   
}

void cutled()
{   
    if(contar%2==0)
    {
        ledR=1;
        ledG=1;
        ledB=1;
    }
    contar++;
}
void leerFuncion()
{
    l=1;     
}

void confirmacion(){
    switch(estadosConfirm)
    {
        default:
        case NO_INGRESA:
        for(w=0;w<MaxElem;w++)
        {
            vecE1[w]=0;
            vecE2[w]=0;
            vecE3[w]=0;
        }
        i2=0;
        i4=0;
        i3=0;
        HG=1;
        estadosConfirm=ESPERA;
        break;
        
        case INGRESA:
        i4++;
        estadosConfirm=ESPERA;
        break;
        
        case ESPERA:
        HG=0;
        if(E1==0 && E2==0 && E3==0)
        {
            estadosConfirm=ESPERA;
        }
        else
        {
            if(i3!=CT)
            {
                if((vecR[i4]==vecE1[i4]) && (vecG[i4]==vecE2[i4]) && (vecB[i4]==vecE3[i4]))
                {
                    i3++; 
                    estadosConfirm=INGRESA;
                }
                else
                {
                    estadosConfirm=FAIL;   
                }
            }
        }
        if(i3==CT)
        {
            estadosConfirm=NO_INGRESA;
        }
        break;
        
        case FAIL:
        CT=MaxElem+1;
        break;
    }
}
void generadorSecuencia(){
    switch(estadosSecuencia)
    {
        default:
        case NO_MUESTRA:
            LED=0;
            if(HG==0)
            {
                estadosSecuencia=NO_MUESTRA;
            }
            else
            {
                estadosSecuencia=NO_MUESTRA2;
            }
            break;
        
        case NO_MUESTRA2:
        CT++;
        estadosSecuencia=MUESTRA;
        break;
        
        case MUESTRA:
            if(EP!=CT)
            {
                LED=rand()%3+1;
                if(LED==1)
                {
                    vecR[i]=1;
                    vecG[i]=0;
                    vecB[i]=0;
                }
                else if(LED==2)
                {
                    vecR[i]=0;
                    vecG[i]=1;
                    vecB[i]=0;
                }
                else if(LED==3)
                {
                    vecR[i]=0;
                    vecG[i]=0;
                    vecB[i]=1;
                }
                if(i<CT)
                {
                    i++;
                }
                EP++;
            }
            else
            {
                estadosSecuencia=MUESTRA2;
            }
            break;
            
            case MUESTRA2:
            if(iMuestra<=CT-1)
            {
                ledR=!vecR[iMuestra];
                ledG=!vecG[iMuestra];
                ledB=!vecB[iMuestra];
                iMuestra++;
                estadosSecuencia=MUESTRA2;
            }
            else
            {
                iMuestra=0;
                estadosSecuencia=NO_MUESTRA;
            }
            break;
    }
}

void detectorPulsado()
{
    if(E1r==1 && a==0)
    {
        E1=1;
        a=1;
        vecE1[i2]=1;
        vecE2[i2]=0;
        vecE3[i2]=0;
        ledR=0;
        i2++;
    }
    else if(E1r==1 && a==1)
    {
        ledR=1;
        E1=0;
    }
    else if(E1r==0 && a==1)
    {
        E1=0;
        a=0;
    }
    
    if(E2r==1 && b==0)
    {
        E2=1;
        b=1;
        vecE1[i2]=0;
        vecE2[i2]=1;
        vecE3[i2]=0;
        ledG=0;
        i2++;
    }
    else if(E2r==1 && b==1)
    {
        ledG=1;
        E2=0;
    }
    else if(E2r==0 && b==1)
    {
        E2=0;
        b=0;
    }

    if(E3r==1 && c==0)
    {
        E3=1;
        c=1;
        vecE1[i2]=0;
        vecE2[i2]=0;
        vecE3[i2]=1;
        ledB=0;
        i2++;
    }
    else if(E3r==1 && c==1)
    {
        ledB=1;
        E3=0;
    }
    else if(E3r==0 && c==1)
    {
        E3=0;
        c=0;
    }
}