This is a project to replace the 8051 on a existing RGB LED board and add USB functionality. The original board relied on 8051 firmware to control the LEDs so any changes required software development. This version provides a USB interface for LED control. The USB interface is implemented as a HID with a 9 byte OutReport. In conjunction with a simple GUI the RGB LED board can now be controlled to set color patterns, intensity and pattern sequencing.

Dependencies:   PCA9635-6 mbed USBDevice

RGB GUI - Windows program to control the PCA9635 board.

/media/uploads/JimCarver/rgb_led.jpg

Committer:
user3736966508731826368
Date:
Fri Dec 09 21:40:36 2011 +0000
Revision:
0:5e18eb7da208
Child:
1:ee2692588275
V0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
user3736966508731826368 0:5e18eb7da208 1 #include "mbed.h"
user3736966508731826368 0:5e18eb7da208 2 #include "i2cmessages.h"
user3736966508731826368 0:5e18eb7da208 3 #include "USBHID.h"
user3736966508731826368 0:5e18eb7da208 4
user3736966508731826368 0:5e18eb7da208 5 //We declare a USBHID device. By default input and output reports are 64 bytes long.
user3736966508731826368 0:5e18eb7da208 6 USBHID hid( 9, 1, 0x1Fc9, 0x0003, 0x0100, 1);
user3736966508731826368 0:5e18eb7da208 7
user3736966508731826368 0:5e18eb7da208 8 //This report will contain data to be sent
user3736966508731826368 0:5e18eb7da208 9 HID_REPORT send_report;
user3736966508731826368 0:5e18eb7da208 10 HID_REPORT recv_report;
user3736966508731826368 0:5e18eb7da208 11
user3736966508731826368 0:5e18eb7da208 12 Serial pc(USBTX, USBRX);
user3736966508731826368 0:5e18eb7da208 13
user3736966508731826368 0:5e18eb7da208 14 DigitalOut myled1(LED1);
user3736966508731826368 0:5e18eb7da208 15 DigitalOut myled2(LED2);
user3736966508731826368 0:5e18eb7da208 16 DigitalOut myled3(LED3);
user3736966508731826368 0:5e18eb7da208 17 DigitalOut myled4(LED4);
user3736966508731826368 0:5e18eb7da208 18 DigitalOut led_en(p8);
user3736966508731826368 0:5e18eb7da208 19 DigitalIn SW6(p11);
user3736966508731826368 0:5e18eb7da208 20 DigitalIn SW5(p30);
user3736966508731826368 0:5e18eb7da208 21
user3736966508731826368 0:5e18eb7da208 22 I2C i2c(p28, p27);
user3736966508731826368 0:5e18eb7da208 23
user3736966508731826368 0:5e18eb7da208 24 Timer ms_timer;
user3736966508731826368 0:5e18eb7da208 25
user3736966508731826368 0:5e18eb7da208 26 AnalogIn ain(p20);
user3736966508731826368 0:5e18eb7da208 27
user3736966508731826368 0:5e18eb7da208 28 /***************************************************************************
user3736966508731826368 0:5e18eb7da208 29 NAME OF MODULE: MAIN.C
user3736966508731826368 0:5e18eb7da208 30 DESCRIPTION: Main file for the LED String Demoboard
user3736966508731826368 0:5e18eb7da208 31
user3736966508731826368 0:5e18eb7da208 32 (C) Copyright 2008 NXP Semiconductors
user3736966508731826368 0:5e18eb7da208 33
user3736966508731826368 0:5e18eb7da208 34 ****************************************************************************/
user3736966508731826368 0:5e18eb7da208 35 BYTE dflag, tflag;
user3736966508731826368 0:5e18eb7da208 36
user3736966508731826368 0:5e18eb7da208 37 BYTE Buffer1[18];
user3736966508731826368 0:5e18eb7da208 38 BYTE Buffer2[18];
user3736966508731826368 0:5e18eb7da208 39 BYTE Buffer3[18];
user3736966508731826368 0:5e18eb7da208 40 BYTE Buffer4[18];
user3736966508731826368 0:5e18eb7da208 41 BYTE Buffer5[18];
user3736966508731826368 0:5e18eb7da208 42 BYTE Buffer6[18];
user3736966508731826368 0:5e18eb7da208 43
user3736966508731826368 0:5e18eb7da208 44 I2C_MESSAGE I2C_Message;
user3736966508731826368 0:5e18eb7da208 45 int dval;
user3736966508731826368 0:5e18eb7da208 46
user3736966508731826368 0:5e18eb7da208 47 typedef struct {
user3736966508731826368 0:5e18eb7da208 48 uint32_t LED;
user3736966508731826368 0:5e18eb7da208 49 uint8_t RED, GREEN, BLUE, INTENSITY;
user3736966508731826368 0:5e18eb7da208 50 } LED_Report_type ;
user3736966508731826368 0:5e18eb7da208 51
user3736966508731826368 0:5e18eb7da208 52 volatile LED_Report_type *LED_Report;
user3736966508731826368 0:5e18eb7da208 53
user3736966508731826368 0:5e18eb7da208 54
user3736966508731826368 0:5e18eb7da208 55 typedef struct {
user3736966508731826368 0:5e18eb7da208 56 // Definition for a LED location, buffer pointer, and index into that buffer
user3736966508731826368 0:5e18eb7da208 57 BYTE *buf, n;
user3736966508731826368 0:5e18eb7da208 58 } LED_type;
user3736966508731826368 0:5e18eb7da208 59
user3736966508731826368 0:5e18eb7da208 60 typedef struct {
user3736966508731826368 0:5e18eb7da208 61 LED_type RED;
user3736966508731826368 0:5e18eb7da208 62 LED_type GREEN;
user3736966508731826368 0:5e18eb7da208 63 LED_type BLUE;
user3736966508731826368 0:5e18eb7da208 64 } RGB_type;
user3736966508731826368 0:5e18eb7da208 65
user3736966508731826368 0:5e18eb7da208 66 typedef struct {
user3736966508731826368 0:5e18eb7da208 67 uint8_t r, g, b;
user3736966508731826368 0:5e18eb7da208 68 } RB_type;
user3736966508731826368 0:5e18eb7da208 69
user3736966508731826368 0:5e18eb7da208 70 RB_type Rainbow[] = {
user3736966508731826368 0:5e18eb7da208 71 255, 0, 0,
user3736966508731826368 0:5e18eb7da208 72 255, 23, 0,
user3736966508731826368 0:5e18eb7da208 73 255, 64, 0,
user3736966508731826368 0:5e18eb7da208 74 255, 127, 0,
user3736966508731826368 0:5e18eb7da208 75 255, 193, 0,
user3736966508731826368 0:5e18eb7da208 76 255, 255, 0,
user3736966508731826368 0:5e18eb7da208 77 193, 255, 0,
user3736966508731826368 0:5e18eb7da208 78 127, 255, 0,
user3736966508731826368 0:5e18eb7da208 79 127, 255, 0,
user3736966508731826368 0:5e18eb7da208 80 63, 255, 0,
user3736966508731826368 0:5e18eb7da208 81 0, 255, 0,
user3736966508731826368 0:5e18eb7da208 82 0, 255, 7,
user3736966508731826368 0:5e18eb7da208 83 0, 255, 15,
user3736966508731826368 0:5e18eb7da208 84 0, 255, 31,
user3736966508731826368 0:5e18eb7da208 85 0, 255, 63,
user3736966508731826368 0:5e18eb7da208 86 0, 255, 91,
user3736966508731826368 0:5e18eb7da208 87 0, 255, 127,
user3736966508731826368 0:5e18eb7da208 88 0, 255, 193,
user3736966508731826368 0:5e18eb7da208 89 0, 255, 255,
user3736966508731826368 0:5e18eb7da208 90 0, 193, 255,
user3736966508731826368 0:5e18eb7da208 91 0, 127, 255,
user3736966508731826368 0:5e18eb7da208 92 0, 63, 255,
user3736966508731826368 0:5e18eb7da208 93 0, 0, 255,
user3736966508731826368 0:5e18eb7da208 94 31, 0, 255,
user3736966508731826368 0:5e18eb7da208 95 63, 0, 255,
user3736966508731826368 0:5e18eb7da208 96 127, 0, 255,
user3736966508731826368 0:5e18eb7da208 97 193, 0, 255,
user3736966508731826368 0:5e18eb7da208 98 255, 0, 255,
user3736966508731826368 0:5e18eb7da208 99 255, 0, 193,
user3736966508731826368 0:5e18eb7da208 100 255, 0, 127,
user3736966508731826368 0:5e18eb7da208 101 255, 0, 63,
user3736966508731826368 0:5e18eb7da208 102 255, 0, 15
user3736966508731826368 0:5e18eb7da208 103 };
user3736966508731826368 0:5e18eb7da208 104
user3736966508731826368 0:5e18eb7da208 105 // An array of structures that define the buffer and location in the buffer for all of the LEDs
user3736966508731826368 0:5e18eb7da208 106 // Due to the design of the RGB LED board this is easier than the convoluted calculation needed
user3736966508731826368 0:5e18eb7da208 107 //
user3736966508731826368 0:5e18eb7da208 108 RGB_type RGB_LED[32] = {
user3736966508731826368 0:5e18eb7da208 109 // RED GREEN BLUE
user3736966508731826368 0:5e18eb7da208 110 // LED1-16
user3736966508731826368 0:5e18eb7da208 111 Buffer1, 2, Buffer1, 3, Buffer1, 4,
user3736966508731826368 0:5e18eb7da208 112 Buffer1, 5, Buffer1, 6, Buffer1, 7,
user3736966508731826368 0:5e18eb7da208 113 Buffer1, 8, Buffer1, 9, Buffer1, 10,
user3736966508731826368 0:5e18eb7da208 114 Buffer1, 11, Buffer1, 12, Buffer1, 13,
user3736966508731826368 0:5e18eb7da208 115 Buffer1, 14, Buffer1, 15, Buffer1, 16,
user3736966508731826368 0:5e18eb7da208 116 Buffer1, 17, Buffer3, 2, Buffer3, 3,
user3736966508731826368 0:5e18eb7da208 117 Buffer3, 4, Buffer3, 5, Buffer3, 6,
user3736966508731826368 0:5e18eb7da208 118 Buffer3, 7, Buffer3, 8, Buffer3, 9,
user3736966508731826368 0:5e18eb7da208 119 Buffer3, 10, Buffer3, 11, Buffer3, 12,
user3736966508731826368 0:5e18eb7da208 120 Buffer3, 13, Buffer3, 14, Buffer3, 15,
user3736966508731826368 0:5e18eb7da208 121 Buffer3, 16, Buffer3, 17, Buffer5, 2,
user3736966508731826368 0:5e18eb7da208 122 Buffer5, 3, Buffer5, 4, Buffer5, 5,
user3736966508731826368 0:5e18eb7da208 123 Buffer5, 6, Buffer5, 7, Buffer5, 8,
user3736966508731826368 0:5e18eb7da208 124 Buffer5, 9, Buffer5, 10, Buffer5, 11,
user3736966508731826368 0:5e18eb7da208 125 Buffer5, 12, Buffer5, 13, Buffer5, 14,
user3736966508731826368 0:5e18eb7da208 126 Buffer5, 15, Buffer5, 16, Buffer5, 17,
user3736966508731826368 0:5e18eb7da208 127
user3736966508731826368 0:5e18eb7da208 128 // LED17-32
user3736966508731826368 0:5e18eb7da208 129 Buffer2, 2, Buffer2, 3, Buffer2, 4,
user3736966508731826368 0:5e18eb7da208 130 Buffer2, 5, Buffer2, 6, Buffer2, 7,
user3736966508731826368 0:5e18eb7da208 131 Buffer2, 8, Buffer2, 9, Buffer2, 10,
user3736966508731826368 0:5e18eb7da208 132 Buffer2, 11, Buffer2, 12, Buffer2, 13,
user3736966508731826368 0:5e18eb7da208 133 Buffer2, 14, Buffer2, 15, Buffer2, 16,
user3736966508731826368 0:5e18eb7da208 134 Buffer2, 17, Buffer4, 2, Buffer4, 3,
user3736966508731826368 0:5e18eb7da208 135 Buffer4, 4, Buffer4, 5, Buffer4, 6,
user3736966508731826368 0:5e18eb7da208 136 Buffer4, 7, Buffer4, 8, Buffer4, 9,
user3736966508731826368 0:5e18eb7da208 137 Buffer4, 10, Buffer4, 11, Buffer4, 12,
user3736966508731826368 0:5e18eb7da208 138 Buffer4, 13, Buffer4, 14, Buffer4, 15,
user3736966508731826368 0:5e18eb7da208 139 Buffer4, 16, Buffer4, 17, Buffer6, 2,
user3736966508731826368 0:5e18eb7da208 140 Buffer6, 3, Buffer6, 4, Buffer6, 5,
user3736966508731826368 0:5e18eb7da208 141 Buffer6, 6, Buffer6, 7, Buffer6, 8,
user3736966508731826368 0:5e18eb7da208 142 Buffer6, 9, Buffer6, 10, Buffer6, 11,
user3736966508731826368 0:5e18eb7da208 143 Buffer6, 12, Buffer6, 13, Buffer6, 14,
user3736966508731826368 0:5e18eb7da208 144 Buffer6, 15, Buffer6, 16, Buffer6, 17 };
user3736966508731826368 0:5e18eb7da208 145
user3736966508731826368 0:5e18eb7da208 146 //
user3736966508731826368 0:5e18eb7da208 147 // Lookup the buffer and index to set the desired values
user3736966508731826368 0:5e18eb7da208 148 // in the appropriate locations within the I2C message buffers
user3736966508731826368 0:5e18eb7da208 149 // update_LED() actually sends the buffers through I2C to the drivers
user3736966508731826368 0:5e18eb7da208 150 //
user3736966508731826368 0:5e18eb7da208 151 void set_LED(int LEDn, BYTE R, BYTE G, BYTE B)
user3736966508731826368 0:5e18eb7da208 152 {
user3736966508731826368 0:5e18eb7da208 153 RGB_LED[LEDn].RED.buf[RGB_LED[LEDn].RED.n] = R;
user3736966508731826368 0:5e18eb7da208 154 RGB_LED[LEDn].GREEN.buf[RGB_LED[LEDn].GREEN.n] = G;
user3736966508731826368 0:5e18eb7da208 155 RGB_LED[LEDn].BLUE.buf[RGB_LED[LEDn].BLUE.n] = B;
user3736966508731826368 0:5e18eb7da208 156 }
user3736966508731826368 0:5e18eb7da208 157
user3736966508731826368 0:5e18eb7da208 158 void set_my_LED(int c)
user3736966508731826368 0:5e18eb7da208 159 {
user3736966508731826368 0:5e18eb7da208 160 if(c & 1) { myled4 = 1; } else { myled4 = 0; }
user3736966508731826368 0:5e18eb7da208 161 if(c & 2) { myled3 = 1; } else { myled3 = 0; }
user3736966508731826368 0:5e18eb7da208 162 if(c & 4) { myled2 = 1; } else { myled2 = 0; }
user3736966508731826368 0:5e18eb7da208 163 if(c & 8) { myled1 = 1; } else { myled1 = 0; }
user3736966508731826368 0:5e18eb7da208 164 }
user3736966508731826368 0:5e18eb7da208 165
user3736966508731826368 0:5e18eb7da208 166 /***********************************************************************
user3736966508731826368 0:5e18eb7da208 167 DESCRIPTION: Initalization of the buffers (Buffer1, buffer2, Buffer3)
user3736966508731826368 0:5e18eb7da208 168 INPUT(S): None
user3736966508731826368 0:5e18eb7da208 169 RETURNS: Nothing
user3736966508731826368 0:5e18eb7da208 170 ************************************************************************/
user3736966508731826368 0:5e18eb7da208 171 void Init_Buffers(void)
user3736966508731826368 0:5e18eb7da208 172 {
user3736966508731826368 0:5e18eb7da208 173 int i = 0;
user3736966508731826368 0:5e18eb7da208 174 for (i = 0; i<18; i++)
user3736966508731826368 0:5e18eb7da208 175 {
user3736966508731826368 0:5e18eb7da208 176 Buffer1[i] = 0;
user3736966508731826368 0:5e18eb7da208 177 Buffer2[i] = 0;
user3736966508731826368 0:5e18eb7da208 178 Buffer3[i] = 0;
user3736966508731826368 0:5e18eb7da208 179 Buffer4[i] = 0;
user3736966508731826368 0:5e18eb7da208 180 Buffer5[i] = 0;
user3736966508731826368 0:5e18eb7da208 181 Buffer6[i] = 0;
user3736966508731826368 0:5e18eb7da208 182 }
user3736966508731826368 0:5e18eb7da208 183
user3736966508731826368 0:5e18eb7da208 184 Buffer1[0] = 17;
user3736966508731826368 0:5e18eb7da208 185 Buffer2[0] = 17;
user3736966508731826368 0:5e18eb7da208 186 Buffer3[0] = 17;
user3736966508731826368 0:5e18eb7da208 187 Buffer4[0] = 17;
user3736966508731826368 0:5e18eb7da208 188 Buffer5[0] = 17;
user3736966508731826368 0:5e18eb7da208 189 Buffer6[0] = 17;
user3736966508731826368 0:5e18eb7da208 190 Buffer1[1] = 0x82;
user3736966508731826368 0:5e18eb7da208 191 Buffer2[1] = 0x82;
user3736966508731826368 0:5e18eb7da208 192 Buffer3[1] = 0x82;
user3736966508731826368 0:5e18eb7da208 193 Buffer4[1] = 0x82;
user3736966508731826368 0:5e18eb7da208 194 Buffer5[1] = 0x82;
user3736966508731826368 0:5e18eb7da208 195 Buffer6[1] = 0x82;
user3736966508731826368 0:5e18eb7da208 196 }
user3736966508731826368 0:5e18eb7da208 197
user3736966508731826368 0:5e18eb7da208 198
user3736966508731826368 0:5e18eb7da208 199 /***********************************************************************
user3736966508731826368 0:5e18eb7da208 200 DESCRIPTION: Fill all the PWM register of a device with a RGB setting
user3736966508731826368 0:5e18eb7da208 201 INPUT(S): A,B,C --> Primary colors
user3736966508731826368 0:5e18eb7da208 202 RETURNS: Nothing
user3736966508731826368 0:5e18eb7da208 203 ************************************************************************/
user3736966508731826368 0:5e18eb7da208 204 void Set_Same_Color_Single_Device(BYTE A, BYTE B, BYTE C)
user3736966508731826368 0:5e18eb7da208 205 {
user3736966508731826368 0:5e18eb7da208 206 int i;
user3736966508731826368 0:5e18eb7da208 207 Buffer1[0] = 17;
user3736966508731826368 0:5e18eb7da208 208 Buffer1[1] = 0x82;
user3736966508731826368 0:5e18eb7da208 209 for (i = 0; i < 5; i++)
user3736966508731826368 0:5e18eb7da208 210 {
user3736966508731826368 0:5e18eb7da208 211 Buffer1[3*i+2] = A;
user3736966508731826368 0:5e18eb7da208 212 Buffer1[3*i+3] = B;
user3736966508731826368 0:5e18eb7da208 213 Buffer1[3*i+4] = C;
user3736966508731826368 0:5e18eb7da208 214 }
user3736966508731826368 0:5e18eb7da208 215 Buffer1[17] = A;
user3736966508731826368 0:5e18eb7da208 216 }
user3736966508731826368 0:5e18eb7da208 217
user3736966508731826368 0:5e18eb7da208 218
user3736966508731826368 0:5e18eb7da208 219 void delay(int dd)
user3736966508731826368 0:5e18eb7da208 220 {
user3736966508731826368 0:5e18eb7da208 221 ms_timer.reset();
user3736966508731826368 0:5e18eb7da208 222 ms_timer.start();
user3736966508731826368 0:5e18eb7da208 223 while(ms_timer.read_ms() <= (dd));
user3736966508731826368 0:5e18eb7da208 224 ms_timer.stop();
user3736966508731826368 0:5e18eb7da208 225 }
user3736966508731826368 0:5e18eb7da208 226
user3736966508731826368 0:5e18eb7da208 227 void i2cfail(void)
user3736966508731826368 0:5e18eb7da208 228 {
user3736966508731826368 0:5e18eb7da208 229 int c = 0;
user3736966508731826368 0:5e18eb7da208 230 while(1) {
user3736966508731826368 0:5e18eb7da208 231 set_my_LED(c++);
user3736966508731826368 0:5e18eb7da208 232 delay(50);
user3736966508731826368 0:5e18eb7da208 233 }
user3736966508731826368 0:5e18eb7da208 234 }
user3736966508731826368 0:5e18eb7da208 235
user3736966508731826368 0:5e18eb7da208 236 void I2C_Write(I2C_MESSAGE *mp)
user3736966508731826368 0:5e18eb7da208 237 {
user3736966508731826368 0:5e18eb7da208 238 if(i2c.write(mp->address, (char *) &mp->buf[1], mp->buf[0])) i2cfail();
user3736966508731826368 0:5e18eb7da208 239 }
user3736966508731826368 0:5e18eb7da208 240
user3736966508731826368 0:5e18eb7da208 241 /***********************************************************************
user3736966508731826368 0:5e18eb7da208 242 DESCRIPTION: Set the I2C address to the ALL CALL Address and
user3736966508731826368 0:5e18eb7da208 243 send the I2C_Write command
user3736966508731826368 0:5e18eb7da208 244 INPUT(S): None
user3736966508731826368 0:5e18eb7da208 245 RETURNS: Nothing
user3736966508731826368 0:5e18eb7da208 246 ************************************************************************/
user3736966508731826368 0:5e18eb7da208 247 void Write_All_Devices(void)
user3736966508731826368 0:5e18eb7da208 248 {
user3736966508731826368 0:5e18eb7da208 249 I2C_Message.address = ALL_CALL_I2C_ADDRESS;
user3736966508731826368 0:5e18eb7da208 250 I2C_Write(&I2C_Message);
user3736966508731826368 0:5e18eb7da208 251 }
user3736966508731826368 0:5e18eb7da208 252
user3736966508731826368 0:5e18eb7da208 253
user3736966508731826368 0:5e18eb7da208 254 /***********************************************************************
user3736966508731826368 0:5e18eb7da208 255 DESCRIPTION: Set the I2C address to the required address and
user3736966508731826368 0:5e18eb7da208 256 send the I2C_Write command
user3736966508731826368 0:5e18eb7da208 257 INPUT(S): I2C Address of the targetted device (LSB = 0)
user3736966508731826368 0:5e18eb7da208 258 RETURNS: Nothing
user3736966508731826368 0:5e18eb7da208 259 ************************************************************************/
user3736966508731826368 0:5e18eb7da208 260 void Write_To_Device(BYTE I2C_Address)
user3736966508731826368 0:5e18eb7da208 261 {
user3736966508731826368 0:5e18eb7da208 262 I2C_Message.address = I2C_Address;
user3736966508731826368 0:5e18eb7da208 263 I2C_Write(&I2C_Message);
user3736966508731826368 0:5e18eb7da208 264 }
user3736966508731826368 0:5e18eb7da208 265
user3736966508731826368 0:5e18eb7da208 266
user3736966508731826368 0:5e18eb7da208 267 /***********************************************************************
user3736966508731826368 0:5e18eb7da208 268 DESCRIPTION: Set the I2C address to the required address and
user3736966508731826368 0:5e18eb7da208 269 send the I2C_Write command
user3736966508731826368 0:5e18eb7da208 270 Wait (delay) before moving to the next step
user3736966508731826368 0:5e18eb7da208 271 INPUT(S): I2C Address of the targetted device (LSB = 0)
user3736966508731826368 0:5e18eb7da208 272 Delay = delay in ms / 10
user3736966508731826368 0:5e18eb7da208 273 RETURNS: Nothing
user3736966508731826368 0:5e18eb7da208 274 ************************************************************************/
user3736966508731826368 0:5e18eb7da208 275 void Write_To_Device_And_Wait(BYTE I2C_Address, BYTE Delay_Value)
user3736966508731826368 0:5e18eb7da208 276 {
user3736966508731826368 0:5e18eb7da208 277 I2C_Message.address = I2C_Address;
user3736966508731826368 0:5e18eb7da208 278 I2C_Write(&I2C_Message);
user3736966508731826368 0:5e18eb7da208 279 delay(Delay_Value);
user3736966508731826368 0:5e18eb7da208 280 }
user3736966508731826368 0:5e18eb7da208 281
user3736966508731826368 0:5e18eb7da208 282
user3736966508731826368 0:5e18eb7da208 283 /***********************************************************************
user3736966508731826368 0:5e18eb7da208 284 DESCRIPTION: Swtich of ALL the LEDs using the ALL CALL address
user3736966508731826368 0:5e18eb7da208 285 INPUT(S): None
user3736966508731826368 0:5e18eb7da208 286 RETURNS: Nothing
user3736966508731826368 0:5e18eb7da208 287 ************************************************************************/
user3736966508731826368 0:5e18eb7da208 288 void ALL_LED_OFF(void) // Switch off all the LEDs
user3736966508731826368 0:5e18eb7da208 289 {
user3736966508731826368 0:5e18eb7da208 290 I2C_Message.buf = LED_ALL_OFF;
user3736966508731826368 0:5e18eb7da208 291 Write_All_Devices();
user3736966508731826368 0:5e18eb7da208 292 }
user3736966508731826368 0:5e18eb7da208 293
user3736966508731826368 0:5e18eb7da208 294
user3736966508731826368 0:5e18eb7da208 295 void LED_INTENSITY(void)
user3736966508731826368 0:5e18eb7da208 296 {
user3736966508731826368 0:5e18eb7da208 297 //GLOBAL_INTENSITY[2] = global_i;
user3736966508731826368 0:5e18eb7da208 298 I2C_Message.buf = GLOBAL_INTENSITY;
user3736966508731826368 0:5e18eb7da208 299 Write_All_Devices();
user3736966508731826368 0:5e18eb7da208 300 }
user3736966508731826368 0:5e18eb7da208 301
user3736966508731826368 0:5e18eb7da208 302
user3736966508731826368 0:5e18eb7da208 303 void update_LED(void)
user3736966508731826368 0:5e18eb7da208 304 {
user3736966508731826368 0:5e18eb7da208 305 I2C_Message.buf = Buffer1;
user3736966508731826368 0:5e18eb7da208 306 Write_To_Device(0x80);
user3736966508731826368 0:5e18eb7da208 307 I2C_Message.buf = Buffer2;
user3736966508731826368 0:5e18eb7da208 308 Write_To_Device(0x86);
user3736966508731826368 0:5e18eb7da208 309 I2C_Message.buf = Buffer3;
user3736966508731826368 0:5e18eb7da208 310 Write_To_Device(0x82);
user3736966508731826368 0:5e18eb7da208 311 I2C_Message.buf = Buffer4;
user3736966508731826368 0:5e18eb7da208 312 Write_To_Device(0x88);
user3736966508731826368 0:5e18eb7da208 313 I2C_Message.buf = Buffer5;
user3736966508731826368 0:5e18eb7da208 314 Write_To_Device(0x84);
user3736966508731826368 0:5e18eb7da208 315 I2C_Message.buf = Buffer6;
user3736966508731826368 0:5e18eb7da208 316 Write_To_Device(0x8A);
user3736966508731826368 0:5e18eb7da208 317 }
user3736966508731826368 0:5e18eb7da208 318
user3736966508731826368 0:5e18eb7da208 319 void read_LED( int LEDn, BYTE *R, BYTE *G, BYTE *B)
user3736966508731826368 0:5e18eb7da208 320 {
user3736966508731826368 0:5e18eb7da208 321 *R = RGB_LED[LEDn].RED.buf[RGB_LED[LEDn].RED.n];
user3736966508731826368 0:5e18eb7da208 322 *G = RGB_LED[LEDn].GREEN.buf[RGB_LED[LEDn].GREEN.n];
user3736966508731826368 0:5e18eb7da208 323 *B = RGB_LED[LEDn].BLUE.buf[RGB_LED[LEDn].BLUE.n];
user3736966508731826368 0:5e18eb7da208 324 }
user3736966508731826368 0:5e18eb7da208 325
user3736966508731826368 0:5e18eb7da208 326 void rainbow_LED( void)
user3736966508731826368 0:5e18eb7da208 327 {
user3736966508731826368 0:5e18eb7da208 328 int i;
user3736966508731826368 0:5e18eb7da208 329 for(i=0;i<32;i++) set_LED( i, Rainbow[i].r, Rainbow[i].g, Rainbow[i].b );
user3736966508731826368 0:5e18eb7da208 330 }
user3736966508731826368 0:5e18eb7da208 331
user3736966508731826368 0:5e18eb7da208 332 void ripple_LED( void )
user3736966508731826368 0:5e18eb7da208 333 {
user3736966508731826368 0:5e18eb7da208 334 uint32_t m;
user3736966508731826368 0:5e18eb7da208 335 uint8_t LEDn, R, G, B, tR, tG, tB;
user3736966508731826368 0:5e18eb7da208 336 if( dflag) { // Ripple LEDs to the right
user3736966508731826368 0:5e18eb7da208 337 read_LED( 0, &tR, &tG, &tB); // Save the first LED value
user3736966508731826368 0:5e18eb7da208 338 for(LEDn = 0 , m = 1; LEDn < 31; LEDn++) {
user3736966508731826368 0:5e18eb7da208 339 read_LED( LEDn+1, &R, &G, &B);
user3736966508731826368 0:5e18eb7da208 340 set_LED( LEDn, R, G, B);
user3736966508731826368 0:5e18eb7da208 341 m = m << 1;
user3736966508731826368 0:5e18eb7da208 342 }
user3736966508731826368 0:5e18eb7da208 343 set_LED( 31, tR, tG, tB);
user3736966508731826368 0:5e18eb7da208 344 } else { // Ripple LEDs to the left
user3736966508731826368 0:5e18eb7da208 345 read_LED( 31, &tR, &tG, &tB);
user3736966508731826368 0:5e18eb7da208 346 for(LEDn = 31, m = 0x80000000 ; LEDn > 0; LEDn--) {
user3736966508731826368 0:5e18eb7da208 347 read_LED( LEDn - 1, &R, &G, &B);
user3736966508731826368 0:5e18eb7da208 348 set_LED( LEDn, R, G, B);
user3736966508731826368 0:5e18eb7da208 349 m = m >> 1;
user3736966508731826368 0:5e18eb7da208 350 }
user3736966508731826368 0:5e18eb7da208 351 set_LED( 0, tR, tG, tB);
user3736966508731826368 0:5e18eb7da208 352 }
user3736966508731826368 0:5e18eb7da208 353 }
user3736966508731826368 0:5e18eb7da208 354
user3736966508731826368 0:5e18eb7da208 355
user3736966508731826368 0:5e18eb7da208 356 void test_pattern(void)
user3736966508731826368 0:5e18eb7da208 357 {
user3736966508731826368 0:5e18eb7da208 358 int l, r, g, b;
user3736966508731826368 0:5e18eb7da208 359 // Dim Blue Color (from min to max)
user3736966508731826368 0:5e18eb7da208 360 Init_Buffers();
user3736966508731826368 0:5e18eb7da208 361 set_my_LED(1);
user3736966508731826368 0:5e18eb7da208 362 for (r = 0, g = 0, b = 0; b < 0xFF; b++) {
user3736966508731826368 0:5e18eb7da208 363 for(l = 0; l < 32; l++) {
user3736966508731826368 0:5e18eb7da208 364 set_LED( l, r, g, b);
user3736966508731826368 0:5e18eb7da208 365 }
user3736966508731826368 0:5e18eb7da208 366 update_LED();
user3736966508731826368 0:5e18eb7da208 367 }
user3736966508731826368 0:5e18eb7da208 368 set_my_LED(2);
user3736966508731826368 0:5e18eb7da208 369 // Mix from Only Blue (Max going to off) to Only Green (off to Max)
user3736966508731826368 0:5e18eb7da208 370 for (r = 0, g = 0, b = 0xFF; b >= 0x00; b--) {
user3736966508731826368 0:5e18eb7da208 371 for(l = 0;l < 32; l++) {
user3736966508731826368 0:5e18eb7da208 372 set_LED( l, r, g, b);
user3736966508731826368 0:5e18eb7da208 373 }
user3736966508731826368 0:5e18eb7da208 374 update_LED();
user3736966508731826368 0:5e18eb7da208 375 g++;
user3736966508731826368 0:5e18eb7da208 376 }
user3736966508731826368 0:5e18eb7da208 377 set_my_LED(4);
user3736966508731826368 0:5e18eb7da208 378 // Mix from Only Green (Max going to off) to Only Red (off to Max)
user3736966508731826368 0:5e18eb7da208 379 for (r = 0, g = 0xFF, b = 0; g >= 0x00; g--) {
user3736966508731826368 0:5e18eb7da208 380 for (l = 0;l < 32; l++) {
user3736966508731826368 0:5e18eb7da208 381 set_LED( l, r, g, b);
user3736966508731826368 0:5e18eb7da208 382 }
user3736966508731826368 0:5e18eb7da208 383 update_LED();
user3736966508731826368 0:5e18eb7da208 384 r++;
user3736966508731826368 0:5e18eb7da208 385 }
user3736966508731826368 0:5e18eb7da208 386 set_my_LED(8);
user3736966508731826368 0:5e18eb7da208 387 // Mix from Only Red (Max going to off) to Only Blue (off to Max)
user3736966508731826368 0:5e18eb7da208 388 for (r = 0xFF, g = 0, b = 0; r >= 0x00; r--) {
user3736966508731826368 0:5e18eb7da208 389 for (l = 0;l < 32; l++) {
user3736966508731826368 0:5e18eb7da208 390 set_LED( l, r, g, b);
user3736966508731826368 0:5e18eb7da208 391 }
user3736966508731826368 0:5e18eb7da208 392 update_LED();
user3736966508731826368 0:5e18eb7da208 393 b++;
user3736966508731826368 0:5e18eb7da208 394 }
user3736966508731826368 0:5e18eb7da208 395 set_my_LED(0);
user3736966508731826368 0:5e18eb7da208 396 rainbow_LED();
user3736966508731826368 0:5e18eb7da208 397 update_LED();
user3736966508731826368 0:5e18eb7da208 398 }
user3736966508731826368 0:5e18eb7da208 399
user3736966508731826368 0:5e18eb7da208 400 void SetOutReport (void)
user3736966508731826368 0:5e18eb7da208 401 {
user3736966508731826368 0:5e18eb7da208 402 int LEDn;
user3736966508731826368 0:5e18eb7da208 403 uint32_t led, m;
user3736966508731826368 0:5e18eb7da208 404 uint8_t R, G, B, seq;
user3736966508731826368 0:5e18eb7da208 405
user3736966508731826368 0:5e18eb7da208 406 /* Check the bits of the "OutReport" data from the PC
user3736966508731826368 0:5e18eb7da208 407 * and set the output port status. */
user3736966508731826368 0:5e18eb7da208 408 seq = recv_report.data[0];
user3736966508731826368 0:5e18eb7da208 409 //LED_Report = (LED_Report_type *) &recv_report.data[1];
user3736966508731826368 0:5e18eb7da208 410 GLOBAL_INTENSITY[2] = recv_report.data[8];
user3736966508731826368 0:5e18eb7da208 411 if(seq) {
user3736966508731826368 0:5e18eb7da208 412 tflag = 2;
user3736966508731826368 0:5e18eb7da208 413 dflag = seq & 1;
user3736966508731826368 0:5e18eb7da208 414 dval = (seq & 0xFC) >> 1; // sets a range from 0x00 to 0x7E
user3736966508731826368 0:5e18eb7da208 415 } else {
user3736966508731826368 0:5e18eb7da208 416 led = recv_report.data[4];
user3736966508731826368 0:5e18eb7da208 417 led <<= 8;
user3736966508731826368 0:5e18eb7da208 418 led |= recv_report.data[3];
user3736966508731826368 0:5e18eb7da208 419 led <<= 8;
user3736966508731826368 0:5e18eb7da208 420 led |= recv_report.data[2];
user3736966508731826368 0:5e18eb7da208 421 led <<= 8;
user3736966508731826368 0:5e18eb7da208 422 led |= recv_report.data[1];
user3736966508731826368 0:5e18eb7da208 423
user3736966508731826368 0:5e18eb7da208 424 set_my_LED(led & 0xf);
user3736966508731826368 0:5e18eb7da208 425 R = recv_report.data[5];
user3736966508731826368 0:5e18eb7da208 426 G = recv_report.data[6];
user3736966508731826368 0:5e18eb7da208 427 B = recv_report.data[7];
user3736966508731826368 0:5e18eb7da208 428 for(LEDn=0, m=1;LEDn < 32; LEDn++, m <<= 1) {
user3736966508731826368 0:5e18eb7da208 429 if(led & m) {
user3736966508731826368 0:5e18eb7da208 430 RGB_LED[LEDn].RED.buf[RGB_LED[LEDn].RED.n] = R;
user3736966508731826368 0:5e18eb7da208 431 RGB_LED[LEDn].GREEN.buf[RGB_LED[LEDn].GREEN.n] = G;
user3736966508731826368 0:5e18eb7da208 432 RGB_LED[LEDn].BLUE.buf[RGB_LED[LEDn].BLUE.n] = B;
user3736966508731826368 0:5e18eb7da208 433 }
user3736966508731826368 0:5e18eb7da208 434 }
user3736966508731826368 0:5e18eb7da208 435 tflag = 1;
user3736966508731826368 0:5e18eb7da208 436 }
user3736966508731826368 0:5e18eb7da208 437 }
user3736966508731826368 0:5e18eb7da208 438
user3736966508731826368 0:5e18eb7da208 439
user3736966508731826368 0:5e18eb7da208 440
user3736966508731826368 0:5e18eb7da208 441
user3736966508731826368 0:5e18eb7da208 442
user3736966508731826368 0:5e18eb7da208 443
user3736966508731826368 0:5e18eb7da208 444 /***********************************************************************
user3736966508731826368 0:5e18eb7da208 445 DESCRIPTION: Main function
user3736966508731826368 0:5e18eb7da208 446 INPUT(S): None
user3736966508731826368 0:5e18eb7da208 447 RETURNS: Nothing
user3736966508731826368 0:5e18eb7da208 448 ************************************************************************/
user3736966508731826368 0:5e18eb7da208 449 int main (void)
user3736966508731826368 0:5e18eb7da208 450 {
user3736966508731826368 0:5e18eb7da208 451 int l = 1;
user3736966508731826368 0:5e18eb7da208 452 led_en = 0;
user3736966508731826368 0:5e18eb7da208 453 set_my_LED(1);
user3736966508731826368 0:5e18eb7da208 454 // Perform Software Reset - Set the PCA9635 in a known state
user3736966508731826368 0:5e18eb7da208 455 I2C_Message.buf = SW_RESET;
user3736966508731826368 0:5e18eb7da208 456 Write_To_Device(SW_RESET_I2C_ADDRESS);
user3736966508731826368 0:5e18eb7da208 457
user3736966508731826368 0:5e18eb7da208 458 // Wake up and Init the PCA9635 using ALL CALL address
user3736966508731826368 0:5e18eb7da208 459 I2C_Message.buf = WAKE_UP_AND_INIT;
user3736966508731826368 0:5e18eb7da208 460 Write_All_Devices();
user3736966508731826368 0:5e18eb7da208 461 Init_Buffers();
user3736966508731826368 0:5e18eb7da208 462
user3736966508731826368 0:5e18eb7da208 463 // Program all LED outputs to Individual PWM + Global PWM using ALL CALL address
user3736966508731826368 0:5e18eb7da208 464 I2C_Message.buf = LED_ALL_INDVDL_PLUS_GLOBL_PWM_CTRL;
user3736966508731826368 0:5e18eb7da208 465 Write_All_Devices();
user3736966508731826368 0:5e18eb7da208 466 if(!SW6) test_pattern();
user3736966508731826368 0:5e18eb7da208 467 dflag = 0;
user3736966508731826368 0:5e18eb7da208 468 dval = 10;
user3736966508731826368 0:5e18eb7da208 469 tflag = 0;
user3736966508731826368 0:5e18eb7da208 470 set_my_LED(l++);
user3736966508731826368 0:5e18eb7da208 471 send_report.length = 1;
user3736966508731826368 0:5e18eb7da208 472 while (1) {
user3736966508731826368 0:5e18eb7da208 473 send_report.data[0] = SW5;
user3736966508731826368 0:5e18eb7da208 474 hid.send(&send_report);
user3736966508731826368 0:5e18eb7da208 475 if(hid.readNB(&recv_report)) SetOutReport();
user3736966508731826368 0:5e18eb7da208 476 if(tflag == 2) {
user3736966508731826368 0:5e18eb7da208 477 ripple_LED();
user3736966508731826368 0:5e18eb7da208 478 update_LED();
user3736966508731826368 0:5e18eb7da208 479 LED_INTENSITY();
user3736966508731826368 0:5e18eb7da208 480 delay(dval);
user3736966508731826368 0:5e18eb7da208 481 }
user3736966508731826368 0:5e18eb7da208 482
user3736966508731826368 0:5e18eb7da208 483 if(tflag == 1) {
user3736966508731826368 0:5e18eb7da208 484 update_LED();
user3736966508731826368 0:5e18eb7da208 485 LED_INTENSITY();
user3736966508731826368 0:5e18eb7da208 486 tflag = 0;
user3736966508731826368 0:5e18eb7da208 487 }
user3736966508731826368 0:5e18eb7da208 488 }
user3736966508731826368 0:5e18eb7da208 489 }