1 //
2 // Copyright (c) 2010-2022 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 using Antmicro.Renode.Core;
9 using Antmicro.Renode.Exceptions;
10 using Antmicro.Renode.Peripherals.UART;
11 
12 namespace Antmicro.Renode.Utilities
13 {
14     public static class UartExtensions
15     {
DumpHistoryBuffer(this IUART uart, int limit = 0)16         public static string DumpHistoryBuffer(this IUART uart, int limit = 0)
17         {
18             var emu = EmulationManager.Instance.CurrentEmulation;
19             if(!emu.BackendManager.TryGetBackendFor(uart, out var backend))
20             {
21                 throw new RecoverableException($"No backend found for {uart}");
22             }
23 
24             if(backend is UARTBackend uartBackend)
25             {
26                 return uartBackend.DumpHistoryBuffer(limit);
27             }
28 
29             throw new RecoverableException($"Unsupported type of backend for {uart}: {backend.GetType()}");
30         }
31 
WriteLine(this IUART uart, string text, bool appendCarriageReturn = true)32         public static void WriteLine(this IUART uart, string text, bool appendCarriageReturn = true)
33         {
34             uart.WriteLine(text, appendCarriageReturn ? LineEnding.CR : LineEnding.None);
35         }
36 
WriteLine(this IUART uart, string text, LineEnding lineEnding = LineEnding.CR)37         public static void WriteLine(this IUART uart, string text, LineEnding lineEnding = LineEnding.CR)
38         {
39             foreach(var chr in text)
40             {
41                 uart.WriteChar((byte)chr);
42             }
43 
44             WriteLineEnding(uart, lineEnding);
45         }
46 
WriteLineEnding(IUART uart, LineEnding lineEnding)47         private static void WriteLineEnding(IUART uart, LineEnding lineEnding)
48         {
49             const byte CarriageReturn = (byte)'\r';
50             const byte LineFeed = (byte)'\n';
51 
52             switch(lineEnding)
53             {
54                case LineEnding.CR:
55                    uart.WriteChar(CarriageReturn);
56                    break;
57 
58                case LineEnding.CRLF:
59                    uart.WriteChar(CarriageReturn);
60                    uart.WriteChar(LineFeed);
61                    break;
62 
63                case LineEnding.LF:
64                    uart.WriteChar(LineFeed);
65                    break;
66             };
67         }
68 
69         public enum LineEnding
70         {
71            None,
72            CR,
73            CRLF,
74            LF
75         }
76     }
77 }
78