#include "mbed.h”

#include "Servo.h"




//initailizing Digital In pins (3) for setting the time. If pin 30 is high at startup (reset) then check hour and minute pin (29,28) and update time.

DigitalIn SetPin(p30);

DigitalIn SetHour(p29);

DigitalIn SetMinute(p28);


//For chime servo

Servo chimeServo(p21);

int index = 0;

int switchdirection = 0;



//initializing integer "stack" for seconds minutes etc.

BusOut ArrayStack(p10,p11,p12,p13,p14,p15,p16, NC, NC, NC, NC, NC, NC, NC, NC, NC);



//initializing multiplex scheme pins


DigitalOut HourRow(p5);

DigitalOut MinuteRow(p6);

DigitalOut SecondRow(p7);

DigitalOut DayRow(p8);

DigitalOut MonthRow(p9);



const float lag = .004; //.004 is natural lag



//time function variables

Ticker timer;


//On-board debug LEDs

DigitalOut led1(LED1);

DigitalOut led2(LED2);

DigitalOut led3(LED3);

DigitalOut led4(LED4);




//Human time variables

int seconds = 50;

int minutes = 58;

int hours = 7;

int days = 2;

int months = 11;

         


//Human time function

void attime() {

    if (seconds >= 59) {

        seconds = 0;

        minutes = minutes + 1;

    }



    seconds = seconds + 1;


    if (minutes >= 59) {

        minutes = 0;

        hours = hours +1;

       

       

     if(switchdirection == 1){

    

        for(index = 0 ; index < 50 ; index++){

            chimeServo = index/100.0;

            wait (0.01);

            }

            switchdirection = 0;

     }  

    

     else if(switchdirection == 0){

        

        for(index = 100 ; index > 50 ; index--){

            chimeServo = index/100.0;

            wait(0.01);

            }

            switchdirection = 1;

     }

              

               

               

                

 

     

    }


    if (hours >= 23) {

        hours = 0;

        days = days + 1;

       


    }

   

    if (days >=31) {

        days = 1;

        months = months + 1;

       

    }

   

    if (months >= 13) {

        months = 1;

    }

   

    if(SetPin != 0) {

        led1 = 1;

        while(SetPin != 0) {

            if(SetHour != 0) {

                hours = hours + 1;

                led2 = 1;

                wait(.25);

                led2 = 0;

             }

        

            

            if(SetMinute != 0) {

                minutes = minutes + 1;

                led3 = 1;

                wait(.25);

                led3 = 0;

             }

            

        }

        led1 = 0;

    }

  

    if(SetMinute != 0) {

        while(SetMinute != 0) {

           months = months + 1;

           led4 = 1;

           wait(.3);

           led4 = 0;

        }

    }

   


    if(SetHour != 0) {

        while(SetHour != 0) {

            days = days + 1;

            led4 = 1;

            wait(.3);

            led4 = 0;

         }

    }



}


int main() {

    timer.attach(&attime, 1);


    while (1) {

       // led1 = !led1;


        HourRow = 1;

        ArrayStack = hours;

        wait(lag);

        HourRow = 0;


        MinuteRow = 1;

        ArrayStack = minutes;

        wait(lag);

        MinuteRow = 0;


        SecondRow = 1;

        ArrayStack = seconds;

        wait(lag);

        SecondRow = 0;


        DayRow = 1;

        ArrayStack = days;

        wait(lag);

        DayRow = 0;

       

        MonthRow = 1;

        ArrayStack = months;

        wait(lag);

        MonthRow = 0;


     


    }

}