Parcial Junio Sistemas Embebidos Juan Eguidazu

Dependencies:   mbed tsi_sensor MMA8451Q

main.cpp

Committer:
juaneguidazu
Date:
2020-06-22
Revision:
0:25fa9c2b3c2a

File content as of revision 0:25fa9c2b3c2a:

#include "mbed.h"
#include "tsi_sensor.h"
#include "MMA8451Q.h"
/* This defines will be replaced by PinNames soon */
#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
#define ELEC0 9
#define ELEC1 10
#elif defined (TARGET_KL05Z)
#define ELEC0 9
#define ELEC1 8
#else
#error TARGET NOT DEFINED
#endif
#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
PinName const SDA = PTE25;
PinName const SCL = PTE24;
#elif defined (TARGET_KL05Z)
PinName const SDA = PTB4;
PinName const SCL = PTB3;
#elif defined (TARGET_K20D50M)
PinName const SDA = PTB1;
PinName const SCL = PTB0;
#else
#error TARGET NOT DEFINED
#endif
#define MMA8451_I2C_ADDRESS (0x1d<<1)

DigitalOut rled(LED_RED);
DigitalOut gled(LED_GREEN);
DigitalOut bled(LED_BLUE);
DigitalOut ledon(PTD4);
AnalogIn tensionV(PTB0);
DigitalIn tensionD(PTA12);
// Definicion de patas
TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
Ticker pulsador;
Ticker ledoon;
Ticker ledoff;
Ticker analogread;
void TIMER(void);
void LEDV(void);
void LEDON(void);
void MAQLEDON(void);
void LEDOFF(void);
void MAQLEDOFF(void);
void R_LRC();
void RECEPCION(void);
void onCharReceived();
void ANGIN(void);
int casosledon=0;
int tiempoledon=0;
int estadoon=0;
int casosledoff=0;
int tiempoledoff=0;
int estadooff=0;
float j=0;
bool hab=0;
int t=0;
int x, y, z, v, d;
int bytenum=0;
char buffer[3];
char LRC=0;
int phab=0;
//Definimos que el puerto serie se llama pc
Serial pc(USBTX, USBRX);
//Variable donde se guarda lo leido
char   c = '\0';
//bit usado como flag para procesar datos
bool newdata = false;   //Se pone en true cuando hay nuevos datos
int main(void)
{
    //Ejecutar onCharReceived por cada entrada por puerto
    pc.attach(&onCharReceived);
    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
    //printf("MMA8451 ID: %d\n", acc.getWhoAmI());
    pulsador.attach(&TIMER,0.1);
    ledoon.attach(&LEDON,0.1);
    ledoff.attach(&LEDOFF,0.1);
    analogread.attach(&ANGIN,0.2);
    while (true) {
        j=tsi.readPercentage();
        x = int ((abs(acc.getAccX()))*100);
        y = int ((abs(acc.getAccY()))*100);
        z = int ((abs(acc.getAccZ()))*100);
        if(j>0&&t==0) {
            hab=!hab;
            if(hab == 1) {
                tiempoledon = 2;
                casosledon = 0;
                estadoon = 1;
            }
            t=3;
        }
        if(hab==1) {
            MAQLEDON();
            LEDV();
            RECEPCION();

            switch(phab) {
                default:
                    phab=0;
                    break;
                case 1:
                    sprintf(buffer,"X%d",x);
                    R_LRC();
                    printf("\n\n $%s%X)\n\n",buffer,LRC);
                    phab=0;
                    break;
                case 2:
                    sprintf(buffer,"Y%d",y);
                    R_LRC();
                    printf("\n\n $%s%X)\n\n",buffer,LRC);
                    phab=0;
                    break;
                case 3:
                    sprintf(buffer,"Z%d",z);
                    R_LRC();
                    printf("\n\n $%s%X)\n\n",buffer,LRC);
                    phab=0;
                    break;
                case 4:
                    sprintf(buffer,"V%d",v);
                    R_LRC();
                    printf("\n\n $%s%X)\n\n",buffer,LRC);
                    phab=0;
                    break;
                case 5:
                    sprintf(buffer,"D%d",d);
                    R_LRC();
                    printf("\n\n $%s%X)\n\n",buffer,LRC);
                    phab=0;
                    break;
            }
        } else
            MAQLEDOFF();
        rled=1;
        bled=1;
        gled=1;
    }
}
void TIMER(void)
{
    if(t==0) {
        t=0;
    } else {
        t--;
    }
}
void LEDV(void)
{
    if(v<=10&&v>0) {
        rled=0;
        bled=1;
        gled=1;
    } else if(v<=20&&v>10) {
        rled=1;
        bled=1;
        gled=0;
    } else if(v<=33&&v>20) {
        rled=1;
        bled=0;
        gled=1;
    }
}
void LEDON(void)
{
    if(tiempoledon<=0) {
        tiempoledon=0;
    } else {
        tiempoledon--;
    }
}
void MAQLEDON(void)
{
    switch(estadoon) {
        case 0:
            ledon = 0;
            if(tiempoledon == 0) {
                estadoon = 1;
                tiempoledon = 2;
            }
            break;
        case 1:
            ledon=1;
            if(tiempoledon==0) {
                estadoon=0;
                casosledon++;
                if(casosledon < 3) {
                    tiempoledon=2;
                } else if(casosledon == 3) {
                    tiempoledon = 15;
                    casosledon = 0;
                }
                break;
            }
    }
}
void LEDOFF(void)
{
    if(tiempoledoff==0) {
        tiempoledoff=0;
    } else {
        tiempoledoff--;
    }
}
void MAQLEDOFF(void)
{
    switch(estadooff) {
        case 0:
            ledon=1;
            casosledoff++;
            if(tiempoledoff==0) {
                estadooff=1;
                tiempoledoff=10;
                break;
            } else {
                break;
            }
        case 1:
            ledon=0;
            if(tiempoledoff==0) {
                estadooff=0;
                tiempoledoff=5;
                break;
            } else {
                break;
            }
    }
}
void R_LRC()
{
    for (int b = 0; b < sizeof(buffer); b++) {
        LRC ^= buffer[b];
    }
}
//Callback cuando se detecta una entrada
void onCharReceived()
{
    //Copiamos lo leido en c
    c = pc.getc();
    newdata = true;
}
void RECEPCION(void)
{
    if(newdata) {
        switch(bytenum) {
            case 0:
                if(c=='$') {
                    bytenum=1;
                    break;
                } else {
                    bytenum=0;
                    break;
                }
            case 1:
                if(c=='X') {
                    bytenum=2;
                    break;
                } else if(c=='Y') {
                    bytenum=3;
                    break;
                } else if(c=='Z') {
                    bytenum=4;
                    break;
                } else if(c=='V') {
                    bytenum=5;
                    break;
                } else if(c=='D') {
                    bytenum=6;
                    break;
                } else {
                    bytenum=0;
                    break;
                }
            case 2:
                if(c==')') {
                    phab=1;
                    bytenum=0;
                    break;
                } else {
                    bytenum=0;
                    break;
                }
            case 3:
                if(c==')') {
                    phab=2;
                    bytenum=0;
                    break;
                } else {
                    bytenum=0;
                    break;
                }
            case 4:
                if(c==')') {
                    phab=3;
                    bytenum=0;
                    break;
                } else {
                    bytenum=0;
                    break;
                }
            case 5:
                if(c==')') {
                    phab=4;
                    bytenum=0;
                    break;
                } else {
                    bytenum=0;
                    break;
                }
            case 6:
                if(c==')') {
                    if(tensionD==1)
                        d=11;
                    else
                        d=10;
                    phab=5;
                    bytenum=0;
                    break;
                } else {
                    bytenum=0;
                    break;
                }
        }
    }
}
void ANGIN(void)
{
    v = int ((tensionV.read()*3.3)*10);
}