Cornelius Bezuidenhout / Mbed OS Heiko

Dependencies:   BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG SDFileSystem TS_DISCO_F746NG ResistiveTouchController Map CYS8218Controller MedianFilter

Committer:
Generic
Date:
Sat Oct 08 19:05:59 2016 +0000
Revision:
42:29ce1ff3b220
Parent:
41:204e2788fb46
Child:
44:560ed042317c
Forgot to map the ts;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kerneels Bezuidenhout 1:43fb2d03c36f 1 #include "mbed.h"
Kerneels Bezuidenhout 1:43fb2d03c36f 2 #include "Screens.hpp"
Kerneels Bezuidenhout 41:204e2788fb46 3 #include "ResistiveTouchController.hpp"
Kerneels Bezuidenhout 1:43fb2d03c36f 4
Kerneels Bezuidenhout 41:204e2788fb46 5 //--- Function Prototypes
Kerneels Bezuidenhout 1:43fb2d03c36f 6 void GUIThread();
Kerneels Bezuidenhout 1:43fb2d03c36f 7 void Init();
Kerneels Bezuidenhout 1:43fb2d03c36f 8
Kerneels Bezuidenhout 7:1a6e18b818a5 9 void ZeroPlate();
Kerneels Bezuidenhout 12:650ae2f4c7df 10 void Manual();
Kerneels Bezuidenhout 13:21dc070a47a9 11 void Automatic();
Kerneels Bezuidenhout 34:0b308a399f72 12 void Calibrate();
Kerneels Bezuidenhout 41:204e2788fb46 13 //-----------------------
Kerneels Bezuidenhout 7:1a6e18b818a5 14
Kerneels Bezuidenhout 41:204e2788fb46 15 //-- GUI Thread Variables and Objects
Kerneels Bezuidenhout 1:43fb2d03c36f 16 int currentScreen = 0;
Kerneels Bezuidenhout 1:43fb2d03c36f 17 int nextScreen = 0;
Kerneels Bezuidenhout 1:43fb2d03c36f 18 Thread guiThread;
Kerneels Bezuidenhout 1:43fb2d03c36f 19 Screen *activeScreen = NULL;
Kerneels Bezuidenhout 41:204e2788fb46 20 //----------------------------------
Kerneels Bezuidenhout 1:43fb2d03c36f 21
Kerneels Bezuidenhout 41:204e2788fb46 22 //-- X Axis variables
Kerneels Bezuidenhout 12:650ae2f4c7df 23 float zeroAlpha = 0;
Kerneels Bezuidenhout 12:650ae2f4c7df 24 float alpha = 0;
Generic 17:3b6d66253c97 25 float xSP = -20;
Kerneels Bezuidenhout 13:21dc070a47a9 26 float x = 0;
Kerneels Bezuidenhout 7:1a6e18b818a5 27
Kerneels Bezuidenhout 41:204e2788fb46 28 //-- Y Axis Variables
Kerneels Bezuidenhout 12:650ae2f4c7df 29 float zeroBeta = 0;
Kerneels Bezuidenhout 12:650ae2f4c7df 30 float beta = 0;
Generic 17:3b6d66253c97 31 float ySP = 50;
Kerneels Bezuidenhout 13:21dc070a47a9 32 float y = 0;
Kerneels Bezuidenhout 13:21dc070a47a9 33
Kerneels Bezuidenhout 41:204e2788fb46 34
Kerneels Bezuidenhout 41:204e2788fb46 35 //-- Controller Variables
Kerneels Bezuidenhout 22:dd9ff475b34c 36 float P = 0;
Kerneels Bezuidenhout 22:dd9ff475b34c 37 float I = 0;
Kerneels Bezuidenhout 22:dd9ff475b34c 38 float D = 0;
Kerneels Bezuidenhout 30:e8eb64ad8526 39 float Ts = 4;
Kerneels Bezuidenhout 41:204e2788fb46 40 //-----------------------
Kerneels Bezuidenhout 41:204e2788fb46 41
Kerneels Bezuidenhout 41:204e2788fb46 42
Kerneels Bezuidenhout 41:204e2788fb46 43 //-- Sensors and Actuator objects
Kerneels Bezuidenhout 41:204e2788fb46 44 ResistiveTouchController plate(A0,A1,A3,A4,A5);
Kerneels Bezuidenhout 22:dd9ff475b34c 45
Kerneels Bezuidenhout 32:d490f8ca6d2a 46 float tCal[3][2];
Kerneels Bezuidenhout 35:6baa558d3b86 47 int calPoint = 0;
Kerneels Bezuidenhout 35:6baa558d3b86 48 bool calStarted = false;
Kerneels Bezuidenhout 35:6baa558d3b86 49 Timer calTimer;
Kerneels Bezuidenhout 38:f1c571d22919 50 float calHeldTime;
Kerneels Bezuidenhout 37:93c7563f2078 51 bool calFinished = false;
Kerneels Bezuidenhout 32:d490f8ca6d2a 52
Generic 23:bab197887d5e 53 int measuredTs = 0;
Kerneels Bezuidenhout 13:21dc070a47a9 54
Generic 17:3b6d66253c97 55 bool started = true;
Kerneels Bezuidenhout 13:21dc070a47a9 56
Generic 17:3b6d66253c97 57 int ballOnPlate = 1;
Kerneels Bezuidenhout 7:1a6e18b818a5 58
Kerneels Bezuidenhout 12:650ae2f4c7df 59 bool saved = false;
Kerneels Bezuidenhout 7:1a6e18b818a5 60
Generic 17:3b6d66253c97 61 // TODO Delete these variables
Generic 17:3b6d66253c97 62 float t = 0;
Generic 9:355a59fd962b 63 Serial pc(USBTX,USBRX);
Kerneels Bezuidenhout 19:ef78ac1a98f8 64 DigitalIn test(D3);
Generic 9:355a59fd962b 65
Kerneels Bezuidenhout 1:43fb2d03c36f 66 int main()
Kerneels Bezuidenhout 1:43fb2d03c36f 67 {
Kerneels Bezuidenhout 1:43fb2d03c36f 68 Init();
Kerneels Bezuidenhout 1:43fb2d03c36f 69
Kerneels Bezuidenhout 1:43fb2d03c36f 70 while(1)
Kerneels Bezuidenhout 1:43fb2d03c36f 71 {
Kerneels Bezuidenhout 7:1a6e18b818a5 72 switch (currentScreen)
Kerneels Bezuidenhout 7:1a6e18b818a5 73 {
Kerneels Bezuidenhout 7:1a6e18b818a5 74 case Screen::ZERO_PLATE_SCREEN :
Kerneels Bezuidenhout 7:1a6e18b818a5 75 ZeroPlate();
Kerneels Bezuidenhout 7:1a6e18b818a5 76 break;
Kerneels Bezuidenhout 12:650ae2f4c7df 77 case Screen::MANUAL_CONTROL_SCREEN :
Kerneels Bezuidenhout 12:650ae2f4c7df 78 Manual();
Kerneels Bezuidenhout 12:650ae2f4c7df 79 break;
Kerneels Bezuidenhout 13:21dc070a47a9 80 case Screen::AUTOMATIC_CONTROL_SCREEN :
Kerneels Bezuidenhout 13:21dc070a47a9 81 Automatic();
Kerneels Bezuidenhout 13:21dc070a47a9 82 break;
Kerneels Bezuidenhout 34:0b308a399f72 83 case Screen::CALIBRATE_SCREEN :
Kerneels Bezuidenhout 34:0b308a399f72 84 Calibrate();
Kerneels Bezuidenhout 34:0b308a399f72 85 break;
Kerneels Bezuidenhout 7:1a6e18b818a5 86 }
Kerneels Bezuidenhout 1:43fb2d03c36f 87 }
Kerneels Bezuidenhout 1:43fb2d03c36f 88 }
Kerneels Bezuidenhout 1:43fb2d03c36f 89
Kerneels Bezuidenhout 1:43fb2d03c36f 90 void GUIThread()
Kerneels Bezuidenhout 1:43fb2d03c36f 91 {
Kerneels Bezuidenhout 1:43fb2d03c36f 92 while(1)
Kerneels Bezuidenhout 1:43fb2d03c36f 93 {
Kerneels Bezuidenhout 1:43fb2d03c36f 94 if( nextScreen != currentScreen )
Kerneels Bezuidenhout 1:43fb2d03c36f 95 {
Generic 39:7bb23ad4bf87 96 Thread::wait(100);
Kerneels Bezuidenhout 41:204e2788fb46 97
Kerneels Bezuidenhout 1:43fb2d03c36f 98 if( activeScreen != NULL)
Kerneels Bezuidenhout 1:43fb2d03c36f 99 delete activeScreen;
Kerneels Bezuidenhout 1:43fb2d03c36f 100
Kerneels Bezuidenhout 1:43fb2d03c36f 101 switch (nextScreen)
Kerneels Bezuidenhout 1:43fb2d03c36f 102 {
Kerneels Bezuidenhout 7:1a6e18b818a5 103 case Screen::MAIN_MENU_SCREEN :
Kerneels Bezuidenhout 1:43fb2d03c36f 104 activeScreen = new MainMenuScreen(&nextScreen);
Kerneels Bezuidenhout 1:43fb2d03c36f 105 break;
Kerneels Bezuidenhout 7:1a6e18b818a5 106 case Screen::MAIN_SETTINGS_SCREEN :
Kerneels Bezuidenhout 5:383f1108187d 107 activeScreen = new MainSettingsScreen(&nextScreen);
Kerneels Bezuidenhout 5:383f1108187d 108 break;
Kerneels Bezuidenhout 7:1a6e18b818a5 109 case Screen::ZERO_PLATE_SCREEN :
Kerneels Bezuidenhout 7:1a6e18b818a5 110 activeScreen = new ZeroPlateScreen(&nextScreen, &zeroAlpha, &zeroBeta, &saved);
Kerneels Bezuidenhout 7:1a6e18b818a5 111 break;
Generic 15:bc63b55a426d 112 case Screen::MANUAL_CONTROL_SCREEN :
Kerneels Bezuidenhout 12:650ae2f4c7df 113 activeScreen = new ManualControlScreen(&nextScreen, &alpha, &beta);
Kerneels Bezuidenhout 12:650ae2f4c7df 114 break;
Kerneels Bezuidenhout 13:21dc070a47a9 115 case Screen::AUTOMATIC_CONTROL_SCREEN :
Kerneels Bezuidenhout 22:dd9ff475b34c 116 activeScreen = new AutomaticControlScreen(&nextScreen, &x, &y, &measuredTs, &started, &ballOnPlate, &xSP, &ySP);
Kerneels Bezuidenhout 13:21dc070a47a9 117 break;
Kerneels Bezuidenhout 18:1b9579ac9f41 118 case Screen::AUTOMATIC_MORE_SCREEN :
Kerneels Bezuidenhout 18:1b9579ac9f41 119 activeScreen = new AutomaticMoreScreen(&nextScreen);
Kerneels Bezuidenhout 18:1b9579ac9f41 120 break;
Kerneels Bezuidenhout 20:70c5b1e499f0 121 case Screen::MANUAL_SETPOINT_SCREEN :
Generic 23:bab197887d5e 122 activeScreen = new ManualSetpointScreen(&nextScreen, &xSP, &ySP, &ballOnPlate, &started);
Kerneels Bezuidenhout 20:70c5b1e499f0 123 break;
Generic 23:bab197887d5e 124 case Screen::AUTOMATIC_SETTINGS_SCREEN :
Kerneels Bezuidenhout 22:dd9ff475b34c 125 activeScreen = new AutomaticSettingsScreen(&nextScreen, &P, &I, &D, &Ts);
Kerneels Bezuidenhout 26:f57db8d6d79e 126 break;
Kerneels Bezuidenhout 25:bfff3d661f92 127 case Screen::CHANGE_P_SCREEN :
Kerneels Bezuidenhout 25:bfff3d661f92 128 activeScreen = new ChangeValScreen(&nextScreen, currentScreen, &P, "Change P");
Kerneels Bezuidenhout 25:bfff3d661f92 129 break;
Kerneels Bezuidenhout 26:f57db8d6d79e 130 case Screen::CHANGE_I_SCREEN :
Kerneels Bezuidenhout 26:f57db8d6d79e 131 activeScreen = new ChangeValScreen(&nextScreen, currentScreen, &I, "Change I");
Kerneels Bezuidenhout 26:f57db8d6d79e 132 break;
Kerneels Bezuidenhout 26:f57db8d6d79e 133 case Screen::CHANGE_D_SCREEN :
Kerneels Bezuidenhout 26:f57db8d6d79e 134 activeScreen = new ChangeValScreen(&nextScreen, currentScreen, &D, "Change D");
Kerneels Bezuidenhout 26:f57db8d6d79e 135 break;
Kerneels Bezuidenhout 26:f57db8d6d79e 136 case Screen::CHANGE_TS_SCREEN :
Kerneels Bezuidenhout 31:5ece593c49a7 137 activeScreen = new ChangeValWholeScreen(&nextScreen, currentScreen, &Ts, "Change Ts", false, 4);
Kerneels Bezuidenhout 26:f57db8d6d79e 138 break;
Kerneels Bezuidenhout 32:d490f8ca6d2a 139 case Screen::CALIBRATE_SCREEN :
Kerneels Bezuidenhout 38:f1c571d22919 140 activeScreen = new CalibrateScreen(&nextScreen, &ballOnPlate, &calStarted, &calFinished, &calPoint, &calHeldTime);
Kerneels Bezuidenhout 32:d490f8ca6d2a 141 break;
Kerneels Bezuidenhout 1:43fb2d03c36f 142 }
Kerneels Bezuidenhout 1:43fb2d03c36f 143 activeScreen->Draw();
Generic 6:f717ce705c5d 144 currentScreen = nextScreen;
Kerneels Bezuidenhout 1:43fb2d03c36f 145 }
Kerneels Bezuidenhout 1:43fb2d03c36f 146
Kerneels Bezuidenhout 1:43fb2d03c36f 147 activeScreen->Process();
Kerneels Bezuidenhout 1:43fb2d03c36f 148
Generic 17:3b6d66253c97 149 Thread::wait(10);
Kerneels Bezuidenhout 1:43fb2d03c36f 150 }
Kerneels Bezuidenhout 1:43fb2d03c36f 151 }
Kerneels Bezuidenhout 1:43fb2d03c36f 152
Kerneels Bezuidenhout 1:43fb2d03c36f 153 void Init()
Kerneels Bezuidenhout 1:43fb2d03c36f 154 {
Generic 39:7bb23ad4bf87 155 ImageFromSD splash("/sd/Splash.txt");
Generic 9:355a59fd962b 156 pc.baud(57600);
Generic 2:5fded6444350 157 nextScreen = Screen::MAIN_MENU_SCREEN;
Kerneels Bezuidenhout 38:f1c571d22919 158
Kerneels Bezuidenhout 38:f1c571d22919 159 Thread::wait(5000);
Kerneels Bezuidenhout 38:f1c571d22919 160
Kerneels Bezuidenhout 1:43fb2d03c36f 161 guiThread.start(GUIThread);
Kerneels Bezuidenhout 1:43fb2d03c36f 162 }
Kerneels Bezuidenhout 7:1a6e18b818a5 163
Kerneels Bezuidenhout 7:1a6e18b818a5 164 void ZeroPlate()
Kerneels Bezuidenhout 7:1a6e18b818a5 165 {
Kerneels Bezuidenhout 12:650ae2f4c7df 166
Kerneels Bezuidenhout 12:650ae2f4c7df 167 pc.printf("Zero a : %f | Zero b : %f\n\r", zeroAlpha, zeroBeta);
Kerneels Bezuidenhout 12:650ae2f4c7df 168
Kerneels Bezuidenhout 12:650ae2f4c7df 169
Kerneels Bezuidenhout 7:1a6e18b818a5 170 if( saved)
Kerneels Bezuidenhout 7:1a6e18b818a5 171 {
Kerneels Bezuidenhout 12:650ae2f4c7df 172 // TODO Save zero position on servos
Generic 9:355a59fd962b 173 nextScreen = Screen::MAIN_SETTINGS_SCREEN;
Kerneels Bezuidenhout 7:1a6e18b818a5 174 saved = false;
Kerneels Bezuidenhout 7:1a6e18b818a5 175 }
Kerneels Bezuidenhout 12:650ae2f4c7df 176
Generic 9:355a59fd962b 177 Thread::wait(20);
Kerneels Bezuidenhout 7:1a6e18b818a5 178 }
Kerneels Bezuidenhout 12:650ae2f4c7df 179
Kerneels Bezuidenhout 12:650ae2f4c7df 180 void Manual()
Kerneels Bezuidenhout 12:650ae2f4c7df 181 {
Kerneels Bezuidenhout 12:650ae2f4c7df 182 // TODO Add manual control logic
Kerneels Bezuidenhout 12:650ae2f4c7df 183 }
Kerneels Bezuidenhout 13:21dc070a47a9 184
Kerneels Bezuidenhout 13:21dc070a47a9 185 void Automatic()
Kerneels Bezuidenhout 13:21dc070a47a9 186 {
Kerneels Bezuidenhout 13:21dc070a47a9 187 //TODO Add automatic control mode logic
Generic 42:29ce1ff3b220 188 ballOnPlate = plate.TouchDetected();
Kerneels Bezuidenhout 41:204e2788fb46 189
Kerneels Bezuidenhout 41:204e2788fb46 190 if( ballOnPlate )
Kerneels Bezuidenhout 41:204e2788fb46 191 {
Kerneels Bezuidenhout 41:204e2788fb46 192 plate.Measure();
Kerneels Bezuidenhout 41:204e2788fb46 193 x = plate.X();
Kerneels Bezuidenhout 41:204e2788fb46 194 y = plate.Y();
Kerneels Bezuidenhout 41:204e2788fb46 195 }
Kerneels Bezuidenhout 41:204e2788fb46 196
Kerneels Bezuidenhout 13:21dc070a47a9 197 }
Kerneels Bezuidenhout 34:0b308a399f72 198
Kerneels Bezuidenhout 34:0b308a399f72 199 void Calibrate()
Kerneels Bezuidenhout 34:0b308a399f72 200 {
Kerneels Bezuidenhout 34:0b308a399f72 201 ballOnPlate = test.read();
Kerneels Bezuidenhout 35:6baa558d3b86 202
Kerneels Bezuidenhout 36:9ca4125e526e 203 if( calStarted )
Kerneels Bezuidenhout 36:9ca4125e526e 204 {
Kerneels Bezuidenhout 36:9ca4125e526e 205 if( calPoint < 3 )
Kerneels Bezuidenhout 36:9ca4125e526e 206 {
Kerneels Bezuidenhout 36:9ca4125e526e 207 if( ballOnPlate )
Kerneels Bezuidenhout 36:9ca4125e526e 208 {
Kerneels Bezuidenhout 36:9ca4125e526e 209 calTimer.start();
Kerneels Bezuidenhout 36:9ca4125e526e 210 calHeldTime = calTimer.read();
Kerneels Bezuidenhout 36:9ca4125e526e 211
Kerneels Bezuidenhout 37:93c7563f2078 212 if( calHeldTime >= 5 )
Kerneels Bezuidenhout 36:9ca4125e526e 213 {
Kerneels Bezuidenhout 36:9ca4125e526e 214 while( test.read() );
Kerneels Bezuidenhout 36:9ca4125e526e 215
Kerneels Bezuidenhout 36:9ca4125e526e 216 calPoint++;
Kerneels Bezuidenhout 36:9ca4125e526e 217 calTimer.stop();
Kerneels Bezuidenhout 36:9ca4125e526e 218 calTimer.reset();
Kerneels Bezuidenhout 36:9ca4125e526e 219 }
Kerneels Bezuidenhout 36:9ca4125e526e 220 }
Kerneels Bezuidenhout 35:6baa558d3b86 221 else
Kerneels Bezuidenhout 35:6baa558d3b86 222 {
Kerneels Bezuidenhout 37:93c7563f2078 223 calTimer.stop();
Kerneels Bezuidenhout 35:6baa558d3b86 224 calTimer.reset();
Kerneels Bezuidenhout 35:6baa558d3b86 225 }
Kerneels Bezuidenhout 35:6baa558d3b86 226 }
Kerneels Bezuidenhout 37:93c7563f2078 227 else
Kerneels Bezuidenhout 37:93c7563f2078 228 {
Kerneels Bezuidenhout 37:93c7563f2078 229 calFinished = true;
Kerneels Bezuidenhout 37:93c7563f2078 230 calPoint = 0;
Kerneels Bezuidenhout 37:93c7563f2078 231 calStarted = false;
Kerneels Bezuidenhout 37:93c7563f2078 232 }
Kerneels Bezuidenhout 35:6baa558d3b86 233 }
Kerneels Bezuidenhout 34:0b308a399f72 234 }