Eventual attempt at porting the efficient WS2812 library to mbed

Dependencies:   hubmartin-ws2812b mbed-dev

Committer:
jlargentaye
Date:
Mon Feb 13 02:47:25 2017 +0000
Revision:
0:7e789cd95883
Functional in mbed (except GPIO monitoring, LED BLUE and ORANGE)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jlargentaye 0:7e789cd95883 1 #include "mbed.h"
jlargentaye 0:7e789cd95883 2 #include "ws2812b.h"
jlargentaye 0:7e789cd95883 3
jlargentaye 0:7e789cd95883 4 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
jlargentaye 0:7e789cd95883 5
jlargentaye 0:7e789cd95883 6 int poke_leds (DigitalOut *leds, int num_leds, float delay)
jlargentaye 0:7e789cd95883 7 {
jlargentaye 0:7e789cd95883 8 // 000 001 011 010 110 111 101 100
jlargentaye 0:7e789cd95883 9 const uint8_t gray3[] = {0, 1, 3, 2, 6, 7, 5, 4};
jlargentaye 0:7e789cd95883 10 const size_t sz = ARRAY_SIZE(gray3);
jlargentaye 0:7e789cd95883 11 static size_t gray_idx;
jlargentaye 0:7e789cd95883 12
jlargentaye 0:7e789cd95883 13 for (int i = 0; i < num_leds; i++) {
jlargentaye 0:7e789cd95883 14 leds[i] = (gray3[gray_idx] >> i) & 1;
jlargentaye 0:7e789cd95883 15 }
jlargentaye 0:7e789cd95883 16 wait(delay);
jlargentaye 0:7e789cd95883 17
jlargentaye 0:7e789cd95883 18 int ret = gray3[gray_idx++];
jlargentaye 0:7e789cd95883 19 gray_idx %= sz;
jlargentaye 0:7e789cd95883 20
jlargentaye 0:7e789cd95883 21 return ret;
jlargentaye 0:7e789cd95883 22 }
jlargentaye 0:7e789cd95883 23
jlargentaye 0:7e789cd95883 24 #define RAM_BASE 0x20000000
jlargentaye 0:7e789cd95883 25 #define RAM_BB_BASE 0x22000000
jlargentaye 0:7e789cd95883 26 #define Var_ResetBit_BB(VarAddr, BitNumber) (*(volatile uint32_t *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 0)
jlargentaye 0:7e789cd95883 27 #define Var_SetBit_BB(VarAddr, BitNumber) (*(volatile uint32_t *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 1)
jlargentaye 0:7e789cd95883 28 #define Var_GetBit_BB(VarAddr, BitNumber) (*(volatile uint32_t *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)))
jlargentaye 0:7e789cd95883 29 #define BITBAND_SRAM(address, bit) ( (__IO uint32_t *) (RAM_BB_BASE + (((uint32_t)address) - RAM_BASE) * 32 + (bit) * 4))
jlargentaye 0:7e789cd95883 30
jlargentaye 0:7e789cd95883 31 #define varSetBit(var,bit) (Var_SetBit_BB((uint32_t)&var,bit))
jlargentaye 0:7e789cd95883 32 #define varResetBit(var,bit) (Var_ResetBit_BB((uint32_t)&var,bit))
jlargentaye 0:7e789cd95883 33 #define varGetBit(var,bit) (Var_GetBit_BB((uint32_t)&var,bit))
jlargentaye 0:7e789cd95883 34
jlargentaye 0:7e789cd95883 35 DigitalOut Orange(PD_12);
jlargentaye 0:7e789cd95883 36 extern "C" void toggle_orange (void)
jlargentaye 0:7e789cd95883 37 {
jlargentaye 0:7e789cd95883 38 Orange = !Orange;
jlargentaye 0:7e789cd95883 39 }
jlargentaye 0:7e789cd95883 40
jlargentaye 0:7e789cd95883 41 DigitalOut Blue(PD_13);
jlargentaye 0:7e789cd95883 42 extern "C" void toggle_blue (void)
jlargentaye 0:7e789cd95883 43 {
jlargentaye 0:7e789cd95883 44 Blue = !Blue;
jlargentaye 0:7e789cd95883 45 }
jlargentaye 0:7e789cd95883 46
jlargentaye 0:7e789cd95883 47 Serial pc(USBTX, USBRX);
jlargentaye 0:7e789cd95883 48 extern "C" void trace (char* str)
jlargentaye 0:7e789cd95883 49 {
jlargentaye 0:7e789cd95883 50 pc.printf(str);
jlargentaye 0:7e789cd95883 51 }
jlargentaye 0:7e789cd95883 52
jlargentaye 0:7e789cd95883 53 int main() {
jlargentaye 0:7e789cd95883 54
jlargentaye 0:7e789cd95883 55
jlargentaye 0:7e789cd95883 56 DigitalOut leds[] = {LED1, LED2, LED3};
jlargentaye 0:7e789cd95883 57 DigitalOut trig(PD_7);
jlargentaye 0:7e789cd95883 58
jlargentaye 0:7e789cd95883 59 trig = 1;
jlargentaye 0:7e789cd95883 60 pc.printf("derp.\r\n");
jlargentaye 0:7e789cd95883 61 ws2812b_init();
jlargentaye 0:7e789cd95883 62 trig = 0;
jlargentaye 0:7e789cd95883 63 poke_leds(leds, 3, 0.01);
jlargentaye 0:7e789cd95883 64 ws2812b_set_pixel(0, 1, 64, 128, 196);
jlargentaye 0:7e789cd95883 65 poke_leds(leds, 3, 0.01);
jlargentaye 0:7e789cd95883 66 while(1) {
jlargentaye 0:7e789cd95883 67 trig = 1;
jlargentaye 0:7e789cd95883 68 wait(0.1);
jlargentaye 0:7e789cd95883 69 if(ws2812b.transferComplete) {
jlargentaye 0:7e789cd95883 70 poke_leds(leds, 3, 0.01);
jlargentaye 0:7e789cd95883 71 // Signal that buffer is changed and transfer new data
jlargentaye 0:7e789cd95883 72 ws2812b.startTransfer = 1;
jlargentaye 0:7e789cd95883 73 ws2812b_handle();
jlargentaye 0:7e789cd95883 74 }
jlargentaye 0:7e789cd95883 75 poke_leds(leds, 3, 0.01);
jlargentaye 0:7e789cd95883 76 trig = 0;
jlargentaye 0:7e789cd95883 77 }
jlargentaye 0:7e789cd95883 78 }