/* 
  https://www.reddit.com/r/FastLED/comments/1foiz9i/what_do_you_think_about_the_hsv_rgb_pr_for_fastled/
  https://github.com/FastLED/FastLED/pull/1726

  Original FastLED on the left. PR1726 on the right.
*/

#include <FastLED.h>
#include "fill_rainbow_circular-pr1726.h"

// `false`: typical idiomatic FastLED code
// `true` : a path less well trodden
#define USE_RAW_CONVERSION false

#define REVERSED false

#define NUM_LEDS 402

CRGB leds[NUM_LEDS];
CHSV* leds_hsv = (CHSV*) leds;

void setup() {
  FastLED.addLeds<WS2812B, 3, GRB>(leds, NUM_LEDS);
  Serial.begin(2000000);
}

void loop() {
  const int iterations = 1;
  static uint8_t hue = 0;

  uint32_t orig_us1 = micros();
  for (uint32_t i = 0; i < iterations; i++) {
    fill_rainbow_circular(&leds_hsv[0], 4, hue, REVERSED);
    fill_rainbow_circular(&leds_hsv[4], 12, hue, REVERSED);
    fill_rainbow_circular(&leds_hsv[16], 21, hue, REVERSED);
    fill_rainbow_circular(&leds_hsv[37], 29, hue, REVERSED);
    fill_rainbow_circular(&leds_hsv[66], 37, hue, REVERSED);
    fill_rainbow_circular(&leds_hsv[103], 45, hue, REVERSED);
    fill_rainbow_circular(&leds_hsv[148], 53, hue, REVERSED);
  }
  uint32_t orig_us2 = micros();

  uint32_t fix_us1 = micros();
  for (uint32_t i = 0; i < iterations; i++) {
    fill_rainbow_circular2(&leds_hsv[201], 4, hue, REVERSED);
    fill_rainbow_circular2(&leds_hsv[201 + 4], 12, hue, REVERSED);
    fill_rainbow_circular2(&leds_hsv[201 + 16], 21, hue, REVERSED);
    fill_rainbow_circular2(&leds_hsv[201 + 37], 29, hue, REVERSED);
    fill_rainbow_circular2(&leds_hsv[201 + 66], 37, hue, REVERSED);
    fill_rainbow_circular2(&leds_hsv[201 + 103], 45, hue, REVERSED);
    fill_rainbow_circular2(&leds_hsv[201 + 148], 53, hue, REVERSED);
  }
  uint32_t fix_us2 = micros();

  // convert framebuffer from CHSV to CRGB
  if ( ! USE_RAW_CONVERSION) {
    // using FastLED's usual hsv2rgb_rainbow() method
    for (auto i = 0; i < NUM_LEDS; i++)
      leds[i] = leds_hsv[i];
  } else {
    // using hsv2rgb_raw()
    for (auto i = 0; i < NUM_LEDS; i++)
      hsv2rgb_raw(leds_hsv[i], leds[i]);
  }

  FastLED.show();
  hue++;

  Serial.print(float(orig_us2 - orig_us1) / iterations);
  Serial.print("μs vs ");
  Serial.print(float(fix_us2 - fix_us1) / iterations);
  Serial.print("μs  % change: ");
  Serial.println(float(fix_us2 - fix_us1) / float(orig_us2 - orig_us1) * 100.f - 100.f);
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
ring4a:GND
ring4a:VCC
ring4a:DIN
ring4a:DOUT
ring12a:GND
ring12a:VCC
ring12a:DIN
ring12a:DOUT
ring21a:GND
ring21a:VCC
ring21a:DIN
ring21a:DOUT
ring29a:GND
ring29a:VCC
ring29a:DIN
ring29a:DOUT
ring37a:GND
ring37a:VCC
ring37a:DIN
ring37a:DOUT
ring45a:GND
ring45a:VCC
ring45a:DIN
ring45a:DOUT
ring53a:GND
ring53a:VCC
ring53a:DIN
ring53a:DOUT
ring4b:GND
ring4b:VCC
ring4b:DIN
ring4b:DOUT
ring12b:GND
ring12b:VCC
ring12b:DIN
ring12b:DOUT
ring21b:GND
ring21b:VCC
ring21b:DIN
ring21b:DOUT
ring29b:GND
ring29b:VCC
ring29b:DIN
ring29b:DOUT
ring37b:GND
ring37b:VCC
ring37b:DIN
ring37b:DOUT
ring45b:GND
ring45b:VCC
ring45b:DIN
ring45b:DOUT
ring53b:GND
ring53b:VCC
ring53b:DIN
ring53b:DOUT