#include "flprogUtilites.h"
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
bool EN_145550790_7;
String in_145550790_7;
byte size_145550790_7;
byte X_145550790_7;
byte Y_145550790_7;
bool invert_145550790_7;
Adafruit_SSD1306 display(11, 13, 8, 9, 10);
bool EN_145550790_8;
String in_145550790_8;
byte size_145550790_8;
byte X_145550790_8;
byte Y_145550790_8;
bool invert_145550790_8;
bool in_86634752_1;
bool en_86634752_1;
bool DurLong_86634752_1;
bool One_86634752_1;
bool Doubl_86634752_1;
boolean PStart_86634752_1; // Старт нажатия кнопки
boolean PStop_86634752_1; // Стоп нажатия кнопки
boolean Press_86634752_1; // флаг нажатия кнопки
boolean Release_86634752_1; // флаг отпускания кнопки
boolean DoublP_86634752_1; // флаг отпускания после двойного нажатия
unsigned long Ptimer_86634752_1; // таймер последнего нажатия кнопки
unsigned long Dtimer_86634752_1; // таймер двойного нажатия кнопки
//Переменные таймеров задержек выходов
unsigned long next1_86634752_1;
unsigned long next2_86634752_1;
bool EN_145550790_6;
String in_145550790_6;
byte size_145550790_6;
byte X_145550790_6;
byte Y_145550790_6;
bool invert_145550790_6;
bool EN_145550790_1;
String in_145550790_1;
byte size_145550790_1;
byte X_145550790_1;
byte Y_145550790_1;
bool invert_145550790_1;
bool EN_145550790_2;
String in_145550790_2;
byte size_145550790_2;
byte X_145550790_2;
byte Y_145550790_2;
bool invert_145550790_2;
bool EN_145550790_3;
String in_145550790_3;
byte size_145550790_3;
byte X_145550790_3;
byte Y_145550790_3;
bool invert_145550790_3;
bool EN_145550790_4;
String in_145550790_4;
byte size_145550790_4;
byte X_145550790_4;
byte Y_145550790_4;
bool invert_145550790_4;
bool EN_145550790_5;
String in_145550790_5;
byte size_145550790_5;
byte X_145550790_5;
byte Y_145550790_5;
bool invert_145550790_5;
bool _bounseInputD6S = 0;
bool _bounseInputD6O = 0;
unsigned long _bounseInputD6P = 0UL;
unsigned long _SCT_3 = 0UL;
unsigned long _SCT_3IC = 0UL;
bool _gen2I = 0;
bool _gen2O = 0;
unsigned long _gen2P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
String _swi3;
String _swi4;
bool _trgt2 = 0;
bool _trgt2I = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
String _swi5;
unsigned long _SCT_2 = 0UL;
unsigned long _SCT_2IC = 0UL;
unsigned long _SCT_2P = 0UL;
int _SCT_2_CPOP = 0;
bool _SCT_2_RCPIOS = 0;
bool _trgr1 = 0;
float _strFunsq1 = 0.00;
String _swi2;
bool _trgt1 = 0;
bool _trgt1I = 0;
bool _count2I = 0;
int _count2_Value = 0;
bool _bounseInputD15S = 0;
bool _bounseInputD15O = 0;
unsigned long _bounseInputD15P = 0UL;
String _swi1;
bool _bounseInputD0S = 0;
bool _bounseInputD0O = 0;
unsigned long _bounseInputD0P = 0UL;
bool _trgt3 = 0;
bool _trgt3I = 0;
bool _bounseInputD1S = 0;
bool _bounseInputD1O = 0;
unsigned long _bounseInputD1P = 0UL;
bool _bounseInputD4S = 0;
bool _bounseInputD4O = 0;
unsigned long _bounseInputD4P = 0UL;
int _sCHCV = 0;
void setup()
{
    pinMode(4, INPUT_PULLUP);
    pinMode(6, INPUT_PULLUP);
    pinMode(0, INPUT_PULLUP);
    pinMode(1, INPUT_PULLUP);
    pinMode(15, INPUT_PULLUP);
    pinMode(5, OUTPUT);
    digitalWrite(5, 0);
    pinMode(7, OUTPUT);
    digitalWrite(7, 0);
    pinMode(12, OUTPUT);
    digitalWrite(12, 0);
    pinMode(17, OUTPUT);
    digitalWrite(17, 0);
    pinMode(18, OUTPUT);
    digitalWrite(18, 0);
    _bounseInputD15O =    digitalRead(15);
    _bounseInputD1O =    digitalRead(1);
    _bounseInputD4O =    digitalRead(4);
    _bounseInputD6O =    digitalRead(6);
    _bounseInputD0O =    digitalRead(0);
    pinMode(3, INPUT);
    pinMode(2, INPUT);
    TCCR2A = (1<<WGM21);
    TCCR2B = (1<<CS21);
    OCR2A = 199;
    TIMSK2 = (1<<OCIE2A);
    sei ();
    _SCT_2P=micros();
    attachInterrupt(digitalPinToInterrupt (3), _SCT_3coutFunction, FALLING);
    attachInterrupt(digitalPinToInterrupt (2), _SCT_2coutFunction, FALLING);
    display.begin(SSD1306_SWITCHCAPVCC);
    display.display();
    display.clearDisplay();
}
void loop()
{
    bool  _bounceInputTmpD15 =  (digitalRead (15));
    if (_bounseInputD15S)
    {
        if (millis() >= (_bounseInputD15P + 40))
        {
            _bounseInputD15O= _bounceInputTmpD15;
            _bounseInputD15S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD15 != _bounseInputD15O)
        {
            _bounseInputD15S=1;
            _bounseInputD15P = millis();
        }
    }
    bool  _bounceInputTmpD1 =  (digitalRead (1));
    if (_bounseInputD1S)
    {
        if (millis() >= (_bounseInputD1P + 40))
        {
            _bounseInputD1O= _bounceInputTmpD1;
            _bounseInputD1S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD1 != _bounseInputD1O)
        {
            _bounseInputD1S=1;
            _bounseInputD1P = millis();
        }
    }
    bool  _bounceInputTmpD0 =  (digitalRead (0));
    if (_bounseInputD0S)
    {
        if (millis() >= (_bounseInputD0P + 40))
        {
            _bounseInputD0O= _bounceInputTmpD0;
            _bounseInputD0S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD0 != _bounseInputD0O)
        {
            _bounseInputD0S=1;
            _bounseInputD0P = millis();
        }
    }
    bool  _bounceInputTmpD6 =  (digitalRead (6));
    if (_bounseInputD6S)
    {
        if (millis() >= (_bounseInputD6P + 40))
        {
            _bounseInputD6O= _bounceInputTmpD6;
            _bounseInputD6S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD6 != _bounseInputD6O)
        {
            _bounseInputD6S=1;
            _bounseInputD6P = millis();
        }
    }
    bool  _bounceInputTmpD4 =  (digitalRead (4));
    if (_bounseInputD4S)
    {
        if (millis() >= (_bounseInputD4P + 40))
        {
            _bounseInputD4O= _bounceInputTmpD4;
            _bounseInputD4S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD4 != _bounseInputD4O)
        {
            _bounseInputD4S=1;
            _bounseInputD4P = millis();
        }
    }
    //Плата:1
//Наименование:ИЗМЕРЕНИЕ ИНДУКТИВНОСТИ
    display.clearDisplay(); // Очищаем дисплей
    in_86634752_1 = !(_bounseInputD4O);
    en_86634752_1 = !(0);
    if (en_86634752_1)
    {
        // Отработка режимов 
          // Если требуются разные задержки для выходов, заменить 50  
          // на конкретное время (в миллисекундах) 
          if (One_86634752_1 && next1_86634752_1 < millis()) 
        {
            next1_86634752_1 = millis() + 50;
        }
             // 1 нажатие 
          if (One_86634752_1 && next1_86634752_1 >= millis()) 
        {
            One_86634752_1 = 0;
        }
        if (Doubl_86634752_1 && next2_86634752_1 < millis()) 
        {
            next2_86634752_1 = millis() + 50;
        }
             // 2 нажатия 
          if (Doubl_86634752_1 && next2_86634752_1 >= millis()) 
        {
            Doubl_86634752_1 = 0;
        }
        	 //Отработка нажатий  
// Нажатие кнопки
          if (in_86634752_1) 
        {
            PStart_86634752_1 = 1;
            Press_86634752_1 = 1;
        }
        else 
        {
            PStart_86634752_1 = 0;
            PStop_86634752_1 = 1;
        }
        if (PStart_86634752_1 && PStop_86634752_1) 
        {
            Ptimer_86634752_1 = millis() + 1000;
            PStart_86634752_1 = 0;
            PStop_86634752_1 = 0;
        }
        if (Press_86634752_1)
        {
            // если отпустили до Ptimer_86634752_1, считать отпущенной и обновить Dtimer_86634752_1
              if (!in_86634752_1 && !Release_86634752_1 && millis() < Ptimer_86634752_1) 
            {
                	Release_86634752_1 = 1;
                	Dtimer_86634752_1 = millis() + 250;
            }
            // если отпущено после Dtimer_86634752_1 но до Ptimer_86634752_1, зачесть одиночное нажатие
              if (Release_86634752_1 && !DoublP_86634752_1 && millis() > Dtimer_86634752_1 && millis() < Ptimer_86634752_1) 
            {
                	One_86634752_1 = 1;
                	Release_86634752_1 = 0;
                	Press_86634752_1 = 0;
            }
            // если отпущено и нажата снова до Dtimer_86634752_1, считать нажата два раза
              if (Release_86634752_1 && in_86634752_1 && millis() < Dtimer_86634752_1) 
            {
                	DoublP_86634752_1 = 1;
            }
            // если было двойное нажатие и отпущена, зачесть двойное нажатие
              if (DoublP_86634752_1 && !in_86634752_1) 
            {
                	Doubl_86634752_1 = 1;
                	DoublP_86634752_1 = 0;
                	Release_86634752_1 = 0;
                	Press_86634752_1 = 0;
            }
            // Если удерживается более Ptimer_86634752_1, запустить "во время удержания"
              if (in_86634752_1 && !DoublP_86634752_1 && millis() > Ptimer_86634752_1) 
            {
                	DurLong_86634752_1 = 1;
            }
            // Если отпустили после удержания, остановить  "во время удержания"
              if (!in_86634752_1 && DurLong_86634752_1) 
            {
                	DurLong_86634752_1 = 0;
                	Press_86634752_1 = 0;
            }
        }
    }
    bool  _tmp2 = DurLong_86634752_1;
    if (_tmp2)  
    {
         if (! _trgt2I) _trgt2 = ! _trgt2;
    }
    _trgt2I = _tmp2;
    bool  _tmp1 = One_86634752_1;
    if (_tmp1)  
    {
         if (! _trgt1I) _trgt1 = ! _trgt1;
    }
    _trgt1I = _tmp1;
    EN_145550790_7 = _trgt1;
    in_145550790_7 = String("INDUCT");
    size_145550790_7 = 2;
    X_145550790_7 = 0;
    Y_145550790_7 = 0;
    invert_145550790_7 = 1;
    if (EN_145550790_7==1)
    {
        if (invert_145550790_7==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_7,Y_145550790_7);
        display.setTextSize(size_145550790_7);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_7));
    }
    digitalWrite(5, _trgt1);
    bool  _tmp3 = Doubl_86634752_1;
    if (_tmp3)  
    {
         if (! _trgt3I) _trgt3 = ! _trgt3;
    }
    _trgt3I = _tmp3;
    digitalWrite(17, ((_trgt2) || (_trgt3)));
    _strFunsq1 = sq((_SCT_3)/(1.00));
    if((((1.00)/(((_strFunsq1)*(39.5))*(5.0e-11)))*(((map(((analogRead (2))), (0), (1023), (85), (110))))/(100.00))) >= (1000.00))
    {
        _swi5=(((_floatToStringWitRaz((((1.00)/(((_strFunsq1)*(39.5))*(5.0e-11)))*(((map(((analogRead (2))), (0), (1023), (85), (110))))/(100.00)))/(1000.00),1))) + (String("uF")));
    }
    else
    {
        _swi5=(((_floatToStringWitRaz(((1.00)/(((_strFunsq1)*(39.5))*(5.0e-11)))*(((map(((analogRead (2))), (0), (1023), (85), (110))))/(100.00)),1))) + (String("nF")));
    }
    if(_trgt3)
    {
        _swi4=_swi5;
    }
    else
    {
        _swi4=(((_floatToStringWitRaz((((1.00)/(((_strFunsq1)*(39.5))*(2.2e-8)))*(1000.00))*(((map(((analogRead (2))), (0), (1023), (85), (110))))/(100.00)),1))) + (String("mH")));
    }
    EN_145550790_8 = ((_trgt1) || (_trgt2) || (_trgt3));
    in_145550790_8 = _swi4;
    size_145550790_8 = 2;
    X_145550790_8 = 0;
    Y_145550790_8 = 16;
    invert_145550790_8 = 1;
    if (EN_145550790_8==1)
    {
        if (invert_145550790_8==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_8,Y_145550790_8);
        display.setTextSize(size_145550790_8);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_8));
    }
    digitalWrite(18, _trgt3);
    EN_145550790_6 = _trgt2;
    in_145550790_6 = String("CALIBR");
    size_145550790_6 = 2;
    X_145550790_6 = 0;
    Y_145550790_6 = 0;
    invert_145550790_6 = 1;
    if (EN_145550790_6==1)
    {
        if (invert_145550790_6==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_6,Y_145550790_6);
        display.setTextSize(size_145550790_6);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_6));
    }
    //Плата:2
//Наименование:ИЗМЕРЕНИЕ НАПРЯЖ. ПИТАНИЯ И ОПРЕД. КЗ
    if (!(_bounseInputD0O))
    {
        _count2_Value = 0;
    }
     else 
    {
        if (!(_bounseInputD6O))
        {
            if (! _count2I) 
            {
                _count2I = 1;
                _count2_Value = _count2_Value + 1;
            }
        }
         else 
        {
            _count2I = 0;
        }
    }
    if (!(_bounseInputD6O)) 
    {
        if (! _gen2I)
        {
            _gen2I = 1;
            _gen2O = 1;
            _gen2P = millis();
        }
    }
     else 
    {
        _gen2I = 0 ;
        _gen2O= 0;
    }
     if (_gen2I &&  _gen2O)   _gen2O = !(flprog::isTimer(_gen2P , 2));
    digitalWrite(7, ((_gen2O) && ((_count2_Value) <= (1))));
    if ((((analogRead (0)))/(102.3)) >= (6.00)) 
    {
        if (! _gen1I)
        {
            _gen1I = 1;
            _gen1O = 1;
            _gen1P = millis();
        }
    }
     else 
    {
        _gen1I = 0 ;
        _gen1O= 0;
    }
     if (_gen1I &&  _gen1O)   _gen1O = !(flprog::isTimer(_gen1P , 300));
    if(!(_bounseInputD15O)) _trgr1 = 0;
    if(_gen1O) _trgr1 = 1;
    digitalWrite(12, _trgr1);
    if ((((analogRead (0)))/(102.3)) >= (6.00))
    {
         if (_tim1I) 
        {
             if (flprog::isTimer(_tim1P, 3000)) 
            {
                _tim1O = 1;
            }
        }
         else 
        {
            _tim1I =1;
            _tim1P = millis();
        }
    }
     else 
    {
        _tim1O = 0;
        _tim1I = 0;
    }
    if(_tim1O)
    {
        _swi1=String("QUALIT");
    }
    else
    {
        _swi1=((String("BAT ")) + ((_floatToStringWitRaz(((analogRead (0)))/(102.3),1))) + (String("V")));
    }
    if(_trgt2)
    {
        _swi2=String("CALIBR");
    }
    else
    {
        _swi2=_swi1;
    }
    if(_trgt3)
    {
        _swi3=String("CAP");
    }
    else
    {
        _swi3=_swi2;
    }
    EN_145550790_1 = !(_trgt1);
    in_145550790_1 = _swi3;
    size_145550790_1 = 2;
    X_145550790_1 = 0;
    Y_145550790_1 = 0;
    invert_145550790_1 = !(0);
    if (EN_145550790_1==1)
    {
        if (invert_145550790_1==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_1,Y_145550790_1);
        display.setTextSize(size_145550790_1);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_1));
    }
    if(((micros()-_SCT_2P) >20000)||((micros()-_SCT_2P) <0))
    {
        _SCT_2 = _SCT_2IC;
        _SCT_2IC=0;
        _SCT_2P = micros();
    }
    if(!(_bounseInputD1O)) 
    {
        if (!_SCT_2_RCPIOS) 
        {
            _SCT_2_CPOP = 0;
            _SCT_2_RCPIOS = 1;
        }
    }
     else 
    {
        _SCT_2_RCPIOS = 0;
    }
    EN_145550790_5 = ((((_SCT_2_CPOP)/(2)) > (5)) && (!(_trgt1)));
    in_145550790_5 = String("VERY GOOD");
    size_145550790_5 = 2;
    X_145550790_5 = 0;
    Y_145550790_5 = 16;
    invert_145550790_5 = !(0);
    if (EN_145550790_5==1)
    {
        if (invert_145550790_5==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_5,Y_145550790_5);
        display.setTextSize(size_145550790_5);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_5));
    }
    EN_145550790_4 = ((((((_SCT_2_CPOP)/(2)) <= (5)) && (((_SCT_2_CPOP)/(2)) > (3)))) && (!(_trgt1)));
    in_145550790_4 = String("GOOD");
    size_145550790_4 = 2;
    X_145550790_4 = 0;
    Y_145550790_4 = 16;
    invert_145550790_4 = !(0);
    if (EN_145550790_4==1)
    {
        if (invert_145550790_4==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_4,Y_145550790_4);
        display.setTextSize(size_145550790_4);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_4));
    }
    EN_145550790_3 = ((((((_SCT_2_CPOP)/(2)) <= (3)) && (((_SCT_2_CPOP)/(2)) > (2)))) && (!(_trgt1)));
    in_145550790_3 = String("BAD");
    size_145550790_3 = 2;
    X_145550790_3 = 0;
    Y_145550790_3 = 16;
    invert_145550790_3 = !(0);
    if (EN_145550790_3==1)
    {
        if (invert_145550790_3==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_3,Y_145550790_3);
        display.setTextSize(size_145550790_3);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_3));
    }
    EN_145550790_2 = ((((((_SCT_2_CPOP)/(2)) <= (2)) && (((_SCT_2_CPOP)/(2)) >= (1)))) && (!(_trgt1)));
    in_145550790_2 = String("VERY BAD");
    size_145550790_2 = 2;
    X_145550790_2 = 0;
    Y_145550790_2 = 16;
    invert_145550790_2 = !(0);
    if (EN_145550790_2==1)
    {
        if (invert_145550790_2==1)
        	
        {
            display.setTextColor(WHITE, BLACK);
        }
        	else
        	 
        {
            display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(X_145550790_2,Y_145550790_2);
        display.setTextSize(size_145550790_2);
        //display.setTextColor(WHITE);  
        display.print(utf8rus(in_145550790_2));
    }
    display.display();
}
String  _floatToStringWitRaz(float value, int raz)
{
    return String(value,raz);
}
void  _SCT_3coutFunction()
{
     _SCT_3IC++;
}
void  _SCT_2coutFunction()
{
    _SCT_2_CPOP = _SCT_2_CPOP +1;
    _SCT_2IC++;
}
ISR (TIMER2_COMPA_vect)
{
    if(_sCHCV==10000) 
    {
        _sCHCV = 0;
        _SCT_3 = _SCT_3IC;
        _SCT_3IC = 0;
    }
     else 
    {
        _sCHCV++;
    }
}
String utf8rus(String source)
{
    /* Recode russian fonts from UTF-8 to Windows-1251 */

    int i,k;
    String target;
    unsigned char n;
    char m[2] = { '0', '\0' };
    k = source.length();
    i = 0;
    while (i < k) 
    {
        n = source[i];
        i++;
        if (n >= 0xC0) 
        {
            switch (n) 
            {
                case 0xD0: 
                {
                    n = source[i];
                    i++;
                    if (n == 0x81) 
                    {
                        n = 0xA8;
                        break;
                    }

                    if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
                    break;
                    

                }

                case 0xD1: 
                {
                    n = source[i];
                    i++;
                    if (n == 0x91) 
                    {
                        n = 0xB8;
                        break;
                    }

                    if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
                    break;
                    

                }

                

            }

            

        }

        m[0] = n;
        target = target + String(m);
        

    }

    return target;

}
