Basic Example / test application for the on-board MICRON QSPI-Flash. Ported from DISCO_L476VG_QSPI. Added printing on serial output and LCD screen.

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG QSPI_DISCO_F746NG TS_DISCO_F746NG mbed

main.cpp

Committer:
capsavon
Date:
2015-10-21
Revision:
3:13b323fb08e8
Parent:
2:a655d6640167
Child:
4:95cde28a5cf1

File content as of revision 3:13b323fb08e8:

#include "mbed.h"
#include "TS_DISCO_F746NG.h"
#include "LCD_DISCO_F746NG.h"

#include "main.h"

LCD_DISCO_F746NG lcd;
TS_DISCO_F746NG ts;
DigitalOut myled(LED1);

//MenuGUIButton button01;
//MenuGUIButton button02;

// TODO : add Ticker function

int main()
{
    TS_StateTypeDef TS_State;
    uint16_t x, y;
    uint8_t text[30];
    uint8_t status;
    uint8_t idx;
    uint8_t cleared = 0;
    uint8_t prev_nb_touches = 0;

    lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE);
    led_on();
    wait(0.2);

    status = ts.Init(lcd.GetXSize(), lcd.GetYSize());
    if (status != TS_OK) {
        lcd.Clear(LCD_COLOR_RED);
        lcd.SetBackColor(LCD_COLOR_RED);
        lcd.SetTextColor(LCD_COLOR_WHITE);
        lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
    } else {
        lcd.Clear(LCD_COLOR_GREEN);
        lcd.SetBackColor(LCD_COLOR_GREEN);
        lcd.SetTextColor(LCD_COLOR_WHITE);
        lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
    }

    wait(0.2);
    lcd.SetFont(&Font12);
    lcd.SetBackColor(LCD_COLOR_BLUE);
    lcd.SetTextColor(LCD_COLOR_WHITE);
    led_off();
    
    /* For test / demo
    ------------------
    2 menus + 1 main menu. The main menu has two buttons, each calling one of the two sub-menus:
    
    |------|  |------|  |------|
    |  b1  |  |  b3  |  |  b6  |
    |------|  |------|  |------|
     ->menu01
    
    |------|  |------|  |------|
    |  b2  |  |  b4  |  |  b7  |
    |------|  |------|  |------|
     ->menu02            -> Led ON

              |------|  |------|
              |  b5  |  |  b8  |
              |------|  |------|
               -> Led OFF
    menu_main  menu01    menu02
    
    */
    
    MenuGUIButton button01 (10, 80, 80, 50, "b1", &lcd);
    MenuGUIButton button02 (10, 140, 80, 50, "b2", &lcd);
    MenuGUIButton button03 (100, 80, 80, 50, "b3", &lcd);
    MenuGUIButton button04 (100, 140, 80, 50, "b4", &lcd);
    
    MenuGUIButton button05 (190, 80, 80, 50, "b5", &lcd);
        button05.callback = true;
        //button05.callback_function = led_off;
        button05.callback_function = led_toggle;
    MenuGUIButton button06 (190, 140, 80, 50, "b6", &lcd);
    MenuGUIButton button07 (190, 80, 80, 50, "b7", &lcd);
        button07.callback = true;
        //button07.callback_function = led_on;
        button07.callback_function = led_toggle;
    MenuGUIButton button08 (190, 140, 80, 50, "b8", &lcd);
    
    // Main menu
    MenuGUIMenu menu_main (2, 10, 80);
    menu_main.add_button(&button01, 0, 1);
    menu_main.add_button(&button02, 1, 1);
    
    // Menu01
    MenuGUIMenu menu01 (3, 100, 80);
    menu01.add_button(&button03, 0, 1);
    menu01.add_button(&button04, 1, 1);
    menu01.add_button(&button05, 2, 1);
    
    // Menu02
    MenuGUIMenu menu02 (3, 190, 80);
    menu02.add_button(&button06, 0, 1);
    menu02.add_button(&button07, 1, 1);
    menu02.add_button(&button08, 2, 1);
    
    // Main MenuGUI object
    MenuGUI menugui01 (3);
    menugui01.add_menu (&menu_main, 0);
    menugui01.add_menu (&menu01, 1);
    menugui01.add_menu (&menu02, 2);
    
    // Set transitions
    menugui01.set_transition(1, 0, 0);
    menugui01.set_transition(2, 0, 1);
    
    
    while(1) {
        
        lcd.SetBackColor(LCD_COLOR_BLUE);
        lcd.SetTextColor(LCD_COLOR_WHITE);

        ts.GetState(&TS_State);
        if (TS_State.touchDetected) {
            // Clear lines corresponding to old touches coordinates
            if (TS_State.touchDetected < prev_nb_touches) {
                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
                    lcd.ClearStringLine(idx);
                }
            }
            prev_nb_touches = TS_State.touchDetected;

            cleared = 0;

            sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);

            for (idx = 0; idx < TS_State.touchDetected; idx++) {
                x = TS_State.touchX[idx];
                y = TS_State.touchY[idx];
                sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
                lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
                
            }

            lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
            
        } else {
            if (!cleared) {
                lcd.Clear(LCD_COLOR_BLUE);
                sprintf((char*)text, "Touches: 0");
                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
                
                cleared = 1;
            }
        }
        
/* ------------------------------------------------------------------------ */
        
        // Touch detection of one button
        if (TS_State.touchDetected > 0) {
            
            menugui01.update(TS_State.touchX[0], TS_State.touchY[0]);
            
            }
        else {
            
            menugui01.update();
            
            }
        
        menugui01.display();
        
    }
}


// Functions definition
void led_power (int state) {
    myled = state;
    }

void led_on (void) {
    led_power(1);
    }
    
void led_off (void) {
    led_power(0);
    }
    
void led_toggle (void) {
    static int toggle = 0;
    if (toggle) {
        led_on();
        toggle = 0;
        }
    else {
        led_off();
        toggle = 1;
        }
    }