Final Project / Mbed 2 deprecated Remote-Control_PID

Dependencies:   mbed Adafruit_GFX

Committer:
21400688
Date:
Sat Jun 15 20:39:39 2019 +0000
Revision:
0:c4c874d702f9
first commit

Who changed what in which revision?

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