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 Dec 08 12:03:13 2016 +0000
Revision:
14:02de92b0206a
Parent:
13:ef2f1c11e33b
Child:
15:bf821fd83219
Release to production - slight mod to Green threshold

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 14:02de92b0206a 568 //MixGThreshold = 35; //first value but a bit too close
jolyon 14:02de92b0206a 569 MixGThreshold = 38;
jolyon 14:02de92b0206a 570 #endif
jolyon 10:efe8585f7fa4 571
jolyon 14:02de92b0206a 572 //RedThreshold = 45; //default for yellow detect (red)
jolyon 14:02de92b0206a 573 //GreenThreshold = 35;//default for yellow detect (green)
jolyon 14:02de92b0206a 574 //BlueThreshold = 10;//not used
jolyon 2:4a8eacbb3657 575 }
jolyon 0:9d301ae51ecf 576
jolyon 5:dc77c5967412 577 void SelectSensorPort(uint8_t SensorID)
jolyon 5:dc77c5967412 578 {
jolyon 5:dc77c5967412 579
jolyon 5:dc77c5967412 580 if ( SensorID < 16)
jolyon 5:dc77c5967412 581 {
jolyon 5:dc77c5967412 582 if((SensorID & 0x01) == 0x01)
jolyon 5:dc77c5967412 583 {
jolyon 5:dc77c5967412 584 I2C_ID_Bit0 = 1;
jolyon 5:dc77c5967412 585 }
jolyon 5:dc77c5967412 586 else
jolyon 5:dc77c5967412 587 {
jolyon 5:dc77c5967412 588 I2C_ID_Bit0 = 0;
jolyon 5:dc77c5967412 589 }
jolyon 5:dc77c5967412 590
jolyon 5:dc77c5967412 591 if((SensorID & 0x02) == 0x02)
jolyon 5:dc77c5967412 592 {
jolyon 5:dc77c5967412 593 I2C_ID_Bit1 = 1;
jolyon 5:dc77c5967412 594 }
jolyon 5:dc77c5967412 595 else
jolyon 5:dc77c5967412 596 {
jolyon 5:dc77c5967412 597 I2C_ID_Bit1 = 0;
jolyon 5:dc77c5967412 598 }
jolyon 5:dc77c5967412 599
jolyon 5:dc77c5967412 600 if((SensorID & 0x04) == 0x04)
jolyon 5:dc77c5967412 601 {
jolyon 5:dc77c5967412 602 I2C_ID_Bit2 = 1;
jolyon 5:dc77c5967412 603 }
jolyon 5:dc77c5967412 604 else
jolyon 5:dc77c5967412 605 {
jolyon 5:dc77c5967412 606 I2C_ID_Bit2 = 0;
jolyon 5:dc77c5967412 607 }
jolyon 5:dc77c5967412 608
jolyon 5:dc77c5967412 609 if((SensorID & 0x08) == 0x08)
jolyon 5:dc77c5967412 610 {
jolyon 5:dc77c5967412 611 I2C_ID_Bit3 = 1;
jolyon 5:dc77c5967412 612 }
jolyon 5:dc77c5967412 613 else
jolyon 5:dc77c5967412 614 {
jolyon 5:dc77c5967412 615 I2C_ID_Bit3 = 0;
jolyon 5:dc77c5967412 616 }
jolyon 5:dc77c5967412 617 }
jolyon 5:dc77c5967412 618 }
jolyon 5:dc77c5967412 619
jolyon 6:6346ef2b4638 620 void ScaleColours(void)
jolyon 6:6346ef2b4638 621 {
jolyon 6:6346ef2b4638 622 //make 12 bit only
jolyon 6:6346ef2b4638 623 Red >>=4;
jolyon 6:6346ef2b4638 624 Green >>=4;
jolyon 6:6346ef2b4638 625 Blue >>=4;
jolyon 6:6346ef2b4638 626 White >>=4;
jolyon 6:6346ef2b4638 627 }
jolyon 6:6346ef2b4638 628
jolyon 3:b8218b61b0e2 629
jolyon 3:b8218b61b0e2 630 void UpdateDisplay(void)
jolyon 3:b8218b61b0e2 631 {
jolyon 3:b8218b61b0e2 632 lcd.locate(0, 0);
jolyon 7:9c5bca0ac9d7 633 lcd.printf("R%02i G%02i B%02i W%03i",RedProp,GreenProp,BlueProp,White);
jolyon 3:b8218b61b0e2 634 lcd.locate(0, 1);
jolyon 8:e6e4eece90f7 635 //lcd.printf("R%02i G%02i B%02i H%02i ",RedThreshold, GreenThreshold, BlueThreshold, Hysteresis);
jolyon 13:ef2f1c11e33b 636 lcd.printf("S%02i R%02i G%02i D%02i ",SingleThreshold, MixRThreshold, MixGThreshold, GetModeSwitch() );
jolyon 13:ef2f1c11e33b 637 //lcd.printf("Button Read %03i ",IfButtons);
jolyon 3:b8218b61b0e2 638 }
jolyon 3:b8218b61b0e2 639
jolyon 3:b8218b61b0e2 640
jolyon 3:b8218b61b0e2 641 char GetResults(uint8_t ThisSensor)
jolyon 3:b8218b61b0e2 642 {
jolyon 3:b8218b61b0e2 643 char LEDColour = ERROR;
jolyon 4:dce5fc58abe9 644
jolyon 3:b8218b61b0e2 645 if(White > WHITE_THRESHOLD) //looking at intensity somthing is on!
jolyon 3:b8218b61b0e2 646 {
jolyon 3:b8218b61b0e2 647 switch(Config[(ThisSensor << 1)])
jolyon 3:b8218b61b0e2 648 {
jolyon 3:b8218b61b0e2 649 case STD_RED:
jolyon 3:b8218b61b0e2 650 {
jolyon 10:efe8585f7fa4 651 if((RedProp - GreenProp > SingleThreshold) && (RedProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 652 {
jolyon 3:b8218b61b0e2 653 LEDColour = RED;
jolyon 3:b8218b61b0e2 654 }
jolyon 3:b8218b61b0e2 655 }
jolyon 3:b8218b61b0e2 656 break;
jolyon 3:b8218b61b0e2 657
jolyon 3:b8218b61b0e2 658 case STD_GREEN:
jolyon 3:b8218b61b0e2 659 {
jolyon 10:efe8585f7fa4 660 if((GreenProp - RedProp > SingleThreshold) && (GreenProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 661 {
jolyon 3:b8218b61b0e2 662 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 663 }
jolyon 3:b8218b61b0e2 664 }
jolyon 3:b8218b61b0e2 665 break;
jolyon 3:b8218b61b0e2 666
jolyon 3:b8218b61b0e2 667 case STD_BLUE:
jolyon 3:b8218b61b0e2 668 {
jolyon 10:efe8585f7fa4 669 if((BlueProp - RedProp > SingleThreshold) && (BlueProp - GreenProp > SingleThreshold))
jolyon 3:b8218b61b0e2 670 {
jolyon 3:b8218b61b0e2 671 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 672 }
jolyon 3:b8218b61b0e2 673 }
jolyon 3:b8218b61b0e2 674 break;
jolyon 3:b8218b61b0e2 675
jolyon 3:b8218b61b0e2 676 case STD_YELLOW:
jolyon 3:b8218b61b0e2 677 {
jolyon 10:efe8585f7fa4 678 if ((RedProp - GreenProp) < (2* SingleThreshold)) //check it is not red!
jolyon 9:077d1ad96bca 679 {
jolyon 10:efe8585f7fa4 680 if( (GreenProp <= (MixGThreshold-Hysteresis)) && (RedProp >=(MixRThreshold+Hysteresis)) )
jolyon 9:077d1ad96bca 681 {
jolyon 9:077d1ad96bca 682 LEDColour = YELLOW;
jolyon 9:077d1ad96bca 683 }
jolyon 3:b8218b61b0e2 684 }
jolyon 3:b8218b61b0e2 685 }
jolyon 3:b8218b61b0e2 686 break;
jolyon 3:b8218b61b0e2 687
jolyon 3:b8218b61b0e2 688 case GREEN_YELLOW:
jolyon 3:b8218b61b0e2 689 {
jolyon 9:077d1ad96bca 690
jolyon 10:efe8585f7fa4 691 if( (GreenProp <= (MixGThreshold-Hysteresis)) && (RedProp >=(MixRThreshold+Hysteresis)) )
jolyon 3:b8218b61b0e2 692 { //pretty sure it's Yellow
jolyon 9:077d1ad96bca 693 if ((RedProp - GreenProp) < 60) //check it is not red!
jolyon 9:077d1ad96bca 694 {
jolyon 9:077d1ad96bca 695 LEDColour = YELLOW;
jolyon 9:077d1ad96bca 696 }
jolyon 3:b8218b61b0e2 697 }
jolyon 3:b8218b61b0e2 698 else
jolyon 3:b8218b61b0e2 699 {
jolyon 10:efe8585f7fa4 700 if( (GreenProp > (MixGThreshold+Hysteresis)) && (RedProp <=(MixRThreshold-Hysteresis)) )
jolyon 3:b8218b61b0e2 701 { //pretty sure it's green
jolyon 3:b8218b61b0e2 702 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 703 }
jolyon 3:b8218b61b0e2 704 }
jolyon 3:b8218b61b0e2 705 }
jolyon 3:b8218b61b0e2 706 break;
jolyon 3:b8218b61b0e2 707
jolyon 3:b8218b61b0e2 708 case RGB:
jolyon 3:b8218b61b0e2 709 {
jolyon 10:efe8585f7fa4 710 if((RedProp - GreenProp > SingleThreshold) && (RedProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 711 {
jolyon 3:b8218b61b0e2 712 LEDColour = RED;
jolyon 3:b8218b61b0e2 713 }
jolyon 3:b8218b61b0e2 714 else
jolyon 3:b8218b61b0e2 715 {
jolyon 10:efe8585f7fa4 716 if((GreenProp - RedProp > SingleThreshold) && (GreenProp - BlueProp > SingleThreshold))
jolyon 3:b8218b61b0e2 717 {
jolyon 3:b8218b61b0e2 718 LEDColour = GREEN;
jolyon 3:b8218b61b0e2 719 }
jolyon 3:b8218b61b0e2 720 else
jolyon 3:b8218b61b0e2 721 {
jolyon 10:efe8585f7fa4 722 if((BlueProp - RedProp > SingleThreshold) && (BlueProp - GreenProp > SingleThreshold))
jolyon 3:b8218b61b0e2 723 {
jolyon 3:b8218b61b0e2 724 LEDColour = BLUE;
jolyon 3:b8218b61b0e2 725 }
jolyon 3:b8218b61b0e2 726 }
jolyon 3:b8218b61b0e2 727 }
jolyon 3:b8218b61b0e2 728 }
jolyon 3:b8218b61b0e2 729 break;
jolyon 3:b8218b61b0e2 730
jolyon 3:b8218b61b0e2 731 case NOTUSED:
jolyon 3:b8218b61b0e2 732 default:
jolyon 3:b8218b61b0e2 733 {
jolyon 3:b8218b61b0e2 734 LEDColour = ERROR;
jolyon 3:b8218b61b0e2 735 }
jolyon 3:b8218b61b0e2 736 break;
jolyon 3:b8218b61b0e2 737 }
jolyon 3:b8218b61b0e2 738 }
jolyon 3:b8218b61b0e2 739 return LEDColour;
jolyon 3:b8218b61b0e2 740 }
jolyon 3:b8218b61b0e2 741
jolyon 3:b8218b61b0e2 742
jolyon 4:dce5fc58abe9 743 void UpdateOutputs(void)
jolyon 4:dce5fc58abe9 744 {
jolyon 4:dce5fc58abe9 745 //good LED so turn on Outputs
jolyon 4:dce5fc58abe9 746 switch (Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 747 {
jolyon 4:dce5fc58abe9 748 case STD_RED:
jolyon 4:dce5fc58abe9 749 case STD_GREEN:
jolyon 4:dce5fc58abe9 750 case STD_BLUE:
jolyon 4:dce5fc58abe9 751 case STD_YELLOW:
jolyon 4:dce5fc58abe9 752 {
jolyon 4:dce5fc58abe9 753 if (SensorResult == Config[(SensorNumber << 1)])
jolyon 4:dce5fc58abe9 754 {
jolyon 4:dce5fc58abe9 755 SetOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 756 }
jolyon 4:dce5fc58abe9 757 else
jolyon 4:dce5fc58abe9 758 {
jolyon 4:dce5fc58abe9 759 ClearOutputBit(Config[((SensorNumber << 1)+1)]);
jolyon 4:dce5fc58abe9 760 }
jolyon 4:dce5fc58abe9 761 }
jolyon 4:dce5fc58abe9 762 break;
jolyon 4:dce5fc58abe9 763
jolyon 4:dce5fc58abe9 764 case GREEN_YELLOW:
jolyon 4:dce5fc58abe9 765 {
jolyon 4:dce5fc58abe9 766 if (SensorResult == YELLOW)
jolyon 4:dce5fc58abe9 767 {
jolyon 4:dce5fc58abe9 768 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 769 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 770 }
jolyon 4:dce5fc58abe9 771 else
jolyon 4:dce5fc58abe9 772 {
jolyon 4:dce5fc58abe9 773 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 774 {
jolyon 4:dce5fc58abe9 775 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 776 SetOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 777 }
jolyon 4:dce5fc58abe9 778 else
jolyon 4:dce5fc58abe9 779 {
jolyon 4:dce5fc58abe9 780 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 781 ClearOutputBit( Config[((SensorNumber << 1)+1)] +1);//next output
jolyon 4:dce5fc58abe9 782 }
jolyon 4:dce5fc58abe9 783 }
jolyon 4:dce5fc58abe9 784 }
jolyon 4:dce5fc58abe9 785 break;
jolyon 4:dce5fc58abe9 786
jolyon 4:dce5fc58abe9 787 case RGB:
jolyon 4:dce5fc58abe9 788 {
jolyon 4:dce5fc58abe9 789 if (SensorResult == RED)
jolyon 4:dce5fc58abe9 790 {
jolyon 4:dce5fc58abe9 791 SetOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 792 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 793 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 794 }
jolyon 4:dce5fc58abe9 795 else
jolyon 4:dce5fc58abe9 796 {
jolyon 4:dce5fc58abe9 797 if (SensorResult == GREEN)
jolyon 4:dce5fc58abe9 798 {
jolyon 4:dce5fc58abe9 799 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 800 SetOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 801 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 802 }
jolyon 4:dce5fc58abe9 803 else
jolyon 4:dce5fc58abe9 804 {
jolyon 4:dce5fc58abe9 805 if (SensorResult == BLUE)
jolyon 4:dce5fc58abe9 806 {
jolyon 4:dce5fc58abe9 807 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 808 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 809 SetOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 810 }
jolyon 4:dce5fc58abe9 811 else
jolyon 4:dce5fc58abe9 812 {
jolyon 4:dce5fc58abe9 813 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 814 ClearOutputBit(Config[((SensorNumber << 1)+1)] +1); //next output
jolyon 4:dce5fc58abe9 815 ClearOutputBit(Config[((SensorNumber << 1)+1)] +2); //next output
jolyon 4:dce5fc58abe9 816 }
jolyon 4:dce5fc58abe9 817
jolyon 4:dce5fc58abe9 818 }
jolyon 4:dce5fc58abe9 819 }
jolyon 4:dce5fc58abe9 820 }
jolyon 4:dce5fc58abe9 821 break;
jolyon 4:dce5fc58abe9 822
jolyon 4:dce5fc58abe9 823 default:
jolyon 4:dce5fc58abe9 824 {
jolyon 4:dce5fc58abe9 825 ClearOutputBit(Config[((SensorNumber << 1)+1)]); //base output
jolyon 4:dce5fc58abe9 826 }
jolyon 4:dce5fc58abe9 827 break;
jolyon 4:dce5fc58abe9 828 } //end switch
jolyon 4:dce5fc58abe9 829 }
jolyon 4:dce5fc58abe9 830
jolyon 4:dce5fc58abe9 831 void ShowLeds(char WhichColour)
jolyon 4:dce5fc58abe9 832 {
jolyon 8:e6e4eece90f7 833 RedLed = 1;
jolyon 8:e6e4eece90f7 834 GreenLed = 1;
jolyon 8:e6e4eece90f7 835 BlueLed = 1;
jolyon 8:e6e4eece90f7 836 YellowLed = 1;
jolyon 4:dce5fc58abe9 837 switch (WhichColour)
jolyon 4:dce5fc58abe9 838 {
jolyon 4:dce5fc58abe9 839 case RED:
jolyon 4:dce5fc58abe9 840 {
jolyon 8:e6e4eece90f7 841 RedLed = 0;
jolyon 4:dce5fc58abe9 842 }
jolyon 4:dce5fc58abe9 843 break;
jolyon 4:dce5fc58abe9 844
jolyon 4:dce5fc58abe9 845 case GREEN:
jolyon 4:dce5fc58abe9 846 {
jolyon 8:e6e4eece90f7 847 GreenLed = 0;
jolyon 4:dce5fc58abe9 848 }
jolyon 4:dce5fc58abe9 849 break;
jolyon 4:dce5fc58abe9 850
jolyon 4:dce5fc58abe9 851 case BLUE:
jolyon 4:dce5fc58abe9 852 {
jolyon 8:e6e4eece90f7 853 BlueLed = 0;
jolyon 4:dce5fc58abe9 854 }
jolyon 4:dce5fc58abe9 855 break;
jolyon 4:dce5fc58abe9 856
jolyon 4:dce5fc58abe9 857 case YELLOW:
jolyon 4:dce5fc58abe9 858 {
jolyon 8:e6e4eece90f7 859 YellowLed = 0;
jolyon 4:dce5fc58abe9 860 }
jolyon 4:dce5fc58abe9 861 break;
jolyon 4:dce5fc58abe9 862
jolyon 4:dce5fc58abe9 863 default:
jolyon 4:dce5fc58abe9 864 {
jolyon 4:dce5fc58abe9 865 }
jolyon 4:dce5fc58abe9 866 break;
jolyon 4:dce5fc58abe9 867 }
jolyon 4:dce5fc58abe9 868 }
jolyon 4:dce5fc58abe9 869
jolyon 12:eab1bc88fe68 870
jolyon 13:ef2f1c11e33b 871 void SaveSensorData(uint8_t Mode)
jolyon 13:ef2f1c11e33b 872 {
jolyon 13:ef2f1c11e33b 873 uint8_t MemSave;
jolyon 13:ef2f1c11e33b 874 for (MemSave = 0;MemSave <32;MemSave++)
jolyon 13:ef2f1c11e33b 875 {
jolyon 13:ef2f1c11e33b 876 if (Mode == 1)
jolyon 13:ef2f1c11e33b 877 {
jolyon 13:ef2f1c11e33b 878 ConfigMemory.write(MemSave,(int8_t)Config[MemSave]);
jolyon 13:ef2f1c11e33b 879 }
jolyon 13:ef2f1c11e33b 880 else
jolyon 13:ef2f1c11e33b 881 {
jolyon 13:ef2f1c11e33b 882 ConfigMemory.write(MemSave,0);
jolyon 13:ef2f1c11e33b 883
jolyon 13:ef2f1c11e33b 884 }
jolyon 13:ef2f1c11e33b 885 }
jolyon 13:ef2f1c11e33b 886 LoadSensorData(); //re-load data from EEProm to be sure
jolyon 13:ef2f1c11e33b 887 }
jolyon 13:ef2f1c11e33b 888
jolyon 13:ef2f1c11e33b 889 void LoadSensorData(void)
jolyon 12:eab1bc88fe68 890 {
jolyon 13:ef2f1c11e33b 891 uint8_t MemSave;
jolyon 13:ef2f1c11e33b 892 // uint8_t FailFlag = 0;
jolyon 13:ef2f1c11e33b 893 uint8_t MemData;
jolyon 13:ef2f1c11e33b 894
jolyon 13:ef2f1c11e33b 895 for (MemSave = 0;MemSave <32;MemSave++)
jolyon 13:ef2f1c11e33b 896 {
jolyon 13:ef2f1c11e33b 897 ConfigMemory.read(MemSave,(int8_t&)MemData);
jolyon 13:ef2f1c11e33b 898 Config[MemSave]= MemData;
jolyon 13:ef2f1c11e33b 899 /*
jolyon 13:ef2f1c11e33b 900 if (MemSave == 0)
jolyon 13:ef2f1c11e33b 901 {
jolyon 13:ef2f1c11e33b 902 if (Config[MemSave] > 6) //case of no config (a bit rough!)
jolyon 13:ef2f1c11e33b 903 {
jolyon 13:ef2f1c11e33b 904 FailFlag = 1;
jolyon 13:ef2f1c11e33b 905 }
jolyon 13:ef2f1c11e33b 906 }
jolyon 13:ef2f1c11e33b 907 */
jolyon 13:ef2f1c11e33b 908 }
jolyon 13:ef2f1c11e33b 909 /*
jolyon 13:ef2f1c11e33b 910 if(FailFlag == 1)
jolyon 13:ef2f1c11e33b 911 {
jolyon 13:ef2f1c11e33b 912
jolyon 13:ef2f1c11e33b 913 SaveSensorData(0); //force default
jolyon 13:ef2f1c11e33b 914 }
jolyon 13:ef2f1c11e33b 915 */
jolyon 12:eab1bc88fe68 916 }
jolyon 12:eab1bc88fe68 917
jolyon 12:eab1bc88fe68 918
jolyon 12:eab1bc88fe68 919
jolyon 12:eab1bc88fe68 920
jolyon 10:efe8585f7fa4 921 void InitCommsPort(void)
jolyon 10:efe8585f7fa4 922 {
jolyon 10:efe8585f7fa4 923 Serial RS485(p26,p25);
jolyon 10:efe8585f7fa4 924 RS485.baud(19200);
jolyon 10:efe8585f7fa4 925 RS485.format(8,RS485.None,1); //8 data, no Parity, 1 stop bit
jolyon 10:efe8585f7fa4 926 //set up the other stuff!
jolyon 10:efe8585f7fa4 927 LPC_PINCON->PINSEL4 &= 0x0ffff;
jolyon 10:efe8585f7fa4 928 LPC_PINCON->PINSEL4 |= 0x0AAAA;
jolyon 10:efe8585f7fa4 929
jolyon 10:efe8585f7fa4 930 LPC_UART1->RS485CTRL = (1<<3)|(1<<4)|(1<<5);
jolyon 10:efe8585f7fa4 931 LPC_UART1->RS485DLY = 1;
jolyon 10:efe8585f7fa4 932 RS485.putc('*');
jolyon 10:efe8585f7fa4 933 }
jolyon 10:efe8585f7fa4 934
jolyon 10:efe8585f7fa4 935 void HandleRS485(void)
jolyon 10:efe8585f7fa4 936 {
jolyon 10:efe8585f7fa4 937 //check for character in buffer
jolyon 10:efe8585f7fa4 938 if (RS485.readable())
jolyon 10:efe8585f7fa4 939 {
jolyon 10:efe8585f7fa4 940 CommsData = RS485.getc();
jolyon 10:efe8585f7fa4 941 if (CommsData== '*') //check for correct request
jolyon 10:efe8585f7fa4 942 {
jolyon 10:efe8585f7fa4 943 RS485.putc('*');
jolyon 10:efe8585f7fa4 944 CommsData = (char)(OutputData >> 8);
jolyon 10:efe8585f7fa4 945 RS485.putc(CommsData);
jolyon 10:efe8585f7fa4 946 CommsData = (char)(OutputData & 0xFF);
jolyon 10:efe8585f7fa4 947 RS485.putc(CommsData);
jolyon 10:efe8585f7fa4 948 }
jolyon 10:efe8585f7fa4 949 }
jolyon 10:efe8585f7fa4 950 }
jolyon 11:729eb224dce6 951
jolyon 11:729eb224dce6 952
jolyon 11:729eb224dce6 953 void HandleDisplay(void)
jolyon 11:729eb224dce6 954 {
jolyon 11:729eb224dce6 955 uint8_t CurrentButton =0;
jolyon 11:729eb224dce6 956 /*
jolyon 11:729eb224dce6 957 #define NEWBUTTON 0x80
jolyon 11:729eb224dce6 958 #define UPBUTTON 0x01
jolyon 11:729eb224dce6 959 #define DOWNBUTTON 0x02
jolyon 11:729eb224dce6 960 #define LEFTBUTTON 0x03
jolyon 11:729eb224dce6 961 #define RIGHTBUTTON 0x04
jolyon 11:729eb224dce6 962 #define TICKBUTTON 0x05
jolyon 11:729eb224dce6 963 */
jolyon 11:729eb224dce6 964 CurrentButton = GetButtonState();
jolyon 11:729eb224dce6 965
jolyon 11:729eb224dce6 966 //------------------- select the sensor ----------------
jolyon 11:729eb224dce6 967 if (CurrentButton == (UPBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 968 {
jolyon 11:729eb224dce6 969 DisplayScreen++;
jolyon 12:eab1bc88fe68 970 if (DisplayScreen == 18)
jolyon 11:729eb224dce6 971 {
jolyon 11:729eb224dce6 972 DisplayScreen = 0;
jolyon 11:729eb224dce6 973 }
jolyon 11:729eb224dce6 974 }
jolyon 11:729eb224dce6 975 else
jolyon 11:729eb224dce6 976 {
jolyon 11:729eb224dce6 977 if (CurrentButton == (DOWNBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 978 {
jolyon 11:729eb224dce6 979 DisplayScreen--;
jolyon 11:729eb224dce6 980 if (DisplayScreen == 255)
jolyon 11:729eb224dce6 981 {
jolyon 13:ef2f1c11e33b 982 DisplayScreen = 17;
jolyon 11:729eb224dce6 983 }
jolyon 11:729eb224dce6 984 }
jolyon 11:729eb224dce6 985 }
jolyon 11:729eb224dce6 986
jolyon 12:eab1bc88fe68 987 //check for config save
jolyon 12:eab1bc88fe68 988 if (DisplayScreen == 17)
jolyon 12:eab1bc88fe68 989 {
jolyon 12:eab1bc88fe68 990 lcd.locate(0, 0);
jolyon 13:ef2f1c11e33b 991 lcd.printf("RIGHT - SAVE ");
jolyon 13:ef2f1c11e33b 992 lcd.locate(0, 1);
jolyon 13:ef2f1c11e33b 993 lcd.printf("LEFT - DEFAULT ");
jolyon 12:eab1bc88fe68 994
jolyon 12:eab1bc88fe68 995 if (CurrentButton == (RIGHTBUTTON | NEWBUTTON))
jolyon 12:eab1bc88fe68 996 {
jolyon 13:ef2f1c11e33b 997 SaveSensorData(1);
jolyon 13:ef2f1c11e33b 998 }
jolyon 13:ef2f1c11e33b 999
jolyon 11:729eb224dce6 1000 if (CurrentButton == (LEFTBUTTON | NEWBUTTON))
jolyon 11:729eb224dce6 1001 {
jolyon 13:ef2f1c11e33b 1002 SaveSensorData(0);
jolyon 13:ef2f1c11e33b 1003 }
jolyon 13:ef2f1c11e33b 1004
jolyon 11:729eb224dce6 1005 }
jolyon 13:ef2f1c11e33b 1006 else
jolyon 13:ef2f1c11e33b 1007 {
jolyon 13:ef2f1c11e33b 1008
jolyon 13:ef2f1c11e33b 1009 //------------------- select the sensor type ----------------
jolyon 13:ef2f1c11e33b 1010 DisplaySensorType = Config[(DisplayScreen-1)*2];
jolyon 13:ef2f1c11e33b 1011
jolyon 13:ef2f1c11e33b 1012 if (CurrentButton == (RIGHTBUTTON | NEWBUTTON))
jolyon 13:ef2f1c11e33b 1013 {
jolyon 13:ef2f1c11e33b 1014 if (DisplaySensorType < 6)
jolyon 13:ef2f1c11e33b 1015 {
jolyon 13:ef2f1c11e33b 1016 DisplaySensorType++;
jolyon 13:ef2f1c11e33b 1017 Config[(DisplayScreen-1)*2] = DisplaySensorType;
jolyon 13:ef2f1c11e33b 1018 }
jolyon 13:ef2f1c11e33b 1019 }
jolyon 13:ef2f1c11e33b 1020 else
jolyon 13:ef2f1c11e33b 1021 {
jolyon 13:ef2f1c11e33b 1022 if (CurrentButton == (LEFTBUTTON | NEWBUTTON))
jolyon 13:ef2f1c11e33b 1023 {
jolyon 13:ef2f1c11e33b 1024 if (DisplaySensorType > 0)
jolyon 13:ef2f1c11e33b 1025 {
jolyon 13:ef2f1c11e33b 1026 DisplaySensorType--;
jolyon 13:ef2f1c11e33b 1027 Config[(DisplayScreen-1)*2] = DisplaySensorType;
jolyon 13:ef2f1c11e33b 1028 }
jolyon 13:ef2f1c11e33b 1029 }
jolyon 13:ef2f1c11e33b 1030 }
jolyon 13:ef2f1c11e33b 1031
jolyon 13:ef2f1c11e33b 1032 //update output list
jolyon 13:ef2f1c11e33b 1033 CreateOutputTable();
jolyon 13:ef2f1c11e33b 1034
jolyon 13:ef2f1c11e33b 1035 //show current config setting
jolyon 13:ef2f1c11e33b 1036 DisplaySensorType = Config[(DisplayScreen-1)*2];
jolyon 13:ef2f1c11e33b 1037 DisplaySensorOutput = Config[(DisplayScreen-1)*2 +1];
jolyon 13:ef2f1c11e33b 1038
jolyon 13:ef2f1c11e33b 1039 if (DisplayScreen !=0)
jolyon 13:ef2f1c11e33b 1040 {
jolyon 13:ef2f1c11e33b 1041 lcd.locate(0, 0);
jolyon 13:ef2f1c11e33b 1042 lcd.printf("Sensor %02i %s", DisplayScreen, LEDTypes[DisplaySensorType]);
jolyon 13:ef2f1c11e33b 1043 lcd.locate(0, 1);
jolyon 13:ef2f1c11e33b 1044
jolyon 13:ef2f1c11e33b 1045 //ConfigMemory.read(0,(int8_t&)DisplaySensorOutput);
jolyon 13:ef2f1c11e33b 1046 //lcd.printf("First Output %02i ",DisplaySensorOutput);
jolyon 13:ef2f1c11e33b 1047
jolyon 13:ef2f1c11e33b 1048 if (DisplaySensorType > 4)
jolyon 13:ef2f1c11e33b 1049 {
jolyon 13:ef2f1c11e33b 1050 lcd.printf("First O/P CN3.%02i",DisplaySensorOutput+2); //add 2 just for display purposes to match schematic
jolyon 13:ef2f1c11e33b 1051 }
jolyon 13:ef2f1c11e33b 1052 else
jolyon 13:ef2f1c11e33b 1053 {
jolyon 13:ef2f1c11e33b 1054 if (DisplaySensorType > 0)
jolyon 13:ef2f1c11e33b 1055 {
jolyon 13:ef2f1c11e33b 1056 lcd.printf("Output CN3.%02i",DisplaySensorOutput+2); //add 2 just for display purposes to match schematic
jolyon 13:ef2f1c11e33b 1057 }
jolyon 13:ef2f1c11e33b 1058 else
jolyon 13:ef2f1c11e33b 1059 {
jolyon 13:ef2f1c11e33b 1060 lcd.printf("No Output "); //add 2 just for display purposes to match schematic
jolyon 13:ef2f1c11e33b 1061 }
jolyon 13:ef2f1c11e33b 1062 }
jolyon 13:ef2f1c11e33b 1063
jolyon 13:ef2f1c11e33b 1064
jolyon 13:ef2f1c11e33b 1065
jolyon 13:ef2f1c11e33b 1066 }
jolyon 11:729eb224dce6 1067 }
jolyon 11:729eb224dce6 1068 }
jolyon 11:729eb224dce6 1069
jolyon 12:eab1bc88fe68 1070 void CreateOutputTable(void)
jolyon 12:eab1bc88fe68 1071 {
jolyon 12:eab1bc88fe68 1072 uint8_t CurrentSensor;
jolyon 12:eab1bc88fe68 1073 uint8_t CurrentOutput = 0; //set to first output
jolyon 12:eab1bc88fe68 1074
jolyon 12:eab1bc88fe68 1075 for (CurrentSensor = 0; CurrentSensor <15; CurrentSensor++)
jolyon 12:eab1bc88fe68 1076 {
jolyon 12:eab1bc88fe68 1077 //set the start output for next sensor
jolyon 12:eab1bc88fe68 1078 CurrentOutput += OutputCount[Config[(CurrentSensor)*2]];
jolyon 12:eab1bc88fe68 1079 if( CurrentOutput >15 )
jolyon 12:eab1bc88fe68 1080 {
jolyon 12:eab1bc88fe68 1081 CurrentOutput = 15;
jolyon 12:eab1bc88fe68 1082 }
jolyon 12:eab1bc88fe68 1083 Config[(CurrentSensor+1)*2 +1] = CurrentOutput;
jolyon 12:eab1bc88fe68 1084
jolyon 12:eab1bc88fe68 1085 }
jolyon 12:eab1bc88fe68 1086 }
jolyon 10:efe8585f7fa4 1087
jolyon 3:b8218b61b0e2 1088
jolyon 0:9d301ae51ecf 1089 int main()
jolyon 0:9d301ae51ecf 1090 {
jolyon 6:6346ef2b4638 1091 InitOutputs(); //set up output driver chip
jolyon 6:6346ef2b4638 1092 ConfigureTSC(0); //Initialise all TCS34725's
jolyon 10:efe8585f7fa4 1093 InitCommsPort(); //Initialise the 485 port
jolyon 0:9d301ae51ecf 1094
jolyon 13:ef2f1c11e33b 1095 //load config
jolyon 13:ef2f1c11e33b 1096 LoadSensorData();
jolyon 13:ef2f1c11e33b 1097
jolyon 13:ef2f1c11e33b 1098 lcd.setCursor(TextLCD::CurOff_BlkOff);
jolyon 10:efe8585f7fa4 1099
jolyon 1:d99dad8a1f50 1100 while(1)
jolyon 1:d99dad8a1f50 1101 {
jolyon 6:6346ef2b4638 1102 GetThresholds(); //update thresholds
jolyon 6:6346ef2b4638 1103 wait(0.1); //100ms Update Cycle
jolyon 4:dce5fc58abe9 1104 OutputData = 0;
jolyon 2:4a8eacbb3657 1105
jolyon 3:b8218b61b0e2 1106 for(SensorNumber = 0; SensorNumber < 16; SensorNumber++)
jolyon 3:b8218b61b0e2 1107 {
jolyon 4:dce5fc58abe9 1108 if(Config[((SensorNumber << 1))] != NOTUSED) //check to see if the sensor is being used
jolyon 3:b8218b61b0e2 1109 {
jolyon 3:b8218b61b0e2 1110 SensorData = GetSensorData(SensorNumber);
jolyon 3:b8218b61b0e2 1111
jolyon 3:b8218b61b0e2 1112 White = SensorData.White;
jolyon 3:b8218b61b0e2 1113 Red = SensorData.Red;
jolyon 3:b8218b61b0e2 1114 Green = SensorData.Green;
jolyon 3:b8218b61b0e2 1115 Blue = SensorData.Blue;
jolyon 0:9d301ae51ecf 1116
jolyon 6:6346ef2b4638 1117 ScaleColours();
jolyon 6:6346ef2b4638 1118
jolyon 3:b8218b61b0e2 1119 // work out % of colour mix
jolyon 3:b8218b61b0e2 1120 Temp = (Red+Blue+Green);
jolyon 3:b8218b61b0e2 1121 RedProp = (Red* 100) / Temp ;
jolyon 3:b8218b61b0e2 1122 GreenProp = (Green* 100) / Temp ;
jolyon 3:b8218b61b0e2 1123 BlueProp = (Blue* 100) / Temp ;
jolyon 3:b8218b61b0e2 1124
jolyon 3:b8218b61b0e2 1125 SensorResult = GetResults(SensorNumber);
jolyon 4:dce5fc58abe9 1126 UpdateOutputs();
jolyon 8:e6e4eece90f7 1127
jolyon 8:e6e4eece90f7 1128 if (SensorNumber == GetModeSwitch())
jolyon 8:e6e4eece90f7 1129 {
jolyon 11:729eb224dce6 1130 if (DisplayScreen == 0)
jolyon 11:729eb224dce6 1131 {
jolyon 11:729eb224dce6 1132 UpdateDisplay();
jolyon 11:729eb224dce6 1133 ShowLeds(SensorResult);
jolyon 11:729eb224dce6 1134 }
jolyon 8:e6e4eece90f7 1135 }
jolyon 8:e6e4eece90f7 1136
jolyon 3:b8218b61b0e2 1137 } //end if
jolyon 8:e6e4eece90f7 1138 else
jolyon 8:e6e4eece90f7 1139 {
jolyon 12:eab1bc88fe68 1140 if (DisplayScreen == 0)
jolyon 8:e6e4eece90f7 1141 {
jolyon 12:eab1bc88fe68 1142 if (SensorNumber == GetModeSwitch())
jolyon 12:eab1bc88fe68 1143 {
jolyon 12:eab1bc88fe68 1144 lcd.locate(0, 0);
jolyon 12:eab1bc88fe68 1145 lcd.printf("INVALID SENSOR ");
jolyon 12:eab1bc88fe68 1146 lcd.locate(0, 1);
jolyon 12:eab1bc88fe68 1147 lcd.printf("%02i ",GetModeSwitch() );
jolyon 12:eab1bc88fe68 1148 }
jolyon 8:e6e4eece90f7 1149 }
jolyon 11:729eb224dce6 1150 }
jolyon 11:729eb224dce6 1151
jolyon 8:e6e4eece90f7 1152
jolyon 8:e6e4eece90f7 1153
jolyon 3:b8218b61b0e2 1154 } //end for
jolyon 8:e6e4eece90f7 1155 WriteOutputPort(OutputData);
jolyon 8:e6e4eece90f7 1156 //WriteOutputPort(OutputDataB);
jolyon 8:e6e4eece90f7 1157 //OutputDataB>>=1;
jolyon 8:e6e4eece90f7 1158 //if(OutputDataB == 0)
jolyon 8:e6e4eece90f7 1159 //{
jolyon 8:e6e4eece90f7 1160 // OutputDataB = 0x8000;
jolyon 10:efe8585f7fa4 1161 //}
jolyon 11:729eb224dce6 1162 HandleDisplay();
jolyon 10:efe8585f7fa4 1163 //Handle Comms
jolyon 10:efe8585f7fa4 1164 HandleRS485();
jolyon 3:b8218b61b0e2 1165 } //while(1)
jolyon 3:b8218b61b0e2 1166 }//main