protected static void ParseDbcAttributeDefinition(string line, CanDatabaseType canDatabaseType) { var segments = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); switch (segments[1]) { case "BU_": break; case "BO_": if (segments[2] == "\"Bus\"" && segments[3] == "ENUM") { var buses = segments[4].Replace(";", "") // Filter semi-colons .Replace("\"", "") // Filter quoute marks .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // Split on comma foreach (var bus in buses) { canDatabaseType.Buses.Add(bus); } } break; case "SG_": break; case "EV_": break; case "": break; } }
/// <summary> /// Use this function to read a .dbc CAN database file. /// </summary> /// <param name="fullFilePath">Fulle path to the .dbc file</param> /// <returns>CanDataBasType object with all the relevant information from the .dbc file</returns> public static CanDatabaseType OpenCanDB(string fullFilePath) { CanDatabaseType canDatabaseType = new CanDatabaseType(); canDatabaseType.Name = Path.GetFileNameWithoutExtension(fullFilePath); // Read the file line by line. //System.IO.StreamReader file = new System.IO.StreamReader(fullFilePath); var canDbFile = File.ReadAllLines(fullFilePath).ToList(); List <String> .Enumerator enumerator = canDbFile.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.StartsWith("BU_")) { var nodes = ParseDbcNodeDefinition(enumerator.Current); foreach (var node in nodes) { canDatabaseType.Nodes.Add(node); } } if (enumerator.Current.StartsWith("BO_")) { CanMessageType temp = ParseDbcMessageDefinition(enumerator); canDatabaseType.CanMessageTypes.Add(temp.Id, temp); } if (enumerator.Current.StartsWith("CM_")) { ParseDbcCommentField(enumerator.Current, canDatabaseType.CanMessageTypes); } if (enumerator.Current.StartsWith("BA_DEF_")) { ParseDbcAttributeDefinition(enumerator.Current, canDatabaseType); } if (enumerator.Current.StartsWith("SIG_VALTYPE_")) { ParseDbcTypeDefinition(enumerator.Current, canDatabaseType.CanMessageTypes); } } foreach (var message in canDatabaseType.CanMessageTypes.Values) { message.QualifiedName = message.Name; //message.QualifiedName = canDatabaseType.Name + "." + message.Name; foreach (var signal in message.Signals.Values) { //signal.QualifiedName = canDatabaseType.Name + "." + signal.QualifiedName; } } return(canDatabaseType); }