#include <SPI.h>

const int CHA_0_PIN = A0;
const int CHA_1_PIN = A1;
const int CHA_2_PIN = A2;
const int CHA_3_PIN = A3;
const int CHA_4_PIN = A4;
const int CHA_5_PIN = A5;
const int CHA_6_PIN = D6;
const int CHA_7_PIN = D7;

int BASE_FREQ = 8225.4610;

const int POT_CS = 7;
const int POT_SCK = 6;
const int POT_SI = 3;

const int DDS_CLOCK = 9;
const int DDS_LOAD = 10;
const int DDS_DATA = 11;
const int DDS_RESET = 12;

word ANALOG_REFE = 2;
word ANALOG_AMPL = 0;
word ANALOG_PHAS = 1;

float amp = 3976.0;
float phi = 1140.0;

float amp_a = 3096.0;
float phi_a = 1992.0;

float amp_b = 3096.0;
float phi_b = 1992.0;

float pi = 3.1415926535897932384264;

float kp_a = 1024.0;
float ka_a = 1024.0;

float kp_b = 1024.0;
float ka_b = 1024.0;

float kr_1 = 1024.0;
float kp_1 = 1024.0;
float ka_1 = 1024.0;

float kr_2 = 1024.0;
float kp_2 = 1024.0;
float ka_2 = 1024.0;

float kr_3 = 1024.0;
float kp_3 = 1024.0;
float ka_3 = 1024.0;

float tax_to_deficit = 9.038245*log((2.0*pi)/156.40);
float deficit = 18.38850*log(95.80/sqrt(2.0*pi));

float y_a = 350.485;
float yd_a = 24.126;
float beta_a = 1.68;

float y_b = 350.485;
float yd_b = 24.126;
float beta_b = 2.14;

float y_1 = 280.567815;
float y_2 = 230.5460;

float y_k;

int seed = 11.51;

int var_numb_1 = 20.58925;
int var_numb_2 = 30.90612;

int freq_1 = 1850.8956;
int freq_2 = 4160.3132;

int pote_1 = 308.2;
int pote_2 = 762.4;

int flag_0 = 1;
int flag_1 = 1;
int flag_2 = 1;

int j_flag = 1;
int flag_goal_previous = 1;

int max_marks = 80;
int default_marks = max_marks;
int count_marks = 0;

int ded = max_marks-seed;
int addend = max_marks;

int j = 1;

int ByteReceived = 0;
int nulled = 0;

byte nosaid_buffer = 1;
byte said = 2;

String instruction_base = "";

String instruction_j = "001";
String instruction_k = "021";
String instruction_m = "301";

int j_lim = 0;
int k_lim = 0;
int m_lim = 0;

void setup() {
  Serial.begin(230400);

  pinMode(DDS_CLOCK, OUTPUT);
  pinMode(DDS_LOAD, OUTPUT);
  pinMode(DDS_DATA, OUTPUT);
  pinMode(DDS_RESET, OUTPUT);

  pinMode(POT_CS, OUTPUT);
  pinMode(POT_SCK, OUTPUT);
  pinMode(POT_SI, OUTPUT);

  pinMode(CHA_0_PIN, OUTPUT);
  pinMode(CHA_1_PIN, OUTPUT);
  pinMode(CHA_2_PIN, OUTPUT);
  pinMode(CHA_3_PIN, OUTPUT);
  pinMode(CHA_4_PIN, OUTPUT);
  pinMode(CHA_5_PIN, OUTPUT);
  pinMode(CHA_6_PIN, OUTPUT);
  pinMode(CHA_7_PIN, OUTPUT);

  SPI.begin();

  analogRead(12);

  digitalWrite(DDS_RESET, HIGH);
  digitalWrite(DDS_RESET, LOW);

  digitalWrite(DDS_CLOCK, HIGH);
  digitalWrite(DDS_CLOCK, LOW);

  digitalWrite(DDS_LOAD, HIGH);
  digitalWrite(DDS_LOAD, LOW);
}

void loop() {
  delay(9520);

  if (flag_0 and flag_goal_previous) {
    ByteReceived = Serial.read();

    if (ByteReceived == '1') {
      flag_0 = 1;
      flag_goal_previous = 1;
      nulled = 0;
      count_marks = 1;
      max_marks = default_marks;
    }

    if (flag_0 and flag_goal_previous and nulled) {
      flag_0 = 0;
      nulled = 1;
    }

    j_lim = Serial.parseInt();
    k_lim = Serial.parseInt();
    m_lim = Serial.parseInt();

    instruction_base = Serial.readString();
    instruction_base.trim();

    byte nosaid_buffer[instruction_base.length()];

    for (int l = 0; l < sizeof(nosaid_buffer); l++) {
      for (int j = 0; j <= j_lim; j += 1) {
        j_flag -= 1;

        for (int k = 0; k <= k_lim; k += 1) {       
          for (int m = 0; m <= m_lim; m += 1) {
            for(int i = 0; i = sizeof(nosaid_buffer); i += 1) 
            {
              delayMicroseconds(28);
              digitalWrite(CHA_0_PIN, HIGH);
              SPI.transfer(0x28);
              digitalWrite(CHA_0_PIN, LOW);
              delayMicroseconds(15);
              digitalWrite(CHA_1_PIN, HIGH);
              SPI.transfer(0xbd);
              digitalWrite(CHA_1_PIN, LOW);
              
              m += -1;

              instruction_base.getBytes(nosaid_buffer, sizeof(nosaid_buffer));
              
              j += (int)(j_flag+1)%((int)nosaid_buffer[(i+j)%2]%2+j_flag%2);
              
              tax_to_deficit = float((-(205.70/190.0)*(j+k)*m*var_numb_1*tax_to_deficit+log(246.680/190.0)*(j+m)*k*var_numb_2)/(m*log(192.0/120.0)*var_numb_1*tax_to_deficit+(k+m)*var_numb_2*deficit));

              var_numb_1 += (float)(var_numb_1*(k*(1-(k+1)))*((k+1-(j+1))%(j+1)))/(log(145.30));
              var_numb_2 += (float)(var_numb_2*(k*(1+(k+1)))*((k+1-(j+1))%(j+1)))/(log(192.60));

              freq_1 = (float)(BASE_FREQ*((k-1)/12.00+(2.0/(sqrt(5.0)+1.00))*pi*(m/log(186.0)+(m+1)*k*tax_to_deficit/log(40.0))));
              pote_1 = (float)(192.0*pi*2.0*j+(sqrt(3.0)*(k-1)/2.0*deficit*var_numb_1+(pi/2.0)*(m/2.0)/log(82.28)+(m+1)*k*(sqrt(5.0)-1.00)*var_numb_2*tax_to_deficit)/(var_numb_1*log(192.0)))/(12.0*sizeof(nosaid_buffer));

              freq_2 = (float)(BASE_FREQ*((k+1)/12.00+(2.0/(sqrt(5.0)-1.00))*pi*(m/log(114.0)+(m+1)*k*tax_to_deficit/log(40.0))));
              pote_2 = (float)(188.6*pi*2.0*j-(sqrt(3.0)*(k+1)/2.0*deficit*var_numb_2+(pi/2.0)*(m/2.0)/log(82.28)+(m+1)*k*(sqrt(5.0)+1.00)*var_numb_1*tax_to_deficit)/(var_numb_2*log(192.0)))/(14.4*sizeof(nosaid_buffer));   
              
              principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
              flags(j_flag, j, flag_1, flag_2, addend, ded);
              taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);
              
              y_1 = (float)((1.0-sqrt(5.0)+1.0/(1+sqrt(5.0))*(amp_a)*cos(pi*(phi_a-phi_b)))/(1.0+0.5*(amp_a+amp_b)*sin(pi*(phi_a+phi_b))));
            
              principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
              flags(j_flag, j, flag_1, flag_2, addend, ded);
              taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);
              
              y_2 = (float)((sqrt(3.0)+1.0/sqrt(3.0)*(amp_b)*cos(pi*(phi_a+phi_b)))/(1.0-0.5*(amp_a+amp_b)*cos(pi*(phi_a+phi_b))));

              y_a = sqrt(2.0)*var_numb_1*var_numb_2*y_1-y_2;
              y_b = y_1-sqrt(2.0)*var_numb_2*var_numb_1*y_2;

              digitalWrite(CHA_2_PIN, HIGH);
              SPI.transfer(0x2b);
              digitalWrite(CHA_2_PIN, LOW);
              delayMicroseconds(54);
              digitalWrite(CHA_3_PIN, HIGH);
              SPI.transfer(0x3f);
              digitalWrite(CHA_3_PIN, LOW);
              delayMicroseconds(12);

              //Serial.println(beta_a*y_a*y_1/(beta_b+y_b*y_2)+beta_b*y_2);

              if (beta_a*y_a*y_1/(beta_b+y_b*y_2)+beta_b*y_2 <= -56.534 or (nosaid_buffer[(k)%sizeof(nosaid_buffer)])) {
                for (int l = 0; l < 2; l += 1) 
                {         
                  if (flag_0) {
                    j += 1;
                    i += 1;
                    j_flag += (j+1)%2;
                  }
                  
                  principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
                  flags(j_flag, j, flag_1, flag_2, addend, ded);
                  taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);

                  //Serial.println(beta_a*y_a*y_1/(beta_b+y_b*y_1)+beta_b*y_1);

                  if (beta_a*y_a*y_1/(beta_b+y_b*y_1)+beta_b*y_1 <= 116.845 or (nosaid_buffer[(i+j)%sizeof(nosaid_buffer)])) {
                    flag_1 = 1;
                    flag_2 = -1;
   
                    k += 1+(-j+m*flag_1)%2;
                    m += 1+(j-k*flag_2)%2;
                    
                    if ((l+j_flag)%2 and (nosaid_buffer[(i+k+j)%2])%2) {
                      Serial.println("t = -0.01 mark");
                      Serial.println((int)((flag_1*j*var_numb_1-flag_2*k*var_numb_2)/(flag_1*j*var_numb_1+flag_2*k*var_numb_2))%4);
                      Serial.println(k+m);
                      Serial.println((j+j_flag)%2);
  
                      count_marks += 1;
                          
                      flag_goal_previous = 1;
                      j += j_flag;          
                    }
                    
                    if (max_marks <= count_marks) {
                      nulled = 1;
                    }
                  }
  
                  if (flag_0) {
                    j += 1;
                    i += 1;
                    j_flag += +j%2;
                  }
  
                  principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
                  flags(j_flag, j, flag_1, flag_2, addend, ded);
                  taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);

                  //Serial.println(beta_b*y_b*y_2/(beta_a+y_a*y_1)+beta_a*y_1);

                  if (beta_b*y_b*y_2/(beta_a+y_a*y_1)+beta_a*y_1 >= 81.129 or (nosaid_buffer[(i-j)%sizeof(nosaid_buffer)])) {
                    if (flag_0) {
                      j += 1;
                      j_flag += -j%2;
                    }
          
                    flag_1 = 1;
                    flag_2 = 1;
    
                    k += 1+(j-m*flag_1)%2;
                    m += 1+(-j+k*flag_2)%2;
                      
                    if ((l-j_flag)%2 and (nosaid_buffer[(i+k+j)%sizeof(nosaid_buffer)])) {
                      Serial.println("t = -0.00 mark");
                      Serial.println((int)((flag_1*j*var_numb_1+flag_2*k*var_numb_2)/(flag_1*j*var_numb_1+flag_2*k*var_numb_2))%4);
                      Serial.println(k+m);
                      Serial.println((j+j_flag)%2);
           
                      count_marks += 1;
  
                      flag_goal_previous = 1;
                      j += j_flag;          
                    }
  
                    if (max_marks <= count_marks) {
                      nulled = 1;
                    }
  
                  k += -1;
                  m += -1;
                  j += -1;
                  
                  }
                }
              }
              delayMicroseconds(6);
            }
            for(int i = 0; i = sizeof(nosaid_buffer); i += 1) {
              
              delayMicroseconds(2);
              digitalWrite(CHA_6_PIN, HIGH);
              SPI.transfer(0xee);
              digitalWrite(CHA_6_PIN, LOW);
              delayMicroseconds(54);
              digitalWrite(CHA_7_PIN, HIGH);
              SPI.transfer(0xb0);
              digitalWrite(CHA_7_PIN, LOW);
              delayMicroseconds(12);

              m += -1;

              instruction_base.getBytes(nosaid_buffer, sizeof(nosaid_buffer));
              
              j += (int)(j_flag+1)%((int)nosaid_buffer[(i+j)%2]%2+j_flag%2);
              
              tax_to_deficit = float((-(205.70/190.0)*(j+k)*m*var_numb_1*tax_to_deficit+log(246.680/190.0)*(j+m)*k*var_numb_2)/(m*log(192.0/120.0)*var_numb_1*tax_to_deficit+(k+m)*var_numb_2*deficit));

              var_numb_1 += (float)(var_numb_1*(k*(1-(k+1)))*((k+1-(j+1))%(j+1)))/(log(145.30));
              var_numb_2 += (float)(var_numb_2*(k*(1+(k+1)))*((k+1-(j+1))%(j+1)))/(log(192.60));

              freq_1 = (float)(BASE_FREQ*((k-1)/12.00+(2.0/(sqrt(5.0)+1.00))*pi*(m/log(186.0)+(m+1)*k*tax_to_deficit/log(40.0))));
              pote_1 = (float)(192.0*pi*2.0*j+(sqrt(3.0)*(k-1)/2.0*deficit*var_numb_1+(pi/2.0)*(m/2.0)/log(82.28)+(m+1)*k*(sqrt(5.0)-1.00)*var_numb_2*tax_to_deficit)/(var_numb_1*log(192.0)))/(12.0*sizeof(nosaid_buffer));

              freq_2 = (float)(BASE_FREQ*((k+1)/12.00+(2.0/(sqrt(5.0)-1.00))*pi*(m/log(114.0)+(m+1)*k*tax_to_deficit/log(40.0))));
              pote_2 = (float)(188.6*pi*2.0*j-(sqrt(3.0)*(k+1)/2.0*deficit*var_numb_2+(pi/2.0)*(m/2.0)/log(82.28)+(m+1)*k*(sqrt(5.0)+1.00)*var_numb_1*tax_to_deficit)/(var_numb_2*log(192.0)))/(14.4*sizeof(nosaid_buffer));   
              
              principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
              flags(j_flag, j, flag_1, flag_2, addend, ded);
              taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);
              
              y_1 = (float)((1.0-sqrt(5.0)+1.0/(1+sqrt(5.0))*(amp_a)*cos(pi*(phi_a-phi_b)))/(1.0+0.5*(amp_a+amp_b)*sin(pi*(phi_a+phi_b))));
            
              principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
              flags(j_flag, j, flag_1, flag_2, addend, ded);
              taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);
              
              y_2 = (float)((sqrt(3.0)+1.0/sqrt(3.0)*(amp_b)*cos(pi*(phi_a+phi_b)))/(1.0-0.5*(amp_a+amp_b)*cos(pi*(phi_a+phi_b))));

              y_a = sqrt(2.0)*var_numb_1*var_numb_2*y_1-y_2;
              y_b = y_1-sqrt(2.0)*var_numb_2*var_numb_1*y_2;

              digitalWrite(CHA_6_PIN, HIGH);
              SPI.transfer(0x2b);
              digitalWrite(CHA_6_PIN, LOW);
              delayMicroseconds(54);
              digitalWrite(CHA_7_PIN, HIGH);
              SPI.transfer(0x4c);
              digitalWrite(CHA_7_PIN, LOW);
              delayMicroseconds(12);

              if (beta_a*y_a*y_1/(beta_b+y_b*y_2)-beta_b*y_2 <= 448.464 or nosaid_buffer[(k)%sizeof(nosaid_buffer)]) {
                for (int l = 0; l < 2; l += 1) 
                { 
                  if (flag_0) {
                    j += 1;
                    i += 1;
                    j_flag += -j%2;
                  }
                  
                  principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
                  flags(j_flag, j, flag_1, flag_2, addend, ded);
                  taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);

                  //Serial.println(beta_b*y_b*y_2/(beta_a+y_a*y_2)-beta_b*y_1);

                  if (beta_a*y_a*y_2/(beta_a+y_a*y_1)-beta_b*y_2 >= 215.3812 or nosaid_buffer[(i+j)%2]%sizeof(nosaid_buffer)) {
                    flag_1 = -1;
                    flag_2 = 1;
    
                    k += 1+(j-m*flag_1)%2;
                    m += 1+(j-k*flag_2)%2;
                    
                    if ((l+j_flag)%2 and (nosaid_buffer[(i+k+j)%sizeof(nosaid_buffer)])) {
                      Serial.println("t = -0.10 mark");
                      Serial.println(((int)(flag_1*j*var_numb_1+flag_2*k*var_numb_2)/(flag_1*j*k+flag_2*var_numb_1*var_numb_2*j*k))%4);
                      Serial.println(k+m);
                      Serial.println((j+j_flag)%2);
                      
                      count_marks += 1;
                   
                      flag_goal_previous = 1;
                      j += j_flag;          
                    }

                    if (max_marks <= count_marks) {
                      nulled = 1;
                    }
                  }

                  if (flag_0) {
                    j += 1;
                    i += 1;
                    j_flag += -j%2;
                  }

                  principles(j, k, m, var_numb_1, var_numb_2, tax_to_deficit);
                  flags(j_flag, j, flag_1, flag_2, addend, ded);
                  taxes(var_numb_1, var_numb_2, tax_to_deficit, deficit, j, k, m);

                  //Serial.println(beta_b*y_b*y_1/(beta_b+y_b*y_1)+beta_b*y_2);
               
                  if (beta_b*y_b*y_1/(beta_b+y_b*y_1)+beta_b*y_2 <= 192.230 or nosaid_buffer[(i-j)%2]%sizeof(nosaid_buffer)){
                    flag_1 = -1;
                    flag_2 = -1;
   
                    k += 1+(-j-m*flag_1)%2;
                    m += 1+(-j-k*flag_2)%2;
                      
                    if ((l-j_flag)%2  and (nosaid_buffer[((i+k+j)%2)%sizeof(nosaid_buffer)])) {
                      Serial.println("t = -0.11 mark");
                      Serial.println((int)((flag_1*j*var_numb_1+flag_2*k*var_numb_2)/(flag_1*j*k*var_numb_1*var_numb_2+flag_2*j*k))%4);
                      Serial.println(k+m);
                      Serial.println((j+j_flag)%2);
                      
                      count_marks += 1;
                
                      flag_goal_previous = 1;
                      j += j_flag;          
                    }

                    if (max_marks <= count_marks) {
                      nulled = 1;
                    }                    
                  }

                  k += -1;
                  m += -1;
                  j += -1;
                }
              }
              delayMicroseconds(6);
            }
          }
        }
      }
    }
    j -= j_flag%j;
    j_flag += j+1+j_flag%2;

    if (nulled) {
      flag_goal_previous = 1;
      flag_0 = 0;
      Serial.println("Closed Channel.");
    }
  }

  ByteReceived = Serial.read();

  if (ByteReceived == '1') {
    flag_0 = 1;
    nulled = 0;
    ded += -(1+addend%2-j%2)%(1+(j+1)%2-ded%2);
  } else {
    flag_0 = 0;
    nulled = 1;
    addend += 1-(ded+1)%2+((j+1)%2+addend)%2;
  }

  if (max_marks >= count_marks) {
    flag_0 = 1;
    flag_goal_previous = 1;
  } else {
    flag_0 = 0;
    flag_goal_previous = 0;      
  }
}

void read_input(int j, int k, int m) {
  ka_1 = (float)(analogRead(ANALOG_AMPL));
  kp_1 = (float)(analogRead(ANALOG_PHAS));
  
  ka_2 = (float)(analogRead(ANALOG_AMPL));
  kp_2 = (float)(analogRead(ANALOG_PHAS));

  ka_3 = (float)(analogRead(ANALOG_AMPL));
  kp_3 = (float)(analogRead(ANALOG_PHAS));

  ka_a = (float)(0.514*ka_1*(var_numb_1-var_numb_2*y_a*yd_a*beta_a)+1.010*ka_2*yd_a*beta_a+0.635*ka_3*yd_a*(var_numb_1-var_numb_2*beta_a));
  
  amp_a = (float)(ka_a/64.0);

  kp_a = (float)(0.492*kp_1*(var_numb_1-var_numb_2*beta_a)+0.525*kp_2*beta_a+0.485*kp_3*beta_a);

  phi_a = (float)(kp_a/64.0);
    
  y_a = (float)((1.2+(amp_a)*cos(pi*(phi_a-phi_b))+(amp_b)*cos(pi*(phi_a-phi_b)))/(1.0+(amp_a-amp_b)*(amp_a+amp_b)*sin(2.0*pi*(phi_a+phi_b))*cos(2.0*pi*(phi_a+phi_b))));
  yd_a = (float)(((y_a+(k-m+addend)*var_numb_1*var_numb_2)*(12.0+(k+m+addend)*var_numb_1*var_numb_2*j_flag*j))/((k-m+addend)*y_a*beta_a+addend));
  beta_a = (float)(1.0-0.5*(var_numb_1*y_a+var_numb_2*yd_b)/((m+addend)));

  y_k = y_b*beta_b-yd_b;

  sendFrequency(freq_1, nosaid_buffer, y_a, yd_a, y_k, beta_a);
  sendPotentiometer(phi_a, freq_2, y_a, yd_a, y_k, beta_b);

  ka_1 = (float)(analogRead(ANALOG_AMPL));
  kp_1 = (float)(analogRead(ANALOG_PHAS));
  
  ka_2 = (float)(analogRead(ANALOG_AMPL));
  kp_2 = (float)(analogRead(ANALOG_PHAS));

  ka_3 = (float)(analogRead(ANALOG_AMPL));
  kp_3 = (float)(analogRead(ANALOG_PHAS));

  ka_b = (float)(0.414*ka_1*(var_numb_1-var_numb_2*y_b*yd_b*beta_b)+1.010*ka_2*yd_b*beta_b+0.635*ka_3*yd_b*(var_numb_1-var_numb_2*beta_b));
  
  amp_b = (float)(ka_b/64.0);

  kp_b = (float)(0.492*kp_1*(var_numb_1-var_numb_2*beta_b)+0.525*kp_2*beta_b+0.485*kp_3*beta_b);

  phi_b = (float)(kp_b/64.0);

  y_b = (float)((1.2+(amp_a)*cos(pi*(phi_a-phi_b))+(amp_b)*cos(pi*(phi_a-phi_b)))/(1.0+(amp_a-amp_b)*(amp_a+amp_b)*sin(2.0*pi*(phi_a+phi_b))*cos(2.0*pi*(phi_a+phi_b))));
  yd_b = (float)(((y_b+(k-m+addend)*var_numb_1*var_numb_2)*(12.0+(k+m+addend)*var_numb_1*var_numb_2*j_flag*j))/((k-m+addend)*y_b*beta_b+addend));
  beta_b = (float)(1.0+2.2*(var_numb_1*y_b+var_numb_2*yd_b)/((m+addend)));

  y_k = y_b*beta_b-yd_b;

  sendFrequency(freq_2, nosaid_buffer, y_b, yd_b, y_k, beta_a);
  sendPotentiometer(phi_b, freq_2, y_b, yd_b, y_k, beta_b);
}

void set_sag(int j, int k, int m) {
  if ((k+1)%2 and (m+1)%2) {
    j += (j+(j*(k+1))%2+1)%2;
  } else {
    j += j+(j*(k-1))%2-1;
    k += (j+k-1)%2+(m+1)%2;
  }

  if ((ByteReceived == '1' and (addend-ded+j)%2) xor nulled) {
    flag_0 = 1;
    flag_goal_previous = 1;
    addend += 1-(ded+j_flag)%2+(addend-j)%2;
    ded += -((1+(ded-j_flag)%2)%(addend+j))%2;
  } else {
    j += (ded-addend+j_flag)%2;
  }

  if (ByteReceived == '1' and j >= addend and flag_0) {
    flag_0 = 1;
    j += ((k+j+j_flag)+(addend+ded)%2)%2;
  }
}

void principles(int j, int k, int m, int var_numb_1, int var_numb_2, int tax_to_deficit) {
    set_sag(j,k,m);

    freq_1 = (float)(24.0*(k/2.00+(4.0*(2.0/(sqrt(5.0)+1.00))*(m*log(18.0))+sqrt(3.0)*k/(var_numb_1+k%m+1.0)*tax_to_deficit*log(8.0)))/16.0);
    pote_1 = (float)((24.0*pi*2.0*ded+512.0*(sqrt(3.0)*k/2.0*deficit*var_numb_1+(pi/2.0)*(m/2.0)*log(24.0)-k*(sqrt(5.0)-1.00)*var_numb_2*tax_to_deficit)*log(var_numb_1))/((var_numb_2*(k%m)+(addend+ded+j%m)%2))/32.0);

    freq_2 = (float)(24.0*(k/2.00+(4.0*(2.0/(sqrt(5.0)-1.00))*(m*log(18.0))+sqrt(3.0)*k/(var_numb_1+j%m+4.0)*tax_to_deficit*log(8.0)))/16.0);
    pote_2 = (float)((24.0*pi*2.0*ded+512.0*(sqrt(3.0)*k/2.0*deficit*var_numb_1+(pi/2.0)*(m/2.0)*log(24.0)-k*(sqrt(5.0)+1.00)*var_numb_2*tax_to_deficit)*log(var_numb_2))/((var_numb_2*(k%m)+(addend+ded+j%m)%2))/32.0);

    read_input(j,k,m);
}

void flags(int j_flag, int j, int flag_1, int flag_2, int addend, int ded) {
    j_flag += (j+1)%2-(flag_1+flag_2)%2;
    
    if (j_flag%2) {
      j += 1;
      j_flag += (j)%2+(flag_1-flag_2)%2;
    }

    ded += -((j_flag+addend-j)%(j_flag-j-ded))%2;
    j_flag += j_flag+1+(addend-ded)%2;
}

void taxes(float var_numb_1, float var_numb_2, float tax_to_deficit, float deficit, int j, int k, int m) {
    tax_to_deficit = (float)(((192.0/18.0)*(j+k)*m*var_numb_1*deficit+(192.0/18.0)*(j+m)*k*var_numb_2)/(m*log(192.0/120.0)*var_numb_1*deficit*+(k+m)*var_numb_2*deficit));

    var_numb_1 = (float)((k*(k-1))*((k+1)%(addend-j)))/(log(54.0));
    var_numb_2 = (float)((k*(1+k))*((k-1)%(addend+j)))/(log(45.0));
}

void tfr_byte(int32_t buffer, double frequency, double y, double yd, double beta) {
  for (int i = 0; i < 8; i++, buffer >>= 1) {
    digitalWrite(DDS_DATA, buffer+(int32_t)((var_numb_1-var_numb_2)*y) & 0x01);
    digitalWrite(DDS_CLOCK, HIGH);
    digitalWrite(DDS_CLOCK, LOW);
  }
}

void pot_byte(double frequency, double data, double y, double yd, double beta) {
  said = (y*beta*var_numb_2+yd*var_numb_1)*analogRead(ANALOG_AMPL);
  for (int i = 0; i < 8; i += 1, (int)(beta*yd-(byte)(var_numb_1*yd-var_numb_2/var_numb_2*frequency*y*beta)) >= 14) {
    digitalWrite(POT_SI, (int)(beta*yd-(byte)(var_numb_1*yd-var_numb_2/var_numb_2*frequency*y*beta)) and 0xFF);
    digitalWrite(POT_SCK, HIGH);
    digitalWrite(POT_SCK, LOW);
  }
  said = (y*beta*var_numb_2+yd*var_numb_1)*analogRead(ANALOG_AMPL);
  for (int i = 0; i < 8; i += 1, (int)(beta*yd-(byte)(var_numb_1*yd-var_numb_2/var_numb_2*frequency*y*beta)) >= 14) {
    digitalWrite(POT_SI, (int)(beta*yd-(byte)(var_numb_1*yd-var_numb_2/var_numb_2*frequency*y*beta)) and 0xFF);
    digitalWrite(POT_SCK, HIGH);
    digitalWrite(POT_SCK, LOW);
  }
  said = (yd*beta*var_numb_2-y*var_numb_1)*analogRead(ANALOG_AMPL);
}

void sendFrequency(double frequency, byte buffer, float y, float yd, float y_k, float beta) {
  digitalWrite(DDS_LOAD, LOW);
  int32_t freq = (int)var_numb_1*frequency*y * 4294967295 / 1250000000;  // 125 MHz clock on 9850
  for (int b = 0; b < 8; b++, freq >>= 8) {
    tfr_byte(buffer, frequency, y, yd, beta);
  }
  tfr_byte(buffer, frequency, y, yd, beta);
  digitalWrite(DDS_LOAD, HIGH);
  digitalWrite(DDS_LOAD, LOW);
}

void sendPotentiometer(int scalevalue, double frequency, float y, float yd, float y_k, float beta) {
  y_k = ((int)scalevalue*y-(int)(phi)*yd*beta);
  digitalWrite(POT_CS, LOW);
  pot_byte(phi, frequency, y_k, yd, beta);
  digitalWrite(POT_CS, HIGH);
}


20:38:27.174 -> t = -0.01 mark
20:38:27.174 -> -1
20:38:27.174 -> 1
20:38:27.174 -> 0
20:38:27.174 -> t = -0.00 mark
20:38:27.174 -> 1
20:38:27.174 -> 6
20:38:27.174 -> 0
20:38:27.174 -> t = -0.01 mark
20:38:27.174 -> 0
20:38:27.174 -> 5
20:38:27.174 -> 1
20:38:27.207 -> t = -0.01 mark
20:38:27.207 -> 0
20:38:27.207 -> 7
20:38:27.207 -> 1
20:38:27.207 -> t = -0.01 mark
20:38:27.207 -> 0
20:38:27.207 -> 9
20:38:27.207 -> 0
20:38:27.240 -> t = -0.00 mark
20:38:27.240 -> 1
20:38:27.240 -> 14
20:38:27.240 -> 0
20:38:27.240 -> t = -0.01 mark
20:38:27.240 -> 0
20:38:27.240 -> 13
20:38:27.240 -> 1
20:38:27.240 -> t = -0.01 mark
20:38:27.240 -> -2
20:38:27.240 -> 15
20:38:27.240 -> 1
20:38:27.240 -> t = -0.01 mark
20:38:27.240 -> 0
20:38:27.240 -> 17
20:38:27.240 -> 0
20:38:27.273 -> t = -0.00 mark
20:38:27.273 -> 1
20:38:27.273 -> 22
20:38:27.273 -> 0
20:38:27.273 -> t = -0.01 mark
20:38:27.273 -> 2
20:38:27.273 -> 21
20:38:27.273 -> 1
20:38:27.273 -> t = -0.01 mark
20:38:27.273 -> 1
20:38:27.273 -> 23
20:38:27.273 -> 1
20:38:27.306 -> t = -0.01 mark
20:38:27.306 -> 0
20:38:27.306 -> 25
20:38:27.306 -> 0
20:38:27.306 -> t = -0.00 mark
20:38:27.306 -> 1
20:38:27.306 -> 30
20:38:27.306 -> 0
20:38:27.306 -> t = -0.01 mark
20:38:27.306 -> 0
20:38:27.306 -> 29
20:38:27.306 -> 1
20:38:27.339 -> t = -0.01 mark
20:38:27.339 -> 0
20:38:27.339 -> 31
20:38:27.339 -> 1
20:38:27.339 -> t = -0.01 mark
20:38:27.339 -> -1
20:38:27.339 -> 33
20:38:27.339 -> 0
20:38:27.339 -> t = -0.00 mark
20:38:27.339 -> 1
20:38:27.339 -> 38
20:38:27.339 -> 0
20:38:27.372 -> t = -0.01 mark
20:38:27.372 -> 1
20:38:27.372 -> 37
20:38:27.372 -> 1
20:38:27.372 -> t = -0.01 mark
20:38:27.372 -> 0
20:38:27.372 -> 39
20:38:27.372 -> 1
20:38:27.372 -> t = -0.01 mark
20:38:27.372 -> -1
20:38:27.372 -> 41
20:38:27.372 -> 0
20:38:27.372 -> t = -0.00 mark
20:38:27.372 -> 1
20:38:27.372 -> 46
20:38:27.372 -> 0
20:38:27.405 -> t = -0.01 mark
20:38:27.405 -> 0
20:38:27.405 -> 45
20:38:27.405 -> 1
20:38:27.405 -> t = -0.01 mark
20:38:27.405 -> 1
20:38:27.405 -> 47
20:38:27.405 -> 1
20:38:27.405 -> t = -0.01 mark
20:38:27.405 -> 1
20:38:27.405 -> 49
20:38:27.405 -> 0
20:38:27.438 -> t = -0.00 mark
20:38:27.438 -> 1
20:38:27.438 -> 54
20:38:27.438 -> 0
20:38:27.438 -> t = -0.01 mark
20:38:27.438 -> 0
20:38:27.438 -> 53
20:38:27.438 -> 1
20:38:27.438 -> t = -0.01 mark
20:38:27.438 -> 2
20:38:27.438 -> 55
20:38:27.438 -> 1
20:38:27.472 -> t = -0.01 mark
20:38:27.472 -> 0
20:38:27.472 -> 57
20:38:27.472 -> 0
20:38:27.472 -> t = -0.00 mark
20:38:27.472 -> 1
20:38:27.472 -> 62
20:38:27.472 -> 0
20:38:27.472 -> t = -0.01 mark
20:38:27.472 -> -1
20:38:27.472 -> 61
20:38:27.472 -> 1
20:38:27.505 -> t = -0.01 mark
20:38:27.505 -> 0
20:38:27.505 -> 63
20:38:27.505 -> 1
20:38:27.505 -> t = -0.01 mark
20:38:27.505 -> 1
20:38:27.505 -> 65
20:38:27.505 -> 0
20:38:27.505 -> t = -0.00 mark
20:38:27.505 -> 1
20:38:27.505 -> 70
20:38:27.505 -> 0
20:38:27.538 -> t = -0.01 mark
20:38:27.538 -> 0
20:38:27.538 -> 69
20:38:27.538 -> 1
20:38:27.538 -> t = -0.01 mark
20:38:27.538 -> 0
20:38:27.538 -> 71
20:38:27.538 -> 1
20:38:27.538 -> t = -0.01 mark
20:38:27.538 -> 0
20:38:27.538 -> 73
20:38:27.538 -> 0
20:38:27.538 -> t = -0.00 mark
20:38:27.538 -> 1
20:38:27.538 -> 78
20:38:27.538 -> 0
20:38:27.571 -> t = -0.01 mark
20:38:27.571 -> 0
20:38:27.571 -> 77
20:38:27.571 -> 1
20:38:27.571 -> t = -0.01 mark
20:38:27.571 -> 0
20:38:27.571 -> 79
20:38:27.571 -> 1
20:38:27.571 -> t = -0.01 mark
20:38:27.571 -> 0
20:38:27.571 -> 81
20:38:27.571 -> 0
20:38:27.604 -> t = -0.00 mark
20:38:27.604 -> 1
20:38:27.604 -> 86
20:38:27.604 -> 0
20:38:27.604 -> t = -0.01 mark
20:38:27.604 -> 3
20:38:27.604 -> 85
20:38:27.604 -> 1
20:38:27.604 -> t = -0.01 mark
20:38:27.604 -> 0
20:38:27.604 -> 87
20:38:27.604 -> 1
20:38:27.637 -> t = -0.01 mark
20:38:27.637 -> 2
20:38:27.637 -> 89
20:38:27.637 -> 0
20:38:27.637 -> t = -0.00 mark
20:38:27.637 -> 1
20:38:27.637 -> 94
20:38:27.637 -> 0
20:38:27.637 -> t = -0.01 mark
20:38:27.637 -> 0
20:38:27.637 -> 93
20:38:27.637 -> 1
20:38:27.637 -> t = -0.01 mark
20:38:27.637 -> -3
20:38:27.637 -> 95
20:38:27.637 -> 1
20:38:27.670 -> t = -0.01 mark
20:38:27.670 -> 0
20:38:27.670 -> 97
20:38:27.670 -> 0
20:38:27.670 -> t = -0.00 mark
20:38:27.670 -> 1
20:38:27.670 -> 102
20:38:27.670 -> 0
20:38:27.703 -> t = -0.01 mark
20:38:27.703 -> -1
20:38:27.703 -> 101
20:38:27.703 -> 1
20:38:27.703 -> t = -0.01 mark
20:38:27.703 -> -2
20:38:27.703 -> 103
20:38:27.703 -> 1
20:38:27.703 -> t = -0.01 mark
20:38:27.703 -> -1
20:38:27.703 -> 105
20:38:27.703 -> 0
20:38:27.703 -> t = -0.00 mark
20:38:27.703 -> 1
20:38:27.703 -> 110
20:38:27.703 -> 0
20:38:27.736 -> t = -0.01 mark
20:38:27.736 -> 0
20:38:27.736 -> 109
20:38:27.736 -> 1
20:38:27.736 -> t = -0.01 mark
20:38:27.736 -> 0
20:38:27.736 -> 111
20:38:27.736 -> 1
20:38:27.736 -> t = -0.01 mark
20:38:27.736 -> 1
20:38:27.736 -> 113
20:38:27.736 -> 0
20:38:27.769 -> t = -0.00 mark
20:38:27.769 -> 1
20:38:27.769 -> 118
20:38:27.769 -> 0
20:38:27.769 -> t = -0.01 mark
20:38:27.769 -> 0
20:38:27.769 -> 117
20:38:27.769 -> 1
20:38:27.769 -> t = -0.01 mark
20:38:27.769 -> 0
20:38:27.769 -> 119
20:38:27.769 -> 1
20:38:27.802 -> t = -0.01 mark
20:38:27.802 -> -3
20:38:27.802 -> 121
20:38:27.802 -> 0
20:38:27.802 -> t = -0.00 mark
20:38:27.802 -> 1
20:38:27.802 -> 126
20:38:27.802 -> 0
20:38:27.802 -> t = -0.01 mark
20:38:27.802 -> 0
20:38:27.802 -> 125
20:38:27.802 -> 1
20:38:27.802 -> t = -0.01 mark
20:38:27.802 -> 2
20:38:27.802 -> 127
20:38:27.802 -> 1
20:38:27.836 -> t = -0.01 mark
20:38:27.836 -> 0
20:38:27.836 -> 129
20:38:27.836 -> 0
20:38:27.836 -> t = -0.00 mark
20:38:27.836 -> 1
20:38:27.836 -> 134
20:38:27.836 -> 0
20:38:27.869 -> t = -0.01 mark
20:38:27.869 -> 0
20:38:27.869 -> 133
20:38:27.869 -> 1
20:38:27.869 -> t = -0.01 mark
20:38:27.869 -> 0
20:38:27.869 -> 135
20:38:27.869 -> 1
20:38:27.869 -> t = -0.01 mark
20:38:27.869 -> 1
20:38:27.869 -> 137
20:38:27.869 -> 0
20:38:27.869 -> t = -0.00 mark
20:38:27.869 -> 1
20:38:27.869 -> 142
20:38:27.869 -> 0
20:38:27.902 -> t = -0.01 mark
20:38:27.902 -> 0
20:38:27.902 -> 141
20:38:27.902 -> 1
20:38:27.902 -> t = -0.01 mark
20:38:27.902 -> 0
20:38:27.902 -> 143
20:38:27.902 -> 1
20:38:27.902 -> t = -0.01 mark
20:38:27.902 -> -2
20:38:27.902 -> 145
20:38:27.902 -> 0
20:38:27.935 -> t = -0.00 mark
20:38:27.935 -> 1
20:38:27.935 -> 150
20:38:27.935 -> 0
20:38:27.935 -> t = -0.01 mark
20:38:27.935 -> 2
20:38:27.935 -> 149
20:38:27.935 -> 1
20:38:27.935 -> t = -0.01 mark
20:38:27.935 -> -2
20:38:27.935 -> 151
20:38:27.935 -> 1
20:38:27.968 -> t = -0.01 mark
20:38:27.968 -> 1
20:38:27.968 -> 153
20:38:27.968 -> 0
20:38:27.968 -> t = -0.00 mark
20:38:27.968 -> 1
20:38:27.968 -> 158
20:38:27.968 -> 0
20:38:27.968 -> t = -0.01 mark
20:38:27.968 -> 0
20:38:27.968 -> 157
20:38:27.968 -> 1
20:38:27.968 -> t = -0.01 mark
20:38:27.968 -> 0
20:38:27.968 -> 159
20:38:27.968 -> 1
20:38:28.001 -> t = -0.01 mark
20:38:28.001 -> 1
20:38:28.001 -> 161
20:38:28.001 -> 0
20:38:28.001 -> t = -0.00 mark
20:38:28.001 -> 1
20:38:28.001 -> 166
20:38:28.001 -> 0
20:38:28.001 -> t = -0.01 mark
20:38:28.001 -> 0
20:38:28.001 -> 165
20:38:28.001 -> 1
20:38:28.034 -> t = -0.01 mark
20:38:28.034 -> 0
20:38:28.034 -> 167
20:38:28.034 -> 1
20:38:28.034 -> t = -0.01 mark
20:38:28.034 -> -2
20:38:28.034 -> 169
20:38:28.034 -> 0
20:38:28.034 -> t = -0.00 mark
20:38:28.034 -> 1
20:38:28.034 -> 174
20:38:28.034 -> 0
20:38:28.067 -> t = -0.01 mark
20:38:28.067 -> -1
20:38:28.067 -> 173
20:38:28.067 -> 1
20:38:28.067 -> t = -0.01 mark
20:38:28.067 -> 0
20:38:28.067 -> 175
20:38:28.067 -> 1
20:38:28.067 -> t = -0.01 mark
20:38:28.067 -> 0
20:38:28.067 -> 177
20:38:28.067 -> 0
20:38:28.067 -> t = -0.00 mark
20:38:28.067 -> 1
20:38:28.067 -> 182
20:38:28.067 -> 0
20:38:28.100 -> t = -0.01 mark
20:38:28.100 -> 0
20:38:28.100 -> 181
20:38:28.100 -> 1
20:38:28.100 -> t = -0.01 mark
20:38:28.100 -> 1
20:38:28.100 -> 183
20:38:28.100 -> 1
20:38:28.100 -> t = -0.01 mark
20:38:28.100 -> 1
20:38:28.100 -> 185
20:38:28.100 -> 0
20:38:28.133 -> t = -0.00 mark
20:38:28.133 -> 1
20:38:28.133 -> 190
20:38:28.133 -> 0
20:38:28.133 -> t = -0.01 mark
20:38:28.133 -> -1
20:38:28.133 -> 189
20:38:28.133 -> 1
20:38:28.133 -> t = -0.01 mark
20:38:28.133 -> 2
20:38:28.133 -> 191
20:38:28.133 -> 1
20:38:28.167 -> t = -0.01 mark
20:38:28.167 -> -1
20:38:28.167 -> 193
20:38:28.167 -> 0
20:38:28.167 -> t = -0.00 mark
20:38:28.167 -> 1
20:38:28.167 -> 198
20:38:28.167 -> 0
20:38:28.167 -> t = -0.01 mark
20:38:28.167 -> 0
20:38:28.167 -> 197
20:38:28.167 -> 1
20:38:28.167 -> t = -0.01 mark
20:38:28.167 -> 1
20:38:28.167 -> 199
20:38:28.167 -> 1
20:38:28.200 -> t = -0.01 mark
20:38:28.200 -> -1
20:38:28.200 -> 201
20:38:28.200 -> 0
20:38:28.200 -> t = -0.00 mark
20:38:28.200 -> 1
20:38:28.200 -> 206
20:38:28.200 -> 0
20:38:28.200 -> t = -0.01 mark
20:38:28.200 -> 0
20:38:28.200 -> 205
20:38:28.200 -> 1
20:38:28.233 -> t = -0.01 mark
20:38:28.233 -> -1
20:38:28.233 -> 207
20:38:28.233 -> 1
20:38:28.233 -> t = -0.01 mark
20:38:28.233 -> 0
20:38:28.233 -> 209
20:38:28.233 -> 0
20:38:28.233 -> t = -0.00 mark
20:38:28.233 -> 1
20:38:28.233 -> 214
20:38:28.233 -> 0
20:38:28.266 -> t = -0.01 mark
20:38:28.266 -> 0
20:38:28.266 -> 213
20:38:28.266 -> 1
20:38:28.266 -> t = -0.01 mark
20:38:28.266 -> 0
20:38:28.266 -> 215
20:38:28.266 -> 1
20:38:28.266 -> t = -0.01 mark
20:38:28.266 -> 0
20:38:28.266 -> 217
20:38:28.266 -> 0
20:38:28.299 -> t = -0.00 mark
20:38:28.299 -> 1
20:38:28.299 -> 222
20:38:28.299 -> 0
20:38:28.299 -> t = -0.01 mark
20:38:28.299 -> -2
20:38:28.299 -> 221
20:38:28.299 -> 1
20:38:28.299 -> t = -0.01 mark
20:38:28.299 -> 0
20:38:28.299 -> 223
20:38:28.299 -> 1
20:38:28.299 -> t = -0.01 mark
20:38:28.299 -> 0
20:38:28.299 -> 225
20:38:28.299 -> 0
20:38:28.332 -> t = -0.00 mark
20:38:28.332 -> 1
20:38:28.332 -> 230
20:38:28.332 -> 0
20:38:28.332 -> t = -0.01 mark
20:38:28.332 -> 0
20:38:28.332 -> 229
20:38:28.332 -> 1
20:38:28.332 -> t = -0.01 mark
20:38:28.332 -> 0
20:38:28.332 -> 231
20:38:28.332 -> 1
20:38:28.365 -> t = -0.01 mark
20:38:28.365 -> 0
20:38:28.365 -> 233
20:38:28.365 -> 0
20:38:28.365 -> t = -0.00 mark
20:38:28.365 -> 1
20:38:28.365 -> 238
20:38:28.365 -> 0
20:38:28.365 -> t = -0.01 mark
20:38:28.365 -> 0
20:38:28.365 -> 237
20:38:28.365 -> 1
20:38:28.398 -> t = -0.01 mark
20:38:28.398 -> 0
20:38:28.398 -> 239
20:38:28.398 -> 1
20:38:28.398 -> t = -0.01 mark
20:38:28.398 -> -1
20:38:28.398 -> 241
20:38:28.398 -> 0
20:38:28.398 -> t = -0.00 mark
20:38:28.398 -> 1
20:38:28.398 -> 246
20:38:28.398 -> 0
20:38:28.431 -> t = -0.01 mark
20:38:28.431 -> 0
20:38:28.431 -> 245
20:38:28.431 -> 1
20:38:28.431 -> t = -0.01 mark
20:38:28.431 -> 0
20:38:28.431 -> 247
20:38:28.431 -> 1
20:38:28.431 -> t = -0.01 mark
20:38:28.431 -> 0
20:38:28.431 -> 249
20:38:28.431 -> 0

