public CommandPartSearcherPsnConfigBasedFast(IPsnProtocolConfiguration psnProtocolConfiguration)
        {
            _cmdPartConfigs = psnProtocolConfiguration.CommandParts.ToList();
            _cmdPartsCount  = _cmdPartConfigs.Count;

            _commandPartSearcher = new PsnCommandPartSearcherAllDefinedValuesAndCrc();
        }
示例#2
0
        public void FillResources(
            IPsnProtocolConfiguration protocol,
            DateTime beginTime,
            IEnumerable <IPsnProtocolCommandPartConfigurationCycle> cycleCmdPartInfo,
            IEnumerable <IPsnProtocolCommandPartConfiguration> commandPartsToMap)
        {
            var goodCommandParts = protocol.CommandParts.Where(cp =>
                                                               cp.Address != null && cp.CommandCode != null && cp.CrcHigh != null && cp.CrcLow != null).ToArray();

            byte[] dataBytes;
            using (var dataStream = _dataStreamGetter.Invoke())
            {
                dataBytes = new byte[dataStream.Length];
                dataStream.Read(dataBytes, 0, (int)dataStream.Length);
            }

            if (_pagesIndex == null)
            {
                var fr = BuildPagesIndex(dataBytes);
                _pagesIndex             = fr.FullIndex;
                _timeSortedGoodPages    = fr.TimeSortedGoodPages;
                _goodPagesOnlyGoodBytes = GetOnlyGoodData(fr.TimeSortedGoodPages, dataBytes);

                _commandsMap = BuildCommandsMap(goodCommandParts, cycleCmdPartInfo, _goodPagesOnlyGoodBytes, beginTime,
                                                _timeSortedGoodPages);
            }

            _lastPsnProtocolId = protocol.Information.Id;
            _areResourcesFree  = false;
        }
示例#3
0
 public PsnChannelDataHandler(IPsnDataHandler dataHandler, IPsnProtocolCommandPartConfiguration psnCommandPart, IPsnProtocolParameterConfiguration psnParameterConfig, IPsnProtocolConfiguration configuration)
 {
     _psnDataHandler     = dataHandler;
     _psnCommandPart     = psnCommandPart;
     _psnParameterConfig = psnParameterConfig;
     _configuration      = configuration;
 }
示例#4
0
        public List <DataPoint> GetDataPoints(IPsnProtocolConfiguration protocol,
                                              IPsnProtocolCommandPartConfiguration commandPart, IPsnProtocolParameterConfiguration paramInfo,
                                              DateTime beginTime)
        {
            // Если конфигурация была изменена:
            if (_lastPsnProtocolId != null && _lastPsnProtocolId.IdentyString != protocol.Information.Id.IdentyString)
            {
                FreeResources();
            }

            if (_areResourcesFree)
            {
                FillResources(protocol, beginTime, protocol.CycleCommandParts, protocol.CommandParts);
            }

            var result = new List <DataPoint>();

            bool isWatchForRequestNeeded;
            Func <IPsnMapRecord, IPsnMapSubrecord> funcGetPart;

            if (commandPart.PartType == PsnProtocolCommandPartType.Request)
            {
                funcGetPart             = FuncGetPartRequest;
                isWatchForRequestNeeded = false;
            }
            else if (commandPart.PartType == PsnProtocolCommandPartType.Reply)
            {
                funcGetPart             = FuncGetPartReply;
                isWatchForRequestNeeded = false;
            }
            else /*if (commandPart.PartType == PsnProtocolCommandPartType.ReplyWithRequiredRequest)*/
            {
                funcGetPart             = FuncGetPartReply;
                isWatchForRequestNeeded = true;
            }

            // поток данных нужен для извлечения самих данных (т.к. изначально их нет в карте (есть только информация о местоположении и времени команд протокола ПСН)
            // можно разделить алгоритм на две части: выборку из карты инфомрации об интересующем сигнале, а затем - заполнение значений из потока данных
            for (int i = 0; i < _commandsMap.Count; ++i)
            {
                if (_commandsMap[i].CommandId.IdentyString == commandPart.CommandId.IdentyString)
                {
                    IPsnMapSubrecord needRec = funcGetPart.Invoke(_commandsMap[i]);

                    if (needRec != null)
                    {
                        if (isWatchForRequestNeeded && _commandsMap[i].RequestRecordInfo != null ||
                            !isWatchForRequestNeeded)
                        {
                            // CRC ok
                            int positionInGoodData = needRec.LocationInfo.Position;
                            result.Add(new DataPoint(paramInfo.GetValue(_goodPagesOnlyGoodBytes, positionInGoodData),
                                                     needRec.LocationInfo.Time, true, positionInGoodData));
                        }
                    }
                }
            }

            return(result);
        }
 /// <summary>
 /// Для всех сигналов, относящихся к определенному измерителю
 /// </summary>
 /// <param name="psnConfig">Конфигурация ПСН</param>
 /// <param name="meterAddress">Адрес измерителя</param>
 /// <param name="progressAction">Действие при очередном нахождении конфигурации сигнала, если вернет истину - то метод остановится</param>
 public static void ForeachPsnMeterSignal(this IPsnProtocolConfiguration psnConfig, int meterAddress, Func <IPsnProtocolCommandPartConfiguration, IPsnProtocolParameterConfiguration, bool> progressAction)
 {
     foreach (var cmdPart in psnConfig.CommandParts)
     {
         if (cmdPart != null)
         {
             if (cmdPart.Address != null)
             {
                 if (cmdPart.Address.DefinedValue == meterAddress)
                 {
                     foreach (var param in cmdPart.VarParams)
                     {
                         if (!param.Name.StartsWith("#"))
                         {
                             if (progressAction(cmdPart, param))
                             {
                                 return;
                             }
                         }
                     }
                 }
             }
         }
     }
 }
 public PsnChannelTrendLoaderSimple(IPsnProtocolParameterConfiguration signalConfiguration, IPsnProtocolCommandPartConfiguration commandPartConfiguration, IPsnData psnData, IPsnProtocolConfiguration psnConfiguration, IPsnDataInformation psnDataInformation)
 {
     _signalConfiguration      = signalConfiguration;
     _commandPartConfiguration = commandPartConfiguration;
     _psnData            = psnData;
     _psnConfiguration   = psnConfiguration;
     _psnDataInformation = psnDataInformation;
 }
示例#7
0
 public PsnChannelTrendLoaderMerged(IPsnMergedParameter mergedParam, IPsnData psnData, IPsnProtocolConfiguration psnConfiguration, IPsnDataInformation psnDataInformation)
 {
     _mergedParam        = mergedParam;
     _psnData            = psnData;
     _psnConfiguration   = psnConfiguration;
     _psnDataInformation = psnDataInformation;
     _loadedTrendsCount  = 0;
 }
示例#8
0
        public void LoadTrend(IPsnProtocolConfiguration configuration, IPsnProtocolCommandPartConfiguration psnCommandPart, IPsnProtocolParameterConfiguration psnParameterConfig, DateTime beginTime, Action <DataPoint> nextPointLoaded)
        {
            if (_loadedTrendsCount == 0)
            {
                _psnDataHandler.FillResources(configuration, beginTime, configuration.CycleCommandParts, configuration.CommandParts);
            }

            new PsnChannelDataHandler(_psnDataHandler, psnCommandPart, psnParameterConfig, configuration).GetDataPoints(beginTime, nextPointLoaded);
            _loadedTrendsCount++;
        }
        public static void Serialize(string filename, IPsnProtocolConfiguration config, bool includeCustomName)
        {
            var xDoc        = new XDocument();
            var rootElement = new XElement("Parameters");


            AddChildXmlNodesWithParameters(rootElement, config, includeCustomName);

            xDoc.Add(rootElement);
            xDoc.Save(filename);
        }
示例#10
0
        public List <DataPoint> LoadTrend(IPsnProtocolConfiguration configuration, IPsnProtocolCommandPartConfiguration psnCommandPart, IPsnProtocolParameterConfiguration psnParameterConfig, DateTime beginTime)
        {
            if (_loadedTrendsCount == 0)
            {
                _psnDataHandler.FillResources(configuration, beginTime, configuration.CycleCommandParts, configuration.CommandParts);
            }

            var result = new PsnChannelDataHandler(_psnDataHandler, psnCommandPart, psnParameterConfig, configuration).GetDataPoints(beginTime);

            _loadedTrendsCount++;

            return(result);
        }
示例#11
0
        public SharedAppAbilities(string psnProtocolFileName)
        {
            var isFullVersion       = File.Exists("FullVersion.txt");
            var isHalfOrFullVersion = isFullVersion;

            if (!isHalfOrFullVersion)
            {
                isHalfOrFullVersion = File.Exists("HalfVersion.txt");
            }

            Version = isFullVersion ? AppVersion.Full :
                      isHalfOrFullVersion ? AppVersion.Half : AppVersion.Base;

            IsHourCountersVisible = File.Exists("HourCounters.txt");

            PsnProtocolConfiguration = new PsnProtocolConfigurationLoaderFromXml(Path.Combine(Environment.CurrentDirectory, psnProtocolFileName)).LoadConfiguration();

            var allPsnParams = new Dictionary <string, Tuple <IPsnProtocolCommandPartConfiguration, IPsnProtocolParameterConfigurationVariable> >();

            foreach (var psnCommandPart in PsnProtocolConfiguration.CommandParts)
            {
                foreach (var param in psnCommandPart.VarParams)
                {
                    allPsnParams.Add(param.Id.IdentyString, new Tuple <IPsnProtocolCommandPartConfiguration, IPsnProtocolParameterConfigurationVariable>(psnCommandPart, param));
                }
            }

            PsnProtocolConfigurationParams = allPsnParams;
            RtuParamReceiver = new ModbusRtuParamReceiver();

            CmdNotifierStd = new StdNotifier();
            CmdNotifierStd.AddListener(RtuParamReceiver);
            _channels = new Dictionary <string, SerialChannelWithTimeoutMonitorAndSendReplyAbility>();


            var paramLoggerAndRegPoint = new ParamLoggerRegistrationPointThreadSafe();

            ParameterLogger = paramLoggerAndRegPoint;
            ParamLoggerRegistrationPoint = paramLoggerAndRegPoint;

            var paramListener = new CommandPartAndParamListenerSimple(CmdNotifierStd);

            foreach (var cmdPart in PsnProtocolConfiguration.CommandParts)
            {
                paramListener.AddPsnCommandPartConfigurationToListen(cmdPart);
            }

            ParamListener       = paramListener;
            CommandPartListener = paramListener;
        }
示例#12
0
        public void Update(IPsnConfiguration psnConfig, string customName)
        {
            // TODO: improve threading
            // Предполагается, что метод вызывается из потока UI

            _psnConfiguration = psnConfig;

            _psnDataCustomConfigration.SetPsnConfigurationId(new IdentifierStringToLowerBased(_psnConfiguration.Id.ToString().ToLower()));
            _psnDataCustomConfigration.SetCustomLogName(customName);

            _bworker.AddToQueueAndWaitExecution(() => {
                _psnDataCustomConfigurationStorage.Update(_psnDataCustomConfigration.Id, new IdentifierStringToLowerBased(_psnConfiguration.Id.ToString().ToLower()), customName);
                _psnConfigurationLowLevel = _psnProtocolStorage.StoredItems.First(lowConfig => lowConfig.Id.IdentyString == _psnConfiguration.Id.ToString().ToLower());
            });

            RebuildMetersUnsafe();
        }
        public PsnParamsListSimple(IPsnProtocolConfiguration protocolConfig)
        {
            var allPsnParams =
                new Dictionary <string, Tuple <IPsnProtocolCommandPartConfiguration,
                                               IPsnProtocolParameterConfigurationVariable> >();

            foreach (var psnCommandPart in protocolConfig.CommandParts)
            {
                foreach (var param in psnCommandPart.VarParams)
                {
                    allPsnParams.Add(param.Id.IdentyString,
                                     new Tuple <IPsnProtocolCommandPartConfiguration, IPsnProtocolParameterConfigurationVariable>(
                                         psnCommandPart, param));
                }
            }

            PsnProtocolConfigurationParams = allPsnParams;
        }
 /// <summary>
 /// Для всех сигналов конфигурации
 /// </summary>
 /// <param name="psnConfig">Конфигурация ПСН</param>
 /// <param name="progressAction">Действие при очередном нахождении конфигурации сигнала, если вернет истину - то метод остановится</param>
 public static void ForeachPsnParameterConfig(this IPsnProtocolConfiguration psnConfig, Func <IPsnProtocolCommandPartConfiguration, IPsnProtocolParameterConfiguration, bool> progressAction)
 {
     foreach (var cmdPart in psnConfig.CommandParts)
     {
         if (cmdPart != null)
         {
             if (cmdPart.Address != null)
             {
                 foreach (var param in cmdPart.VarParams)
                 {
                     if (progressAction(cmdPart, param))
                     {
                         return;
                     }
                 }
             }
         }
     }
 }
示例#15
0
        public PsnLogRelay(
            IPsnDataInformation psnDataInformation,
            IPsnData psnData,
            IPsnConfiguration psnConfiguration,
            IPsnProtocolConfiguration psnConfigurationLowLevel,
            IPsnDataCustomConfigration psnDataCustomConfigration,
            IThreadNotifier uiNotifier,
            IWorker <Action> bworker,
            IStorage <IPsnProtocolConfiguration> psnProtocolStorage,
            IPsnDataCustomConfigurationsStorage psnDataCustomConfigurationStorage,
            IKeyValueStorageHolder repoStorageHolder)
        {
            _logIntegrity       = PsnLogIntegrity.Unknown;
            _psnDataInformation = psnDataInformation;
            _psnData            = psnData;
            _psnDataPaged       = _psnData.PagesInformation;

            _psnConfiguration         = psnConfiguration;
            _psnConfigurationLowLevel = psnConfigurationLowLevel;

            _psnDataCustomConfigration = new PsnDataCustomConfigurationSimple(
                psnDataCustomConfigration.Id,
                psnDataCustomConfigration.PsnConfigurationId,
                psnDataCustomConfigration.CustomLogName);

            _uiNotifier         = uiNotifier;
            _bworker            = bworker;
            _psnProtocolStorage = psnProtocolStorage;
            _psnDataCustomConfigurationStorage = psnDataCustomConfigurationStorage;

            _meters = new ObservableCollection <IPsnMeter>();

            // TODO: i get logs for FTP logs also
            //_unicSignalIdStorage = new KeyValueStringStorageXmlMemCache(Path.Combine(Support.GetAppDataDirectoryPathAndCreateItIfNeeded(), Id.UnicString + ".Id.xml"));
            _unicSignalIdStorage = repoStorageHolder.GetStorage(Id.UnicString);
            //_unicSignalIdStorage = new KvStorageDbreezed(Id.UnicString);

            RebuildMetersUnsafe();
        }
示例#16
0
        private static void LoadAllStoragedSignals(IPsnDataStorage storage, IPsnProtocolConfiguration config)
        {
            var psnLogsInStorage = storage.PsnDatas.ToList();

            Log("Число ПСН логов на устройстве: " + psnLogsInStorage.Count);
            Log("Конфигурация ПСН: " + config.Information);
            Log("Загрузка всех сигналов для всех логов...");
            foreach (var psnLog in psnLogsInStorage)
            {
                Console.WriteLine("PsnLog " + psnLog);
                foreach (var psnDev in config.PsnDevices)
                {
                    Log("Работаем с абонентом ПСН: " + psnDev.Name);
                    IPsnData log = psnLog;
                    IPsnProtocolDeviceConfiguration dev = psnDev;
                    config.ForeachPsnMeterSignal(psnDev.Address, (cmdPartConfiguration, parameterConfiguration) => {
                        var points = log.LoadTrend(config, cmdPartConfiguration, parameterConfiguration, DateTime.Now);
                        Console.WriteLine(dev.Name + "/" + parameterConfiguration.Name + " = " + points.Count);
                        return(false);
                    });
                }
            }
        }
        private static void AddChildXmlNodesWithParameters(XElement parametersRootElement,
                                                           IPsnProtocolConfiguration config, bool includeCustomName)
        {
            foreach (var commandPart in config.CommandParts)
            {
                var address      = (int)commandPart.Address.DefinedValue;
                var command      = (int)commandPart.CommandCode.DefinedValue;
                var signalNumber = 1;
                foreach (var varParam in commandPart.VarParams)
                {
                    if (varParam.Name.StartsWith("#"))
                    {
                        continue;
                    }

                    var key = "param_" +
                              address.ToString("d3") + "_" +
                              command.ToString("d3") + "_" +
                              (commandPart.PartType == PsnProtocolCommandPartType.Request ? "request_" : "reply_") +
                              signalNumber.ToString("d3");


                    var node = new XElement("Parameter", new XAttribute("Key", key),
                                            new XAttribute("Identifier", varParam.Id.IdentyString));
                    if (includeCustomName)
                    {
                        node.Add(new XAttribute("CustomName", varParam.Name));
                    }

                    node.Add(new XAttribute("Comment", commandPart.PartName + " - " + varParam.Name));

                    parametersRootElement.Add(node);
                    signalNumber++;
                }
            }
        }
 public PsnProtocolConfigBuilderFromLowLevel(IPsnProtocolConfiguration psnInternalConfig)
 {
     _psnInternalConfig = psnInternalConfig;
 }
 public CommandPartAndParamListenerSimple(IIOListener ioListener, IPsnProtocolConfiguration configuration)
 {
     _stdListener   = ioListener;
     _configuration = configuration;
     _stdListener.CommandPartHeared += StdListenerCommandPartHeared;
 }