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()); }
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); }
/// <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); }
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; }
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>()) { }
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); }
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); }