app3

Dependencies:   EthernetInterface WebSocketClient mbed-rtos mbed

Fork of Code_APP1 by Louis Beaulieu

main.cpp

Committer:
ericbisson
Date:
2017-01-16
Revision:
7:a57409bdf777
Parent:
6:2ec2a74c807f
Child:
8:6f2b7f9b0d0d

File content as of revision 7:a57409bdf777:

#include "mbed.h"
#include "header.h"

Serial pc(USBTX, USBRX);
SPI spi(p11, p12, p13);
DigitalOut cs(p14);
I2C i2c(p28, p27);
PwmOut led1(LED1);

void calculer_angle(char bufferAngle[], int accZ)
{
    float angle = abs(cos(static_cast<float>(moyenne_mobile(accZ)*90/64)*PI/180)*90);
    int angleInt = (int)(angle*100);
    snprintf(bufferAngle, 5, "%d", angleInt);
    
    if(angle < 10)
    {
        bufferAngle[3] = bufferAngle[2];
        bufferAngle[2] = bufferAngle[1];
        bufferAngle[1] = bufferAngle[0];
        bufferAngle[0] = '0';
    }
}

int main() {
    int addrChip = 0x3A;
    char buffer[3] = {0,0,0};
    //*clk_ptr |= PCLK_UART0;
    pc.printf("main() clk_ptr");
    //*baudRate_ptr |= DLAB_ACTIVATE;
    pc.printf("main() DLAB_ACTIVATE");
    //*baudRate_ptr |= DLMSB;
    pc.printf("main() DLMSB");
    //*baudRate_ptr |= DLLSB;
    pc.printf("main() DLLSB");
    //*enableFIFO_ptr |= FIFO_ACTIVATE;
    pc.printf("main() FIFO_ACTIVATE");
    
    SetClockAndMode(250000, 0);
    change_dots(0x02);
    
    //Activer l'accéléromètre pour lecture 8 bits
    char activation[2] = {0x2A, 0x03};
    char fullScale[2] = {0x0E, 0x00};
    char resultat[5] = {0};
    i2c.write(addrChip, activation, 2, true);
    i2c.write(addrChip, fullScale, 2, true);
    
    while(1)
    {   
        //Aller lire les valeurs d'accélération
        buffer[0] = 0x01;
        i2c.write(addrChip, buffer, 1, true);
        i2c.read(addrChip, buffer, 3);
        calculer_angle(resultat, buffer[2]);
        
        chip_select(false);
        write_to_7segment(resultat[0],resultat[1],resultat[2],resultat[3]);
        chip_select(true);
        wait(0.1);
    }
}

void SetClockAndMode(int Speed, char Mode)
{
    if (IS_USING_SPI)
    {
        spi.format(8,Mode);
        spi.frequency(Speed);
    }
    else
    {
        // TODO
    }
}

void write_uart(char value)
{
    /*
    *U0THR |= value;
    *pinSelect_ptr |= PIN9_TX;
    *enableDataFlow_ptr |= TXE0;
    */
}

// function to change displayed dots
void change_dots(char dot)
{
    if (IS_USING_SPI)
    {
        spi.write(0x77);
        spi.write(dot);
    }
    else
    {
        write_uart(0x77);
        write_uart(dot);
    }
}

void ResetCursor()
{
    if (IS_USING_SPI)
    {
        spi.write(0x79);
        spi.write(0);
    }
    else
    {
        write_uart(0x79);
        write_uart(0);
    }
}

// function used to write numbers to all four digits
void write_to_7segment(char d1, char d2, char d3, char d4)
{
    ResetCursor();
    if (IS_USING_SPI)
    {
        spi.write(d1);
        spi.write(d2);
        spi.write(d3);
        spi.write(d4);
    }
    else
    {
        write_uart(d1);
        write_uart(d2);
        write_uart(d3);
        write_uart(d4);
    }
}

void chip_select(bool bSet)
{
    if (IS_USING_SPI)
    {
        if (!bSet)
        {
            wait_us(25);
        }
        cs = bSet;
        if (bSet)
        {
            wait_us(25);
        }
    }
}

// function used to calculate and return the new value of a moving average
int moyenne_mobile(int newData)
{
    int sum = 0;
    MovingAverage.buffer[MovingAverage.cursor] = newData;
    MovingAverage.cursor++;
    if (MovingAverage.cursor >= MOVING_AVG_SIZE)
    {
        MovingAverage.cursor = 0;
        MovingAverage.bFilled = true;
    }
    
    if (MovingAverage.bFilled)
    {
        for (int i = 0; i < MOVING_AVG_SIZE; i++)
        {
            sum += MovingAverage.buffer[i];
        }
        sum = sum / MOVING_AVG_SIZE;
    }
    else
    {
        for (int i = 0; i < MovingAverage.cursor; i++)
        {
            sum += MovingAverage.buffer[i];
        }
        sum = sum / MovingAverage.cursor;
    }
    
    return sum;
}