using IOB_UT_NEXT;
using IOB_UT_NEXT.Config;
using System;
using System.Globalization;
using System.IO;

namespace IOB_WIN_MBUS.IobModbusTCP
{
    /* --------------------------------------------------------------------------------
    * Controlli ModBusTCP FRER per controllo potenza
    * - protocollo ModBus TCP
    * - gestione letture via Modbus
    * - dati INT (x 1000) oppure real
    * - gestione set esteso (65k)
    *
    * G:\Drive condivisi\30_Clienti\Jetco\Manuali Frer Energy Monitor
    *
    * -------------------------------------------------------------------------------- */

    public class ModbusTCPFrer : 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 ModbusTCPFrer(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
        {
            lgInfo("Init IOB ModbusTCPFrer");

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

        #endregion Public Constructors


        #region Protected Methods

        /// <summary>
        /// Effettua lettura semafori principale <paramref name="currDispData">Parametri da
        /// aggiornare x display in form</paramref>
        /// </summary>
        public override void readSemafori(ref newDisplayData currDispData)
        {
            /* -----------------------------------------------------
             * bitmap MAPO STANDARD 60
             * B0: POWER_ON
             * B1: RUN
             * B2: pzCount
             * B3: allarme
             * B4: manuale
             * B5: slowTC
             * B6: WarmUpCoolDown
             * B7: EmergArmata
             *
             ----------------------------------------------------- */
            DateTime adesso = DateTime.Now;
            // se ha risposto ad ultima chiamata --> ok
            if (connectionOk && adesso.Subtract(lastReadPLC).TotalMinutes < 1)
            {
                B_input = 3;
                // aggiungo NON emergenza...
                B_input += (1 << 7);
            }
            else
            {
                B_input = 0;
            }
            lastReadPLC = DateTime.Now;
            lastWatchDog = adesso;
        }


        #endregion Protected Methods
    }
}