diff --git a/ChanSort.Api/Model/ChannelList.cs b/ChanSort.Api/Model/ChannelList.cs index 922761e..13397b5 100644 --- a/ChanSort.Api/Model/ChannelList.cs +++ b/ChanSort.Api/Model/ChannelList.cs @@ -29,6 +29,7 @@ namespace ChanSort.Api public int DuplicateUidCount { get { return duplicateUidCount; } } public int DuplicateProgNrCount { get { return duplicateProgNrCount; } } public bool ReadOnly { get; set; } + public int MaxChannelNameLength { get; set; } #region Caption public string Caption diff --git a/ChanSort.Api/Model/Enums.cs b/ChanSort.Api/Model/Enums.cs index 266fbdd..73ed195 100644 --- a/ChanSort.Api/Model/Enums.cs +++ b/ChanSort.Api/Model/Enums.cs @@ -32,6 +32,9 @@ namespace ChanSort.Api TivuSat = 3 << 12, CanalDigital = 4 << 12, + StandardCable = 0 << 12, + CablePrime = 1 << 12, + AnalogC=Analog + Cable, AnalogT=Analog + Antenna, AnalogCT=Analog + Cable + Antenna, @@ -39,7 +42,8 @@ namespace ChanSort.Api DvbT= Digital + Antenna, DvbCT= Digital + Cable + Antenna, DvbS= Digital + Sat, - HdPlusD = Digital + Sat + AstraHdPlus + HdPlusD = Digital + Sat + AstraHdPlus, + CablePrimeD = Digital + Cable + CablePrime } #endregion diff --git a/ChanSort.Api/Utils/DataMapping.cs b/ChanSort.Api/Utils/DataMapping.cs index b33ee77..915e26e 100644 --- a/ChanSort.Api/Utils/DataMapping.cs +++ b/ChanSort.Api/Utils/DataMapping.cs @@ -179,7 +179,7 @@ namespace ChanSort.Api #endregion #region SetString() - public void SetString(string key, string text, int maxLen) + public int SetString(string key, string text, int maxLen) { var bytes = this.DefaultEncoding.GetBytes(text); int len = Math.Min(bytes.Length, maxLen); @@ -189,6 +189,7 @@ namespace ChanSort.Api for (int i = len; i < maxLen; i++) this.data[baseOffset + offset + i] = 0; } + return len; } #endregion } diff --git a/ChanSort.Loader.LG/TllFileSerializer.cs b/ChanSort.Loader.LG/TllFileSerializer.cs index 9055944..e1ebf1c 100644 --- a/ChanSort.Loader.LG/TllFileSerializer.cs +++ b/ChanSort.Loader.LG/TllFileSerializer.cs @@ -48,7 +48,6 @@ namespace ChanSort.Loader.LG private int dvbsChannelCount; private DvbsDataLayout satConfig; - private bool isDvbsSymbolRateDiv2; private Dictionary nextChannelIndex; private int firmwareBlockSize; @@ -152,6 +151,9 @@ namespace ChanSort.Loader.LG #if STORE_DVBS_CHANNELS_IN_DATABASE this.StoreToDatabase(); #endif + + foreach (var list in this.DataRoot.ChannelLists) + list.MaxChannelNameLength = 40; } #endregion @@ -305,18 +307,19 @@ namespace ChanSort.Loader.LG long blockId = BitConverter.ToInt64(fileContent, off + 8); if (blockId == DVBS_S2) return true; -#if LM640T_EXPERIMENT + + // LW4500, LW5400, LMxxxT and maybe other models with bogus DVB-S block if (blockId == -1) { this.satConfig = satConfigs.TryGet(blockSize); if (this.satConfig != null) { - this.EraseDvbsBlock(off); - - return true; + this.dvbsBlockSize = blockSize; + this.dvbsBlockOffset = off; + off += 4 + blockSize; } } -#endif + return false; } #endregion @@ -583,7 +586,7 @@ namespace ChanSort.Loader.LG #region CleanUpChannelData() public override string CleanUpChannelData() { - if (this.satConfig == null) + if (this.satConfig == null || this.dvbsSubblockCrcOffset == null) return ""; this.DataRoot.NeedsSaving = true; @@ -763,7 +766,7 @@ namespace ChanSort.Loader.LG if (this.reorderPhysically || removeDeletedActChannels) this.ReorderActChannelsPhysically(); - if (satConfig != null) + if (this.dvbsSubblockCrcOffset != null) this.UpdateDvbsChecksums(); using (var file = new BinaryWriter(new FileStream(tvOutputFile, FileMode.Create, FileAccess.Write))) @@ -1007,9 +1010,10 @@ namespace ChanSort.Loader.LG internal bool IsTesting { get; set; } internal int ACTChannelLength { get { return this.actChannelSize; } } - internal bool HasDvbs { get { return dvbsBlockOffset != 0; } } + internal bool HasDvbs { get { return satConfig != null; } } internal int SatChannelLength { get { return satConfig != null ? satConfig.dvbsChannelLength : 0; } } internal decimal DvbsSymbolRateCorrectionFactor { get { return this.dvbsSymbolRateFactor; } } internal int FirmwareBlockSize { get { return this.firmwareBlockSize; } } + internal bool HasPresetDvbsChannelNumbers { get { return this.presetChannels > 0; } } } } diff --git a/ChanSort.Loader.Samsung/AnalogChannel.cs b/ChanSort.Loader.Samsung/AnalogChannel.cs index fba2fce..2e4200f 100644 --- a/ChanSort.Loader.Samsung/AnalogChannel.cs +++ b/ChanSort.Loader.Samsung/AnalogChannel.cs @@ -24,7 +24,6 @@ namespace ChanSort.Loader.Samsung } #endregion - } } diff --git a/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini b/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini index b0f1af6..5398586 100644 --- a/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini +++ b/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini @@ -63,7 +63,7 @@ offProgramNr = 4 offNameLength = offName = 12 - lenName = 12 + lenName = 10 offFavorites = 26 offChecksum = 27 @@ -81,7 +81,7 @@ offSlotNr = 16 offNameLength = 18 offName = 20 - lenName = 12 + lenName = 10 offFrequency = 32 offFavorites = 38 offChecksum = 39 @@ -100,7 +100,7 @@ offSlotNr = 16 offNameLength = 18 offName = 20 - lenName = 12 + lenName = 10 offFrequency = 32 offFavorites = 36,40,44,48,52 offChecksum = 63 diff --git a/ChanSort.Loader.Samsung/ScmChannelBase.cs b/ChanSort.Loader.Samsung/ScmChannelBase.cs index 8eb1736..e94a765 100644 --- a/ChanSort.Loader.Samsung/ScmChannelBase.cs +++ b/ChanSort.Loader.Samsung/ScmChannelBase.cs @@ -108,8 +108,8 @@ namespace ChanSort.Loader.Samsung mapping.SetWord(_ProgramNr, this.NewProgramNr); if (this.IsNameModified) { - mapping.SetString(_Name, this.Name, mapping.Settings.GetInt("lenName")); - mapping.SetByte(_NameLength, this.Name.Length * 2); + int bytes = mapping.SetString(_Name, this.Name, mapping.Settings.GetInt("lenName")); + mapping.SetByte(_NameLength, bytes); this.IsNameModified = false; } this.UpdateRawFavorites(); diff --git a/ChanSort.Loader.Samsung/ScmSerializer.cs b/ChanSort.Loader.Samsung/ScmSerializer.cs index bacec5a..85ae7e9 100644 --- a/ChanSort.Loader.Samsung/ScmSerializer.cs +++ b/ChanSort.Loader.Samsung/ScmSerializer.cs @@ -19,12 +19,13 @@ namespace ChanSort.Loader.Samsung private readonly MappingPool ptccableMappings = new MappingPool("PTC"); private readonly MappingPool transponderMappings = new MappingPool("TransponderDataBase"); - private readonly ChannelList avbtChannels = new ChannelList(SignalSource.AnalogT|SignalSource.TvAndRadio, "analog Air"); - private readonly ChannelList avbcChannels = new ChannelList(SignalSource.AnalogC|SignalSource.TvAndRadio, "analog Cable"); - private readonly ChannelList dvbtChannels = new ChannelList(SignalSource.DvbT | SignalSource.Tv, "digital Air"); - private readonly ChannelList dvbcChannels = new ChannelList(SignalSource.DvbC | SignalSource.TvAndRadio, "digital Cable"); + private readonly ChannelList avbtChannels = new ChannelList(SignalSource.AnalogT|SignalSource.TvAndRadio, "Analog Air"); + private readonly ChannelList avbcChannels = new ChannelList(SignalSource.AnalogC|SignalSource.TvAndRadio, "Analog Cable"); + private readonly ChannelList dvbtChannels = new ChannelList(SignalSource.DvbT | SignalSource.Tv, "Digital Air"); + private readonly ChannelList dvbcChannels = new ChannelList(SignalSource.DvbC | SignalSource.TvAndRadio, "Digital Cable"); private readonly ChannelList dvbsChannels = new ChannelList(SignalSource.DvbS | SignalSource.TvAndRadio, "Satellite"); private readonly ChannelList hdplusChannels = new ChannelList(SignalSource.HdPlusD | SignalSource.TvAndRadio, "Astra HD+"); + private readonly ChannelList primeChannels = new ChannelList(SignalSource.CablePrimeD | SignalSource.TvAndRadio, "Cable Prime"); private readonly Dictionary avbtFrequency = new Dictionary(); private readonly Dictionary avbcFrequency = new Dictionary(); @@ -37,6 +38,7 @@ namespace ChanSort.Loader.Samsung private byte[] dvbcFileContent; private byte[] dvbsFileContent; private byte[] hdplusFileContent; + private byte[] primeFileContent; private ModelConstants c; #region ctor() @@ -98,6 +100,7 @@ namespace ChanSort.Loader.Samsung ReadDvbctChannels(zip, "map-AirD", this.dvbtChannels, out this.dvbtFileContent, this.dvbtFrequency); ReadDvbTransponderFrequenciesFromPtc(zip, "PTCCABLE", this.dvbcFrequency); ReadDvbctChannels(zip, "map-CableD", this.dvbcChannels, out this.dvbcFileContent, this.dvbcFrequency); + ReadDvbctChannels(zip, "map-CablePrime_D", this.primeChannels, out this.primeFileContent, this.dvbcFrequency); ReadSatellites(zip); ReadTransponder(zip, "TransponderDataBase.dat"); ReadTransponder(zip, "UserTransponderDataBase.dat"); @@ -162,7 +165,8 @@ namespace ChanSort.Loader.Samsung DetectModelFromAirAOrCableA(zip), DetectModelFromAirDOrCableD(zip), DetectModelFromSateD(zip), - DetectModelFromTranspoderDatabase(zip) + DetectModelFromTranspoderDatabase(zip), + DetectModelFromAstraHdPlusD(zip) }; // note: E and F series use an identical format, so we only care about E here @@ -210,7 +214,7 @@ namespace ChanSort.Loader.Samsung #region DetectModelFromAirDOrCableD() private string DetectModelFromAirDOrCableD(ZipFile zip) { - var entry = zip.GetEntry("map-AirD") ?? zip.GetEntry("map-CableD"); + var entry = zip.GetEntry("map-AirD") ?? zip.GetEntry("map-CableD") ?? zip.GetEntry("map-CablePrime_D"); if (entry == null) return null; @@ -260,6 +264,21 @@ namespace ChanSort.Loader.Samsung } #endregion + #region DetectModelFromAstraHdPlusD() + private string DetectModelFromAstraHdPlusD(ZipFile zip) + { + var entry = zip.GetEntry("map-AstraHDPlusD"); + if (entry == null) + return null; + + var size = entry.Size; + string candidates = null; + if (size % 212 == 0) + candidates += "DE"; + return candidates; + } + #endregion + #region ReadAnalogFineTuning() private void ReadAnalogFineTuning(ZipFile zip) @@ -301,6 +320,7 @@ namespace ChanSort.Loader.Samsung this.DataRoot.AddChannelList(list); var rawChannel = analogMappings.GetMapping(entrySize); + list.MaxChannelNameLength = rawChannel.Settings.GetInt("lenName")/2; rawChannel.SetDataPtr(data, 0); int count = data.Length / entrySize; @@ -360,6 +380,7 @@ namespace ChanSort.Loader.Samsung bool isCable = (list.SignalSource & SignalSource.Cable) != 0; this.DataRoot.AddChannelList(list); DataMapping rawChannel = dvbctMappings.GetMapping(entrySize); + list.MaxChannelNameLength = rawChannel.Settings.GetInt("lenName") / 2; rawChannel.SetDataPtr(data, 0); int count = data.Length / entrySize; for (int slotIndex = 0; slotIndex < count; slotIndex++) @@ -447,6 +468,7 @@ namespace ChanSort.Loader.Samsung int entrySize = c.dvbsChannelLength; int count = this.dvbsFileContent.Length/entrySize; DataMapping mapping = dvbsMappings.GetMapping(entrySize); + this.dvbsChannels.MaxChannelNameLength = mapping.Settings.GetInt("lenName") / 2; mapping.SetDataPtr(dvbsFileContent, 0); for (int slotIndex = 0; slotIndex < count; slotIndex++) { diff --git a/ChanSort/MainForm.Designer.cs b/ChanSort/MainForm.Designer.cs index e7d410a..5d326a2 100644 --- a/ChanSort/MainForm.Designer.cs +++ b/ChanSort/MainForm.Designer.cs @@ -257,6 +257,7 @@ this.gviewLeft.PopupMenuShowing += new DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventHandler(this.gviewLeft_PopupMenuShowing); this.gviewLeft.SelectionChanged += new DevExpress.Data.SelectionChangedEventHandler(this.gviewLeft_SelectionChanged); this.gviewLeft.ShowingEditor += new System.ComponentModel.CancelEventHandler(this.gview_ShowingEditor); + this.gviewLeft.ShownEditor += new System.EventHandler(this.gview_ShownEditor); this.gviewLeft.FocusedRowChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventHandler(this.gviewLeft_FocusedRowChanged); this.gviewLeft.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(this.gviewLeft_CellValueChanged); this.gviewLeft.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(this.gviewLeft_CustomColumnDisplayText); @@ -508,6 +509,7 @@ this.gviewRight.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(this.gviewRight_RowCellStyle); this.gviewRight.PopupMenuShowing += new DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventHandler(this.gviewRight_PopupMenuShowing); this.gviewRight.ShowingEditor += new System.ComponentModel.CancelEventHandler(this.gview_ShowingEditor); + this.gviewRight.ShownEditor += new System.EventHandler(this.gview_ShownEditor); this.gviewRight.FocusedRowChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventHandler(this.gviewRight_FocusedRowChanged); this.gviewRight.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(this.gviewRight_CellValueChanged); this.gviewRight.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(this.gviewRight_CustomColumnDisplayText); diff --git a/ChanSort/MainForm.cs b/ChanSort/MainForm.cs index 6712927..6729726 100644 --- a/ChanSort/MainForm.cs +++ b/ChanSort/MainForm.cs @@ -24,7 +24,7 @@ namespace ChanSort.Ui { public partial class MainForm : XtraForm { - public const string AppVersion = "v2013-05-16"; + public const string AppVersion = "v2013-05-29"; private const int MaxMruEntries = 5; @@ -263,12 +263,15 @@ namespace ChanSort.Ui firstNonEmpty = tab; } - if (firstNonEmpty == null) - firstNonEmpty = tabChannelList.TabPages[0]; - if (firstNonEmpty == this.tabChannelList.SelectedTabPage) - this.ShowChannelList((ChannelList)firstNonEmpty.Tag); - else - this.tabChannelList.SelectedTabPage = firstNonEmpty; + if (tabChannelList.TabPages.Count > 0) + { + if (firstNonEmpty == null) + firstNonEmpty = tabChannelList.TabPages[0]; + if (firstNonEmpty == this.tabChannelList.SelectedTabPage) + this.ShowChannelList((ChannelList)firstNonEmpty.Tag); + else + this.tabChannelList.SelectedTabPage = firstNonEmpty; + } } #endregion @@ -2116,5 +2119,13 @@ namespace ChanSort.Ui } #endregion + private void gview_ShownEditor(object sender, EventArgs e) + { + GridView view = (GridView) sender; + TextEdit edit = view.ActiveEditor as TextEdit; + if (edit == null) return; + edit.Properties.MaxLength = view.FocusedColumn.FieldName == "Name" ? this.currentChannelList.MaxChannelNameLength : 0; + } + } } diff --git a/ChanSort/MainForm.resx b/ChanSort/MainForm.resx index 47bdb76..cdae680 100644 --- a/ChanSort/MainForm.resx +++ b/ChanSort/MainForm.resx @@ -1404,7 +1404,7 @@ DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - 05/11/2013 13:20:06 + 05/26/2013 22:01:32 16, 16 diff --git a/Test.Loader.LG/LM/TestLM.cs b/Test.Loader.LG/LM/TestLM.cs index 17961b1..fa219e6 100644 --- a/Test.Loader.LG/LM/TestLM.cs +++ b/Test.Loader.LG/LM/TestLM.cs @@ -17,6 +17,7 @@ namespace Test.Loader.LG public void TestLM611S_T188_Sat68TR() { // "wagnale" + //this.GenerateTestFiles("LM/xxLM611S-ZA00001"); this.ExecuteTest("LM/xxLM611S-ZA00001"); } diff --git a/Test.Loader.LG/LM/xxLM611S-ZA00001.TLL.out b/Test.Loader.LG/LM/xxLM611S-ZA00001.TLL.out index b385a85..d6ab4d5 100644 Binary files a/Test.Loader.LG/LM/xxLM611S-ZA00001.TLL.out and b/Test.Loader.LG/LM/xxLM611S-ZA00001.TLL.out differ diff --git a/Test.Loader.LG/LN/TestLN.cs b/Test.Loader.LG/LN/TestLN.cs index f056a54..9a0a27a 100644 --- a/Test.Loader.LG/LN/TestLN.cs +++ b/Test.Loader.LG/LN/TestLN.cs @@ -6,7 +6,7 @@ namespace Test.Loader.LG public class TestLN : TestBase { [TestMethod] - public void TestLX9500_T224T_Sat76TR() + public void TestLN5406_T224T_Sat76TR() { // "ThomasOhmes" //this.GenerateTestFiles("LN/xxLN5406-ZA99999"); diff --git a/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out b/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out index d235a69..ceb612d 100644 Binary files a/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out and b/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out differ diff --git a/Test.Loader.LG/LS/xxLS560S-ZC00010.TLL.out b/Test.Loader.LG/LS/xxLS560S-ZC00010.TLL.out index 61ec6ea..368782d 100644 Binary files a/Test.Loader.LG/LS/xxLS560S-ZC00010.TLL.out and b/Test.Loader.LG/LS/xxLS560S-ZC00010.TLL.out differ diff --git a/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out b/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out index 7e42491..113b81c 100644 Binary files a/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out and b/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out differ diff --git a/Test.Loader.LG/PM/xxPM970S-ZA99999.TLL.out b/Test.Loader.LG/PM/xxPM970S-ZA99999.TLL.out index 5b4f287..fb3596b 100644 Binary files a/Test.Loader.LG/PM/xxPM970S-ZA99999.TLL.out and b/Test.Loader.LG/PM/xxPM970S-ZA99999.TLL.out differ diff --git a/Test.Loader/LgTest.cs b/Test.Loader/LgTest.cs index 2ba2e7a..0079f5c 100644 --- a/Test.Loader/LgTest.cs +++ b/Test.Loader/LgTest.cs @@ -41,12 +41,16 @@ namespace Test.Loader var analogList = serializer.DataRoot.GetChannelList(ChanSort.Api.SignalSource.AnalogCT | ChanSort.Api.SignalSource.Tv); var digitalList = serializer.DataRoot.GetChannelList(ChanSort.Api.SignalSource.DvbCT | ChanSort.Api.SignalSource.Tv); var satChannelList = serializer.DataRoot.GetChannelList(ChanSort.Api.SignalSource.DvbS | ChanSort.Api.SignalSource.Tv); - string key = model + + string key = fileName + + model + "\t" + serializer.ACTChannelLength+ "\t" + (analogList != null && analogList.Count > 0) + "\t" + (digitalList != null && digitalList.Count > 0) + "\t" + serializer.SatChannelLength + - "\t" + (satChannelList != null && satChannelList.Count > 0); + "\t" + (satChannelList != null && satChannelList.Count > 0) + + "\t" + serializer.HasPresetDvbsChannelNumbers + + "\t" + serializer.TvCountryCode; + string relPath = Path.GetFileName(Path.GetDirectoryName(file))+"\\"+fileName; models[key] = model + "\t" + serializer.ACTChannelLength + @@ -54,6 +58,8 @@ namespace Test.Loader "\t" + (analogList == null ? 0 : analogList.Count) + "\t" + (digitalList == null ? 0 : digitalList.Count) + "\t" + (satChannelList == null ? 0 : satChannelList.Count) + + "\t" + serializer.HasPresetDvbsChannelNumbers + + "\t" + serializer.TvCountryCode + "\t" + serializer.DvbsSymbolRateCorrectionFactor + "\t" + relPath; diff --git a/makeDistribZip.cmd b/makeDistribZip.cmd index 16b21af..59bab7d 100644 --- a/makeDistribZip.cmd +++ b/makeDistribZip.cmd @@ -8,6 +8,7 @@ copy debug\ChanSort.*.dll "%target%" copy debug\ChanSort.*.ini "%target%" copy debug\Lookup.csv "%target%" copy DLL\* "%target%" +del "%target%\*nunit*.dll" mkdir "%target%\de" 2>nul xcopy /siy debug\de "%target%\de" copy readme.txt "%target%" diff --git a/readme.txt b/readme.txt index 1a51b95..745a537 100644 --- a/readme.txt +++ b/readme.txt @@ -1,9 +1,13 @@ -Version v2013-05-16 ====================================================== +Version v2013-05-29 ====================================================== Changes: -- FIX: on LG's LA and LN models the DVB-S symbol rate got corrupted -- disabled editing of LG channel lists whith preset program numbers -- last file is no longer loaded automatically when starting ChanSort +- Added support for Samsung "CablePrime" channel lists +- FIX: error when loading a Samsung files which only contains an + AstraHDPlus channel list. +- Channel name editor now limits the input to the maximum number of + characters allowed by the file format (e.g. 5 chars for Samsung analog + channel names) + The complete change log can be found at the end of this document @@ -33,7 +37,7 @@ Samsung ------- Series: B*, C, D, E, F Lists: Air analog, Air digital, Cable analog, Cable digital, - Sat digital, Astra HD+ + Cable prime, Sat digital, Astra HD+, * NOTE: the "Air Analog"-List of the B-Series doesn't support all editing features due to a lack of test files. If you have such a file, @@ -101,6 +105,14 @@ OTHER DEALINGS IN THE SOFTWARE. Change log ================================================================ +2013-05-29 +- Added support for Samsung "CablePrime" channel lists +- FIX: error when loading a Samsung files which only contains an + AstraHDPlus channel list. +- Channel name editor now limits the input to the maximum number of + characters allowed by the file format (e.g. 5 chars for Samsung analog + channel names) + 2013-05-16 - FIX: on LG's LA and LN models the DVB-S symbol rate got corrupted - disabled editing of LG channel lists whith preset program numbers