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
globals.cpp@32:9a4046224b11, 2015-12-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |