# 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;
    }
  }
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
led5:A
led5:C