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 using Antmicro.Renode.Core;
8 using Antmicro.Renode.Time;
9 
10 namespace Antmicro.Renode.Peripherals.UART
11 {
12     public static class LINHubExtensions
13     {
CreateLINHub(this Emulation emulation, string name)14         public static void CreateLINHub(this Emulation emulation, string name)
15         {
16             emulation.ExternalsManager.AddExternal(new LINHub(), name);
17         }
18     }
19 
20     public sealed class LINHub : UARTHubBase<ILINDevice>
21     {
LINHub()22         public LINHub() : base(true) {}
23 
AttachTo(ILINDevice lin)24         public override void AttachTo(ILINDevice lin)
25         {
26             base.AttachTo(lin);
27             if(lin is ILINController linController)
28             {
29                 linController.BroadcastLINBreak += HandleLINBreak;
30             }
31         }
32 
DetachFrom(ILINDevice lin)33         public override void DetachFrom(ILINDevice lin)
34         {
35             if(lin is ILINController linController)
36             {
37                 linController.BroadcastLINBreak -= HandleLINBreak;
38             }
39             base.DetachFrom(lin);
40         }
41 
HandleLINBreak()42         private void HandleLINBreak()
43         {
44             if(!started)
45             {
46                 return;
47             }
48 
49             lock(locker)
50             {
51                 foreach(var item in uarts.Keys)
52                 {
53                     item.GetMachine().HandleTimeDomainEvent<object>(_ => item.ReceiveLINBreak(), null, TimeDomainsManager.Instance.VirtualTimeStamp);
54                 }
55             }
56         }
57     }
58 }
59