
// C++ code
//File: Binary Clock
//History:
//    Eileen Xiao 2/21/23
//    Joel Mariscal 2/21/23
//      https://forum.arduino.cc/t/decimal-to-binary-conversion-with-led/964644/6
//Final
int Binary_H[4] = {0, 0, 0, 0};
int BinaryList_H[4][13]; //List with all of the binary numbers
int decNumber_H;

int Binary_M[6] = {0, 0, 0, 0, 0, 0};
int BinaryList_M[6][60]; //List with all of the binary numbers
int decNumber_M;

bool isAm= true;

void setup()
{
  Serial.begin(9600);
  for(int x=2; x<14; x++)
    
 {
    pinMode (x, OUTPUT);
    digitalWrite(x, LOW);
    
  }
 
  //binary numbers for refernece
  for(int decCount=0;decCount<60;decCount++)
  {
    decNumber_M=decCount;
    if (decCount<13)
      decNumber_H=decCount;
    
    decToBinary(decNumber_H, decNumber_M);
    Serial.println ("");
    Serial.print ("Decimal: ");
    Serial.println (decCount);
    Serial.print ("Double: ");
    
    
    for(int y=0; y<6; y++) 
    {
      BinaryList_M[y][decCount]=Binary_M[y];
      Serial.print(BinaryList_M[y][decCount]);
      if (y<=3 && decCount<13)
      {
        BinaryList_H[y][decCount]=Binary_H[y];
        Serial.print(BinaryList_H[y][decCount]);
      }               
    }
   Serial.println("");
   Serial.print("-------");
  }
}  
                                          
void loop()
{
  Serial.print("Start Loop");
  //check all LED functional
  for (int blinks=0;blinks<4;blinks++)
  {
    
    Serial.print("All on");
    //all on
    for(int i=2; i<14; i++)
    {
      delay(50);
      digitalWrite(i, HIGH);
    }
    Serial.print("All off");
    delay(50);
    //all off
    for(int i=2; i<14; i++)
    {
      digitalWrite(i, LOW);
      
    }
  }
  delay(1000);
  
  digitalWrite(7, HIGH);
  
  //clock starts @ 12am
  digitalWrite(5, HIGH);
  digitalWrite(4, HIGH);
  
  int b_hours=0;
  int y_hours=0;
  
  for (int B=0; B<60;B++)
  {
   
    for (int y=0; y<6;y++)
    {
 
      Serial.print(BinaryList_M[y][B]);
      if (BinaryList_M[y][B]==1)
      {
        digitalWrite(y+8, HIGH);
      }
      else
      {
        digitalWrite(y+8, LOW);
      }
    
      
      //hours
      
    }
    Serial.println("");
    delay(60000);//one minute  60000, use 500 for testing
    Serial.println("loop ends/we updated");
    if(B+1==60)
    {
      updateHours(++b_hours);
      B=0;
    }
      
  }
  
}


void updateHours(int & b)
{
  if(b>12)
  {
    b=1;
    isAm= ! isAm;
    if(isAm)
    {
      digitalWrite(7, LOW);
      digitalWrite(6, HIGH);
    }
    else
    {
      digitalWrite(7, HIGH);
      digitalWrite(6, LOW);
    }
    
  }
  for(int i=2; i<6; i++) digitalWrite(i, LOW);
  switch(b)
  {
    case 1:
      digitalWrite(2, HIGH);
      break;
    
    case 2:
      digitalWrite(3, HIGH);
      break;
    case 3:
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      break;
    case 4:
      digitalWrite(4, HIGH);
      break;
    case 5:
      digitalWrite(4, HIGH);
      digitalWrite(2, HIGH);
      break;
    case 6:
      digitalWrite(4, HIGH);
      digitalWrite(3, HIGH);
      break;
    case 7:
      digitalWrite(4, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      break;
    case 8:
      digitalWrite(5, HIGH);
      break;
    case 9:
      digitalWrite(5, HIGH);
      digitalWrite(2, HIGH);
      break;
    case 10:
      digitalWrite(5, HIGH);
      digitalWrite(3, HIGH);
      break;
    case 11:
      digitalWrite(5, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      break;
    case 12:
      digitalWrite(5, HIGH);
      digitalWrite(4, HIGH);
      break;

    
  }
  
         
}

void decToBinary(int& decNum_H, int& decNum_M)
{
  int remainder_H, remainder_M;
  for(int i=5; i>=0; i--)
  {
    remainder_M= decNum_M%2;
    decNum_M= decNum_M/2;
    Binary_M[i]=remainder_M;
    if(i<=3)
    {
      remainder_H=decNum_H%2;
      decNum_H= decNum_H/2;
      Binary_H[i]= remainder_H;
    }
      
  }
  
}
