2018-11-21 23:17:31 +01:00
# include "openChargeMicro.h"
2018-11-22 20:43:21 +01:00
charger * chargers ;
2018-11-22 23:27:20 +01:00
clock * clk ;
2018-11-25 22:04:09 +01:00
gui * ui ;
ioController * io ;
2018-11-22 20:43:21 +01:00
void createChargers ( ) ;
void printStatus ( ) ;
2018-11-25 16:58:13 +01:00
2018-11-22 23:27:20 +01:00
bool everySec ( ) ;
2018-11-22 11:50:11 +01:00
2018-11-25 22:04:09 +01:00
int indexCount = 0 ;
2018-11-25 16:58:13 +01:00
2018-11-21 23:17:31 +01:00
int main ( void ) {
2018-11-25 22:04:09 +01:00
# ifdef DEBUG
2018-11-21 23:17:31 +01:00
serialSetup ( ) ;
2018-11-22 21:41:46 +01:00
serialSend ( " Hello World - " ) ;
serialSend ( __DATE__ __TIME__ ) ;
serialSend ( " \r \n " ) ;
2018-11-25 22:04:09 +01:00
# endif
ui = ( gui * ) malloc ( sizeof ( gui ) ) ;
ui - > gui_init ( ) ;
_delay_ms ( 1000 ) ;
2018-11-25 22:19:42 +01:00
ui - > gui_info ( ) ;
2018-11-25 22:04:09 +01:00
io = ( ioController * ) malloc ( sizeof ( ioController ) ) ;
io - > setBuzzer ( false ) ;
io - > deactivateChargers ( ) ;
io - > setActiveLED ( true ) ;
io - > activateChargers ( ) ;
2018-11-21 23:17:31 +01:00
2018-11-22 21:41:46 +01:00
chargers = ( charger * ) malloc ( CHARGER_SIZE * sizeof ( charger ) ) ;
2018-11-22 23:27:20 +01:00
clk = ( clock * ) malloc ( sizeof ( clock ) ) ;
clock tmp ;
clk = & tmp ;
2018-11-25 16:58:13 +01:00
createChargers ( ) ;
2018-11-24 15:27:14 +01:00
2018-11-25 22:04:09 +01:00
//io.setWS2812(0, 255, 255);
2018-11-24 15:27:14 +01:00
2018-11-22 21:41:46 +01:00
//loop till power off
while ( true ) {
2018-11-25 16:58:13 +01:00
updateGUI ( ) ;
2018-11-25 22:04:09 +01:00
checkForBattery ( ) ;
2018-11-22 21:41:46 +01:00
}
2018-11-22 14:17:39 +01:00
2018-11-22 21:41:46 +01:00
return 0 ;
}
2018-11-22 14:17:39 +01:00
2018-11-25 16:58:13 +01:00
void updateGUI ( ) {
2018-11-25 22:04:09 +01:00
if ( everySec ( ) ) { //updates the ui every sec
bool next = true ;
bool notfound = true ;
static bool found = true ;
int loops = 0 ;
//finds one or more active charges or aborts after CHARGER_SIZE
while ( next & & ( loops < CHARGER_SIZE ) ) {
loops + + ;
if ( chargers [ indexCount ] . getStatus ( ) ) {
# ifdef DEBUG
char c [ 50 ] ;
sprintf ( c , " updating: %i \r \n " , ( int ) indexCount ) ;
serialSend ( c ) ;
# endif
ui - > gui_print ( ( indexCount + 1 ) , true ,
clk - > getTime ( chargers [ indexCount ] . getStartTime ( ) ) ,
chargers [ indexCount ] . getVoltage ( ) ,
chargers [ indexCount ] . getCurrent ( ) ,
chargers [ indexCount ] . getCapacity ( ) ) ;
notfound = false ;
next = false ;
found = true ;
}
indexCount = ( indexCount + 1 ) % CHARGER_SIZE ;
} //end while
if ( notfound & & found ) {
ui - > gui_info ( ) ;
found = false ;
}
} //end everySec
2018-11-25 16:58:13 +01:00
}
2018-11-22 23:27:20 +01:00
bool everySec ( ) {
static uint32_t time ;
if ( clk - > getTime ( ) ! = time ) {
time = clk - > getTime ( ) ;
return true ;
}
return false ;
}
void updateChargers ( ) {
2018-11-25 22:04:09 +01:00
for ( int i = 0 ; i < CHARGER_SIZE ; i + + ) {
if ( chargers [ i ] . getStatus ( ) ) {
//charger active --> battery pluged on
chargers [ i ] . update ( ) ;
2018-11-22 23:27:20 +01:00
}
}
}
2018-11-22 21:41:46 +01:00
void checkForBattery ( ) {
2018-11-25 22:04:09 +01:00
bool activeChargers [ CHARGER_SIZE ] ;
2018-11-22 21:41:46 +01:00
for ( int l = 0 ; l < CHARGER_SIZE ; l + + ) {
bool zero = false ;
double tmp1 = 0.0 ;
double tmp2 = 0.0 ;
2018-11-23 13:03:13 +01:00
double difference = 0.1 ;
2018-11-22 14:17:39 +01:00
2018-11-23 13:03:13 +01:00
for ( int i = 0 ; i < 8 ; i + + ) {
2018-11-22 21:41:46 +01:00
tmp2 = tmp1 ;
tmp1 = chargers [ l ] . getVoltage ( ) ;
if ( ( tmp1 = = 0.0 ) | | ( ( ( tmp1 - tmp2 > difference ) ) & & i ! = 0 ) ) {
zero = true ;
}
}
if ( ! zero ) {
chargers [ l ] . setStatus ( true ) ;
2018-11-25 22:04:09 +01:00
//io->setActiveLED(true);
if ( ! activeChargers [ l ] ) {
chargers [ l ] . setStartTime ( clk - > getTimeStamp ( ) ) ;
}
activeChargers [ l ] = true ;
2018-11-22 21:41:46 +01:00
} else {
2018-11-25 22:04:09 +01:00
//io->setActiveLED(false);
2018-11-22 21:41:46 +01:00
chargers [ l ] . setStatus ( false ) ;
2018-11-22 23:27:20 +01:00
chargers [ l ] . reset ( ) ;
2018-11-25 22:04:09 +01:00
activeChargers [ l ] = false ;
2018-11-22 21:41:46 +01:00
}
}
2018-11-22 11:50:11 +01:00
}
2018-11-21 23:45:26 +01:00
2018-11-22 20:43:21 +01:00
void createChargers ( ) {
2018-11-21 23:17:31 +01:00
s_charger charger_settings ;
2018-11-22 20:43:21 +01:00
charger_settings . chU = CH0_U ;
charger_settings . chI = CH0_I ;
charger_settings . nr = CH0_NR ;
charger chrg0 = charger ( charger_settings ) ;
chargers [ 0 ] = chrg0 ;
charger_settings . chU = CH1_U ;
charger_settings . chI = CH1_I ;
charger_settings . nr = CH1_NR ;
charger chrg1 = charger ( charger_settings ) ;
chargers [ 1 ] = chrg1 ;
charger_settings . chU = CH2_U ;
charger_settings . chI = CH2_I ;
charger_settings . nr = CH2_NR ;
charger chrg2 = charger ( charger_settings ) ;
chargers [ 2 ] = chrg2 ;
charger_settings . chU = CH3_U ;
charger_settings . chI = CH3_I ;
charger_settings . nr = CH3_NR ;
charger chrg3 = charger ( charger_settings ) ;
chargers [ 3 ] = chrg3 ;
}
2018-11-21 23:17:31 +01:00
2018-11-22 20:43:21 +01:00
void printStatus ( ) {
2018-11-22 21:41:46 +01:00
//serialSend("printing status .. \r\n");
2018-11-22 20:43:21 +01:00
for ( int i = 0 ; i < CHARGER_SIZE ; i + + ) {
2018-11-22 21:41:46 +01:00
if ( chargers [ i ] . getStatus ( ) ) {
2018-11-25 16:58:13 +01:00
chargers [ i ] . getInfo ( ) ; //print values
2018-11-24 14:55:51 +01:00
//char charVal[10];
2018-11-23 21:23:40 +01:00
//dtostrf(chargers[i].getCurrent(), 4, 0, charVal);
2018-11-24 14:55:51 +01:00
//sprintf(charVal, "%i µAh\r\n", chargers[i].getCapacity());
//serialSend(charVal);
2018-11-23 21:23:40 +01:00
//serialSend(" mA\r\n");
2018-11-22 20:43:21 +01:00
}
2018-11-21 23:17:31 +01:00
}
}
2018-11-25 22:04:09 +01:00
# ifdef DEBUG
2018-11-21 23:17:31 +01:00
void serialSetup ( void ) {
//Register settings
//High and low bits
UBRR0H = ( BUAD_RATE_CALC > > 8 ) ;
UBRR0L = BUAD_RATE_CALC ;
//transimit and recieve enable
UCSR0B = ( 1 < < TXEN0 ) | ( 1 < < TXCIE0 ) | ( 1 < < RXEN0 ) | ( 1 < < RXCIE0 ) ;
2018-11-25 22:04:09 +01:00
UCSR0C = ( 1 < < UCSZ01 ) | ( 1 < < UCSZ00 ) ; //8 bit data format
2018-11-21 23:17:31 +01:00
}
void serialSend ( const char * sendString ) {
for ( unsigned int i = 0 ; i < strlen ( sendString ) ; i + + ) {
while ( ( UCSR0A & ( 1 < < UDRE0 ) ) = = 0 ) {
} ;
UDR0 = sendString [ i ] ;
}
}
2018-11-25 22:04:09 +01:00
# endif