Library for NXP MCU I2C RGB LED DEMO board (6 x PCA9635)
Warning
When the original NXP demo board is connected to another mcu board : Disable the on-board 8051 mcu.
PCA9635_6.cpp@1:b89b54759940, 2014-04-01 (annotated)
- Committer:
- frankvnk
- Date:
- Tue Apr 01 20:03:30 2014 +0000
- Revision:
- 1:b89b54759940
- Parent:
- 0:1258ad754d9c
Added global intensity function
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frankvnk | 0:1258ad754d9c | 1 | /************************************************************************************************** |
frankvnk | 0:1258ad754d9c | 2 | ***** ***** |
frankvnk | 0:1258ad754d9c | 3 | ***** Name: PCA9635_6.cpp ***** |
frankvnk | 0:1258ad754d9c | 4 | ***** Date: 09/03/2014 ***** |
frankvnk | 0:1258ad754d9c | 5 | ***** Auth: Frank Vannieuwkerke ***** |
frankvnk | 0:1258ad754d9c | 6 | ***** Func: library for I2C RGB LED Demo board (6 x PCA9635) ***** |
frankvnk | 0:1258ad754d9c | 7 | ***** Ported from http://mbed.org/users/JimCarver/code/RGB2/ ***** |
frankvnk | 0:1258ad754d9c | 8 | **************************************************************************************************/ |
frankvnk | 0:1258ad754d9c | 9 | |
frankvnk | 0:1258ad754d9c | 10 | //#include "mbed.h" |
frankvnk | 0:1258ad754d9c | 11 | #include "PCA9635_6.h" |
frankvnk | 0:1258ad754d9c | 12 | |
frankvnk | 0:1258ad754d9c | 13 | // TODO : check which variables are used - add const if they do not change. |
frankvnk | 0:1258ad754d9c | 14 | #define SW_RESET_I2C_ADDRESS 0x06 |
frankvnk | 0:1258ad754d9c | 15 | #define ALL_CALL_I2C_ADDRESS 0xE0 |
frankvnk | 0:1258ad754d9c | 16 | #define SUB_ADDRESS_1 0xE2 |
frankvnk | 0:1258ad754d9c | 17 | #define SUB_ADDRESS_2 0xE4 |
frankvnk | 0:1258ad754d9c | 18 | #define SUB_ADDRESS_3 0xE8 |
frankvnk | 0:1258ad754d9c | 19 | |
frankvnk | 0:1258ad754d9c | 20 | uint8_t SW_RESET[3] = {2,0xA5,0x5A}; |
frankvnk | 0:1258ad754d9c | 21 | |
frankvnk | 0:1258ad754d9c | 22 | uint8_t WAKE_UP_AND_INIT[4] = {3,0x80,0x81,0x01}; |
frankvnk | 0:1258ad754d9c | 23 | |
frankvnk | 0:1258ad754d9c | 24 | uint8_t GLOBAL_BLINK_SUB_ADDR_1[4] = {3,0x80,0x89,0x21}; // Blink + All Call/Sub-Addr1 |
frankvnk | 0:1258ad754d9c | 25 | uint8_t GLOBAL_BLINK_SUB_ADDR_2[4] = {3,0x80,0x85,0x21}; // Blink + All Call/Sub-Addr2 |
frankvnk | 0:1258ad754d9c | 26 | uint8_t GLOBAL_BLINK_SUB_ADDR_3[4] = {3,0x80,0x83,0x21}; // Blink + All Call/Sub-Addr3 |
frankvnk | 0:1258ad754d9c | 27 | uint8_t GLOBAL_DIM[3] = {2,0x01,0x01}; |
frankvnk | 0:1258ad754d9c | 28 | uint8_t GLOBAL_INTENSITY[3] = { 2, 0x92, 0}; |
frankvnk | 0:1258ad754d9c | 29 | |
frankvnk | 0:1258ad754d9c | 30 | uint8_t ALL_LED_FULL_PWM[18]={17,0x82,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; |
frankvnk | 0:1258ad754d9c | 31 | |
frankvnk | 0:1258ad754d9c | 32 | uint8_t LED_ALL_ON[6] = {5,0x94,0x55,0x55,0x55,0x55}; |
frankvnk | 0:1258ad754d9c | 33 | uint8_t LED_ALL_OFF[6] = {5,0x94,0x00,0x00,0x00,0x00}; |
frankvnk | 0:1258ad754d9c | 34 | uint8_t LED_ALL_INDVDL_PLUS_GLOBL_PWM_CTRL[6] = {5,0x94,0xFF,0xFF,0xFF,0xFF}; |
frankvnk | 0:1258ad754d9c | 35 | |
frankvnk | 0:1258ad754d9c | 36 | uint8_t LED_0_3_6_9_12_15_ON[6] = {5,0x94,0x41,0x10,0x04,0x41}; |
frankvnk | 0:1258ad754d9c | 37 | uint8_t LED_1_4_7_10_13_ON[6] = {5,0x94,0x10,0x04,0x41,0x10}; |
frankvnk | 0:1258ad754d9c | 38 | uint8_t LED_2_5_8_11_14_ON[6] = {5,0x94,0x04,0x41,0x10,0x04}; |
frankvnk | 0:1258ad754d9c | 39 | |
frankvnk | 0:1258ad754d9c | 40 | //uint8_t dflag, tflag; |
frankvnk | 0:1258ad754d9c | 41 | |
frankvnk | 0:1258ad754d9c | 42 | uint8_t Buffer1[18]; |
frankvnk | 0:1258ad754d9c | 43 | uint8_t Buffer2[18]; |
frankvnk | 0:1258ad754d9c | 44 | uint8_t Buffer3[18]; |
frankvnk | 0:1258ad754d9c | 45 | uint8_t Buffer4[18]; |
frankvnk | 0:1258ad754d9c | 46 | uint8_t Buffer5[18]; |
frankvnk | 0:1258ad754d9c | 47 | uint8_t Buffer6[18]; |
frankvnk | 0:1258ad754d9c | 48 | |
frankvnk | 0:1258ad754d9c | 49 | I2C_MESSAGE I2C_Message; |
frankvnk | 0:1258ad754d9c | 50 | //int dval; |
frankvnk | 0:1258ad754d9c | 51 | |
frankvnk | 0:1258ad754d9c | 52 | /*typedef struct { |
frankvnk | 0:1258ad754d9c | 53 | uint32_t LED; |
frankvnk | 0:1258ad754d9c | 54 | uint8_t RED, GREEN, BLUE, INTENSITY; |
frankvnk | 0:1258ad754d9c | 55 | } LED_Report_type ; |
frankvnk | 0:1258ad754d9c | 56 | |
frankvnk | 0:1258ad754d9c | 57 | volatile LED_Report_type *LED_Report;*/ |
frankvnk | 0:1258ad754d9c | 58 | |
frankvnk | 0:1258ad754d9c | 59 | typedef struct { |
frankvnk | 0:1258ad754d9c | 60 | // Definition for a LED location, buffer pointer, and index into that buffer |
frankvnk | 0:1258ad754d9c | 61 | uint8_t *buf, n; |
frankvnk | 0:1258ad754d9c | 62 | } LED_type; |
frankvnk | 0:1258ad754d9c | 63 | |
frankvnk | 0:1258ad754d9c | 64 | typedef struct { |
frankvnk | 0:1258ad754d9c | 65 | LED_type RED; |
frankvnk | 0:1258ad754d9c | 66 | LED_type GREEN; |
frankvnk | 0:1258ad754d9c | 67 | LED_type BLUE; |
frankvnk | 0:1258ad754d9c | 68 | } RGB_type; |
frankvnk | 0:1258ad754d9c | 69 | |
frankvnk | 0:1258ad754d9c | 70 | // An array of structures that define the buffer and location in the buffer for all of the LEDs |
frankvnk | 0:1258ad754d9c | 71 | // Due to the design of the RGB LED board this is easier than the convoluted calculation needed |
frankvnk | 0:1258ad754d9c | 72 | // |
frankvnk | 0:1258ad754d9c | 73 | RGB_type RGB_LED[32] = { |
frankvnk | 0:1258ad754d9c | 74 | // RED GREEN BLUE |
frankvnk | 0:1258ad754d9c | 75 | // LED1-16 |
frankvnk | 0:1258ad754d9c | 76 | Buffer1, 2, Buffer1, 3, Buffer1, 4, |
frankvnk | 0:1258ad754d9c | 77 | Buffer1, 5, Buffer1, 6, Buffer1, 7, |
frankvnk | 0:1258ad754d9c | 78 | Buffer1, 8, Buffer1, 9, Buffer1, 10, |
frankvnk | 0:1258ad754d9c | 79 | Buffer1, 11, Buffer1, 12, Buffer1, 13, |
frankvnk | 0:1258ad754d9c | 80 | Buffer1, 14, Buffer1, 15, Buffer1, 16, |
frankvnk | 0:1258ad754d9c | 81 | Buffer1, 17, Buffer3, 2, Buffer3, 3, |
frankvnk | 0:1258ad754d9c | 82 | Buffer3, 4, Buffer3, 5, Buffer3, 6, |
frankvnk | 0:1258ad754d9c | 83 | Buffer3, 7, Buffer3, 8, Buffer3, 9, |
frankvnk | 0:1258ad754d9c | 84 | Buffer3, 10, Buffer3, 11, Buffer3, 12, |
frankvnk | 0:1258ad754d9c | 85 | Buffer3, 13, Buffer3, 14, Buffer3, 15, |
frankvnk | 0:1258ad754d9c | 86 | Buffer3, 16, Buffer3, 17, Buffer5, 2, |
frankvnk | 0:1258ad754d9c | 87 | Buffer5, 3, Buffer5, 4, Buffer5, 5, |
frankvnk | 0:1258ad754d9c | 88 | Buffer5, 6, Buffer5, 7, Buffer5, 8, |
frankvnk | 0:1258ad754d9c | 89 | Buffer5, 9, Buffer5, 10, Buffer5, 11, |
frankvnk | 0:1258ad754d9c | 90 | Buffer5, 12, Buffer5, 13, Buffer5, 14, |
frankvnk | 0:1258ad754d9c | 91 | Buffer5, 15, Buffer5, 16, Buffer5, 17, |
frankvnk | 0:1258ad754d9c | 92 | |
frankvnk | 0:1258ad754d9c | 93 | // LED17-32 |
frankvnk | 0:1258ad754d9c | 94 | Buffer2, 2, Buffer2, 3, Buffer2, 4, |
frankvnk | 0:1258ad754d9c | 95 | Buffer2, 5, Buffer2, 6, Buffer2, 7, |
frankvnk | 0:1258ad754d9c | 96 | Buffer2, 8, Buffer2, 9, Buffer2, 10, |
frankvnk | 0:1258ad754d9c | 97 | Buffer2, 11, Buffer2, 12, Buffer2, 13, |
frankvnk | 0:1258ad754d9c | 98 | Buffer2, 14, Buffer2, 15, Buffer2, 16, |
frankvnk | 0:1258ad754d9c | 99 | Buffer2, 17, Buffer4, 2, Buffer4, 3, |
frankvnk | 0:1258ad754d9c | 100 | Buffer4, 4, Buffer4, 5, Buffer4, 6, |
frankvnk | 0:1258ad754d9c | 101 | Buffer4, 7, Buffer4, 8, Buffer4, 9, |
frankvnk | 0:1258ad754d9c | 102 | Buffer4, 10, Buffer4, 11, Buffer4, 12, |
frankvnk | 0:1258ad754d9c | 103 | Buffer4, 13, Buffer4, 14, Buffer4, 15, |
frankvnk | 0:1258ad754d9c | 104 | Buffer4, 16, Buffer4, 17, Buffer6, 2, |
frankvnk | 0:1258ad754d9c | 105 | Buffer6, 3, Buffer6, 4, Buffer6, 5, |
frankvnk | 0:1258ad754d9c | 106 | Buffer6, 6, Buffer6, 7, Buffer6, 8, |
frankvnk | 0:1258ad754d9c | 107 | Buffer6, 9, Buffer6, 10, Buffer6, 11, |
frankvnk | 0:1258ad754d9c | 108 | Buffer6, 12, Buffer6, 13, Buffer6, 14, |
frankvnk | 0:1258ad754d9c | 109 | Buffer6, 15, Buffer6, 16, Buffer6, 17 |
frankvnk | 0:1258ad754d9c | 110 | }; |
frankvnk | 0:1258ad754d9c | 111 | |
frankvnk | 0:1258ad754d9c | 112 | PCA9635_6::PCA9635_6(PinName sda, PinName scl, PinName en) : _i2c(sda, scl), _en(en) |
frankvnk | 0:1258ad754d9c | 113 | { |
frankvnk | 0:1258ad754d9c | 114 | _i2c.frequency(800000); |
frankvnk | 0:1258ad754d9c | 115 | // enable PCA9635 board |
frankvnk | 0:1258ad754d9c | 116 | _en = 0; |
frankvnk | 0:1258ad754d9c | 117 | // Perform Software Reset - Set the PCA9635 in a known state |
frankvnk | 0:1258ad754d9c | 118 | I2C_Message.buf = SW_RESET; |
frankvnk | 0:1258ad754d9c | 119 | Write_To_Device(SW_RESET_I2C_ADDRESS); |
frankvnk | 0:1258ad754d9c | 120 | // Wake up and Init the PCA9635 using ALL CALL address |
frankvnk | 0:1258ad754d9c | 121 | I2C_Message.buf = WAKE_UP_AND_INIT; |
frankvnk | 0:1258ad754d9c | 122 | Write_All_Devices(); |
frankvnk | 0:1258ad754d9c | 123 | Init_Buffers(); |
frankvnk | 0:1258ad754d9c | 124 | // Program all LED outputs to Individual PWM + Global PWM using ALL CALL address |
frankvnk | 0:1258ad754d9c | 125 | I2C_Message.buf = LED_ALL_INDVDL_PLUS_GLOBL_PWM_CTRL; |
frankvnk | 0:1258ad754d9c | 126 | Write_All_Devices(); |
frankvnk | 0:1258ad754d9c | 127 | } |
frankvnk | 0:1258ad754d9c | 128 | |
frankvnk | 0:1258ad754d9c | 129 | void PCA9635_6::set_LED(int LEDn, uint8_t R, uint8_t G, uint8_t B) |
frankvnk | 0:1258ad754d9c | 130 | { |
frankvnk | 0:1258ad754d9c | 131 | RGB_LED[LEDn].RED.buf[RGB_LED[LEDn].RED.n] = R; |
frankvnk | 0:1258ad754d9c | 132 | RGB_LED[LEDn].GREEN.buf[RGB_LED[LEDn].GREEN.n] = G; |
frankvnk | 0:1258ad754d9c | 133 | RGB_LED[LEDn].BLUE.buf[RGB_LED[LEDn].BLUE.n] = B; |
frankvnk | 0:1258ad754d9c | 134 | } |
frankvnk | 0:1258ad754d9c | 135 | |
frankvnk | 0:1258ad754d9c | 136 | void PCA9635_6::Init_Buffers(void) |
frankvnk | 0:1258ad754d9c | 137 | { |
frankvnk | 0:1258ad754d9c | 138 | int i = 0; |
frankvnk | 0:1258ad754d9c | 139 | for (i = 0; i<18; i++) { |
frankvnk | 0:1258ad754d9c | 140 | Buffer1[i] = 0; |
frankvnk | 0:1258ad754d9c | 141 | Buffer2[i] = 0; |
frankvnk | 0:1258ad754d9c | 142 | Buffer3[i] = 0; |
frankvnk | 0:1258ad754d9c | 143 | Buffer4[i] = 0; |
frankvnk | 0:1258ad754d9c | 144 | Buffer5[i] = 0; |
frankvnk | 0:1258ad754d9c | 145 | Buffer6[i] = 0; |
frankvnk | 0:1258ad754d9c | 146 | } |
frankvnk | 0:1258ad754d9c | 147 | |
frankvnk | 0:1258ad754d9c | 148 | Buffer1[0] = 17; |
frankvnk | 0:1258ad754d9c | 149 | Buffer2[0] = 17; |
frankvnk | 0:1258ad754d9c | 150 | Buffer3[0] = 17; |
frankvnk | 0:1258ad754d9c | 151 | Buffer4[0] = 17; |
frankvnk | 0:1258ad754d9c | 152 | Buffer5[0] = 17; |
frankvnk | 0:1258ad754d9c | 153 | Buffer6[0] = 17; |
frankvnk | 0:1258ad754d9c | 154 | Buffer1[1] = 0x82; |
frankvnk | 0:1258ad754d9c | 155 | Buffer2[1] = 0x82; |
frankvnk | 0:1258ad754d9c | 156 | Buffer3[1] = 0x82; |
frankvnk | 0:1258ad754d9c | 157 | Buffer4[1] = 0x82; |
frankvnk | 0:1258ad754d9c | 158 | Buffer5[1] = 0x82; |
frankvnk | 0:1258ad754d9c | 159 | Buffer6[1] = 0x82; |
frankvnk | 0:1258ad754d9c | 160 | } |
frankvnk | 0:1258ad754d9c | 161 | |
frankvnk | 0:1258ad754d9c | 162 | |
frankvnk | 0:1258ad754d9c | 163 | void PCA9635_6::Set_Same_Color_Single_Device(uint8_t A, uint8_t B, uint8_t C) |
frankvnk | 0:1258ad754d9c | 164 | { |
frankvnk | 0:1258ad754d9c | 165 | int i; |
frankvnk | 0:1258ad754d9c | 166 | Buffer1[0] = 17; |
frankvnk | 0:1258ad754d9c | 167 | Buffer1[1] = 0x82; |
frankvnk | 0:1258ad754d9c | 168 | for (i = 0; i < 5; i++) { |
frankvnk | 0:1258ad754d9c | 169 | Buffer1[3*i+2] = A; |
frankvnk | 0:1258ad754d9c | 170 | Buffer1[3*i+3] = B; |
frankvnk | 0:1258ad754d9c | 171 | Buffer1[3*i+4] = C; |
frankvnk | 0:1258ad754d9c | 172 | } |
frankvnk | 0:1258ad754d9c | 173 | Buffer1[17] = A; |
frankvnk | 0:1258ad754d9c | 174 | } |
frankvnk | 0:1258ad754d9c | 175 | |
frankvnk | 0:1258ad754d9c | 176 | |
frankvnk | 0:1258ad754d9c | 177 | void PCA9635_6::i2cfail(void) |
frankvnk | 0:1258ad754d9c | 178 | { |
frankvnk | 0:1258ad754d9c | 179 | // printf("-------> I2C error\r\n"); |
frankvnk | 0:1258ad754d9c | 180 | while(1) { |
frankvnk | 0:1258ad754d9c | 181 | } |
frankvnk | 0:1258ad754d9c | 182 | } |
frankvnk | 0:1258ad754d9c | 183 | |
frankvnk | 0:1258ad754d9c | 184 | void PCA9635_6::I2C_Write(I2C_MESSAGE *mp) |
frankvnk | 0:1258ad754d9c | 185 | { |
frankvnk | 0:1258ad754d9c | 186 | if(_i2c.write(mp->address, (char *) &mp->buf[1], mp->buf[0])) i2cfail(); |
frankvnk | 0:1258ad754d9c | 187 | } |
frankvnk | 0:1258ad754d9c | 188 | |
frankvnk | 0:1258ad754d9c | 189 | void PCA9635_6::Write_All_Devices(void) |
frankvnk | 0:1258ad754d9c | 190 | { |
frankvnk | 0:1258ad754d9c | 191 | I2C_Message.address = ALL_CALL_I2C_ADDRESS; |
frankvnk | 0:1258ad754d9c | 192 | I2C_Write(&I2C_Message); |
frankvnk | 0:1258ad754d9c | 193 | } |
frankvnk | 0:1258ad754d9c | 194 | |
frankvnk | 0:1258ad754d9c | 195 | void PCA9635_6::Write_To_Device(uint8_t I2C_Address) |
frankvnk | 0:1258ad754d9c | 196 | { |
frankvnk | 0:1258ad754d9c | 197 | I2C_Message.address = I2C_Address; |
frankvnk | 0:1258ad754d9c | 198 | I2C_Write(&I2C_Message); |
frankvnk | 0:1258ad754d9c | 199 | } |
frankvnk | 0:1258ad754d9c | 200 | |
frankvnk | 0:1258ad754d9c | 201 | void PCA9635_6::Write_To_Device_And_Wait(uint8_t I2C_Address, uint8_t Delay_Value) |
frankvnk | 0:1258ad754d9c | 202 | { |
frankvnk | 0:1258ad754d9c | 203 | I2C_Message.address = I2C_Address; |
frankvnk | 0:1258ad754d9c | 204 | I2C_Write(&I2C_Message); |
frankvnk | 0:1258ad754d9c | 205 | wait_ms(Delay_Value); |
frankvnk | 0:1258ad754d9c | 206 | } |
frankvnk | 0:1258ad754d9c | 207 | |
frankvnk | 0:1258ad754d9c | 208 | void PCA9635_6::ALL_LED_OFF(void) // Switch off all the LEDs |
frankvnk | 0:1258ad754d9c | 209 | { |
frankvnk | 0:1258ad754d9c | 210 | I2C_Message.buf = LED_ALL_OFF; |
frankvnk | 0:1258ad754d9c | 211 | Write_All_Devices(); |
frankvnk | 0:1258ad754d9c | 212 | } |
frankvnk | 0:1258ad754d9c | 213 | |
frankvnk | 0:1258ad754d9c | 214 | void PCA9635_6::LED_INTENSITY(void) |
frankvnk | 0:1258ad754d9c | 215 | { |
frankvnk | 0:1258ad754d9c | 216 | //GLOBAL_INTENSITY[2] = global_i; |
frankvnk | 0:1258ad754d9c | 217 | I2C_Message.buf = GLOBAL_INTENSITY; |
frankvnk | 0:1258ad754d9c | 218 | Write_All_Devices(); |
frankvnk | 0:1258ad754d9c | 219 | } |
frankvnk | 0:1258ad754d9c | 220 | |
frankvnk | 0:1258ad754d9c | 221 | void PCA9635_6::update_LED(void) |
frankvnk | 0:1258ad754d9c | 222 | { |
frankvnk | 0:1258ad754d9c | 223 | I2C_Message.buf = Buffer1; |
frankvnk | 0:1258ad754d9c | 224 | Write_To_Device(0x80); |
frankvnk | 0:1258ad754d9c | 225 | I2C_Message.buf = Buffer2; |
frankvnk | 0:1258ad754d9c | 226 | Write_To_Device(0x86); |
frankvnk | 0:1258ad754d9c | 227 | I2C_Message.buf = Buffer3; |
frankvnk | 0:1258ad754d9c | 228 | Write_To_Device(0x82); |
frankvnk | 0:1258ad754d9c | 229 | I2C_Message.buf = Buffer4; |
frankvnk | 0:1258ad754d9c | 230 | Write_To_Device(0x88); |
frankvnk | 0:1258ad754d9c | 231 | I2C_Message.buf = Buffer5; |
frankvnk | 0:1258ad754d9c | 232 | Write_To_Device(0x84); |
frankvnk | 0:1258ad754d9c | 233 | I2C_Message.buf = Buffer6; |
frankvnk | 0:1258ad754d9c | 234 | Write_To_Device(0x8A); |
frankvnk | 0:1258ad754d9c | 235 | } |
frankvnk | 0:1258ad754d9c | 236 | |
frankvnk | 0:1258ad754d9c | 237 | void PCA9635_6::read_LED( int LEDn, uint8_t *R, uint8_t *G, uint8_t *B) |
frankvnk | 0:1258ad754d9c | 238 | { |
frankvnk | 0:1258ad754d9c | 239 | *R = RGB_LED[LEDn].RED.buf[RGB_LED[LEDn].RED.n]; |
frankvnk | 0:1258ad754d9c | 240 | *G = RGB_LED[LEDn].GREEN.buf[RGB_LED[LEDn].GREEN.n]; |
frankvnk | 0:1258ad754d9c | 241 | *B = RGB_LED[LEDn].BLUE.buf[RGB_LED[LEDn].BLUE.n]; |
frankvnk | 0:1258ad754d9c | 242 | } |
frankvnk | 0:1258ad754d9c | 243 | |
frankvnk | 1:b89b54759940 | 244 | void PCA9635_6::set_global_intensity(uint8_t globi) |
frankvnk | 1:b89b54759940 | 245 | { |
frankvnk | 1:b89b54759940 | 246 | GLOBAL_INTENSITY[2] = globi; |
frankvnk | 1:b89b54759940 | 247 | } |
frankvnk | 0:1258ad754d9c | 248 | |
frankvnk | 1:b89b54759940 | 249 |