Write an Mbed application that blinks – LED1 when the board is horizontal – LED2 when the board is lying on the long edge – LED3 when the board is lying on the short edge – All LEDs when the board is in none of those positions

Dependencies:   BSP_B-L475E-IOT01 mbed

main.cpp

Committer:
vicara
Date:
2018-11-14
Revision:
1:8681eb2b971d
Parent:
0:56acdbca3ea1
Child:
2:527f86cab491

File content as of revision 1:8681eb2b971d:

#include "mbed.h"

#include "stm32l475e_iot01_accelero.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);

InterruptIn button(USER_BUTTON);
int16_t pDataXYZ[3] = {0};

void toggle() {
    printf("ACCELERO_X = %d\n", pDataXYZ[0]);
    printf("ACCELERO_Y = %d\n", pDataXYZ[1]);
    printf("ACCELERO_Z = %d\n\n", pDataXYZ[2]);
}

bool is_board_horizontal() {
    bool is_X_inRange = false;
    bool is_Y_inRange = false;
    bool is_Z_inRange = false;
    
    int x_value = pDataXYZ[0];
    int y_value = pDataXYZ[1];
    int z_value = pDataXYZ[2];
    
    if(x_value < 100 && x_value > -100){
        is_X_inRange = true;
    }
    
    if(y_value < 100 && y_value > -100){
        is_Y_inRange = true;
    }
    
    if((z_value < 1030 && z_value > 950) || (z_value < -950 && z_value > -1030)){
        is_Z_inRange = true;
    }
    
    return is_X_inRange && is_Y_inRange && is_Z_inRange;
}

bool is_board_vertical_short() {
    bool is_X_inRange = false;
    bool is_Y_inRange = false;
    bool is_Z_inRange = false;
    
    int x_value = pDataXYZ[0];
    int y_value = pDataXYZ[1];
    int z_value = pDataXYZ[2];
    
    if((x_value < -950  && x_value > -1030) || (x_value < 1030 && x_value > 950)){
        is_X_inRange = true;
    }
    
    if(y_value < 100 && y_value > -100){
        is_Y_inRange = true;
    }
    
    if(z_value < 100 && z_value > -100){
        is_Z_inRange = true;
    }
    
    return is_X_inRange && is_Y_inRange && is_Z_inRange;
}

bool is_board_vertical_long() {
    bool is_X_inRange = false;
    bool is_Y_inRange = false;
    bool is_Z_inRange = false;
    
    int x_value = pDataXYZ[0];
    int y_value = pDataXYZ[1];
    int z_value = pDataXYZ[2];
    
    if(x_value < 100  && x_value > -100){
        is_X_inRange = true;
    }
    
    if((y_value < 1030 && y_value > 950) || (y_value < -950 && y_value > -1030)){
        is_Y_inRange = true;
    }
    
    if(z_value < 100 && z_value > -100){
        is_Z_inRange = true;
    }
    
    return is_X_inRange && is_Y_inRange && is_Z_inRange;
}

void blink_led(int led1_status, int led2_status, int led3_status, DigitalOut led){
    printf("%d - %d - %d\n", led1_status, led2_status, led3_status);
    led1 = led1_status;
    led2 = led2_status;
    led3 = led3_status;
    wait(1);
    led = !led;
}

void blink_all(){
    led1 = 1;
    led2 = 1;
    led3 = 1;
    wait(1);
    led1 = 0;
    led2 = 0;
    led3 = 0;
}

int main(){
    button.rise(&toggle);
    BSP_ACCELERO_Init();
    while(true){
        BSP_ACCELERO_AccGetXYZ(pDataXYZ);
        if((!is_board_vertical_long() && !is_board_vertical_short() && !is_board_horizontal())){
            blink_all();
        } else {
            if(is_board_horizontal() && !is_board_vertical_short() && !is_board_vertical_long()){
                blink_led(1,0,0, led1);
            } else if(!is_board_horizontal() && is_board_vertical_short() && !is_board_vertical_long()){
                blink_led(0,1,0, led2);
            } else if(!is_board_horizontal() && !is_board_vertical_short() && is_board_vertical_long()){
                blink_led(0,0,1, led3);
            }
        }
        wait(1);
    }
}