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
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
}
}
