Removed pc.printf command that sends empty string once per second and associated timer_4, since the operator program was changed, a new operator Loc () was introduced into it. Instead of pc.printf ("Reset ALARM \ r \ n") now plotter.printf ("Reset ALARM \ r \ n").

Dependencies:   _24LCXXX

Revision:
2:8230a5a4cc13
Parent:
1:1d4ec28f17c4
Child:
3:712f751b4974
--- a/main.cpp	Fri May 08 12:05:29 2020 +0000
+++ b/main.cpp	Fri May 15 07:56:26 2020 +0000
@@ -1,4 +1,9 @@
+// Создан сторожевой таймер, который истекает через 100мс
 #include "mbed.h"
+#include "_24LCXXX.h"
+
+I2C i2c(PB_9,PB_8);        // sda, scl
+_24LCXXX eeprom(&i2c, 0x50);
 
 AnalogIn analog_value(A0);                                                      //подключение аналогового входа A0
 DigitalOut led(LED1);
@@ -8,15 +13,16 @@
 RawSerial plotter(PA_9, PA_10, 115200);                                         // tx, rx for F411RE    out port  for serial_plotter
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
 Timer timer;                                                                    //инициализация таймера
-
-int flag_autoset = 0;                                                           //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
-int flag_plotter = 0;                                                           //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение
-int value = 0;                                                                  //set begin value "pressure" 
-int delta_value = 0;                                                            //set delta pressure
+//========УСТАВКИ========
+uint8_t flag_autoset = 0;                                                       //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
+uint8_t flag_plotter = 0;                                                       //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение
+int value = 0;                                                             //set begin value "pressure"   1...3300
+uint8_t delta_value = 0;                                                        //set delta pressure 1...99
+//=======================
 int value_auto=250 ;                                                            //set begin value auto "pressure"
 int sensor_value =0;                                                            //напряжение с аналогового входа А0 (текущее давление)
-int counter_cycle1 = 0;
-int counter_cycle2 = 0;
+int counter_cycle1 = 0;                                                         //счётчик цикла while(true)
+int counter_cycle2 = 0;                                                         //счётчик внутри функции auto_set
 int sig = 1;                                                                    //знак инкримента для автоустаки
 //                       FIFO_buffer must be full (only char  and '\0') 
 //#define maxnsym 24                                                             // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
@@ -24,10 +30,39 @@
 char Source[maxnsym]="$press,1000,25,0,0,2050**";      //23 char- string ,весь массив со строкой для поиска 23+1(null terminal)=24 
                                                       //уставки и контрольная сумма умноженная на два, должны быть больше нуля  
 char trueSource[maxnsym];                             //верифицированная строка для callback
+char trueSourceOld[maxnsym];                          //предыдущая верифицированная строка для callback
 
 volatile char chr_a;                                //в прерываниях переменные должны быть защищены  при помощи volatile от оптимизации компилятором
 volatile bool flag_comand_detected = false;         //если строка декодирована правильно то true
-volatile bool flag_reset = true;                    //флаг индикатора перезагрузки 
+volatile bool flag_stopRegulator = true;                    //флаг остановки , закрыть все клапана 
+//_____________________________________________________________________________
+void save_EEPROM () {
+    int data2;
+    pc.printf("EEPROM write------\r\n");    
+    eeprom.byte_write(0, delta_value);
+    eeprom.byte_write(1, flag_autoset);
+    eeprom.byte_write(2, flag_plotter);
+    data2 = value;
+    eeprom.nbyte_write( 10, &data2, sizeof(int));
+}
+//_____________________________________________________________________________
+void load_EEPROM () {
+    uint8_t data1;
+    int data2;
+    pc.printf("EEPROM read------\r\n");
+    eeprom.nbyte_read( 0, &data1, 1 );
+    pc.printf("adress 0  =%d \r\n",data1);
+    delta_value=data1;
+    eeprom.nbyte_read( 1, &data1, 1 );
+    pc.printf("adress 1  =%d \r\n",data1);
+    flag_autoset=data1;
+    eeprom.nbyte_read( 2, &data1, 1 );
+    pc.printf("adress 2  =%d \r\n",data1);
+    flag_plotter=data1;
+    eeprom.nbyte_read( 10, &data2, sizeof(int) );
+    pc.printf("adress 10  = %d \r\n",data2);
+    value=data2;
+    }
 //______________________________________________________________________________
 void substring(char *s,char *d,int pos,int len) {
 //usage: substring(Source,Destination,pos,len);
@@ -164,23 +199,38 @@
     int time, valve1, valve2, countValve1=0, countValve2=0;
     int frequencyValve1, frequencyValve2;
     float raw_value_sum = 0 ;
-                                          //после перезагрузки немедленно закрыть оба клапана
-    digital_4.write(0);                                                       //valve1  off;
-    digital_7.write(0);                                                       //valve2  off;
-        
+    digital_4.write(0);                                                         //valve1  off;
+    digital_7.write(0);                                                         //valve2  off;                                         
+    load_EEPROM ();                                                             //загрузка уставок из EEPROM
+    if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) {
+      flag_stopRegulator=false;                                                 //уставки из EEPROM похожи на правду, разрешаем работу регулятора 
+    } else {
+      flag_stopRegulator = true;                                                //флаг остановки установлен 
+      pc.printf("Regulator stopped, error in EEPROM \r\n");       
+    }
+      
     pc.printf("Program started \r\n");
+    Watchdog &watchdog = Watchdog::get_instance();
+    watchdog.start(100);                         //WDlimit = 100  ms
     timer.start();
     
   while (true){                                                                 //бесконечный цикл
-    
+    // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
+    watchdog.kick();
     if (flag_comand_detected) {                                                 //пришла правильная командная строка
       pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
         value,delta_value,flag_autoset,flag_plotter,sensor_value,frequencyValve1,frequencyValve2);     //текущие данные
       //pc.printf("%s\r\n",trueSource);                                         //эхо для отладки канала связи
-      flag_comand_detected=false;                                              //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
-      flag_reset=false;                   //сброс флага перезагрузки (после перезагрузки клапана закрыты, регулятор ждет пока  не будет сброшен этот флаг)
+      flag_comand_detected=false;                                               //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
+      flag_stopRegulator=false;                                                 //сброс флага,  регулятор ждет пока  не будет сброшен этот флаг
       //plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110,
       //  digital_7.read()*100-220, value, sensor_value, time );                //печать в плоттер в другой СОМ-порт
+      if (strcmp(trueSourceOld,trueSource) != 0) {                              //функция возвращает ноль если командные строки совпадают
+        save_EEPROM ();                                                         //пишем в память уставки отличные от старых
+        load_EEPROM ();
+      }
+      
+      strcpy(trueSourceOld,trueSource);        //копировать из trueSource в trueSourceOld 
     }
     float  raw_value = analog_value.read();                                     // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
     raw_value_sum = raw_value_sum + raw_value;
@@ -189,7 +239,7 @@
       counter_cycle1=0;
       sensor_value = raw_value_sum/20 * 3300;                                   // преобразование в напряжение 0-3300 mV  с усреднением
       raw_value_sum = 0 ;
-      if (flag_reset == false) {                                                //после перезагрузки уставки получены, можно запускать регулятор
+      if (flag_stopRegulator == false) {                                        // можно запускать регулятор
         //--------------regulator begin-----------------------
         if (sensor_value > value + delta_value) {
           valve2 = digital_7.read();