Пример #1
0
            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);
                    }
                }
            }
Пример #3
0
            /// <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);
            }