#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 8
#define CLK_PIN 13 //12
#define DATA_PIN 11
#define CS_PIN 10

// Define BCD input pins
#define BCD_A A0
#define BCD_B A1
#define BCD_C A2
#define BCD_D A3
#define BCD_E A4
//#define BCD_F A5

// Create a Parola object
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

const int DEFAULT_SCROLL_SPEED = 30; //30
const int MESSAGE_1_SCROLL_SPEED = 30; //lower numberis faster
const int MESSAGE_2_SCROLL_SPEED = 35;
const int MESSAGE_15_SCROLL_SPEED = 2;
const int SCROLL_PAUSE = 2000;
// const int cs = 1;
bool loopingMessage = false; 


// Create an array of messages and corresponding settings
struct MessageSetting {
  const char *message;
  textPosition_t scrollAlign;
  uint8_t scrollSpeed;    // default frame delay value
  uint16_t scrollPause; // in milliseconds
  textEffect_t scrollInEffect;
  textEffect_t scrollOutEffect;
 // setCharSpacing cs; 
//  setCharSpacing  ( uint8_t  , cs  ); 
};

MessageSetting messages[33] = {
    {"                          ",  PA_LEFT, DEFAULT_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT },   // Message 0  0
  {"   TEST    ",  PA_LEFT, DEFAULT_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT },   // lEVEL 1 MESSAGE  1
  //
   {"APPRENTICES 1982 - GRANT LEVEY , JOHN O'NEIL, ZELJKO HOVANCEK, VINCE CURCIO, WARREN McKENZIE, GREG ORR, GLEN WRIGHT, RON McDONALD, TERRY PIGEON , NICK JAVNI                 ", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, 0,  PA_SCROLL_LEFT,},  // LEVEL 2 MESSAGE  2
 // {"  200 CITY    ROAD 1908", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE,  PA_SCROLL_RIGHT, PA_NO_EFFECT},  // LEVEL 2 MESSAGE  2
   {"    JOHNS      PERRY 77' ", PA_LEFT, DEFAULT_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT },        // LEVEL 3 MESSAGE  3
  //{"  JOHNS       PERRY 77' ", PA_LEFT, DEFAULT_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT },        // LEVEL 3 MESSAGE  3
  //
  {"370 QUEEN    STREET  ", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT},  // LEVEL 4 MESSAGE 4
   //
  {"BORAL ELEV      1986  ", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT}, // LEVEL 5 MESSAGE  5
   {"45 LEVESON    STREET ", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT}, // LEVEL 6 MESSAGE  6
   {"BORAL BLD   TECH 2006 ", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT},//LEVEL7 MESSAGE  7
   {" OTIS 1995", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT}, //LEVEL 8 MESSAGE   8
   {" Gimme  20      Johno ! ", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT}, //LEVEL 9 MESSAGE 9
   {"ROSS IS AN    ASSHOLE !", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT}, //LEVEL 11 MESSAGE     10
   {"Test Tower   Cheltenam", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT}, //LEVEL 15 MESSAGE  11
   {"MIPRO-LOG  MIPRO-LOG", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT}, // LEVEL 16 MESSAGE  12
 
   {" THIS LIFT    GOING UP", PA_LEFT,  MESSAGE_2_SCROLL_SPEED, SCROLL_PAUSE, PA_SCROLL_RIGHT , PA_NO_EFFECT},  // Message 13
   {" THIS LIFT    GOING DN", PA_LEFT,  MESSAGE_2_SCROLL_SPEED, SCROLL_PAUSE, PA_SCROLL_RIGHT , PA_NO_EFFECT},  // Message 14
   {"  DONT BE     ALARMED !", PA_LEFT,  MESSAGE_15_SCROLL_SPEED, SCROLL_PAUSE, PA_OPENING , PA_NO_EFFECT},  // Message 15
   {"DONT STOP    ME NOW !  ", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT},  // Message 16
   {"  LIFT ON        MAINT. ", PA_LEFT, DEFAULT_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT},  // Message 17
  // {"JOHNS PERRY LIFTS", PA_LEFT,  MESSAGE_1_SCROLL_SPEED, SCROLL_PAUSE, PA_SCROLL_LEFT, PA_SCROLL_LEFT},  // Message 18
  //{"BORAL ELEVATORS", PA_LEFT, MESSAGE_2_SCROLL_SPEED, SCROLL_PAUSE, PA_SCROLL_LEFT, PA_SCROLL_LEFT },    // Message 2
 // {"  HARDWARE      LANE ", PA_LEFT, DEFAULT_SCROLL_SPEED, SCROLL_PAUSE, PA_PRINT , PA_NO_EFFECT },        // Message 3
  // Add more messages and settings for 4 to 32
  // {"APPRENTICS 1982 - GRANT LEVEY , JOHN O'NEIL, ZELJKO HOVANCEK, VINCE CURCIO, WARREN McKENZIE, GREG ORR, GLEN WRIGHT, RON McDONALD,TERRY PIGEON,NICK JAVNI", PA_PRINT, 20},
  // {"Message 5", PA_SCROLL_LEFT, 60},
  // ...
  // {"Message 32", PA_SCROLL_UP, 40}
};

int bcd_stored = 55;

void setup() {
  Serial.begin(9600);
  myDisplay.begin();
  myDisplay.setTextEffect(PA_SCROLL_LEFT, PA_SCROLL_LEFT); // Default effect and speed
  myDisplay.setIntensity(3); // Adjust the display intensity if needed
  //myDisplay.setCharSpacing(4);

  pinMode(BCD_A, INPUT);
  pinMode(BCD_B, INPUT);
  pinMode(BCD_C, INPUT);
  pinMode(BCD_D, INPUT);
  pinMode(BCD_E, INPUT);
 // pinMode(BCD_F, INPUT);
}

void loop() {
  myDisplay.displayAnimate();
  // Read the BCD state from the input pins
  //int bcd = digitalRead(BCD_F) << 5 |
  int bcd = digitalRead(BCD_E) << 4 |
            digitalRead(BCD_D) << 3 |
            digitalRead(BCD_C) << 2 |
            digitalRead(BCD_B) << 1 |
            digitalRead(BCD_A);

  // Display the message based on the BCD value
  if (bcd_stored != bcd) {
    displayMessage(bcd);
    if (bcd == 2){
      loopingMessage = true;
    } 
    else if(bcd > 0) 
    {
      loopingMessage = false;
    }
  }
  
  if (myDisplay.displayAnimate() && loopingMessage) {
    // The scrolling has finished, restart the scrolling
    Serial.println("bcd: " + String(bcd) + " looping");
    myDisplay.displayReset();
  }

  bcd_stored = bcd;
}

void displayMessage(int bcd) {
  Serial.println("bcd: " + String(bcd));
  myDisplay.displayClear();
  myDisplay.displayReset();
  // Always display message 2
  

  
 if (bcd >= 0 && bcd <= 32) {
  // if (bcd >= 0 && bcd <= 16) {
    myDisplay.displayText(messages[bcd].message, messages[bcd].scrollAlign, messages[bcd].scrollSpeed, messages[bcd].scrollPause, messages[bcd].scrollInEffect, messages[bcd].scrollOutEffect);
  } else {
    myDisplay.displayText(messages[0].message, messages[0].scrollAlign, messages[0].scrollSpeed, messages[0].scrollPause, messages[0].scrollInEffect, messages[0].scrollOutEffect);
  }
  
}