/// <summary>
        /// Method that is called when the Core requests a payment .
        /// This method will make a transaction request to the c3_rpm_net.exe.
        /// Response will be provided back to the Core based on the EFT initialization response.
        /// </summary>
        public void Pay(object parameters)
        {
            Log.Info(PAY_INGENICO_IPP350_LOG, "call Pay");

            //Check if another method is executing
            if (IsCallbackMethodExecuting)
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = 297, Description = "Another method is executing", PayDetails = new PayDetails() });

                Log.Info(PAY_INGENICO_IPP350_LOG, "        another method is executing.");

                Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Pay");

                return;
            }
            else
            {
                IsCallbackMethodExecuting = true;
            }

            periodicalCheckTimer.Stop();

            //Get the pay request object that will be sent to the fiscal printer
            Log.Info(PAY_INGENICO_IPP350_LOG, "        deserialize the pay request parameters.");
            PayRequest payRequest = GetPayRequest(parameters.ToString());

            //Check if the pay deserialization was successful
            if (payRequest == null)
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = -331, Description = "failed to deserialize the pay request parameters", PayDetails = new PayDetails() });
                Log.Info(PAY_INGENICO_IPP350_LOG, "        failed to deserialize the pay request parameters.");
                return;
            }
            Log.Info(PAY_INGENICO_IPP350_LOG, "        deserialized pay request parameters.");

            if (payRequest.Amount == 0)
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = -299, Description = "amount can't be zero.", PayDetails = new PayDetails() });
                Log.Info(PAY_INGENICO_IPP350_LOG, "        amount can't be zero.");
                return;
            }

            if (string.IsNullOrEmpty(payRequest.TransactionReference))
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = -298, Description = "transaction reference can't be empty.", PayDetails = new PayDetails() });
                Log.Info(PAY_INGENICO_IPP350_LOG, "        transaction reference can't be empty.");
                return;
            }

            //Connect to the C3Net
            if (!ConnectToC3Net())
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = -332, Description = "the connection is down", PayDetails = new PayDetails() });
            }
            else
            {
                //Reset the waiting for response flag
                waitingEFTBeginResponse = true;

                //Reset the waiting for response flag
                waitingEFTEndResponse = true;

                //Create the result object
                eftEndResponse = new EFTEndMessage();

                //Create the eft begin init request object
                EFTBeginMessage eftBeginRequestMessage = new EFTBeginMessage();

                //Based on the selected currency create the appropriate command
                string requestString = string.Empty;
                if (CurrencyValue == "EUR")
                {
                    requestString = eftBeginRequestMessage.GetTransactionMessage(TerminalID, Currency.EUR.ToString(), payRequest.Amount.ToString(), payRequest.TransactionReference);
                }
                if (CurrencyValue == "GBP")
                {
                    requestString = eftBeginRequestMessage.GetTransactionMessage(TerminalID, Currency.GPB.ToString(), payRequest.Amount.ToString(), payRequest.TransactionReference);
                }

                //Send the eft begin init request
                if (!c3NetCommunicator.Send(requestString))
                {
                    coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = -334, Description = "failed to send Initialization request", PayDetails = new PayDetails() });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        failed to send initialization request.");
                    IsCallbackMethodExecuting = false;
                    Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Pay");
                    return;
                }

                //Wait the eft begin confirmationinit response
                if (!WaitingEFTBeginConfirmationResponse())
                {
                    coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = -335, Description = "No EFT Begin Confirmation was received", PayDetails = new PayDetails() });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        No EFT Begin Confirmation was received");
                    IsCallbackMethodExecuting = false;
                    Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Pay");
                    return;
                }
                Log.Info(PAY_INGENICO_IPP350_LOG, "        received EFT Begin Confirmation.");

                //Wait eft end response
                if (!WaitingEFTEndResponse())
                {
                    coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = -336, Description = "No EFT End Response was received", PayDetails = new PayDetails() });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        No EFT End Response was received");
                    IsCallbackMethodExecuting = false;
                    Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Pay");
                    return;
                }
                Log.Info(PAY_INGENICO_IPP350_LOG, "        received EFT End Confirmation.");

                PayDetails payDetails = new PayDetails();

                if (eftEndResponse.Error == 0)
                {
                    //Update the paid amount
                    payDetails.PaidAmount = payRequest.Amount;

                    //Update the tender media id
                    payDetails.TenderMediaId = eftEndResponse.TenderMedia;

                    //Save the ticket
                    if (!string.IsNullOrEmpty(eftEndResponse.CustomerTicket))
                    {
                        SaveTicket(eftEndResponse.CustomerTicket, false);
                        payDetails.HasClientReceipt = true;
                    }
                    //Save the merchant ticket
                    if (!string.IsNullOrEmpty(eftEndResponse.MerchantTicket))
                    {
                        SaveTicket(eftEndResponse.MerchantTicket, true);
                        payDetails.HasMerchantReceipt = true;
                    }

                    //Reset the timer if a payment was successful
                    periodicalCheckTimer.Stop();
                    periodicalCheckTimer.Start();

                    Log.Info(PAY_INGENICO_IPP350_LOG, "        Tender Media: {0}", eftEndResponse.TenderMedia);

                    coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = 0, Description = "Successful payment", PayDetails = payDetails });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        credit card payment succeeded.");
                }
                else
                {
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        Error Code: {0}", eftEndResponse.Error);
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        Error Code Response: {0}", eftEndResponse.ErrorResponseCode);
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        Error Message:{0}", eftEndResponse.ErrorMessage);

                    //Save the ticket
                    if (!string.IsNullOrEmpty(eftEndResponse.CustomerTicket))
                    {
                        SaveTicket(eftEndResponse.CustomerTicket, false);
                        payDetails.HasClientReceipt = true;
                    }
                    //Save the merchant ticket
                    if (!string.IsNullOrEmpty(eftEndResponse.MerchantTicket))
                    {
                        SaveTicket(eftEndResponse.MerchantTicket, true);
                        payDetails.HasMerchantReceipt = true;
                    }

                    coreCommunicator.SendMessage(CommunicatorMethods.Pay, new { Status = eftEndResponse.Error, Description = eftEndResponse.ErrorMessage, PayDetails = payDetails });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        credit card payment failed.");
                }
            }

            c3NetCommunicator.Disconnect();

            periodicalCheckTimer.Start();

            IsCallbackMethodExecuting = false;

            Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Pay");
        }
        /// <summary>
        /// It will try send a command to the terminal to get the total number of transactions
        /// (no ping method exists so this one was the only one that was available to test the terminal connection)
        /// </summary>
        private void CheckPayment()
        {
            Log.Info(PAY_INGENICO_IPP350_LOG, "        checking payment status");

            periodicalCheckTimer.Stop();

            //Connect to the C3Net
            if (!ConnectToC3Net())
            {
                IsTerminalReady = false;
                Log.Info(PAY_INGENICO_IPP350_LOG, "        the connection is down.");
            }
            else
            {
                //Change the waiting for response flag
                waitingEFTBeginResponse = true;
                //Change the waiting for response flag
                waitingEFTEndResponse = true;

                eftEndResponse = new EFTEndMessage();

                //SEND THE EFT BEGIN INIT REQUEST
                EFTBeginMessage eftBeginRequestMessage = new EFTBeginMessage();

                string requestString = eftBeginRequestMessage.GetPinpadStatusMessage(TerminalID);
                if (!c3NetCommunicator.Send(requestString))
                {
                    UpdateAndRestartThePeriodicalCkeckStatus(false, "failed to send status request.");
                    return;
                }

                //WAIT THE EFT BEGIN CONFIRMATION STATUS RESPONSE
                if (!WaitingEFTBeginConfirmationResponse())
                {
                    UpdateAndRestartThePeriodicalCkeckStatus(false, "No EFT Begin Confirmation was received");
                    return;
                }
                Log.Info(PAY_INGENICO_IPP350_LOG, "        received EFT Begin Confirmation.");

                //WAIT EFT END RESPONSE
                if (!WaitingEFTEndResponse())
                {
                    UpdateAndRestartThePeriodicalCkeckStatus(false, "No EFT End Response was received");
                    return;
                }

                if (eftEndResponse.Error == 0)
                {
                    UpdateAndRestartThePeriodicalCkeckStatus(true, "EFT ready.");
                }
                else
                {
                    UpdateAndRestartThePeriodicalCkeckStatus(false, "EFT NOT ready.");
                }
            }

            //Start the terminal periodic check
            periodicalCheckTimer.Start();

            c3NetCommunicator.Disconnect();
        }
        /// <summary>
        /// Method that is called when the Core requests the EFT initialization.
        /// This method will make an initialization request to the c3_rpm_net.exe.
        /// Response will be provided back to the Core based on the EFT initialization response.
        /// </summary>
        public void Init(object parameters)
        {
            Log.Info(PAY_INGENICO_IPP350_LOG, "call Initialize");

            //Check if another method is executing
            if (IsCallbackMethodExecuting)
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = -1 });

                Log.Info(PAY_INGENICO_IPP350_LOG, "        another method is executing.");

                Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Initialize");

                return;
            }
            else
            {
                IsCallbackMethodExecuting = true;
            }

            periodicalCheckTimer.Stop();

            waitingEFTBeginResponse = false;

            //Get the initialization parameters
            if (!GetInitParameters(parameters.ToString()))
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = -1 });

                Log.Info(PAY_INGENICO_IPP350_LOG, "        failed to deserialize the init parameters.");
            }

            //Connect to the C3Net
            if (!ConnectToC3Net())
            {
                coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = 332, Description = "the connection is down" });
            }
            else
            {
                //Reset the waiting for response flag
                waitingEFTBeginResponse = true;

                //Reset the waiting for response flag
                waitingEFTEndResponse = true;

                //Create the result object
                eftEndResponse = new EFTEndMessage();

                //Create the eft begin init request object
                EFTBeginMessage eftBeginRequestMessage = new EFTBeginMessage();

                //Send the eft begin init request
                string requestString = eftBeginRequestMessage.GetPinpadInitializationMessage(TerminalID);
                if (!c3NetCommunicator.Send(requestString))
                {
                    coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = -334, Description = "failed to send Initialization request" });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        failed to send initialization request.");
                    IsCallbackMethodExecuting = false;
                    Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Initialize");
                    return;
                }

                //Wait the eft begin confirmationinit response
                if (!WaitingEFTBeginConfirmationResponse())
                {
                    coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = -335, Description = "No EFT Begin Confirmation was received" });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        No EFT Begin Confirmation was received");
                    IsCallbackMethodExecuting = false;
                    Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Initialize");
                    return;
                }
                Log.Info(PAY_INGENICO_IPP350_LOG, "        received EFT Begin Confirmation.");

                //Wait eft end response
                if (!WaitingEFTEndResponse())
                {
                    coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = -336, Description = "No EFT End Response was received" });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        No EFT End Response was received");
                    IsCallbackMethodExecuting = false;
                    Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Initialize");
                    return;
                }
                Log.Info(PAY_INGENICO_IPP350_LOG, "        received EFT End Confirmation.");

                if (eftEndResponse.Error == 0)
                {
                    coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = 0, Description = "Ready" });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        EFT succesfully initialized");

                    CheckPayment();

                    //Start the terminal periodic check
                    periodicalCheckTimer.Start();
                }
                else
                {
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        Error Code: {0}", eftEndResponse.Error);
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        Error Code Response: {0}", eftEndResponse.ErrorResponseCode);
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        Error Message:{0}", eftEndResponse.ErrorMessage);

                    coreCommunicator.SendMessage(CommunicatorMethods.Init, new { Status = eftEndResponse.Error, Description = eftEndResponse.ErrorMessage });
                    Log.Info(PAY_INGENICO_IPP350_LOG, "        EFT failed to initialized");
                }
            }

            c3NetCommunicator.Disconnect();

            IsCallbackMethodExecuting = false;

            Log.Info(PAY_INGENICO_IPP350_LOG, "endcall Initialize");
        }