STM32-F746NG-DISCO Project.

Dependencies:   BSP_DISCO_F746NG

main.cpp

Committer:
chri721u
Date:
2020-01-08
Revision:
2:f3bee2fcc2a0
Parent:
1:0c13955ae7ae
Child:
3:1d1ced98a985

File content as of revision 2:f3bee2fcc2a0:

/*
    Author: Christian Andresen
    Website: xcha11.skp-dp.sde.dk
    Date: 10-01-2020
    Brief: Basic arduino project involving sensors (Button, Touch), digital output (LED, Buzzer), and onboard LCD Screen.

*/
#include "mbed.h" // mbed-os 5
#include "stm32746g_discovery_lcd.h" // Last updated 27/11/2019

// D2-D4: DigitalIN, D5-D8: DigitalOut.
DigitalIn button(D2);
DigitalIn touch(D3);
//InterruptIn button(D2);
//InterruptIn touch(D3);
DigitalOut led(D5);
DigitalOut buzzer(D6);

// Multithreading
Thread firstThread;
Thread secondThread;

// Prototype for the blue screen of death.
void bluescreen();
// Visible ints, used to register button presses and touch-sensor activation.
int button_count;
int touch_count;
// Integer used for the 9999 counter.
int countup;
// restarts is an invisible int, gaining 1 in value eachtime countup reaches 9999. Used for the bluescreen() event.
int restarts;

// 9999 counter program. Added above main for multithread ability.
void ninecounter()
{    
    HAL_Delay(3000);
    while(1) {
        if (countup != 9999) {
            wait(0.001);
            countup++;

        } else {
            countup = 9900;
            restarts++;
        }
    }
}
/* // USE ONLY IF TOUCH SENSOR AND BUTTON ARE INTERRUPT-IN
void buttonpress() {
    led = 1; // Turn LED on
            buzzer = 1; // Emit sound from buzzer
            wait(0.25);
            button_count++; // Register a button has been pressed, so it can be displayed later.
            led = 0; // Turn LED off
            buzzer = 0; // Halt sound emmital from buzzer.
}

void touchpress() {
    led = 1; // Turn LED on
            wait(0.25);
            touch_count++; // Register that the touch sensor has been triggered, so it can be displayed layer.
            led = 0; // Turn LED off
} */

void inputcounter()
{
    HAL_Delay(3000);
    while(1) {
        //button.rise(&buttonpress); USE IF BUTTON IS INTERRUPT IN (BRUG IKKE RISE I WHILE - Flyt 2 linjer op)
        //touch.rise(&touchpress); USE IF TOUCH SENSOR IS INTERRUPT IN

        // USE IF BUTTON AND TOUCH SENSOR IS DIGITAL IN
        // Register if the button has been pressed.
        if(button) {
            led = 1; // Turn LED on
            buzzer = 1; // Emit sound from buzzer
            wait(0.5);
            button_count++; // Register a button has been pressed, so it can be displayed later.
            led = 0; // Turn LED off
            buzzer = 0; // Halt sound emmital from buzzer.
        }
        // Register if touchscreen has been touched.
        else if(touch) {
            led = 1; // Turn LED on
            wait(0.69);
            touch_count++; // Register that the touch sensor has been triggered, so it can be displayed layer.
            led = 0; // Turn LED off
        }
        // If nothing is being toched, prevent anything from happening.
        else {
            led = 0;
            buzzer = 0;
        }
    }
}
// Main part of the program
int main()
{
    firstThread.start(&ninecounter); // Start multithread main and ninecounter()
    secondThread.start(&inputcounter);

    // Prepare 3 text elements for later print to LCD
    uint8_t text1[30];
    uint8_t text2[30];
    uint8_t text3[30];
    // Give integers a default value of 0
    button_count = 0;
    touch_count = 0;
    countup = 9900;
    restarts = 0;

    // Boot up LCD screen
    BSP_LCD_Init();
    BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
    BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
    
    // Clear the screen, add black background and red text
    BSP_LCD_Clear(LCD_COLOR_BLACK);
    BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
    BSP_LCD_SetTextColor(LCD_COLOR_RED);
    
    // Bootup Message
    BSP_LCD_DisplayStringAt(0, 130, (uint8_t *) "SYSTEM BOOTING", CENTER_MODE);
    HAL_Delay(2500);
    // Change LCD Screen to system
    BSP_LCD_Clear(LCD_COLOR_BLACK);
    // Studio name & department
    BSP_LCD_DisplayStringAt(0, 25, (uint8_t *) "HELLDROP STUDIO SOFTWARE", CENTER_MODE);
    BSP_LCD_DisplayStringAt(0, 250, (uint8_t *) "Code by Christian Andresen", CENTER_MODE);

    while(restarts < 10) {
        sprintf((char*)text1, "Button count: %d", button_count);
        sprintf((char*)text2, "Touch count: %d", touch_count);
        sprintf((char*)text3, "   %d  (%d) ", countup, restarts);

        BSP_LCD_DisplayStringAt(0, 75, (uint8_t *)&text1, CENTER_MODE);
        BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)&text2, CENTER_MODE);
        BSP_LCD_DisplayStringAt(0, 175, (uint8_t *)&text3, CENTER_MODE);
    }
    if (restarts >= 10) {
        bluescreen();
    }
}

void bluescreen()
{
    //BLUE SCREEN OF DEATH
    BSP_LCD_Clear(LCD_COLOR_BLUE);
    BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
    BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
    BSP_LCD_DisplayStringAt(0, 75, (uint8_t *) "This device has", CENTER_MODE);
    BSP_LCD_DisplayStringAt(0, 100, (uint8_t *) "encountered", CENTER_MODE);
    BSP_LCD_DisplayStringAt(0, 125, (uint8_t *) "a fatal error", CENTER_MODE);
    BSP_LCD_DisplayStringAt(0, 150, (uint8_t *) "and needs to reboot.", CENTER_MODE);
    BSP_LCD_DisplayStringAt(0, 250, (uint8_t *) "HAL Error", LEFT_MODE);
    BSP_LCD_DisplayStringAt(0, 250, (uint8_t *) "ERROR CODE: 40", RIGHT_MODE);
}