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

Committer:
pierrebizouard
Date:
Fri Mar 09 13:27:08 2018 +0000
Revision:
6:7812b342d945
Parent:
5:b69870b843f3
Child:
7:9276134bb25e
added fastlite logo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pierrebizouard 4:86d291139659 1 //#define USB_STM_HAL
pierrebizouard 4:86d291139659 2 //#define DISCO
pierrebizouard 4:86d291139659 3
bcostm 0:91c6ab790bd7 4 #include "mbed.h"
bcostm 0:91c6ab790bd7 5 #include "TS_DISCO_F429ZI.h"
bcostm 0:91c6ab790bd7 6 #include "LCD_DISCO_F429ZI.h"
pierrebizouard 3:9b242573a271 7 #include "USBSerial.h"
pierrebizouard 5:b69870b843f3 8 #include "SWO.h"
pierrebizouard 6:7812b342d945 9 #include "logos.h"
pierrebizouard 6:7812b342d945 10
pierrebizouard 6:7812b342d945 11 //PA3 PA5
pierrebizouard 6:7812b342d945 12 AnalogOut temperature_out(PA_5);
pierrebizouard 6:7812b342d945 13 //PC3
pierrebizouard 6:7812b342d945 14
pierrebizouard 6:7812b342d945 15 //AnalogIn #conflicts with something somewhere
pierrebizouard 6:7812b342d945 16 //SPI PE6 PE5 PE2
bcostm 0:91c6ab790bd7 17
pierrebizouard 4:86d291139659 18 LCD_DISCO_F429ZI lcd;
pierrebizouard 4:86d291139659 19 TS_DISCO_F429ZI ts;
pierrebizouard 6:7812b342d945 20 uint8_t text[30];
pierrebizouard 4:86d291139659 21
pierrebizouard 5:b69870b843f3 22 SWO_Channel swo;
pierrebizouard 6:7812b342d945 23 //USBSerial ser;
pierrebizouard 6:7812b342d945 24
pierrebizouard 6:7812b342d945 25 //AnalogOut temp_setpoint(PA_5);
pierrebizouard 6:7812b342d945 26 //AnalogIn temp_read(PF_4);
bcostm 0:91c6ab790bd7 27
pierrebizouard 4:86d291139659 28
pierrebizouard 6:7812b342d945 29 #define LINE(x) ((x) * (((sFONT *)BSP_LCD_GetFont())->Height))
pierrebizouard 6:7812b342d945 30 #define min(x,y) (x>y?y:x)
pierrebizouard 6:7812b342d945 31 #define max(x,y) (x>y?x:y)
pierrebizouard 6:7812b342d945 32
pierrebizouard 6:7812b342d945 33 void DrawRectCentered(uint16_t xcenter, uint16_t ycenter, uint16_t width, uint16_t height)
pierrebizouard 6:7812b342d945 34 {
pierrebizouard 6:7812b342d945 35 //landscape mode only
pierrebizouard 6:7812b342d945 36 lcd.FillRect(xcenter+width/2,ycenter-height/2, height, width);
pierrebizouard 6:7812b342d945 37 }
pierrebizouard 6:7812b342d945 38
pierrebizouard 6:7812b342d945 39 double pcoefs[] = {-1.10014853, 10.40077476, -70.49071822, 86.20161024};
pierrebizouard 6:7812b342d945 40 double rev_pcoefs[] = {-5.42057541e-08, 5.11915693e-05, -2.13855322e-02, 1.50390471e+00};
pierrebizouard 6:7812b342d945 41
pierrebizouard 6:7812b342d945 42 double polyval(double* coefs, int degree, double value)
pierrebizouard 6:7812b342d945 43 {
pierrebizouard 6:7812b342d945 44 int power = 0;
pierrebizouard 6:7812b342d945 45 int degree_current = degree;
pierrebizouard 6:7812b342d945 46 double value_out = 0;
pierrebizouard 6:7812b342d945 47 do {
pierrebizouard 6:7812b342d945 48 value_out += pow(value, power)*coefs[degree_current];
pierrebizouard 6:7812b342d945 49 degree_current -= 1;
pierrebizouard 6:7812b342d945 50 power += 1;
pierrebizouard 6:7812b342d945 51 } while (power <= degree);
pierrebizouard 6:7812b342d945 52 return value_out;
pierrebizouard 6:7812b342d945 53 }
pierrebizouard 6:7812b342d945 54
pierrebizouard 6:7812b342d945 55 double read_temperature()
pierrebizouard 6:7812b342d945 56 {
pierrebizouard 6:7812b342d945 57 //fixes a bug for repetitve readout failures
pierrebizouard 6:7812b342d945 58 AnalogIn temp_read(PA_3); //PF4 PF5 PF3 PF6 PF8
pierrebizouard 6:7812b342d945 59 double bridge_res = 100e3;
pierrebizouard 6:7812b342d945 60 double bridge_voltage = 3.3;
pierrebizouard 6:7812b342d945 61 double midpoint_voltage = double(temp_read.read())*bridge_voltage;
pierrebizouard 6:7812b342d945 62 double rx = (midpoint_voltage / bridge_voltage) * bridge_res / (1 - midpoint_voltage / bridge_voltage);
pierrebizouard 6:7812b342d945 63 sprintf((char*)text, "TR %lf V ", midpoint_voltage);
pierrebizouard 6:7812b342d945 64 lcd.DisplayStringAt(0, LINE(9), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 65 return polyval(pcoefs, 3, log10(rx/1e3));
pierrebizouard 6:7812b342d945 66 }
pierrebizouard 6:7812b342d945 67
pierrebizouard 6:7812b342d945 68 void write_temperature_setpoint(double temperature)
pierrebizouard 6:7812b342d945 69 {
pierrebizouard 6:7812b342d945 70 double bridge_res = 100e3;
pierrebizouard 6:7812b342d945 71 double bridge_voltage = 3.3;
pierrebizouard 6:7812b342d945 72 double res = pow(10., polyval(rev_pcoefs, 3, temperature))*1e3;
pierrebizouard 6:7812b342d945 73 double voltage = (res/(res+bridge_res) * bridge_voltage);
pierrebizouard 6:7812b342d945 74 sprintf((char*)text, "SP %4.1lf V ", voltage);
pierrebizouard 6:7812b342d945 75 lcd.DisplayStringAt(0, LINE(8), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 76 temperature_out.write(voltage/bridge_voltage);
pierrebizouard 6:7812b342d945 77 }
pierrebizouard 4:86d291139659 78
pierrebizouard 4:86d291139659 79 int main()
pierrebizouard 4:86d291139659 80 {
pierrebizouard 4:86d291139659 81 TS_StateTypeDef TS_State;
bcostm 0:91c6ab790bd7 82 uint16_t x, y;
bcostm 0:91c6ab790bd7 83 uint8_t status;
bcostm 0:91c6ab790bd7 84
pierrebizouard 6:7812b342d945 85 BSP_LCD_SetFont(&Font24);
bcostm 0:91c6ab790bd7 86
bcostm 0:91c6ab790bd7 87 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE);
bcostm 0:91c6ab790bd7 88 lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"DEMO", CENTER_MODE);
pierrebizouard 6:7812b342d945 89 wait(0.2);
bcostm 0:91c6ab790bd7 90
bcostm 0:91c6ab790bd7 91 status = ts.Init(lcd.GetXSize(), lcd.GetYSize());
bcostm 0:91c6ab790bd7 92
bcostm 0:91c6ab790bd7 93 if (status != TS_OK)
bcostm 0:91c6ab790bd7 94 {
bcostm 0:91c6ab790bd7 95 lcd.Clear(LCD_COLOR_RED);
bcostm 0:91c6ab790bd7 96 lcd.SetBackColor(LCD_COLOR_RED);
bcostm 0:91c6ab790bd7 97 lcd.SetTextColor(LCD_COLOR_WHITE);
bcostm 0:91c6ab790bd7 98 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE);
bcostm 0:91c6ab790bd7 99 lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"INIT FAIL", CENTER_MODE);
bcostm 0:91c6ab790bd7 100 }
bcostm 0:91c6ab790bd7 101 else
bcostm 0:91c6ab790bd7 102 {
bcostm 0:91c6ab790bd7 103 lcd.Clear(LCD_COLOR_GREEN);
bcostm 0:91c6ab790bd7 104 lcd.SetBackColor(LCD_COLOR_GREEN);
bcostm 0:91c6ab790bd7 105 lcd.SetTextColor(LCD_COLOR_WHITE);
bcostm 0:91c6ab790bd7 106 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE);
bcostm 0:91c6ab790bd7 107 lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"INIT OK", CENTER_MODE);
bcostm 0:91c6ab790bd7 108 }
pierrebizouard 6:7812b342d945 109 wait(0.2);
bcostm 0:91c6ab790bd7 110
bcostm 0:91c6ab790bd7 111 lcd.Clear(LCD_COLOR_BLUE);
bcostm 0:91c6ab790bd7 112 lcd.SetBackColor(LCD_COLOR_BLUE);
bcostm 0:91c6ab790bd7 113 lcd.SetTextColor(LCD_COLOR_WHITE);
pierrebizouard 6:7812b342d945 114
pierrebizouard 6:7812b342d945 115 int minus_x = lcd.GetYSize()*3./4;
pierrebizouard 6:7812b342d945 116 int minus_y = lcd.GetXSize()*3./4;
pierrebizouard 6:7812b342d945 117 int plus_x = lcd.GetYSize()*3./4;
pierrebizouard 6:7812b342d945 118 int plus_y = lcd.GetXSize()*1./4;
pierrebizouard 6:7812b342d945 119 int radius = lcd.GetXSize()/8.;
bcostm 0:91c6ab790bd7 120
pierrebizouard 6:7812b342d945 121 lcd.DrawCircle(minus_x, minus_y, radius);
pierrebizouard 6:7812b342d945 122 DrawRectCentered(minus_x, minus_y, radius*1.6, 5);
pierrebizouard 6:7812b342d945 123
pierrebizouard 6:7812b342d945 124 lcd.DrawCircle(plus_x, plus_y, radius);
pierrebizouard 6:7812b342d945 125 DrawRectCentered(plus_x, plus_y, radius*1.6, 5);
pierrebizouard 6:7812b342d945 126 DrawRectCentered(plus_x, plus_y, 5, radius*1.6);
pierrebizouard 6:7812b342d945 127
pierrebizouard 6:7812b342d945 128 lcd.DrawBitmap(0, 0, logo_fastlite_landscape_90_20);
pierrebizouard 6:7812b342d945 129
pierrebizouard 6:7812b342d945 130 wait(5);
pierrebizouard 6:7812b342d945 131
pierrebizouard 6:7812b342d945 132 double temperature_setpoint = -10.0;
pierrebizouard 6:7812b342d945 133
pierrebizouard 6:7812b342d945 134 sprintf((char*)text, "temp set");
pierrebizouard 6:7812b342d945 135 lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 136 sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
pierrebizouard 6:7812b342d945 137 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 138
pierrebizouard 6:7812b342d945 139 sprintf((char*)text, "temp read");
pierrebizouard 6:7812b342d945 140 lcd.DisplayStringAt(0, LINE(3), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 141 sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
pierrebizouard 6:7812b342d945 142 lcd.DisplayStringAt(0, LINE(4), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 143
pierrebizouard 6:7812b342d945 144 int accel = 1;
pierrebizouard 6:7812b342d945 145 Timer t;
pierrebizouard 6:7812b342d945 146 t.start();
pierrebizouard 6:7812b342d945 147
bcostm 0:91c6ab790bd7 148 while(1)
bcostm 0:91c6ab790bd7 149 {
pierrebizouard 6:7812b342d945 150 ts.GetState(&TS_State);
pierrebizouard 6:7812b342d945 151 //#ifdef TOUCHSCREEN_DEMO
bcostm 0:91c6ab790bd7 152 if (TS_State.TouchDetected)
bcostm 0:91c6ab790bd7 153 {
bcostm 0:91c6ab790bd7 154 x = TS_State.X;
bcostm 0:91c6ab790bd7 155 y = TS_State.Y;
pierrebizouard 6:7812b342d945 156
pierrebizouard 6:7812b342d945 157 int portrait_x = lcd.GetYSize()-y;
pierrebizouard 6:7812b342d945 158 int portrait_y = x;
pierrebizouard 6:7812b342d945 159
pierrebizouard 6:7812b342d945 160 x = portrait_x;
pierrebizouard 6:7812b342d945 161 y = portrait_y;
pierrebizouard 6:7812b342d945 162
pierrebizouard 6:7812b342d945 163 int minus_dist = (x-minus_x)*(x-minus_x) + (y-minus_y)*(y-minus_y);
pierrebizouard 6:7812b342d945 164 int plus_dist = (x-plus_x)*(x-plus_x) + (y-plus_y)*(y-plus_y);
pierrebizouard 6:7812b342d945 165
pierrebizouard 6:7812b342d945 166 //sprintf((char*)text, "%d %d %d", minus_dist, plus_dist, radius*radius);
pierrebizouard 6:7812b342d945 167 //lcd.DisplayStringAt(0, LINE(6), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 168
pierrebizouard 6:7812b342d945 169
pierrebizouard 6:7812b342d945 170 if (minus_dist <= radius*radius) {
pierrebizouard 6:7812b342d945 171 lcd.SetTextColor(LCD_COLOR_RED);
pierrebizouard 6:7812b342d945 172 lcd.DrawCircle(minus_x, minus_y, radius);
pierrebizouard 6:7812b342d945 173 temperature_setpoint = temperature_setpoint - 0.1;
pierrebizouard 6:7812b342d945 174 sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
pierrebizouard 6:7812b342d945 175 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 176 write_temperature_setpoint(temperature_setpoint);
pierrebizouard 6:7812b342d945 177 wait(0.1/max(accel/10,1));
pierrebizouard 6:7812b342d945 178 lcd.SetTextColor(LCD_COLOR_WHITE);
pierrebizouard 6:7812b342d945 179 lcd.DrawCircle(minus_x, minus_y, radius);
pierrebizouard 6:7812b342d945 180 accel += 1;
pierrebizouard 6:7812b342d945 181 } else {
pierrebizouard 6:7812b342d945 182 if (plus_dist <= radius*radius) {
pierrebizouard 6:7812b342d945 183 lcd.SetTextColor(LCD_COLOR_GREEN);
pierrebizouard 6:7812b342d945 184 lcd.DrawCircle(plus_x, plus_y, radius);
pierrebizouard 6:7812b342d945 185 temperature_setpoint = temperature_setpoint + 0.1;
pierrebizouard 6:7812b342d945 186 sprintf((char*)text, "%4.1lf degC ", temperature_setpoint);
pierrebizouard 6:7812b342d945 187 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 188 write_temperature_setpoint(temperature_setpoint);
pierrebizouard 6:7812b342d945 189 wait(0.1/max(accel/10,1));
pierrebizouard 6:7812b342d945 190 lcd.SetTextColor(LCD_COLOR_WHITE);
pierrebizouard 6:7812b342d945 191 lcd.DrawCircle(plus_x, plus_y, radius);
pierrebizouard 6:7812b342d945 192 accel += 1;
pierrebizouard 6:7812b342d945 193 } else {
pierrebizouard 6:7812b342d945 194 accel = 0;
pierrebizouard 6:7812b342d945 195 }
pierrebizouard 6:7812b342d945 196 }
pierrebizouard 6:7812b342d945 197
pierrebizouard 6:7812b342d945 198 #ifdef TOUCH_TEST
pierrebizouard 5:b69870b843f3 199 swo.puts((char*)text);
pierrebizouard 5:b69870b843f3 200 ser.puts((char*)text);
pierrebizouard 6:7812b342d945 201 for (int l=0; l<10; l++) {
pierrebizouard 6:7812b342d945 202 sprintf((char*)text, "l=%d, x=%d y=%d ", l, x, y);
pierrebizouard 6:7812b342d945 203 lcd.DisplayStringAt(0, LINE(l), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 204 }
pierrebizouard 6:7812b342d945 205 #endif
pierrebizouard 6:7812b342d945 206 } else {
pierrebizouard 6:7812b342d945 207 accel = 0;
bcostm 0:91c6ab790bd7 208 }
pierrebizouard 6:7812b342d945 209
pierrebizouard 6:7812b342d945 210 if (t.read_ms() >= 200) {
pierrebizouard 6:7812b342d945 211 sprintf((char*)text, "%4.1f degC ", read_temperature());
pierrebizouard 6:7812b342d945 212 lcd.DisplayStringAt(0, LINE(4), (uint8_t *)&text, LEFT_MODE);
pierrebizouard 6:7812b342d945 213 t.reset();
pierrebizouard 6:7812b342d945 214 }
pierrebizouard 6:7812b342d945 215 //#endif
pierrebizouard 6:7812b342d945 216
pierrebizouard 6:7812b342d945 217
bcostm 0:91c6ab790bd7 218 }
bcostm 0:91c6ab790bd7 219 }