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.
main.cpp@0:5e18eb7da208, 2011-12-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |