169 lines
3.3 KiB
C++
169 lines
3.3 KiB
C++
#include "openChargeMicro.h"
|
|
|
|
charger* chargers;
|
|
clock* clk;
|
|
|
|
void createChargers();
|
|
void printStatus();
|
|
void checkForBattery();
|
|
void updateChargers();
|
|
bool everySec();
|
|
|
|
int main(void) {
|
|
|
|
serialSetup();
|
|
serialSend("Hello World - ");
|
|
serialSend(__DATE__ __TIME__);
|
|
serialSend("\r\n");
|
|
|
|
chargers = (charger *) malloc(CHARGER_SIZE * sizeof(charger));
|
|
|
|
clk = (clock *) malloc(sizeof(clock));
|
|
clock tmp;
|
|
clk = &tmp;
|
|
|
|
ioController io;
|
|
oled_ssd1306 disp;
|
|
|
|
io.setBuzzer(false);
|
|
io.deactivateChargers();
|
|
io.setActiveLED(true);
|
|
io.activateChargers();
|
|
|
|
createChargers();
|
|
|
|
disp.oled_init();
|
|
disp.oled_gotoxy(0, 0);
|
|
disp.oled_write("Hallo Welt!");
|
|
|
|
io.setWS2812(0, 255, 255);
|
|
|
|
//loop till power off
|
|
while (true) {
|
|
checkForBattery();
|
|
printStatus();
|
|
updateChargers();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
bool everySec() {
|
|
|
|
static uint32_t time;
|
|
if (clk->getTime() != time) {
|
|
time = clk->getTime();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void updateChargers() {
|
|
|
|
if (everySec()) { //updates the chargers every sec
|
|
for (int i = 0; i < CHARGER_SIZE; i++) {
|
|
if (chargers[i].getStatus()) {
|
|
//charger active --> battery pluged on
|
|
chargers[i].update();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void checkForBattery() {
|
|
for (int l = 0; l < CHARGER_SIZE; l++) {
|
|
|
|
bool zero = false;
|
|
double tmp1 = 0.0;
|
|
double tmp2 = 0.0;
|
|
double difference = 0.1;
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
tmp2 = tmp1;
|
|
tmp1 = chargers[l].getVoltage();
|
|
|
|
if ((tmp1 == 0.0) || (((tmp1 - tmp2 > difference)) && i != 0)) {
|
|
zero = true;
|
|
}
|
|
}
|
|
|
|
if (!zero) {
|
|
/*
|
|
char charVal[10];
|
|
dtostrf(chargers[0].getVoltage(), 4, 2, charVal);
|
|
serialSend("Charger01 - ");
|
|
serialSend(charVal);
|
|
serialSend(" Volt\r\n");
|
|
*/
|
|
chargers[l].setStatus(true);
|
|
} else {
|
|
//serialSend("blocked\r\n");
|
|
chargers[l].setStatus(false);
|
|
chargers[l].reset();
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void createChargers() {
|
|
s_charger charger_settings;
|
|
|
|
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;
|
|
}
|
|
|
|
void printStatus() {
|
|
//serialSend("printing status .. \r\n");
|
|
for (int i = 0; i < CHARGER_SIZE; i++) {
|
|
if (chargers[i].getStatus()) {
|
|
//chargers[i].getInfo(); //print values
|
|
//char charVal[10];
|
|
//dtostrf(chargers[i].getCurrent(), 4, 0, charVal);
|
|
//sprintf(charVal, "%i µAh\r\n", chargers[i].getCapacity());
|
|
//serialSend(charVal);
|
|
//serialSend(" mA\r\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); //8 bit data format
|
|
}
|
|
|
|
void serialSend(const char* sendString) {
|
|
for (unsigned int i = 0; i < strlen(sendString); i++) {
|
|
while (( UCSR0A & (1 << UDRE0)) == 0) {
|
|
};
|
|
UDR0 = sendString[i];
|
|
}
|
|
}
|
|
|