public FlashDatabase(Device parentPanel) { ParentPanel = parentPanel; BytesDatabase = new BytesDatabase(); BinaryPanel = SystemDatabaseCreator.BinaryConfigurationHelper.BinaryPanels.FirstOrDefault(x => x.ParentPanel == ParentPanel); CreateEmptyTable(); CreateDirections(); CreateRemoteZones(); CreateLocalZones(); CreateAddressListTable(); CreateDevices(); CreateLastTable(); foreach (var table in Tables) { table.Create(); } foreach (var table in Tables) { foreach (var byteDescription in table.BytesDatabase.ByteDescriptions) { byteDescription.TableHeader = table; } } foreach (var table in Tables) { if (table.BytesDatabase.Name == "Адресный лист") { var count = BytesDatabase.ByteDescriptions.Count; var bytesBefireEnd = 256 - count % 256; if (bytesBefireEnd < 32) { var leftTable = new TableBase(this, "Дополняюшая таблица"); for (int i = 0; i < bytesBefireEnd; i++) { leftTable.BytesDatabase.AddByte(0, "Дополняющий байт"); } BytesDatabase.Add(leftTable.BytesDatabase); } } BytesDatabase.Add(table.BytesDatabase); } BytesDatabase.Order(); BytesDatabase.ResolveTableReferences(); BytesDatabase.ResolveReferences(); var crcBytes = BytesDatabase.GetBytes(); crcBytes.RemoveRange(0, 256); crcBytes.RemoveRange(crcBytes.Count - 36, 36); var md5 = MD5.Create(); var md5Bytes = md5.ComputeHash(crcBytes.ToArray()); for (int i = 0; i < 16; i++) { var md5Byte = md5Bytes[i]; LastTable.BytesDatabase.ByteDescriptions[i + 1].Value = md5Byte; } CreateRootBytes(); }
public RomDatabase(FlashDatabase flashDatabase, int startOffset) { FlashDatabase = flashDatabase; BytesDatabase = new BytesDatabase(); var headBytesDatabase = new BytesDatabase("Заголовок"); if (FlashDatabase.ParentPanel.Driver.DriverType == DriverType.BUNS || FlashDatabase.ParentPanel.Driver.DriverType == DriverType.USB_BUNS) { headBytesDatabase.AddString("BUNS", "Сигнатура базы", 4); } else { headBytesDatabase.AddString("BASE", "Сигнатура базы", 4); } headBytesDatabase.AddShort(5, "Версия базы"); headBytesDatabase.AddReference(FlashDatabase.BytesDatabase.ByteDescriptions.Last(), "Абсолютный указатель на конец базы во внешней энергонезависимой паияти"); var pointerToLast = headBytesDatabase.AddReference((ByteDescription)null, "Абсолютный указатель на конец блока, записываемого в память кристалла"); BytesDatabase.Add(headBytesDatabase); foreach (var tableGroup in FlashDatabase.DevicesTableGroups) { var bytesDatabase = new BytesDatabase(tableGroup.Name); bytesDatabase.AddReferenceToTable(tableGroup.Tables.FirstOrDefault(), tableGroup.Name); bytesDatabase.AddByte(tableGroup.ComputedLength, "Длина записи в таблице"); bytesDatabase.AddShort(tableGroup.Count, "Текущее число записей в таблице"); BytesDatabase.Add(bytesDatabase); } var emptyBytesDatabase = new BytesDatabase(); for (int i = 0; i < 1542 - BytesDatabase.ByteDescriptions.Count; i++) { emptyBytesDatabase.AddByte(0); } BytesDatabase.Add(emptyBytesDatabase); CreateLocalZonesHeaders(); CreateRemoteDevicesHeaders(); CreateDirectionsHeaders(); CreateLocalDevicesHeaders(); AddLocalZonesHeaderPointers(); AddRemoteZonesHeaders(); AddRemoteDevicesHeadersPointers(); AddLocalDevicesHeadersPointers(); AddServiceTablePointers(); AddDirectionsHeadersPointers(); BytesDatabase.Add(DirectionsBytesDatabase); BytesDatabase.Add(LocalZonesBytesDatabase); BytesDatabase.Add(RemoteDevicesBytesDatabase); foreach (var localDevicesBytesDatabase in LocalDevicesBytesDatabase) { BytesDatabase.Add(localDevicesBytesDatabase); } pointerToLast.AddressReference = BytesDatabase.ByteDescriptions.LastOrDefault(); BytesDatabase.Order(startOffset); BytesDatabase.ResolveTableReferences(); foreach (var byteDescription in BytesDatabase.ByteDescriptions) { if (byteDescription.TableBaseReference != null) { byteDescription.AddressReference = FlashDatabase.BytesDatabase.ByteDescriptions.FirstOrDefault(x => x.TableHeader != null && x.TableHeader.ReferenceUID == byteDescription.TableBaseReference.ReferenceUID); } } BytesDatabase.ResolveReferences(); var allBytes = BytesDatabase.GetBytes(); var crc16Value = Crc16Helper.ComputeChecksum(allBytes); FlashDatabase.BytesDatabase.SetShort(FlashDatabase.Crc16ByteDescription, crc16Value); }