// ***********************************************************
// ***********************************************************
// ***********************************************************

// NOT FINISHED, WORK IN PROGRESS 

// ***********************************************************
// ***********************************************************
// ***********************************************************

// Ralph S Bacon
// #71 How to create an Arduino Library - easy!
// https://www.youtube.com/watch?v=fE3Dw0slhIc

// JoaoLopesF full SerialDebug lib
// https://github.com/JoaoLopesF/SerialDebug
// https://randomnerdtutorials.com/serialdebug-library-arduino-ide/




// ***********************************************************
// 
// This is a Template project which I will use when starting new projects:
//
// your debugging Serial.print() on and off 
//
// Created by leftCoast on github
// LC_baseTools
// mechButton_Pro.ino
// https://github.com/leftCoast/LC_baseTools/tree/master/examples/mechButton_Pro
// 
// Modified by Edoctoor Feb 3, 2022
//
// as I wanted to toggle my print lines off and on to 
// see how much memory serial prints takes up by 
// comparing compiles.
// In this project we are using debug() to toggle a star ship;
// as an example of how you can use debug() to toggle debugging Serial.prints on and off
// 
// More information on this can be found here, 
// STOP using debug in your Arduino code! THIS is better.
// https://youtu.be/--KxxMaiwSE
//
// ***********************************************************

#include <mechButton.h>
#include <idlers.h>
                     // "" means same folder and <> means wider scope or external.
#include "bug.h" // When we move to the Library folder we use <> instead of ""

Bugger bugger(true); // Notice: Bugger object that we use here forward, is in lower case 

#define BUTTON_PIN1     2                                      // Pin we will hook the button to. The other side hooks to ground.
#define LED_PIN         13                                     // Usual pin number for built in LED.

#define DEBUG           1                                      // This toggles the debug() statements 1 for on, or 0 for off.

#if DEBUG == 1
#define debug(x)        Serial.print(x);                       // Use debug(x) to toggle Serial.print 
#define debugln(x)      Serial.println(x);
#else                                                          // Else the the compiler does not generate Serial.print statements
#define debug(x)
#define debugln(x)
#endif

// ***********************************************************
//
//                      proButton class definition
//
//    Inherit from mechButton and creae a class that does
//    your custom bidding.
//
// ***********************************************************


class proButton      :  public mechButton {

   public:
                        proButton(int inPin);
   virtual              ~proButton(void);

                  void  begin(void);     
                  void  blank(int numBlanks);
                  void  line(int numLines);
   virtual        void  takeAction(void);

};


// ***********************************************************
//
//                      proButton class code
//
// ***********************************************************


// Constructor, not much going on. Just passing the pin number in.
proButton::proButton(int inPin)
   :mechButton(inPin) {    }


// Destructor, nothing allocated so nothing to do.
proButton::~proButton(void)   {    }


// begin, Needed somewhere to place the hookup() call. begin is tradional.
void  proButton::begin(void)  { hookup(); }


// blank, print some blanks.
void proButton::blank(int numBlanks)   {

   for (int i=1;i<=numBlanks;i++)   {
      debug(' ');
   }
}


// line, give us some blank linkes.
void proButton::line(int numLines) {

   for (int i=0;i<numLines;i++)   {
      debugln();
   }
}


// tackAction, this is what is called when there is no callback set.
void proButton::takeAction(void) {

   if (setAs)  {
      blank(36);
      debugln(F("Live lone and prosper.\n"));
      if (DEBUG)  {
         Serial.println(F("edit #define DEBUG 0 to hide the star ship")); 
         Serial.println(F("=========================================="));
      } else   {
         Serial.println(F("edit #define DEBUG 1 to see the star ship")); 
         Serial.println(F("=========================================="));
      }
   } else {
      line(4);
      blank(10);debugln(F("                                     --------------------------===="));
      blank(10);debugln(F("            __                      ( |                         ==="));
      blank(10);debugln(F("         /------\\                    ---------------------------=="));
      blank(10);debugln(F("------------------------------           |  |"));
      blank(10);debugln(F("\\____________________________/]          |  |"));
      blank(10);debugln(F("         --------       \\     \\          |  |"));
      blank(10);debugln(F("                         \\     \\         |  |"));
      blank(10);debugln(F("                          \\ --------_____|  |__"));
      blank(10);debugln(F("                         | |              --  /"));
      blank(10);debugln(F("                        -||                  ||"));
      blank(10);debugln(F("                         | |__________/------== "));
      line(2);
   }
}


// ***********************************************************
//
//                      Sketch starts here
//
// ***********************************************************


proButton button1(BUTTON_PIN1);                                // Set button1 to pin 2

// Your standard sketch setup()
void setup()   {


   pinMode(LED_PIN, OUTPUT);                                   // Set up the LED pin for OUTPUT.
   button1.begin();                                            // Fire up the button. (Calls hookup() for idling.)

   // Serial.begin(9600);                                       // Fire up our serial monitor thing.
   // We have to disable the Serial.begin because the Serial begins in the bugger class
   bugger.begin(9600);
   randomSeed(analogRead(A0));

}


// Your standard sketch loop()
void loop()    {
   bool  buttonState;

   idle();                                                     // Let all the idlers have time to do their thing.
   buttonState = button1.trueFalse();                          // Have a look at what the current button state is.
   digitalWrite(LED_PIN, !buttonState);                        // Since the button grounds when pushed, invert the logic with ! 

   // example lib
   long rndNo = bugger.getRandomNumber();
   Serial.println(rndNo);

   sleep(10000);

}