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:
Thu Apr 13 09:04:33 2017 +0000
Revision:
16:602edd2c90bd
Parent:
15:bf821fd83219
Quad RGB sensor  with UI Interface

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 13:ef2f1c11e33b 4 #include "eeprom.h"
jolyon 13:ef2f1c11e33b 5 #include "PCF8574.h"
jolyon 12:eab1bc88fe68 6
jolyon 0:9d301ae51ecf 7
jolyon 0:9d301ae51ecf 8 #define FACTOR 1
jolyon 0:9d301ae51ecf 9
jolyon 0:9d301ae51ecf 10 #define SENSOR_ADDR (41 << 1)
jolyon 1:d99dad8a1f50 11 #define SENSOR_WHITE_REG 148
jolyon 1:d99dad8a1f50 12 #define SENSOR_RED_REG 150
jolyon 1:d99dad8a1f50 13 #define SENSOR_GREEN_REG 152
jolyon 1:d99dad8a1f50 14 #define SENSOR_BLUE_REG 154
jolyon 1:d99dad8a1f50 15
jolyon 3:b8218b61b0e2 16 #define WHITE_THRESHOLD 15
jolyon 3:b8218b61b0e2 17
jolyon 3:b8218b61b0e2 18 //--------------------------------------
jolyon 3:b8218b61b0e2 19 //each LED type is defined here
jolyon 3:b8218b61b0e2 20 #define NOTUSED 0
jolyon 3:b8218b61b0e2 21 #define STD_RED 1
jolyon 3:b8218b61b0e2 22 #define STD_GREEN 2
jolyon 3:b8218b61b0e2 23 #define STD_BLUE 3
jolyon 3:b8218b61b0e2 24 #define STD_YELLOW 4
jolyon 3:b8218b61b0e2 25 #define GREEN_YELLOW 5
jolyon 3:b8218b61b0e2 26 #define RGB 6
jolyon 3:b8218b61b0e2 27
jolyon 3:b8218b61b0e2 28
jolyon 3:b8218b61b0e2 29 //--------------------------------------
jolyon 3:b8218b61b0e2 30 //Current LED Colour Definitions
jolyon 3:b8218b61b0e2 31 #define ERROR 0 //off or wrong
jolyon 3:b8218b61b0e2 32 #define RED 1
jolyon 3:b8218b61b0e2 33 #define GREEN 2
jolyon 3:b8218b61b0e2 34 #define BLUE 3
jolyon 3:b8218b61b0e2 35 #define YELLOW 4
jolyon 3:b8218b61b0e2 36
jolyon 3:b8218b61b0e2 37
jolyon 3:b8218b61b0e2 38
jolyon 3:b8218b61b0e2 39 //--------------------------------------
jolyon 11:729eb224dce6 40 #define NEWBUTTON 0x80
jolyon 13:ef2f1c11e33b 41 #define UPBUTTON 0x01
jolyon 13:ef2f1c11e33b 42 #define DOWNBUTTON 0x05
jolyon 13:ef2f1c11e33b 43 #define LEFTBUTTON 0x02
jolyon 13:ef2f1c11e33b 44 #define RIGHTBUTTON 0x04
jolyon 13:ef2f1c11e33b 45 #define TICKBUTTON 0x03
jolyon 13:ef2f1c11e33b 46
jolyon 13:ef2f1c11e33b 47
jolyon 1:d99dad8a1f50 48
jolyon 5:dc77c5967412 49 void SelectSensorPort(uint8_t SensorID);
jolyon 12:eab1bc88fe68 50 void CreateOutputTable(void);
jolyon 13:ef2f1c11e33b 51 void LoadSensorData(void);
jolyon 13:ef2f1c11e33b 52 void SaveSensorData(uint8_t Mode);
jolyon 0:9d301ae51ecf 53
jolyon 0:9d301ae51ecf 54 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 55 //----------- LED's -------------------------------------------------------------
jolyon 0:9d301ae51ecf 56 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 57 // Detection LED's use the onboard MBED LED's
jolyon 0:9d301ae51ecf 58 // These are all blue on the MBED but on DSE PCB they areas follows
jolyon 0:9d301ae51ecf 59 // LED1 = GREEN
jolyon 0:9d301ae51ecf 60 // LED2 = BLUE
jolyon 0:9d301ae51ecf 61 // LED3 = RED
jolyon 0:9d301ae51ecf 62 // LED4 = YELLOW
jolyon 0:9d301ae51ecf 63 DigitalOut GreenLed(LED1);
jolyon 0:9d301ae51ecf 64 DigitalOut BlueLed(LED2);
jolyon 0:9d301ae51ecf 65 DigitalOut RedLed(LED3);
jolyon 0:9d301ae51ecf 66 DigitalOut YellowLed(LED4);
jolyon 0:9d301ae51ecf 67
jolyon 5:dc77c5967412 68 //I2C address selection pins
jolyon 5:dc77c5967412 69 DigitalOut I2C_ID_Bit0(p13);
jolyon 5:dc77c5967412 70 DigitalOut I2C_ID_Bit1(p14);
jolyon 5:dc77c5967412 71 DigitalOut I2C_ID_Bit2(p12);
jolyon 5:dc77c5967412 72 DigitalOut I2C_ID_Bit3(p11);
jolyon 5:dc77c5967412 73
jolyon 8:e6e4eece90f7 74 //mode switch
jolyon 8:e6e4eece90f7 75 DigitalIn ModeSwitch1(p19);
jolyon 8:e6e4eece90f7 76 DigitalIn ModeSwitch2(p29);
jolyon 8:e6e4eece90f7 77 DigitalIn ModeSwitch3(p30);
jolyon 8:e6e4eece90f7 78
jolyon 11:729eb224dce6 79 //buttons
jolyon 11:729eb224dce6 80 DigitalIn Button1(p22);
jolyon 11:729eb224dce6 81 DigitalIn Button2(p23);
jolyon 11:729eb224dce6 82 DigitalIn Button3(p24);
jolyon 11:729eb224dce6 83 DigitalIn Button4(p8);
jolyon 8:e6e4eece90f7 84
jolyon 0:9d301ae51ecf 85 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 86
jolyon 0:9d301ae51ecf 87 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 88 //----------- Analogue Inputs ---------------------------------------------------
jolyon 0:9d301ae51ecf 89 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 90 //Analogue inputs are used to set thresholds for detector levels
jolyon 2:4a8eacbb3657 91 //AnalogIn RedTrimmer(p15);
jolyon 2:4a8eacbb3657 92 //AnalogIn GreenTrimmer(p16);
jolyon 2:4a8eacbb3657 93 //AnalogIn BlueTrimmer(p17);
jolyon 2:4a8eacbb3657 94 //AnalogIn HysTrimmer(p18);
jolyon 10:efe8585f7fa4 95
jolyon 10:efe8585f7fa4 96 AnalogIn Trimmer1(p15);
jolyon 10:efe8585f7fa4 97 AnalogIn Trimmer2(p16);
jolyon 10:efe8585f7fa4 98 AnalogIn Trimmer3(p17);
jolyon 10:efe8585f7fa4 99
jolyon 10:efe8585f7fa4 100 //-----------------------------------------------------
jolyon 0:9d301ae51ecf 101
jolyon 0:9d301ae51ecf 102 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 103 //------------ Text display -----------------------------------------------------
jolyon 0:9d301ae51ecf 104 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 105 //debug display. Standard display driver set up in 4 bit mode
jolyon 0:9d301ae51ecf 106 //final version uses I2C port
jolyon 8:e6e4eece90f7 107 //TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
jolyon 0:9d301ae51ecf 108
jolyon 0:9d301ae51ecf 109 //set up I2C Communication to LCD
jolyon 8:e6e4eece90f7 110 I2C i2c_lcd(p9,p10); // SDA, SCL
jolyon 0:9d301ae51ecf 111
jolyon 0:9d301ae51ecf 112 //I2C Portexpander PCF8574 for LCD
jolyon 8:e6e4eece90f7 113 TextLCD_I2C lcd(&i2c_lcd, 0x40, TextLCD::LCD16x2); // I2C bus, PCF8574 Slaveaddress, LCD Type ok
jolyon 0:9d301ae51ecf 114
jolyon 0:9d301ae51ecf 115 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 116
jolyon 2:4a8eacbb3657 117 //-------------------------------------------------------------------------------
jolyon 12:eab1bc88fe68 118 //------------ I2C EEProm -----------------------------------------------------
jolyon 12:eab1bc88fe68 119 //-------------------------------------------------------------------------------
jolyon 12:eab1bc88fe68 120
jolyon 12:eab1bc88fe68 121 //C24LCXX_I2C ConfigEEPROM(p9, p10, 0x01, p11, 400000); // Create an instance of the class C2424LCXX_I2C, p28: SDA, p29:SDL, p5: wired to WP input of 24LCxx, address: A3=0,A2=0,A=1, on 3.3V I2C bus
jolyon 12:eab1bc88fe68 122 //C24LCXX_I2C mem(p13, p14, 00000100, NC , 400000);
jolyon 12:eab1bc88fe68 123
jolyon 13:ef2f1c11e33b 124 //EEPROM ConfigMemory(p9, p10, 0x41, EEPROM::24C01);
jolyon 13:ef2f1c11e33b 125 EEPROM ConfigMemory(p9,p10,0,EEPROM::T24C01);
jolyon 12:eab1bc88fe68 126
jolyon 12:eab1bc88fe68 127
jolyon 12:eab1bc88fe68 128 //-------------------------------------------------------------------------------
jolyon 13:ef2f1c11e33b 129 //------------ I2C Buttons & LED Interface Chip -------------------------------
jolyon 13:ef2f1c11e33b 130 //-------------------------------------------------------------------------------
jolyon 13:ef2f1c11e33b 131
jolyon 13:ef2f1c11e33b 132 JPCF8574 Interface(p9,p10,0x42);
jolyon 13:ef2f1c11e33b 133
jolyon 13:ef2f1c11e33b 134 uint8_t IfButtons;
jolyon 13:ef2f1c11e33b 135
jolyon 13:ef2f1c11e33b 136 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 137 //------------ Create SPI bus -----------------------------------------------------
jolyon 2:4a8eacbb3657 138 //-------------------------------------------------------------------------------
jolyon 2:4a8eacbb3657 139 //set up the SPI port for use as output driver
jolyon 2:4a8eacbb3657 140 SPI spi(p5, p6, p7);
jolyon 2:4a8eacbb3657 141
jolyon 2:4a8eacbb3657 142 char Opcode = 0x40;
jolyon 2:4a8eacbb3657 143
jolyon 2:4a8eacbb3657 144 // Next create a MCP23S17
jolyon 2:4a8eacbb3657 145 // mbed p20 is connected to ~chipSelect on the MCP23S17
jolyon 2:4a8eacbb3657 146 MCP23S17 chip = MCP23S17(spi, p20, Opcode);
jolyon 2:4a8eacbb3657 147
jolyon 2:4a8eacbb3657 148 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 149
jolyon 0:9d301ae51ecf 150 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 151 //------------ colour sensor Comms Pins -----------------------------------------
jolyon 0:9d301ae51ecf 152 //-------------------------------------------------------------------------------
jolyon 0:9d301ae51ecf 153 //TMC Sensor: this is the raw I2C Port, the clock like is muxed
jolyon 0:9d301ae51ecf 154 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 155
jolyon 0:9d301ae51ecf 156
jolyon 0:9d301ae51ecf 157 typedef struct{
jolyon 0:9d301ae51ecf 158 uint16_t White;
jolyon 0:9d301ae51ecf 159 uint16_t Red;
jolyon 0:9d301ae51ecf 160 uint16_t Green;
jolyon 0:9d301ae51ecf 161 uint16_t Blue;
jolyon 0:9d301ae51ecf 162 }Colour;
jolyon 0:9d301ae51ecf 163
jolyon 0:9d301ae51ecf 164 Colour SensorData;
jolyon 0:9d301ae51ecf 165
jolyon 10:efe8585f7fa4 166
jolyon 10:efe8585f7fa4 167 //-------------------------------------------------------------------------------
jolyon 10:efe8585f7fa4 168 //------------ Serial Port for RS485 -----------------------------------------
jolyon 10:efe8585f7fa4 169 //-------------------------------------------------------------------------------
jolyon 10:efe8585f7fa4 170 Serial RS485(p26,p25);
jolyon 10:efe8585f7fa4 171 //DigitalOut RS485DIR(p21);
jolyon 10:efe8585f7fa4 172 char SendMessage = 0;
jolyon 10:efe8585f7fa4 173 char CommsData = 0;
jolyon 12:eab1bc88fe68 174
jolyon 12:eab1bc88fe68 175
jolyon 0:9d301ae51ecf 176 //-------------------------------------------------------------------------------
jolyon 3:b8218b61b0e2 177 //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 178 //outputs start at 0 torough to 15
jolyon 8:e6e4eece90f7 179 /*
jolyon 4:dce5fc58abe9 180 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 7:9c5bca0ac9d7 181 GREEN_YELLOW, 0, //sensor 0 , uses 2 outputs - 0,1
jolyon 8:e6e4eece90f7 182 NOTUSED, 2, //sensor 1 , uses 2 outputs - 2,3
jolyon 8:e6e4eece90f7 183 NOTUSED, 4, //sensor 2 , uses 1 outputs - 4
jolyon 8:e6e4eece90f7 184 NOTUSED, 5, //sensor 3 , uses 1 outputs - 5
jolyon 8:e6e4eece90f7 185 NOTUSED, 6, //sensor 4
jolyon 8:e6e4eece90f7 186 NOTUSED, 7, //sensor 5
jolyon 8:e6e4eece90f7 187 NOTUSED, 8, //sensor 6
jolyon 8:e6e4eece90f7 188 NOTUSED, 9, //sensor 7
jolyon 8:e6e4eece90f7 189 NOTUSED, 10, //sensor 8
jolyon 8:e6e4eece90f7 190 NOTUSED, 11, //sensor 9
jolyon 8:e6e4eece90f7 191 NOTUSED, 12, //sensor 10
jolyon 8:e6e4eece90f7 192 NOTUSED, 13, //sensor 11
jolyon 8:e6e4eece90f7 193 NOTUSED, 14, //sensor 12
jolyon 8:e6e4eece90f7 194 NOTUSED, 15, //sensor 13
jolyon 4:dce5fc58abe9 195 NOTUSED, 15, //sensor 14
jolyon 4:dce5fc58abe9 196 NOTUSED, 15, //sensor 15
jolyon 3:b8218b61b0e2 197 };
jolyon 8:e6e4eece90f7 198 */
jolyon 11:729eb224dce6 199 /*
jolyon 8:e6e4eece90f7 200 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 8:e6e4eece90f7 201 GREEN_YELLOW, 0, //sensor 0 , uses 2 outputs - 0,1
jolyon 8:e6e4eece90f7 202 GREEN_YELLOW, 2, //sensor 1 , uses 2 outputs - 2,3
jolyon 8:e6e4eece90f7 203 STD_RED, 4, //sensor 2 , uses 1 outputs - 4
jolyon 8:e6e4eece90f7 204 STD_RED, 5, //sensor 3 , uses 1 outputs - 5
jolyon 8:e6e4eece90f7 205 NOTUSED, 6, //sensor 4
jolyon 8:e6e4eece90f7 206 NOTUSED, 7, //sensor 5
jolyon 8:e6e4eece90f7 207 NOTUSED, 8, //sensor 6
jolyon 8:e6e4eece90f7 208 NOTUSED, 9, //sensor 7
jolyon 8:e6e4eece90f7 209 NOTUSED, 10, //sensor 8
jolyon 8:e6e4eece90f7 210 NOTUSED, 11, //sensor 9
jolyon 8:e6e4eece90f7 211 NOTUSED, 12, //sensor 10
jolyon 8:e6e4eece90f7 212 NOTUSED, 13, //sensor 11
jolyon 8:e6e4eece90f7 213 NOTUSED, 14, //sensor 12
jolyon 8:e6e4eece90f7 214 NOTUSED, 15, //sensor 13
jolyon 8:e6e4eece90f7 215 NOTUSED, 15, //sensor 14
jolyon 8:e6e4eece90f7 216 NOTUSED, 15, //sensor 15
jolyon 8:e6e4eece90f7 217 };
jolyon 11:729eb224dce6 218 */
jolyon 8:e6e4eece90f7 219
jolyon 5:dc77c5967412 220 char Config[32]={ //RGB, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 11:729eb224dce6 221 STD_RED, 0, //sensor 0 , uses 3 outputs - 0,1,2
jolyon 11:729eb224dce6 222 STD_GREEN, 1, //sensor 1
jolyon 11:729eb224dce6 223 STD_BLUE, 2, //sensor 2
jolyon 11:729eb224dce6 224 STD_YELLOW, 3, //sensor 3
jolyon 11:729eb224dce6 225 GREEN_YELLOW, 4, //sensor 4
jolyon 11:729eb224dce6 226 RGB, 5, //sensor 5
jolyon 11:729eb224dce6 227 STD_RED, 6, //sensor 6
jolyon 5:dc77c5967412 228 STD_GREEN, 7, //sensor 7
jolyon 11:729eb224dce6 229 STD_RED, 8, //sensor 8
jolyon 11:729eb224dce6 230 STD_RED, 9, //sensor 9
jolyon 11:729eb224dce6 231 STD_RED, 10, //sensor 10
jolyon 11:729eb224dce6 232 STD_RED, 11, //sensor 11
jolyon 11:729eb224dce6 233 STD_RED, 12, //sensor 12
jolyon 11:729eb224dce6 234 STD_RED, 13, //sensor 13
jolyon 11:729eb224dce6 235 STD_RED, 14, //sensor 14
jolyon 11:729eb224dce6 236 RGB, 15, //sensor 15
jolyon 5:dc77c5967412 237 };
jolyon 11:729eb224dce6 238
jolyon 6:6346ef2b4638 239 //new config trpe
jolyon 6:6346ef2b4638 240
jolyon 12:eab1bc88fe68 241 //LED Output requirement :type is defined here
jolyon 12:eab1bc88fe68 242 uint8_t OutputCount[7]={
jolyon 12:eab1bc88fe68 243 0, //NOTUSED
jolyon 12:eab1bc88fe68 244 1, //STD_RED
jolyon 12:eab1bc88fe68 245 1, //STD_GREEN
jolyon 12:eab1bc88fe68 246 1, //STD_BLUE
jolyon 12:eab1bc88fe68 247 1, //STD_YELLOW
jolyon 12:eab1bc88fe68 248 2, //GREEN_YELLOW
jolyon 12:eab1bc88fe68 249 3}; //RGB
jolyon 6:6346ef2b4638 250
jolyon 3:b8218b61b0e2 251
jolyon 3:b8218b61b0e2 252 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 253
jolyon 3:b8218b61b0e2 254 uint16_t OutputData = 0; //word containing the current output states of the board
jolyon 8:e6e4eece90f7 255 uint16_t OutputDataB = 0x8000;// test roll
jolyon 3:b8218b61b0e2 256
jolyon 3:b8218b61b0e2 257 uint8_t SensorNumber = 0; //current sensor number
jolyon 3:b8218b61b0e2 258 char SensorResult = 0; //detected colour
jolyon 3:b8218b61b0e2 259
jolyon 6:6346ef2b4638 260 uint8_t ConfigureSensor;
jolyon 0:9d301ae51ecf 261
jolyon 11:729eb224dce6 262 uint8_t DisplayScreen = 0;
jolyon 11:729eb224dce6 263 uint8_t DisplaySensorType;
jolyon 12:eab1bc88fe68 264 uint8_t DisplaySensorOutput = 0;
jolyon 11:729eb224dce6 265 uint8_t ButtonState = 0;
jolyon 11:729eb224dce6 266
jolyon 11:729eb224dce6 267 char LEDTypes[7][6+1]={
jolyon 11:729eb224dce6 268 "SPARE ", //0
jolyon 11:729eb224dce6 269 "RED ", //1
jolyon 11:729eb224dce6 270 "GREEN ", //2
jolyon 11:729eb224dce6 271 "BLUE ", //3
jolyon 11:729eb224dce6 272 "YELLOW", //4
jolyon 11:729eb224dce6 273 "GN/YEL", //5
jolyon 11:729eb224dce6 274 "RGB "
jolyon 11:729eb224dce6 275 }; //6
jolyon 11:729eb224dce6 276
jolyon 11:729eb224dce6 277
jolyon 0:9d301ae51ecf 278 //------------TSC Stuff----------------
jolyon 0:9d301ae51ecf 279 int sensor_addr = 41 << 1;
jolyon 0:9d301ae51ecf 280
jolyon 3:b8218b61b0e2 281 uint8_t SensorConfig = 0x30;
jolyon 0:9d301ae51ecf 282 // bit description setting
jolyon 0:9d301ae51ecf 283 // 0 SD, 0 = enabled 0
jolyon 0:9d301ae51ecf 284 // 1 AF, 0 = Automode 0
jolyon 0:9d301ae51ecf 285 // 2 TRIG, 0 = no trigrer 0
jolyon 0:9d301ae51ecf 286 // 3 N/F, 0 0
jolyon 0:9d301ae51ecf 287 // 4 IT0 0 0
jolyon 0:9d301ae51ecf 288 // 5 IT1 1 = 160ms 1
jolyon 0:9d301ae51ecf 289 // 6 IT2 0 0
jolyon 0:9d301ae51ecf 290 // 7 N/F 0 0
jolyon 6:6346ef2b4638 291 //------------TSC Stuff----------------
jolyon 6:6346ef2b4638 292
jolyon 6:6346ef2b4638 293 uint16_t Red = 1;
jolyon 6:6346ef2b4638 294 uint16_t Green = 2;
jolyon 6:6346ef2b4638 295 uint16_t Blue = 3;
jolyon 6:6346ef2b4638 296 uint16_t White = 4;
jolyon 6:6346ef2b4638 297
jolyon 6:6346ef2b4638 298 uint32_t Temp = 0;
jolyon 6:6346ef2b4638 299
jolyon 6:6346ef2b4638 300 uint16_t RedProp = 0;
jolyon 6:6346ef2b4638 301 uint16_t GreenProp = 0;
jolyon 6:6346ef2b4638 302 uint16_t BlueProp = 0;
jolyon 0:9d301ae51ecf 303
jolyon 0:9d301ae51ecf 304
jolyon 2:4a8eacbb3657 305
jolyon 2:4a8eacbb3657 306 //working thresholds from pot inputs, scaled 0-100
jolyon 14:02de92b0206a 307 //uint16_t RedThreshold = 0;
jolyon 14:02de92b0206a 308 //uint16_t GreenThreshold = 0;
jolyon 14:02de92b0206a 309 //uint16_t BlueThreshold = 0;
jolyon 2:4a8eacbb3657 310 uint16_t Hysteresis = 0;
jolyon 2:4a8eacbb3657 311
jolyon 10:efe8585f7fa4 312
jolyon 10:efe8585f7fa4 313 uint16_t SingleThreshold = 0;
jolyon 10:efe8585f7fa4 314 uint16_t MixRThreshold = 0;
jolyon 10:efe8585f7fa4 315 uint16_t MixGThreshold = 0;
jolyon 10:efe8585f7fa4 316
jolyon 6:6346ef2b4638 317 //------------------------- filter routine if required -------------------------------
jolyon 0:9d301ae51ecf 318 uint16_t Filter(uint32_t *Acc,uint16_t NewData, uint8_t factor)
jolyon 0:9d301ae51ecf 319 {
jolyon 0:9d301ae51ecf 320 uint32_t Temp = 0;
jolyon 0:9d301ae51ecf 321 Temp = *Acc >> factor ;
jolyon 0:9d301ae51ecf 322 Temp = *Acc - Temp + NewData;
jolyon 0:9d301ae51ecf 323 *Acc = Temp;
jolyon 0:9d301ae51ecf 324 return *Acc >> factor;
jolyon 0:9d301ae51ecf 325 }
jolyon 0:9d301ae51ecf 326
jolyon 0:9d301ae51ecf 327
jolyon 0:9d301ae51ecf 328 void ConfigureTSC(uint8_t Address)
jolyon 0:9d301ae51ecf 329 {
jolyon 0:9d301ae51ecf 330 I2C i2c(p28, p27); //pins for I2C communication (SDA, SCL)
jolyon 0:9d301ae51ecf 331 i2c.frequency(200000);
jolyon 0:9d301ae51ecf 332
jolyon 6:6346ef2b4638 333 for (ConfigureSensor = 0; ConfigureSensor < 16; ConfigureSensor++)
jolyon 6:6346ef2b4638 334 {
jolyon 9:077d1ad96bca 335 if((Config[ConfigureSensor <<1]) != NOTUSED)
jolyon 6:6346ef2b4638 336 {
jolyon 6:6346ef2b4638 337 SelectSensorPort(ConfigureSensor); //set up H/W mux for this sensor
jolyon 6:6346ef2b4638 338
jolyon 6:6346ef2b4638 339 char id_regval[1] = {146};
jolyon 6:6346ef2b4638 340 char data[1] = {0};
jolyon 6:6346ef2b4638 341 i2c.write(sensor_addr,id_regval,1, true);
jolyon 6:6346ef2b4638 342 i2c.read(sensor_addr,data,1,false); // Initialize color sensor
jolyon 6:6346ef2b4638 343
jolyon 6:6346ef2b4638 344 char enable_register[2] = {128,3}; //enable the sensor
jolyon 6:6346ef2b4638 345 i2c.write(sensor_addr,enable_register,2,false);
jolyon 6:6346ef2b4638 346
jolyon 6:6346ef2b4638 347 char timing_register[2] = {0x81,0xC0}; //approx 100ms
jolyon 6:6346ef2b4638 348 i2c.write(sensor_addr,timing_register,2,false);
jolyon 6:6346ef2b4638 349
jolyon 6:6346ef2b4638 350 char control_register[2] = {0x8F,2}; //gain = x16
jolyon 6:6346ef2b4638 351 i2c.write(sensor_addr,control_register,2,false);
jolyon 6:6346ef2b4638 352 }
jolyon 0:9d301ae51ecf 353 }
jolyon 6:6346ef2b4638 354 }
jolyon 0:9d301ae51ecf 355
jolyon 0:9d301ae51ecf 356
jolyon 1:d99dad8a1f50 357 Colour GetSensorData(char SensorNumber)
jolyon 1:d99dad8a1f50 358 {
jolyon 1:d99dad8a1f50 359 Colour NewData;
jolyon 1:d99dad8a1f50 360 char AddrReg[1] = {0};
jolyon 1:d99dad8a1f50 361 char DataReg[5] ={0,0,0,0,0};
jolyon 5:dc77c5967412 362
jolyon 5:dc77c5967412 363
jolyon 5:dc77c5967412 364 SelectSensorPort(SensorNumber);
jolyon 1:d99dad8a1f50 365
jolyon 1:d99dad8a1f50 366 NewData.White = 0;
jolyon 1:d99dad8a1f50 367 NewData.Red = 0;
jolyon 1:d99dad8a1f50 368 NewData.Green = 0;
jolyon 1:d99dad8a1f50 369 NewData.Blue = 0;
jolyon 1:d99dad8a1f50 370
jolyon 1:d99dad8a1f50 371 AddrReg[0] = SENSOR_WHITE_REG;
jolyon 1:d99dad8a1f50 372 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 373 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 374 NewData.White = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 375
jolyon 1:d99dad8a1f50 376 AddrReg[0] = SENSOR_RED_REG;
jolyon 1:d99dad8a1f50 377 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 378 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 379 NewData.Red = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 380
jolyon 1:d99dad8a1f50 381 AddrReg[0] = SENSOR_GREEN_REG;
jolyon 1:d99dad8a1f50 382 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 383 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 384 NewData.Green = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 385
jolyon 1:d99dad8a1f50 386 AddrReg[0] = SENSOR_BLUE_REG;
jolyon 1:d99dad8a1f50 387 i2c.write(SENSOR_ADDR, AddrReg,1, true);
jolyon 1:d99dad8a1f50 388 i2c.read(SENSOR_ADDR,DataReg,2, false);
jolyon 1:d99dad8a1f50 389 NewData.Blue = ((int)DataReg[1] << 8) | DataReg[0];
jolyon 1:d99dad8a1f50 390
jolyon 1:d99dad8a1f50 391 return NewData;
jolyon 1:d99dad8a1f50 392 }
jolyon 1:d99dad8a1f50 393
jolyon 8:e6e4eece90f7 394 uint8_t GetModeSwitch(void)
jolyon 8:e6e4eece90f7 395 {
jolyon 8:e6e4eece90f7 396 uint8_t Result = 0;
jolyon 8:e6e4eece90f7 397
jolyon 8:e6e4eece90f7 398 if (!ModeSwitch1)
jolyon 8:e6e4eece90f7 399 {
jolyon 8:e6e4eece90f7 400 Result += 1;
jolyon 8:e6e4eece90f7 401 }
jolyon 8:e6e4eece90f7 402
jolyon 8:e6e4eece90f7 403 if (!ModeSwitch2)
jolyon 8:e6e4eece90f7 404 {
jolyon 8:e6e4eece90f7 405 Result += 2;
jolyon 8:e6e4eece90f7 406 }
jolyon 8:e6e4eece90f7 407
jolyon 8:e6e4eece90f7 408 if (!ModeSwitch3)
jolyon 8:e6e4eece90f7 409 {
jolyon 8:e6e4eece90f7 410 Result += 4;
jolyon 8:e6e4eece90f7 411 }
jolyon 8:e6e4eece90f7 412
jolyon 8:e6e4eece90f7 413 return Result;
jolyon 8:e6e4eece90f7 414 }
jolyon 8:e6e4eece90f7 415
jolyon 11:729eb224dce6 416
jolyon 11:729eb224dce6 417 uint8_t GetButtonState(void)
jolyon 11:729eb224dce6 418 {
jolyon 11:729eb224dce6 419 uint8_t ButtonStateNew = 0;
jolyon 13:ef2f1c11e33b 420 uint8_t IfButtons;
jolyon 13:ef2f1c11e33b 421
jolyon 13:ef2f1c11e33b 422 IfButtons = Interface.read(); //returns 0 if fail. check this is ok
jolyon 13:ef2f1c11e33b 423
jolyon 13:ef2f1c11e33b 424 IfButtons = ~IfButtons;
jolyon 13:ef2f1c11e33b 425 IfButtons &= 0x1F;
jolyon 13:ef2f1c11e33b 426
jolyon 13:ef2f1c11e33b 427
jolyon 13:ef2f1c11e33b 428 if (IfButtons == 1)
jolyon 13:ef2f1c11e33b 429 {
jolyon 13:ef2f1c11e33b 430 ButtonStateNew = 1;
jolyon 13:ef2f1c11e33b 431 }
jolyon 13:ef2f1c11e33b 432
jolyon 13:ef2f1c11e33b 433 if (IfButtons == 2)
jolyon 13:ef2f1c11e33b 434 {
jolyon 13:ef2f1c11e33b 435 ButtonStateNew = 2;
jolyon 13:ef2f1c11e33b 436 }
jolyon 13:ef2f1c11e33b 437
jolyon 13:ef2f1c11e33b 438 if (IfButtons == 4)
jolyon 13:ef2f1c11e33b 439 {
jolyon 13:ef2f1c11e33b 440 ButtonStateNew = 3;
jolyon 13:ef2f1c11e33b 441 }
jolyon 13:ef2f1c11e33b 442 if (IfButtons == 8)
jolyon 13:ef2f1c11e33b 443 {
jolyon 13:ef2f1c11e33b 444 ButtonStateNew = 4;
jolyon 13:ef2f1c11e33b 445 }
jolyon 13:ef2f1c11e33b 446
jolyon 13:ef2f1c11e33b 447 if (IfButtons == 16)
jolyon 13:ef2f1c11e33b 448 {
jolyon 13:ef2f1c11e33b 449 ButtonStateNew = 5;
jolyon 13:ef2f1c11e33b 450 }
jolyon 13:ef2f1c11e33b 451
jolyon 13:ef2f1c11e33b 452
jolyon 13:ef2f1c11e33b 453 /*
jolyon 13:ef2f1c11e33b 454
jolyon 11:729eb224dce6 455 if (Button1 == 1)
jolyon 11:729eb224dce6 456 {
jolyon 11:729eb224dce6 457 ButtonStateNew = 1;
jolyon 11:729eb224dce6 458 }
jolyon 11:729eb224dce6 459
jolyon 11:729eb224dce6 460 if (Button2 == 1)
jolyon 11:729eb224dce6 461 {
jolyon 11:729eb224dce6 462 ButtonStateNew = 2;
jolyon 11:729eb224dce6 463 }
jolyon 11:729eb224dce6 464
jolyon 11:729eb224dce6 465 if (Button3 == 1)
jolyon 11:729eb224dce6 466 {
jolyon 11:729eb224dce6 467 ButtonStateNew = 3;
jolyon 11:729eb224dce6 468 }
jolyon 11:729eb224dce6 469 if (Button4 == 1)
jolyon 11:729eb224dce6 470 {
jolyon 11:729eb224dce6 471 ButtonStateNew = 4;
jolyon 11:729eb224dce6 472 }
jolyon 11:729eb224dce6 473
jolyon 13:ef2f1c11e33b 474 */
jolyon 11:729eb224dce6 475 if(ButtonStateNew != 0)
jolyon 11:729eb224dce6 476 {
jolyon 11:729eb224dce6 477 if(ButtonState == 0)
jolyon 11:729eb224dce6 478 {
jolyon 11:729eb224dce6 479 ButtonState = (ButtonStateNew | NEWBUTTON);
jolyon 11:729eb224dce6 480 }
jolyon 11:729eb224dce6 481 else
jolyon 11:729eb224dce6 482 {
jolyon 11:729eb224dce6 483 ButtonState = ButtonStateNew;
jolyon 11:729eb224dce6 484 }
jolyon 11:729eb224dce6 485 }
jolyon 11:729eb224dce6 486 else
jolyon 11:729eb224dce6 487 {
jolyon 11:729eb224dce6 488 ButtonState = 0;
jolyon 11:729eb224dce6 489 }
jolyon 11:729eb224dce6 490
jolyon 11:729eb224dce6 491
jolyon 11:729eb224dce6 492 return ButtonState;
jolyon 11:729eb224dce6 493 }
jolyon 11:729eb224dce6 494
jolyon 11:729eb224dce6 495
jolyon 2:4a8eacbb3657 496 void InitOutputs(void)
jolyon 2:4a8eacbb3657 497 {
jolyon 2:4a8eacbb3657 498 // Set all 8 Port A bits to output direction
jolyon 2:4a8eacbb3657 499 chip.direction(PORT_A, 0x00);
jolyon 2:4a8eacbb3657 500 // Set all 8 Port B bits to output direction
jolyon 2:4a8eacbb3657 501 chip.direction(PORT_B, 0x00);
jolyon 2:4a8eacbb3657 502 }
jolyon 0:9d301ae51ecf 503
jolyon 2:4a8eacbb3657 504 void SetOutputBit(char bit)
jolyon 2:4a8eacbb3657 505 {
jolyon 2:4a8eacbb3657 506 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 507 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 508
jolyon 2:4a8eacbb3657 509 OutputWord <<= bit;
jolyon 4:dce5fc58abe9 510 OutputData |= OutputWord;
jolyon 4:dce5fc58abe9 511
jolyon 4:dce5fc58abe9 512 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 513 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 514
jolyon 4:dce5fc58abe9 515 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 516 //PortA |=BitA;
jolyon 4:dce5fc58abe9 517 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 518
jolyon 4:dce5fc58abe9 519 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 520 //PortB |=BitB;
jolyon 4:dce5fc58abe9 521 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 522 }
jolyon 2:4a8eacbb3657 523
jolyon 2:4a8eacbb3657 524 void ClearOutputBit(char bit)
jolyon 2:4a8eacbb3657 525 {
jolyon 2:4a8eacbb3657 526 uint16_t OutputWord = 1;
jolyon 6:6346ef2b4638 527 // char BitA, BitB, PortA, PortB;
jolyon 2:4a8eacbb3657 528
jolyon 2:4a8eacbb3657 529 OutputWord <<= bit;
jolyon 2:4a8eacbb3657 530 OutputWord = ~OutputWord;
jolyon 4:dce5fc58abe9 531 OutputWord &= OutputWord;
jolyon 2:4a8eacbb3657 532
jolyon 4:dce5fc58abe9 533 //BitA = OutputWord & 0xFF;
jolyon 4:dce5fc58abe9 534 //BitB = OutputWord >> 8;
jolyon 2:4a8eacbb3657 535
jolyon 4:dce5fc58abe9 536 //PortA = chip.read(PORT_A);
jolyon 4:dce5fc58abe9 537 //PortA &=BitA;
jolyon 4:dce5fc58abe9 538 //chip.write(PORT_A, PortA);
jolyon 2:4a8eacbb3657 539
jolyon 4:dce5fc58abe9 540 //PortB = chip.read(PORT_B);
jolyon 4:dce5fc58abe9 541 //PortB &=BitB;
jolyon 4:dce5fc58abe9 542 //chip.write(PORT_B, PortB);
jolyon 2:4a8eacbb3657 543 }
jolyon 2:4a8eacbb3657 544
jolyon 2:4a8eacbb3657 545 void WriteOutputPort(uint16_t FullPort)
jolyon 2:4a8eacbb3657 546 {
jolyon 2:4a8eacbb3657 547 chip.write(PORT_A, FullPort & 0xFF);
jolyon 2:4a8eacbb3657 548 chip.write(PORT_B, FullPort >> 8);
jolyon 2:4a8eacbb3657 549 }
jolyon 2:4a8eacbb3657 550
jolyon 2:4a8eacbb3657 551
jolyon 2:4a8eacbb3657 552 void GetThresholds(void)
jolyon 2:4a8eacbb3657 553 {
jolyon 2:4a8eacbb3657 554 //Load the pot values ant make 0 to 100% value
jolyon 2:4a8eacbb3657 555
jolyon 10:efe8585f7fa4 556 SingleThreshold = 50 - ( Trimmer1.read_u16()/1310 );
jolyon 10:efe8585f7fa4 557 MixRThreshold = 50 - ( Trimmer2.read_u16() /1310 );
jolyon 10:efe8585f7fa4 558 MixGThreshold = 50 - ( Trimmer3.read_u16() /1310 );
jolyon 10:efe8585f7fa4 559 //Hysteresis = HysTrimmer.read_u16() * 100 >> 11;
jolyon 14:02de92b0206a 560 Hysteresis = 5; //fixed hysteresis
jolyon 14:02de92b0206a 561
jolyon 14:02de92b0206a 562 #define FIXED_THRESHOLDS
jolyon 10:efe8585f7fa4 563
jolyon 14:02de92b0206a 564 #ifdef FIXED_THRESHOLDS
jolyon 14:02de92b0206a 565
jolyon 14:02de92b0206a 566 SingleThreshold = 30;
jolyon 14:02de92b0206a 567 MixRThreshold = 45;
jolyon 15:bf821fd83219 568 MixGThreshold = 35; //first value but a bit too close
jolyon 14:02de92b0206a 569 #endif
jolyon 10:efe8585f7fa4 570
jolyon 14:02de92b0206a 571 //RedThreshold = 45; //default for yellow detect (red)
jolyon 14:02de92b0206a 572 //GreenThreshold = 35;//default for yellow detect (green)
jolyon 14:02de92b0206a 573 //BlueThreshold = 10;//not used
jolyon 2:4a8eacbb3657 574 }
jolyon 0:9d301ae51ecf 575
jolyon 5:dc77c5967412 576 void SelectSensorPort(uint8_t SensorID)
jolyon 5:dc77c5967412 577 {
jolyon 5:dc77c5967412 578
jolyon 5:dc77c5967412 579 if ( SensorID < 16)
jolyon 5:dc77c5967412 580 {
jolyon 5:dc77c5967412 581 if((SensorID & 0x01) == 0x01)
jolyon 5:dc77c5967412 582 {
jolyon 5:dc77c5967412 583 I2C_ID_Bit0 = 1;
jolyon 5:dc77c5967412 584 }
jolyon 5:dc77c5967412 585 else
jolyon 5:dc77c5967412 586 {
jolyon 5:dc77c5967412 587 I2C_ID_Bit0 = 0;
jolyon 5:dc77c5967412 588 }
jolyon 5:dc77c5967412 589
jolyon 5:dc77c5967412 590 if((SensorID & 0x02) == 0x02)
jolyon 5:dc77c5967412 591 {
jolyon 5:dc77c5967412 592 I2C_ID_Bit1 = 1;
jolyon 5:dc77c5967412 593 }
jolyon 5:dc77c5967412 594 else
jolyon 5:dc77c5967412 595 {
jolyon 5:dc77c5967412 596 I2C_ID_Bit1 = 0;
jolyon 5:dc77c5967412 597 }
jolyon 5:dc77c5967412 598
jolyon 5:dc77c5967412 599 if((SensorID & 0x04) == 0x04)
jolyon 5:dc77c5967412 600 {
jolyon 5:dc77c5967412 601 I2C_ID_Bit2 = 1;
jolyon 5:dc77c5967412 602 }
jolyon 5:dc77c5967412 603 else
jolyon 5:dc77c5967412 604 {
jolyon 5:dc77c5967412 605 I2C_ID_Bit2 = 0;
jolyon 5:dc77c5967412 606 }
jolyon 5:dc77c5967412 607
jolyon 5:dc77c5967412 608 if((SensorID & 0x08) == 0x08)
jolyon 5:dc77c5967412 609 {
jolyon 5:dc77c5967412 610 I2C_ID_Bit3 = 1;
jolyon 5:dc77c5967412 611 }
jolyon 5:dc77c5967412 612 else
jolyon 5:dc77c5967412 613 {
jolyon 5:dc77c5967412 614 I2C_ID_Bit3 = 0;
jolyon 5:dc77c5967412 615 }
jolyon 5:dc77c5967412 616 }
jolyon 5:dc77c5967412 617 }
jolyon 5:dc77c5967412 618
jolyon 6:6346ef2b4638 619 void ScaleColours(void)
jolyon 6:6346ef2b4638 620 {
jolyon 6:6346ef2b4638 621 //make 12 bit only
jolyon 6:6346ef2b4638 622 Red >>=4;
jolyon 6:6346ef2b4638 623 Green >>=4;
jolyon 6:6346ef2b4638 624 Blue >>=4;
jolyon 6:6346ef2b4638 625 White >>=4;
jolyon 6:6346ef2b4638 626 }
jolyon 6:6346ef2b4638 627
jolyon 3:b8218b61b0e2 628
jolyon 3:b8218b61b0e2 629 void UpdateDisplay(void)
jolyon 3:b8218b61b0e2 630 {
jolyon 3:b8218b61b0e2 631 lcd.locate(0, 0);
jolyon 7:9c5bca0ac9d7 632 lcd.printf("R%02i G%02i B%02i W%03i",RedProp,GreenProp,BlueProp,White);
jolyon 3:b8218b61b0e2 633 lcd.locate(0, 1);
jolyon 8:e6e4eece90f7 634 //lcd.printf("R%02i G%02i B%02i H%02i ",RedThreshold, GreenThreshold, BlueThreshold, Hysteresis);
jolyon 13:ef2f1c11e33b 635 lcd.printf("S%02i R%02i G%02i D%02i ",SingleThreshold, MixRThreshold, MixGThreshold, GetModeSwitch() );
jolyon 13:ef2f1c11e33b 636 //lcd.printf("Button Read %03i ",IfButtons);
jolyon 3:b8218b61b0e2 637 }
jolyon 3:b8218b61b0e2 638
jolyon 3:b8218b61b0e2 639
jolyon 3:b8218b61b0e2 640 char GetResults(uint8_t ThisSensor)
jolyon 3:b8218b61b0e2 641 {
jolyon 3:b8218b61b0e2 642 char LEDColour = ERROR;
jolyon 4:dce5fc58abe9 643
jolyon 3:b8218b61b0e2 644 if(White > WHITE_THRESHOLD) //looking at intensity somthing is on!
jolyon 3:b8218b61b0e2 645 {
jolyon 3:b8218b61b0e2 646 switch(Config[(ThisSensor << 1)])
jolyon 3:b8218b61b0e2 647 {
jolyon 3:b8218b61b0e2 648 case STD_RED:
jolyon 3:b8218b61b0e2 649 {
jolyon 10:efe8585f7fa4 650 if((RedProp - GreenProp > SingleThreshold) && (RedProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 651 {
jolyon 3:b8218b61b0e2 652 LEDColour = RED;
jolyon 3:b8218b61b0e2 653 }
jolyon 3:b8218b61b0e2 654 }
jolyon 3:b8218b61b0e2 655 break;
jolyon 3:b8218b61b0e2 656
jolyon 3:b8218b61b0e2 657 case STD_GREEN:
jolyon 3:b8218b61b0e2 658 {
jolyon 10:efe8585f7fa4 659 if((GreenProp - RedProp > SingleThreshold) && (GreenProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 660 {
jolyon 3:b8218b61b0e2 661 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 662 }
jolyon 3:b8218b61b0e2 663 }
jolyon 3:b8218b61b0e2 664 break;
jolyon 3:b8218b61b0e2 665
jolyon 3:b8218b61b0e2 666 case STD_BLUE:
jolyon 3:b8218b61b0e2 667 {
jolyon 10:efe8585f7fa4 668 if((BlueProp - RedProp > SingleThreshold) && (BlueProp - GreenProp > SingleThreshold))
jolyon 3:b8218b61b0e2 669 {
jolyon 3:b8218b61b0e2 670 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 671 }
jolyon 3:b8218b61b0e2 672 }
jolyon 3:b8218b61b0e2 673 break;
jolyon 3:b8218b61b0e2 674
jolyon 3:b8218b61b0e2 675 case STD_YELLOW:
jolyon 3:b8218b61b0e2 676 {
jolyon 10:efe8585f7fa4 677 if ((RedProp - GreenProp) < (2* SingleThreshold)) //check it is not red!
jolyon 9:077d1ad96bca 678 {
jolyon 10:efe8585f7fa4 679 if( (GreenProp <= (MixGThreshold-Hysteresis)) && (RedProp >=(MixRThreshold+Hysteresis)) )
jolyon 9:077d1ad96bca 680 {
jolyon 9:077d1ad96bca 681 LEDColour = YELLOW;
jolyon 9:077d1ad96bca 682 }
jolyon 3:b8218b61b0e2 683 }
jolyon 3:b8218b61b0e2 684 }
jolyon 3:b8218b61b0e2 685 break;
jolyon 3:b8218b61b0e2 686
jolyon 3:b8218b61b0e2 687 case GREEN_YELLOW:
jolyon 3:b8218b61b0e2 688 {
jolyon 9:077d1ad96bca 689
jolyon 10:efe8585f7fa4 690 if( (GreenProp <= (MixGThreshold-Hysteresis)) && (RedProp >=(MixRThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 691 { //pretty sure it's Yellow
jolyon 9:077d1ad96bca 692 if ((RedProp - GreenProp) < 60) //check it is not red!
jolyon 9:077d1ad96bca 693 {
jolyon 9:077d1ad96bca 694 LEDColour = YELLOW;
jolyon 9:077d1ad96bca 695 }
jolyon 3:b8218b61b0e2 696 }
jolyon 3:b8218b61b0e2 697 else
jolyon 3:b8218b61b0e2 698 {
jolyon 10:efe8585f7fa4 699 if( (GreenProp > (MixGThreshold+Hysteresis)) && (RedProp <=(MixRThreshold-Hysteresis)) )
jolyon 3:b8218b61b0e2 700 { //pretty sure it's green
jolyon 3:b8218b61b0e2 701 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 702 }
jolyon 3:b8218b61b0e2 703 }
jolyon 3:b8218b61b0e2 704 }
jolyon 3:b8218b61b0e2 705 break;
jolyon 3:b8218b61b0e2 706
jolyon 3:b8218b61b0e2 707 case RGB:
jolyon 3:b8218b61b0e2 708 {
jolyon 10:efe8585f7fa4 709 if((RedProp - GreenProp > SingleThreshold) && (RedProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 710 {
jolyon 3:b8218b61b0e2 711 LEDColour = RED;
jolyon 3:b8218b61b0e2 712 }
jolyon 3:b8218b61b0e2 713 else
jolyon 3:b8218b61b0e2 714 {
jolyon 10:efe8585f7fa4 715 if((GreenProp - RedProp > SingleThreshold) && (GreenProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 716 {
jolyon 3:b8218b61b0e2 717 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 718 }
jolyon 3:b8218b61b0e2 719 else
jolyon 3:b8218b61b0e2 720 {
jolyon 10:efe8585f7fa4 721 if((BlueProp - RedProp > SingleThreshold) && (BlueProp - GreenProp > SingleThreshold))
jolyon 3:b8218b61b0e2 722 {
jolyon 3:b8218b61b0e2 723 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 724 }
jolyon 3:b8218b61b0e2 725 }
jolyon 3:b8218b61b0e2 726 }
jolyon 3:b8218b61b0e2 727 }
jolyon 3:b8218b61b0e2 728 break;
jolyon 3:b8218b61b0e2 729
jolyon 3:b8218b61b0e2 730 case NOTUSED:
jolyon 3:b8218b61b0e2 731 default:
jolyon 3:b8218b61b0e2 732 {
jolyon 3:b8218b61b0e2 733 LEDColour = ERROR;
jolyon 3:b8218b61b0e2 734 }
jolyon 3:b8218b61b0e2 735 break;
jolyon 3:b8218b61b0e2 736 }
jolyon 3:b8218b61b0e2 737 }
jolyon 3:b8218b61b0e2 738 return LEDColour;
jolyon 3:b8218b61b0e2 739 }
jolyon 3:b8218b61b0e2 740
jolyon 3:b8218b61b0e2 741
jolyon 4:dce5fc58abe9 742 void UpdateOutputs(void)
jolyon 4:dce5fc58abe9 743 {
jolyon 4:dce5fc58abe9 744 //good LED so turn on Outputs
jolyon 4:dce5fc58abe9 745 switch (Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 746 {
jolyon 4:dce5fc58abe9 747 case STD_RED:
jolyon 4:dce5fc58abe9 748 case STD_GREEN:
jolyon 4:dce5fc58abe9 749 case STD_BLUE:
jolyon 4:dce5fc58abe9 750 case STD_YELLOW:
jolyon 4:dce5fc58abe9 751 {
jolyon 4:dce5fc58abe9 752 if (SensorResult == Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 753 {
jolyon 4:dce5fc58abe9 754 SetOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 755 }
jolyon 4:dce5fc58abe9 756 else
jolyon 4:dce5fc58abe9 757 {
jolyon 4:dce5fc58abe9 758 ClearOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 759 }
jolyon 4:dce5fc58abe9 760 }
jolyon 4:dce5fc58abe9 761 break;
jolyon 4:dce5fc58abe9 762
jolyon 4:dce5fc58abe9 763 case GREEN_YELLOW:
jolyon 4:dce5fc58abe9 764 {
jolyon 4:dce5fc58abe9 765 if (SensorResult == YELLOW)
jolyon 4:dce5fc58abe9 766 {
jolyon 4:dce5fc58abe9 767 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 768 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 769 }
jolyon 4:dce5fc58abe9 770 else
jolyon 4:dce5fc58abe9 771 {
jolyon 4:dce5fc58abe9 772 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 773 {
jolyon 4:dce5fc58abe9 774 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 775 SetOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 776 }
jolyon 4:dce5fc58abe9 777 else
jolyon 4:dce5fc58abe9 778 {
jolyon 4:dce5fc58abe9 779 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 780 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 781 }
jolyon 4:dce5fc58abe9 782 }
jolyon 4:dce5fc58abe9 783 }
jolyon 4:dce5fc58abe9 784 break;
jolyon 4:dce5fc58abe9 785
jolyon 4:dce5fc58abe9 786 case RGB:
jolyon 4:dce5fc58abe9 787 {
jolyon 4:dce5fc58abe9 788 if (SensorResult == RED)
jolyon 4:dce5fc58abe9 789 {
jolyon 4:dce5fc58abe9 790 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 791 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 792 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 793 }
jolyon 4:dce5fc58abe9 794 else
jolyon 4:dce5fc58abe9 795 {
jolyon 4:dce5fc58abe9 796 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 797 {
jolyon 4:dce5fc58abe9 798 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 799 SetOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 800 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 801 }
jolyon 4:dce5fc58abe9 802 else
jolyon 4:dce5fc58abe9 803 {
jolyon 4:dce5fc58abe9 804 if (SensorResult == BLUE)
jolyon 4:dce5fc58abe9 805 {
jolyon 4:dce5fc58abe9 806 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 807 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 808 SetOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 809 }
jolyon 4:dce5fc58abe9 810 else
jolyon 4:dce5fc58abe9 811 {
jolyon 4:dce5fc58abe9 812 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 813 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 814 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 815 }
jolyon 4:dce5fc58abe9 816
jolyon 4:dce5fc58abe9 817 }
jolyon 4:dce5fc58abe9 818 }
jolyon 4:dce5fc58abe9 819 }
jolyon 4:dce5fc58abe9 820 break;
jolyon 4:dce5fc58abe9 821
jolyon 4:dce5fc58abe9 822 default:
jolyon 4:dce5fc58abe9 823 {
jolyon 4:dce5fc58abe9 824 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 825 }
jolyon 4:dce5fc58abe9 826 break;
jolyon 4:dce5fc58abe9 827 } //end switch
jolyon 4:dce5fc58abe9 828 }
jolyon 4:dce5fc58abe9 829
jolyon 4:dce5fc58abe9 830 void ShowLeds(char WhichColour)
jolyon 4:dce5fc58abe9 831 {
jolyon 8:e6e4eece90f7 832 RedLed = 1;
jolyon 8:e6e4eece90f7 833 GreenLed = 1;
jolyon 8:e6e4eece90f7 834 BlueLed = 1;
jolyon 8:e6e4eece90f7 835 YellowLed = 1;
jolyon 4:dce5fc58abe9 836 switch (WhichColour)
jolyon 4:dce5fc58abe9 837 {
jolyon 4:dce5fc58abe9 838 case RED:
jolyon 4:dce5fc58abe9 839 {
jolyon 8:e6e4eece90f7 840 RedLed = 0;
jolyon 4:dce5fc58abe9 841 }
jolyon 4:dce5fc58abe9 842 break;
jolyon 4:dce5fc58abe9 843
jolyon 4:dce5fc58abe9 844 case GREEN:
jolyon 4:dce5fc58abe9 845 {
jolyon 8:e6e4eece90f7 846 GreenLed = 0;
jolyon 4:dce5fc58abe9 847 }
jolyon 4:dce5fc58abe9 848 break;
jolyon 4:dce5fc58abe9 849
jolyon 4:dce5fc58abe9 850 case BLUE:
jolyon 4:dce5fc58abe9 851 {
jolyon 8:e6e4eece90f7 852 BlueLed = 0;
jolyon 4:dce5fc58abe9 853 }
jolyon 4:dce5fc58abe9 854 break;
jolyon 4:dce5fc58abe9 855
jolyon 4:dce5fc58abe9 856 case YELLOW:
jolyon 4:dce5fc58abe9 857 {
jolyon 8:e6e4eece90f7 858 YellowLed = 0;
jolyon 4:dce5fc58abe9 859 }
jolyon 4:dce5fc58abe9 860 break;
jolyon 4:dce5fc58abe9 861
jolyon 4:dce5fc58abe9 862 default:
jolyon 4:dce5fc58abe9 863 {
jolyon 4:dce5fc58abe9 864 }
jolyon 4:dce5fc58abe9 865 break;
jolyon 4:dce5fc58abe9 866 }
jolyon 4:dce5fc58abe9 867 }
jolyon 4:dce5fc58abe9 868
jolyon 12:eab1bc88fe68 869
jolyon 13:ef2f1c11e33b 870 void SaveSensorData(uint8_t Mode)
jolyon 13:ef2f1c11e33b 871 {
jolyon 13:ef2f1c11e33b 872 uint8_t MemSave;
jolyon 13:ef2f1c11e33b 873 for (MemSave = 0;MemSave <32;MemSave++)
jolyon 13:ef2f1c11e33b 874 {
jolyon 13:ef2f1c11e33b 875 if (Mode == 1)
jolyon 13:ef2f1c11e33b 876 {
jolyon 13:ef2f1c11e33b 877 ConfigMemory.write(MemSave,(int8_t)Config[MemSave]);
jolyon 13:ef2f1c11e33b 878 }
jolyon 13:ef2f1c11e33b 879 else
jolyon 13:ef2f1c11e33b 880 {
jolyon 13:ef2f1c11e33b 881 ConfigMemory.write(MemSave,0);
jolyon 13:ef2f1c11e33b 882
jolyon 13:ef2f1c11e33b 883 }
jolyon 13:ef2f1c11e33b 884 }
jolyon 13:ef2f1c11e33b 885 LoadSensorData(); //re-load data from EEProm to be sure
jolyon 13:ef2f1c11e33b 886 }
jolyon 13:ef2f1c11e33b 887
jolyon 13:ef2f1c11e33b 888 void LoadSensorData(void)
jolyon 12:eab1bc88fe68 889 {
jolyon 13:ef2f1c11e33b 890 uint8_t MemSave;
jolyon 13:ef2f1c11e33b 891 // uint8_t FailFlag = 0;
jolyon 13:ef2f1c11e33b 892 uint8_t MemData;
jolyon 13:ef2f1c11e33b 893
jolyon 13:ef2f1c11e33b 894 for (MemSave = 0;MemSave <32;MemSave++)
jolyon 13:ef2f1c11e33b 895 {
jolyon 13:ef2f1c11e33b 896 ConfigMemory.read(MemSave,(int8_t&)MemData);
jolyon 13:ef2f1c11e33b 897 Config[MemSave]= MemData;
jolyon 13:ef2f1c11e33b 898 /*
jolyon 13:ef2f1c11e33b 899 if (MemSave == 0)
jolyon 13:ef2f1c11e33b 900 {
jolyon 13:ef2f1c11e33b 901 if (Config[MemSave] > 6) //case of no config (a bit rough!)
jolyon 13:ef2f1c11e33b 902 {
jolyon 13:ef2f1c11e33b 903 FailFlag = 1;
jolyon 13:ef2f1c11e33b 904 }
jolyon 13:ef2f1c11e33b 905 }
jolyon 13:ef2f1c11e33b 906 */
jolyon 13:ef2f1c11e33b 907 }
jolyon 13:ef2f1c11e33b 908 /*
jolyon 13:ef2f1c11e33b 909 if(FailFlag == 1)
jolyon 13:ef2f1c11e33b 910 {
jolyon 13:ef2f1c11e33b 911
jolyon 13:ef2f1c11e33b 912 SaveSensorData(0); //force default
jolyon 13:ef2f1c11e33b 913 }
jolyon 13:ef2f1c11e33b 914 */
jolyon 12:eab1bc88fe68 915 }
jolyon 12:eab1bc88fe68 916
jolyon 12:eab1bc88fe68 917
jolyon 12:eab1bc88fe68 918
jolyon 12:eab1bc88fe68 919
jolyon 10:efe8585f7fa4 920 void InitCommsPort(void)
jolyon 10:efe8585f7fa4 921 {
jolyon 10:efe8585f7fa4 922 Serial RS485(p26,p25);
jolyon 10:efe8585f7fa4 923 RS485.baud(19200);
jolyon 10:efe8585f7fa4 924 RS485.format(8,RS485.None,1); //8 data, no Parity, 1 stop bit
jolyon 10:efe8585f7fa4 925 //set up the other stuff!
jolyon 10:efe8585f7fa4 926 LPC_PINCON->PINSEL4 &= 0x0ffff;
jolyon 10:efe8585f7fa4 927 LPC_PINCON->PINSEL4 |= 0x0AAAA;
jolyon 10:efe8585f7fa4 928
jolyon 10:efe8585f7fa4 929 LPC_UART1->RS485CTRL = (1<<3)|(1<<4)|(1<<5);
jolyon 10:efe8585f7fa4 930 LPC_UART1->RS485DLY = 1;
jolyon 10:efe8585f7fa4 931 RS485.putc('*');
jolyon 10:efe8585f7fa4 932 }
jolyon 10:efe8585f7fa4 933
jolyon 10:efe8585f7fa4 934 void HandleRS485(void)
jolyon 10:efe8585f7fa4 935 {
jolyon 10:efe8585f7fa4 936 //check for character in buffer
jolyon 10:efe8585f7fa4 937 if (RS485.readable())
jolyon 10:efe8585f7fa4 938 {
jolyon 10:efe8585f7fa4 939 CommsData = RS485.getc();
jolyon 10:efe8585f7fa4 940 if (CommsData== '*') //check for correct request
jolyon 10:efe8585f7fa4 941 {
jolyon 10:efe8585f7fa4 942 RS485.putc('*');
jolyon 10:efe8585f7fa4 943 CommsData = (char)(OutputData >> 8);
jolyon 10:efe8585f7fa4 944 RS485.putc(CommsData);
jolyon 10:efe8585f7fa4 945 CommsData = (char)(OutputData & 0xFF);
jolyon 10:efe8585f7fa4 946 RS485.putc(CommsData);
jolyon 10:efe8585f7fa4 947 }
jolyon 10:efe8585f7fa4 948 }
jolyon 10:efe8585f7fa4 949 }
jolyon 11:729eb224dce6 950
jolyon 11:729eb224dce6 951
jolyon 11:729eb224dce6 952 void HandleDisplay(void)
jolyon 11:729eb224dce6 953 {
jolyon 11:729eb224dce6 954 uint8_t CurrentButton =0;
jolyon 11:729eb224dce6 955 /*
jolyon 11:729eb224dce6 956 #define NEWBUTTON 0x80
jolyon 11:729eb224dce6 957 #define UPBUTTON 0x01
jolyon 11:729eb224dce6 958 #define DOWNBUTTON 0x02
jolyon 11:729eb224dce6 959 #define LEFTBUTTON 0x03
jolyon 11:729eb224dce6 960 #define RIGHTBUTTON 0x04
jolyon 11:729eb224dce6 961 #define TICKBUTTON 0x05
jolyon 11:729eb224dce6 962 */
jolyon 11:729eb224dce6 963 CurrentButton = GetButtonState();
jolyon 11:729eb224dce6 964
jolyon 11:729eb224dce6 965 //------------------- select the sensor ----------------
jolyon 11:729eb224dce6 966 if (CurrentButton == (UPBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 967 {
jolyon 11:729eb224dce6 968 DisplayScreen++;
jolyon 12:eab1bc88fe68 969 if (DisplayScreen == 18)
jolyon 11:729eb224dce6 970 {
jolyon 11:729eb224dce6 971 DisplayScreen = 0;
jolyon 11:729eb224dce6 972 }
jolyon 11:729eb224dce6 973 }
jolyon 11:729eb224dce6 974 else
jolyon 11:729eb224dce6 975 {
jolyon 11:729eb224dce6 976 if (CurrentButton == (DOWNBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 977 {
jolyon 11:729eb224dce6 978 DisplayScreen--;
jolyon 11:729eb224dce6 979 if (DisplayScreen == 255)
jolyon 11:729eb224dce6 980 {
jolyon 13:ef2f1c11e33b 981 DisplayScreen = 17;
jolyon 11:729eb224dce6 982 }
jolyon 11:729eb224dce6 983 }
jolyon 11:729eb224dce6 984 }
jolyon 11:729eb224dce6 985
jolyon 12:eab1bc88fe68 986 //check for config save
jolyon 12:eab1bc88fe68 987 if (DisplayScreen == 17)
jolyon 12:eab1bc88fe68 988 {
jolyon 12:eab1bc88fe68 989 lcd.locate(0, 0);
jolyon 13:ef2f1c11e33b 990 lcd.printf("RIGHT - SAVE ");
jolyon 13:ef2f1c11e33b 991 lcd.locate(0, 1);
jolyon 13:ef2f1c11e33b 992 lcd.printf("LEFT - DEFAULT ");
jolyon 12:eab1bc88fe68 993
jolyon 12:eab1bc88fe68 994 if (CurrentButton == (RIGHTBUTTON | NEWBUTTON))
jolyon 12:eab1bc88fe68 995 {
jolyon 13:ef2f1c11e33b 996 SaveSensorData(1);
jolyon 13:ef2f1c11e33b 997 }
jolyon 13:ef2f1c11e33b 998
jolyon 11:729eb224dce6 999 if (CurrentButton == (LEFTBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 1000 {
jolyon 13:ef2f1c11e33b 1001 SaveSensorData(0);
jolyon 13:ef2f1c11e33b 1002 }
jolyon 13:ef2f1c11e33b 1003
jolyon 11:729eb224dce6 1004 }
jolyon 13:ef2f1c11e33b 1005 else
jolyon 13:ef2f1c11e33b 1006 {
jolyon 13:ef2f1c11e33b 1007
jolyon 13:ef2f1c11e33b 1008 //------------------- select the sensor type ----------------
jolyon 13:ef2f1c11e33b 1009 DisplaySensorType = Config[(DisplayScreen-1)*2];
jolyon 13:ef2f1c11e33b 1010
jolyon 13:ef2f1c11e33b 1011 if (CurrentButton == (RIGHTBUTTON | NEWBUTTON))
jolyon 13:ef2f1c11e33b 1012 {
jolyon 13:ef2f1c11e33b 1013 if (DisplaySensorType < 6)
jolyon 13:ef2f1c11e33b 1014 {
jolyon 13:ef2f1c11e33b 1015 DisplaySensorType++;
jolyon 13:ef2f1c11e33b 1016 Config[(DisplayScreen-1)*2] = DisplaySensorType;
jolyon 13:ef2f1c11e33b 1017 }
jolyon 13:ef2f1c11e33b 1018 }
jolyon 13:ef2f1c11e33b 1019 else
jolyon 13:ef2f1c11e33b 1020 {
jolyon 13:ef2f1c11e33b 1021 if (CurrentButton == (LEFTBUTTON | NEWBUTTON))
jolyon 13:ef2f1c11e33b 1022 {
jolyon 13:ef2f1c11e33b 1023 if (DisplaySensorType > 0)
jolyon 13:ef2f1c11e33b 1024 {
jolyon 13:ef2f1c11e33b 1025 DisplaySensorType--;
jolyon 13:ef2f1c11e33b 1026 Config[(DisplayScreen-1)*2] = DisplaySensorType;
jolyon 13:ef2f1c11e33b 1027 }
jolyon 13:ef2f1c11e33b 1028 }
jolyon 13:ef2f1c11e33b 1029 }
jolyon 13:ef2f1c11e33b 1030
jolyon 13:ef2f1c11e33b 1031 //update output list
jolyon 13:ef2f1c11e33b 1032 CreateOutputTable();
jolyon 13:ef2f1c11e33b 1033
jolyon 13:ef2f1c11e33b 1034 //show current config setting
jolyon 13:ef2f1c11e33b 1035 DisplaySensorType = Config[(DisplayScreen-1)*2];
jolyon 13:ef2f1c11e33b 1036 DisplaySensorOutput = Config[(DisplayScreen-1)*2 +1];
jolyon 13:ef2f1c11e33b 1037
jolyon 13:ef2f1c11e33b 1038 if (DisplayScreen !=0)
jolyon 13:ef2f1c11e33b 1039 {
jolyon 13:ef2f1c11e33b 1040 lcd.locate(0, 0);
jolyon 13:ef2f1c11e33b 1041 lcd.printf("Sensor %02i %s", DisplayScreen, LEDTypes[DisplaySensorType]);
jolyon 13:ef2f1c11e33b 1042 lcd.locate(0, 1);
jolyon 13:ef2f1c11e33b 1043
jolyon 13:ef2f1c11e33b 1044 //ConfigMemory.read(0,(int8_t&)DisplaySensorOutput);
jolyon 13:ef2f1c11e33b 1045 //lcd.printf("First Output %02i ",DisplaySensorOutput);
jolyon 13:ef2f1c11e33b 1046
jolyon 13:ef2f1c11e33b 1047 if (DisplaySensorType > 4)
jolyon 13:ef2f1c11e33b 1048 {
jolyon 13:ef2f1c11e33b 1049 lcd.printf("First O/P CN3.%02i",DisplaySensorOutput+2); //add 2 just for display purposes to match schematic
jolyon 13:ef2f1c11e33b 1050 }
jolyon 13:ef2f1c11e33b 1051 else
jolyon 13:ef2f1c11e33b 1052 {
jolyon 13:ef2f1c11e33b 1053 if (DisplaySensorType > 0)
jolyon 13:ef2f1c11e33b 1054 {
jolyon 13:ef2f1c11e33b 1055 lcd.printf("Output CN3.%02i",DisplaySensorOutput+2); //add 2 just for display purposes to match schematic
jolyon 13:ef2f1c11e33b 1056 }
jolyon 13:ef2f1c11e33b 1057 else
jolyon 13:ef2f1c11e33b 1058 {
jolyon 13:ef2f1c11e33b 1059 lcd.printf("No Output "); //add 2 just for display purposes to match schematic
jolyon 13:ef2f1c11e33b 1060 }
jolyon 13:ef2f1c11e33b 1061 }
jolyon 13:ef2f1c11e33b 1062
jolyon 13:ef2f1c11e33b 1063
jolyon 13:ef2f1c11e33b 1064
jolyon 13:ef2f1c11e33b 1065 }
jolyon 11:729eb224dce6 1066 }
jolyon 11:729eb224dce6 1067 }
jolyon 11:729eb224dce6 1068
jolyon 12:eab1bc88fe68 1069 void CreateOutputTable(void)
jolyon 12:eab1bc88fe68 1070 {
jolyon 12:eab1bc88fe68 1071 uint8_t CurrentSensor;
jolyon 12:eab1bc88fe68 1072 uint8_t CurrentOutput = 0; //set to first output
jolyon 12:eab1bc88fe68 1073
jolyon 12:eab1bc88fe68 1074 for (CurrentSensor = 0; CurrentSensor <15; CurrentSensor++)
jolyon 12:eab1bc88fe68 1075 {
jolyon 12:eab1bc88fe68 1076 //set the start output for next sensor
jolyon 12:eab1bc88fe68 1077 CurrentOutput += OutputCount[Config[(CurrentSensor)*2]];
jolyon 12:eab1bc88fe68 1078 if( CurrentOutput >15 )
jolyon 12:eab1bc88fe68 1079 {
jolyon 12:eab1bc88fe68 1080 CurrentOutput = 15;
jolyon 12:eab1bc88fe68 1081 }
jolyon 12:eab1bc88fe68 1082 Config[(CurrentSensor+1)*2 +1] = CurrentOutput;
jolyon 12:eab1bc88fe68 1083
jolyon 12:eab1bc88fe68 1084 }
jolyon 12:eab1bc88fe68 1085 }
jolyon 10:efe8585f7fa4 1086
jolyon 3:b8218b61b0e2 1087
jolyon 0:9d301ae51ecf 1088 int main()
jolyon 0:9d301ae51ecf 1089 {
jolyon 6:6346ef2b4638 1090 InitOutputs(); //set up output driver chip
jolyon 6:6346ef2b4638 1091 ConfigureTSC(0); //Initialise all TCS34725's
jolyon 10:efe8585f7fa4 1092 InitCommsPort(); //Initialise the 485 port
jolyon 0:9d301ae51ecf 1093
jolyon 13:ef2f1c11e33b 1094 //load config
jolyon 13:ef2f1c11e33b 1095 LoadSensorData();
jolyon 13:ef2f1c11e33b 1096
jolyon 13:ef2f1c11e33b 1097 lcd.setCursor(TextLCD::CurOff_BlkOff);
jolyon 10:efe8585f7fa4 1098
jolyon 1:d99dad8a1f50 1099 while(1)
jolyon 1:d99dad8a1f50 1100 {
jolyon 6:6346ef2b4638 1101 GetThresholds(); //update thresholds
jolyon 6:6346ef2b4638 1102 wait(0.1); //100ms Update Cycle
jolyon 4:dce5fc58abe9 1103 OutputData = 0;
jolyon 2:4a8eacbb3657 1104
jolyon 3:b8218b61b0e2 1105 for(SensorNumber = 0; SensorNumber < 16; SensorNumber++)
jolyon 3:b8218b61b0e2 1106 {
jolyon 4:dce5fc58abe9 1107 if(Config[((SensorNumber << 1))] != NOTUSED) //check to see if the sensor is being used
jolyon 3:b8218b61b0e2 1108 {
jolyon 3:b8218b61b0e2 1109 SensorData = GetSensorData(SensorNumber);
jolyon 3:b8218b61b0e2 1110
jolyon 3:b8218b61b0e2 1111 White = SensorData.White;
jolyon 3:b8218b61b0e2 1112 Red = SensorData.Red;
jolyon 3:b8218b61b0e2 1113 Green = SensorData.Green;
jolyon 3:b8218b61b0e2 1114 Blue = SensorData.Blue;
jolyon 0:9d301ae51ecf 1115
jolyon 6:6346ef2b4638 1116 ScaleColours();
jolyon 6:6346ef2b4638 1117
jolyon 3:b8218b61b0e2 1118 // work out % of colour mix
jolyon 3:b8218b61b0e2 1119 Temp = (Red+Blue+Green);
jolyon 3:b8218b61b0e2 1120 RedProp = (Red* 100) / Temp ;
jolyon 3:b8218b61b0e2 1121 GreenProp = (Green* 100) / Temp ;
jolyon 3:b8218b61b0e2 1122 BlueProp = (Blue* 100) / Temp ;
jolyon 3:b8218b61b0e2 1123
jolyon 3:b8218b61b0e2 1124 SensorResult = GetResults(SensorNumber);
jolyon 4:dce5fc58abe9 1125 UpdateOutputs();
jolyon 8:e6e4eece90f7 1126
jolyon 8:e6e4eece90f7 1127 if (SensorNumber == GetModeSwitch())
jolyon 8:e6e4eece90f7 1128 {
jolyon 11:729eb224dce6 1129 if (DisplayScreen == 0)
jolyon 11:729eb224dce6 1130 {
jolyon 11:729eb224dce6 1131 UpdateDisplay();
jolyon 11:729eb224dce6 1132 ShowLeds(SensorResult);
jolyon 11:729eb224dce6 1133 }
jolyon 8:e6e4eece90f7 1134 }
jolyon 8:e6e4eece90f7 1135
jolyon 3:b8218b61b0e2 1136 } //end if
jolyon 8:e6e4eece90f7 1137 else
jolyon 8:e6e4eece90f7 1138 {
jolyon 12:eab1bc88fe68 1139 if (DisplayScreen == 0)
jolyon 8:e6e4eece90f7 1140 {
jolyon 12:eab1bc88fe68 1141 if (SensorNumber == GetModeSwitch())
jolyon 12:eab1bc88fe68 1142 {
jolyon 12:eab1bc88fe68 1143 lcd.locate(0, 0);
jolyon 12:eab1bc88fe68 1144 lcd.printf("INVALID SENSOR ");
jolyon 12:eab1bc88fe68 1145 lcd.locate(0, 1);
jolyon 12:eab1bc88fe68 1146 lcd.printf("%02i ",GetModeSwitch() );
jolyon 12:eab1bc88fe68 1147 }
jolyon 8:e6e4eece90f7 1148 }
jolyon 11:729eb224dce6 1149 }
jolyon 11:729eb224dce6 1150
jolyon 8:e6e4eece90f7 1151
jolyon 8:e6e4eece90f7 1152
jolyon 3:b8218b61b0e2 1153 } //end for
jolyon 8:e6e4eece90f7 1154 WriteOutputPort(OutputData);
jolyon 8:e6e4eece90f7 1155 //WriteOutputPort(OutputDataB);
jolyon 8:e6e4eece90f7 1156 //OutputDataB>>=1;
jolyon 8:e6e4eece90f7 1157 //if(OutputDataB == 0)
jolyon 8:e6e4eece90f7 1158 //{
jolyon 8:e6e4eece90f7 1159 // OutputDataB = 0x8000;
jolyon 10:efe8585f7fa4 1160 //}
jolyon 11:729eb224dce6 1161 HandleDisplay();
jolyon 10:efe8585f7fa4 1162 //Handle Comms
jolyon 10:efe8585f7fa4 1163 HandleRS485();
jolyon 3:b8218b61b0e2 1164 } //while(1)
jolyon 3:b8218b61b0e2 1165 }//main