modify for w7500

Fork of WS2812 by Brian Daniels

Committer:
jcm931213
Date:
Mon Nov 27 11:49:38 2017 +0000
Revision:
3:33b71af3ca0d
Parent:
1:aadbf08c62a2
modified for w7500

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bridadan 0:0b79cafcb387 1 #include "WS2812.h"
bridadan 0:0b79cafcb387 2
bridadan 1:aadbf08c62a2 3 WS2812::WS2812(PinName pin, int size, int zeroHigh, int zeroLow, int oneHigh, int oneLow) : __gpo(pin)
bridadan 0:0b79cafcb387 4 {
bridadan 0:0b79cafcb387 5 __size = size;
bridadan 0:0b79cafcb387 6 __transmitBuf = new bool[size * FRAME_SIZE];
bridadan 1:aadbf08c62a2 7 __use_II = OFF;
bridadan 0:0b79cafcb387 8 __II = 0xFF; // set global intensity to full
bridadan 1:aadbf08c62a2 9 __outPin = pin;
bridadan 0:0b79cafcb387 10
bridadan 0:0b79cafcb387 11 // Default values designed for K64f. Assumes GPIO toggle takes ~0.4us
bridadan 1:aadbf08c62a2 12 setDelays(zeroHigh, zeroLow, oneHigh, oneLow);
bridadan 0:0b79cafcb387 13 }
bridadan 0:0b79cafcb387 14
bridadan 0:0b79cafcb387 15
bridadan 0:0b79cafcb387 16 WS2812::~WS2812()
bridadan 0:0b79cafcb387 17 {
bridadan 0:0b79cafcb387 18 delete[] __transmitBuf;
bridadan 0:0b79cafcb387 19 }
bridadan 0:0b79cafcb387 20
bridadan 0:0b79cafcb387 21 void WS2812::setDelays(int zeroHigh, int zeroLow, int oneHigh, int oneLow) {
bridadan 0:0b79cafcb387 22 __zeroHigh = zeroHigh;
bridadan 0:0b79cafcb387 23 __zeroLow = zeroLow;
bridadan 0:0b79cafcb387 24 __oneHigh = oneHigh;
bridadan 0:0b79cafcb387 25 __oneLow = oneLow;
bridadan 0:0b79cafcb387 26 }
bridadan 0:0b79cafcb387 27
bridadan 0:0b79cafcb387 28 void WS2812::__loadBuf(int buf[],int r_offset, int g_offset, int b_offset) {
bridadan 0:0b79cafcb387 29 for (int i = 0; i < __size; i++) {
bridadan 0:0b79cafcb387 30 int color = 0;
bridadan 0:0b79cafcb387 31
bridadan 0:0b79cafcb387 32 color |= ((buf[(i+g_offset)%__size] & 0x0000FF00));
bridadan 0:0b79cafcb387 33 color |= ((buf[(i+r_offset)%__size] & 0x00FF0000));
bridadan 0:0b79cafcb387 34 color |= (buf[(i+b_offset)%__size] & 0x000000FF);
bridadan 0:0b79cafcb387 35 color |= (buf[i] & 0xFF000000);
bridadan 0:0b79cafcb387 36
bridadan 0:0b79cafcb387 37 // Outut format : GGRRBB
bridadan 0:0b79cafcb387 38 // Inout format : IIRRGGBB
bridadan 0:0b79cafcb387 39 unsigned char agrb[4] = {0x0, 0x0, 0x0, 0x0};
bridadan 0:0b79cafcb387 40
bridadan 0:0b79cafcb387 41 unsigned char sf; // scaling factor for II
bridadan 0:0b79cafcb387 42
bridadan 0:0b79cafcb387 43 // extract colour fields from incoming
bridadan 0:0b79cafcb387 44 // 0 = green, 1 = red, 2 = blue, 3 = brightness
bridadan 0:0b79cafcb387 45 agrb[0] = (color & 0x0000FF00) >> 8;
bridadan 0:0b79cafcb387 46 agrb[1] = (color & 0x00FF0000) >> 16;
bridadan 0:0b79cafcb387 47 agrb[2] = color & 0x000000FF;
bridadan 0:0b79cafcb387 48 agrb[3] = (color & 0xFF000000) >> 24;
bridadan 0:0b79cafcb387 49
bridadan 1:aadbf08c62a2 50 // set the intensity scaling factor (global, per pixel, none)
bridadan 1:aadbf08c62a2 51 if (__use_II == GLOBAL) {
jcm931213 3:33b71af3ca0d 52
bridadan 0:0b79cafcb387 53 sf = __II;
jcm931213 3:33b71af3ca0d 54 //printf("use globarl : %d\r\n", sf);
bridadan 1:aadbf08c62a2 55 } else if (__use_II == PER_PIXEL) {
bridadan 0:0b79cafcb387 56 sf = agrb[3];
bridadan 0:0b79cafcb387 57 } else {
bridadan 0:0b79cafcb387 58 sf = 0xFF;
bridadan 0:0b79cafcb387 59 }
bridadan 0:0b79cafcb387 60
bridadan 0:0b79cafcb387 61 // Apply the scaling factor to each othe colour components
bridadan 0:0b79cafcb387 62 for (int clr = 0; clr < 3; clr++) {
bridadan 0:0b79cafcb387 63 agrb[clr] = ((agrb[clr] * sf) >> 8);
bridadan 0:0b79cafcb387 64
bridadan 0:0b79cafcb387 65 for (int j = 0; j < 8; j++) {
bridadan 0:0b79cafcb387 66 if (((agrb[clr] << j) & 0x80) == 0x80) {
bridadan 0:0b79cafcb387 67 // Bit is set (checks MSB fist)
bridadan 0:0b79cafcb387 68 __transmitBuf[(i * FRAME_SIZE) + (clr * 8) + j] = 1;
bridadan 0:0b79cafcb387 69 } else {
bridadan 0:0b79cafcb387 70 // Bit is clear
bridadan 0:0b79cafcb387 71 __transmitBuf[(i * FRAME_SIZE) + (clr * 8) + j] = 0;
bridadan 0:0b79cafcb387 72 }
bridadan 0:0b79cafcb387 73 }
bridadan 0:0b79cafcb387 74 }
bridadan 0:0b79cafcb387 75 }
bridadan 0:0b79cafcb387 76 }
bridadan 0:0b79cafcb387 77
bridadan 0:0b79cafcb387 78 void WS2812::write(int buf[]) {
bridadan 0:0b79cafcb387 79 write_offsets(buf, 0, 0, 0);
bridadan 0:0b79cafcb387 80 }
bridadan 0:0b79cafcb387 81
bridadan 0:0b79cafcb387 82 void WS2812::write_offsets (int buf[],int r_offset, int g_offset, int b_offset) {
bridadan 0:0b79cafcb387 83 int i, j;
bridadan 0:0b79cafcb387 84
bridadan 1:aadbf08c62a2 85 // Load the transmit buffer
bridadan 0:0b79cafcb387 86 __loadBuf(buf, r_offset, g_offset, b_offset);
bridadan 0:0b79cafcb387 87
bridadan 1:aadbf08c62a2 88 // Entering timing critical section, so disabling interrupts
bridadan 1:aadbf08c62a2 89 __disable_irq();
bridadan 1:aadbf08c62a2 90
bridadan 1:aadbf08c62a2 91 // Begin bit-banging
bridadan 0:0b79cafcb387 92 for (i = 0; i < FRAME_SIZE * __size; i++) {
bridadan 0:0b79cafcb387 93 j = 0;
bridadan 0:0b79cafcb387 94 if (__transmitBuf[i]){
jcm931213 3:33b71af3ca0d 95 *(volatile uint32_t *)(0x44000000) = 0x0000002;
jcm931213 3:33b71af3ca0d 96 asm("nop");
jcm931213 3:33b71af3ca0d 97 asm("nop");
jcm931213 3:33b71af3ca0d 98 asm("nop");
jcm931213 3:33b71af3ca0d 99 asm("nop");
jcm931213 3:33b71af3ca0d 100 asm("nop");
jcm931213 3:33b71af3ca0d 101 asm("nop");
jcm931213 3:33b71af3ca0d 102 asm("nop");
jcm931213 3:33b71af3ca0d 103 asm("nop");
jcm931213 3:33b71af3ca0d 104 *(volatile uint32_t *)(0x44000000) = 0x0000000;
bridadan 0:0b79cafcb387 105 } else {
jcm931213 3:33b71af3ca0d 106 *(volatile uint32_t *)(0x44000000) = 0x0000002;
jcm931213 3:33b71af3ca0d 107
jcm931213 3:33b71af3ca0d 108 *(volatile uint32_t *)(0x44000000) = 0x0000000;
jcm931213 3:33b71af3ca0d 109 asm("nop");
jcm931213 3:33b71af3ca0d 110 asm("nop");
jcm931213 3:33b71af3ca0d 111 asm("nop");
jcm931213 3:33b71af3ca0d 112 asm("nop");
jcm931213 3:33b71af3ca0d 113 asm("nop");
jcm931213 3:33b71af3ca0d 114 asm("nop");
jcm931213 3:33b71af3ca0d 115 asm("nop");
jcm931213 3:33b71af3ca0d 116 asm("nop");
bridadan 0:0b79cafcb387 117 }
bridadan 0:0b79cafcb387 118 }
bridadan 1:aadbf08c62a2 119
bridadan 1:aadbf08c62a2 120 // Exiting timing critical section, so enabling interrutps
bridadan 1:aadbf08c62a2 121 __enable_irq();
bridadan 0:0b79cafcb387 122 }
bridadan 0:0b79cafcb387 123
bridadan 0:0b79cafcb387 124
bridadan 1:aadbf08c62a2 125 void WS2812::useII(BrightnessControl bc)
bridadan 0:0b79cafcb387 126 {
bridadan 1:aadbf08c62a2 127 if (bc > OFF) {
bridadan 1:aadbf08c62a2 128 __use_II = bc;
bridadan 0:0b79cafcb387 129 } else {
bridadan 1:aadbf08c62a2 130 __use_II = OFF;
bridadan 0:0b79cafcb387 131 }
bridadan 0:0b79cafcb387 132 }
bridadan 0:0b79cafcb387 133
bridadan 0:0b79cafcb387 134 void WS2812::setII(unsigned char II)
bridadan 0:0b79cafcb387 135 {
bridadan 0:0b79cafcb387 136 __II = II;
bridadan 0:0b79cafcb387 137 }
bridadan 0:0b79cafcb387 138
bridadan 0:0b79cafcb387 139
bridadan 0:0b79cafcb387 140
bridadan 0:0b79cafcb387 141
bridadan 0:0b79cafcb387 142
bridadan 0:0b79cafcb387 143