// Leggi il file README.md o meglio clicca sul tab Description
// accanto al tab Simulation
#include <LiquidCrystal.h>
#include <FastLED.h>
#define LED_PIN     2
#define NUM_LEDS   24
#define BRIGHTNESS  180
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
// I magic number non parlano
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // RS,EN,D4,D5,D6,D7
struct Blink {
    uint8_t m_pin;
    uint32_t m_t_ref;
    uint8_t m_t_interval;
    uint8_t m_t_intervalwb;
    void set (uint8_t pin, uint8_t interval) {
        m_pin = pin; 
        m_t_interval = interval;
        pinMode(m_pin, OUTPUT);
    }
    
    void run () {
        if (millis() - m_t_ref >= m_t_intervalwb) {
            m_t_intervalwb = m_t_interval;
            m_t_ref = millis();
            digitalWrite(m_pin, !digitalRead(m_pin));
        }

    }
};

struct Blink blink;

struct ForNoFor
{
  uint16_t index;
  uint16_t endIndex;
  uint8_t  increment;
};
const char myString[] = "for senza for";  // stringa di esempio lunga 13 caratteri

//                    index   endIndex   increment
ForNoFor dataForA = {   0,      12,         1 };
// nota endIndex = len(myString) - 1
uint32_t refTime;

void funForA (ForNoFor *fnf) {
  Serial.print( myString[ fnf->index ]);
  fnf->index += fnf->increment;
  if (fnf->index > fnf->endIndex) {
    fnf->index = 0;
    Serial.print('\n');
  }
}



void setup() {
  Serial.begin(115200);

  // I magic number non parlano
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );
  //const uint8_t idx[]= {};


  // Le macro invece parlano al contrario dei magic number
  //pinMode(LED_BUILTIN, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  blink.set(LED_BUILTIN, 500);
  uint8_t ledIdx = 0;
  uint8_t oldLedIdx = 1;
  uint8_t h = 0;
  
  for (uint8_t ora = 0; ora < 24; ora++) {
    
    for (uint8_t minuti = 0; minuti < 60; minuti++) {
      
      
      ledIdx = (ora % 12) * 2 + (minuti > 30);
      if (oldLedIdx != ledIdx) {
          leds[oldLedIdx] = CRGB::Black;
          FastLED.show();
          leds[ledIdx] = CRGB::OrangeRed;
          FastLED.show();
          oldLedIdx = ledIdx;
      }
      delay(10);


      //CRGB::OrangeRed
   
      Serial.print(ledIdx);
      Serial.print("\t");
      Serial.print(ora);
      Serial.print(":");
      Serial.println(minuti);
    }
  }
  while(true);
}


void loop() {
  // qui con if (millis() - dt > intervallo) temporizziamo la chiamata a funForA
  if (millis() - refTime >= 200) {
    funForA( &dataForA );
    refTime = millis();
  }
  blink.run();
  // qui per dimostrare che funForA non è bloccante accendiamo e spegniamo il led on board
  // anchesso temporizzato con millis.

  // Output su serial monitor
  // for senza for
  // for senza for
  // for senza for
  // ... così all'infinito
  // nel frattempo il led on board lampeggia regolarmente
}
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
ring1:GND
ring1:VCC
ring1:DIN
ring1:DOUT
ring2:GND
ring2:VCC
ring2:DIN
ring2:DOUT