Animatroller.PostProcessor.FindLoop.Execute C# (CSharp) Method

Execute() public method

public Execute ( ) : void
return void
        public void Execute()
        {
            // Find all universes and the first data in each
            var firstData = new Dictionary<int, byte[]>();
            var currentData = new Dictionary<int, byte[]>();

            var diffList = new List<Tuple<double, long>>();

            while (this.fileReader.DataAvailable)
            {
                long pos = this.fileReader.Position;

                var data = this.fileReader.ReadFrame();

                if (data.DataType != Common.DmxData.DataTypes.FullFrame)
                    continue;

                if (!firstData.ContainsKey(data.Universe))
                {
                    firstData.Add(data.Universe, data.Data);
                }
                else
                {
                    currentData[data.Universe] = data.Data;

                    // Compare
                    int? diff = null;
                    int dataElements = 0;
                    foreach (var kvp in firstData)
                    {
                        byte[] compareData;
                        if (!currentData.TryGetValue(kvp.Key, out compareData))
                        {
                            diff = null;
                            break;
                        }

                        if (!diff.HasValue)
                            diff = 0;
                        int maxLen = Math.Min(kvp.Value.Length, compareData.Length);
                        for (int i = 0; i < maxLen; i++)
                            diff += Math.Abs(kvp.Value[i] - compareData[i]);
                        dataElements += maxLen;
                    }

                    if (diff.HasValue)
                        diffList.Add(Tuple.Create((double)diff.Value / dataElements, pos));
                }
            }

            diffList = diffList.OrderBy(x => x.Item1).ToList();

            foreach (var match in diffList.Take(10))
            {
                Console.WriteLine("Pos {0:P2}   Mismatch {1:P2}   TrimPos: {2}", (double)match.Item2 / this.fileReader.Length, match.Item1 / 100.0,
                    match.Item2);
            }
        }

Usage Example

示例#1
0
        public static void Main(string[] args)
        {
            try
            {
                var arguments = Args.Parse<Arguments>(args);

                using (var fileReader = new Common.BinaryFileReader(arguments.Inputfile))
                {
                    Common.BinaryFileWriter fileWriter = null;

                    switch (arguments.Command)
                    {
                        case Arguments.Commands.TrimBlack:
                            fileWriter = new Common.BinaryFileWriter(arguments.OutputFile);
                            var trimBlackCommand = new TrimBlack(fileReader, fileWriter);
                            trimBlackCommand.Execute();
                            break;

                        case Arguments.Commands.FindLoop:
                            var findLoopCommand = new FindLoop(fileReader);
                            findLoopCommand.Execute();
                            break;

                        case Arguments.Commands.TrimEnd:
                            fileWriter = new Common.BinaryFileWriter(arguments.OutputFile);
                            var trimEndCommand = new TrimEnd(fileReader, fileWriter, arguments.TrimPos);
                            trimEndCommand.Execute();
                            break;
                    }

                    if (fileWriter != null)
                        fileWriter.Dispose();
                }
            }
            catch (ArgException ex)
            {
                Console.WriteLine("Argument error {0}", ex.Message);

                Console.WriteLine(ArgUsage.GenerateUsageFromTemplate<Arguments>());
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unhandled exception: {0}", ex);
            }
        }