public static CommunicationProcessResult WriteSingle <T>(Connection connection, IReporter reporter, int timeout, int retryLimit, ISettingValue <T> setting, T value)
        {
            setting.Value = value;

            SettingProcess process = new SettingProcess(connection, reporter, setting, timeout, retryLimit);

            CommunicationProcessResult result = process.Write();

            return(result);
        }
        public static CommunicationProcessResult WriteSingle <T>(Connection connection, IReporter reporter, ISettingValue <T> setting, T value)
        {
            setting.Value = value;

            SettingProcess process = new SettingProcess(connection, reporter, new ISettingValue[] { setting }, 100, 3);

            CommunicationProcessResult result = process.Write();

            return(result);
        }
        /// <summary>
        /// Reads a single <see cref="ISettingValue"/>.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="connection">The connection.</param>
        /// <param name="reporter">The reporter.</param>
        /// <param name="timeout">The timeout.</param>
        /// <param name="retryLimit">The retry limit.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="value">The value.</param>
        /// <returns>ImuAsyncProcessResult.</returns>
        public static CommunicationProcessResult ReadSingle <T>(Connection connection, IReporter reporter, int timeout, int retryLimit, ISettingValue <T> setting, out T value)
        {
            SettingProcess process = new SettingProcess(connection, reporter, setting, timeout, retryLimit);

            CommunicationProcessResult result = process.Read();

            switch (result)
            {
            case CommunicationProcessResult.Success:
                value = setting.RemoteValue;
                break;

            default:
                value = default(T);
                break;
            }

            return(result);
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="connection"></param>
        /// <param name="reporter">Progress reporter.</param>
        /// <param name="muteToStart"></param>
        /// <param name="message"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static CommunicationProcessResult ReadSingle <T>(Connection connection, IReporter reporter, ISettingValue <T> setting, out T value) // bool muteToStart,
        {
            SettingProcess process = new SettingProcess(connection, reporter, new ISettingValue[] { setting }, 100, 3);                            // muteToStart

            CommunicationProcessResult result = process.Read();

            switch (result)
            {
            case CommunicationProcessResult.Success:
                value = setting.RemoteValue;
                break;

            default:
                value = default(T);
                break;
            }

            return(result);
        }
        private string GetResultText(CommunicationProcessResult result)
        {
            switch (result)
            {
            case CommunicationProcessResult.Running:
                return("Process is still running.");

            case CommunicationProcessResult.Success:
                return("Process completed successfully.");

            case CommunicationProcessResult.ConnectionError:
                return("Messages could not be sent.");

            case CommunicationProcessResult.RetryLimitExceeded:
                return("Maximum retry limit exceeded.");

            default:
                return("Unknown state.");
            }
        }
        private static CommunicationProcessResult SendInner <T>(Connection connection, IReporter reporter, int timeout, int retryLimit, CommandCallback callback, out T result)
        {
            CommandProcess process = new CommandProcess(connection, reporter, callback, timeout, retryLimit);

            result = default(T);

            CommunicationProcessResult processResult = process.Send();

            if (processResult == CommunicationProcessResult.Success)
            {
                if (callback.ReturnMessage != null &&
                    callback.ReturnMessage.Count > 0 &&
                    callback.ReturnMessage[0] is T)
                {
                    result = (T)callback.ReturnMessage[0];
                }
                else
                {
                    throw new Exception("Command did not return the expected message. " + callback.ReturnMessage.ToString());
                }
            }

            return(processResult);
        }