コード例 #1
0
        public static S6xStructure GetFixedStructureTemplate(FixedStructures fixedStructure)
        {
            S6xStructure oRes = new S6xStructure();

            switch (fixedStructure)
            {
            // For Routine Signature Internal Structure
            case FixedStructures.CORE_REG_INIT_ST1:
                oRes.ShortLabel = "CORE_REG_INIT_ST1";
                oRes.Label      = "Core Registers Initialization Structure 1";
                oRes.Comments   = oRes.ShortLabel + " - " + oRes.Label;
                oRes.Number     = 0;                                            // To be updated by processing
                oRes.StructDef  = "\"Reg \", WordHex, \"Reg \", WordHex";       // To be updated by processing
                break;

            // For Routine Signature Internal Structure
            case FixedStructures.CORE_REG_INIT_ST2:
                oRes.ShortLabel = "CORE_REG_INIT_ST2";
                oRes.Label      = "Core Registers Initialization Structure 2";
                oRes.Comments   = oRes.ShortLabel + " - " + oRes.Label;
                oRes.Number     = 0;                                            // To be updated by processing
                oRes.StructDef  = "\"Reg \", WordHex, \"Reg \", WordHex";       // To be updated by processing
                break;

            default:
                oRes.ShortLabel = fixedStructure.ToString();
                oRes.Label      = oRes.ShortLabel;
                break;
            }

            return(oRes);
        }
コード例 #2
0
 public static void updateStructureRow(ref SQLite806xDB db806x, ref SADS6x sadS6x, R_SAD806x_Def_Structures rRow, S6xStructure s6xObject)
 {
     SQLite806xToolsSAD806xV10.updateStructureRow(ref db806x, ref sadS6x, rRow, s6xObject);
 }
コード例 #3
0
 public static object addStructureRow(ref SQLite806xDB db806x, ref SADS6x sadS6x, ref List <R_SAD806x_Def_Structures> rList, S6xStructure s6xObject)
 {
     return(SQLite806xToolsSAD806xV10.addStructureRow(ref db806x, ref sadS6x, ref rList, s6xObject));
 }
コード例 #4
0
ファイル: SADFixedSigs.cs プロジェクト: Stokes1114/SAD806x
        // Get Fixed Routines Definitions
        public static S6xSignature GetFixedRoutineSignatureTemplate(Fixed_Routines fixedRoutine)
        {
            S6xSignature oRes      = null;
            S6xStructure s6xStruct = null;

            switch (fixedRoutine)
            {
            case Fixed_Routines.CORE_REG_INIT_8065:
                oRes                    = new S6xSignature();
                oRes.for806x            = Signature806xOptions.for8065Only.ToString();
                oRes.ShortLabel         = "CORE_REG_INIT";
                oRes.Label              = "Core Registers Initialization";
                oRes.Comments           = "CORE_REG_INIT - Core Registers Initialization";
                oRes.InternalStructures = new S6xRoutineInternalStructure[2];

                s6xStruct = SADFixedStructures.GetFixedStructureTemplate(SADFixedStructures.FixedStructures.CORE_REG_INIT_ST1);
                oRes.InternalStructures[0] = new S6xRoutineInternalStructure();
                oRes.InternalStructures[0].VariableAddress = "#02##01#";
                oRes.InternalStructures[0].VariableBankNum = "1";               // To be updated by processing
                oRes.InternalStructures[0].ShortLabel      = s6xStruct.ShortLabel;
                oRes.InternalStructures[0].Label           = s6xStruct.Label;
                oRes.InternalStructures[0].Comments        = s6xStruct.Comments;
                oRes.InternalStructures[0].Number          = s6xStruct.Number;    // To be updated by processing
                oRes.InternalStructures[0].StructDef       = s6xStruct.StructDef; // To be updated by processing

                s6xStruct = SADFixedStructures.GetFixedStructureTemplate(SADFixedStructures.FixedStructures.CORE_REG_INIT_ST2);
                oRes.InternalStructures[1] = new S6xRoutineInternalStructure();
                oRes.InternalStructures[1].VariableAddress = "#04##03#";
                oRes.InternalStructures[1].VariableBankNum = "1";         // To be updated by processing
                oRes.InternalStructures[1].ShortLabel      = s6xStruct.ShortLabel;
                oRes.InternalStructures[1].Label           = s6xStruct.Label;
                oRes.InternalStructures[1].Comments        = s6xStruct.Comments;
                oRes.InternalStructures[1].Number          = s6xStruct.Number;    // To be updated by processing
                oRes.InternalStructures[1].StructDef       = s6xStruct.StructDef; // To be updated by processing

                s6xStruct = null;
                break;

            case Fixed_Routines.OBDII_REG_INIT:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "OBDII_REG_INIT";
                oRes.Label      = "OBDII Registers Initialization";
                oRes.Comments   = "OBDII_REG_INIT - OBDII Registers Initialization";
                break;

            case Fixed_Routines.OBDII_REG_RESET:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "OBDII_REG_RESET";
                oRes.Label      = "OBDII Registers Reset";
                oRes.Comments   = "OBDII_REG_RESET - OBDII Registers Reset";
                break;

            case Fixed_Routines.OBDII_REG_FLAGS:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "OBDII_REG_FLAGS";
                oRes.Label      = "OBDII Registers Flags";
                oRes.Comments   = "OBDII_REG_FLAGS - OBDII Registers Flags";
                break;

            case Fixed_Routines.OBDI_COD_3D:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "OBDI_CODES_3D";
                oRes.Label      = "OBDI Codes 3 Digits";
                oRes.Comments   = "OBDI_CODES_3D - OBDI Codes 3 Digits";
                break;

            case Fixed_Routines.OBDI_CNT_3D:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "OBDI_COUNT_3D";
                oRes.Label      = "OBDI Count 3 Digits";
                oRes.Comments   = "OBDI_COUNT_3D - OBDI Count 3 Digits";
                break;

            case Fixed_Routines.OBDI_COD_2D:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "OBDI_CODES_2D";
                oRes.Label      = "OBDI Codes 2 Digits";
                oRes.Comments   = "OBDI_CODES_2D - OBDI Codes 2 Digits";
                break;

            case Fixed_Routines.OBDI_TIM_2D:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "OBDI_TIMINGS_2D";
                oRes.Label      = "OBDI Timings 2 Digits";
                oRes.Comments   = "OBDI_TIMINGS_3D - OBDI Timings 2 Digits";
                break;

            case Fixed_Routines.OBDI_MALFUNC:
                oRes                              = new S6xSignature();
                oRes.ShortLabel                   = "MALFUNC";
                oRes.Label                        = "Malfunction Routine";
                oRes.Comments                     = "MALFUNC - Malfunction Routine";
                oRes.Comments                    += "\r\n1st Param is OBD Error Code to be pushed.";
                oRes.InputArguments               = new S6xRoutineInputArgument[1];
                oRes.InputArguments[0]            = new S6xRoutineInputArgument();
                oRes.InputArguments[0].Position   = 1;
                oRes.InputArguments[0].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[0].Position);
                oRes.InputArguments[0].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[0].Word       = true;
                oRes.InputArguments[0].Pointer    = false;
                break;

            case Fixed_Routines.OBDI_MALFUNC_LW:
                oRes                              = new S6xSignature();
                oRes.ShortLabel                   = "MALFUNC_LW";
                oRes.Label                        = "Malfunction Lower Routine";
                oRes.Comments                     = "MALFUNC_LW - Malfunction Lower Routine";
                oRes.Comments                    += "\r\n1st Param should be lower than 2nd value (scalar or register)";
                oRes.Comments                    += "\r\n2nd Param should be higher than 1st value (scalar or register)";
                oRes.Comments                    += "\r\n3rd Param is OBD Error Code to be pushed.";
                oRes.InputArguments               = new S6xRoutineInputArgument[3];
                oRes.InputArguments[0]            = new S6xRoutineInputArgument();
                oRes.InputArguments[0].Position   = 1;
                oRes.InputArguments[0].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[0].Position);
                oRes.InputArguments[0].Encryption = (int)CallArgsMode.Mode3;
                oRes.InputArguments[0].Word       = true;
                oRes.InputArguments[0].Pointer    = true;
                oRes.InputArguments[1]            = new S6xRoutineInputArgument();
                oRes.InputArguments[1].Position   = 2;
                oRes.InputArguments[1].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[1].Position);
                oRes.InputArguments[1].Encryption = (int)CallArgsMode.Mode3;
                oRes.InputArguments[1].Word       = true;
                oRes.InputArguments[1].Pointer    = true;
                oRes.InputArguments[2]            = new S6xRoutineInputArgument();
                oRes.InputArguments[2].Position   = 3;
                oRes.InputArguments[2].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[2].Position);
                oRes.InputArguments[2].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[2].Word       = true;
                oRes.InputArguments[2].Pointer    = false;
                break;

            case Fixed_Routines.OBDI_MALFUNC_BT:
                oRes                              = new S6xSignature();
                oRes.ShortLabel                   = "MALFUNC_BT";
                oRes.Label                        = "Malfunction Between Routine";
                oRes.Comments                     = "MALFUNC_BT - Malfunction Between Routine";
                oRes.Comments                    += "\r\n1st Param should be between 2nd and 3rd values (scalar or register)";
                oRes.Comments                    += "\r\n2nd Param should be the lowest value for comparison (scalar or register)";
                oRes.Comments                    += "\r\n3rd Param should be the highest value for comparison (scalar or register)";
                oRes.Comments                    += "\r\n4th Param is OBD Error Code to be pushed.";
                oRes.InputArguments               = new S6xRoutineInputArgument[4];
                oRes.InputArguments[0]            = new S6xRoutineInputArgument();
                oRes.InputArguments[0].Position   = 1;
                oRes.InputArguments[0].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[0].Position);
                oRes.InputArguments[0].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[0].Word       = true;
                oRes.InputArguments[0].Pointer    = true;
                oRes.InputArguments[1]            = new S6xRoutineInputArgument();
                oRes.InputArguments[1].Position   = 2;
                oRes.InputArguments[1].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[1].Position);
                oRes.InputArguments[1].Encryption = (int)CallArgsMode.Mode3;
                oRes.InputArguments[1].Word       = true;
                oRes.InputArguments[1].Pointer    = true;
                oRes.InputArguments[2]            = new S6xRoutineInputArgument();
                oRes.InputArguments[2].Position   = 3;
                oRes.InputArguments[2].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[2].Position);
                oRes.InputArguments[2].Encryption = (int)CallArgsMode.Mode3;
                oRes.InputArguments[2].Word       = true;
                oRes.InputArguments[2].Pointer    = true;
                oRes.InputArguments[3]            = new S6xRoutineInputArgument();
                oRes.InputArguments[3].Position   = 4;
                oRes.InputArguments[3].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[3].Position);
                oRes.InputArguments[3].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[3].Word       = true;
                oRes.InputArguments[3].Pointer    = false;
                break;

            case Fixed_Routines.OBDI_MALFUNC_SB:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "MALFUNC_SB";
                oRes.Label      = "Malfunction Sub Routine";
                oRes.Comments   = "MALFUNC_SB - Malfunction Sub Routine";
                oRes.Comments  += "\r\nUsed to push an OBD Error Code into a rolling error register.";
                break;

            case Fixed_Routines.OBDI_MALFUNC_EX:
                oRes                              = new S6xSignature();
                oRes.ShortLabel                   = "MALFUNC_EX";
                oRes.Label                        = "Malfunction Extended Routine";
                oRes.Comments                     = "MALFUNC_EX - Malfunction Extended Routine";
                oRes.Comments                    += "\r\n1st Param should be higher than 2nd and 3rd values (scalar or register)";
                oRes.Comments                    += "\r\n2nd Param should be the first lowest value for comparison (scalar or register)";
                oRes.Comments                    += "\r\n3rd Param should be the second lowest value for comparison (scalar or register)";
                oRes.Comments                    += "\r\n4th & 5th Params are OBD Error Code to be pushed.";
                oRes.InputArguments               = new S6xRoutineInputArgument[5];
                oRes.InputArguments[0]            = new S6xRoutineInputArgument();
                oRes.InputArguments[0].Position   = 1;
                oRes.InputArguments[0].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[0].Position);
                oRes.InputArguments[0].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[0].Word       = true;
                oRes.InputArguments[0].Pointer    = true;
                oRes.InputArguments[1]            = new S6xRoutineInputArgument();
                oRes.InputArguments[1].Position   = 2;
                oRes.InputArguments[1].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[1].Position);
                oRes.InputArguments[1].Encryption = (int)CallArgsMode.Mode3;
                oRes.InputArguments[1].Word       = true;
                oRes.InputArguments[1].Pointer    = true;
                oRes.InputArguments[2]            = new S6xRoutineInputArgument();
                oRes.InputArguments[2].Position   = 3;
                oRes.InputArguments[2].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[2].Position);
                oRes.InputArguments[2].Encryption = (int)CallArgsMode.Mode3;
                oRes.InputArguments[2].Word       = true;
                oRes.InputArguments[2].Pointer    = true;
                oRes.InputArguments[3]            = new S6xRoutineInputArgument();
                oRes.InputArguments[3].Position   = 4;
                oRes.InputArguments[3].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[3].Position);
                oRes.InputArguments[3].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[3].Word       = true;
                oRes.InputArguments[3].Pointer    = false;
                oRes.InputArguments[4]            = new S6xRoutineInputArgument();
                oRes.InputArguments[4].Position   = 5;
                oRes.InputArguments[4].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[4].Position);
                oRes.InputArguments[4].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[4].Word       = true;
                oRes.InputArguments[4].Pointer    = false;
                break;

            case Fixed_Routines.OBDII_CLEAR_MALF:
                oRes                              = new S6xSignature();
                oRes.ShortLabel                   = "CLEAR_MALF";
                oRes.Label                        = "Clear Malfunction Routine";
                oRes.Comments                     = "CLEAR_MALF - Clear Malfunction Routine";
                oRes.Comments                    += "\r\n1st Param is OBD Error Code to be deleted.";
                oRes.InputArguments               = new S6xRoutineInputArgument[1];
                oRes.InputArguments[0]            = new S6xRoutineInputArgument();
                oRes.InputArguments[0].Position   = 1;
                oRes.InputArguments[0].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[0].Position);
                oRes.InputArguments[0].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[0].Word       = true;
                oRes.InputArguments[0].Pointer    = false;
                break;

            case Fixed_Routines.OBDII_MALFUNCTION:
                oRes                              = new S6xSignature();
                oRes.ShortLabel                   = "MALFUNCTION";
                oRes.Label                        = "Malfunction Routine";
                oRes.Comments                     = "MALFUNCTION - Malfunction Routine";
                oRes.Comments                    += "\r\n1st Param is OBD Error Code to be pushed.";
                oRes.InputArguments               = new S6xRoutineInputArgument[1];
                oRes.InputArguments[0]            = new S6xRoutineInputArgument();
                oRes.InputArguments[0].Position   = 1;
                oRes.InputArguments[0].UniqueKey  = string.Format("Ra{0:d3}", oRes.InputArguments[0].Position);
                oRes.InputArguments[0].Encryption = (int)CallArgsMode.Standard;
                oRes.InputArguments[0].Word       = true;
                oRes.InputArguments[0].Pointer    = false;
                break;

            case Fixed_Routines.RPM_MNGT_8061_01:
            case Fixed_Routines.RPM_MNGT_8061_02:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "RPM_MNGT";
                oRes.Label      = "RPM Management";
                oRes.for806x    = Signature806xOptions.for8061Only.ToString();
                oRes.Comments   = "RPM_MNGT - RPM Management";
                break;

            case Fixed_Routines.RPM_MNGT_8065_01:
            case Fixed_Routines.RPM_MNGT_8065_02:
            case Fixed_Routines.RPM_MNGT_8065_03:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "RPM_MNGT";
                oRes.Label      = "RPM Management";
                oRes.for806x    = Signature806xOptions.for8065Only.ToString();
                oRes.Comments   = "RPM_MNGT - RPM Management";
                break;

            case Fixed_Routines.ECT_INIT_8061_01:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "ECT_INIT";
                oRes.Label      = "ECT Initialization";
                oRes.for806x    = Signature806xOptions.for8061Only.ToString();
                oRes.Comments   = "ECT_INIT - ECT Initialization";
                break;

            case Fixed_Routines.ECT_INIT_8061_02:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "BASE_INIT";
                oRes.Label      = "Base Initialization";
                oRes.for806x    = Signature806xOptions.for8061Only.ToString();
                oRes.Comments   = "BASE_INIT - Base Initialization";
                break;

            case Fixed_Routines.ECT_CLIP_8065_01:
            case Fixed_Routines.ECT_CLIP_8065_02:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "ECT_CLIP";
                oRes.Label      = "ECT Clip";
                oRes.for806x    = Signature806xOptions.for8065Only.ToString();
                oRes.Comments   = "ECT_CLIP - ECT Clip";
                break;

            case Fixed_Routines.ECT_CLIPW_8065_02:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "ECT_CLIPW";
                oRes.Label      = "ECT Clip W";
                oRes.for806x    = Signature806xOptions.for8065Only.ToString();
                oRes.Comments   = "ECT_CLIPW - ECT Clip W";
                break;

            case Fixed_Routines.CHT_CLIPW_8065_02:
                oRes            = new S6xSignature();
                oRes.ShortLabel = "CHT_CLIPW";
                oRes.Label      = "CHT Clip W";
                oRes.for806x    = Signature806xOptions.for8065Only.ToString();
                oRes.Comments   = "CHT_CLIPW - CHT Clip W";
                break;

            default:
                break;
            }

            return(oRes);
        }
コード例 #5
0
ファイル: SQLite806xTools.cs プロジェクト: Stokes1114/SAD806x
        public static void addStructureRow(ref SQLite806xDB db806x, ref SADS6x sadS6x, ref List <R_806x_Def_Structures> rList, S6xStructure s6xObject)
        {
            if (db806x == null)
            {
                return;
            }
            if (sadS6x == null)
            {
                return;
            }
            if (rList == null)
            {
                return;
            }
            if (s6xObject == null)
            {
                return;
            }
            if (s6xObject.Skip || !s6xObject.Store)
            {
                return;
            }

            R_806x_Def_Structures rRow = db806x.newRow <R_806x_Def_Structures>();

            rRow.Bank.Value                = s6xObject.BankNum;
            rRow.Address.Value             = s6xObject.AddressInt;
            rRow.UniqueAddCode.Value       = s6xObject.DuplicateNum;
            rRow.Comments.Value            = s6xObject.Comments;
            rRow.Label.Value               = s6xObject.Label;
            rRow.Number.Value              = s6xObject.Number;
            rRow.ShortLabel.Value          = s6xObject.ShortLabel;
            rRow.StructureDefinition.Value = s6xObject.StructDef;

            rList.Add(rRow);
        }
コード例 #6
0
        public static bool showElemData(ref DataGridView elemDataGridView, ref SADBin sadBin, object s6xObject, bool dataDecimal, bool ignoreDefinedConversion, bool dataReversed, RepositoryConversionItem rcOutput, RepositoryConversionItem rcInput)
        {
            S6xScalar    s6xScalar   = null;
            S6xFunction  s6xFunction = null;
            S6xTable     s6xTable    = null;
            S6xStructure s6xStruct   = null;
            DataTable    dtTable     = null;
            Type         dataType    = null;
            string       sValue      = string.Empty;
            int          iValue      = 0;
            int          iAddress    = 0;

            string[] arrBytes       = null;
            string[] arrCols        = null;
            object[] arrRows        = null;
            object[] arrRowsHeaders = null;
            object[] arrRow         = null;
            bool     failedScale    = false;
            int      iBfTop         = -1;

            if (elemDataGridView == null)
            {
                return(false);
            }
            if (sadBin == null)
            {
                return(false);
            }
            if (s6xObject == null)
            {
                return(false);
            }

            if (dataDecimal)
            {
                dataType = typeof(double);
            }
            else
            {
                dataType = typeof(string);
            }

            elemDataGridView.DataSource = null;

            S6xNavHeaderCategory headerCategory = S6xNavHeaderCategory.UNDEFINED;

            if (s6xObject.GetType() == typeof(S6xScalar))
            {
                headerCategory = S6xNavHeaderCategory.SCALARS;
            }
            else if (s6xObject.GetType() == typeof(S6xFunction))
            {
                headerCategory = S6xNavHeaderCategory.FUNCTIONS;
            }
            else if (s6xObject.GetType() == typeof(S6xTable))
            {
                headerCategory = S6xNavHeaderCategory.TABLES;
            }
            else if (s6xObject.GetType() == typeof(S6xStructure))
            {
                headerCategory = S6xNavHeaderCategory.STRUCTURES;
            }

            switch (headerCategory)
            {
            case S6xNavHeaderCategory.SCALARS:
                s6xScalar = (S6xScalar)s6xObject;

                elemDataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

                s6xScalar.AddressBinInt = Tools.binAddressCorrected(s6xScalar.BankNum, s6xScalar.AddressInt, ref sadBin, s6xScalar.AddressBinInt);

                if (s6xScalar.isBitFlags)
                {
                    dataType = typeof(string);
                    arrCols  = null;
                    if (s6xScalar.BitFlags != null)
                    {
                        if (s6xScalar.BitFlags.Length > 0)
                        {
                            arrCols = new string[s6xScalar.BitFlags.Length + 1];
                            for (int iCol = 1; iCol < arrCols.Length; iCol++)
                            {
                                arrCols[iCol] = s6xScalar.BitFlags[arrCols.Length - iCol - 1].ShortLabel;
                            }
                        }
                    }
                    // Default BitFlags
                    if (arrCols == null)
                    {
                        iBfTop = 15;
                        if (s6xScalar.Byte)
                        {
                            iBfTop = 7;
                        }

                        for (int iBf = iBfTop; iBf >= 0; iBf--)
                        {
                            arrCols = new string[iBfTop + 2];
                            for (int iCol = 1; iCol < arrCols.Length; iCol++)
                            {
                                arrCols[iCol] = "B" + iBf.ToString();
                            }
                        }
                    }
                    // For better output
                    if (arrCols != null)
                    {
                        for (int iCol = 1; iCol < arrCols.Length; iCol++)
                        {
                            arrCols[iCol] = OutputTools.GetSpacesCenteredString(arrCols[iCol], 20);
                        }
                    }
                }
                else
                {
                    arrCols = new string[1];
                }
                if (s6xScalar.Byte)
                {
                    arrCols[0] = "Byte";
                    arrBytes   = sadBin.getBytesArray(s6xScalar.AddressBinInt, 1);
                    try
                    {
                        sValue = arrBytes[0];
                        iValue = Tools.getByteInt(sValue, s6xScalar.Signed);
                    }
                    catch
                    {
                        sValue = string.Empty;
                        iValue = 0;
                    }
                }
                else
                {
                    arrCols[0] = "Word";
                    arrBytes   = sadBin.getBytesArray(s6xScalar.AddressBinInt, 2);
                    try
                    {
                        sValue = Tools.LsbFirst(arrBytes);
                        iValue = Tools.getWordInt(sValue, s6xScalar.Signed);
                    }
                    catch
                    {
                        sValue = string.Empty;
                        iValue = 0;
                    }
                }
                // For better output
                if (arrCols.Length == 1)
                {
                    arrCols[0] = OutputTools.GetSpacesCenteredString(arrCols[0], 100);
                }
                else
                {
                    arrCols[0] = OutputTools.GetSpacesCenteredString(arrCols[0], 50);
                }

                arrRow = new object[arrCols.Length];
                if (s6xScalar.isBitFlags)
                {
                    BitArray arrBit = new BitArray(new int[] { iValue });
                    for (int iCol = 1; iCol < arrRow.Length; iCol++)
                    {
                        if (arrBit[s6xScalar.BitFlags[arrRow.Length - iCol - 1].Position])
                        {
                            arrRow[iCol] = s6xScalar.BitFlags[arrRow.Length - iCol - 1].SetValue;
                        }
                        else
                        {
                            arrRow[iCol] = s6xScalar.BitFlags[arrRow.Length - iCol - 1].NotSetValue;
                        }
                    }
                }
                if (dataDecimal)
                {
                    if (failedScale)
                    {
                        arrRow[0] = iValue;
                    }
                    else
                    {
                        try
                        {
                            if (ignoreDefinedConversion)
                            {
                                if (rcOutput == null)
                                {
                                    arrRow[0] = iValue;
                                }
                                else
                                {
                                    arrRow[0] = Tools.ScaleValue(iValue, rcOutput.InternalFormula, 0, true);
                                }
                            }
                            else
                            {
                                if (rcOutput == null)
                                {
                                    arrRow[0] = Tools.ScaleValue(iValue, s6xScalar.ScaleExpression, s6xScalar.ScalePrecision, true);
                                }
                                else
                                {
                                    arrRow[0] = Tools.ScaleValue(iValue, rcOutput.InternalFormula.ToUpper().Replace("X", "(" + s6xScalar.ScaleExpression + ")"), s6xScalar.ScalePrecision, true);
                                }
                            }
                        }
                        catch
                        {
                            failedScale = true;
                            arrRow[0]   = iValue;
                        }
                    }
                }
                else
                {
                    arrRow[0] = sValue.ToUpper();
                }

                arrRows = new object[] { arrRow };

                s6xScalar = null;
                break;

            case S6xNavHeaderCategory.FUNCTIONS:
                s6xFunction = (S6xFunction)s6xObject;

                elemDataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;

                s6xFunction.AddressBinInt = Tools.binAddressCorrected(s6xFunction.BankNum, s6xFunction.AddressInt, ref sadBin, s6xFunction.AddressBinInt);

                arrCols    = new string[2];
                arrCols[0] = "Word Input";
                iValue     = 2;
                if (s6xFunction.ByteInput)
                {
                    arrCols[0] = "Byte Input";
                    iValue--;
                }
                arrCols[1] = "Word Output";
                iValue    += 2;
                if (s6xFunction.ByteOutput)
                {
                    arrCols[1] = "Byte Output";
                    iValue--;
                }
                arrCols[0] = OutputTools.GetSpacesCenteredString(arrCols[0], 50);       // For better output
                arrCols[1] = OutputTools.GetSpacesCenteredString(arrCols[1], 50);       // For better output

                if (s6xFunction.RowsNumber <= 0)
                {
                    arrRows = new object[] { };
                }
                else
                {
                    arrRows  = new object[s6xFunction.RowsNumber];
                    arrBytes = sadBin.getBytesArray(s6xFunction.AddressBinInt, iValue * arrRows.Length);
                    iAddress = 0;
                    for (int iRow = 0; iRow < arrRows.Length; iRow++)
                    {
                        arrRow = new object[arrCols.Length];
                        for (int iCol = 0; iCol < arrRow.Length; iCol++)
                        {
                            if (iCol % 2 == 0)
                            {
                                if (s6xFunction.ByteInput)
                                {
                                    try
                                    {
                                        sValue = arrBytes[iAddress];
                                        iValue = Tools.getByteInt(sValue, s6xFunction.SignedInput);
                                    }
                                    catch
                                    {
                                        sValue = string.Empty;
                                        iValue = 0;
                                    }
                                    iAddress++;
                                }
                                else
                                {
                                    try
                                    {
                                        sValue = arrBytes[iAddress + 1] + arrBytes[iAddress];
                                        iValue = Tools.getWordInt(sValue, s6xFunction.SignedInput);
                                    }
                                    catch
                                    {
                                        sValue = string.Empty;
                                        iValue = 0;
                                    }
                                    iAddress += 2;
                                }
                                if (dataDecimal)
                                {
                                    if (failedScale)
                                    {
                                        arrRow[iCol] = iValue;
                                    }
                                    else
                                    {
                                        try
                                        {
                                            if (ignoreDefinedConversion)
                                            {
                                                if (rcInput == null)
                                                {
                                                    arrRow[iCol] = iValue;
                                                }
                                                else
                                                {
                                                    arrRow[iCol] = Tools.ScaleValue(iValue, rcInput.InternalFormula, 0, true);
                                                }
                                            }
                                            else
                                            {
                                                if (rcInput == null)
                                                {
                                                    arrRow[iCol] = Tools.ScaleValue(iValue, s6xFunction.InputScaleExpression, s6xFunction.InputScalePrecision, true);
                                                }
                                                else
                                                {
                                                    arrRow[iCol] = Tools.ScaleValue(iValue, rcInput.InternalFormula.ToUpper().Replace("X", "(" + s6xFunction.InputScaleExpression + ")"), s6xFunction.InputScalePrecision, true);
                                                }
                                            }
                                        }
                                        catch
                                        {
                                            failedScale  = true;
                                            arrRow[iCol] = iValue;
                                        }
                                    }
                                }
                                else
                                {
                                    arrRow[iCol] = sValue.ToUpper();
                                }
                            }
                            else
                            {
                                if (s6xFunction.ByteOutput)
                                {
                                    try
                                    {
                                        sValue = arrBytes[iAddress];
                                        iValue = Tools.getByteInt(sValue, s6xFunction.SignedOutput);
                                    }
                                    catch
                                    {
                                        sValue = string.Empty;
                                        iValue = 0;
                                    }
                                    iAddress++;
                                }
                                else
                                {
                                    try
                                    {
                                        sValue = arrBytes[iAddress + 1] + arrBytes[iAddress];
                                        iValue = Tools.getWordInt(sValue, s6xFunction.SignedOutput);
                                    }
                                    catch
                                    {
                                        sValue = string.Empty;
                                        iValue = 0;
                                    }
                                    iAddress += 2;
                                }
                                if (dataDecimal)
                                {
                                    if (failedScale)
                                    {
                                        arrRow[iCol] = iValue;
                                    }
                                    else
                                    {
                                        try
                                        {
                                            if (ignoreDefinedConversion)
                                            {
                                                if (rcOutput == null)
                                                {
                                                    arrRow[iCol] = iValue;
                                                }
                                                else
                                                {
                                                    arrRow[iCol] = Tools.ScaleValue(iValue, rcOutput.InternalFormula, 0, true);
                                                }
                                            }
                                            else
                                            {
                                                if (rcOutput == null)
                                                {
                                                    arrRow[iCol] = Tools.ScaleValue(iValue, s6xFunction.OutputScaleExpression, s6xFunction.OutputScalePrecision, true);
                                                }
                                                else
                                                {
                                                    arrRow[iCol] = Tools.ScaleValue(iValue, rcOutput.InternalFormula.ToUpper().Replace("X", "(" + s6xFunction.OutputScaleExpression + ")"), s6xFunction.OutputScalePrecision, true);
                                                }
                                            }
                                        }
                                        catch
                                        {
                                            failedScale  = true;
                                            arrRow[iCol] = iValue;
                                        }
                                    }
                                }
                                else
                                {
                                    arrRow[iCol] = sValue.ToUpper();
                                }
                            }
                        }
                        arrRows[iRow] = arrRow;
                    }
                }
                s6xFunction = null;
                break;

            case S6xNavHeaderCategory.TABLES:
                s6xTable = (S6xTable)s6xObject;
                if (s6xTable.ColsNumber <= 0)
                {
                    return(false);
                }

                elemDataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;

                s6xTable.AddressBinInt = Tools.binAddressCorrected(s6xTable.BankNum, s6xTable.AddressInt, ref sadBin, s6xTable.AddressBinInt);

                //arrCols = new string[s6xTable.ColsNumber];
                //for (int iCol = 0; iCol < arrCols.Length; iCol++) arrCols[iCol] = (iCol + 1).ToString();
                arrCols = getTableElemDataScale(ref sadBin, s6xTable.ColsScalerAddress, s6xTable.ColsNumber);

                // For better output
                if (arrCols != null)
                {
                    for (int iCol = 0; iCol < arrCols.Length; iCol++)
                    {
                        arrCols[iCol] = OutputTools.GetSpacesCenteredString(arrCols[iCol], 10);
                    }
                }

                if (s6xTable.RowsNumber <= 0)
                {
                    arrRows = new object[] { };
                }
                else
                {
                    arrRows        = new object[s6xTable.RowsNumber];
                    arrRowsHeaders = getTableElemDataScale(ref sadBin, s6xTable.RowsScalerAddress, s6xTable.RowsNumber);
                    if (s6xTable.WordOutput)
                    {
                        arrBytes = sadBin.getBytesArray(s6xTable.AddressBinInt, arrCols.Length * arrRows.Length * 2);
                    }
                    else
                    {
                        arrBytes = sadBin.getBytesArray(s6xTable.AddressBinInt, arrCols.Length * arrRows.Length);
                    }
                    iAddress = 0;
                    for (int iRow = 0; iRow < arrRows.Length; iRow++)
                    {
                        arrRow = new object[arrCols.Length];
                        for (int iCol = 0; iCol < arrRow.Length; iCol++)
                        {
                            try
                            {
                                if (s6xTable.WordOutput)
                                {
                                    sValue = arrBytes[iAddress + 1] + arrBytes[iAddress];
                                    iValue = Tools.getWordInt(sValue, s6xTable.SignedOutput);
                                }
                                else
                                {
                                    sValue = arrBytes[iAddress];
                                    iValue = Tools.getByteInt(sValue, s6xTable.SignedOutput);
                                }
                            }
                            catch
                            {
                                sValue = string.Empty;
                                iValue = 0;
                            }
                            iAddress++;
                            if (s6xTable.WordOutput)
                            {
                                iAddress++;
                            }

                            if (dataDecimal)
                            {
                                if (failedScale)
                                {
                                    arrRow[iCol] = iValue;
                                }
                                else
                                {
                                    try
                                    {
                                        if (ignoreDefinedConversion)
                                        {
                                            if (rcOutput == null)
                                            {
                                                arrRow[iCol] = iValue;
                                            }
                                            else
                                            {
                                                arrRow[iCol] = Tools.ScaleValue(iValue, rcOutput.InternalFormula, 0, true);
                                            }
                                        }
                                        else
                                        {
                                            if (rcOutput == null)
                                            {
                                                arrRow[iCol] = Tools.ScaleValue(iValue, s6xTable.CellsScaleExpression, s6xTable.CellsScalePrecision, true);
                                            }
                                            else
                                            {
                                                arrRow[iCol] = Tools.ScaleValue(iValue, rcOutput.InternalFormula.ToUpper().Replace("X", "(" + s6xTable.CellsScaleExpression + ")"), s6xTable.CellsScalePrecision, true);
                                            }
                                        }
                                    }
                                    catch
                                    {
                                        failedScale  = true;
                                        arrRow[iCol] = iValue;
                                    }
                                }
                            }
                            else
                            {
                                arrRow[iCol] = sValue.ToUpper();
                            }
                        }
                        arrRows[iRow] = arrRow;
                    }
                }
                s6xTable = null;
                break;

            case S6xNavHeaderCategory.STRUCTURES:
                s6xStruct = (S6xStructure)s6xObject;
                if (s6xStruct.Number <= 0)
                {
                    return(false);
                }

                s6xStruct.Structure = new Structure(s6xStruct);
                if (!s6xStruct.Structure.isValid)
                {
                    return(false);
                }
                if (s6xStruct.Structure.isEmpty)
                {
                    return(false);
                }

                elemDataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;

                s6xStruct.Structure.AddressBinInt = Tools.binAddressCorrected(s6xStruct.Structure.BankNum, s6xStruct.Structure.AddressInt, ref sadBin, s6xStruct.Structure.AddressBinInt);

                arrBytes = sadBin.getBytesArray(s6xStruct.Structure.AddressBinInt, s6xStruct.Structure.MaxSizeSingle * s6xStruct.Number);
                s6xStruct.Structure.Read(ref arrBytes, s6xStruct.Number);
                arrBytes = null;

                arrCols = new string[s6xStruct.Structure.MaxLineItemsNum];
                for (int iCol = 0; iCol < arrCols.Length; iCol++)
                {
                    arrCols[iCol] = (iCol + 1).ToString();
                }

                // For better output
                for (int iCol = 0; iCol < arrCols.Length; iCol++)
                {
                    arrCols[iCol] = OutputTools.GetSpacesCenteredString(arrCols[iCol], 10);
                }

                dataType = typeof(string);

                if (s6xStruct.Structure.Lines.Count <= 0)
                {
                    arrRows = new object[] { };
                }
                else
                {
                    arrRows        = new object[s6xStruct.Structure.Lines.Count];
                    arrRowsHeaders = new object[s6xStruct.Structure.Lines.Count];
                    int iRow = 0;
                    foreach (StructureLine structLine in s6xStruct.Structure.Lines)
                    {
                        arrRowsHeaders[iRow] = structLine.NumberInStructure.ToString();
                        arrRow = new object[arrCols.Length];
                        for (int iCol = 0; iCol < structLine.Items.Count; iCol++)
                        {
                            arrRow[iCol] = ((StructureItem)structLine.Items[iCol]).Value(structLine.NumberInStructure);
                        }
                        arrRows[iRow] = arrRow;
                        iRow++;
                    }
                }
                s6xStruct = null;
                break;

            default:
                return(false);
            }

            if (arrCols == null)
            {
                return(false);
            }

            if (dataReversed)
            {
                object[] arrReversedRows = new object[arrRows.Length];
                for (int iRow = 0; iRow < arrReversedRows.Length; iRow++)
                {
                    arrReversedRows[arrReversedRows.Length - 1 - iRow] = arrRows[iRow];
                }
                arrRows         = arrReversedRows;
                arrReversedRows = null;

                if (arrRowsHeaders != null)
                {
                    arrReversedRows = new object[arrRowsHeaders.Length];
                    for (int iRow = 0; iRow < arrReversedRows.Length; iRow++)
                    {
                        arrReversedRows[arrReversedRows.Length - 1 - iRow] = arrRowsHeaders[iRow];
                    }
                    arrRowsHeaders  = arrReversedRows;
                    arrReversedRows = null;
                }
            }

            dtTable = new DataTable();
            //foreach (string colLabel in arrCols) dtTable.Columns.Add(new DataColumn(colLabel, dataType));
            for (int iCol = 0; iCol < arrCols.Length; iCol++)
            {
                DataColumn dcDC = new DataColumn(iCol.ToString(), dataType);
                dcDC.Caption = arrCols[iCol];
                dtTable.Columns.Add(dcDC);
            }

            foreach (object[] oRow in arrRows)
            {
                dtTable.Rows.Add(oRow);
            }
            arrRows = null;

            elemDataGridView.Tag = new object[] { arrCols, arrRowsHeaders };

            // For Speed purpose
            elemDataGridView.AutoSizeColumnsMode     = DataGridViewAutoSizeColumnsMode.None;
            elemDataGridView.AutoSizeRowsMode        = DataGridViewAutoSizeRowsMode.None;
            elemDataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;

            try { elemDataGridView.DataSource = dtTable; }
            catch { return(false); }

            // For Speed purpose
            switch (headerCategory)
            {
            case S6xNavHeaderCategory.SCALARS:
            case S6xNavHeaderCategory.FUNCTIONS:
                elemDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                break;

            case S6xNavHeaderCategory.TABLES:
            case S6xNavHeaderCategory.STRUCTURES:
                //elemDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                elemDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                break;
            }

            elemDataGridView.AutoSizeRowsMode        = DataGridViewAutoSizeRowsMode.None;
            elemDataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;

            dtTable        = null;
            arrCols        = null;
            arrRowsHeaders = null;

            elemDataGridView.Visible = true;

            return(true);
        }