updateChargers via Timer IS
This commit is contained in:
parent
32879835ca
commit
6c3d5a7184
|
@ -28,6 +28,7 @@ int charger::getCurrent() {
|
||||||
double charger::getVoltage() {
|
double charger::getVoltage() {
|
||||||
mux.setChannel(charger_settings.chU);
|
mux.setChannel(charger_settings.chU);
|
||||||
int tmp = (int) io.readAdc(0);
|
int tmp = (int) io.readAdc(0);
|
||||||
|
if(tmp == 0) return 0;
|
||||||
double ret = ((double) tmp) * 0.00615;
|
double ret = ((double) tmp) * 0.00615;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -45,10 +46,12 @@ struct time_t charger::getStartTime() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void charger::getInfo() {
|
void charger::getInfo() {
|
||||||
|
#ifdef DEBUG
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
sprintf(buffer, "Nr: %i - Uch %i - Ich %i\r\n", charger_settings.nr,
|
sprintf(buffer, "Nr: %i - Uch %i - Ich %i\r\n", charger_settings.nr,
|
||||||
charger_settings.chU, charger_settings.chI);
|
charger_settings.chU, charger_settings.chI);
|
||||||
serialSend(buffer);
|
serialSend(buffer);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
void charger::setStatus(bool pBool) {
|
void charger::setStatus(bool pBool) {
|
||||||
active = pBool;
|
active = pBool;
|
||||||
|
|
|
@ -7,14 +7,16 @@
|
||||||
|
|
||||||
#include "openChargeMicro.h"
|
#include "openChargeMicro.h"
|
||||||
|
|
||||||
uint32_t systemTime; // 0 to 4294967295 sec
|
unsigned long int systemTime; // 0 to 4294967295 sec
|
||||||
|
|
||||||
/* Only call once */
|
/* Only call once */
|
||||||
clock::clock() {
|
clock::clock() {
|
||||||
//TODO Singleton
|
//TODO Singleton
|
||||||
systemTime = 0;
|
systemTime = 0;
|
||||||
clock_init();
|
clock_init();
|
||||||
|
#ifdef DEBUG
|
||||||
serialSend("init clock\r\n");
|
serialSend("init clock\r\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
clock::~clock() {
|
clock::~clock() {
|
||||||
|
@ -23,6 +25,11 @@ clock::~clock() {
|
||||||
|
|
||||||
void clock::clock_init() {
|
void clock::clock_init() {
|
||||||
OCR1A = 0x3D08; // --> 1 sec
|
OCR1A = 0x3D08; // --> 1 sec
|
||||||
|
|
||||||
|
//OCR1A = 0x7A11; // --> 2 sec
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TCCR1B |= (1 << WGM12);
|
TCCR1B |= (1 << WGM12);
|
||||||
// Mode 4, CTC on OCR1A
|
// Mode 4, CTC on OCR1A
|
||||||
TIMSK1 |= (1 << OCIE1A);
|
TIMSK1 |= (1 << OCIE1A);
|
||||||
|
@ -32,7 +39,7 @@ void clock::clock_init() {
|
||||||
sei(); //enable interrupts
|
sei(); //enable interrupts
|
||||||
}
|
}
|
||||||
/* get seconds since boot*/
|
/* get seconds since boot*/
|
||||||
uint32_t clock::getTime() {
|
unsigned long int clock::getTime() {
|
||||||
return systemTime;
|
return systemTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,12 +76,12 @@ struct time_t clock::getTimeStamp() {
|
||||||
ret.diffHour = 0;
|
ret.diffHour = 0;
|
||||||
|
|
||||||
while (ret.diffSecond > 59) {
|
while (ret.diffSecond > 59) {
|
||||||
ret.diffSecond = -60;
|
ret.diffSecond = ret.diffSecond - 60;
|
||||||
ret.diffMinute++;
|
ret.diffMinute++;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (ret.diffMinute > 59) {
|
while (ret.diffMinute > 59) {
|
||||||
ret.diffMinute = -60;
|
ret.diffMinute = ret.diffMinute - 60;
|
||||||
ret.diffHour++;
|
ret.diffHour++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,9 +92,15 @@ ISR (TIMER1_COMPA_vect) {
|
||||||
// action to be done every 1 sec
|
// action to be done every 1 sec
|
||||||
systemTime++; //increase system time
|
systemTime++; //increase system time
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
updateChargers();
|
updateChargers();
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
ISR(__vector_default) {
|
ISR(__vector_default) {
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
#define SRC_CLOCK_H_
|
#define SRC_CLOCK_H_
|
||||||
|
|
||||||
struct time_t {
|
struct time_t {
|
||||||
unsigned long int diffHour;
|
int diffHour;
|
||||||
unsigned long int diffMinute;
|
int diffMinute;
|
||||||
unsigned long int diffSecond;
|
int diffSecond;
|
||||||
unsigned long int seconds;
|
unsigned long int seconds;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ private:
|
||||||
public:
|
public:
|
||||||
clock();
|
clock();
|
||||||
~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 getTime(struct time_t pTime); //time in sec since time stamp
|
||||||
struct time_t getTimeStamp(); // returns a timestamp
|
struct time_t getTimeStamp(); // returns a timestamp
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,30 @@
|
||||||
|
|
||||||
|
|
||||||
gui::gui() {
|
gui::gui() {
|
||||||
oled.oled_init();
|
|
||||||
}
|
}
|
||||||
gui::~gui() {
|
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,
|
void gui::gui_print(int pNr, bool pStatus, struct time_t pTime, double pVoltage,
|
||||||
int pCurrent, unsigned long int pCapacity) {
|
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 */
|
/* time */
|
||||||
oled.oled_gotoxy(0, 2);
|
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);
|
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);
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -19,7 +19,11 @@ private:
|
||||||
public:
|
public:
|
||||||
gui();
|
gui();
|
||||||
~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_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();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,22 +2,38 @@
|
||||||
|
|
||||||
charger* chargers;
|
charger* chargers;
|
||||||
clock* clk;
|
clock* clk;
|
||||||
|
gui* ui;
|
||||||
|
ioController* io;
|
||||||
|
|
||||||
void createChargers();
|
void createChargers();
|
||||||
void printStatus();
|
void printStatus();
|
||||||
void checkForBattery();
|
|
||||||
|
|
||||||
void updateGUI();
|
|
||||||
bool everySec();
|
bool everySec();
|
||||||
|
|
||||||
unsigned short int indexCount = 0;
|
int indexCount = 0;
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
#ifdef DEBUG
|
||||||
serialSetup();
|
serialSetup();
|
||||||
serialSend("Hello World - ");
|
serialSend("Hello World - ");
|
||||||
serialSend(__DATE__ __TIME__);
|
serialSend(__DATE__ __TIME__);
|
||||||
serialSend("\r\n");
|
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));
|
chargers = (charger *) malloc(CHARGER_SIZE * sizeof(charger));
|
||||||
|
|
||||||
|
@ -25,37 +41,58 @@ int main(void) {
|
||||||
clock tmp;
|
clock tmp;
|
||||||
clk = &tmp;
|
clk = &tmp;
|
||||||
|
|
||||||
ioController io;
|
|
||||||
|
|
||||||
io.setBuzzer(false);
|
|
||||||
io.deactivateChargers();
|
|
||||||
io.setActiveLED(true);
|
|
||||||
io.activateChargers();
|
|
||||||
|
|
||||||
gui ui;
|
|
||||||
|
|
||||||
createChargers();
|
createChargers();
|
||||||
|
|
||||||
io.setWS2812(0, 255, 255);
|
//io.setWS2812(0, 255, 255);
|
||||||
|
|
||||||
//loop till power off
|
//loop till power off
|
||||||
while (true) {
|
while (true) {
|
||||||
checkForBattery();
|
|
||||||
printStatus();
|
|
||||||
//updateChargers();
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
|
|
||||||
|
checkForBattery();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateGUI() {
|
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() {
|
bool everySec() {
|
||||||
|
@ -70,17 +107,20 @@ bool everySec() {
|
||||||
|
|
||||||
void updateChargers() {
|
void updateChargers() {
|
||||||
//serialSend("updateChargers\r\n");
|
//serialSend("updateChargers\r\n");
|
||||||
if (everySec()) { //updates the chargers every sec
|
//if (everySec()) { //updates the chargers every sec
|
||||||
for (int i = 0; i < CHARGER_SIZE; i++) {
|
for (int i = 0; i < CHARGER_SIZE; i++) {
|
||||||
if (chargers[i].getStatus()) {
|
if (chargers[i].getStatus()) {
|
||||||
//charger active --> battery pluged on
|
//charger active --> battery pluged on
|
||||||
chargers[i].update();
|
chargers[i].update();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkForBattery() {
|
void checkForBattery() {
|
||||||
|
|
||||||
|
bool activeChargers[CHARGER_SIZE];
|
||||||
|
|
||||||
for (int l = 0; l < CHARGER_SIZE; l++) {
|
for (int l = 0; l < CHARGER_SIZE; l++) {
|
||||||
|
|
||||||
bool zero = false;
|
bool zero = false;
|
||||||
|
@ -106,10 +146,19 @@ void checkForBattery() {
|
||||||
serialSend(" Volt\r\n");
|
serialSend(" Volt\r\n");
|
||||||
*/
|
*/
|
||||||
chargers[l].setStatus(true);
|
chargers[l].setStatus(true);
|
||||||
|
//io->setActiveLED(true);
|
||||||
|
|
||||||
|
if (!activeChargers[l]) {
|
||||||
|
chargers[l].setStartTime(clk->getTimeStamp());
|
||||||
|
}
|
||||||
|
activeChargers[l] = true;
|
||||||
} else {
|
} else {
|
||||||
//serialSend("blocked\r\n");
|
//serialSend("blocked\r\n");
|
||||||
|
//io->setActiveLED(false);
|
||||||
chargers[l].setStatus(false);
|
chargers[l].setStatus(false);
|
||||||
chargers[l].reset();
|
chargers[l].reset();
|
||||||
|
activeChargers[l] = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -158,6 +207,8 @@ void printStatus() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
void serialSetup(void) {
|
void serialSetup(void) {
|
||||||
//Register settings
|
//Register settings
|
||||||
//High and low bits
|
//High and low bits
|
||||||
|
@ -165,7 +216,7 @@ void serialSetup(void) {
|
||||||
UBRR0L = BUAD_RATE_CALC;
|
UBRR0L = BUAD_RATE_CALC;
|
||||||
//transimit and recieve enable
|
//transimit and recieve enable
|
||||||
UCSR0B = (1 << TXEN0) | (1 << TXCIE0) | (1 << RXEN0) | (1 << RXCIE0);
|
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) {
|
void serialSend(const char* sendString) {
|
||||||
|
@ -176,3 +227,4 @@ void serialSend(const char* sendString) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
|
||||||
|
//#define DEBUG
|
||||||
|
|
||||||
|
|
||||||
/* system header */
|
/* system header */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -15,10 +19,6 @@
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
#include "charger.h"
|
#include "charger.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Pins */
|
/* Pins */
|
||||||
#define WS2812B PD2
|
#define WS2812B PD2
|
||||||
#define ACTIVELED PB5
|
#define ACTIVELED PB5
|
||||||
|
@ -33,13 +33,16 @@
|
||||||
#define S1 PD6
|
#define S1 PD6
|
||||||
#define S0 PD5
|
#define S0 PD5
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
/* Serial */
|
/* Serial */
|
||||||
#define BUAD 9600
|
#define BUAD 9600
|
||||||
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)
|
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)
|
||||||
|
|
||||||
|
|
||||||
void serialSetup(void);
|
void serialSetup(void);
|
||||||
void serialSend(const char* sendString);
|
void serialSend(const char* sendString);
|
||||||
|
|
||||||
|
#endif
|
||||||
/* Charger Config */
|
/* Charger Config */
|
||||||
#define CHARGER_SIZE 4
|
#define CHARGER_SIZE 4
|
||||||
|
|
||||||
|
@ -68,6 +71,10 @@ void serialSend(const char* sendString);
|
||||||
|
|
||||||
void updateChargers();
|
void updateChargers();
|
||||||
|
|
||||||
|
void updateGUI();
|
||||||
|
|
||||||
|
void checkForBattery();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue