2018-11-22 11:50:11 +01:00
/*
* clock . cpp
*
* Created on : 22.11 .2018
* Author : Hendrik Schutter
*/
# include "openChargeMicro.h"
2018-11-25 22:19:42 +01:00
unsigned long int systemTime ; // 0 to 4294967295 sec
2018-11-22 11:50:11 +01:00
2018-11-22 14:17:39 +01:00
/* Only call once */
2018-11-22 11:50:11 +01:00
clock : : clock ( ) {
2018-11-22 14:17:39 +01:00
//TODO Singleton
2018-11-22 11:50:11 +01:00
systemTime = 0 ;
clock_init ( ) ;
2018-11-25 22:04:09 +01:00
# ifdef DEBUG
2018-11-22 11:50:11 +01:00
serialSend ( " init clock \r \n " ) ;
2018-11-25 22:04:09 +01:00
# endif
2018-11-22 11:50:11 +01:00
}
clock : : ~ clock ( ) {
}
void clock : : clock_init ( ) {
OCR1A = 0x3D08 ; // --> 1 sec
2018-11-25 22:04:09 +01:00
//OCR1A = 0x7A11; // --> 2 sec
2018-11-22 11:50:11 +01:00
TCCR1B | = ( 1 < < WGM12 ) ;
// Mode 4, CTC on OCR1A
TIMSK1 | = ( 1 < < OCIE1A ) ;
//Set interrupt on compare match
TCCR1B | = ( 1 < < CS12 ) | ( 1 < < CS10 ) ;
// set prescaler to 1024 and start the timer
2018-11-25 22:19:42 +01:00
sei ( ) ;
//enable interrupts
2018-11-22 11:50:11 +01:00
}
2018-11-22 14:17:39 +01:00
/* get seconds since boot*/
2018-11-25 22:19:42 +01:00
unsigned long int clock : : getTime ( ) {
2018-11-22 11:50:11 +01:00
return systemTime ;
}
2018-11-22 14:17:39 +01:00
/* get time struct since time stamp */
2018-11-22 11:50:11 +01:00
struct time_t clock : : getTime ( struct time_t pTime ) {
struct time_t ret ;
2018-11-22 14:17:39 +01:00
ret . seconds = ( getTime ( ) - pTime . seconds ) ;
ret . diffSecond = ret . seconds ;
ret . diffMinute = 0 ;
ret . diffHour = 0 ;
while ( ret . diffSecond > 59 ) {
ret . diffSecond = ret . diffSecond - 60 ;
ret . diffMinute + + ;
}
while ( ret . diffMinute > 59 ) {
ret . diffMinute = ret . diffMinute - 60 ;
ret . diffHour + + ;
}
return ret ;
}
/* get time struct as time stamp */
struct time_t clock : : getTimeStamp ( ) {
struct time_t ret ;
ret . seconds = getTime ( ) ;
2018-11-22 11:50:11 +01:00
ret . diffSecond = ret . seconds ;
ret . diffMinute = 0 ;
ret . diffHour = 0 ;
while ( ret . diffSecond > 59 ) {
2018-11-25 22:19:42 +01:00
ret . diffSecond = ret . diffSecond - 60 ;
2018-11-22 11:50:11 +01:00
ret . diffMinute + + ;
}
while ( ret . diffMinute > 59 ) {
2018-11-25 22:04:09 +01:00
ret . diffMinute = ret . diffMinute - 60 ;
2018-11-22 11:50:11 +01:00
ret . diffHour + + ;
}
return ret ;
}
ISR ( TIMER1_COMPA_vect ) {
// action to be done every 1 sec
2018-11-22 14:17:39 +01:00
systemTime + + ; //increase system time
2018-11-25 16:58:13 +01:00
updateChargers ( ) ;
2018-11-22 11:50:11 +01:00
}
2018-11-26 21:42:12 +01:00
2018-11-28 15:16:59 +01:00
2018-11-26 21:42:12 +01:00
ISR ( __vector_default ) {
}
2018-11-28 15:16:59 +01:00
2018-11-26 21:42:12 +01:00