private void SendingEnabledNotifierOnSendingEnabledChanged(bool isSendingEnabled)
        {
            if (isSendingEnabled)
            {
                ReadSettings();
            }
            else
            {
                // independed of ains count in system, zeroing all ains settings in storage:
                _ainSettingsStorageSettable.SetSettings(0, null);
                _ainSettingsStorageSettable.SetSettings(1, null);
                _ainSettingsStorageSettable.SetSettings(2, null);

                _engineSettingsStorageSettable.SetSettings(null);
            }
        }
        private void Load()
        {
            var winSystem = new WpfWindowSystem();
            var filename  = winSystem.ShowOpenFileDialog("Импорт настроек", "XML files|*.xml|All files|*.*");

            if (filename != null)
            {
                try
                {
                    var doc         = XDocument.Load(filename);
                    var rootElement = doc.Element("Settings");
                    try
                    {
                        var ainElements = rootElement.Elements("AinSettings");
                        foreach (var ainElement in ainElements)
                        {
                            var zbAinNumber = byte.Parse(ainElement.Attribute("Number").Value);
                            try
                            {
                                _ainSettingsReadNotifyRaisable.RaiseAinSettingsReadStarted(zbAinNumber);

                                var reserved00 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved00").Value);
                                var kpW        = decimal.Parse(TryGetChildElement(ainElement, "KpW").Value,
                                                               CultureInfo.InvariantCulture);
                                var kiW = decimal.Parse(TryGetChildElement(ainElement, "KiW").Value,
                                                        CultureInfo.InvariantCulture);

                                var fiNom = decimal.Parse(TryGetChildElement(ainElement, "FiNom").Value,
                                                          CultureInfo.InvariantCulture);
                                var imax = short.Parse(TryGetChildElement(ainElement, "Imax").Value,
                                                       CultureInfo.InvariantCulture);
                                var udcMax = short.Parse(TryGetChildElement(ainElement, "UdcMax").Value,
                                                         CultureInfo.InvariantCulture);
                                var udcMin = short.Parse(TryGetChildElement(ainElement, "UdcMin").Value,
                                                         CultureInfo.InvariantCulture);
                                var fnom = decimal.Parse(TryGetChildElement(ainElement, "Fnom").Value,
                                                         CultureInfo.InvariantCulture);
                                var fmax = decimal.Parse(TryGetChildElement(ainElement, "Fmax").Value,
                                                         CultureInfo.InvariantCulture);

                                var dflLim = decimal.Parse(TryGetChildElement(ainElement, "DflLim").Value,
                                                           CultureInfo.InvariantCulture);
                                var flMinMin = decimal.Parse(TryGetChildElement(ainElement, "FlMinMin").Value,
                                                             CultureInfo.InvariantCulture);

                                var ioutMax = short.Parse(TryGetChildElement(ainElement, "IoutMax").Value,
                                                          CultureInfo.InvariantCulture);
                                var fiMin = decimal.Parse(TryGetChildElement(ainElement, "FiMin").Value,
                                                          CultureInfo.InvariantCulture);
                                var dacCh = ushort.Parse(TryGetChildElement(ainElement, "DacCh").Value,
                                                         CultureInfo.InvariantCulture);
                                var imcw = ushort.Parse(TryGetChildElement(ainElement, "Imcw").Value,
                                                        CultureInfo.InvariantCulture);
                                var ia0 = short.Parse(TryGetChildElement(ainElement, "Ia0").Value,
                                                      CultureInfo.InvariantCulture);
                                var ib0 = short.Parse(TryGetChildElement(ainElement, "Ib0").Value,
                                                      CultureInfo.InvariantCulture);
                                var ic0 = short.Parse(TryGetChildElement(ainElement, "Ic0").Value,
                                                      CultureInfo.InvariantCulture);
                                var udc0 = short.Parse(TryGetChildElement(ainElement, "Udc0").Value,
                                                       CultureInfo.InvariantCulture);

                                var tauR = decimal.Parse(TryGetChildElement(ainElement, "TauR").Value,
                                                         CultureInfo.InvariantCulture);
                                var lm = decimal.Parse(TryGetChildElement(ainElement, "Lm").Value,
                                                       CultureInfo.InvariantCulture);
                                var lsl = decimal.Parse(TryGetChildElement(ainElement, "Lsl").Value,
                                                        CultureInfo.InvariantCulture);
                                var lrl = decimal.Parse(TryGetChildElement(ainElement, "Lrl").Value,
                                                        CultureInfo.InvariantCulture);
                                var reserved24 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved24").Value);

                                var kpFi = decimal.Parse(TryGetChildElement(ainElement, "KpFi").Value,
                                                         CultureInfo.InvariantCulture);
                                var kiFi = decimal.Parse(TryGetChildElement(ainElement, "KiFi").Value,
                                                         CultureInfo.InvariantCulture);

                                var reserved28 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved28").Value);

                                var kpId = decimal.Parse(TryGetChildElement(ainElement, "KpId").Value,
                                                         CultureInfo.InvariantCulture);
                                var kiId = decimal.Parse(TryGetChildElement(ainElement, "KiId").Value,
                                                         CultureInfo.InvariantCulture);

                                var reserved32 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved32").Value);

                                var kpIq = decimal.Parse(TryGetChildElement(ainElement, "KpIq").Value,
                                                         CultureInfo.InvariantCulture);
                                var kiIq = decimal.Parse(TryGetChildElement(ainElement, "KiIq").Value,
                                                         CultureInfo.InvariantCulture);

                                var accDfDt = decimal.Parse(TryGetChildElement(ainElement, "AccDfDt").Value,
                                                            CultureInfo.InvariantCulture);
                                var decDfDt = decimal.Parse(TryGetChildElement(ainElement, "DecDfDt").Value,
                                                            CultureInfo.InvariantCulture);
                                var unom = decimal.Parse(TryGetChildElement(ainElement, "Unom").Value,
                                                         CultureInfo.InvariantCulture);

                                var tauFlLim = decimal.Parse(TryGetChildElement(ainElement, "TauFlLim").Value,
                                                             CultureInfo.InvariantCulture);

                                var rs = decimal.Parse(TryGetChildElement(ainElement, "Rs").Value,
                                                       CultureInfo.InvariantCulture);
                                var fmin = decimal.Parse(TryGetChildElement(ainElement, "Fmin").Value,
                                                         CultureInfo.InvariantCulture);
                                var tauM = decimal.Parse(TryGetChildElement(ainElement, "TauM").Value,
                                                         CultureInfo.InvariantCulture);
                                var tauF = decimal.Parse(TryGetChildElement(ainElement, "TauF").Value,
                                                         CultureInfo.InvariantCulture);
                                var tauFSet = decimal.Parse(TryGetChildElement(ainElement, "TauFSet").Value,
                                                            CultureInfo.InvariantCulture);
                                var tauFi = decimal.Parse(TryGetChildElement(ainElement, "TauFi").Value,
                                                          CultureInfo.InvariantCulture);
                                var idSetMin = short.Parse(TryGetChildElement(ainElement, "IdSetMin").Value,
                                                           CultureInfo.InvariantCulture);
                                var idSetMax = short.Parse(TryGetChildElement(ainElement, "IdSetMax").Value,
                                                           CultureInfo.InvariantCulture);
                                var uchMin = BytesPair.Parse(TryGetChildElement(ainElement, "UchMin").Value);
                                var uchMax = BytesPair.Parse(TryGetChildElement(ainElement, "UchMax").Value);

                                var reserved50 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved50").Value);
                                var reserved51 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved51").Value);

                                var np = int.Parse(TryGetChildElement(ainElement, "Np").Value,
                                                   CultureInfo.InvariantCulture);
                                var nimpFloorCode = int.Parse(TryGetChildElement(ainElement, "NimpFloorCode").Value,
                                                              CultureInfo.InvariantCulture);
                                var fanMode = AinTelemetryFanWorkmodeExtensions.FromIoBits(
                                    int.Parse(TryGetChildElement(ainElement, "FanMode").Value,
                                              CultureInfo.InvariantCulture));
                                var directCurrentMagnetization =
                                    bool.Parse(TryGetChildElement(ainElement, "DirectCurrentMagnetization").Value);

                                var umodThr = decimal.Parse(TryGetChildElement(ainElement, "UmodThr").Value,
                                                            CultureInfo.InvariantCulture);

                                var emdecDfdt = decimal.Parse(TryGetChildElement(ainElement, "EmdecDfdt").Value,
                                                              CultureInfo.InvariantCulture);

                                var textMax = short.Parse(TryGetChildElement(ainElement, "TextMax").Value,
                                                          CultureInfo.InvariantCulture);
                                var toHl = short.Parse(TryGetChildElement(ainElement, "ToHl").Value,
                                                       CultureInfo.InvariantCulture);
                                var ain1LinkFault = bool.Parse(TryGetChildElement(ainElement, "Ain1LinkFault").Value);
                                var ain2LinkFault = bool.Parse(TryGetChildElement(ainElement, "Ain2LinkFault").Value);
                                var ain3LinkFault = bool.Parse(TryGetChildElement(ainElement, "Ain3LinkFault").Value);


                                var setting = new AinSettingsSimple(reserved00, kpW, kiW, fiNom, imax, udcMax, udcMin,
                                                                    fnom, fmax, dflLim, flMinMin, ioutMax, fiMin, dacCh, imcw, ia0, ib0, ic0, udc0,
                                                                    tauR, lm, lsl, lrl, reserved24, kpFi, kiFi, reserved28, kpId, kiId, reserved32,
                                                                    kpIq, kiIq, accDfDt, decDfDt, unom, tauFlLim, rs, fmin, tauM, tauF, tauFSet, tauFi,
                                                                    idSetMin, idSetMax, uchMin, uchMax, reserved50, reserved51, np, nimpFloorCode,
                                                                    fanMode, directCurrentMagnetization, umodThr, emdecDfdt, textMax, toHl,
                                                                    ain1LinkFault, ain2LinkFault, ain3LinkFault);
                                _ainSettingsStorageSettable.SetSettings(zbAinNumber, setting);
                                _ainSettingsReadNotifyRaisable.RaiseAinSettingsReadComplete(zbAinNumber, null,
                                                                                            setting); // TODO: try catch real exception
                                _debugLogger.GetLogger(5).Log("Настройки №" + zbAinNumber + " успешно импортированы",
                                                              new StackTrace(true));
                            }
                            catch (Exception e)
                            {
                                _debugLogger.GetLogger(1)
                                .Log(
                                    "Не удалось импортировать настройки АИН№" + zbAinNumber + Environment.NewLine +
                                    e, new StackTrace(e, true));
                            }
                        }
                    }
                    catch (Exception exx)
                    {
                        _debugLogger.GetLogger(1)
                        .Log("Не удалось импортировать настройки АИН" + Environment.NewLine + exx,
                             new StackTrace(exx, true));
                    }

                    var engineSettingsElement = rootElement.Element("EngineSettings");
                    if (engineSettingsElement != null)
                    {
                        try
                        {
                            var settings = new EngineSettingsSimple
                            {
                                Inom = ushort.Parse(TryGetChildElement(engineSettingsElement, "Inom").Value,
                                                    CultureInfo.InvariantCulture),
                                Nnom = ushort.Parse(TryGetChildElement(engineSettingsElement, "Nnom").Value,
                                                    CultureInfo.InvariantCulture),
                                Nmax = ushort.Parse(TryGetChildElement(engineSettingsElement, "Nmax").Value,
                                                    CultureInfo.InvariantCulture),
                                Pnom = decimal.Parse(TryGetChildElement(engineSettingsElement, "Pnom").Value,
                                                     CultureInfo.InvariantCulture),
                                CosFi = decimal.Parse(TryGetChildElement(engineSettingsElement, "CosFi").Value,
                                                      CultureInfo.InvariantCulture),
                                Eff = decimal.Parse(TryGetChildElement(engineSettingsElement, "Eff").Value,
                                                    CultureInfo.InvariantCulture),
                                Mass = ushort.Parse(TryGetChildElement(engineSettingsElement, "Mass").Value,
                                                    CultureInfo.InvariantCulture),
                                MmM = ushort.Parse(TryGetChildElement(engineSettingsElement, "MmM").Value,
                                                   CultureInfo.InvariantCulture),
                                Height = ushort.Parse(TryGetChildElement(engineSettingsElement, "Height").Value,
                                                      CultureInfo.InvariantCulture),
                                I2Tmax = uint.Parse(TryGetChildElement(engineSettingsElement, "I2Tmax").Value,
                                                    CultureInfo.InvariantCulture),
                                Icontinious =
                                    ushort.Parse(TryGetChildElement(engineSettingsElement, "Icontinious").Value,
                                                 CultureInfo.InvariantCulture),
                                ZeroF = ushort.Parse(TryGetChildElement(engineSettingsElement, "ZeroF").Value,
                                                     CultureInfo.InvariantCulture)
                            };
                            _engineSettingsStorageSettable.SetSettings(settings);
                            _engineSettingsReadNotifyRaisable.RaiseEngineSettingsReadComplete(null, settings);
                            _debugLogger.GetLogger(5).Log("Настройки двигателя успешно импортированы",
                                                          new StackTrace(true));
                        }
                        catch (Exception ex)
                        {
                            _debugLogger.GetLogger(1)
                            .Log("Не удалось импортировать настройки двигателя" + Environment.NewLine + ex,
                                 new StackTrace(ex, true));
                            throw;
                        }
                    }
                }
                catch (Exception ex)
                {
                    _debugLogger.GetLogger(1)
                    .Log("Не удалось импортировать настройки из " + filename + Environment.NewLine + ex,
                         new StackTrace(ex, true));
                    throw;
                }
            }
        }
Пример #3
0
        public void ReadSettingsAsync(byte zeroBasedAinNumber, bool forceRead, Action <Exception, IAinSettings> callback)
        {
            if (forceRead == false)
            {
                // Берем настройки АИН из хранилища:
                var settings = _ainSettingsStorageSettable.GetSettings(zeroBasedAinNumber);
                if (settings != null)
                {
                    _notifyWorker.AddWork(() =>
                                          callback.Invoke(null,
                                                          settings)); // TODO: callback fail unknown, use try -> invoke, catch -> log
                    return;
                }
            }

            // Вычитываем настройки из порта:
            var sender = _commandSenderHost.Sender;

            if (sender == null)
            {
                throw new NullReferenceException("Порт передачи данных не открыт");
            }

            var readSettingsCmd = new ReadAinSettingsCommand(zeroBasedAinNumber);

            _logger.Log("Чтение настроек АИН " + (zeroBasedAinNumber + 1) + "...");
            _notifyWorker.AddWork(() => FireEventAinSettingsReadStarted(zeroBasedAinNumber));
            sender.SendCommandAsync(_targerAddressHost.TargetAddress, readSettingsCmd, _readSettingsTimeout, 2,
                                    (sendException, replyBytes) =>
            {
                if (sendException != null)
                {
                    var errorMessage = "Произошла ошибка во время чтения настрок АИН" + (zeroBasedAinNumber + 1);
                    _logger.Log(errorMessage);
                    try
                    {
                        var ex = new Exception(errorMessage, sendException);

                        _notifyWorker.AddWork(() => callback.Invoke(ex, null));
                        _notifyWorker.AddWork(() => FireEventAinSettingsReadComplete(zeroBasedAinNumber, ex, null));
                        _notifyWorker.AddWork(() =>
                                              _ainSettingsStorageSettable.SetSettings(zeroBasedAinNumber, null));
                    }
                    catch
                    {
                        _logger.Log(
                            "Не удалось совершить обратный вызов после неудачного чтения настроек (либо не удалось обnullить в хранилище) АИН" +
                            (zeroBasedAinNumber + 1));
                    }

                    return;
                }

                try
                {
                    var result = readSettingsCmd.GetResult(replyBytes);
                    if (zeroBasedAinNumber == 0 && result.Ain1LinkFault)
                    {
                        throw new Exception("Настройки АИН1 были считаны, однако флаг ошибки связи с АИН1 взведен");
                    }
                    if (zeroBasedAinNumber == 1 && result.Ain2LinkFault)
                    {
                        throw new Exception("Настройки АИН2 были считаны, однако флаг ошибки связи с АИН2 взведен");
                    }
                    if (zeroBasedAinNumber == 2 && result.Ain3LinkFault)
                    {
                        throw new Exception("Настройки АИН3 были считаны, однако флаг ошибки связи с АИН3 взведен");
                    }

                    try
                    {
                        _notifyWorker.AddWork(() => callback.Invoke(null, result));
                        _notifyWorker.AddWork(() =>
                                              FireEventAinSettingsReadComplete(zeroBasedAinNumber, null, result));
                        _notifyWorker.AddWork(() =>
                                              _ainSettingsStorageSettable.SetSettings(zeroBasedAinNumber, result));
                        _logger.Log("Настройки АИН " + (zeroBasedAinNumber + 1) + " успешно прочитаны");
                    }
                    catch
                    {
                        _logger.Log(
                            "Не удалось совершить обратный вызов после успешного чтения настроек (либо не удалось сохранить настройки в хранилище) АИН" +
                            (zeroBasedAinNumber + 1));
                    }
                }
                catch (Exception resultGetException)
                {
                    var errorMessage = "Ошибка во время разбора ответа на команду чтения настроек АИН" +
                                       (zeroBasedAinNumber + 1) + ": " + resultGetException.Message;
                    _logger.Log(errorMessage);
                    try
                    {
                        var ex = new Exception(errorMessage, resultGetException);
                        _notifyWorker.AddWork(() => callback.Invoke(ex, null));
                        _notifyWorker.AddWork(() => FireEventAinSettingsReadComplete(zeroBasedAinNumber, ex, null));
                        _notifyWorker.AddWork(() =>
                                              _ainSettingsStorageSettable.SetSettings(zeroBasedAinNumber, null));
                    }
                    catch
                    {
                        _logger.Log(
                            "Не удалось совершить обратный вызов после неудачного парсинга настроек (либо не удалось обnullить в хранилище) АИН " +
                            (zeroBasedAinNumber + 1));
                    }
                }
            });
        }