Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Neopixel::Neopixel(int size)
- :values(size),
- mode(Mode::UP),
- LED_data{0}
- {
- values.shrink_to_fit();
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 9, IOCON_FUNC1); /* PIO0_9 connected to MOSI0 */
- Chip_SSP_Init(LPC_SSP0);
- Chip_SSP_SetMaster(LPC_SSP0, 1);
- Chip_SSP_SetClockRate(LPC_SSP0, 0, 6);
- Chip_SSP_SetFormat(LPC_SSP0, SSP_BITS_15, SSP_FRAMEFORMAT_SPI, SSP_CLOCK_CPHA0_CPOL0);
- Chip_SSP_Enable(LPC_SSP0);
- }
- Neopixel::~Neopixel()
- {
- Chip_SSP_Disable(LPC_SSP0);
- }
- void Neopixel::send()
- {
- for (auto& val : values) {
- for(int i{23}; i >= 0; --i) {
- LED_data = get_bit(val, i) ? CODE_1 : CODE_0;
- while(!Chip_SSP_GetStatus(LPC_SSP0, SSP_STAT_TNF)); //TX FIFO not FULL
- Chip_SSP_SendFrame(LPC_SSP0, LED_data);
- }
- }
- }
- void Neopixel::shine_everyone(Color val)
- {
- std::fill(std::begin(values), std::end(values), val);
- send();
- }
- void Neopixel::rotate_left(std::vector<Color> colors)
- {
- static uint32_t cnt{0};
- values[cnt % values.size()] = colors[cnt % colors.size()];
- send();
- if (values[values.size() - 1] != 0) {
- std::fill(std::begin(values), std::end(values), Color{});
- mode = Mode::DOWN;
- }
- ++cnt;
- }
- void Neopixel::rotate_right(std::vector<Color> colors)
- {
- static uint32_t cnt{values.size() - 1};
- values[cnt] = colors[cnt % colors.size()];
- send();
- if (values[0] != 0) {
- std::fill(std::begin(values), std::end(values), Color{});
- mode = Mode::UP;
- cnt = values.size();
- }
- --cnt;
- }
- void Neopixel::run_n_back(std::vector<Color> colors)
- {
- mode == Mode::UP ? rotate_left(colors) : rotate_right(colors);
- }
- auto Neopixel::create_vec_levels(Color color, double bright)
- {
- auto col{color};
- bool flag{true};
- std::vector<Color> to_zeros{col};
- while (flag) {
- auto col_array = col.RGB_vec();
- std::transform(std::begin(col_array), std::end(col_array), std::begin(col_array),
- [=](auto comp) {return comp * bright;});
- if (std::all_of(std::begin(col_array), std::end(col_array), [](int i){return i == 0;})) {
- col = {};
- flag = false;
- }
- else {
- col = {col_array[0], col_array[1], col_array[2]};
- }
- to_zeros.push_back(col);
- }
- return to_zeros;
- }
- void Neopixel::darkness(Color color, double bright)
- {
- static auto vec_colors = create_vec_levels(color, bright);
- static uint32_t cnt{0};
- std::fill(std::begin(values), std::end(values), vec_colors[cnt % vec_colors.size()]);
- send();
- ++cnt;
- for (volatile int i{0}; i < 1000000; ++i);
- }
- void Neopixel::brightness(Color color, double bright)
- {
- static auto vec_colors = create_vec_levels(color, bright);
- static auto cnt{vec_colors.size() - 1};
- std::fill(std::begin(values), std::end(values), vec_colors[cnt]);
- send();
- cnt = cnt > 0 ? cnt - 1 : vec_colors.size() - 1;
- for (volatile int i{0}; i < 1000000; ++i);
- }
- void Neopixel::every_second(Color color)
- {
- for (uint32_t i{0}; i < values.size(); i += 2)
- values[i] = color;
- send();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement