3rd year group project. Electronic and Electrical Engineering. Heriot-Watt University. This is the code for the mbed for the Automatic Little Object Organiser (ALOO).

Dependencies:   MCP23017 TCS3472_I2C WattBob_TextLCD mbed

Committer:
dreamselec
Date:
Thu Dec 17 17:23:24 2015 +0100
Revision:
32:9a4046224b11
Parent:
30:c0bc92d009fe
Comments and clean up.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreamselec 32:9a4046224b11 1 //
dreamselec 32:9a4046224b11 2 // globals.cpp
dreamselec 32:9a4046224b11 3 // Created by Chandan Siyag on 13/11/2015.
dreamselec 32:9a4046224b11 4
dreamselec 2:7a55cb10259f 5 #include "globals.h"
dreamselec 9:dc8f155b71c8 6 #include "Block.h"
dreamselec 9:dc8f155b71c8 7 #include "fpga.h"
dreamselec 10:16ba52f8e025 8 #include "TCS3472_I2C.h"
dreamselec 10:16ba52f8e025 9 #include "MCP23017.h"
dreamselec 10:16ba52f8e025 10 #include "WattBob_TextLCD.h"
dreamselec 2:7a55cb10259f 11
dreamselec 7:b6e31bfdb2af 12 int kDefaultBaudRate = 19200;
dreamselec 32:9a4046224b11 13
dreamselec 20:4e0f0944f28f 14 int ColourSensorError = 0.5;
dreamselec 32:9a4046224b11 15 //SerialBase gParity = SerialBase::None, 2 = Even, 3 = Odd
dreamselec 2:7a55cb10259f 16 int gStopBits = 1;
dreamselec 28:7e4d29977d72 17 float gIntegrationTime = 2.5;
dreamselec 25:792540d69c49 18 int gToggleServoNumber = 0;
dreamselec 26:bbcc25418ffa 19 float currentMinError[3] = {0,0,0};
dreamselec 26:bbcc25418ffa 20 float currentMaxError[3] = {0,0,0};
dreamselec 20:4e0f0944f28f 21
dreamselec 32:9a4046224b11 22 // Intialise gloabl variables
dreamselec 29:9c0339e3c593 23 Block defaultHazBlock = Block(Block::Small, Block::Red);
dreamselec 29:9c0339e3c593 24 Block _HazBlock = Block(defaultHazBlock);
dreamselec 8:e1da2ae62885 25
dreamselec 32:9a4046224b11 26 // Default gloabl variables values
dreamselec 8:e1da2ae62885 27 bool connectedToPC = false;
dreamselec 10:16ba52f8e025 28 bool runServoTest = false;
dreamselec 23:db91aaa43a9e 29 bool runBreakBeamTest = false;
dreamselec 25:792540d69c49 30 bool runColourSensorTest = false;
dreamselec 25:792540d69c49 31 bool getColourSensorValue = false;
dreamselec 25:792540d69c49 32 bool getBlockColourValue = false;
dreamselec 29:9c0339e3c593 33 bool setNewHazBlock = false;
dreamselec 28:7e4d29977d72 34 bool pcModeChanged = false;
dreamselec 28:7e4d29977d72 35 int errorMultiplier = 1;
dreamselec 27:2cb1bdb7ae3d 36 int hazReadingCount = 1;
dreamselec 26:bbcc25418ffa 37
dreamselec 17:af373246bf80 38 PCModes currentMode = None;
dreamselec 18:44a1c1a30166 39 Controls currentState = Pause;
dreamselec 8:e1da2ae62885 40
dreamselec 32:9a4046224b11 41 /// Sets up the default hazardous block
dreamselec 20:4e0f0944f28f 42 void DefaultHazBlock(){
dreamselec 26:bbcc25418ffa 43
dreamselec 26:bbcc25418ffa 44 for (int i = 0; i < 3; i++){
dreamselec 29:9c0339e3c593 45 currentMaxError[i] = kMaxRedError[i];
dreamselec 29:9c0339e3c593 46 currentMinError[i] = kMinRedError[i];
dreamselec 26:bbcc25418ffa 47 }
dreamselec 20:4e0f0944f28f 48 Colour _minRedBlock = Colour();
dreamselec 20:4e0f0944f28f 49 Colour _maxRedBlock = Colour();
dreamselec 20:4e0f0944f28f 50 Colour _averageRedBlock = Colour();
dreamselec 20:4e0f0944f28f 51
dreamselec 20:4e0f0944f28f 52 for (int i = 0; i < 4; i++){
dreamselec 20:4e0f0944f28f 53 _minRedBlock.components[i] = kMinRedBlock[i];
dreamselec 20:4e0f0944f28f 54 _maxRedBlock.components[i] = kMaxRedBlock[i];
dreamselec 20:4e0f0944f28f 55 _averageRedBlock.components[i] = kAverageRedBlock[i];
dreamselec 20:4e0f0944f28f 56 }
dreamselec 20:4e0f0944f28f 57
dreamselec 26:bbcc25418ffa 58 defaultHazBlock.minColour = Colour(_minRedBlock);
dreamselec 26:bbcc25418ffa 59 defaultHazBlock.maxColour = Colour(_maxRedBlock);
dreamselec 26:bbcc25418ffa 60 defaultHazBlock.averageColour = Colour(_averageRedBlock);
dreamselec 26:bbcc25418ffa 61 defaultHazBlock.size = Block::Small;
dreamselec 20:4e0f0944f28f 62
dreamselec 26:bbcc25418ffa 63 _HazBlock = Block(defaultHazBlock);
dreamselec 26:bbcc25418ffa 64 }
dreamselec 26:bbcc25418ffa 65
dreamselec 32:9a4046224b11 66 /// Sends the supplied colours description to the PC
dreamselec 26:bbcc25418ffa 67 void printColourDescription(Colour colour){
dreamselec 26:bbcc25418ffa 68 pc.printf("Red: %.3f, Green: %.3f, Blue: %.3f, Clear: %.3f\n", colour.components[0], colour.components[1], colour.components[2], colour.components[3]);
dreamselec 26:bbcc25418ffa 69 }
dreamselec 26:bbcc25418ffa 70
dreamselec 32:9a4046224b11 71 /// Sends the block infomation to the PC.
dreamselec 26:bbcc25418ffa 72 void printBlockDescription(Block block){
dreamselec 26:bbcc25418ffa 73 pc.printf("VALUE:Size: %i\n", block.size);
dreamselec 26:bbcc25418ffa 74 printColourDescription(block.minColour);
dreamselec 26:bbcc25418ffa 75 printColourDescription(block.averageColour);
dreamselec 26:bbcc25418ffa 76 printColourDescription(block.maxColour);
dreamselec 26:bbcc25418ffa 77 //TODO: print errors
dreamselec 26:bbcc25418ffa 78 pc.printf(":VALUE");
dreamselec 20:4e0f0944f28f 79 }
dreamselec 20:4e0f0944f28f 80
dreamselec 32:9a4046224b11 81 /// Reads the switches on the MBED pressed.
dreamselec 32:9a4046224b11 82 /// Finishes on the Key-Up
dreamselec 10:16ba52f8e025 83 int readSwitches()
dreamselec 10:16ba52f8e025 84 {
dreamselec 20:4e0f0944f28f 85 if(i2cport->read_bit(8)) {
dreamselec 20:4e0f0944f28f 86 while (i2cport->read_bit(8)) { }
dreamselec 20:4e0f0944f28f 87 return 1;
dreamselec 20:4e0f0944f28f 88 } else if (i2cport->read_bit(9)) {
dreamselec 20:4e0f0944f28f 89 while (i2cport->read_bit(9)) { }
dreamselec 20:4e0f0944f28f 90 return 2;
dreamselec 20:4e0f0944f28f 91 } else if (i2cport->read_bit(10)) {
dreamselec 20:4e0f0944f28f 92 while (i2cport->read_bit(10)) { }
dreamselec 20:4e0f0944f28f 93 return 3;
dreamselec 20:4e0f0944f28f 94 } else if (i2cport->read_bit(11)) {
dreamselec 20:4e0f0944f28f 95 while (i2cport->read_bit(11)) { }
dreamselec 20:4e0f0944f28f 96 return 4;
dreamselec 20:4e0f0944f28f 97 } else {
dreamselec 20:4e0f0944f28f 98 return 0;
dreamselec 20:4e0f0944f28f 99 }
dreamselec 10:16ba52f8e025 100
dreamselec 8:e1da2ae62885 101 }
dreamselec 8:e1da2ae62885 102
dreamselec 32:9a4046224b11 103 /// Sets connecteToPC property to true when PC asks MBED to connect to itself.
dreamselec 10:16ba52f8e025 104 void connectToPC(CommandTypeRaw typeRaw)
dreamselec 10:16ba52f8e025 105 {
dreamselec 20:4e0f0944f28f 106 connectedToPC = true;
dreamselec 24:02c61793f90b 107 pc.printf("INFO:PC connected to MBED.\n");
dreamselec 10:16ba52f8e025 108 }
dreamselec 10:16ba52f8e025 109
dreamselec 32:9a4046224b11 110 /// Called when PC tells MBED to disconnect.
dreamselec 10:16ba52f8e025 111 void disconnectToPC(CommandTypeRaw typeRaw)
dreamselec 10:16ba52f8e025 112 {
dreamselec 24:02c61793f90b 113 pc.printf("INFO:PC disconnected to MBED.\n");
dreamselec 20:4e0f0944f28f 114 connectedToPC = false;
dreamselec 20:4e0f0944f28f 115 currentMode = None;
dreamselec 8:e1da2ae62885 116 }
dreamselec 8:e1da2ae62885 117
dreamselec 32:9a4046224b11 118 /// Sends all the information about the hazardous block to the PC.
dreamselec 32:9a4046224b11 119 /// Or sets the new hazardous block depending on the command type i.e. Set or Query
dreamselec 10:16ba52f8e025 120 void hazBlock(CommandTypeRaw typeRaw)
dreamselec 10:16ba52f8e025 121 {
dreamselec 20:4e0f0944f28f 122 if (typeRaw == Set) {
dreamselec 30:c0bc92d009fe 123 setNewHazBlock = true;
dreamselec 30:c0bc92d009fe 124 pc.printf("INFO: Setting new haz block.\n");
dreamselec 30:c0bc92d009fe 125 } else if (typeRaw == Query) {
dreamselec 30:c0bc92d009fe 126 pc.printf("VALUE:Hazardous Block:\n \tSize:%i \n \tMin Error:%.3f, %.3f, %.3f\n \t Max Error:%.3f, %.3f, %.3f\n:VALUE", _HazBlock.size, kMinError[_HazBlock.colour][1], kMinError[_HazBlock.colour][1], kMinError[_HazBlock.colour][2], kMaxError[_HazBlock.colour][0], kMaxError[_HazBlock.colour][1], kMaxError[_HazBlock.colour][2]);
dreamselec 30:c0bc92d009fe 127 pc.printf("VALUE:\tAverage Colour:%.3f, %.3f, %.3f, %.3f\n:VALUE", kAverageValues[_HazBlock.colour][0], kAverageValues[_HazBlock.colour][1], kAverageValues[_HazBlock.colour][2], kAverageValues[_HazBlock.colour][3]);
dreamselec 20:4e0f0944f28f 128 }
dreamselec 8:e1da2ae62885 129 }
dreamselec 8:e1da2ae62885 130
dreamselec 32:9a4046224b11 131 /// Placeholder function, not used anymore since it's done with hazBlock(!)
dreamselec 32:9a4046224b11 132 /// Is supposed to send information about next block.
dreamselec 10:16ba52f8e025 133 void getCurrentBlock(CommandTypeRaw typeRaw)
dreamselec 10:16ba52f8e025 134 {
dreamselec 20:4e0f0944f28f 135 pc.printf("DEBUG: Getting current block readings\n");
dreamselec 8:e1da2ae62885 136 }
dreamselec 8:e1da2ae62885 137
dreamselec 32:9a4046224b11 138 /// Sets colour sensor Integration time set by the PC.
dreamselec 15:777390eb5afd 139 void setIntegrationTimeTo(float integrationTime)
dreamselec 10:16ba52f8e025 140 {
dreamselec 25:792540d69c49 141 gIntegrationTime = integrationTime;
dreamselec 25:792540d69c49 142 rgbSensor.setIntegrationTime(gIntegrationTime);
dreamselec 30:c0bc92d009fe 143 pc.printf("DEBUG: Setting integration-time to %.2f.\n", gIntegrationTime);
dreamselec 8:e1da2ae62885 144 }
dreamselec 8:e1da2ae62885 145
dreamselec 32:9a4046224b11 146 /// Placeholder function. Done with colour sensor test mode.
dreamselec 32:9a4046224b11 147 /// Is supposed to send current colour sensor information at regular intervals.
dreamselec 10:16ba52f8e025 148 void previewOnPC(bool on)
dreamselec 10:16ba52f8e025 149 {
dreamselec 20:4e0f0944f28f 150 pc.printf("setting preview on pc to %i.\n", on);
dreamselec 8:e1da2ae62885 151 }
dreamselec 8:e1da2ae62885 152
dreamselec 32:9a4046224b11 153 /// Start/stop colour sensor test mode.
dreamselec 25:792540d69c49 154 void testColourSensor(Controls state){
dreamselec 25:792540d69c49 155 if (state == Start){
dreamselec 25:792540d69c49 156 pc.printf("INFO: Running colour test.\n");
dreamselec 25:792540d69c49 157 runColourSensorTest = true;
dreamselec 25:792540d69c49 158 } else if (state == Pause){
dreamselec 25:792540d69c49 159 pc.printf("INFO: Finished colour test.\n");
dreamselec 25:792540d69c49 160 runColourSensorTest = false;
dreamselec 25:792540d69c49 161 }
dreamselec 25:792540d69c49 162 }
dreamselec 25:792540d69c49 163
dreamselec 32:9a4046224b11 164 /// Sends current colour sensor values.
dreamselec 20:4e0f0944f28f 165 void readColourSensor()
dreamselec 20:4e0f0944f28f 166 {
dreamselec 20:4e0f0944f28f 167 int colourValue[4];
dreamselec 20:4e0f0944f28f 168 rgbSensor.getAllColors(colourValue);
dreamselec 32:9a4046224b11 169 pc.printf( "VALUE:Colour Reading:%i,%i,%i,%i\n:VALUE", colourValue[0], colourValue[1], colourValue[2], colourValue[3]);
dreamselec 18:44a1c1a30166 170
dreamselec 8:e1da2ae62885 171 }
dreamselec 8:e1da2ae62885 172
dreamselec 32:9a4046224b11 173 /// Enter/exit servo test mode.
dreamselec 17:af373246bf80 174 void testServos(Controls state)
dreamselec 10:16ba52f8e025 175 {
dreamselec 20:4e0f0944f28f 176 if (state == Start) {
dreamselec 20:4e0f0944f28f 177 pc.printf("INFO: Running servo test.\n");
dreamselec 20:4e0f0944f28f 178 runServoTest = true;
dreamselec 20:4e0f0944f28f 179 } else if (state == Pause) {
dreamselec 20:4e0f0944f28f 180 pc.printf("INFO: Finished running servo test.\n");
dreamselec 20:4e0f0944f28f 181 runServoTest = false;
dreamselec 20:4e0f0944f28f 182 }
dreamselec 8:e1da2ae62885 183 }
dreamselec 8:e1da2ae62885 184
dreamselec 32:9a4046224b11 185 /// Placeholder function. Servos now are always set to the default position i.e Non Hazardous (upright).
dreamselec 10:16ba52f8e025 186 void resetServos()
dreamselec 10:16ba52f8e025 187 {
dreamselec 20:4e0f0944f28f 188 pc.printf("resetting servos.\n");
dreamselec 8:e1da2ae62885 189 }
dreamselec 8:e1da2ae62885 190
dreamselec 32:9a4046224b11 191 /// Placeholder functions. The port info is sent every time port is opened, and updated every time anything changes.
dreamselec 10:16ba52f8e025 192 void getPortInfo()
dreamselec 10:16ba52f8e025 193 {
dreamselec 20:4e0f0944f28f 194 pc.printf("getting port info.\n");
dreamselec 8:e1da2ae62885 195 }
dreamselec 8:e1da2ae62885 196
dreamselec 32:9a4046224b11 197 /// Set the port baud rate to what PC told it to.
dreamselec 17:af373246bf80 198 void setPortBaudRate(int baudRate)
dreamselec 10:16ba52f8e025 199 {
dreamselec 20:4e0f0944f28f 200 pc.baud(baudRate);
dreamselec 20:4e0f0944f28f 201 wait(0.1);
dreamselec 20:4e0f0944f28f 202 pc.printf("DEBUG: Setting port Baud Rate to: %i.\n", baudRate);
dreamselec 10:16ba52f8e025 203 }
dreamselec 10:16ba52f8e025 204
dreamselec 32:9a4046224b11 205 /// Sets port parity according to the PC.
dreamselec 20:4e0f0944f28f 206 void setPortParity(int parity)
dreamselec 20:4e0f0944f28f 207 {
dreamselec 20:4e0f0944f28f 208 SerialBase::Parity _parity = static_cast<SerialBase::Parity>(parity);
dreamselec 20:4e0f0944f28f 209 pc.format(8, _parity, 1);
dreamselec 20:4e0f0944f28f 210 wait(0.1);
dreamselec 20:4e0f0944f28f 211 pc.printf("DEBUG: Setting port parity to: %i.\n", parity);
dreamselec 14:cf2f255b5560 212 }
dreamselec 23:db91aaa43a9e 213
dreamselec 32:9a4046224b11 214 /// Start/pause break beam test mode.
dreamselec 23:db91aaa43a9e 215 void testBreakBeams(Controls state){
dreamselec 23:db91aaa43a9e 216 if (state == Start){
dreamselec 23:db91aaa43a9e 217 pc.printf("INFO: Running break beam test.\n");
dreamselec 23:db91aaa43a9e 218 runBreakBeamTest = true;
dreamselec 23:db91aaa43a9e 219 }else if (state == Pause){
dreamselec 23:db91aaa43a9e 220 pc.printf("INFO: Exiting break beam test.\n");
dreamselec 23:db91aaa43a9e 221 runBreakBeamTest = false;
dreamselec 23:db91aaa43a9e 222 }
dreamselec 23:db91aaa43a9e 223 }