Changeset 875


Ignore:
Timestamp:
Nov 21, 2009, 2:42:02 PM (12 years ago)
Author:
Sören Rinne
Message:

LFSR:

  • LFSR now displays QuickWatch on-the-fly when entering polynomial and seed in settings pane.
  • LFSR computes its period and displays it in the settings pane.

TextOutput:

  • if settings.BooleanAsNumeric is true, the length of the TextOutput value is measured in Bits instead of Bytes.
Location:
trunk/CrypPlugins
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/LFSR/LFSR.cs

    r841 r875  
    2121// for RegEx
    2222using System.Text.RegularExpressions;
     23// for Brushes
     24using System.Windows.Media;
    2325
    2426namespace Cryptool.LFSR
     
    5557
    5658        // for process()
    57         public char[] tapSequenceCharArray = null;
     59        public char[] tapSequenceCharArray = {'0'}; // dummy value for preprocessing()
    5860        public int seedBits = 1; // dummy value for compiler
    5961        public int actualRounds = 1; // dummy value for compiler
     
    8183        {
    8284            if (e.PropertyName == "InitLFSR")
    83                 preprocessingLFSR();
     85                try
     86                {
     87                    preprocessingLFSR(true);
     88                } catch (Exception ex) {}
    8489            if (e.PropertyName == "SaveCurrentState")
    8590            {
     
    8893                else
    8994                    settings.CurrentState = null;
     95            }
     96            if (e.PropertyName == "Polynomial" || e.PropertyName == "Seed")
     97            {
     98                int myPeriod = computePeriod();
     99                if (myPeriod == ((int)Math.Pow(2.0,(double)seedbuffer.Length) - 1))
     100                    settings.Period = "Period of LFSR: " + myPeriod.ToString() + " (max.)";
     101                else
     102                    settings.Period = "Period of LFSR: " + myPeriod.ToString();
     103                //GuiLogMessage("Period: " + myPeriod, NotificationLevel.Info, true);
    90104            }
    91105        }
     
    242256            catch (Exception ex)
    243257            {
    244                 GuiLogMessage(ex.Message, NotificationLevel.Error);
     258                GuiLogMessage(ex.Message, NotificationLevel.Error, true);
    245259            }
    246260            this.stop = false;
     
    256270            {
    257271                // awaiting polynomial from input
    258                 GuiLogMessage("No feedback polynomial given in settings. Awaiting external input.", NotificationLevel.Info);
     272                GuiLogMessage("No feedback polynomial given in settings. Awaiting external input.", NotificationLevel.Info, true);
    259273            }
    260274            else
     
    271285                inputTapSequence = dummystring;
    272286                // write a warning to the outside world
    273                 GuiLogMessage("WARNING - No TapSequence provided. Using dummy data (" + dummystring + ").", NotificationLevel.Warning);
     287                GuiLogMessage("WARNING - No TapSequence provided. Using dummy data (" + dummystring + ").", NotificationLevel.Warning, true);
    274288                return 1;
    275289            }
     
    285299            {
    286300                // awaiting seed from input
    287                 GuiLogMessage("No seed given in settings. Awaiting external input.", NotificationLevel.Info);
     301                GuiLogMessage("No seed given in settings. Awaiting external input.", NotificationLevel.Info, true);
    288302            }
    289303            else
     
    300314                inputSeed = dummystring;
    301315                // write a warning to the outside world
    302                 GuiLogMessage("WARNING - No Seed provided. Using dummy data (" + dummystring + ").", NotificationLevel.Warning);
     316                GuiLogMessage("WARNING - No Seed provided. Using dummy data (" + dummystring + ").", NotificationLevel.Warning, true);
    303317                return 1;
    304318            }
     
    356370
    357371            strPolyBinary = new String(ReverseOrder(strPolyBinary.ToCharArray()));
    358             //GuiLogMessage("strPolyBinary is: " + strPolyBinary, NotificationLevel.Info);
     372            //GuiLogMessage("strPolyBinary is: " + strPolyBinary, NotificationLevel.Info, true);
    359373
    360374            return strPolyBinary;
     
    376390        {
    377391            //String tempString = new String(tapSequence);
    378             //GuiLogMessage("tapSequence before = " + tempString, NotificationLevel.Info);
     392            //GuiLogMessage("tapSequence before = " + tempString, NotificationLevel.Info, true);
    379393            char[] tempCharArray = new char[tapSequence.Length];
    380394
     
    384398                temp = (j - tapSequence.Length + 1) % (tapSequence.Length);
    385399                if (temp < 0) temp *= -1;
    386                 //GuiLogMessage("temp = " + temp, NotificationLevel.Info);
     400                //GuiLogMessage("temp = " + temp, NotificationLevel.Info, true);
    387401                tempCharArray[j] = tapSequence[temp];
    388402            }
    389403            //tempString = new String(tempCharArray);
    390             //GuiLogMessage("tapSequence after = " + tempString, NotificationLevel.Info);
     404            //GuiLogMessage("tapSequence after = " + tempString, NotificationLevel.Info, true);
    391405            return tempCharArray;
    392406        }
     
    415429        }
    416430
     431        private int computePeriod()
     432        {
     433            int period = 0;
     434
     435            try
     436            {
     437                preprocessingLFSR(false);
     438            }
     439            catch (Exception ex) { }
     440
     441            if (lFSRPresentation.ReturnBackgroundColour() == Brushes.White)
     442            {
     443                try {
     444                    // compute period if everything is OK
     445                    string compareToSeedbuffer = seedbuffer;
     446
     447                    for (int i = 1; i <= 1000; i++)
     448                    {
     449                        char newBit = '0';
     450
     451                        // compute new bit
     452                        bool firstDone = false;
     453                        for (int j = 0; j < seedBits; j++)
     454                        {
     455                            // check if tapSequence is 1
     456                            if (tapSequenceCharArray[j] == '1')
     457                            {
     458                                // if it is the first one, just take it
     459                                if (!firstDone)
     460                                {
     461                                    newBit = seedCharArray[j];
     462                                    firstDone = true;
     463                                }
     464                                // or do an XOR with the last computed bit
     465                                else
     466                                {
     467                                    newBit = (newBit ^ seedCharArray[j]).ToString()[0];
     468                                }
     469                            }
     470                        }
     471
     472                        // shift seed array
     473                        for (int j = seedBits - 1; j > 0; j--)
     474                        {
     475                            seedCharArray[j] = seedCharArray[j - 1];
     476                        }
     477                        seedCharArray[0] = newBit;
     478
     479                        // write current "seed" back to seedbuffer
     480                        seedbuffer = null;
     481                        foreach (char c in seedCharArray) seedbuffer += c;
     482
     483                        if (seedbuffer == compareToSeedbuffer)
     484                            return i;
     485                    }
     486                } catch (Exception ex) {
     487
     488                }
     489            }
     490
     491            return period;
     492        }
     493
    417494        #endregion
    418495
     
    423500        }
    424501
    425         private void preprocessingLFSR()
     502        private void preprocessingLFSR(bool createLog)
    426503        {
    427504            if (checkForInputTapSequence() == 1) return;
     
    430507            /*if (inputSeed == null || (inputSeed != null && inputSeed.Length == 0))
    431508            {
    432                 GuiLogMessage("No Seed given. Aborting now.", NotificationLevel.Error);
     509                GuiLogMessage("No Seed given. Aborting now.", NotificationLevel.Error, true);
    433510                if (!settings.UseBoolClock) inputClock.Close();
    434511                return;
     
    437514            if (inputTapSequence == null || (inputTapSequence != null && inputTapSequence.Length == 0))
    438515            {
    439                 GuiLogMessage("No TapSequence given. Aborting now.", NotificationLevel.Error);
     516                GuiLogMessage("No TapSequence given. Aborting now.", NotificationLevel.Error, true);
    440517                if (!settings.UseBoolClock) inputClock.Close();
    441518                return;
     
    470547            if (!tapSeqisBool)
    471548            {
    472                 GuiLogMessage("TapSequence is not binary. Awaiting polynomial.", NotificationLevel.Info);
     549                GuiLogMessage("TapSequence is not binary. Awaiting polynomial.", NotificationLevel.Info, createLog);
    473550                if (IsPolynomial(tapSequencebuffer))
    474551                {
    475                     GuiLogMessage(tapSequencebuffer + " is a valid polynomial.", NotificationLevel.Info);
     552                    GuiLogMessage(tapSequencebuffer + " is a valid polynomial.", NotificationLevel.Info, createLog);
    476553                    tapSequencebuffer = MakeBinary(tapSequencebuffer);
    477                     GuiLogMessage("Polynomial in binary form: " + tapSequencebuffer, NotificationLevel.Info);
     554                    GuiLogMessage("Polynomial in binary form: " + tapSequencebuffer, NotificationLevel.Info, createLog);
    478555
    479556                    // check if polynomial has false length
     
    483560                        if (inputSeed.Length - tapSequencebuffer.Length < 0)
    484561                        {
    485                             GuiLogMessage("ERROR - Your polynomial " + tapSequencebuffer + " is TOO LONG (" + tapSequencebuffer.Length + " Bits) for your seed. Aborting now.", NotificationLevel.Error);
     562                            GuiLogMessage("ERROR - Your polynomial " + tapSequencebuffer + " is TOO LONG (" + tapSequencebuffer.Length + " Bits) for your seed. Aborting now.", NotificationLevel.Error, true);
    486563                            if (!settings.UseBoolClock) inputClock.Close();
    487564                            return;
     
    495572                            }
    496573                        }*/
    497                         GuiLogMessage("ERROR - Your polynomial " + tapSequencebuffer + " has to be the same length (" + tapSequencebuffer.Length + " Bits) as your seed (" + seedbuffer.Length + " Bits). Aborting now.", NotificationLevel.Error);
     574                        GuiLogMessage("ERROR - Your polynomial " + tapSequencebuffer + " has to be the same length (" + tapSequencebuffer.Length + " Bits) as your seed (" + seedbuffer.Length + " Bits). Aborting now.", NotificationLevel.Error, createLog);
    498575                        Dispose();
    499576                        return;
    500577                    }
    501578
    502                     //GuiLogMessage("Polynomial after length fitting: " + tapSequencebuffer, NotificationLevel.Info);
     579                    //GuiLogMessage("Polynomial after length fitting: " + tapSequencebuffer, NotificationLevel.Info, true);
    503580                }
    504581                else
    505582                {
    506                     GuiLogMessage("ERROR - " + tapSequencebuffer + " is NOT a valid polynomial. Aborting now.", NotificationLevel.Error);
     583                    GuiLogMessage("ERROR - " + tapSequencebuffer + " is NOT a valid polynomial. Aborting now.", NotificationLevel.Error, createLog);
    507584                    //Console.WriteLine("\n{0} is NOT a valid polynomial.", tapSequencebuffer);
    508585                    Dispose();
     
    518595            {
    519596                // stop, because seed and tapSequence must have same length
    520                 GuiLogMessage("ERROR - Seed and tapSequence must have same length. Aborting now.", NotificationLevel.Error);
     597                GuiLogMessage("ERROR - Seed and tapSequence must have same length. Aborting now.", NotificationLevel.Error, createLog);
    521598                Dispose();
    522599                return;
     
    526603            seedBits = seedbuffer.Length;
    527604
    528             GuiLogMessage("inputTapSequence length [bits]: " + tapSequenceBits.ToString(), NotificationLevel.Debug);
    529             GuiLogMessage("inputSeed length [bits]: " + seedBits.ToString(), NotificationLevel.Debug);
     605            GuiLogMessage("inputTapSequence length [bits]: " + tapSequenceBits.ToString(), NotificationLevel.Debug, createLog);
     606            GuiLogMessage("inputSeed length [bits]: " + seedBits.ToString(), NotificationLevel.Debug, createLog);
    530607
    531608            //check if last tap is 1, otherwise stop
    532609            if (tapSequenceCharArray[tapSequenceCharArray.Length - 1] == '0')
    533610            {
    534                 GuiLogMessage("ERROR - Last tap of tapSequence must be 1. Aborting now.", NotificationLevel.Error);
     611                GuiLogMessage("ERROR - Last tap of tapSequence must be 1. Aborting now.", NotificationLevel.Error, createLog);
    535612                return;
    536613            }
     
    544621                if (character != '0' && character != '1')
    545622                {
    546                     GuiLogMessage("ERROR 0 - Seed has to be binary. Aborting now. Character is: " + character, NotificationLevel.Error);
     623                    GuiLogMessage("ERROR 0 - Seed has to be binary. Aborting now. Character is: " + character, NotificationLevel.Error, createLog);
    547624                    return;
    548625                }
     
    554631                {
    555632                    clocking = -1;
    556                     GuiLogMessage("WARNING: Clocking Bit is too high. Ignored.", NotificationLevel.Warning);
     633                    GuiLogMessage("WARNING: Clocking Bit is too high. Ignored.", NotificationLevel.Warning, createLog);
    557634                }
    558635
     
    603680            {
    604681                if (!settings.UseBoolClock) return;
    605                 //GuiLogMessage("First if.", NotificationLevel.Info);
     682                //GuiLogMessage("First if.", NotificationLevel.Info, true);
    606683            }
    607684                // if last event wasn't from the clock but clock shall be
     
    611688                // do nothing if we should use bool clock, but become event from other inputs
    612689                if (settings.UseBoolClock) return;
    613                 //GuiLogMessage("Second if.", NotificationLevel.Info);
     690                //GuiLogMessage("Second if.", NotificationLevel.Info, true);
    614691            }
    615692            // process LFSR
     
    632709                if (newSeed)
    633710                {
    634                     preprocessingLFSR();
     711                    try
     712                    {
     713                        preprocessingLFSR(true);
     714                        int myPeriod = computePeriod();
     715                        if (myPeriod == ((int)Math.Pow(2.0, (double)seedbuffer.Length) - 1))
     716                            settings.Period = "Period of LFSR: " + myPeriod.ToString() + " (max.)";
     717                        else
     718                            settings.Period = "Period of LFSR: " + myPeriod.ToString();
     719                    } catch (Exception ex) { }
    635720                }
    636721               
     
    658743                outputStream.OpenWrite();
    659744
    660                 //GuiLogMessage("Action is: Now!", NotificationLevel.Debug);
     745                //GuiLogMessage("Action is: Now!", NotificationLevel.Debug, true);
    661746                DateTime startTime = DateTime.Now;
    662747
     
    664749                // compute LFSR //////////////////////////////////////
    665750                //////////////////////////////////////////////////////
    666                 GuiLogMessage("Starting computation", NotificationLevel.Debug);
     751                GuiLogMessage("Starting computation", NotificationLevel.Debug, true);
    667752               
    668753                int i = 0;
     
    678763                        if (seedCharArray[seedBits - 1] == '0') outputBool = false;
    679764                        else outputBool = true;
    680                         //GuiLogMessage("OutputBool is: " + outputBool.ToString(), NotificationLevel.Info);
     765                        //GuiLogMessage("OutputBool is: " + outputBool.ToString(), NotificationLevel.Info, true);
    681766
    682767                        // write last bit to output buffer, output stream buffer, stream and bool
     
    719804                        {
    720805                            seedCharArray[j] = seedCharArray[j - 1];
    721                             //GuiLogMessage("seedCharArray[" + j + "] is: " + seedCharArray[j], NotificationLevel.Info);
     806                            //GuiLogMessage("seedCharArray[" + j + "] is: " + seedCharArray[j], NotificationLevel.Info, true);
    722807                        }
    723808                        seedCharArray[0] = newBit;
     
    733818                        foreach (char c in seedCharArray) seedbuffer += c;
    734819
    735                         //GuiLogMessage("New Bit: " + newBit.ToString(), NotificationLevel.Info);
     820                        //GuiLogMessage("New Bit: " + newBit.ToString(), NotificationLevel.Info, true);
    736821                    }
    737822                    else
     
    756841                                outputbuffer = outputBit;
    757842                            }
    758                             //GuiLogMessage("OutputBool is: " + outputBool.ToString(), NotificationLevel.Info);
     843                            //GuiLogMessage("OutputBool is: " + outputBool.ToString(), NotificationLevel.Info, true);
    759844
    760845                            // write bit to output buffer, stream and bool
     
    810895                    OnPropertyChanged("OutputString");
    811896
    812                     GuiLogMessage("Complete!", NotificationLevel.Debug);
    813 
    814                     GuiLogMessage("Time used: " + duration, NotificationLevel.Debug);
     897                    GuiLogMessage("Complete!", NotificationLevel.Debug, true);
     898
     899                    GuiLogMessage("Time used: " + duration, NotificationLevel.Debug, true);
    815900                    outputStream.Close();
    816901                    OnPropertyChanged("OutputStream");
     
    821906                    outputStream.Close();
    822907                    outputStringBuffer = null;
    823                     GuiLogMessage("Aborted!", NotificationLevel.Debug);
     908                    GuiLogMessage("Aborted!", NotificationLevel.Debug, true);
    824909                }
    825910            }
    826911            catch (Exception exception)
    827912            {
    828                 GuiLogMessage(exception.Message, NotificationLevel.Error);
     913                GuiLogMessage(exception.Message, NotificationLevel.Error, true);
    829914            }
    830915            finally
     
    838923        public void Initialize()
    839924        {
     925            lFSRPresentation.ChangeBackground(NotificationLevel.Info);
    840926        }
    841927
     
    843929
    844930        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
    845         private void GuiLogMessage(string message, NotificationLevel logLevel)
    846         {
    847             EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
     931        private void GuiLogMessage(string message, NotificationLevel logLevel, bool createLogOrChangeBackground)
     932        {
     933            if (createLogOrChangeBackground) EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
     934            else lFSRPresentation.ChangeBackground(logLevel);
    848935        }
    849936
  • trunk/CrypPlugins/LFSR/LFSRPresentation.xaml

    r285 r875  
    33    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    44             Height="Auto" Width="Auto" Margin="0" Background="White" BorderBrush="Black" BorderThickness="1">
    5     <Grid>
     5    <Grid Name="completeGrid">
    66        <Grid Height="50" Width="Auto" Margin="5,0,0,60" Name="polynomialGrid" HorizontalAlignment="Left" VerticalAlignment="Center">
    77            <Label Name="polynomialText"></Label>
  • trunk/CrypPlugins/LFSR/LFSRPresentation.xaml.cs

    r841 r875  
    1515using System.Windows.Automation.Peers;
    1616using System.Windows.Threading;
     17using Cryptool.PluginBase;
    1718
    1819namespace Cryptool.LFSR
     
    328329            }, null);
    329330        }
     331
     332        public void ChangeBackground(NotificationLevel logLevel)
     333        {
     334            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     335            {
     336                if (logLevel == NotificationLevel.Warning) completeGrid.Background = Brushes.Gold;
     337                if (logLevel == NotificationLevel.Error) completeGrid.Background = Brushes.Red;
     338                if (logLevel == NotificationLevel.Info) completeGrid.Background = Brushes.White;
     339            }, null);
     340        }
     341
     342        public Brush ReturnBackgroundColour()
     343        {
     344            Brush myBrush = null;
     345            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     346            {
     347                if (completeGrid != null)
     348                    myBrush = completeGrid.Background;
     349            }, null);
     350
     351            return myBrush;
     352        }
    330353    }
    331354}
  • trunk/CrypPlugins/LFSR/LFSRSettings.cs

    r832 r875  
    4545        //[ContextMenu("Rounds", "How many bits shall be generated?", 1, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, new int[] { 10, 50, 100 }, "10 bits", "50 bits", "100 bits")]
    4646        //[TaskPane("Rounds", "How many bits shall be generated?", null, 1, false, DisplayLevel.Beginner, ControlType.TextBox)]
    47         [TaskPane("Number of rounds", "How many bits shall be generated? Note: This only applies if no external clock is used.", null, 2, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, int.MaxValue)]
     47        [TaskPane("Number of rounds", "How many bits shall be generated? Note: This only applies if no external clock is used.", null, 3, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, int.MaxValue)]
    4848        public int Rounds
    4949        {
     
    8282        }
    8383
     84        string period;
     85        [TaskPane("Period", "The computed period of the LFSR", null, 2, false, DisplayLevel.Beginner, ControlType.TextBoxReadOnly)]
     86        public string Period
     87        {
     88            get { return this.period; }
     89            set
     90            {
     91                this.period = value;
     92                OnPropertyChanged("Period");
     93            }
     94        }
     95
    8496        private bool noQuickwatch = false;
    8597        [ContextMenu("Do not display Quickwatch", "With this checkbox enabled, no quickwatch will be generated for a better performance.", 0, DisplayLevel.Experienced, ContextMenuControlType.CheckBox, null, new string[] { "Display Quickwatch?" })]
     
    173185        }
    174186
    175         /*private bool createDirtyOutputOnFalseClock = false;
    176         [ContextMenu("Create dirty output on false clock", "With this checkbox enabled, an the output is the dirty (-1) if the clock is set to false.", 2, DisplayLevel.Experienced, ContextMenuControlType.CheckBox, null, new string[] { "Create dirty output?" })]
    177         [TaskPane("Create dirty output on false clock", "With this checkbox enabled, an the output is the dirty (-1) if the clock is set to false.", "Clock Properties", 2, false, DisplayLevel.Beginner, ControlType.CheckBox, "", null)]
    178         public bool CreateDirtyOutputOnFalseClock
    179         {
    180             get { return this.createDirtyOutputOnFalseClock; }
    181             set
    182             {
    183                 this.createDirtyOutputOnFalseClock = (bool)value;
    184                 OnPropertyChanged("CreateDirtyOutputOnFalseClock");
    185                 HasChanges = true;
    186             }
    187         }*/
    188 
    189187        public bool HasChanges
    190188        {
  • trunk/CrypPlugins/TextOutput/TextOutput.cs

    r520 r875  
    538538            textOutputQuickWatchPresentation.textBox.Text = fillValue;
    539539          }
    540           textOutputPresentation.labelBytes.Content = string.Format("{0:0,0}", Encoding.Default.GetBytes(textOutputPresentation.textBox.Text.ToCharArray()).Length) + " Bytes";
    541           textOutputQuickWatchPresentation.labelBytes.Content = string.Format("{0:0,0}", Encoding.Default.GetBytes(textOutputPresentation.textBox.Text.ToCharArray()).Length) + " Bytes";
     540          if (settings.BooleanAsNumeric)
     541          {
     542              textOutputPresentation.labelBytes.Content = string.Format("{0:0,0}", Encoding.Default.GetBytes(textOutputPresentation.textBox.Text.ToCharArray()).Length) + " Bits";
     543              textOutputQuickWatchPresentation.labelBytes.Content = string.Format("{0:0,0}", Encoding.Default.GetBytes(textOutputPresentation.textBox.Text.ToCharArray()).Length) + " Bits";
     544          }
     545          else
     546          {
     547              textOutputPresentation.labelBytes.Content = string.Format("{0:0,0}", Encoding.Default.GetBytes(textOutputPresentation.textBox.Text.ToCharArray()).Length) + " Bytes";
     548              textOutputQuickWatchPresentation.labelBytes.Content = string.Format("{0:0,0}", Encoding.Default.GetBytes(textOutputPresentation.textBox.Text.ToCharArray()).Length) + " Bytes";
     549          }
    542550        }, fillValue);
    543551      }
Note: See TracChangeset for help on using the changeset viewer.