-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathCanBusUtilities.cs
More file actions
53 lines (46 loc) · 1.9 KB
/
Copy pathCanBusUtilities.cs
File metadata and controls
53 lines (46 loc) · 1.9 KB
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
using System;
using System.Globalization;
namespace NMEA2000Analyzer
{
internal static class CanBusUtilities
{
public static uint BuildCanId(MainWindow.Nmea2000Record record, byte? sourceOverride = null, byte? destinationOverride = null)
{
var priority = int.TryParse(record.Priority, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsedPriority)
? parsedPriority
: 0;
var pgn = int.TryParse(record.PGN, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsedPgn)
? parsedPgn
: 0;
var source = sourceOverride ?? ParseAddressOrDefault(record.Source, 0);
var destination = destinationOverride ?? ParseAddressOrDefault(record.Destination, 255);
return BuildCanId((uint)pgn, destination, source, (byte)Math.Clamp(parsedPriority, 0, 7));
}
public static uint BuildCanId(uint pgn, byte destination, byte source, byte priority)
{
var pgnField = pgn;
var pf = (pgnField >> 8) & 0xFF;
if (pf < 0xF0)
{
pgnField |= destination;
}
return ((uint)priority << 26) | (pgnField << 8) | source;
}
public static bool IsDestinationSpecificPgn(string? pgnText)
{
return uint.TryParse(pgnText, NumberStyles.Integer, CultureInfo.InvariantCulture, out var pgn) &&
IsDestinationSpecificPgn(pgn);
}
public static bool IsDestinationSpecificPgn(uint pgn)
{
var pf = (pgn >> 8) & 0xFF;
return pf < 0xF0;
}
public static byte ParseAddressOrDefault(string? value, byte fallback)
{
return byte.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed)
? parsed
: fallback;
}
}
}