OpenChargeMicro/Software/src/main.cpp

271 lines
5.7 KiB
C++
Raw Normal View History

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();
2018-11-26 21:42:12 +01:00
#ifndef DEBUG
2018-11-25 22:04:09 +01:00
_delay_ms(1000);
2018-11-26 21:42:12 +01:00
#endif
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->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-28 15:16:59 +01:00
io->setActiveLED(false);
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++;
2018-11-26 22:04:00 +01:00
if (chargers[indexCount].getStatus().connected) {
2018-11-25 22:04:09 +01:00
#ifdef DEBUG
char c[50];
sprintf(c, "updating: %i\r\n", (int) indexCount);
serialSend(c);
#endif
2018-11-26 22:44:52 +01:00
static struct time_t lastStamp[CHARGER_SIZE];
2018-11-28 15:16:59 +01:00
static unsigned int lastCapacity[CHARGER_SIZE];
static bool fullAlert[CHARGER_SIZE];
2018-11-26 22:44:52 +01:00
if (chargers[indexCount].getStatus().active) {
//charging
2018-11-28 15:16:59 +01:00
lastStamp[indexCount] = clk->getTime(
chargers[indexCount].getStartTime());
lastCapacity[indexCount] =
chargers[indexCount].getCapacity();
fullAlert[indexCount] = false;
ui->gui_print((indexCount + 1), true, lastStamp[indexCount],
2018-11-26 22:44:52 +01:00
chargers[indexCount].getVoltage(),
chargers[indexCount].getCurrent(),
2018-11-28 15:16:59 +01:00
lastCapacity[indexCount]);
2018-11-26 22:44:52 +01:00
io->setWS2812_red();
} else {
//full
ui->gui_print((indexCount + 1), false,
lastStamp[indexCount],
2018-11-28 15:16:59 +01:00
chargers[indexCount].getVoltage(), 0,
lastCapacity[indexCount]);
2018-11-26 22:44:52 +01:00
io->setWS2812_green();
2018-11-28 15:16:59 +01:00
if (fullAlert[indexCount] == false) {
fullAlert[indexCount] = true;
//io->startBuzzer();
}
2018-11-26 22:44:52 +01:00
}
2018-11-25 22:04:09 +01:00
notfound = false;
next = false;
found = true;
}
indexCount = (indexCount + 1) % CHARGER_SIZE;
} //end while
if (notfound && found) {
ui->gui_info();
2018-11-26 22:44:52 +01:00
io->setWS2812_clear();
2018-11-25 22:04:09 +01:00
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-28 15:16:59 +01:00
io->setActiveLED(true);
2018-11-25 22:04:09 +01:00
for (int i = 0; i < CHARGER_SIZE; i++) {
2018-11-26 22:04:00 +01:00
if (chargers[i].getStatus().connected) {
2018-11-25 22:04:09 +01:00
//charger active --> battery pluged on
chargers[i].update();
2018-11-22 23:27:20 +01:00
}
}
2018-11-28 15:16:59 +01:00
io->setActiveLED(false);
2018-11-22 23:27:20 +01:00
}
2018-11-26 21:42:12 +01:00
void checkForBattery() { //TODO
static int activeChargers[CHARGER_SIZE];
static int errorCount[CHARGER_SIZE];
2018-11-25 22:04:09 +01:00
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();
2018-11-26 21:42:12 +01:00
#ifdef DEBUG
//char x[50];
// dtostrf(tmp1, 2, 2, x);
//serialSend(x);
//serialSend("\r\n");
#endif
if ((tmp1 == 0.0)
|| (((tmp1 - tmp2 > difference) || (tmp1 < 3.2)) && i != 0)) {
2018-11-22 21:41:46 +01:00
zero = true;
}
}
if (!zero) {
2018-11-26 22:04:00 +01:00
struct s_charger_status tmp = chargers[l].getStatus();
tmp.connected = true;
chargers[l].setStatus(tmp);
2018-11-25 22:04:09 +01:00
//io->setActiveLED(true);
2018-11-26 21:42:12 +01:00
if (activeChargers[l] == 0) {
2018-11-25 22:04:09 +01:00
chargers[l].setStartTime(clk->getTimeStamp());
2018-11-26 22:44:52 +01:00
struct s_charger_status tmp = chargers[l].getStatus();
tmp.active = true;
chargers[l].setStatus(tmp);
2018-11-26 21:42:12 +01:00
#ifdef DEBUG
serialSend("allowed\r\n");
#endif
2018-11-25 22:04:09 +01:00
}
2018-11-26 21:42:12 +01:00
activeChargers[l] = 1;
errorCount[l] = CONNECTION_TIMEOUT;
2018-11-22 21:41:46 +01:00
} else {
2018-11-25 22:04:09 +01:00
//io->setActiveLED(false);
2018-11-26 21:42:12 +01:00
errorCount[l]--;
#ifdef DEBUG
serialSend("no connection\r\n");
#endif
if (errorCount[l] == 0) {
2018-11-26 22:04:00 +01:00
struct s_charger_status tmp = chargers[l].getStatus();
2018-11-26 22:44:52 +01:00
tmp.connected = false;
chargers[l].setStatus(tmp);
2018-11-26 21:42:12 +01:00
activeChargers[l] = 0;
chargers[l].reset(); //sets the capacity to zero
#ifdef DEBUG
serialSend("blocked\r\n");
#endif
}
2018-11-25 22:04:09 +01:00
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-26 22:04:00 +01:00
if (chargers[i].getStatus().connected) {
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-28 15:16:59 +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