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@6:7812b342d945, 2018-03-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |