# include "jbutton.h"
//jButton xjt;
//jButton add, stop;
//jButton test();
jButton arrayOf[3] = {3, 5, 4};
// single button empty constructor
// jButton myOneButton;
// jButton anotherOneButton();
const byte stillLED = 7;
unsigned long now;
void setup() {
  Serial.begin(112500);
  Serial.println("test jButton world!\n");
  pinMode(stillLED, OUTPUT);
  for (int ii = 0; ii < 3; ii++) 
    arrayOf[ii].begin();
  setupPumps();
}
# define xjt 0
# define add 1
# define stop 2
void loop() {
  now = millis();
  arrayOf[xjt].loop();
  arrayOf[add].loop();
  arrayOf[stop].loop();
  bool isStill = arrayOf[add].isStill();
//  Serial.println(isStill); delay(10);
  digitalWrite(stillLED, isStill ? HIGH : LOW);
  if (arrayOf[xjt].isPress()) {
    Serial.print("I saw that pressed! "); Serial.println(millis());
  }
  if (arrayOf[xjt].isRelease()) {
    Serial.print("I saw that released! "); Serial.println(millis());
  }
  if (0) if (arrayOf[xjt].isStill()) {
    Serial.print("               hey! "); Serial.println(millis());
  }
  if (arrayOf[add].isPress()) {
    Serial.print("I see that add... ");
    if (addAPump()) Serial.println("and cannot");
  }
  if (arrayOf[stop].isPress()) {
    Serial.println("I saw that stop!");
    stopAll();
  }
  servicePumps();
}
# define NPUMPS 4
const unsigned char pumpPin[] = {A0, A1, A2, A3};
# define mincr(x, z)  do { ++x; while (x >= z) x -= z; } while (0)
unsigned char nOn;
void setupPumps()
{
  for (unsigned char tt = 0; tt < NPUMPS; tt++)
    pinMode(pumpPin[tt], OUTPUT);
  nOn = 0;
  stopAll();
}
void stopAll()
{
  nOn = 0;
  for (unsigned char tt = 0; tt < NPUMPS; tt++)
    digitalWrite(pumpPin[tt], LOW);
}
unsigned long lastTime;
void servicePumps()
{
  if (now - lastTime < 1777) return;
  lastTime = now;
// hacker flawed logic grrr.
  oneLessPump();
}
/* load sharing */
static unsigned char nFirst;
static unsigned char myNext;
unsigned char addAPump()
{
  if (nOn == 0) {
    myNext = nFirst;
    mincr(nFirst, NPUMPS);  // ++; if (nFirst >= NPUMPS) nFirst = 0;
  }
  if (nOn == NPUMPS) {
    Serial.print("               no more pumps nFirst is ");
    Serial.println(nFirst);
    return 1;    // FAIL
  }
  nOn++;
  lastTime = now;
/* here is where a pump might really be turned on, or the process for doing initiated
  Serial.print("pump ");
  Serial.print(nOn);    // number in the work force 1, 2 &c.
  Serial.print(" is ");
  Serial.print(myNext); // pump ID number
  Serial.println("");
*/
  digitalWrite(pumpPin[myNext], HIGH);
  Serial.print("   and added pump ");
  Serial.println(myNext);
  mincr(myNext, NPUMPS);  // ++; if (myNext >= NPUMPS) myNext = 0;
  return 0;   // DID
}
void oneLessPump()
{
  if (!nOn) return;
  Serial.print("retire pump ");
  for (char ii = 0; ii < NPUMPS; ii++) {
    int aPump = (nFirst + ii - 1);
    while (aPump < 0) aPump += NPUMPS;
    while (aPump >= NPUMPS) aPump -= NPUMPS;
    if (digitalRead(pumpPin[aPump]) == HIGH) {
      Serial.print(aPump);
      Serial.println(".");
      digitalWrite(pumpPin[aPump], LOW);
      nOn--;
      break;
    }
  }
}