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
Diff: main.cpp
- 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
+
+
}
}
