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

Revision:
6:7812b342d945
Parent:
5:b69870b843f3
Child:
7:9276134bb25e
--- a/main.cpp	Tue Jun 27 13:16:07 2017 +0000
+++ b/main.cpp	Fri Mar 09 13:27:08 2018 +0000
@@ -6,27 +6,87 @@
 #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;
+//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 text[30];
     uint8_t status;
   
-    BSP_LCD_SetFont(&Font20);
+    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(1);
+    wait(0.2);
   
     status = ts.Init(lcd.GetXSize(), lcd.GetYSize());
   
@@ -46,24 +106,114 @@
       lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE);
       lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"INIT OK", CENTER_MODE);
     }
+    wait(0.2);
     
-    wait(1);
     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);      
+      ts.GetState(&TS_State);  
+      //#ifdef TOUCHSCREEN_DEMO    
       if (TS_State.TouchDetected)
       {
         x = TS_State.X;
         y = TS_State.Y;
-        sprintf((char*)text, "x=%d y=%d    ", x, 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);
-        lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
+        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
+      
+      
     }
 }