using IOB_UT_NEXT;
using IOB_UT_NEXT.Config;
using System;

namespace IOB_WIN_MBUS.IobModbusTCP
{
    /* --------------------------------------------------------------------------------
    * Controlli ModBusTCP COMECA
    * - protocollo ModBus TCP HAM
    * - specifico comportamento impianti HAM Pizzaferri
    *
    * STRUTTURA MEMORIA a banchi di byte, convertiti successivamente in bit/int/real:
    * lettura:     xxx byte,
    * scrittura    yyy byte
    * G:\Drive condivisi\30_Clienti\Pizzaferri\Impianti\HAM
    *
    * -------------------------------------------------------------------------------- */

    public class ModbusTCPHam : ModbusTCP
    {
        #region Public Constructors

        /// <summary>
        /// Classe base con i metodi x ModBusTCP
        /// </summary>
        /// <param name="caller">Form chiamante</param>
        /// <param name="IOBConf">Configurazione (legacy)</param>
        /// <param name="IobConfFull">Configurazione (v 4.x)</param>
        public ModbusTCPHam(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
        {
            lgInfo("NEW IOB ModBus TCP HAM");

            // provo lettura una prima volta i dati DYN
            if (currPLC != null && currPLC.Connected)
            {
                try
                {
                    processDynData();
                }
                catch (Exception exc)
                {
                    lgError($"Eccezione in processDynData iniziale x ModBus TCP HAM:{Environment.NewLine}{exc}");
                }
            }
        }

        #endregion Public Constructors

        #region Protected Methods

        /// <summary>
        /// Effettua decodifica aree memoria alla bitmap usata x MAPO/GWMS
        /// - per lo scopo specifico IN REALTA' non conta lo stato macchina.... ma lo inviamo lo stesso
        /// </summary>
        protected override void decodeToBaseBitmap()
        {
            // init a zero...
            B_input = 0;

            /* -----------------------------------------------------
             * bitmap MAPO STANDARD
             * B0: POWER_ON
             * B1: RUN
             * B2: pzCount
             * B3: allarme
             *
             ----------------------------------------------------- */

            var MemInt = new byte[2];

            int byteSignals = 0;
            // bit 0 (poweron) imposto a 1 SE connected...
            if (currPLC.Connected)
            {
                byteSignals += (1 << 0);
            }

            // processo dagli stati + gravi...
            if (hasAlarms())
            {
                byteSignals += (1 << 3);
            }
            else
            {
                byteSignals += (1 << 1);
            }

            // salvo!
            B_input = byteSignals;
        }

        /// <summary>
        /// Effettua verifica se abilitato invio pezzi in blocco e nel caso
        /// - invio in blocco pezzi
        /// - aggiornamento del contapezzi (passato come ref) x nuovo valore post invio
        /// </summary>
        protected override void trySendPzCountBlock()
        {
            // non fa nulla se non accettare lato IOB i pezzi del PLC... su GWMS NON è gestito il contapezzi
            if (contapezziIOB != contapezziPLC)
            {
                contapezziIOB = contapezziPLC;
                lgTrace($"Registrata variazione contapezzi");
            }
        }

        #endregion Protected Methods
    }
}