private Tuple <int, IDictionary <int, int> > GetClosestMatchingErrorMap(ErrorLogId logId, int errorMapFirmwareVersion) { var matchingMap = new Tuple <int, IDictionary <int, int> >(-1, null); IDictionary <int, IDictionary <int, int> > firmwareVersionEntries; if (ErrorMaps.TryGetValue(logId, out firmwareVersionEntries)) { IDictionary <int, int> closestMatchErrorMap; if (firmwareVersionEntries.TryGetValue(errorMapFirmwareVersion, out closestMatchErrorMap)) { matchingMap = new Tuple <int, IDictionary <int, int> >(errorMapFirmwareVersion, closestMatchErrorMap); } else { var closestMatchFirmwareVersion = -1; foreach (var firmwareVersionEntry in firmwareVersionEntries) { var firmwareVersion = firmwareVersionEntry.Key; if ((firmwareVersion > closestMatchFirmwareVersion) && (firmwareVersion < errorMapFirmwareVersion)) { closestMatchFirmwareVersion = firmwareVersion; closestMatchErrorMap = firmwareVersionEntry.Value; } } if ((closestMatchFirmwareVersion > 0) && (closestMatchErrorMap != null)) { matchingMap = new Tuple <int, IDictionary <int, int> >(closestMatchFirmwareVersion, closestMatchErrorMap); } } } return(matchingMap); }
private void AddErrorMapping(XmlNode errorMapping, string subsystemIndexValue, IEnumerable <ErrorLogId> errorLogIds) { ValidateSubsystemIndex(subsystemIndexValue); var errorLogId = ErrorLogId.Unknown; if (!Enum.TryParse <ErrorLogId>(subsystemIndexValue, out errorLogId)) { // possibly some new kind we're not familiar with - so parse as an int and cast int index; if (int.TryParse(subsystemIndexValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out index)) { errorLogId = (ErrorLogId)index; } } IDictionary <int, IDictionary <int, int> > firmwareLineNumberToStringIndexMap; if (!ErrorMaps.TryGetValue(errorLogId, out firmwareLineNumberToStringIndexMap)) { firmwareLineNumberToStringIndexMap = new Dictionary <int, IDictionary <int, int> >(); ErrorMaps[errorLogId] = firmwareLineNumberToStringIndexMap; } foreach (var firmwareVersionNode in errorMapping.ChildNodes.Cast <XmlNode>()) { const string FirmwareNodeName = "firmware"; var firmwareVersionValue = string.Empty; var addIndexData = true; switch (firmwareVersionNode.Name) { case FirmwareNodeName: const string FirmwareVersionAttributeName = "version"; var firmwareVersionAttribute = firmwareVersionNode.Attributes[FirmwareVersionAttributeName]; firmwareVersionValue = firmwareVersionAttribute == null ? null : firmwareVersionAttribute.Value; break; default: // Not operating w/ a schema so try the other approach. addIndexData = firmwareVersionNode.NodeType == XmlNodeType.Element; if (addIndexData) { var nameParts = firmwareVersionNode.Name.Split('-'); addIndexData = nameParts.Length > 1; if (addIndexData) { firmwareVersionValue = nameParts[1]; } } break; } if (addIndexData) { AddFirmwareLineNumberToMessageIndexData(firmwareVersionNode, firmwareVersionValue, firmwareLineNumberToStringIndexMap); } } }
/// <summary> /// Gets an error string given an error log entry and a raw firmware version. /// </summary> /// <param name="rawFirmwareVersion">The raw current firmware version from a Locutus device.</param> /// <param name="errorLogEntry">An error log entry to convert to a more meaningful error message.</param> /// <returns>An error string describing the issue described by <paramref name="errorLogEntry"/>.</returns> internal string GetErrorString(int rawFirmwareVersion, ErrorLogEntry errorLogEntry) { var errorString = string.Empty; IDictionary <int, IDictionary <int, int> > firmwareVersionEntries; if ((ErrorMaps != null) && ErrorMaps.TryGetValue(errorLogEntry.LogId, out firmwareVersionEntries)) { var firmwareVersionKey = GetFirmwareVersionForLookup(rawFirmwareVersion); IDictionary <int, int> lineNumberToErrorString; if (firmwareVersionEntries.TryGetValue(firmwareVersionKey, out lineNumberToErrorString)) { int errorStringIndex; if (lineNumberToErrorString.TryGetValue(errorLogEntry.LineNumber, out errorStringIndex) && (errorStringIndex >= 0) && (errorStringIndex < Strings.Count)) { try { errorString = INTV.Core.Utility.StringUtilities.SPrintf(Strings[errorStringIndex], errorLogEntry.ErrorDetails); } catch (Exception e) { // Don't care if this fails. ReportErrorStringLookupFailure(rawFirmwareVersion, errorLogEntry, "Failed to format output" + "; " + e.Message); } } else { ReportErrorStringLookupFailure(rawFirmwareVersion, errorLogEntry, "Failed to look up line number"); } } else { ReportErrorStringLookupFailure(rawFirmwareVersion, errorLogEntry, "Failed to locate data for firmware revision"); } } else { ReportErrorStringLookupFailure(rawFirmwareVersion, errorLogEntry, "Failed to locate database for log kind"); } return(errorString); }