public static bool SortDependenciedCDT(ComplexDataTypesList datatypes)
        {
            /* Select dependencies */
            int IterationCount = 0;

            bool hasDependencyLower = true;
            while (hasDependencyLower && (IterationCount < 100))
            {
                IterationCount++;
                hasDependencyLower = false;
                for (int i = 0; i < datatypes.Count - 1; i++)
                {
                    /* Find max dependency index */
                    int maxDependency = findMaxDependency(datatypes, datatypes[i], i);

                    /* if there is dependency then move the datatype after dependency and start cycle again */
                    if (maxDependency != -1)
                    {
                        ComplexDataType cdt = datatypes[i];
                        datatypes.RemoveAt(i);
                        datatypes.Insert(maxDependency, cdt);
                        hasDependencyLower = true;
                        break;
                    }
                }
            }

            return IterationCount < 100;
        }
        public void GenerateDataTypesFile(String folder)
        {
            String FileName = folder + "\\" + Properties.Resources.RTE_DATATYPES_H_FILENAME;
            StreamWriter writer = new StreamWriter(FileName);
            RteFunctionsGenerator.GenerateFileTitle(writer, Properties.Resources.RTE_DATATYPES_H_FILENAME, Properties.Resources.DATATYPES_H_FILE_DESCRIPTION);
            String guardDefine = RteFunctionsGenerator.OpenGuardDefine(writer);

            writer.WriteLine();
            RteFunctionsGenerator.AddInclude(writer, Properties.Resources.RTE_RETURN_CODES_FILENAME);
            writer.WriteLine();

            WriteStaticGlobal(writer);
            WriteBaseDataTypes(writer);
            WriteEnumDataTypes(writer);
            WriteSimpleDataTypes(writer);

            ComplexDataTypesList sortedComplexDataTypes = SortComplexDataTypeWithDependencies();
            WriteComplexDataTypes(sortedComplexDataTypes, writer);

            GenerateComponentsDataTypes(writer);

            RteFunctionsGenerator.CloseGuardDefine(writer);
            RteFunctionsGenerator.WriteEndOfFile(writer);
            writer.Close();
        }
 public void WriteComplexDataTypes(ComplexDataTypesList datatypes, StreamWriter writer)
 {
     writer.WriteLine("/* Complex data types */");
     writer.WriteLine("");
     foreach (ComplexDataType datatype in datatypes)
     {
         WriteComplexDataType(writer, datatype);
     }
 }
 public static void RemoveDataTypesWithoutDependencies(ComplexDataTypesList allComplexDataTypes)
 {
     for (int i = allComplexDataTypes.Count - 1; i >= 0; i--)
     {
         /* If component doesn't have dependencies to other complex data types remove it from list */
         if (isComplexDataTypeWithoutDependenciesToOtherCDT(allComplexDataTypes[i]) == true)
         {
             allComplexDataTypes.RemoveAt(i);
         }
     }
 }
        static bool isComplexDataTypeWithoutDependenciesToOtherCDT(ComplexDataType cdt)
        {
            ComplexDataTypesList allCDT = AutosarApplication.GetInstance().ComplexDataTypes;
            foreach(ComplexDataTypeField field in cdt.Fields)
            {
                ComplexDataType findedCDT = allCDT.FindObject(field.DataTypeGUID);
                if (findedCDT != null)
                {
                    return false;
                }
            }

            return true;
        }
 static int findMaxDependency(ComplexDataTypesList datatypes, ComplexDataType currentDataType, int startIndex)
 {
     int maxDependency = -1;
      foreach (ComplexDataTypeField field in currentDataType.Fields)
      {
          for (int i = startIndex; i < datatypes.Count; i++)
          {
              if (field.DataTypeGUID.Equals(datatypes[i].GUID))
              {
                  if (maxDependency < i)
                  {
                      maxDependency = i;
                  }
              }
          }
      }
      return maxDependency;
 }
Exemplo n.º 7
0
        void TestForComplexDependency()
        {
            ComplexDataTypesList allCDT = new ComplexDataTypesList();

            allCDT.Capacity = autosarApp.ComplexDataTypes.Count;
            allCDT.AddRange(autosarApp.ComplexDataTypes);
            RteDataTypesGenerator.RemoveDataTypesWithoutDependencies(allCDT);
            bool result = RteDataTypesGenerator.SortDependenciedCDT(allCDT);

            if (!result)
            {
                String strRes = "There are recursion dependencies in components: " + Environment.NewLine;
                foreach (ComplexDataType cdt in allCDT)
                {
                    strRes += cdt.Name + Environment.NewLine;
                }
                AppendText(strRes, Error: true);
            }
        }
        ComplexDataTypesList SortComplexDataTypeWithDependencies()
        {
            /* Base list */
            ComplexDataTypesList allComplexDataTypes = new ComplexDataTypesList();
            allComplexDataTypes.Capacity = AutosarApplication.GetInstance().ComplexDataTypes.Count;

            ComplexDataTypesList sortedComplexDataTypes = new ComplexDataTypesList();
            sortedComplexDataTypes.Capacity = AutosarApplication.GetInstance().ComplexDataTypes.Count;

            allComplexDataTypes.AddRange(AutosarApplication.GetInstance().ComplexDataTypes);

            /* First shall be structures without dependencies to complex datatypes */
            for (int i = allComplexDataTypes.Count - 1; i >= 0; i--)
            {
                /* If component doesn't have dependencies to other complex data types remove it from list */
                if (isComplexDataTypeWithoutDependenciesToOtherCDT(allComplexDataTypes[i]) == true)
                {
                    sortedComplexDataTypes.Add(allComplexDataTypes[i]);
                    allComplexDataTypes.RemoveAt(i);
                }
            }

            sortedComplexDataTypes.DoSort();

            bool sortingCDTResult = SortDependenciedCDT(allComplexDataTypes);
            if (sortingCDTResult == false)
            {
                String strRes = "Imposible to generate RTE because there is recursion dependencies in components: " + Environment.NewLine;
                foreach(ComplexDataType cdt in allComplexDataTypes)
                {
                    strRes += cdt.Name + Environment.NewLine;
                }
                MessageBox.Show(strRes);
            }

            sortedComplexDataTypes.AddRange(allComplexDataTypes);

            return sortedComplexDataTypes;
        }