Example #1
0
        /// <summary>
        /// Send command to central and receive answer
        /// </summary>
        /// <param name="command"></param>
        private void SendCommandAndReceiveAnswer(LICommandAndAnswer command)
        {
            bool retry = true;

            while (retry)
            {
                SerialPortConnection.Write(command.Command.ByteArray, 0, command.Command.Length);
                logme.Log(command.Command.LogMessage, logme.LogLevel.limsg, command.Command.ByteArray);
                logme.AddLine();

                Thread.Sleep(Config.Data.TimeToWaitForLIAnswer_ms); // wait for central
                DateTime tmp = DateTime.Now;

                while (LastAnswer == null || EmergencyOff)
                {
                    // wait for answer
                    if (DateTime.Now > tmp.AddSeconds(Config.Data.TimeoutForLIResponse_s))
                    {
                        // timeout
                        logme.Log(Resources.FlakeLIErrors.LITimeout, logme.LogLevel.error, command.Command.ByteArray);
                        return;
                    }
                }
                if (LastAnswer.GetType() == typeof(ErrorUnknown))
                {
                    if (_ErrorInARow < Config.Data.AllowedCentralErrorsInARow)
                    {
                        // unknown error, send again, if error sum < n
                        _ErrorInARow++;
                    }
                    else
                    {
                        // Too much errors in a row
                        retry = false;
                        logme.Log(string.Format(Resources.FlakeLIErrors.ErrorSendingCommad, Config.Data.AllowedCentralErrorsInARow.ToString()), logme.LogLevel.error, command.Command.ByteArray);
                        return;
                    }
                }
                else
                {
                    _ErrorInARow = 0;
                    retry        = false;
                }
            }

            command.Answer = LastAnswer; // store answer to command for external use
            LastAnswer     = null;

            logme.Log(command.Answer.LogMessage, logme.LogLevel.limsg, command.Answer.ByteArray);
            logme.AddLine('=');
        }