
STM32-F746NG-DISCO Project.
Dependencies: BSP_DISCO_F746NG
main.cpp
- Committer:
- chri721u
- Date:
- 2020-01-10
- Revision:
- 5:f42b50713a12
- Parent:
- 4:875a2d0a996d
File content as of revision 5:f42b50713a12:
/* Author: Christian Andresen Website: xcha11.skp-dp.sde.dk Date: 10-01-2020 Brief: STM32-F746NG-DISCO Project Project includes: Button/Touch sensor input, connected to LED lights and grove buzzer. Infinite counter of 0-9999. Resets automatically. Blue screen of death Multithreading Debug statements located within vital processes, for easy checking over console. */ #include "mbed.h" // mbed-os 5 #include "stm32746g_discovery_lcd.h" // Last updated 27/11/2019 // D2-D4: Input, D5-D8: Output. InterruptIn button(D2); InterruptIn touch(D3); DigitalOut led(D5); DigitalOut buzzer(D6); // Multithreading Thread CounterThread; Thread InputThread; // Prototypes void bluescreen(); void input(); void buttonpress(); void touchpress(); // Button click counter, button-press bool, and determinator. int button_count; bool buttonclick = false; // Touch count, touch-sensor bool, and determinator int touch_count; bool touchclick = false; // Integers used for the 9999 counter. int countup; int restarts; // 9999 counter program. Added above main for multithread ability. void ninecounter() { HAL_Delay(10000); while(1) { if (countup != 9999) { wait(0.001); countup++; } else if (restarts == 10) { break; // Once BSOD hits, the break statement will end the 9999 counter to simulate proper system shutdown. } else { countup = 0; // Reset 9999 counter restarts++; // Add to restart printf("Counter has finished counting. Reset nr. %d. \r\n", restarts); } } } // Main part of the program int main() { // Start multithread ninecounter & inputcounter CounterThread.start(&ninecounter); InputThread.start(&input); // Checks when the button is pushed down and when the touch sensor is activated button.rise(&buttonpress); touch.rise(&touchpress); uint8_t text[30]; // Prepare text element for later print to LCD button_count = 0; // Amount of times the button has been pressed touch_count = 0; // Amount of times the touch sensor has been activated countup = 0; // Default value for the counter restarts = 0; // Amount of times 9999 counter has been reset // Boot up LCD screen BSP_LCD_Init(); // Starts up the LCD 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 printf("Device is booting up \r\n"); // Debug statement that lets you know that the device is booting. BSP_LCD_DisplayStringAt(0, 100, (uint8_t *) "HELLDROP STUDIO", CENTER_MODE); // Company BSP_LCD_DisplayStringAt(0, 150, (uint8_t *) "A big hard business", CENTER_MODE); // Tagline 1 BSP_LCD_DisplayStringAt(0, 175, (uint8_t *) "in a big hard building", CENTER_MODE); // Tagline 2 HAL_Delay(10000); // Delay 10 seconds to simulate actual bootup // Change LCD Screen to system BSP_LCD_Clear(LCD_COLOR_BLACK); printf("Device has started functioning \r\n"); BSP_LCD_DisplayStringAt(0, 25, (uint8_t *) "HELLDROP STUDIO SOFTWARE", CENTER_MODE); // Studio name & department BSP_LCD_DisplayStringAt(0, 250, (uint8_t *) "Code by Christian Andresen", CENTER_MODE); // Developer credit // While there are less than 10 restarts of the counter.. while(restarts < 10) { // Combine string and integer value. sprintf((char*)text, "Button count: %d", button_count); // Print value to LCD screen BSP_LCD_DisplayStringAt(0, 100, (uint8_t *)&text, CENTER_MODE); sprintf((char*)text, "Touch count: %d", touch_count); BSP_LCD_DisplayStringAt(0, 150, (uint8_t *)&text, CENTER_MODE); sprintf((char*)text, " %d (%d) ", countup, restarts); BSP_LCD_DisplayStringAt(0, 200, (uint8_t *)&text, CENTER_MODE); } if (restarts == 10) { // If there are 10 restarts or more, trigger BSOD bluescreen(); } } void bluescreen() { //BLUE SCREEN OF DEATH printf("FATAL ERROR. SYSTEM REQUIRES MANUAL REBOOT \r\n"); 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); } void input() { HAL_Delay(10000); while(1) { if(buttonclick == true) { printf("A button has been pressed. \r\n"); button_count++; // Add to button counter led = 1; // Turn on LED buzzer = 1; // Turn on buzzer wait(0.1); // Prevent immediate shutdown // Turn both off led = 0; buzzer = 0; buttonclick = false; // End button click } else if(touchclick == true) { printf("Touch sensor has been activated \r\n"); touch_count++; // Add to touch counter on the LCD led = 1; wait(0.1); led = 0; touchclick = false; // End touch click } else if (restarts == 10) { break; // Once BSOD hits, the break statement will end the input counter to simulate proper system shutdown. } else { // Failsafe if neither are turned off during click. led = 0; buzzer = 0; } } } void buttonpress() { buttonclick = true; // Bool that activates the input() once it registers a button press } void touchpress() { touchclick = true; // See Buttonpress() comments above }