1 //
2 // Copyright (c) 2010-2024 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 
8 using System;
9 
10 using Antmicro.Renode.Core;
11 using Antmicro.Renode.Utilities;
12 
13 namespace Antmicro.Renode.Peripherals.UART
14 {
15     abstract public class LINBase : UARTBase, ILINDevice
16     {
LINBase(IMachine machine)17         public LINBase(IMachine machine) : base(machine)
18         {
19             linDecoder = new LINDecoder();
20             linDecoder.FrameReceived += FrameReceived;
21         }
22 
WriteChar(byte value)23         public override void WriteChar(byte value)
24         {
25             linDecoder.Feed(value);
26             if(linDecoder.CurrentState != LINDecoder.State.Ignoring)
27             {
28                 base.WriteChar(value);
29             }
30         }
31 
FrameReceived(byte protectedIdentifier, byte[] data, bool valid)32         public abstract void FrameReceived(byte protectedIdentifier, byte[] data, bool valid);
StartedTransmission(byte protectedIdentifier)33         public abstract void StartedTransmission(byte protectedIdentifier);
34 
ReceiveLINBreak()35         public virtual void ReceiveLINBreak()
36         {
37             linDecoder.Break();
38         }
39 
RegisterProtectedIdentifier(byte pid, LINMode mode, int frameLength)40         protected ILINEntry RegisterProtectedIdentifier(byte pid, LINMode mode, int frameLength)
41         {
42             var entry = linDecoder.Register(pid);
43             entry.Mode = mode;
44             entry.FrameLength = frameLength;
45 
46             entry.StartedTransmission += () => StartedTransmission(pid);
47 
48             return entry;
49         }
50 
51         protected readonly LINDecoder linDecoder;
52     }
53 }
54