Final Project로 실제 점검에 사용된 코드

Dependencies:   mbed Adafruit_GFX

Committer:
21400688
Date:
Sat Jun 15 20:52:15 2019 +0000
Revision:
0:22391cd705e2
vb

Who changed what in which revision?

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