SWO+USB Serial+TouchScreen Demo

Dependencies:   BSP_DISCO_F429ZI LCD_DISCO_F429ZI SWO TS_DISCO_F429ZI USBDEVICE mbed storage_on_flash

Fork of DISCO-F429ZI_LCDTS_demo by ST

main.cpp

Committer:
pierrebizouard
Date:
2018-03-09
Revision:
6:7812b342d945
Parent:
5:b69870b843f3
Child:
7:9276134bb25e

File content as of revision 6:7812b342d945:

//#define USB_STM_HAL
//#define DISCO

#include "mbed.h"
#include "TS_DISCO_F429ZI.h"
#include "LCD_DISCO_F429ZI.h"
#include "USBSerial.h"
#include "SWO.h"
#include "logos.h"

//PA3 PA5
AnalogOut temperature_out(PA_5);
//PC3

//AnalogIn #conflicts with something somewhere
//SPI PE6 PE5 PE2

LCD_DISCO_F429ZI lcd;
TS_DISCO_F429ZI ts;
uint8_t text[30];

SWO_Channel swo;
//USBSerial ser;

//AnalogOut temp_setpoint(PA_5);
//AnalogIn temp_read(PF_4);


#define LINE(x) ((x) * (((sFONT *)BSP_LCD_GetFont())->Height))
#define min(x,y) (x>y?y:x)
#define max(x,y) (x>y?x:y)

void DrawRectCentered(uint16_t xcenter, uint16_t ycenter, uint16_t width, uint16_t height)
{
    //landscape mode only
    lcd.FillRect(xcenter+width/2,ycenter-height/2, height, width);
}

double pcoefs[] = {-1.10014853, 10.40077476, -70.49071822,  86.20161024};
double rev_pcoefs[] = {-5.42057541e-08, 5.11915693e-05, -2.13855322e-02, 1.50390471e+00};

double polyval(double* coefs, int degree, double value)
{
    int power = 0;
    int degree_current = degree;
    double value_out = 0;
    do {
        value_out += pow(value, power)*coefs[degree_current];
        degree_current -= 1;
        power += 1;
    } while (power <= degree);
    return value_out;
}

double read_temperature() 
{
    //fixes a bug for repetitve readout failures
    AnalogIn temp_read(PA_3); //PF4 PF5 PF3 PF6 PF8
    double bridge_res = 100e3;
    double bridge_voltage = 3.3;
    double midpoint_voltage = double(temp_read.read())*bridge_voltage;
    double rx = (midpoint_voltage / bridge_voltage) * bridge_res / (1 - midpoint_voltage / bridge_voltage);
    sprintf((char*)text, "TR %lf V ", midpoint_voltage);
    lcd.DisplayStringAt(0, LINE(9), (uint8_t *)&text, LEFT_MODE);
    return polyval(pcoefs, 3, log10(rx/1e3));
}

void write_temperature_setpoint(double temperature)
{
    double bridge_res = 100e3;
    double bridge_voltage = 3.3;
    double res = pow(10., polyval(rev_pcoefs, 3, temperature))*1e3;
    double voltage = (res/(res+bridge_res) * bridge_voltage);
    sprintf((char*)text, "SP %4.1lf V ", voltage);
    lcd.DisplayStringAt(0, LINE(8), (uint8_t *)&text, LEFT_MODE);
    temperature_out.write(voltage/bridge_voltage);
}

int main()
{
    TS_StateTypeDef TS_State;
    uint16_t x, y;
    uint8_t status;
  
    BSP_LCD_SetFont(&Font24);
  
    lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE);
    lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"DEMO", CENTER_MODE);
    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", CENTER_MODE);
      lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"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", CENTER_MODE);
      lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"INIT OK", CENTER_MODE);
    }
    wait(0.2);
    
    lcd.Clear(LCD_COLOR_BLUE);
    lcd.SetBackColor(LCD_COLOR_BLUE);
    lcd.SetTextColor(LCD_COLOR_WHITE);
        
    int minus_x = lcd.GetYSize()*3./4;
    int minus_y = lcd.GetXSize()*3./4;
    int plus_x = lcd.GetYSize()*3./4;
    int plus_y = lcd.GetXSize()*1./4;
    int radius = lcd.GetXSize()/8.;
    
    lcd.DrawCircle(minus_x, minus_y, radius);
    DrawRectCentered(minus_x, minus_y, radius*1.6, 5);

    lcd.DrawCircle(plus_x, plus_y, radius);
    DrawRectCentered(plus_x, plus_y, radius*1.6, 5);
    DrawRectCentered(plus_x, plus_y, 5, radius*1.6);
    
    lcd.DrawBitmap(0, 0, logo_fastlite_landscape_90_20);
    
    wait(5);
    
    double temperature_setpoint = -10.0;

    sprintf((char*)text, "temp set");
    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
    sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
    lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
    
    sprintf((char*)text, "temp read");
    lcd.DisplayStringAt(0, LINE(3), (uint8_t *)&text, LEFT_MODE);    
    sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
    lcd.DisplayStringAt(0, LINE(4), (uint8_t *)&text, LEFT_MODE);
    
    int accel = 1;
    Timer t;
    t.start();

    while(1)
    {
      ts.GetState(&TS_State);  
      //#ifdef TOUCHSCREEN_DEMO    
      if (TS_State.TouchDetected)
      {
        x = TS_State.X;
        y = TS_State.Y;
        
        int portrait_x = lcd.GetYSize()-y;
        int portrait_y = x;
        
        x = portrait_x;
        y = portrait_y;
        
        int minus_dist = (x-minus_x)*(x-minus_x) + (y-minus_y)*(y-minus_y);
        int plus_dist = (x-plus_x)*(x-plus_x) + (y-plus_y)*(y-plus_y);
        
        //sprintf((char*)text, "%d %d %d", minus_dist, plus_dist, radius*radius);
        //lcd.DisplayStringAt(0, LINE(6), (uint8_t *)&text, LEFT_MODE);

        
        if  (minus_dist <= radius*radius) {
            lcd.SetTextColor(LCD_COLOR_RED);
            lcd.DrawCircle(minus_x, minus_y, radius);
            temperature_setpoint = temperature_setpoint - 0.1;
            sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
            lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
            write_temperature_setpoint(temperature_setpoint);
            wait(0.1/max(accel/10,1));
            lcd.SetTextColor(LCD_COLOR_WHITE);
            lcd.DrawCircle(minus_x, minus_y, radius);
            accel += 1;
        } else {
            if  (plus_dist <= radius*radius) {
                lcd.SetTextColor(LCD_COLOR_GREEN);
                lcd.DrawCircle(plus_x, plus_y, radius);
                temperature_setpoint = temperature_setpoint + 0.1;
                sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
                lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
                write_temperature_setpoint(temperature_setpoint);
                wait(0.1/max(accel/10,1));
                lcd.SetTextColor(LCD_COLOR_WHITE);
                lcd.DrawCircle(plus_x, plus_y, radius);
                accel += 1;
            } else {
                accel = 0;
            }
        }

        #ifdef TOUCH_TEST
        swo.puts((char*)text);
        ser.puts((char*)text);
        for (int l=0; l<10; l++) {
            sprintf((char*)text, "l=%d, x=%d y=%d    ", l, x, y);
            lcd.DisplayStringAt(0, LINE(l), (uint8_t *)&text, LEFT_MODE);
        }
        #endif
      } else {
        accel = 0;   
      }
      
      if (t.read_ms() >= 200) {
        sprintf((char*)text, "%4.1f degC ", read_temperature());
        lcd.DisplayStringAt(0, LINE(4), (uint8_t *)&text, LEFT_MODE);
        t.reset();
      }
      //#endif
      
      
    }
}