void CreateTables() { FirstTable = new BytesDatabase(); for (int i = 0; i < 0x4000; i++) { FirstTable.AddByte(0); } FirstTable.AddShort(5, "Версия БД"); Crc16ByteDescription = FirstTable.AddShort(0, "CRC от ROM части базы", ignoreUnequal: true); var lengtByteDescription = FirstTable.AddInt(0, "Размер БД"); FirstTable.AddShort(IndicatorItems.Count, "Число приборов"); BytesDatabase.Add(FirstTable); BytesDatabase.AddByte(1, "Хэш"); for (int i = 0; i < 16; i++) { BytesDatabase.AddByte(0, "Хэш", ignoreUnequal: true); } for (int i = 0; i < 47; i++) { BytesDatabase.AddByte(255, "Доп. информация"); } IndicatorItems = IndicatorItems.OrderBy(x => x.ParentPanel.IntAddress).ToList(); foreach (var indicatorItem in IndicatorItems) { var panelDatabase = ConfigurationWriterHelper.PanelDatabases.FirstOrDefault(x => x.ParentPanel.UID == indicatorItem.ParentPanel.UID); var paneBytesDatabase = new BytesDatabase("Запись прибора"); paneBytesDatabase.AddByte(indicatorItem.ParentPanel.IntAddress, "Номер прибора"); for (int i = 0; i < 16; i++) { var value = panelDatabase.FlashDatabase.LastTable.BytesDatabase.ByteDescriptions[i + 1].Value; paneBytesDatabase.AddByte(value, "MD5", ignoreUnequal:true); } var offset = panelDatabase.FlashDatabase.LastTable.BytesDatabase.ByteDescriptions.FirstOrDefault().Offset; var offsetBytes = BitConverter.GetBytes(offset + 1); for (int i = 0; i < 3; i++) { paneBytesDatabase.AddByte(offsetBytes[i], "Смещение MD5"); } paneBytesDatabase.AddShort(indicatorItem.ZoneIndicators.Count, "Количество зон"); indicatorItem.ZonesReference = paneBytesDatabase.AddReference(new ByteDescription(), "Смещение зон"); paneBytesDatabase.AddShort(indicatorItem.Devices.Count, "Количество ИУ"); indicatorItem.DevicesReference = paneBytesDatabase.AddReference(new ByteDescription(), "Смещение ИУ"); paneBytesDatabase.AddShort(indicatorItem.AM1_T_Devices.Count, "Количество ТМ"); indicatorItem.AM1_TReference = paneBytesDatabase.AddReference(new ByteDescription(), "Смещение ТМ"); paneBytesDatabase.AddShort(indicatorItem.PumpStations.Count, "Количество НС"); indicatorItem.PumpStationReference = paneBytesDatabase.AddReference(new ByteDescription(), "Смещение НС"); paneBytesDatabase.AddShort(indicatorItem.Pumps.Count, "Количество Насосов"); indicatorItem.PumpReference = paneBytesDatabase.AddReference(new ByteDescription(), "Смещение Насосов"); BytesDatabase.Add(paneBytesDatabase); } foreach (var indicatorItem in IndicatorItems) { var panelDatabase = ConfigurationWriterHelper.PanelDatabases.FirstOrDefault(x => x.ParentPanel.UID == indicatorItem.ParentPanel.UID); var firstFlag = true; foreach (var zoneIndicator in indicatorItem.ZoneIndicators) { var paneBytesDatabase = new BytesDatabase("Зона " + zoneIndicator.Zone.PresentationName); var zoneTable = panelDatabase.FlashDatabase.LocalZonesTableGroup.Tables.FirstOrDefault(x => x.UID == zoneIndicator.Zone.UID) as ZoneTable; var offset = zoneTable.BytesDatabase.ByteDescriptions.FirstOrDefault().Offset; var offsetBytes = BitConverter.GetBytes(offset); for (int i = 0; i < 3; i++) { paneBytesDatabase.AddByte(offsetBytes[i], "Смещение"); } paneBytesDatabase.AddShort(zoneTable.BinaryZone.LocalNo, "Локальный номер"); var zoneType = 0; if (zoneIndicator.Zone.ZoneType == ZoneType.Guard) zoneType = 1; paneBytesDatabase.AddByte(zoneType, "ID Зоны"); var deviceNo = (zoneIndicator.IndicatorDevice.Parent.IntAddress - 1) * 50 + zoneIndicator.IndicatorDevice.IntAddress; paneBytesDatabase.AddByte(deviceNo, "Номер светодиода"); BytesDatabase.Add(paneBytesDatabase); if (firstFlag) { indicatorItem.ZonesReference.AddressReference = paneBytesDatabase.ByteDescriptions.FirstOrDefault(); firstFlag = false; } } firstFlag = true; var sortedDevices = indicatorItem.Devices.OrderBy(x => x.Device.IntAddress).ToList(); foreach (var deviceIndicator in sortedDevices) { var paneBytesDatabase = new BytesDatabase("Устройство ИУ " + deviceIndicator.Device.DottedPresentationNameAndAddress); EffectorDeviceTable effectorDeviceTable = null; foreach (var tableGroup in panelDatabase.FlashDatabase.DevicesTableGroups) { effectorDeviceTable = tableGroup.Tables.FirstOrDefault(x => x.UID == deviceIndicator.Device.UID) as EffectorDeviceTable; if (effectorDeviceTable != null) { break; } } var offset = effectorDeviceTable.BytesDatabase.ByteDescriptions.FirstOrDefault().Offset + 3; var offsetBytes = BitConverter.GetBytes(offset); for (int i = 0; i < 3; i++) { paneBytesDatabase.AddByte(offsetBytes[i], "Смещение"); } paneBytesDatabase.AddByte(effectorDeviceTable.Device.AddressOnShleif, "Адрес"); paneBytesDatabase.AddByte(effectorDeviceTable.Device.ShleifNo - 1, "Шлейф"); var firstValue = 16 * (int)deviceIndicator.IndicatorDevice.IndicatorLogic.OnColor + (int)deviceIndicator.IndicatorDevice.IndicatorLogic.OffColor; var sectondValue = 16 * (int)deviceIndicator.IndicatorDevice.IndicatorLogic.FailureColor + (int)deviceIndicator.IndicatorDevice.IndicatorLogic.ConnectionColor; paneBytesDatabase.AddByte(firstValue, "Индикация"); paneBytesDatabase.AddByte(sectondValue, "Индикация"); for (int i = 0; i < 14; i++) { paneBytesDatabase.AddByte(0, "Индикация"); } var deviceCode = FiresecAPI.Models.DriversHelper.GetCodeForDriver(effectorDeviceTable.Device.Driver.DriverType); paneBytesDatabase.AddByte(deviceCode, "Тип ИУ"); var deviceNo = (deviceIndicator.IndicatorDevice.Parent.IntAddress - 1) * 50 + deviceIndicator.IndicatorDevice.IntAddress; paneBytesDatabase.AddByte(deviceNo, "Номер светодиода"); BytesDatabase.Add(paneBytesDatabase); if (firstFlag) { indicatorItem.DevicesReference.AddressReference = paneBytesDatabase.ByteDescriptions.FirstOrDefault(); firstFlag = false; } } firstFlag = true; var sortedAM1_T_Devices = indicatorItem.AM1_T_Devices.OrderBy(x => x.Device.IntAddress).ToList(); foreach (var deviceIndicator in sortedAM1_T_Devices) { var paneBytesDatabase = new BytesDatabase("Устройство АМ1-Т " + deviceIndicator.Device.DottedPresentationNameAndAddress); SensorDeviceTable sensorDeviceTable = null; foreach (var tableGroup in panelDatabase.FlashDatabase.DevicesTableGroups) { sensorDeviceTable = tableGroup.Tables.FirstOrDefault(x => x.UID == deviceIndicator.Device.UID) as SensorDeviceTable; if (sensorDeviceTable != null) { break; } } var offset = sensorDeviceTable.BytesDatabase.ByteDescriptions.FirstOrDefault().Offset + 2; var offsetBytes = BitConverter.GetBytes(offset); for (int i = 0; i < 3; i++) { paneBytesDatabase.AddByte(offsetBytes[i], "Смещение"); } paneBytesDatabase.AddByte(sensorDeviceTable.Device.AddressOnShleif, "Адрес"); paneBytesDatabase.AddByte(sensorDeviceTable.Device.ShleifNo - 1, "Шлейф"); var firstValue = 16 * (int)deviceIndicator.IndicatorDevice.IndicatorLogic.OnColor + (int)deviceIndicator.IndicatorDevice.IndicatorLogic.OffColor; var sectondValue = 16 * (int)deviceIndicator.IndicatorDevice.IndicatorLogic.FailureColor + (int)deviceIndicator.IndicatorDevice.IndicatorLogic.ConnectionColor; paneBytesDatabase.AddByte(firstValue, "Индикация"); paneBytesDatabase.AddByte(sectondValue, "Индикация"); for (int i = 0; i < 14; i++) { paneBytesDatabase.AddByte(0, "Индикация"); } var deviceCode = FiresecAPI.Models.DriversHelper.GetCodeForDriver(sensorDeviceTable.Device.Driver.DriverType); paneBytesDatabase.AddByte(deviceCode, "Тип ИУ"); var deviceNo = (deviceIndicator.IndicatorDevice.Parent.IntAddress - 1) * 50 + deviceIndicator.IndicatorDevice.IntAddress; paneBytesDatabase.AddByte(deviceNo, "Номер светодиода"); BytesDatabase.Add(paneBytesDatabase); if (firstFlag) { indicatorItem.AM1_TReference.AddressReference = paneBytesDatabase.ByteDescriptions.FirstOrDefault(); firstFlag = false; } } firstFlag = true; foreach (var deviceIndicator in indicatorItem.PumpStations) { var paneBytesDatabase = new BytesDatabase("НС " + deviceIndicator.Device.DottedPresentationNameAndAddress); EffectorDeviceTable effectorDeviceTable = null; foreach (var tableGroup in panelDatabase.FlashDatabase.DevicesTableGroups) { effectorDeviceTable = tableGroup.Tables.FirstOrDefault(x => x.UID == deviceIndicator.Device.UID) as EffectorDeviceTable; if (effectorDeviceTable != null) { break; } } var offset = effectorDeviceTable.BytesDatabase.ByteDescriptions.FirstOrDefault().Offset + 3; var offsetBytes = BitConverter.GetBytes(offset); for (int i = 0; i < 3; i++) { paneBytesDatabase.AddByte(offsetBytes[i], "Смещение"); } paneBytesDatabase.AddByte(effectorDeviceTable.Device.PumpAddress, "Адрес"); var deviceNo = (deviceIndicator.IndicatorDevice.Parent.IntAddress - 1) * 50 + deviceIndicator.IndicatorDevice.IntAddress; paneBytesDatabase.AddByte(deviceNo, "Номер светодиода"); BytesDatabase.Add(paneBytesDatabase); if (firstFlag) { indicatorItem.PumpStationReference.AddressReference = paneBytesDatabase.ByteDescriptions.FirstOrDefault(); firstFlag = false; } } firstFlag = true; var sortedPumps = indicatorItem.Pumps.OrderBy(x => x.Device.PumpAddress).ToList(); foreach (var deviceIndicator in sortedPumps) { var paneBytesDatabase = new BytesDatabase("Насос " + deviceIndicator.Device.DottedPresentationNameAndAddress); EffectorDeviceTable effectorDeviceTable = null; foreach (var tableGroup in panelDatabase.FlashDatabase.DevicesTableGroups) { effectorDeviceTable = tableGroup.Tables.FirstOrDefault(x => x.UID == deviceIndicator.Device.Parent.UID) as EffectorDeviceTable; if (effectorDeviceTable != null) { break; } } var offset = effectorDeviceTable.BytesDatabase.ByteDescriptions.FirstOrDefault(x => x.Description == "Адрес насоса " + deviceIndicator.Device.PumpAddress).Offset + 8; var offsetBytes = BitConverter.GetBytes(offset); for (int i = 0; i < 3; i++) { paneBytesDatabase.AddByte(offsetBytes[i], "Смещение"); } paneBytesDatabase.AddByte(deviceIndicator.Device.PumpAddress, "Адрес"); paneBytesDatabase.AddByte(0, "Шлейф"); var deviceNo = (deviceIndicator.IndicatorDevice.Parent.IntAddress - 1) * 50 + deviceIndicator.IndicatorDevice.IntAddress; paneBytesDatabase.AddByte(deviceNo, "Номер светодиода"); BytesDatabase.Add(paneBytesDatabase); if (firstFlag) { indicatorItem.PumpReference.AddressReference = paneBytesDatabase.ByteDescriptions.FirstOrDefault(); firstFlag = false; } } } Tables.Add(FirstTable); BytesDatabase.SetShort(lengtByteDescription, BytesDatabase.ByteDescriptions.Count - 0x4000 - 74); }
void AddLocalDevicesHeadersPointers() { for (int i = 0; i < 16; i++) { BytesDatabase shleifBytesDatabase = null; if (i < LocalDevicesBytesDatabase.Count) shleifBytesDatabase = LocalDevicesBytesDatabase[i]; var bytesDatabase = new BytesDatabase("Указатель на указатели на локальное устройство шлейфа " + (i + 1).ToString()); bytesDatabase.AddReference(shleifBytesDatabase, "Абсолютный указатель на таблицу"); bytesDatabase.AddByte(0, "Длина записи в таблице"); var count = 0; if (shleifBytesDatabase != null) count = shleifBytesDatabase.ByteDescriptions.Count / 3; bytesDatabase.AddByte(count, "Текущее число записей в таблице"); BytesDatabase.Add(bytesDatabase); } }
void AddDirectionsHeadersPointers() { var bytesDatabase = new BytesDatabase("Указатель на указатели на Направления"); bytesDatabase.AddReference(DirectionsBytesDatabase, "Абсолютный указатель на таблицу"); bytesDatabase.AddByte(0, "Длина записи в таблице"); bytesDatabase.AddShort(DirectionsBytesDatabase.ByteDescriptions.Count / 3, "Текущее число записей в таблице"); BytesDatabase.Add(bytesDatabase); }
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); }
void AddRemoteDevicesHeadersPointers() { var bytesDatabase = new BytesDatabase("Указатель на указатели на Внешние устройства"); bytesDatabase.AddReference(RemoteDevicesBytesDatabase, "Абсолютный указатель на таблицу"); bytesDatabase.AddByte(0, "Длина записи в таблице"); bytesDatabase.AddShort(0, "Текущее число записей в таблице"); BytesDatabase.Add(bytesDatabase); }
void AddLocalZonesHeaderPointers() { var bytesDatabase = new BytesDatabase("Указатель на указатели на локальные зоны"); bytesDatabase.AddReference(LocalZonesBytesDatabase, "Абсолютный указатель на таблицу"); bytesDatabase.AddByte(0, "Длина записи в таблице"); bytesDatabase.AddShort(FlashDatabase.LocalZonesTableGroup.Tables.Count, "Текущее число записей в таблице"); BytesDatabase.Add(bytesDatabase); }