/*
 * master_slave.c
 *
 *  Created on: 13 íîÿá. 2024 ã.
 *      Author: Evgeniy_Sokolov
 */

#include <edrk_main.h>

#include <params.h>
#include <params_alg.h>
#include <params_norma.h>
#include <params_pwm24.h>
#include <params_temper_p.h>
#include <project.h>
#include "IQmathLib.h"
#include "mathlib.h"
#include <optical_bus.h>
#include "synhro_tools.h"
#include "master_slave.h"

//////////////////////////////////////////////////////////

#pragma DATA_SECTION(buf_log_master_slave_status,".slow_vars");
unsigned int buf_log_master_slave_status[SIZE_LOG_MASTER_SLAVE_STATUS] = {0};
//AUTO_MASTER_SLAVE_DATA buf2[SIZE_BUF1] = {0};
//AUTO_MASTER_SLAVE_DATA buf3[SIZE_BUF1] = {0};
//OPTICAL_BUS_DATA_LOW_CMD buf4[SIZE_BUF1] = {0};
//OPTICAL_BUS_DATA_LOW_CMD buf5[SIZE_BUF1] = {0};


//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

void auto_select_master_slave(void)
{
    static unsigned int count_try_master = 0;
    static unsigned int count_wait_answer_confirm_mode = 0;
    static unsigned int count_wait_slave_try_master = 0;
    unsigned int err_confirm_mode = 0; // îøèáêà ïîäòâåðæäåíèÿ ðåæèìà äðóãèì Ï×
    static unsigned int c_buf_log_master_slave_status = 0, prev_status = 0;



// logs master_slave_status
    if (edrk.auto_master_slave.status != prev_status)
    {
        c_buf_log_master_slave_status++;
        if (c_buf_log_master_slave_status>=SIZE_LOG_MASTER_SLAVE_STATUS)
            c_buf_log_master_slave_status = 0;
        buf_log_master_slave_status[c_buf_log_master_slave_status] = edrk.auto_master_slave.status;
    }
    prev_status = edrk.auto_master_slave.status;
//end logs master_slave_status

    if (edrk.ms.ready2==0 && edrk.errors.e7.bits.AUTO_SET_MASTER==0)
    {
        edrk.auto_master_slave.remoute.all = 0;
        edrk.auto_master_slave.local.all = 0;
        edrk.auto_master_slave.prev_remoute.all = edrk.auto_master_slave.remoute.all;
        edrk.auto_master_slave.prev_local.all = edrk.auto_master_slave.local.all;

        edrk.auto_master_slave.status = 1;

//        if (prev_ready!=edrk.ms.ready2)
//            for (c_buf=0;c_buf<SIZE_BUF1;c_buf++)
//            {
//                buf2[c_buf].all = buf3[c_buf].all = buf1[c_buf] = buf4[c_buf].all = buf5[c_buf].all =0;
//            }
//
//        c_buf = 0;
//
//        prev_ready = edrk.ms.ready2;
        clear_wait_synhro_optical_bus();


        return;
    }
//    else
//        prev_ready = edrk.ms.ready2;


    if (edrk.errors.e7.bits.AUTO_SET_MASTER)
    {
        edrk.to_second_pch.bits.MASTER = edrk.auto_master_slave.local.bits.master;

        edrk.auto_master_slave.local.bits.master = 0;
        edrk.auto_master_slave.local.bits.slave  = 0;
        edrk.auto_master_slave.local.bits.try_master = 0;
        edrk.auto_master_slave.local.bits.try_slave = 0;
        edrk.auto_master_slave.local.bits.nothing = 1;


//        edrk.auto_master_slave.prev_remoute.all = edrk.auto_master_slave.remoute.all;
//        edrk.auto_master_slave.prev_local.all = edrk.auto_master_slave.local.all;

 //       edrk.auto_master_slave.status = 10;


        return;
    }

    edrk.auto_master_slave.prev_status = edrk.auto_master_slave.status;

//    c_buf++;
//    if (c_buf>=SIZE_BUF1)
//        c_buf = 0;
//
//    buf1[c_buf] = edrk.auto_master_slave.status;
//    buf2[c_buf].all = edrk.auto_master_slave.local.all;
//    buf3[c_buf].all = edrk.auto_master_slave.remoute.all;
//    buf4[c_buf].all = optical_read_data.data.cmd.all;
//    buf5[c_buf].all = optical_write_data.data.cmd.all;
//

    // ñáðîñèì ñ÷åò÷èê âðåìåíè ïåðåõîäà íà ìàñòåð
    if (edrk.auto_master_slave.local.bits.try_master==0 ||
         (edrk.auto_master_slave.prev_local.bits.try_master != edrk.auto_master_slave.local.bits.try_master && edrk.auto_master_slave.local.bits.try_master==1))
        count_try_master = 0;

    // åñëè øèíà OPTICAL_BUS ñäîõëà, âûõîäèì
    if (edrk.errors.e7.bits.WRITE_OPTBUS==1 || edrk.errors.e7.bits.READ_OPTBUS==1 ||
            edrk.warnings.e7.bits.WRITE_OPTBUS==1 || edrk.warnings.e7.bits.READ_OPTBUS==1)
    {

        if (edrk.errors.e7.bits.WRITE_OPTBUS==1 || edrk.errors.e7.bits.READ_OPTBUS==1)
        {
            // øèíà íå ðàáîòàåò, è òîò Ï× âêëþ÷åí
            // çíà÷èò ÷òî-òî ñëó÷èëîñü - âûêëþ÷àåìñÿ

            edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;

            edrk.auto_master_slave.remoute.bits.nothing = 1;
            edrk.auto_master_slave.remoute.bits.master  = 0;
            edrk.auto_master_slave.remoute.bits.slave   = 0;
            edrk.auto_master_slave.remoute.bits.try_master = 0;
            edrk.auto_master_slave.remoute.bits.try_slave = 0;


            edrk.auto_master_slave.local.bits.master = 0;
            edrk.auto_master_slave.local.bits.slave  = 0;
            edrk.auto_master_slave.local.bits.try_master = 0;
            edrk.auto_master_slave.local.bits.try_slave = 0;
            edrk.auto_master_slave.local.bits.nothing = 1;

            edrk.auto_master_slave.status = 10;
        }
        else
        {
            // øèíà íå ðàáîòàåò, è òîò Ï× âûêëþ÷åí
            // çíà÷èò ìû ñðàçó ìàñòåð
            edrk.warnings.e7.bits.AUTO_SET_MASTER = 1;

            edrk.auto_master_slave.remoute.bits.nothing = 1;
            edrk.auto_master_slave.remoute.bits.master  = 0;
            edrk.auto_master_slave.remoute.bits.slave   = 0;
            edrk.auto_master_slave.remoute.bits.try_master = 0;
            edrk.auto_master_slave.remoute.bits.try_slave = 0;



            edrk.auto_master_slave.local.bits.master = 1;
            edrk.auto_master_slave.local.bits.slave  = 0;
            edrk.auto_master_slave.local.bits.try_master = 0;
            edrk.auto_master_slave.local.bits.try_slave = 0;
            edrk.auto_master_slave.local.bits.nothing = 1;

            edrk.auto_master_slave.status = 2;
        }

        edrk.auto_master_slave.remoute.bits.sync_line_detect = 0;
        edrk.auto_master_slave.remoute.bits.bus_off = 1;
        edrk.auto_master_slave.remoute.bits.sync1_2 = 0;

    }
    else
    {
        edrk.warnings.e7.bits.AUTO_SET_MASTER = 0;

        edrk.auto_master_slave.remoute.bits.bus_off = 0;

        // ñèíõðîíèçèðóåì ñâîè ïðîãðàììû ÷åðåç OPTICAL_BUS

        if (wait_synhro_optical_bus()==1)
        {

            edrk.auto_master_slave.status = 50; // wait synhro


        }
        else
        {


            edrk.auto_master_slave.remoute.bits.master = optical_read_data.data.cmd.bit.master;
            edrk.auto_master_slave.remoute.bits.slave = optical_read_data.data.cmd.bit.slave;
            edrk.auto_master_slave.remoute.bits.try_master = optical_read_data.data.cmd.bit.maybe_master;
            edrk.auto_master_slave.remoute.bits.sync1_2 = optical_read_data.data.cmd.bit.sync_1_2;
            edrk.auto_master_slave.remoute.bits.sync_line_detect = optical_read_data.data.cmd.bit.sync_line_detect;
            edrk.auto_master_slave.remoute.bits.tick = optical_read_data.data.cmd.bit.wdog_tick;

            if (optical_read_data.data.cmd.bit.master==0 && optical_read_data.data.cmd.bit.slave==0)
               edrk.auto_master_slave.remoute.bits.nothing = 1;


           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 1

           // òîò Ï× óæå ìàñòåð
           if (edrk.auto_master_slave.remoute.bits.master)
           {

               // è ýòîò Ï× ìàñòåð ïî÷åìó-òî?
               if (edrk.auto_master_slave.local.bits.master)
               {
                   edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                   edrk.auto_master_slave.status = 3;
               }
               else
               {
               // ýòîò Ï× åùå íå îïðåäåëèëñÿ, ïîýòîìó ïåðåõîä íà slave
                if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0)
                {
        //           edrk.auto_master_slave.local.bits.try_slave = 1;
                   // ñòàëè slave
                   edrk.auto_master_slave.local.bits.slave = 1;
                   // ñíÿëè ñâîé çàïðîñ íà ìàñòåðà åñëè îí áûë
                   edrk.auto_master_slave.local.bits.try_master = 0;
                   edrk.auto_master_slave.status = 4;
                }
                else
                {
                    edrk.auto_master_slave.status = 21;
                }
               }
           }
           else
           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 2
           // òîò Ï× óæå slave

           if (edrk.auto_master_slave.remoute.bits.slave)
           {

               // è ýòîò Ï× slave ïî÷åìó-òî?
               if (edrk.auto_master_slave.local.bits.slave)
               {

                   // áûë ïåðåõîä èç ìàñòåð â slave
                   if (edrk.auto_master_slave.prev_remoute.bits.slave==0)
                   {
                      if (edrk.Go)
                      {
                          // çàïóùåí ØÈÌ
                          edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                          edrk.auto_master_slave.status = 5;
                      }
                      else
                      {
                          // ïðîáóåì ïåðåõâàòèòü master
                          edrk.auto_master_slave.local.bits.try_master = 1;
                          edrk.auto_master_slave.status = 6;
                      }
                   }
                   else
                   {
                      edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                      edrk.auto_master_slave.status = 7;
                   }

               }
               else
               {

               // ýòîò Ï× åùå íå îïðåäåëèëñÿ, ïîýòîìó çàïðàøèâàåò íà master
                if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==0)
                {
                    if (edrk.flag_second_PCH==0)
                        edrk.auto_master_slave.local.bits.try_master = 1;
                    if (edrk.flag_second_PCH==1)
                        edrk.auto_master_slave.local.bits.try_master = 1;

                    edrk.auto_master_slave.status = 8;
    //               edrk.auto_master_slave.local.bits.slave = 1;
                }
                else
                // ýòîò Ï× óæå â çàïðîñå íà ìàñòåð, à òîò Ï× ïîäòâåðäèë â slave ÷òî îí íå ïðîòèâ.
                if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==1)
                {
                    // ñòàëè ìàñòåðîì
                   edrk.auto_master_slave.local.bits.master = 1;
                   edrk.auto_master_slave.local.bits.try_master = 0;
                   edrk.auto_master_slave.status = 9;
    //               edrk.auto_master_slave.local.bits.slave = 1;
                }
                else
                {
                    edrk.auto_master_slave.status = 22;
                }

               }
           }
           else
           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 3
           // òîò Ï× çàïðàøèâàåò ïåðåõîä íà ìàñòåð

           if (edrk.auto_master_slave.remoute.bits.master==0
               && edrk.auto_master_slave.remoute.bits.slave==0
               && edrk.auto_master_slave.remoute.bits.try_master)
           {
               // à ýòîò Ï× slave
               if (edrk.auto_master_slave.local.bits.slave)
               {
                   // âðîäå íå íîðì, îñòàåìñÿ slave
                   // òóò íàäî ïîäîæäàòü íåêîòðîå âðåìÿ, ïîêà òîò Ï× íå ïîéìåò ÷òî ìû ñòàëè ñëåéâîì è ïåðåéäåò èç try_master â ìàñòåð
                   if (count_wait_slave_try_master<MAX_COUNT_WAIT_SLAVE_TRY_MASTER)
                       count_wait_slave_try_master++;
                   else
                   {
                    edrk.auto_master_slave.status = 10;
                    edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                   }
               }
               else
               // à ýòîò Ï× master
               if (edrk.auto_master_slave.local.bits.master)
               {
                   // òóò ìû äîëæíû ïðèíÿòü ðåøåíèå îòäàâàòü ëè ñâîé ìàñòåð äðóãîìó Ï×?
                   // ïîêà âûñòàâèì îøèáêó
                   edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                   edrk.auto_master_slave.status = 11;
               }
               else
               // ýòîò Ï× íå ìàñòåð è íå ñëåéâ è íåò çàïðîñîâ îò íåãî íà ìàñòåð
               if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==0)
               {
                   // ñòàíîâèìñÿ slave
                   edrk.auto_master_slave.local.bits.slave = 1;
                   edrk.auto_master_slave.status = 12;
                   count_wait_slave_try_master = 0; // îáíóëèì ñ÷åò÷èê, ò.ê. íàñ íàäî ÷òîá òîò Ï× ïîíÿë ÷òî ìû ñòàëè slave
               }
               else
               // ýòîò Ï× íå ìàñòåð è íå ñëåéâ è åñòü çàïðîñ îò íåãî íà ìàñòåð, ò.å. îáà Ï× õîòÿò áûòü ìàñòåðàìè
               if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==1)
               {

                   // ñòàíîâèìñÿ master ÷åðåç íåêîòîðîå âðåìÿ (äëÿ êàæäîãî Ï× âðåìÿ ðàçíîå)
                   if (edrk.flag_second_PCH==0)
                   {
                       //îáà õîòÿò, íî ïðèîòðèòåò äàåì âñåãäà ïåðâîìó
                       edrk.auto_master_slave.local.bits.master = 1;
                       edrk.auto_master_slave.local.bits.try_master = 0;

    //                 if (count_try_master<MAX_COUNT_TRY_MASTER_BS1)
    //                     count_try_master++;
    //                 else
    //                     edrk.auto_master_slave.local.bits.master = 1;
                   }

                   if (edrk.flag_second_PCH==1)
                   {
                       //îáà õîòÿò, íî ïðèîòðèòåò äàåì âñåãäà ïåðâîìó

                       edrk.auto_master_slave.local.bits.slave = 1;
                       edrk.auto_master_slave.local.bits.try_master = 0;

    //                 if (count_try_master<MAX_COUNT_TRY_MASTER_BS2)
    //                     count_try_master++;
    //                 else
    //                     edrk.auto_master_slave.local.bits.master = 1;
                   }
                   edrk.auto_master_slave.status = 13;
               }
               else
               {
                   edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                   edrk.auto_master_slave.status = 100;
               }


           }
           else
           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 4
           // ýòîò Ï× çàïðàøèâàåò ïåðåõîä íà ìàñòåð

           if (edrk.auto_master_slave.local.bits.master==0
                      && edrk.auto_master_slave.local.bits.slave==0
                      && edrk.auto_master_slave.local.bits.try_master)
           {
               // ñòàíîâèìñÿ master ÷åðåç íåêîòîðîå âðåìÿ (äëÿ êàæäîãî Ï× âðåìÿ ðàçíîå)
               if (edrk.flag_second_PCH==0)
               {
                 if (count_try_master<MAX_COUNT_TRY_MASTER_BS1)
                 {
                     count_try_master++;
                     edrk.auto_master_slave.status = 14;
                 }
                 else
                 {
                     edrk.auto_master_slave.local.bits.master = 1;
                     edrk.auto_master_slave.local.bits.try_master = 0;
                     edrk.auto_master_slave.status = 15;

                 }
               }

               if (edrk.flag_second_PCH==1)
               {
                 if (count_try_master<MAX_COUNT_TRY_MASTER_BS2)
                 {
                     count_try_master++;
                     edrk.auto_master_slave.status = 14;
                 }
                 else
                 {
                     edrk.auto_master_slave.local.bits.master = 1;
                     edrk.auto_master_slave.local.bits.try_master = 0;
                     edrk.auto_master_slave.status = 15;
                 }
               }



           }
           else
           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 5
           // òîò Ï× íè÷åãî íå äåëàåò

           if (edrk.auto_master_slave.remoute.bits.master==0 && edrk.auto_master_slave.remoute.bits.slave==0 && edrk.auto_master_slave.remoute.bits.try_master==0)
           {
               // à ýòîò Ï× slave
               if (edrk.auto_master_slave.local.bits.slave)
               {
                   // áûëè â ñëåéâå, à òîò Ï× ïî÷åìó-òî ïîòåðÿë ðåæèì - îøèáêà èëè ïîïûòêà çàõâàòà ìàñòåðà!
                   if (edrk.auto_master_slave.prev_remoute.bits.master)
                   {
                       if (edrk.Go) // ïðè ØÈÌå âûðóáàåìñÿ.
                       {
                           edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                           edrk.auto_master_slave.status = 24;

                       }
                       else
                       {
                         // à òóò âñå îê.
                         edrk.auto_master_slave.local.bits.slave = 0;
                         edrk.auto_master_slave.local.bits.master = 1;

                         edrk.auto_master_slave.status = 23;
                       }
                   }
                   else
                   {
                        edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                        edrk.auto_master_slave.status = 16;
                   }
               }
               else
               // à ýòîò Ï× master
               if (edrk.auto_master_slave.local.bits.master)
               {
                   // òóò ìû îñòåìñÿ ìàñòåðîì âðîäå?
                   // íî òîò Ï× íå ïîäòâåðäèë ïåðåõîä, îí äîëæåí ñòàòü ìàñòåðîì èëè ñëåéâîì
                   err_confirm_mode = 0;
//                   filter_err_count(&count_wait_answer_confirm_mode,
//                                                       MAX_COUNT_WAIT_ANSWER_CONFIRM_MODE,
//                                                       1,
//                                                       0);


                   if (err_confirm_mode)
                   {
                       // ìû ìàñòåð, íî òîò Ï× òàê è íå ïîíÿë ýòî
                       edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
                       edrk.auto_master_slave.status = 20;
                   }
                   else
                       edrk.auto_master_slave.status = 17;

               }
               else
               {
                   // òóò ïûòàåìñÿ çàõâàòèòü ìàñòåð
                   if (edrk.flag_second_PCH==0)
                       edrk.auto_master_slave.local.bits.try_master = 1;
                   if (edrk.flag_second_PCH==1)
                       edrk.auto_master_slave.local.bits.try_master = 1;
                   edrk.auto_master_slave.status = 18;
               }


           }
           else
           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 5
           //
           {
               // ÷òî-òî ïîøëî íå òàê
               edrk.errors.e7.bits.AUTO_SET_MASTER |= 1;
               edrk.auto_master_slave.status = 19;

           }
           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 6
           //

           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 7
           //

           //////////////////////////////////////////////////
           //////////////////////////////////////////////////
           // 8
           //
        }
    }





//    optical_write_data.cmd.bit. = edrk.auto_master_slave.local.bits.slave;



    edrk.to_second_pch.bits.MASTER = edrk.auto_master_slave.local.bits.master;

    edrk.auto_master_slave.prev_remoute.all = edrk.auto_master_slave.remoute.all;
    edrk.auto_master_slave.prev_local.all = edrk.auto_master_slave.local.all;

}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

void clear_errors_master_slave(void)
{

//    if (edrk.errors.e7.bits.AUTO_SET_MASTER)
    {

//    if (edrk.errors.e7.bits.MASTER_SLAVE_SYNC
//            || edrk.errors.e1.bits.NO_INPUT_SYNC_SIGNAL)
//      edrk.ms.count_time_wait_ready1 = 0;

    edrk.ms.count_time_wait_ready2 = 0;

    edrk.ms.errors_count.alive_can_to_another_bs = 0;
    edrk.ms.errors_count.alive_opt_bus_read = 0;
    edrk.ms.errors_count.alive_opt_bus_write = 0;
    edrk.ms.errors_count.alive_sync_line = 0;
    edrk.ms.errors_count.alive_sync_line_local = 0;
    edrk.ms.errors_count.another_rascepitel = 0;
    edrk.ms.errors_count.fast_optical_alarm = 0;
    edrk.ms.errors_count.input_alarm_another_bs = 0;
    edrk.ms.errors_count.input_master_slave = 0;

    edrk.ms.err_lock_signals.alive_can_to_another_bs = 0;
    edrk.ms.err_lock_signals.alive_opt_bus_read = 0;
    edrk.ms.err_lock_signals.alive_opt_bus_write = 0;
    edrk.ms.err_lock_signals.alive_sync_line = 0;
    edrk.ms.err_lock_signals.alive_sync_line_local = 0;
    edrk.ms.err_lock_signals.another_rascepitel = 0;
    edrk.ms.err_lock_signals.fast_optical_alarm = 0;
    edrk.ms.err_lock_signals.input_alarm_another_bs = 0;
    edrk.ms.err_lock_signals.input_master_slave = 0;

    }

}

//////////////////////////////////////////////////////////