|
@@ -103,13 +103,14 @@ static ina3221_ch_t current_Channel;
|
|
|
static uint32_t Current;
|
|
|
static uint32_t Voltage;
|
|
|
static uint32_t Power, Capacity_I=0, Capacity_P=0;
|
|
|
+static uint32_t dech_Capacity_I, dech_Capacity_P, ch_Capacity_I, ch_Capacity_P;
|
|
|
static int INA_Present = 0;
|
|
|
static BaseSequentialStream * chp = (BaseSequentialStream*) &SD1;
|
|
|
GHandle GW1; // The handle for our console
|
|
|
ina3221_t ina3221;
|
|
|
static gFont font1;
|
|
|
static gFont font2;
|
|
|
-static time_cnt_t Timer = {0};
|
|
|
+static time_cnt_t Timer = {0}, dechTimer, chTimer;
|
|
|
static btn_hndlr bha[Button_Num] = {btn1_handler, btn2_handler, btn3_handler, btn4_handler};
|
|
|
|
|
|
/*
|
|
@@ -135,9 +136,43 @@ static THD_FUNCTION(ChrgThread, arg) {
|
|
|
while (true) {
|
|
|
chBSemWait(&charger_bsem);
|
|
|
|
|
|
- chSysLockFromISR();
|
|
|
- chEvtBroadcastI(&time_event);
|
|
|
- chSysUnlockFromISR();
|
|
|
+ if (charger_State != Stop) {
|
|
|
+ if ((charger_State == Pause1) || (charger_State == Pause2)) {
|
|
|
+ /* Pause countdown */
|
|
|
+ if (Timer.ss > 0) {
|
|
|
+ Timer.ss --;
|
|
|
+ } else {
|
|
|
+ if (Timer.mm > 0) {
|
|
|
+ Timer.mm --;
|
|
|
+ } else {
|
|
|
+ if (Timer.hh > 0){
|
|
|
+ Timer.hh --;
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Timer.mm = 59;
|
|
|
+ }
|
|
|
+ Timer.ss = 59;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* Charge/Decharge counter */
|
|
|
+ if (Timer.ss < 59) {
|
|
|
+ Timer.ss ++;
|
|
|
+ } else {
|
|
|
+ Timer.ss = 0;
|
|
|
+ if (Timer.mm < 59) {
|
|
|
+ Timer.mm ++;
|
|
|
+ } else {
|
|
|
+ Timer.mm = 0;
|
|
|
+ Timer.hh ++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /* Show new timer value */
|
|
|
+ chSysLockFromISR();
|
|
|
+ chEvtBroadcastI(&time_event);
|
|
|
+ chSysUnlockFromISR();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -324,14 +359,25 @@ int main(void) {
|
|
|
|
|
|
case Pause1:
|
|
|
oldState = Pause1;
|
|
|
- gwinPrintf(GW1, "Pause after Charge_1\n");
|
|
|
// power relay off
|
|
|
palSetLine(LINE_RELAY1);
|
|
|
+
|
|
|
+ tmp0 = CHRGR_PAUSE1_S / 60;
|
|
|
+ Timer.ss = CHRGR_PAUSE1_S % 60;
|
|
|
+ Timer.hh = tmp0 / 60;
|
|
|
+ Timer.mm = tmp0 % 60;
|
|
|
+
|
|
|
+ gwinPrintf(GW1, "Pause after Charge_1\n");
|
|
|
chVTSet(&mode_vt, CHRGR_PAUSE1_S, mode_vt_cb, (void *)Decharge);
|
|
|
break;
|
|
|
|
|
|
case Decharge:
|
|
|
oldState = Decharge;
|
|
|
+ Capacity_I = 0;
|
|
|
+ Capacity_P = 0;
|
|
|
+ Timer.hh = 0;
|
|
|
+ Timer.mm = 0;
|
|
|
+ Timer.ss = 0;
|
|
|
gwinPrintf(GW1, "Begin process: Decharge\n");
|
|
|
// load relay on
|
|
|
palClearLine(LINE_RELAY2);
|
|
@@ -339,6 +385,12 @@ int main(void) {
|
|
|
|
|
|
case Pause2:
|
|
|
oldState = Pause2;
|
|
|
+ // load relay off
|
|
|
+ palSetLine(LINE_RELAY2);
|
|
|
+
|
|
|
+ dech_Capacity_I = Capacity_I;
|
|
|
+ dech_Capacity_P = Capacity_P;
|
|
|
+ dechTimer = Timer;
|
|
|
|
|
|
tmp0 = (Capacity_I + 1800) / 3600;
|
|
|
tmp1 = tmp0 / 1000;
|
|
@@ -346,13 +398,21 @@ int main(void) {
|
|
|
chsnprintf(buf, 15, "CI:%2d.%03uAh\n", tmp1, tmp2);
|
|
|
gwinPrintf(GW1, buf);
|
|
|
|
|
|
+ tmp0 = CHRGR_PAUSE2_S / 60;
|
|
|
+ Timer.ss = CHRGR_PAUSE2_S % 60;
|
|
|
+ Timer.hh = tmp0 / 60;
|
|
|
+ Timer.mm = tmp0 % 60;
|
|
|
+
|
|
|
gwinPrintf(GW1, "Pause after Decharge\n");
|
|
|
- // load relay off
|
|
|
- palSetLine(LINE_RELAY2);
|
|
|
chVTSet(&mode_vt, CHRGR_PAUSE2_S, mode_vt_cb, (void *)Charge2);
|
|
|
break;
|
|
|
|
|
|
case Charge2:
|
|
|
+ Capacity_I = 0;
|
|
|
+ Capacity_P = 0;
|
|
|
+ Timer.hh = 0;
|
|
|
+ Timer.mm = 0;
|
|
|
+ Timer.ss = 0;
|
|
|
oldState = Charge2;
|
|
|
gwinPrintf(GW1, "Begin process: Charge_2\n");
|
|
|
// power relay on
|
|
@@ -360,6 +420,11 @@ int main(void) {
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
+ if (oldState == Charge2) {
|
|
|
+ ch_Capacity_I = Capacity_I;
|
|
|
+ ch_Capacity_P = Capacity_P;
|
|
|
+ chTimer = Timer;
|
|
|
+ }
|
|
|
oldState = Stop;
|
|
|
// power and load relay off
|
|
|
palSetLine(LINE_RELAY1);
|
|
@@ -466,12 +531,28 @@ static void btn1_handler(button_state_t state) {
|
|
|
static void btn2_handler(button_state_t state) {
|
|
|
if (state == BTN_st_Pressed) {
|
|
|
gwinPrintf(GW1, "Button 2 pressed\n");
|
|
|
+ Capacity_I = ch_Capacity_I;
|
|
|
+ Capacity_P = ch_Capacity_P;
|
|
|
+ Timer = chTimer;
|
|
|
+
|
|
|
+ chSysLockFromISR();
|
|
|
+ chEvtBroadcastI(&ina_all_event);
|
|
|
+ chEvtBroadcastI(&time_event);
|
|
|
+ chSysUnlockFromISR();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static void btn3_handler(button_state_t state) {
|
|
|
if (state == BTN_st_Pressed) {
|
|
|
gwinPrintf(GW1, "Button 3 pressed\n");
|
|
|
+ Capacity_I = dech_Capacity_I;
|
|
|
+ Capacity_P = dech_Capacity_P;
|
|
|
+ Timer = dechTimer;
|
|
|
+
|
|
|
+ chSysLockFromISR();
|
|
|
+ chEvtBroadcastI(&ina_all_event);
|
|
|
+ chEvtBroadcastI(&time_event);
|
|
|
+ chSysUnlockFromISR();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -582,18 +663,6 @@ static void gpt_cb(GPTDriver *gptp) {
|
|
|
/* One second */
|
|
|
cnt = 0;
|
|
|
|
|
|
- if (Timer.ss < 59) {
|
|
|
- Timer.ss ++;
|
|
|
- } else {
|
|
|
- Timer.ss = 0;
|
|
|
- if (Timer.mm < 59) {
|
|
|
- Timer.mm ++;
|
|
|
- } else {
|
|
|
- Timer.mm = 0;
|
|
|
- Timer.hh ++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
chSysLockFromISR();
|
|
|
chBSemSignalI(&charger_bsem);
|
|
|
chSysUnlockFromISR();
|