/*
  Exemplo de uso do Analisador Lógico Wokwi com o Franzininho
  by Anderson Costa with ❤ for the Wokwi community

  Documentação em Português do Analisador Lógico
  https://docs.wokwi.com/pt-BR/guides/logic-analyzer

  Visit https://wokwi.com to learn about the Wokwi Simulator
  Visit https://franzininho.com.br to learn about the Franzininho
*/

#include <TinyDebug.h>

#define PWM_PIN  1               // Seleciona o pino para o PWM - pino físico 1 (PB1)
#define POT_PIN  A0              // Pino de entrada para o potenciômetro - pino físico 4 (PB5)

const uint8_t lowerBound = 40;   // Limite mínimo de 25% de uma faixa qualquer (µs)
const uint8_t upperBound = 160;  // Limite máximo de 100% de uma faixa qualquer (µs)

// Obs: 1 amostra #0 de partida será capturada ao iniciar a simulação!
const uint8_t samples = 100;     // Total de amostras (samples)

uint8_t bounds = 0;              // Retorna o limite definido no potenciômetro
uint8_t lastBounds = 0;          // Retorna o último limite definido

void setup() {
  Debug.begin();

  pinMode(POT_PIN, INPUT);
  pinMode(PWM_PIN, OUTPUT);

  bounds = 1;
  digitalWrite(PWM_PIN, LOW);

  Debug.println(F("Amostra #0 de partida capturada ;)"));
  Debug.println(F("Ajuste o limite da borda no potenciômetro."));
}

void loop() {
  // Aguarda 9 segundos para poder ajustar o potenciômetro
  for (uint8_t i = 9; i > 0; i--) {
    // Define os limites superior e inferior (usado apenas para demonstração)
    bounds = map(analogRead(POT_PIN), 0, 1023, lowerBound, upperBound);

    // Verifica mudança no ajuste
    if (lastBounds != bounds) {
      lastBounds = bounds;
      Debug.print(F("Limite da borda definido: "));
      Debug.print(bounds);       // Limites em Microssegundos (µs)
      Debug.println(F("µs"));
    }

    Debug.print(i);
    Debug.println(F(" segundos para começar..."));
    delay(1000);
  }

  Debug.println(F("Iniciando captura das amostras:"));

  // Pega 100 amostras
  for (uint8_t i = 0; i < samples / 2; i++) {
    digitalWrite(PWM_PIN, HIGH); // Seta o sinal para nível ALTO
    delayMicroseconds(bounds);   // Atraso em Microssegundos (µs)

    digitalWrite(PWM_PIN, LOW);  // Seta o sinal para nível BAIXO
    delayMicroseconds(bounds);   // Atraso em Microssegundos (µs)
  }

  Debug.print(samples);          // Total de amostras sem a de partida
  Debug.println(F(" amostras capturadas a partir dos ~9 segundos.\n"));

  Debug.println(F("ATENÇÃO: PARE a simulação para obter o arquivo (vcd) com as amostras.\n"));
  Debug.println(F("DICA: Não esqueça de alterar o downsampling factor no PulseView para 50. "));
  Debug.println(F("Infelizmente, as opções padrão geralmente fazem com que o PulseView consuma muita memória RAM e fique lento.\n"));
  Debug.print(F("Saiba mais em: https://docs.wokwi.com/pt-BR/guides/logic-analyzer"));

  for (;;);
}
D0D1D2D3D4D5D6D7GNDLOGIC