#include <stdio.h>
#include <string.h>
#include <DS1302.h>

/* Set the appropriate digital I/O pin connections */
uint8_t CE_PIN   = 8;
uint8_t IO_PIN   = 9;
uint8_t SCLK_PIN = 10;

/*on configure les connections pour le 74HC595 */
int clockPin = 12;
int dataPin = 11;
int latchPin = 13;

//On configure les conections des transistors
int trPin[4] = {6,14,5,4};
//Pin boutton poussoir reglage heure
const int BouttonH = 18; //reglage heure
const int BouttonM = 19; //reglage minutes
int sBouttonH = 1; //etat du boutton de reglage heure (1 = relache)
int sBouttonM = 1; //etat du bouton de reglage minutes
int prevBouttonH = 1; //etat precedent
int prevBouttonM = 1;
int tmpH = 0;
int tmpM = 0;
int tempo = 5;
int persistence = 1;

/* Creation des buffers */
int Secondes = 0;
int Minutes = 0;
int Heures = 0;


//On créé l'objet RTC
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);


void setup()
{
  rtc.halt(false);
  pinMode(BouttonH, INPUT);
  pinMode(BouttonM, INPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(trPin[0], OUTPUT);
  pinMode(trPin[1], OUTPUT);
  pinMode(trPin[2], OUTPUT);
  pinMode(trPin[3], OUTPUT);
}


void loop()
{
  //On gère le réglage de l'heure
  sBouttonH = digitalRead(BouttonH);
  sBouttonM = digitalRead(BouttonM);
 if(sBouttonH == 0) //Si le boutton heures est appuyé
  {
   if(prevBouttonH == 0)// et s'il etait deja appuyé au cycle d'avant
      {
         //je met à jour les heures
          tmpH = rtc.hour();
          tmpH = tmpH++;
          if(tmpH == 24)
            tmpH = 0;
          rtc.hour(tmpH);
      }
    //sinon, je met a jour prevBoutton 
    prevBouttonH = 0;
    delay(200);
  }  
 if(sBouttonM == 0) //Si le boutton minutes est appuyé
  {
   if(prevBouttonM == 0)// et s'il etait deja appuyé au cycle d'avant
      {
         //je met à jour les minutes
         tmpM = rtc.minutes();
         tmpM = tmpM++;
         if(tmpM == 24)
            tmpM = 0;
         rtc.minutes(tmpM);
      }
    //sinon, je met a jour prevBoutton 
    prevBouttonM = 0;
    delay(200);
  }
  Secondes = rtc.read_register(0);
  Minutes = rtc.read_register(1);
  Heures = rtc.read_register(2);
  
  show_secondes_unite(Secondes);
  show_secondes_dizaine(Secondes);
  show_minutes_unite(Minutes);
  show_minutes_dizaine(Minutes);
  show_heures_unite(Heures);
  show_heures_dizaine(Heures);
  trRAZ();
delay(tempo);
}


////////////////////////////////////////////////
// definition des fonctions
////////////////////////////////////////////////
void trRAZ() // on remet a zero les transistors
{
  digitalWrite(trPin[0], LOW);
  digitalWrite(trPin[1], LOW);
  digitalWrite(trPin[2], LOW);
  digitalWrite(trPin[3], LOW);
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 0);//j'éteind tout
 digitalWrite(latchPin, HIGH);
}

void show_secondes_unite(int secondes)
{
  trRAZ();
 int u_secondes = secondes & 0xF; //et logique 00001111
 digitalWrite(trPin[3], ((u_secondes >> 3 ) & 0x1));
 digitalWrite(trPin[2], ((u_secondes >> 2 ) & 0x1));
 digitalWrite(trPin[1], ((u_secondes >> 1 ) & 0x1));
 digitalWrite(trPin[0], (u_secondes & 0x1));
 digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 2);//j'alume la premiere colone
 digitalWrite(latchPin, HIGH);
 delay(persistence);
}
void show_secondes_dizaine(int secondes)
{
  trRAZ();
 int d_secondes = (secondes >> 4) & 0xF; //et logique 11110000
 digitalWrite(trPin[3], ((d_secondes >> 3 ) & 0x1));
 digitalWrite(trPin[2], ((d_secondes >> 2 ) & 0x1));
 digitalWrite(trPin[1], ((d_secondes >> 1 ) & 0x1));
 digitalWrite(trPin[0], (d_secondes & 0x1));
 digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 1);//j'alume la deuxieme colone
  digitalWrite(latchPin, HIGH);  
 delay(persistence);
}
void show_minutes_unite(int minutes)
{
 trRAZ();
 int u_minutes = minutes & 0xF; //et logique 00001111
 digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 8);//j'alume la troisieme colone
 digitalWrite(latchPin, HIGH);
 digitalWrite(trPin[3], ((u_minutes >> 3 ) & 0x1));
 digitalWrite(trPin[2], ((u_minutes >> 2 ) & 0x1));
 digitalWrite(trPin[1], ((u_minutes >> 1 ) & 0x1));
 digitalWrite(trPin[0], (u_minutes & 0x1));
 delay(persistence);
}
void show_minutes_dizaine(int minutes)
{
  trRAZ();
  int d_minutes = (minutes >> 4) & 0xF; //et logique 11110000
 digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 4);//j'alume la quatrieme colone
  digitalWrite(latchPin, HIGH);  
 digitalWrite(trPin[3], ((d_minutes >> 3 ) & 0x1));
 digitalWrite(trPin[2], ((d_minutes >> 2 ) & 0x1));
 digitalWrite(trPin[1], ((d_minutes >> 1 ) & 0x1));
 digitalWrite(trPin[0], (d_minutes & 0x1));
 delay(persistence);
}
void show_heures_unite(int heures)
{
    trRAZ();
 int u_heures = heures & 0xF; //et logique 00001111
 digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 32);//j'alume la cinquieme colone
 digitalWrite(latchPin, HIGH);
 digitalWrite(trPin[3], ((u_heures >> 3 ) & 0x1));
 digitalWrite(trPin[2], ((u_heures >> 2 ) & 0x1));
 digitalWrite(trPin[1], ((u_heures >> 1 ) & 0x1));
 digitalWrite(trPin[0], (u_heures & 0x1));
 delay(persistence);
}
void show_heures_dizaine(int heures)
{
    trRAZ();
 int d_heures = (heures >> 4) & 0xF; //et logique 11110000
 digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 16);//j'alume la sixieme colone
  digitalWrite(latchPin, HIGH);  
 digitalWrite(trPin[3], ((d_heures >> 3 ) & 0x1));
 digitalWrite(trPin[2], ((d_heures >> 2 ) & 0x1));
 digitalWrite(trPin[1], ((d_heures >> 1 ) & 0x1));
 digitalWrite(trPin[0], (d_heures & 0x1));
 delay(persistence);
}


