Переглянути джерело

Store/show counted values.

Vladimir N. Shilov 2 роки тому
батько
коміт
c69db809e0
2 змінених файлів з 95 додано та 19 видалено
  1. 7 0
      readme.txt
  2. 88 19
      src/main.c

+ 7 - 0
readme.txt

@@ -41,3 +41,10 @@ Tasks:
 
 По идее, из потока INA нужно убрать весь вывод, оставить только подсчёт.
 Вся логика тестера должна быть в потоке Chrgr.
+---
+29.12.2022
+
+По идее, осталось добавить профиль(и) для аккумов, и контроль условий 
+оконочания процессов заряда/розряда.
+
+Потом вывод в ком-порт, в файл на микросд-карту.

+ 88 - 19
src/main.c

@@ -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();