// ================================================================
//  STEM / Educational Game Platform - with a top level Menu selection
//  using a Micro Controller, 8 LED 4 color bar and 4 Button module
//

//  include Library of Hardware Support functions
#include "Mini_STEM_Platform.h"

unsigned long t0,t1;

// the setup routine runs once on power up or when you press reset:
//=================================================================
void setup() {

  // initialize serial communication at 9600 bits per second:
  Serial.begin(115200);
  Serial.println("Hardware Test for the Mini STEM/Game Platform");

  // ------------ setup the Mini Game/STEM platform (8LEDs, 4Btns, and Audio)
  gPlatform_setup();

  //  demostrate the usefulness of set_LEDs()
  for (int i=0;i<8;i++) { refreshWait(100); set_LEDs(1<<i,1); }
  for (int i=0;i<8;i++) { refreshWait(100); set_LEDs(1<<i,2); }
  for (int i=0;i<8;i++) { refreshWait(100); set_LEDs(1<<i,3); }
  for (int i=0;i<8;i++) { refreshWait(100); set_LEDs(1<<i,0); }
  refreshWait(750);
  clearDisp();
  
  // highlight the Audio
  boop(100,200);
  beep(100,200);
  buZZ(100,200);
}

// the loop routine runs over and over again forever:
//=================================================================
void loop() { // Top Menu level, for selecting 1 of N activities
  btnReporting();    // exercises the buttons and Leds, and reports via Serial
}

//=================================================================
void btnReporting() {
  // =================================  Button - LED exercise & Reporting
  int icnt=0; // iteration count, lsb~=1msec
  clearDisp();
  while (1) {
    refreshWait(1);
    icnt++;
    scanBtns();
    // ------------------- button reporting
    if (BtnChanged) {
      Serial.println(" ");
      if (btn1) Serial.print("[Btn1] "); else Serial.print("       ");
      if (btn2) Serial.print("[Btn2] "); else Serial.print("       ");
      if (btn3) Serial.print("[Btn3] "); else Serial.print("       ");
      if (btn4) Serial.print("[Btn4] "); else Serial.print("       ");
      //Serial.print(btnState);

      // ------------------ LED reflection of button state
      lit[1] = lit[2] = btn1; // set Red LEDs
      lit[3] = lit[4] = btn2; // set Yel LEDs
      lit[5] = lit[6] = btn3; // set Blu LEDs
      lit[7] = lit[8] = btn4; // set Grn LEDs
      brightOne=0;

      beep(15); // make a key press click, for up&down
      icnt=0;
    } else if (icnt>10000) {  // if ignorned for 10 seconds
      icnt=0;
      brightOne=1;
      beep(15,200);
      clearDisp();
    }
    if (ESC && brightOne==0 && btn4 ) Serial.print(" [ESC] ");    
    brightOne = (ESC)? 8 : 0;
    //if (ESC && btn1) break;    // only leave Btn Reporting if btn1 is also held.
  }
}


// ================== Local Support Utility Functions =================

void set_LEDs(byte led_pattern, byte state) {
  // led_pattern: bit decoded pattern, eg: 9= (00001001b)left most led + forth (led#1 & #4)
  // state: 1=dim, 2=lit, 3=bright, 0=clear
  byte b;
  for (int i=1; i<=8; i++) {
    b = led_pattern & 1;
    led_pattern=led_pattern>>1;
    if (b) {
      dim[i]=0; lit[i]=0; brt[i]=0; // default state cleared
      if (state==1)  dim[i] = true;
      else if (state==2)  lit[i] = true;
      else if (state==3)  brt[i] = true;
    }
  }
}
