public static GroupDescriptor getNewGroupDescriptor(DataItem aItem, int aPDULength, int aMaxAddress) { var lGroupDsc = new GroupDescriptor(); lGroupDsc.mStart = aItem.Byte; lGroupDsc.setBufferSize(aItem, aPDULength, aMaxAddress); return(lGroupDsc); }
private void optimize() { #region Sorting var lMemoryAreas = new SortedList <string, SortedDictionary <int, List <DataItem> > >(StringComparer.Ordinal); var lItemCount = new SortedList <string, int>(StringComparer.Ordinal); var lMaxAddress = new SortedList <string, int>(StringComparer.Ordinal); DataItem lItem; string lAreaName; int lMax; int lCount = mItemRWList.Count; for (int i = 0; i < lCount; i++) { lItem = mItemRWList[i]; lAreaName = lItem.mMemoryType.ToString(); if (lItem.mMemoryType == EArea.DB) { lAreaName = lAreaName + lItem.DB.ToString(); } lMax = lItem.Byte + lItem.BufferLength - 1; if (lMemoryAreas.ContainsKey(lAreaName) == false) { lMemoryAreas.Add(lAreaName, new SortedDictionary <int, List <DataItem> >()); lItemCount.Add(lAreaName, 0); lMaxAddress.Add(lAreaName, lMax); } if (lMemoryAreas[lAreaName].ContainsKey(lItem.Byte) == false) { lMemoryAreas[lAreaName].Add(lItem.Byte, new List <DataItem>()); } lMemoryAreas[lAreaName][lItem.Byte].Add(lItem); lItemCount[lAreaName] = lItemCount[lAreaName] + 1; if (lMaxAddress[lAreaName] < lMax) { lMaxAddress[lAreaName] = lMax; } lItem.mGroup = 0; } #endregion #region Grouping SortedDictionary <int, List <DataItem> > lArea; mGroups.Clear(); mItemRWList.Clear(); int lGroupLastByte; int lItemLastByte; GroupDescriptor lGroupDsc = null; int lGroup = 0; foreach (string lAreaName1 in lMemoryAreas.Keys) { lArea = lMemoryAreas[lAreaName1]; foreach (int lByte in lArea.Keys) { mItemRWList.AddRange(lArea[lByte]); } if (lItemCount[lAreaName1] > 1) { foreach (int lByte in lArea.Keys) { foreach (DataItem lItem1 in lArea[lByte]) { if (lGroupDsc == null) { lGroupDsc = GroupDescriptor.getNewGroupDescriptor(lItem1, mPDULength, lMaxAddress[lAreaName1]); mGroups.Add(lGroupDsc); lGroup = lGroup + 1; } lGroupLastByte = lGroupDsc.mStart + lGroupDsc.mBuffer.Length - 1; lItemLastByte = lItem1.Byte + lItem1.BufferLength - 1; if (lGroupLastByte < lItemLastByte) { if (lItem1.Byte <= lGroupLastByte) { lGroupDsc.setBufferSize(lItem1, mPDULength, lMaxAddress[lAreaName1]); } else { lGroupDsc = GroupDescriptor.getNewGroupDescriptor(lItem1, mPDULength, lMaxAddress[lAreaName1]); mGroups.Add(lGroupDsc); lGroup = lGroup + 1; } } lItem1.mGroup = lGroup; } } lGroupDsc = null; } } #endregion }