/*
This sketch provides an example of using the Arduboy2 library's BeepPin1 class
to play simple tones.
*/

/*
To the extent possible under law, Scott Allen has waived all copyright and
related or neighboring rights to this BeepDemo program.
*/

// Comments are only provided for code dealing with tone generation or control.

#include <Arduboy2.h>
// There's no need to #include <Arduboy2Beep.h>
// It will be included in Arduboy2.h

Arduboy2 arduboy;

BeepPin1 beep; // Create a class instance for speaker pin 1
//BeepPin2 beep; // For speaker pin 2, use this line instead of the line above

int objectX = 0;

char displayText[60];

void setup() {
  arduboy.begin();
  arduboy.setFrameRate(25);

  beep.begin(); // Set up the hardware for playing tones

  commandText("none - Press buttons");
}

void loop() {
  if (!arduboy.nextFrame()) {
    return;
  }

  // The timer() function is called once per frame, so duration values will be
  // the number of frames that the tone plays for.
  // At 25 frames per second each frame will be 40ms.
  beep.timer(); // handle tone duration

  arduboy.pollButtons();

  if (arduboy.justPressed(LEFT_BUTTON)) {
    // Play a 523.251Hz tone (piano note C5) for 5 frames (200ms at 25 FPS)
    // beep.freq(523.251) is used to convert 523.251Hz to the required count
    beep.tone(beep.freq(523.251), 5);

    commandText("beep.tone(\n beep.freq(523.251),\n 5)");
  }

  if (arduboy.justPressed(UP_BUTTON)) {
    // Play a 587.330Hz tone (piano note D5) for 15 frames (600ms at 25 FPS)
    beep.tone(beep.freq(587.330), 15);

    commandText("beep.tone(\n beep.freq(587.330),\n 15)");
  }

  if (arduboy.justPressed(RIGHT_BUTTON)) {
    // Play a 659.255Hz tone (piano note E5) for 50 frames (2s at 25 FPS)
    beep.tone(beep.freq(659.255), 50);

    commandText("beep.tone(\n beep.freq(659.255),\n 50)");
  }

  if (arduboy.justPressed(DOWN_BUTTON)) {
    // Play a 698.456Hz tone (piano note F5) until stopped
    // or replaced by another tone
    beep.tone(beep.freq(698.456));

    commandText("beep.tone(\n beep.freq(698.456))");
  }

  if (arduboy.justPressed(A_BUTTON)) {
    // For short tones with a duration less than a frame time,
    // or when timer() isn't being used, such as in a menu,
    // a continuous tone can be played and then stopped after a delay
    // but note that no other work will be done during the delay.
    beep.tone(beep.freq(1000)); // Play a 1000Hz tone until stopped
    arduboy.delayShort(30); // Delay for 30ms
    beep.noTone(); // Stop the tone

    commandText("beep.tone(\n beep.freq(1000))\n(delay 30ms)\nbeep.noTone()");
  }

  if (arduboy.justPressed(B_BUTTON)) {
    beep.noTone(); // Stop the tone if one is playing

    commandText("beep.noTone()");
  }

  arduboy.println(F("Last command:"));
  arduboy.print(displayText);

  // The Arduboy2 class's audio subclass controls sound muting.
  // For this sketch, mute or unmute can be set using the "System Control"
  // start up feature. (Hold B while powering up then, while still holding B,
  // press UP to enable sound or DOWN for mute.)
  if (!arduboy.audio.enabled()) {
    arduboy.setCursor(22, 40);
    arduboy.print(F("Sound is MUTED"));
  }

  arduboy.setCursor(0, 48);
  // The "duration" variable can be tested for non-zero to determine if a
  // timed tone is currently playing.
  if (beep.duration != 0) {
    arduboy.print(F("A tone is playing"));
  }
  else {
    arduboy.print(F("Continuous tone or\nno tone playing"));
  }

  arduboy.drawRect(objectX, 40, 6, 6);
  if (++objectX == WIDTH - 6) {
    objectX = 0;
  }

  arduboy.display(CLEAR_BUFFER);
}

void commandText(const char* text) {
  strncpy(displayText, text, sizeof displayText);
  displayText[sizeof displayText - 1] = '\0';
}