/*************************************************** 
  Written By Dawson Reprogle and Ava Romero for Purdue ECET38001 Team 15

  Description: Program runs clapper board code to display time and frames to 
  the 2 7-Segment Displays.
 ****************************************************/

#include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc.
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"

const int buttonPin = 3;     // the number of the pushbutton pin
volatile uint8_t is_running = 0; //keep track of status

Adafruit_7segment matrix1 = Adafruit_7segment(); //create matrix 1 object
Adafruit_7segment matrix2 = Adafruit_7segment(); //create matrix 2 object
uint8_t dis_hours = 0; //initialize hours
uint8_t dis_minutes = 0; //initialize minutes
uint8_t dis_seconds = 0; //initialize seconds
uint8_t dis_frames = 0; //initialize frames
uint8_t rate_frames = 24; //initialize frame rate


void buttonlow()
{
  if(is_running == 0) //if it's not running, start
  {
    is_running = 1;
  }
  else
  {
    is_running = 0; //don't start
  }
}

void setup() {
  attachInterrupt(digitalPinToInterrupt(buttonPin), buttonlow, CHANGE); //initialize interrupt
#ifndef __AVR_ATtiny85__
  Serial.begin(9600); //begin serial command
#endif
  matrix1.begin(0x70); //initialize matrix 1
  matrix2.begin(0x71); //initialize matrix 2
}

void loop() {
  matrix1.writeDigitRaw(2, 0x04 | 0x08); // turns on leftmost colons
  boolean drawDots = true; //sets to 1
  matrix2.drawColon(drawDots); //turns on matrix 2 dots
  //dis_frames = (dis_seconds * 100) / rate_frames; //determines frames for 24 frames/sec
  //setting digits to zero
  matrix1.writeDigitNum(3, (dis_frames / 10) % 10, drawDots); 
  matrix1.writeDigitNum(4, dis_frames % 10, drawDots);
  
  matrix1.writeDigitNum(0, (dis_seconds / 10) % 10, drawDots);
  matrix1.writeDigitNum(1, dis_seconds % 10, drawDots);
  //display matrix 1 digits
  matrix1.writeDisplay();

  matrix2.writeDigitNum(3, (dis_minutes / 10) % 10, drawDots);
  matrix2.writeDigitNum(4, dis_minutes % 10, drawDots);

  matrix2.writeDigitNum(0, (dis_hours / 10) % 10, drawDots);
  matrix2.writeDigitNum(1, dis_hours % 10, drawDots);
  //display matrix 2 digits
  matrix2.writeDisplay();
 
 while(true)
  {
 while(is_running == 1) //pause
    {
    }
    if(dis_frames < 23) //frame count
    {
            dis_frames++;
    }
    else
    {
      dis_frames = 0;
      if(dis_seconds < 59) //seconds count
      {
        dis_seconds++;
      }
      else
      {
        dis_seconds = 0;
        if(dis_minutes < 59) //minutes count
        {
          dis_minutes++;
        }
        else
        {
         dis_minutes = 0;
         if(dis_hours < 99) //hours count
         {
          dis_hours++;
         }
         else
         {
          dis_hours = 0;
         }
        }
      }
    } 
   
    //display new times values to appropriate digits       
    matrix1.writeDigitNum(3, (dis_frames / 10) % 10, drawDots);
    matrix1.writeDigitNum(4, dis_frames % 10, drawDots);
    
    matrix1.writeDigitNum(0, (dis_seconds / 10) % 10, drawDots);
    matrix1.writeDigitNum(1, dis_seconds % 10, drawDots);
    matrix1.writeDisplay();

    matrix2.writeDigitNum(3, (dis_minutes / 10) % 10, drawDots);
    matrix2.writeDigitNum(4, dis_minutes % 10, drawDots);

    matrix2.writeDigitNum(0, (dis_hours / 10) % 10, drawDots);
    matrix2.writeDigitNum(1, dis_hours % 10, drawDots);
    matrix2.writeDisplay();
    //delay 1/24th of a second for 24 fps
    delay(41);
    delayMicroseconds(667); 
    }  //if end

}//main loop ending
