My final year project

Dependencies:   BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG SDFileSystem TS_DISCO_F746NG ResistiveTouchController Map CYS8218Controller MedianFilter

Committer:
Kerneels Bezuidenhout
Date:
Sat Oct 08 22:33:03 2016 +0200
Revision:
44:560ed042317c
Parent:
42:29ce1ff3b220
Child:
45:e5b175383624
Added map to x and y coordinates

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