Beispiel #1
0
        public IStreamedData Add(IIdentifier id, IStreamedData data, Action <double> progressChangeAction)
        {
            var newlyStoredData = _streamedDataStorage.Add(id, data, progressChangeAction);

            _streamedDatas.Add(new PsnDataRelayStream(newlyStoredData, id));
            return(newlyStoredData);
        }
Beispiel #2
0
        private static void SaveLogsToStorage(IPsnDataStorage srcPsnStorage, IDeviceInformationStorage srcDevInfoStorage, IPsnDataStorage dstPsnStorage, IDeviceInformationStorage dstDevInfoStorage)
        {
            Log("Локальное хранилище создано, число ПСН логов в хранилище: " + dstPsnStorage.PsnDatas.Count());

            var devInfosInStorage = srcDevInfoStorage.DeviceInformations.ToList();
            var psnLogsInStorage  = srcPsnStorage.PsnDatas.ToList();

            Log("Число информаций об устройстве на устройстве: " + devInfosInStorage.Count);
            foreach (var devInfo in devInfosInStorage)
            {
                if (!dstDevInfoStorage.DeviceInformations.Any(i => i.Name == devInfo.Name && i.Description == devInfo.Description))
                {
                    dstDevInfoStorage.Add(devInfo.Id, devInfo.Name, devInfo.Description);
                    Log("Информация об устройстве сохранена в локальное хранилище");
                }
                else
                {
                    Log("Такая информация об устройстве уже есть в локальном харинилище");
                }
            }

            Log("Число ПСН логов на устройстве: " + psnLogsInStorage.Count);
            foreach (var psnLog in srcPsnStorage.PsnDatas)
            {
                //Console.WriteLine("PsnLog " + psnLog.LogInformation.BeginTime.ToString());
                if (!dstPsnStorage.PsnDatas.Any(pl => pl.Id.ToString() == psnLog.Id.ToString()))
                {
                    dstPsnStorage.Add(psnLog.Id, psnLog, pp => Console.WriteLine(pp.ToString("f2")));
                    Log("Лог сохранен в локальное хранилище");
                }
                else
                {
                    Log("Такой лог уже есть в локальном хранилище");
                }
            }

            Log("Число ПСН логов в хранилище после сохранения: " + dstPsnStorage.PsnDatas.Count());
        }
Beispiel #3
0
        // TODO: remove RPD logs

        public void SaveDataAsync(IRepository sourceRepo, IEnumerable <IPsnLog> psnLogs, IEnumerable <IFaultLog> rpdLogs, Action <OnCompleteEventArgs> onComplete, Action <OnProgressChangeEventArgs> onProgressChange)
        {
            // TODO: save rpdLogs
            if (!IsOpened)
            {
                _uiNotifier.Notify(() => onComplete(new OnCompleteEventArgs(OnCompleteEventArgs.CompleteResult.Error, "Сперва необходимо открыть репозиторий!")));
            }
            else
            {
                _backWorker.AddWork(
                    () => {
                    try {
                        var sourceSections = new List <ISection>();
                        foreach (var locomotive in sourceRepo.Locomotives)
                        {
                            sourceSections.AddRange(locomotive.Sections);
                        }

                        var pLogs = psnLogs.ToList();

                        int totalProceedCount       = 0;
                        double perLogPercent        = 0.0;
                        double lastInLogProgress    = 0.0;
                        double lastInLogProgressRaw = 0.0;
                        foreach (var psnLog in pLogs)
                        {
                            if (_psnDataInformtationStorage.PsnDataInformations.All(pdi => pdi.Id.ToString() != psnLog.Id.ToString()))
                            {
                                // TODO: плохо конечно, что я работаю с секциями и локомотивами репозитория-источника в фоновом потоке данного репозитория :)
                                // TODO: работать с ними в UI и ждать результата здесь!
                                var sourceSection    = sourceSections.First(s => s.Psns.Any(pl => pl.Id.ToString() == psnLog.Id.ToString()));
                                var sourceLocomotive = sourceRepo.Locomotives.First(l => l.Sections.Any(s => s == sourceSection));
                                //var devInfo = _deviceInformationStorage.DeviceInformations.First(di=>di.parentSection.DeviceInformationId);


                                // Пока у меня нет четкого (уникального) идентификатора устройства, поэтому всё определяет название локомотива и номер секции
                                if (!_deviceInformationStorage.DeviceInformations.Any(di => di.Name == sourceLocomotive.Name && di.Description == sourceSection.Name))
                                {
                                    // если нету описания устройства с такими секцией и локомотивом, то добавим:
                                    _deviceInformationStorage.Add(new IdentifierStringToLowerBased(sourceSection.DeviceInformationId.UnicString), sourceLocomotive.Name, sourceSection.Name);
                                }
                                // localDevInfo - необходим для правильного указания deviceInformationId у сохроняемого psnDataInformtation
                                var localDevInfo = _deviceInformationStorage.DeviceInformations.First(di => di.Name == sourceLocomotive.Name && di.Description == sourceSection.Name);

                                double percent1 = perLogPercent;
                                _psnDataStorage.Add(
                                    new IdentifierStringToLowerBased(psnLog.Id.UnicString),
                                    new StreamReadableDataBasedOnObject(psnLog),
                                    progressPercentage => {
                                    // still the same thread
                                    lastInLogProgressRaw = progressPercentage;
                                    var progress         = percent1 + progressPercentage / pLogs.Count;
                                    lastInLogProgress    = progress;
                                    _uiNotifier.Notify(() => onProgressChange(new OnProgressChangeEventArgs((int)progress)));
                                });

                                _psnDataInformtationStorage.Add(
                                    new IdentifierStringToLowerBased(psnLog.Id.UnicString),
                                    psnLog.BeginTime,
                                    psnLog.EndTime,
                                    DateTime.Now,
                                    new PsnDataFragmentTypeBuilderFromHighLevel(psnLog.LogType).Build(),
                                    psnLog.IsLastDeviceLog,
                                    localDevInfo.Id);

                                _psnDataCustomConfigurationsStorage.Add(
                                    new IdentifierStringToLowerBased(psnLog.Id.UnicString),
                                    new IdentifierStringToLowerBased(psnLog.PsnConfiguration.Id.ToString().ToLower()),
                                    psnLog.Name);
                            }
                            totalProceedCount++;
                            perLogPercent   = totalProceedCount * 100.0 / pLogs.Count;
                            double percent2 = perLogPercent;
                            _uiNotifier.Notify(() => onProgressChange(new OnProgressChangeEventArgs((int)percent2)));
                        }
                        UpdateLocomotivesIfAddedUnsafe();

                        _uiNotifier.Notify(() => onComplete(new OnCompleteEventArgs(OnCompleteEventArgs.CompleteResult.Ok, "Данные успешно сохранены")));
                    }
                    catch (Exception ex) {
                        var message = "Ошибка сохранения данных: " + ex.Message;
                        _uiNotifier.Notify(() => onComplete(new OnCompleteEventArgs(OnCompleteEventArgs.CompleteResult.Error, message)));
                    }
                });
            }
        }