Quad RGB sensor with SPI output drive, I2C display interface & analogue inputs / UI for various LED types

Dependencies:   MCP23S17 PCF8574 TextLCD eeprom mbed-dev

Committer:
jolyon
Date:
Mon Oct 10 15:08:44 2016 +0000
Revision:
8:e6e4eece90f7
Parent:
7:9c5bca0ac9d7
Child:
9:077d1ad96bca
Working build with LPC1764 & inverted LED's

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jolyon 0:9d301ae51ecf 1 #include "mbed.h"
jolyon 0:9d301ae51ecf 2 #include "TextLCD.h"
jolyon 2:4a8eacbb3657 3 #include "MCP23S17.h"
jolyon 0:9d301ae51ecf 4
jolyon 0:9d301ae51ecf 5 #define FACTOR 1
jolyon 0:9d301ae51ecf 6
jolyon 0:9d301ae51ecf 7 #define SENSOR_ADDR (41 << 1)
jolyon 1:d99dad8a1f50 8 #define SENSOR_WHITE_REG 148
jolyon 1:d99dad8a1f50 9 #define SENSOR_RED_REG 150
jolyon 1:d99dad8a1f50 10 #define SENSOR_GREEN_REG 152
jolyon 1:d99dad8a1f50 11 #define SENSOR_BLUE_REG 154
jolyon 1:d99dad8a1f50 12
jolyon 3:b8218b61b0e2 13 #define WHITE_THRESHOLD 15
jolyon 3:b8218b61b0e2 14
jolyon 3:b8218b61b0e2 15 //--------------------------------------
jolyon 3:b8218b61b0e2 16 //each LED type is defined here
jolyon 3:b8218b61b0e2 17 #define NOTUSED 0
jolyon 3:b8218b61b0e2 18 #define STD_RED 1
jolyon 3:b8218b61b0e2 19 #define STD_GREEN 2
jolyon 3:b8218b61b0e2 20 #define STD_BLUE 3
jolyon 3:b8218b61b0e2 21 #define STD_YELLOW 4
jolyon 3:b8218b61b0e2 22 #define GREEN_YELLOW 5
jolyon 3:b8218b61b0e2 23 #define RGB 6
jolyon 3:b8218b61b0e2 24
jolyon 3:b8218b61b0e2 25
jolyon 3:b8218b61b0e2 26 //--------------------------------------
jolyon 3:b8218b61b0e2 27 //Current LED Colour Definitions
jolyon 3:b8218b61b0e2 28 #define ERROR 0 //off or wrong
jolyon 3:b8218b61b0e2 29 #define RED 1
jolyon 3:b8218b61b0e2 30 #define GREEN 2
jolyon 3:b8218b61b0e2 31 #define BLUE 3
jolyon 3:b8218b61b0e2 32 #define YELLOW 4
jolyon 3:b8218b61b0e2 33
jolyon 3:b8218b61b0e2 34
jolyon 3:b8218b61b0e2 35
jolyon 3:b8218b61b0e2 36 //--------------------------------------
jolyon 1:d99dad8a1f50 37
jolyon 1:d99dad8a1f50 38
jolyon 5:dc77c5967412 39 void SelectSensorPort(uint8_t SensorID);
jolyon 0:9d301ae51ecf 40
jolyon 0:9d301ae51ecf 41 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 42 //----------- LED's -------------------------------------------------------------
jolyon 0:9d301ae51ecf 43 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 44 // Detection LED's use the onboard MBED LED's
jolyon 0:9d301ae51ecf 45 // These are all blue on the MBED but on DSE PCB they areas follows
jolyon 0:9d301ae51ecf 46 // LED1 = GREEN
jolyon 0:9d301ae51ecf 47 // LED2 = BLUE
jolyon 0:9d301ae51ecf 48 // LED3 = RED
jolyon 0:9d301ae51ecf 49 // LED4 = YELLOW
jolyon 0:9d301ae51ecf 50 DigitalOut GreenLed(LED1);
jolyon 0:9d301ae51ecf 51 DigitalOut BlueLed(LED2);
jolyon 0:9d301ae51ecf 52 DigitalOut RedLed(LED3);
jolyon 0:9d301ae51ecf 53 DigitalOut YellowLed(LED4);
jolyon 0:9d301ae51ecf 54
jolyon 5:dc77c5967412 55 //I2C address selection pins
jolyon 5:dc77c5967412 56 DigitalOut I2C_ID_Bit0(p13);
jolyon 5:dc77c5967412 57 DigitalOut I2C_ID_Bit1(p14);
jolyon 5:dc77c5967412 58 DigitalOut I2C_ID_Bit2(p12);
jolyon 5:dc77c5967412 59 DigitalOut I2C_ID_Bit3(p11);
jolyon 5:dc77c5967412 60
jolyon 8:e6e4eece90f7 61 //mode switch
jolyon 8:e6e4eece90f7 62 DigitalIn ModeSwitch1(p19);
jolyon 8:e6e4eece90f7 63 DigitalIn ModeSwitch2(p29);
jolyon 8:e6e4eece90f7 64 DigitalIn ModeSwitch3(p30);
jolyon 8:e6e4eece90f7 65
jolyon 8:e6e4eece90f7 66
jolyon 0:9d301ae51ecf 67 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 68
jolyon 0:9d301ae51ecf 69 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 70 //----------- Analogue Inputs ---------------------------------------------------
jolyon 0:9d301ae51ecf 71 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 72 //Analogue inputs are used to set thresholds for detector levels
jolyon 2:4a8eacbb3657 73 //AnalogIn RedTrimmer(p15);
jolyon 2:4a8eacbb3657 74 //AnalogIn GreenTrimmer(p16);
jolyon 2:4a8eacbb3657 75 //AnalogIn BlueTrimmer(p17);
jolyon 2:4a8eacbb3657 76 //AnalogIn HysTrimmer(p18);
jolyon 0:9d301ae51ecf 77 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 78
jolyon 0:9d301ae51ecf 79 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 80 //------------ Text display -----------------------------------------------------
jolyon 0:9d301ae51ecf 81 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 82 //debug display. Standard display driver set up in 4 bit mode
jolyon 0:9d301ae51ecf 83 //final version uses I2C port
jolyon 8:e6e4eece90f7 84 //TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
jolyon 0:9d301ae51ecf 85
jolyon 0:9d301ae51ecf 86 //set up I2C Communication to LCD
jolyon 8:e6e4eece90f7 87 I2C i2c_lcd(p9,p10); // SDA, SCL
jolyon 0:9d301ae51ecf 88
jolyon 0:9d301ae51ecf 89 //I2C Portexpander PCF8574 for LCD
jolyon 8:e6e4eece90f7 90 TextLCD_I2C lcd(&i2c_lcd, 0x40, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type ok
jolyon 0:9d301ae51ecf 91
jolyon 0:9d301ae51ecf 92 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 93
jolyon 2:4a8eacbb3657 94 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 95 //------------ Create SPI bus -----------------------------------------------------
jolyon 2:4a8eacbb3657 96 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 97 //set up the SPI port for use as output driver
jolyon 2:4a8eacbb3657 98 SPI spi(p5, p6, p7);
jolyon 2:4a8eacbb3657 99
jolyon 2:4a8eacbb3657 100 char Opcode = 0x40;
jolyon 2:4a8eacbb3657 101
jolyon 2:4a8eacbb3657 102 // Next create a MCP23S17
jolyon 2:4a8eacbb3657 103 // mbed p20 is connected to ~chipSelect on the MCP23S17
jolyon 2:4a8eacbb3657 104 MCP23S17 chip = MCP23S17(spi, p20, Opcode);
jolyon 2:4a8eacbb3657 105
jolyon 2:4a8eacbb3657 106 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 107
jolyon 0:9d301ae51ecf 108 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 109 //------------ colour sensor Comms Pins -----------------------------------------
jolyon 0:9d301ae51ecf 110 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 111 //TMC Sensor: this is the raw I2C Port, the clock like is muxed
jolyon 0:9d301ae51ecf 112 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 113
jolyon 0:9d301ae51ecf 114
jolyon 0:9d301ae51ecf 115 typedef struct{
jolyon 0:9d301ae51ecf 116 uint16_t White;
jolyon 0:9d301ae51ecf 117 uint16_t Red;
jolyon 0:9d301ae51ecf 118 uint16_t Green;
jolyon 0:9d301ae51ecf 119 uint16_t Blue;
jolyon 0:9d301ae51ecf 120 }Colour;
jolyon 0:9d301ae51ecf 121
jolyon 0:9d301ae51ecf 122 Colour SensorData;
jolyon 0:9d301ae51ecf 123
jolyon 0:9d301ae51ecf 124 //-------------------------------------------------------------------------------
jolyon 3:b8218b61b0e2 125 //The system looks up the type of LED that is being detected for Each sensor and will fill in the result table & update the associated Output list
jolyon 3:b8218b61b0e2 126 //outputs start at 0 torough to 15
jolyon 8:e6e4eece90f7 127 /*
jolyon 4:dce5fc58abe9 128 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 7:9c5bca0ac9d7 129 GREEN_YELLOW, 0, //sensor 0 , uses 2 outputs - 0,1
jolyon 8:e6e4eece90f7 130 NOTUSED, 2, //sensor 1 , uses 2 outputs - 2,3
jolyon 8:e6e4eece90f7 131 NOTUSED, 4, //sensor 2 , uses 1 outputs - 4
jolyon 8:e6e4eece90f7 132 NOTUSED, 5, //sensor 3 , uses 1 outputs - 5
jolyon 8:e6e4eece90f7 133 NOTUSED, 6, //sensor 4
jolyon 8:e6e4eece90f7 134 NOTUSED, 7, //sensor 5
jolyon 8:e6e4eece90f7 135 NOTUSED, 8, //sensor 6
jolyon 8:e6e4eece90f7 136 NOTUSED, 9, //sensor 7
jolyon 8:e6e4eece90f7 137 NOTUSED, 10, //sensor 8
jolyon 8:e6e4eece90f7 138 NOTUSED, 11, //sensor 9
jolyon 8:e6e4eece90f7 139 NOTUSED, 12, //sensor 10
jolyon 8:e6e4eece90f7 140 NOTUSED, 13, //sensor 11
jolyon 8:e6e4eece90f7 141 NOTUSED, 14, //sensor 12
jolyon 8:e6e4eece90f7 142 NOTUSED, 15, //sensor 13
jolyon 4:dce5fc58abe9 143 NOTUSED, 15, //sensor 14
jolyon 4:dce5fc58abe9 144 NOTUSED, 15, //sensor 15
jolyon 3:b8218b61b0e2 145 };
jolyon 8:e6e4eece90f7 146 */
jolyon 8:e6e4eece90f7 147
jolyon 8:e6e4eece90f7 148 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 8:e6e4eece90f7 149 GREEN_YELLOW, 0, //sensor 0 , uses 2 outputs - 0,1
jolyon 8:e6e4eece90f7 150 GREEN_YELLOW, 2, //sensor 1 , uses 2 outputs - 2,3
jolyon 8:e6e4eece90f7 151 STD_RED, 4, //sensor 2 , uses 1 outputs - 4
jolyon 8:e6e4eece90f7 152 STD_RED, 5, //sensor 3 , uses 1 outputs - 5
jolyon 8:e6e4eece90f7 153 NOTUSED, 6, //sensor 4
jolyon 8:e6e4eece90f7 154 NOTUSED, 7, //sensor 5
jolyon 8:e6e4eece90f7 155 NOTUSED, 8, //sensor 6
jolyon 8:e6e4eece90f7 156 NOTUSED, 9, //sensor 7
jolyon 8:e6e4eece90f7 157 NOTUSED, 10, //sensor 8
jolyon 8:e6e4eece90f7 158 NOTUSED, 11, //sensor 9
jolyon 8:e6e4eece90f7 159 NOTUSED, 12, //sensor 10
jolyon 8:e6e4eece90f7 160 NOTUSED, 13, //sensor 11
jolyon 8:e6e4eece90f7 161 NOTUSED, 14, //sensor 12
jolyon 8:e6e4eece90f7 162 NOTUSED, 15, //sensor 13
jolyon 8:e6e4eece90f7 163 NOTUSED, 15, //sensor 14
jolyon 8:e6e4eece90f7 164 NOTUSED, 15, //sensor 15
jolyon 8:e6e4eece90f7 165 };
jolyon 8:e6e4eece90f7 166
jolyon 7:9c5bca0ac9d7 167 /*
jolyon 5:dc77c5967412 168 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 5:dc77c5967412 169 STD_RED, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 5:dc77c5967412 170 STD_GREEN, 1, //sensor 1
jolyon 5:dc77c5967412 171 STD_RED, 2, //sensor 2
jolyon 5:dc77c5967412 172 STD_GREEN, 3, //sensor 3
jolyon 5:dc77c5967412 173 STD_RED, 4, //sensor 4
jolyon 5:dc77c5967412 174 STD_GREEN, 5, //sensor 5
jolyon 5:dc77c5967412 175 STD_RED, 6, //sensor 6
jolyon 5:dc77c5967412 176 STD_GREEN, 7, //sensor 7
jolyon 5:dc77c5967412 177 STD_RED, 8, //sensor 8
jolyon 5:dc77c5967412 178 STD_GREEN, 9, //sensor 9
jolyon 5:dc77c5967412 179 STD_RED, 10, //sensor 10
jolyon 5:dc77c5967412 180 STD_GREEN, 11, //sensor 11
jolyon 5:dc77c5967412 181 STD_RED, 12, //sensor 12
jolyon 5:dc77c5967412 182 STD_GREEN, 13, //sensor 13
jolyon 5:dc77c5967412 183 STD_RED, 14, //sensor 14
jolyon 5:dc77c5967412 184 STD_GREEN, 15, //sensor 15
jolyon 5:dc77c5967412 185 };
jolyon 7:9c5bca0ac9d7 186 */
jolyon 6:6346ef2b4638 187 //new config trpe
jolyon 6:6346ef2b4638 188
jolyon 6:6346ef2b4638 189
jolyon 3:b8218b61b0e2 190
jolyon 3:b8218b61b0e2 191 char LEDState[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //current detected LED states
jolyon 3:b8218b61b0e2 192
jolyon 3:b8218b61b0e2 193 uint16_t OutputData = 0; //word containing the current output states of the board
jolyon 8:e6e4eece90f7 194 uint16_t OutputDataB = 0x8000;// test roll
jolyon 3:b8218b61b0e2 195
jolyon 3:b8218b61b0e2 196 uint8_t SensorNumber = 0; //current sensor number
jolyon 3:b8218b61b0e2 197 char SensorResult = 0; //detected colour
jolyon 3:b8218b61b0e2 198
jolyon 6:6346ef2b4638 199 uint8_t ConfigureSensor;
jolyon 0:9d301ae51ecf 200
jolyon 0:9d301ae51ecf 201 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 202 int sensor_addr = 41 << 1;
jolyon 0:9d301ae51ecf 203
jolyon 3:b8218b61b0e2 204 uint8_t SensorConfig = 0x30;
jolyon 0:9d301ae51ecf 205 // bit description setting
jolyon 0:9d301ae51ecf 206 // 0 SD, 0 = enabled 0
jolyon 0:9d301ae51ecf 207 // 1 AF, 0 = Automode 0
jolyon 0:9d301ae51ecf 208 // 2 TRIG, 0 = no trigrer 0
jolyon 0:9d301ae51ecf 209 // 3 N/F, 0 0
jolyon 0:9d301ae51ecf 210 // 4 IT0 0 0
jolyon 0:9d301ae51ecf 211 // 5 IT1 1 = 160ms 1
jolyon 0:9d301ae51ecf 212 // 6 IT2 0 0
jolyon 0:9d301ae51ecf 213 // 7 N/F 0 0
jolyon 6:6346ef2b4638 214 //------------TSC Stuff----------------
jolyon 6:6346ef2b4638 215
jolyon 6:6346ef2b4638 216 uint16_t Red = 1;
jolyon 6:6346ef2b4638 217 uint16_t Green = 2;
jolyon 6:6346ef2b4638 218 uint16_t Blue = 3;
jolyon 6:6346ef2b4638 219 uint16_t White = 4;
jolyon 6:6346ef2b4638 220
jolyon 6:6346ef2b4638 221 uint32_t Temp = 0;
jolyon 6:6346ef2b4638 222
jolyon 6:6346ef2b4638 223 uint16_t RedProp = 0;
jolyon 6:6346ef2b4638 224 uint16_t GreenProp = 0;
jolyon 6:6346ef2b4638 225 uint16_t BlueProp = 0;
jolyon 0:9d301ae51ecf 226
jolyon 0:9d301ae51ecf 227
jolyon 2:4a8eacbb3657 228
jolyon 2:4a8eacbb3657 229 //working thresholds from pot inputs, scaled 0-100
jolyon 2:4a8eacbb3657 230 uint16_t RedThreshold = 0;
jolyon 2:4a8eacbb3657 231 uint16_t GreenThreshold = 0;
jolyon 2:4a8eacbb3657 232 uint16_t BlueThreshold = 0;
jolyon 2:4a8eacbb3657 233 uint16_t Hysteresis = 0;
jolyon 2:4a8eacbb3657 234
jolyon 6:6346ef2b4638 235 //------------------------- filter routine if required -------------------------------
jolyon 0:9d301ae51ecf 236 uint16_t Filter(uint32_t *Acc,uint16_t NewData, uint8_t factor)
jolyon 0:9d301ae51ecf 237 {
jolyon 0:9d301ae51ecf 238 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 239 Temp = *Acc >> factor ;
jolyon 0:9d301ae51ecf 240 Temp = *Acc - Temp + NewData;
jolyon 0:9d301ae51ecf 241 *Acc = Temp;
jolyon 0:9d301ae51ecf 242 return *Acc >> factor;
jolyon 0:9d301ae51ecf 243 }
jolyon 0:9d301ae51ecf 244
jolyon 0:9d301ae51ecf 245
jolyon 0:9d301ae51ecf 246 void ConfigureTSC(uint8_t Address)
jolyon 0:9d301ae51ecf 247 {
jolyon 0:9d301ae51ecf 248 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 249 i2c.frequency(200000);
jolyon 0:9d301ae51ecf 250
jolyon 6:6346ef2b4638 251 for (ConfigureSensor = 0; ConfigureSensor < 16; ConfigureSensor++)
jolyon 6:6346ef2b4638 252 {
jolyon 6:6346ef2b4638 253 if((Config[ConfigureSensor]<<1) != NOTUSED)
jolyon 6:6346ef2b4638 254 {
jolyon 6:6346ef2b4638 255 SelectSensorPort(ConfigureSensor); //set up H/W mux for this sensor
jolyon 6:6346ef2b4638 256
jolyon 6:6346ef2b4638 257 char id_regval[1] = {146};
jolyon 6:6346ef2b4638 258 char data[1] = {0};
jolyon 6:6346ef2b4638 259 i2c.write(sensor_addr,id_regval,1, true);
jolyon 6:6346ef2b4638 260 i2c.read(sensor_addr,data,1,false); // Initialize color sensor
jolyon 6:6346ef2b4638 261
jolyon 6:6346ef2b4638 262 char enable_register[2] = {128,3}; //enable the sensor
jolyon 6:6346ef2b4638 263 i2c.write(sensor_addr,enable_register,2,false);
jolyon 6:6346ef2b4638 264
jolyon 6:6346ef2b4638 265 char timing_register[2] = {0x81,0xC0}; //approx 100ms
jolyon 6:6346ef2b4638 266 i2c.write(sensor_addr,timing_register,2,false);
jolyon 6:6346ef2b4638 267
jolyon 6:6346ef2b4638 268 char control_register[2] = {0x8F,2}; //gain = x16
jolyon 6:6346ef2b4638 269 i2c.write(sensor_addr,control_register,2,false);
jolyon 6:6346ef2b4638 270 }
jolyon 0:9d301ae51ecf 271 }
jolyon 6:6346ef2b4638 272 }
jolyon 0:9d301ae51ecf 273
jolyon 0:9d301ae51ecf 274
jolyon 1:d99dad8a1f50 275 Colour GetSensorData(char SensorNumber)
jolyon 1:d99dad8a1f50 276 {
jolyon 1:d99dad8a1f50 277 Colour NewData;
jolyon 1:d99dad8a1f50 278 char AddrReg[1] = {0};
jolyon 1:d99dad8a1f50 279 char DataReg[5] ={0,0,0,0,0};
jolyon 5:dc77c5967412 280
jolyon 5:dc77c5967412 281
jolyon 5:dc77c5967412 282 SelectSensorPort(SensorNumber);
jolyon 1:d99dad8a1f50 283
jolyon 1:d99dad8a1f50 284 NewData.White = 0;
jolyon 1:d99dad8a1f50 285 NewData.Red = 0;
jolyon 1:d99dad8a1f50 286 NewData.Green = 0;
jolyon 1:d99dad8a1f50 287 NewData.Blue = 0;
jolyon 1:d99dad8a1f50 288
jolyon 1:d99dad8a1f50 289 AddrReg[0] = SENSOR_WHITE_REG;
jolyon 1:d99dad8a1f50 290 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 291 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 292 NewData.White = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 293
jolyon 1:d99dad8a1f50 294 AddrReg[0] = SENSOR_RED_REG;
jolyon 1:d99dad8a1f50 295 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 296 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 297 NewData.Red = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 298
jolyon 1:d99dad8a1f50 299 AddrReg[0] = SENSOR_GREEN_REG;
jolyon 1:d99dad8a1f50 300 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 301 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 302 NewData.Green = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 303
jolyon 1:d99dad8a1f50 304 AddrReg[0] = SENSOR_BLUE_REG;
jolyon 1:d99dad8a1f50 305 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 306 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 307 NewData.Blue = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 308
jolyon 1:d99dad8a1f50 309 return NewData;
jolyon 1:d99dad8a1f50 310 }
jolyon 1:d99dad8a1f50 311
jolyon 8:e6e4eece90f7 312 uint8_t GetModeSwitch(void)
jolyon 8:e6e4eece90f7 313 {
jolyon 8:e6e4eece90f7 314 uint8_t Result = 0;
jolyon 8:e6e4eece90f7 315
jolyon 8:e6e4eece90f7 316 if (!ModeSwitch1)
jolyon 8:e6e4eece90f7 317 {
jolyon 8:e6e4eece90f7 318 Result += 1;
jolyon 8:e6e4eece90f7 319 }
jolyon 8:e6e4eece90f7 320
jolyon 8:e6e4eece90f7 321 if (!ModeSwitch2)
jolyon 8:e6e4eece90f7 322 {
jolyon 8:e6e4eece90f7 323 Result += 2;
jolyon 8:e6e4eece90f7 324 }
jolyon 8:e6e4eece90f7 325
jolyon 8:e6e4eece90f7 326 if (!ModeSwitch3)
jolyon 8:e6e4eece90f7 327 {
jolyon 8:e6e4eece90f7 328 Result += 4;
jolyon 8:e6e4eece90f7 329 }
jolyon 8:e6e4eece90f7 330
jolyon 8:e6e4eece90f7 331 return Result;
jolyon 8:e6e4eece90f7 332 }
jolyon 8:e6e4eece90f7 333
jolyon 2:4a8eacbb3657 334 void InitOutputs(void)
jolyon 2:4a8eacbb3657 335 {
jolyon 2:4a8eacbb3657 336 // Set all 8 Port A bits to output direction
jolyon 2:4a8eacbb3657 337 chip.direction(PORT_A, 0x00);
jolyon 2:4a8eacbb3657 338 // Set all 8 Port B bits to output direction
jolyon 2:4a8eacbb3657 339 chip.direction(PORT_B, 0x00);
jolyon 2:4a8eacbb3657 340 }
jolyon 0:9d301ae51ecf 341
jolyon 2:4a8eacbb3657 342 void SetOutputBit(char bit)
jolyon 2:4a8eacbb3657 343 {
jolyon 2:4a8eacbb3657 344 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 345 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 346
jolyon 2:4a8eacbb3657 347 OutputWord <<= bit;
jolyon 4:dce5fc58abe9 348 OutputData |= OutputWord;
jolyon 4:dce5fc58abe9 349
jolyon 4:dce5fc58abe9 350 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 351 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 352
jolyon 4:dce5fc58abe9 353 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 354 //PortA |=BitA;
jolyon 4:dce5fc58abe9 355 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 356
jolyon 4:dce5fc58abe9 357 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 358 //PortB |=BitB;
jolyon 4:dce5fc58abe9 359 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 360 }
jolyon 2:4a8eacbb3657 361
jolyon 2:4a8eacbb3657 362 void ClearOutputBit(char bit)
jolyon 2:4a8eacbb3657 363 {
jolyon 2:4a8eacbb3657 364 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 365 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 366
jolyon 2:4a8eacbb3657 367 OutputWord <<= bit;
jolyon 2:4a8eacbb3657 368 OutputWord = ~OutputWord;
jolyon 4:dce5fc58abe9 369 OutputWord &= OutputWord;
jolyon 2:4a8eacbb3657 370
jolyon 4:dce5fc58abe9 371 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 372 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 373
jolyon 4:dce5fc58abe9 374 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 375 //PortA &=BitA;
jolyon 4:dce5fc58abe9 376 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 377
jolyon 4:dce5fc58abe9 378 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 379 //PortB &=BitB;
jolyon 4:dce5fc58abe9 380 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 381 }
jolyon 2:4a8eacbb3657 382
jolyon 2:4a8eacbb3657 383 void WriteOutputPort(uint16_t FullPort)
jolyon 2:4a8eacbb3657 384 {
jolyon 2:4a8eacbb3657 385 chip.write(PORT_A, FullPort & 0xFF);
jolyon 2:4a8eacbb3657 386 chip.write(PORT_B, FullPort >> 8);
jolyon 2:4a8eacbb3657 387 }
jolyon 2:4a8eacbb3657 388
jolyon 2:4a8eacbb3657 389
jolyon 2:4a8eacbb3657 390 void GetThresholds(void)
jolyon 2:4a8eacbb3657 391 {
jolyon 2:4a8eacbb3657 392 //Load the pot values ant make 0 to 100% value
jolyon 2:4a8eacbb3657 393 /*
jolyon 2:4a8eacbb3657 394 RedThreshold = RedTrimmer.read_u16() * 100 >> 11;
jolyon 2:4a8eacbb3657 395 GreenThreshold = GreenTrimmer.read_u16() * 100 >> 11;
jolyon 2:4a8eacbb3657 396 BlueThreshold = BlueTrimmer.read_u16() * 100 >> 11;
jolyon 3:b8218b61b0e2 397 Hysteresis = HysTrimmer.read_u16() * 100 >> 11;
jolyon 3:b8218b61b0e2 398 */
jolyon 2:4a8eacbb3657 399
jolyon 2:4a8eacbb3657 400 RedThreshold = 45;
jolyon 2:4a8eacbb3657 401 GreenThreshold = 35;
jolyon 2:4a8eacbb3657 402 BlueThreshold = 10;
jolyon 2:4a8eacbb3657 403 Hysteresis = 5;
jolyon 2:4a8eacbb3657 404 }
jolyon 0:9d301ae51ecf 405
jolyon 5:dc77c5967412 406 void SelectSensorPort(uint8_t SensorID)
jolyon 5:dc77c5967412 407 {
jolyon 5:dc77c5967412 408
jolyon 5:dc77c5967412 409 if ( SensorID < 16)
jolyon 5:dc77c5967412 410 {
jolyon 5:dc77c5967412 411 if((SensorID & 0x01) == 0x01)
jolyon 5:dc77c5967412 412 {
jolyon 5:dc77c5967412 413 I2C_ID_Bit0 = 1;
jolyon 5:dc77c5967412 414 }
jolyon 5:dc77c5967412 415 else
jolyon 5:dc77c5967412 416 {
jolyon 5:dc77c5967412 417 I2C_ID_Bit0 = 0;
jolyon 5:dc77c5967412 418 }
jolyon 5:dc77c5967412 419
jolyon 5:dc77c5967412 420 if((SensorID & 0x02) == 0x02)
jolyon 5:dc77c5967412 421 {
jolyon 5:dc77c5967412 422 I2C_ID_Bit1 = 1;
jolyon 5:dc77c5967412 423 }
jolyon 5:dc77c5967412 424 else
jolyon 5:dc77c5967412 425 {
jolyon 5:dc77c5967412 426 I2C_ID_Bit1 = 0;
jolyon 5:dc77c5967412 427 }
jolyon 5:dc77c5967412 428
jolyon 5:dc77c5967412 429 if((SensorID & 0x04) == 0x04)
jolyon 5:dc77c5967412 430 {
jolyon 5:dc77c5967412 431 I2C_ID_Bit2 = 1;
jolyon 5:dc77c5967412 432 }
jolyon 5:dc77c5967412 433 else
jolyon 5:dc77c5967412 434 {
jolyon 5:dc77c5967412 435 I2C_ID_Bit2 = 0;
jolyon 5:dc77c5967412 436 }
jolyon 5:dc77c5967412 437
jolyon 5:dc77c5967412 438 if((SensorID & 0x08) == 0x08)
jolyon 5:dc77c5967412 439 {
jolyon 5:dc77c5967412 440 I2C_ID_Bit3 = 1;
jolyon 5:dc77c5967412 441 }
jolyon 5:dc77c5967412 442 else
jolyon 5:dc77c5967412 443 {
jolyon 5:dc77c5967412 444 I2C_ID_Bit3 = 0;
jolyon 5:dc77c5967412 445 }
jolyon 5:dc77c5967412 446 }
jolyon 5:dc77c5967412 447 }
jolyon 5:dc77c5967412 448
jolyon 6:6346ef2b4638 449 void ScaleColours(void)
jolyon 6:6346ef2b4638 450 {
jolyon 6:6346ef2b4638 451 //make 12 bit only
jolyon 6:6346ef2b4638 452 Red >>=4;
jolyon 6:6346ef2b4638 453 Green >>=4;
jolyon 6:6346ef2b4638 454 Blue >>=4;
jolyon 6:6346ef2b4638 455 White >>=4;
jolyon 6:6346ef2b4638 456 }
jolyon 6:6346ef2b4638 457
jolyon 3:b8218b61b0e2 458
jolyon 3:b8218b61b0e2 459 void UpdateDisplay(void)
jolyon 3:b8218b61b0e2 460 {
jolyon 3:b8218b61b0e2 461 lcd.locate(0, 0);
jolyon 7:9c5bca0ac9d7 462 lcd.printf("R%02i G%02i B%02i W%03i",RedProp,GreenProp,BlueProp,White);
jolyon 3:b8218b61b0e2 463 lcd.locate(0, 1);
jolyon 8:e6e4eece90f7 464 //lcd.printf("R%02i G%02i B%02i H%02i ",RedThreshold, GreenThreshold, BlueThreshold, Hysteresis);
jolyon 8:e6e4eece90f7 465 lcd.printf("R%02i G%02i B%02i S%02i ",RedThreshold, GreenThreshold, BlueThreshold, GetModeSwitch() );
jolyon 3:b8218b61b0e2 466 }
jolyon 3:b8218b61b0e2 467
jolyon 3:b8218b61b0e2 468
jolyon 3:b8218b61b0e2 469 char GetResults(uint8_t ThisSensor)
jolyon 3:b8218b61b0e2 470 {
jolyon 3:b8218b61b0e2 471 char LEDColour = ERROR;
jolyon 4:dce5fc58abe9 472
jolyon 3:b8218b61b0e2 473 if(White > WHITE_THRESHOLD) //looking at intensity somthing is on!
jolyon 3:b8218b61b0e2 474 {
jolyon 3:b8218b61b0e2 475 switch(Config[(ThisSensor << 1)])
jolyon 3:b8218b61b0e2 476 {
jolyon 3:b8218b61b0e2 477 case STD_RED:
jolyon 3:b8218b61b0e2 478 {
jolyon 3:b8218b61b0e2 479 if((RedProp - GreenProp > 30) && (RedProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 480 {
jolyon 3:b8218b61b0e2 481 LEDColour = RED;
jolyon 3:b8218b61b0e2 482 }
jolyon 3:b8218b61b0e2 483 }
jolyon 3:b8218b61b0e2 484 break;
jolyon 3:b8218b61b0e2 485
jolyon 3:b8218b61b0e2 486 case STD_GREEN:
jolyon 3:b8218b61b0e2 487 {
jolyon 3:b8218b61b0e2 488 if((GreenProp - RedProp > 30) && (GreenProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 489 {
jolyon 3:b8218b61b0e2 490 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 491 }
jolyon 3:b8218b61b0e2 492 }
jolyon 3:b8218b61b0e2 493 break;
jolyon 3:b8218b61b0e2 494
jolyon 3:b8218b61b0e2 495 case STD_BLUE:
jolyon 3:b8218b61b0e2 496 {
jolyon 3:b8218b61b0e2 497 if((BlueProp - RedProp > 30) && (BlueProp - GreenProp > 30))
jolyon 3:b8218b61b0e2 498 {
jolyon 3:b8218b61b0e2 499 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 500 }
jolyon 3:b8218b61b0e2 501 }
jolyon 3:b8218b61b0e2 502 break;
jolyon 3:b8218b61b0e2 503
jolyon 3:b8218b61b0e2 504 case STD_YELLOW:
jolyon 3:b8218b61b0e2 505 {
jolyon 3:b8218b61b0e2 506 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 507 {
jolyon 3:b8218b61b0e2 508 LEDColour = YELLOW;
jolyon 3:b8218b61b0e2 509 }
jolyon 3:b8218b61b0e2 510 }
jolyon 3:b8218b61b0e2 511 break;
jolyon 3:b8218b61b0e2 512
jolyon 3:b8218b61b0e2 513 case GREEN_YELLOW:
jolyon 3:b8218b61b0e2 514 {
jolyon 3:b8218b61b0e2 515 if( (GreenProp <= (GreenThreshold-Hysteresis)) && (RedProp >=(RedThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 516 { //pretty sure it's Yellow
jolyon 3:b8218b61b0e2 517
jolyon 3:b8218b61b0e2 518 LEDColour = YELLOW;
jolyon 3:b8218b61b0e2 519 }
jolyon 3:b8218b61b0e2 520 else
jolyon 3:b8218b61b0e2 521 {
jolyon 3:b8218b61b0e2 522 if( (GreenProp > (GreenThreshold+Hysteresis)) && (RedProp <=(RedThreshold-Hysteresis)) )
jolyon 3:b8218b61b0e2 523 { //pretty sure it's green
jolyon 3:b8218b61b0e2 524 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 525 }
jolyon 3:b8218b61b0e2 526 }
jolyon 3:b8218b61b0e2 527 }
jolyon 3:b8218b61b0e2 528 break;
jolyon 3:b8218b61b0e2 529
jolyon 3:b8218b61b0e2 530 case RGB:
jolyon 3:b8218b61b0e2 531 {
jolyon 3:b8218b61b0e2 532 if((RedProp - GreenProp > 30) && (RedProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 533 {
jolyon 3:b8218b61b0e2 534 LEDColour = RED;
jolyon 3:b8218b61b0e2 535 }
jolyon 3:b8218b61b0e2 536 else
jolyon 3:b8218b61b0e2 537 {
jolyon 3:b8218b61b0e2 538 if((GreenProp - RedProp > 30) && (GreenProp - BlueProp > 30))
jolyon 3:b8218b61b0e2 539 {
jolyon 3:b8218b61b0e2 540 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 541 }
jolyon 3:b8218b61b0e2 542 else
jolyon 3:b8218b61b0e2 543 {
jolyon 3:b8218b61b0e2 544 if((BlueProp - RedProp > 30) && (BlueProp - GreenProp > 30))
jolyon 3:b8218b61b0e2 545 {
jolyon 3:b8218b61b0e2 546 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 547 }
jolyon 3:b8218b61b0e2 548 }
jolyon 3:b8218b61b0e2 549 }
jolyon 3:b8218b61b0e2 550 }
jolyon 3:b8218b61b0e2 551 break;
jolyon 3:b8218b61b0e2 552
jolyon 3:b8218b61b0e2 553 case NOTUSED:
jolyon 3:b8218b61b0e2 554 default:
jolyon 3:b8218b61b0e2 555 {
jolyon 3:b8218b61b0e2 556 LEDColour = ERROR;
jolyon 3:b8218b61b0e2 557 }
jolyon 3:b8218b61b0e2 558 break;
jolyon 3:b8218b61b0e2 559 }
jolyon 3:b8218b61b0e2 560 }
jolyon 3:b8218b61b0e2 561 return LEDColour;
jolyon 3:b8218b61b0e2 562 }
jolyon 3:b8218b61b0e2 563
jolyon 3:b8218b61b0e2 564
jolyon 4:dce5fc58abe9 565 void UpdateOutputs(void)
jolyon 4:dce5fc58abe9 566 {
jolyon 4:dce5fc58abe9 567 //good LED so turn on Outputs
jolyon 4:dce5fc58abe9 568 switch (Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 569 {
jolyon 4:dce5fc58abe9 570 case STD_RED:
jolyon 4:dce5fc58abe9 571 case STD_GREEN:
jolyon 4:dce5fc58abe9 572 case STD_BLUE:
jolyon 4:dce5fc58abe9 573 case STD_YELLOW:
jolyon 4:dce5fc58abe9 574 {
jolyon 4:dce5fc58abe9 575 if (SensorResult == Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 576 {
jolyon 4:dce5fc58abe9 577 SetOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 578 }
jolyon 4:dce5fc58abe9 579 else
jolyon 4:dce5fc58abe9 580 {
jolyon 4:dce5fc58abe9 581 ClearOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 582 }
jolyon 4:dce5fc58abe9 583 }
jolyon 4:dce5fc58abe9 584 break;
jolyon 4:dce5fc58abe9 585
jolyon 4:dce5fc58abe9 586 case GREEN_YELLOW:
jolyon 4:dce5fc58abe9 587 {
jolyon 4:dce5fc58abe9 588 if (SensorResult == YELLOW)
jolyon 4:dce5fc58abe9 589 {
jolyon 4:dce5fc58abe9 590 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 591 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 592 }
jolyon 4:dce5fc58abe9 593 else
jolyon 4:dce5fc58abe9 594 {
jolyon 4:dce5fc58abe9 595 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 596 {
jolyon 4:dce5fc58abe9 597 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 598 SetOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 599 }
jolyon 4:dce5fc58abe9 600 else
jolyon 4:dce5fc58abe9 601 {
jolyon 4:dce5fc58abe9 602 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 603 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 604 }
jolyon 4:dce5fc58abe9 605 }
jolyon 4:dce5fc58abe9 606 }
jolyon 4:dce5fc58abe9 607 break;
jolyon 4:dce5fc58abe9 608
jolyon 4:dce5fc58abe9 609 case RGB:
jolyon 4:dce5fc58abe9 610 {
jolyon 4:dce5fc58abe9 611 if (SensorResult == RED)
jolyon 4:dce5fc58abe9 612 {
jolyon 4:dce5fc58abe9 613 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 614 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 615 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 616 }
jolyon 4:dce5fc58abe9 617 else
jolyon 4:dce5fc58abe9 618 {
jolyon 4:dce5fc58abe9 619 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 620 {
jolyon 4:dce5fc58abe9 621 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 622 SetOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 623 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 624 }
jolyon 4:dce5fc58abe9 625 else
jolyon 4:dce5fc58abe9 626 {
jolyon 4:dce5fc58abe9 627 if (SensorResult == BLUE)
jolyon 4:dce5fc58abe9 628 {
jolyon 4:dce5fc58abe9 629 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 630 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 631 SetOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 632 }
jolyon 4:dce5fc58abe9 633 else
jolyon 4:dce5fc58abe9 634 {
jolyon 4:dce5fc58abe9 635 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 636 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 637 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 638 }
jolyon 4:dce5fc58abe9 639
jolyon 4:dce5fc58abe9 640 }
jolyon 4:dce5fc58abe9 641 }
jolyon 4:dce5fc58abe9 642 }
jolyon 4:dce5fc58abe9 643 break;
jolyon 4:dce5fc58abe9 644
jolyon 4:dce5fc58abe9 645 default:
jolyon 4:dce5fc58abe9 646 {
jolyon 4:dce5fc58abe9 647 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 648 }
jolyon 4:dce5fc58abe9 649 break;
jolyon 4:dce5fc58abe9 650 } //end switch
jolyon 4:dce5fc58abe9 651 }
jolyon 4:dce5fc58abe9 652
jolyon 4:dce5fc58abe9 653 void ShowLeds(char WhichColour)
jolyon 4:dce5fc58abe9 654 {
jolyon 8:e6e4eece90f7 655 RedLed = 1;
jolyon 8:e6e4eece90f7 656 GreenLed = 1;
jolyon 8:e6e4eece90f7 657 BlueLed = 1;
jolyon 8:e6e4eece90f7 658 YellowLed = 1;
jolyon 4:dce5fc58abe9 659 switch (WhichColour)
jolyon 4:dce5fc58abe9 660 {
jolyon 4:dce5fc58abe9 661 case RED:
jolyon 4:dce5fc58abe9 662 {
jolyon 8:e6e4eece90f7 663 RedLed = 0;
jolyon 4:dce5fc58abe9 664 }
jolyon 4:dce5fc58abe9 665 break;
jolyon 4:dce5fc58abe9 666
jolyon 4:dce5fc58abe9 667 case GREEN:
jolyon 4:dce5fc58abe9 668 {
jolyon 8:e6e4eece90f7 669 GreenLed = 0;
jolyon 4:dce5fc58abe9 670 }
jolyon 4:dce5fc58abe9 671 break;
jolyon 4:dce5fc58abe9 672
jolyon 4:dce5fc58abe9 673 case BLUE:
jolyon 4:dce5fc58abe9 674 {
jolyon 8:e6e4eece90f7 675 BlueLed = 0;
jolyon 4:dce5fc58abe9 676 }
jolyon 4:dce5fc58abe9 677 break;
jolyon 4:dce5fc58abe9 678
jolyon 4:dce5fc58abe9 679 case YELLOW:
jolyon 4:dce5fc58abe9 680 {
jolyon 8:e6e4eece90f7 681 YellowLed = 0;
jolyon 4:dce5fc58abe9 682 }
jolyon 4:dce5fc58abe9 683 break;
jolyon 4:dce5fc58abe9 684
jolyon 4:dce5fc58abe9 685 default:
jolyon 4:dce5fc58abe9 686 {
jolyon 4:dce5fc58abe9 687 }
jolyon 4:dce5fc58abe9 688 break;
jolyon 4:dce5fc58abe9 689 }
jolyon 4:dce5fc58abe9 690 }
jolyon 4:dce5fc58abe9 691
jolyon 4:dce5fc58abe9 692
jolyon 3:b8218b61b0e2 693
jolyon 0:9d301ae51ecf 694 int main()
jolyon 0:9d301ae51ecf 695 {
jolyon 6:6346ef2b4638 696 InitOutputs(); //set up output driver chip
jolyon 6:6346ef2b4638 697 ConfigureTSC(0); //Initialise all TCS34725's
jolyon 0:9d301ae51ecf 698
jolyon 1:d99dad8a1f50 699 while(1)
jolyon 1:d99dad8a1f50 700 {
jolyon 6:6346ef2b4638 701 GetThresholds(); //update thresholds
jolyon 6:6346ef2b4638 702 wait(0.1); //100ms Update Cycle
jolyon 4:dce5fc58abe9 703 OutputData = 0;
jolyon 2:4a8eacbb3657 704
jolyon 3:b8218b61b0e2 705 for(SensorNumber = 0; SensorNumber < 16; SensorNumber++)
jolyon 3:b8218b61b0e2 706 {
jolyon 4:dce5fc58abe9 707 if(Config[((SensorNumber << 1))] != NOTUSED) //check to see if the sensor is being used
jolyon 3:b8218b61b0e2 708 {
jolyon 3:b8218b61b0e2 709 SensorData = GetSensorData(SensorNumber);
jolyon 3:b8218b61b0e2 710
jolyon 3:b8218b61b0e2 711 White = SensorData.White;
jolyon 3:b8218b61b0e2 712 Red = SensorData.Red;
jolyon 3:b8218b61b0e2 713 Green = SensorData.Green;
jolyon 3:b8218b61b0e2 714 Blue = SensorData.Blue;
jolyon 0:9d301ae51ecf 715
jolyon 6:6346ef2b4638 716 ScaleColours();
jolyon 6:6346ef2b4638 717
jolyon 3:b8218b61b0e2 718 // work out % of colour mix
jolyon 3:b8218b61b0e2 719 Temp = (Red+Blue+Green);
jolyon 3:b8218b61b0e2 720 RedProp = (Red* 100) / Temp ;
jolyon 3:b8218b61b0e2 721 GreenProp = (Green* 100) / Temp ;
jolyon 3:b8218b61b0e2 722 BlueProp = (Blue* 100) / Temp ;
jolyon 3:b8218b61b0e2 723
jolyon 3:b8218b61b0e2 724 SensorResult = GetResults(SensorNumber);
jolyon 4:dce5fc58abe9 725 UpdateOutputs();
jolyon 8:e6e4eece90f7 726
jolyon 8:e6e4eece90f7 727 if (SensorNumber == GetModeSwitch())
jolyon 8:e6e4eece90f7 728 {
jolyon 8:e6e4eece90f7 729 UpdateDisplay();
jolyon 8:e6e4eece90f7 730 ShowLeds(SensorResult);
jolyon 8:e6e4eece90f7 731 }
jolyon 8:e6e4eece90f7 732
jolyon 3:b8218b61b0e2 733 } //end if
jolyon 8:e6e4eece90f7 734 else
jolyon 8:e6e4eece90f7 735 {
jolyon 8:e6e4eece90f7 736 if (SensorNumber == GetModeSwitch())
jolyon 8:e6e4eece90f7 737 {
jolyon 8:e6e4eece90f7 738 lcd.locate(0, 0);
jolyon 8:e6e4eece90f7 739 lcd.printf("INVALID SENSOR ");
jolyon 8:e6e4eece90f7 740 lcd.locate(0, 1);
jolyon 8:e6e4eece90f7 741 lcd.printf("%02i ",GetModeSwitch() );
jolyon 8:e6e4eece90f7 742 }
jolyon 8:e6e4eece90f7 743 }
jolyon 8:e6e4eece90f7 744
jolyon 8:e6e4eece90f7 745
jolyon 3:b8218b61b0e2 746 } //end for
jolyon 8:e6e4eece90f7 747 WriteOutputPort(OutputData);
jolyon 8:e6e4eece90f7 748 //WriteOutputPort(OutputDataB);
jolyon 8:e6e4eece90f7 749 //OutputDataB>>=1;
jolyon 8:e6e4eece90f7 750 //if(OutputDataB == 0)
jolyon 8:e6e4eece90f7 751 //{
jolyon 8:e6e4eece90f7 752 // OutputDataB = 0x8000;
jolyon 8:e6e4eece90f7 753 //}
jolyon 3:b8218b61b0e2 754 } //while(1)
jolyon 3:b8218b61b0e2 755 }//main