Beispiel #1
0
        public static Frame[] SplitToFrames(string message, AstmLowLevelSettings lowLevelSettings)
        {
            var lines  = message.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            var frames = new List <Frame>();
            var fn     = 1;

            foreach (var line in lines)
            {
                var lineCopy = line;
                while (lineCopy.Length > Frame.BODY_MAX_LENGTH)
                {
                    var body = lineCopy.Substring(0, Frame.BODY_MAX_LENGTH);
                    lineCopy = lineCopy.Substring(Frame.BODY_MAX_LENGTH);
                    frames.Add(new Frame(body, fn, FrameTypes.IntermediateFrame, lowLevelSettings));
                    fn = IncrementFN(fn);
                }

                if (lineCopy.Length > 0)
                {
                    frames.Add(new Frame(lineCopy, fn, FrameTypes.TerminationFrame, lowLevelSettings));
                }

                fn = IncrementFN(fn);
            }

            return(frames.ToArray());
        }
Beispiel #2
0
 public Downloader(IAstmChannel stream, AstmLowLevelSettings lowLevelSettings, ITimersManager timersManager, ILogger <Downloader> log)
 {
     _stream           = stream;
     _lowLevelSettings = lowLevelSettings;
     _timersManager    = timersManager;
     _log = log;
     _timersManager.CreateTimer(WAIT_FRAME_TIMER_NAME);
 }
Beispiel #3
0
        /// <summary>
        /// Parse string and retrive frame. Note that parsing include checking CRC, and in case of CRC is not equal to calculated
        /// than method throw exception
        /// </summary>
        /// <param name="frame"></param>
        /// <returns></returns>
        /// <exception cref="FrameParseException"></exception>
        public static Frame Parse(string line, AstmLowLevelSettings lowLevelSettings)
        {
            // Trim STX
            line = line.TrimStart(new char[] { (char)0x02 });

            //Trim CR LF
            line = line.TrimEnd(new char[] { (char)0x0D, (char)0xA });

            // Extract FN
            var fn = -1;

            try
            {
                fn = int.Parse(line[0].ToString());
            }
            catch (FormatException)
            {
                throw new FrameParseException("Can not parse FN in frame '{0}'", line);
            }

            // Extract CRC
            var crc = line.Substring(line.Length - 2);

            // Extract terminator
            var        terminator = line.Substring(line.Length - 3, 1)[0];
            FrameTypes frameType;

            if (terminator == (char)0x17)
            {
                frameType = FrameTypes.IntermediateFrame;
            }
            else if (terminator == (char)0x03)
            {
                frameType = FrameTypes.TerminationFrame;
            }
            else
            {
                throw new FrameParseException("Can not parse terminator in frame '{0}'", line);
            }

            // Extract body
            var body = line.Substring(1, line.Length - 4);

            Frame frame;

            try
            {
                frame = new Frame(body, fn, frameType, lowLevelSettings);
            }
            catch (FrameConstructionException frameConstructionException)
            {
                throw new FrameParseException(frameConstructionException, "Error while frame constructioning occured");
            }

            return(frame);
        }
Beispiel #4
0
 public Uploader(IAstmChannel stream, AstmLowLevelSettings lowLevelSettings, ITimersManager timersManager, ILogger <Uploader> log)
 {
     _stream        = stream;
     _timersManager = timersManager;
     _log           = log;
     _timersManager.CreateTimer(WAIT_ANSWER_TIMER_NAME);
     _timersManager.CreateTimer(WAIT_DELAY_TIMER_NAME);
     _havePriority     = lowLevelSettings.HavePriority;
     _lowLevelSettings = lowLevelSettings;
     _timersManager    = timersManager;
 }
Beispiel #5
0
 public AstmIOController(
     IAstmChannel stream,
     AstmLowLevelSettings lowLevelSettings,
     ILoggerFactory factory) : this(
         stream,
         lowLevelSettings,
         new Uploader(stream, lowLevelSettings, new TimersManager(), factory.CreateLogger <Uploader>()),
         new Downloader(stream, lowLevelSettings, new TimersManager(), factory.CreateLogger <Downloader>()),
         new TimersManager(),
         factory.CreateLogger <AstmIOController>())
 {
 }
Beispiel #6
0
 protected AstmIOController(
     IAstmChannel stream,
     AstmLowLevelSettings lowLevelSettings,
     IUploader uploader,
     IDownloader downloader,
     ITimersManager timersManager,
     ILogger <AstmIOController> log)
 {
     _stream           = stream;
     _uploader         = uploader;
     _downloader       = downloader;
     _lowLevelSettings = lowLevelSettings;
     _timersManager    = timersManager;
     _log = log;
     _timersManager.CreateTimer(DISABLE_UPLOAD_TIMER_NAME);
 }
Beispiel #7
0
        public Frame(string body, int fn, FrameTypes frameType, AstmLowLevelSettings lowLevelSettings)
        {
            _lowLevelSettings = lowLevelSettings;

            if (string.IsNullOrEmpty(body))
            {
                throw new FrameConstructionException("Can not construct frame", new ArgumentNullException("Body is null or empty"));
            }

            if (body.Length > _lowLevelSettings.MaxFrameLength)
            {
                throw new FrameConstructionException("Can not construct frame", new ArgumentException("Body length is exceeded 240"));
            }

            if (fn < 0 || fn > 7)
            {
                throw new FrameConstructionException("Can not construct frame", new ArgumentOutOfRangeException("FN must be between 0..7"));
            }

            Body              = body;
            FN                = fn;
            FrameType         = frameType;
            _lowLevelSettings = lowLevelSettings;
        }
        public void IntegrationTest()
        {
            string    uploadedMessage   = null;
            string    downloadedMessage = null;
            Exception uploadException   = null;
            Exception downloadException = null;
            var       message           = @"tests\r\n"
                                          + "esttesttesttesttesttesttestesttesttesttesttesttesttesttestesttesttesttestt"
                                          + "esttesttesttestesttesttesttesttesttesttesttestesttesttesttesttesttesttesttestesttes"
                                          + "ttesttesttesttesttesttestesttesttesttesttesttesttesttestesttesttesttestte"
                                          + "sttesttesttestesttesttesttesttesttesttesttestesttesttesttesttesttesttesttest\r\n";
            var loggingFactory = new LoggerFactory();

            loggingFactory.AddProvider(new DebugLoggerProvider());

            var buf1 = new Queue <byte>();
            var buf2 = new Queue <byte>();

            var taskListener = Task.Run(async() =>
            {
                var stream           = new InMemoryChannel(buf1, buf2);
                var lowLevelSettings = new AstmLowLevelSettings();

                var controller = new AstmIOController(stream, lowLevelSettings, loggingFactory);

                controller.Start();
                controller.AddMessageToUploadQueue(message);
                controller.MessageUploadCompleted += (sender, args) =>
                {
                    controller.Stop();
                    uploadedMessage = args.Message;
                    uploadException = args.OccuredException;
                };
                while (controller.IsRunning)
                {
                    await Task.Delay(100);
                }
            });

            var taskClient = Task.Run(async() =>
            {
                var stream           = new InMemoryChannel(buf2, buf1);
                var lowLevelSettings = new AstmLowLevelSettings();

                var controller = new AstmIOController(stream, lowLevelSettings, loggingFactory);

                controller.Start();
                controller.MessageDownloadCompleted += (sender, args) =>
                {
                    downloadedMessage = args.Message;
                    downloadException = args.OccuredException;
                    controller.Stop();
                };
                while (controller.IsRunning)
                {
                    await Task.Delay(100);
                }
            });

            Task.WaitAll(taskClient, taskListener);

            uploadException.ShouldBeNull();
            downloadException.ShouldBeNull();
            uploadedMessage.ShouldBe(message);
            downloadedMessage.ShouldBe(message);
        }