4 Cables con pulsadores y pull-up con 2 Displays en paralelo

Dependencies:   mbed

main.cpp

Committer:
gonzaloMS
Date:
2019-06-19
Revision:
0:d644ac0f96b0
Child:
1:2f8c5940c425

File content as of revision 0:d644ac0f96b0:

#include "mbed.h"

enum{INICIO,GENERA1,GENERA2,GENERA3,FIN,BEGGINING,CHECK1,CHECK2,CHECK3,ENDGAME,WINGAME};

DigitalIn E1r(PTC12);
DigitalIn E2r(PTC13);
DigitalIn E3r(PTC3); 
DigitalIn E4r(PTC4); 
DigitalIn pulsadorReset(PTE29); //Normalmente 1

DigitalOut ledWin(LED2);
DigitalOut ledLost(LED1);

BusOut Displays(D2,D3,D4,D5,A3,A2,A1,A0,D8); //HAB.2 - HAB.1 -G-F-E-D-C-B-A //

int E1=0;
int E2=0;
int E3=0;
int E4=0;


int numerosD[]={0b111111010,0b011000010,0b110110110,0b111100110,0b011001110,0b101101110,0b101111110,0b111000010,0b111111110,0b111001110};
int numerosU[]={0b111111001,0b011000001,0b110110101,0b111100101,0b011001101,0b101101101,0b101111101,0b111000001,0b111111101,0b111001101};

Ticker Tempo;
Ticker Display;
Ticker parpadeoTicker;

void generacion();
void chequeo();
void Chronos();
void theviewer();
void ganopierdoreaccion();
void parpadeoFuncion();
void reset();

int parimpar=0;

int regresor=60;
int Decenas;
int Unidades;
int secuencia;
int check;

int cantIgual=0;
int cantIgual2=0;
int cantIgual3=0;

int gSec1;
int gSec2;
int gSec3;
int vecSec[]={0,0,0,0};
int vecSec2[]={0,0,0,0};
int vecSec3[]={0,0,0,0};
int vecSec4[]={0,0,0,0};
int vecChq[]={0,0,0,0};

int parpadeoDisplay=0;

int fin=0;
int win=0;

int i;
int y;
int k;
int g=61;


int main() {
    ledWin=1;
    ledLost=1;
    E1r.mode(PullUp);
    E2r.mode(PullUp);
    E3r.mode(PullUp);
    E4r.mode(PullUp);
    pulsadorReset.mode(PullUp);
    Tempo.attach(&Chronos,1);
    Display.attach(&theviewer,0.005);
    parpadeoTicker.attach(&parpadeoFuncion,0.5);
    while(1) {
        generacion();
        chequeo();
        ganopierdoreaccion();
        reset();
        if(regresor < g)
        {
            E1=E1r;
            E2=E2r;
            E3=E3r;
            E4=E4r;
            g=regresor;
            printf("Entradas: %d %d %d %d \n", E1,E2,E3,E4);
            printf("Tiempo (en segundos): %d \n \n",g);  
        }
    }
}

void reset()
{
    if(pulsadorReset==0)
    {
        ledWin=1;
        parimpar=0;
        cantIgual=0;
        cantIgual2=0;
        cantIgual3=0;
        vecSec[0]=0;
        vecSec[1]=0;
        vecSec[2]=0;
        vecSec[3]=0;
        vecSec2[0]=0;
        vecSec2[1]=0;
        vecSec2[2]=0;
        vecSec2[3]=0;
        vecSec3[0]=0;
        vecSec3[1]=0;
        vecSec3[2]=0;
        vecSec3[3]=0;
        vecSec4[0]=0;
        vecSec4[1]=0;
        vecSec4[2]=0;
        vecSec4[3]=0;
        vecChq[0]=0;
        vecChq[1]=0;
        vecChq[2]=0;
        vecChq[3]=0;
        parpadeoDisplay=0;
        regresor=60;
        g=61;
        win=0;
        fin=0;
        secuencia=INICIO;
        check=BEGGINING;   
    }   
}

void ganopierdoreaccion()
{
    if(win==1)
    {
        ledWin=0;
        ledLost=1;  
    }  
}

void parpadeoFuncion()
{
    if(fin==1)
    {
        ledLost=!ledLost;
    }
    if(fin==1 || win==1)
    {
        parpadeoDisplay=!parpadeoDisplay;   
    }   
}

void Chronos()
{
    if(fin==0 && win==0)
    {
        if(regresor>0)
        {
            regresor--;
        }
        else
        {
            fin=1;   
        }
        printf("A lograr: \n");
        printf("%d %d %d %d \n",*vecSec,*(vecSec+1),*(vecSec+2),*(vecSec+3));
        printf("%d %d %d %d \n",*vecSec2,*(vecSec2+1),*(vecSec2+2),*(vecSec2+3));
        printf("%d %d %d %d \n",*vecSec3,*(vecSec3+1),*(vecSec3+2),*(vecSec3+3));
        printf("%d %d %d %d \n",*vecSec4,*(vecSec4+1),*(vecSec4+2),*(vecSec4+3));
    }
}

void theviewer()
{
        Decenas=regresor/10;
        Unidades=regresor-((regresor/10)*10);
        if(parpadeoDisplay==0)
        {
            if(parimpar%2==0)
            {
                Displays=numerosD[Decenas];   
            }
            else
            {
                Displays=numerosU[Unidades];
            }
        }
        else
        {
            if(parimpar%2==0)
            {
                Displays=0;   
            }
            else
            {
                Displays=0;
            }   
        }
        if(parimpar==201)
        {
            parimpar=0;
        }
        parimpar++;             
}

void chequeo(){
    switch(check)
    {
        default:
        case BEGGINING:
        if(E1!=0 || E2!=0 || E3!=0 || E4!=0)
        {
            check=CHECK1;   
        }
        else
        {
            check=BEGGINING;   
        }
        break;
        
        case CHECK1:
        vecChq[0]=E1;
        vecChq[1]=E2;
        vecChq[2]=E3;
        vecChq[3]=E4;
        if(cantIgual<=2)
        {
            for(i=0;i<4;i++)
            {
                if(vecSec[i]==vecChq[i])
                {
                    cantIgual++;   
                }   
            }
        }
        if(cantIgual!=4)
        {
            check=ENDGAME;
        }
        if(cantIgual==4 && ((E1==0 && E2==0 && E3==0) || (E1==0 && E2==0 && E4==0) || (E1==0 && E3==0 && E4==0) || (E2==0 && E3==0 && E4==0)))
        {
            check=CHECK1;   
        }
        else if(cantIgual==4 && ((E1!=0 && E2==0 && E3==0) || (E1==0 && E2!=0 && E3==0) || (E1==0 && E2==0 && E3!=0) || (E1!=0 && E2==0 && E4==0) || (E1==0 && E2!=0 && E4==0) || (E1==0 && E2==0 && E4!=0) || (E1!=0 && E3==0 && E4==0) || (E1==0 && E3!=0 && E4==0) || (E1==0 && E3==0 && E4!=0) || (E2!=0 && E3==0 && E4==0) || (E2==0 && E3!=0 && E4==0) || (E2==0 && E3==0 && E4!=0)))
        {
            check=CHECK2;   
        }
        break;
        
        case CHECK2:
        vecChq[0]=E1;
        vecChq[1]=E2;
        vecChq[2]=E3;
        vecChq[3]=E4;
        if(cantIgual2<=2)
        {
            for(y=0;y<4;y++)
            {
                if(vecSec2[y]==vecChq[y])
                {
                    cantIgual2++;   
                }   
            }
        }
        if(cantIgual2!=4)
        {
            check=ENDGAME;
        }
        if(cantIgual==4 && ((E1==0 && E2==0) || (E2==0 && E3==0) || (E1==0 && E3==0) || (E1==0 && E4==0) || (E2==0 && E4==0) || (E3==0 && E4==0)))
        {
            check=CHECK2;   
        }
        else if(cantIgual==4 && ((E1!=0 && E2==0) || (E1==0 && E2!=0) || (E2!=0 && E3==0) || (E2==0 && E3!=0) || (E1!=0 && E3==0) || (E1==0 && E3!=0) || (E1!=0 && E4==0) || (E1==0 && E4!=0) || (E2!=0 && E4==0) || (E2==0 && E4!=0) || (E3!=0 && E4==0) || (E3==0 && E4!=0) ))
        {
            check=CHECK3;   
        }
        break;
        
        case CHECK3:
        vecChq[0]=E1;
        vecChq[1]=E2;
        vecChq[2]=E3;
        vecChq[3]=E4;
        if(cantIgual3<=2)
        {
            for(k=0;k<4;k++)
            {
                if(vecSec3[k]==vecChq[k])
                {
                    cantIgual3++;   
                }   
            }
        }
        if(cantIgual3!=4)
        {
            check=ENDGAME;
        }
        if(cantIgual3==4 && (E1==0 || E2==0 || E3==0 || E4==0))
        {
            check=CHECK3;     
        }
        if(cantIgual3==4 && E1==1 && E2==1 && E3==1 && E4==1)
        {
            check=WINGAME;     
        }
        break;
        
        case ENDGAME:
        fin=1;
        check=ENDGAME;
        break;
        
        case WINGAME:
        win=1;
        check=WINGAME;
        break;       
    }   
}

void generacion(){
    switch(secuencia)
    {
        default:
        
        case INICIO:
        gSec1=0;
        gSec2=0;
        gSec3=0;
        secuencia=GENERA1;
        break;
        
        case GENERA1:
        gSec1=rand()%4+1;
        if(gSec1==1)
        {
            vecSec[0]++;
        }
        else if(gSec1==2)
        {
            vecSec[1]++;
        }
        else if(gSec1==3)
        {
            vecSec[2]++;
        }
        else if(gSec1==4)
        {
            vecSec[3]++;
        }
        secuencia=GENERA2;
        break;
        
        case GENERA2:
        gSec2=rand()%4+1;
        vecSec2[0]=vecSec[0];
        vecSec2[1]=vecSec[1];
        vecSec2[2]=vecSec[2];
        vecSec2[3]=vecSec[3];
        if(gSec2==1)
        {
            if(vecSec2[0]==1)
            {
                secuencia=GENERA2; 
            }
            else
            {
                vecSec2[0]++;
            }
        }
        else if(gSec2==2)
        {
            if(vecSec2[1]==1)
            {
                secuencia=GENERA2;    
            }
            else
            {
                vecSec2[1]++;
            }
        }
        else if(gSec2==3)
        {
            if(vecSec2[2]==1)
            {
                secuencia=GENERA2;    
            }
            else
            {
                vecSec2[2]++;
            }
        }
        else if(gSec2==4)
        {
            if(vecSec2[3]==1)
            {
                secuencia=GENERA2;    
            }
            else
            {
                vecSec2[3]++;
            }
        }
        if((vecSec2[0]+vecSec2[1]+vecSec2[2]+vecSec2[3]) == 2)
        {
            secuencia=GENERA3;
        }
        else
        {
            secuencia=GENERA2;   
        }
        break;
        
        case GENERA3:
        gSec3=rand()%4+1;
        vecSec3[0]=vecSec2[0];
        vecSec3[1]=vecSec2[1];
        vecSec3[2]=vecSec2[2];
        vecSec3[3]=vecSec2[3];
        if(gSec3==1)
        {
            if(vecSec3[0]==1)
            {
                secuencia=GENERA3;   
            }
            else
            {
                vecSec3[0]++;
            }
        }
        else if(gSec3==2)
        {
            if(vecSec3[1]==1)
            {
                secuencia=GENERA3;   
            }
            else
            {
                vecSec3[1]++;
            }
        }
        else if(gSec3==3)
        {
            if(vecSec3[2]==1)
            {
                secuencia=GENERA3;   
            }
            else
            {
                vecSec3[2]++;
            }
        }
        else if(gSec3==4)
        {
            if(vecSec3[3]==1)
            {
                secuencia=GENERA3;   
            }
            else
            {
                vecSec3[3]++;
            }
        }
        if((vecSec3[0]+vecSec3[1]+vecSec3[2]+vecSec3[3]) == 3)
        {
            secuencia=FIN;
        }
        else
        {
            secuencia=GENERA3;   
        }
        break;
        
        case FIN:
        vecSec4[0]=1;
        vecSec4[1]=1;
        vecSec4[2]=1;
        vecSec4[3]=1;
        secuencia=FIN;
        break;
    }    
}