Adafruit_RGB_LCD SHIELD FINITE STATE MACHINE PROJ

I have code working, stolen, compiles, uploads. Is the reason the other buttons do not work due to there being no code to simply provide functionality to those buttons ? Disgraceful question. I will add more read button code to the read button method.

This is what I have done this evening

//Example code for the Adafruit RGB Character LCD Shield and Library

//This code displays text on the shield, and also reads the buttons on the keypad.
//When a button is pressed, the backlight changes color.

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

// include the library code:

#include <Wire.h>
#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>
#include <NoiascaLiquidCrystal.h>
#include <NoiascaHW/lcd_mcp23017.h>


  const byte cols = 16;        // columns/characters per row
const byte rows = 2;         // how many rows
const byte addr = 0x20;      // set the LCD address to 0x20

const byte rs = 7 + 8;       // GPIOB7
const byte rw = 255;         // not used
const byte en = 5 + 8;       // GPIOB5
const byte d4 = 4 + 8;       // GPIOB4
const byte d5 = 3 + 8;       // GPIOB3
const byte d6 = 2 + 8;       // GPIOB2
const byte d7 = 1 + 8;       // GPIOB1
const byte bl = 255;         // not used

const byte rgbRed = 6;       // GPIOA6
const byte rgbGreen = 0 + 8; // GPIOB0
const byte rgbBlue = 7;      // GPIOA7

const byte btnSelect = 0;    // GPIOA0 Buttons
const byte btnRight = 1;
const byte btnDown = 2;
const byte btnUp = 0x08;
const byte btnLeft = 4;

const byte button[] {BUTTON_LEFT, btnUp, BUTTON_DOWN, BUTTON_RIGHT, btnSelect};  // the 5 buttons on the LCD RGB KEYPAD connected to GPIO A
const byte OFF = HIGH;                // The buttons are low active, therefore we need to inverse them
const byte ON  = !OFF;

LiquidCrystal_MCP23017_custompin lcd(addr, rs, rw, en, d4, d5, d6, d7, bl, POSITIVE, cols, rows);
//LiquidCrystal_MCP23017_custompin_base lcd(addr, rs, rw, en, d4, d5, d6, d7, bl, POSITIVE, cols, rows); // this is just for internal tests

struct Data {
  char line[rows][cols + 1 + 8];  // a buffer for each line[row], with the length of cols + null + some spare place if UTF-8 is needed
};

const Data data[] {
  {"Text A 0", "Text A 1"},
  {"123456789A123456", "123456789B123456"},
  {"Latin", "Ä ä Ö ö Ü ü ß"},
  {"Symbols", "αβμΣ°÷∞←→"},
  {"Text E 0", "Text E 1"}
};

const size_t noOfData = sizeof (data) / sizeof(data[0]); // how many elements in data?
enum class State { FIXTEXT, RUNTIME, RANDOM} state;      // what kind of data should be shown
size_t currentData = 0;                                  // which data should be shown next time
const byte discretePin = A0;                             // just a pin on the Arduino to read from - not used

// loop through the array of data
void updateFixtext()
{
  static uint32_t previousMillis = 0;
  static size_t currentLine = 0;
  if (millis() - previousMillis > 4000)
  {
    previousMillis = millis();
    Serial.println(data[currentLine].line[0]);
    lcd.clear();
    lcd.print(data[currentLine].line[0]);
    lcd.setCursor(0, 1);
    lcd.print(data[currentLine].line[1]);
    // increase line for next iteration
    currentLine++;
    currentLine = currentLine % noOfData;
  }
}

//show runtime on LCD
void updateRuntime()
{
  static uint32_t previousMillis = 0;
  if (millis() - previousMillis > 1000)
  {
    previousMillis = millis();
    Serial.println(F("runtime"));
    Serial.println(millis() / 1000);
    lcd.clear();
    lcd.print(F("runtime"));
    lcd.setCursor(0, 1);
    lcd.print(millis() / 1000);
  }
}

//show a random value on LCD
void updateRandom()
{
  static uint32_t previousMillis = 0;
  if (millis() - previousMillis > 2000)
  {
    previousMillis = millis();
    Serial.println(F("Random:"));
    Serial.println(random(42));  // just print a Random number
    lcd.clear();
    lcd.print(F("Random:"));
    lcd.setCursor(0, 1);
    lcd.print(random(42));
  }
}

// Debounce and Change state detection for the keypad
bool wasPressedKeypad()
{
  static uint32_t previousMillis = 0;
  static bool previousState = OFF;
  bool currentState = lcd.digitalRead(btnSelect);
  bool result = false;
  if (currentState != previousState && millis() - previousMillis > 40)  // Debounce
  {
    previousMillis = millis();
    previousState = currentState;
    if (currentState == LOW) {
      result = true;
      Serial.println(F("pressed"));
    }
  }

  return result;
}

// just an example how to debounce pins on the Arduino
bool wasPressedDiscrete()
{
  static uint32_t previousMillis = 0;
  static bool previousState = LOW;
  bool currentState = digitalRead(A0);
  bool result = false;
  if (currentState != previousState && millis() - previousMillis > 40)
  {
    previousMillis = millis();
    if (currentState == LOW) result = true;
    previousState = currentState;
  }
  return result;
}

void runFSM()
{
  switch (state)
  {
    case State::FIXTEXT :
      updateFixtext();
      if (wasPressedKeypad())
        state = State::RUNTIME;
      break;
    case State::RUNTIME :
      updateRuntime();
      if (wasPressedKeypad())
        state = State::RANDOM;
      break;
    case State::RANDOM :
      updateRandom();
      if (wasPressedKeypad())
        state = State::FIXTEXT;
      break;
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\nStart"));
  Wire.begin();                        // start I2C library
  lcd.begin();                         // initialize the LCD
  lcd.setCursor(1, 0);                 // set the cursor to a specific position
  lcd.print("Hello, world!");
  lcd.setCursor(0, 1);
  lcd.print("αβμΣ°÷∞←→äöüßÄÖÜ");     // show some special character entered in UTF-8

  for (auto & i : button)
    lcd.setPinMode(i, INPUT_PULLUP);   // activate the internal pullups for the defined buttons
  lcd.setPinMode(rgbBlue, OUTPUT);     // set the RGB pins to outputs
  lcd.setPinMode(rgbRed, OUTPUT);
  lcd.setPinMode(rgbGreen, OUTPUT);
  lcd.digitalWrite(rgbBlue, OFF);      // swith a RGB pin
  lcd.digitalWrite(rgbRed, ON);
  lcd.digitalWrite(rgbGreen, OFF);
}

void loop()
{
  runFSM();
}