Eventual attempt at porting the efficient WS2812 library to mbed
Dependencies: hubmartin-ws2812b mbed-dev
main.cpp@0:7e789cd95883, 2017-02-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |