-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathExtensions.cs
98 lines (81 loc) · 3.11 KB
/
Extensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System.IO;
using System.Linq;
using System.Collections.Generic;
using DbcParserLib.Model;
using System;
namespace DbcParserLib
{
public static class ExtensionsAndHelpers
{
public static bool Motorola(this Signal signal)
{
return signal.Msb();
}
public static bool Msb(this Signal signal)
{
return signal.ByteOrder == 0;
}
public static bool Lsb(this Signal signal)
{
return signal.ByteOrder != 0;
}
public static bool Intel(this Signal signal)
{
return signal.Lsb();
}
internal static ulong BitMask(this Signal signal)
{
return (ulong.MaxValue >> (64 - signal.Length));
}
[Obsolete("Please use ValueTableMap instead. ToPairs() and ValueTable will be removed in future releases")]
public static IEnumerable<KeyValuePair<int, string>> ToPairs(this Signal signal)
{
return signal.ValueTableMap;
}
private const string MultiplexorLabel = "M";
private const string MultiplexedLabel = "m";
public static MultiplexingInfo MultiplexingInfo(this Signal signal)
{
if(string.IsNullOrWhiteSpace(signal.Multiplexing))
return new MultiplexingInfo(MultiplexingRole.None);
if(signal.Multiplexing.Equals(MultiplexorLabel))
return new MultiplexingInfo(MultiplexingRole.Multiplexor);
if(signal.Multiplexing.StartsWith(MultiplexedLabel))
{
var substringLength = signal.Multiplexing.Length - (signal.Multiplexing.EndsWith(MultiplexorLabel) ? 2 : 1);
if(int.TryParse(signal.Multiplexing.Substring(1, substringLength), out var group))
return new MultiplexingInfo(MultiplexingRole.Multiplexed, group);
}
return new MultiplexingInfo(MultiplexingRole.Unknown);
}
public static bool IsMultiplexed(this Message message)
{
return message.Signals.Any(s => s.MultiplexingInfo().Role == MultiplexingRole.Multiplexor);
}
internal static void AdjustExtendedId(this Message message)
{
// For extended ID bit 31 is always 1
if(message.ID >= 0x80000000)
{
message.IsExtID = true;
message.ID -= 0x80000000;
}
}
internal static IReadOnlyDictionary<int, string> ToDictionary(this string records)
{
var dict = new Dictionary<int, string>();
if (string.IsNullOrWhiteSpace(records))
return dict;
using (var reader = new StringReader(records))
{
while (reader.Peek() > -1)
{
// Add duplicated key control and act (eg. strict -> break, warning -> keep going and log, silent-> keep going)
var tokens = reader.ReadLine().Split(' ');
dict[int.Parse(tokens[0])] = tokens[1];
}
}
return dict;
}
}
}