From 6c3d5a7184893de77edc4bef229a89d23a6ead46 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 25 Nov 2018 22:04:09 +0100 Subject: [PATCH] updateChargers via Timer IS --- Software/src/charger.cpp | 3 + Software/src/clock.cpp | 23 +++++-- Software/src/clock.h | 8 +-- Software/src/gui.cpp | 30 +++++++++- Software/src/gui.h | 4 ++ Software/src/main.cpp | 106 ++++++++++++++++++++++++--------- Software/src/openChargeMicro.h | 15 +++-- 7 files changed, 147 insertions(+), 42 deletions(-) diff --git a/Software/src/charger.cpp b/Software/src/charger.cpp index 11a003d..6842b93 100644 --- a/Software/src/charger.cpp +++ b/Software/src/charger.cpp @@ -28,6 +28,7 @@ int charger::getCurrent() { double charger::getVoltage() { mux.setChannel(charger_settings.chU); int tmp = (int) io.readAdc(0); + if(tmp == 0) return 0; double ret = ((double) tmp) * 0.00615; return ret; } @@ -45,10 +46,12 @@ struct time_t charger::getStartTime() { } void charger::getInfo() { +#ifdef DEBUG char buffer[50]; sprintf(buffer, "Nr: %i - Uch %i - Ich %i\r\n", charger_settings.nr, charger_settings.chU, charger_settings.chI); serialSend(buffer); +#endif } void charger::setStatus(bool pBool) { active = pBool; diff --git a/Software/src/clock.cpp b/Software/src/clock.cpp index 163e434..9cbe49e 100644 --- a/Software/src/clock.cpp +++ b/Software/src/clock.cpp @@ -7,14 +7,16 @@ #include "openChargeMicro.h" -uint32_t systemTime; // 0 to 4294967295 sec +unsigned long int systemTime; // 0 to 4294967295 sec /* Only call once */ clock::clock() { //TODO Singleton systemTime = 0; clock_init(); +#ifdef DEBUG serialSend("init clock\r\n"); +#endif } clock::~clock() { @@ -23,6 +25,11 @@ clock::~clock() { void clock::clock_init() { OCR1A = 0x3D08; // --> 1 sec + + //OCR1A = 0x7A11; // --> 2 sec + + + TCCR1B |= (1 << WGM12); // Mode 4, CTC on OCR1A TIMSK1 |= (1 << OCIE1A); @@ -32,7 +39,7 @@ void clock::clock_init() { sei(); //enable interrupts } /* get seconds since boot*/ -uint32_t clock::getTime() { +unsigned long int clock::getTime() { return systemTime; } @@ -69,12 +76,12 @@ struct time_t clock::getTimeStamp() { ret.diffHour = 0; while (ret.diffSecond > 59) { - ret.diffSecond = -60; + ret.diffSecond = ret.diffSecond - 60; ret.diffMinute++; } while (ret.diffMinute > 59) { - ret.diffMinute = -60; + ret.diffMinute = ret.diffMinute - 60; ret.diffHour++; } @@ -85,9 +92,15 @@ ISR (TIMER1_COMPA_vect) { // action to be done every 1 sec systemTime++; //increase system time + + + updateChargers(); -} + +} +/* ISR(__vector_default) { } +*/ diff --git a/Software/src/clock.h b/Software/src/clock.h index e251a4e..1871bee 100644 --- a/Software/src/clock.h +++ b/Software/src/clock.h @@ -9,9 +9,9 @@ #define SRC_CLOCK_H_ struct time_t { - unsigned long int diffHour; - unsigned long int diffMinute; - unsigned long int diffSecond; + int diffHour; + int diffMinute; + int diffSecond; unsigned long int seconds; }; @@ -23,7 +23,7 @@ private: public: clock(); ~clock(); - uint32_t getTime(); //time in sec since boot + unsigned long int getTime(); //time in sec since boot struct time_t getTime(struct time_t pTime); //time in sec since time stamp struct time_t getTimeStamp(); // returns a timestamp diff --git a/Software/src/gui.cpp b/Software/src/gui.cpp index 43bc913..29e7bd3 100644 --- a/Software/src/gui.cpp +++ b/Software/src/gui.cpp @@ -9,12 +9,30 @@ gui::gui() { - oled.oled_init(); + } gui::~gui() { } +void gui::gui_init(){ + oled.oled_init(); +} + + +void gui::gui_info(){ + + oled.oled_clear_screen(); + oled.oled_clear_screen(); + oled.oled_gotoxy(0,0); + oled.oled_write("OpenChargeMicro"); + oled.oled_gotoxy(0,2); + oled.oled_write("HW: 0.1 SW: dev"); + oled.oled_gotoxy(0,6); + oled.oled_write("Akkus einstecken"); + +} + void gui::gui_print(int pNr, bool pStatus, struct time_t pTime, double pVoltage, int pCurrent, unsigned long int pCapacity) { @@ -39,7 +57,9 @@ void gui::gui_print(int pNr, bool pStatus, struct time_t pTime, double pVoltage, /* time */ oled.oled_gotoxy(0, 2); - sprintf(buffer, "----%02d:%02d:%02d----", (int) pTime.diffHour, (int) pTime.diffMinute, (int) pTime.diffSecond); + sprintf(buffer, "----%02d:%02d:%02d----", pTime.diffHour, pTime.diffMinute, pTime.diffSecond); + + //sprintf(buffer, "%lu", pTime); oled.oled_write_str(buffer); @@ -71,3 +91,9 @@ void gui::gui_print(int pNr, bool pStatus, struct time_t pTime, double pVoltage, oled.oled_write_str(buffer); } + +void gui::gui_write(char* str){ + oled.oled_clear_screen(); + oled.oled_gotoxy(0,0); + oled.oled_write_str(str); +} diff --git a/Software/src/gui.h b/Software/src/gui.h index 34aa9f0..644ed5b 100644 --- a/Software/src/gui.h +++ b/Software/src/gui.h @@ -19,7 +19,11 @@ private: public: gui(); ~gui(); + void gui_init(); void gui_print(int pNr, bool pStatus, struct time_t pTime, double pVoltage, int pCurrent, unsigned long int pCapacity); + void gui_write(char* str); + void gui_info(); + }; diff --git a/Software/src/main.cpp b/Software/src/main.cpp index 99ebf98..8ef15f9 100644 --- a/Software/src/main.cpp +++ b/Software/src/main.cpp @@ -2,22 +2,38 @@ charger* chargers; clock* clk; +gui* ui; +ioController* io; void createChargers(); void printStatus(); -void checkForBattery(); -void updateGUI(); bool everySec(); -unsigned short int indexCount = 0; +int indexCount = 0; int main(void) { - +#ifdef DEBUG serialSetup(); serialSend("Hello World - "); serialSend(__DATE__ __TIME__); serialSend("\r\n"); +#endif + + ui = (gui*) malloc(sizeof(gui)); + + ui->gui_init(); + + ui->gui_info(); + + _delay_ms(1000); + + io = (ioController*) malloc(sizeof(ioController)); + + io->setBuzzer(false); + io->deactivateChargers(); + io->setActiveLED(true); + io->activateChargers(); chargers = (charger *) malloc(CHARGER_SIZE * sizeof(charger)); @@ -25,37 +41,58 @@ int main(void) { clock tmp; clk = &tmp; - ioController io; - - io.setBuzzer(false); - io.deactivateChargers(); - io.setActiveLED(true); - io.activateChargers(); - - gui ui; - createChargers(); - io.setWS2812(0, 255, 255); + //io.setWS2812(0, 255, 255); //loop till power off while (true) { - checkForBattery(); - printStatus(); - //updateChargers(); updateGUI(); + + checkForBattery(); } return 0; } void updateGUI() { + if (everySec()) { //updates the ui every sec + bool next = true; + bool notfound = true; + static bool found = true; + int loops = 0; - //if (everySec()) { //updates the ui every sec + //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 +//void gui_print(int pNr, bool pStatus, struct time_t pTime, double pVoltage, int pCurrent, unsigned long int pCapacity); - serialSend("-\r\n"); + 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 - //} } bool everySec() { @@ -70,17 +107,20 @@ bool everySec() { void updateChargers() { //serialSend("updateChargers\r\n"); - 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(); - } + //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() { + + bool activeChargers[CHARGER_SIZE]; + for (int l = 0; l < CHARGER_SIZE; l++) { bool zero = false; @@ -106,10 +146,19 @@ void checkForBattery() { serialSend(" Volt\r\n"); */ chargers[l].setStatus(true); + //io->setActiveLED(true); + + if (!activeChargers[l]) { + chargers[l].setStartTime(clk->getTimeStamp()); + } + activeChargers[l] = true; } else { //serialSend("blocked\r\n"); + //io->setActiveLED(false); chargers[l].setStatus(false); chargers[l].reset(); + activeChargers[l] = false; + } } @@ -158,6 +207,8 @@ void printStatus() { } } +#ifdef DEBUG + void serialSetup(void) { //Register settings //High and low bits @@ -165,7 +216,7 @@ void serialSetup(void) { 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 + UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);//8 bit data format } void serialSend(const char* sendString) { @@ -176,3 +227,4 @@ void serialSend(const char* sendString) { } } +#endif diff --git a/Software/src/openChargeMicro.h b/Software/src/openChargeMicro.h index 1fa4a55..33e1f4b 100644 --- a/Software/src/openChargeMicro.h +++ b/Software/src/openChargeMicro.h @@ -1,3 +1,7 @@ + +//#define DEBUG + + /* system header */ #include #include @@ -15,10 +19,6 @@ #include "gui.h" #include "charger.h" - - - - /* Pins */ #define WS2812B PD2 #define ACTIVELED PB5 @@ -33,13 +33,16 @@ #define S1 PD6 #define S0 PD5 +#ifdef DEBUG /* Serial */ #define BUAD 9600 #define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1) + void serialSetup(void); void serialSend(const char* sendString); +#endif /* Charger Config */ #define CHARGER_SIZE 4 @@ -68,6 +71,10 @@ void serialSend(const char* sendString); void updateChargers(); +void updateGUI(); + +void checkForBattery(); +