//public int PlasmaScale = 100; /// <summary> /// Parses the setting data. <br /> /// </summary> /// <param name="SettingData">The setting data.</param> /// <exception cref="System.Exception"> /// No data to parse. /// or /// Cant parse the part {0} of the ledcontrol table config setting {1}.. /// </exception> public void ParseSettingData(string SettingData) { string S = SettingData.Trim().ToUpper(); if (S.StartsWith("(")) { //It is a condition int BracketCnt = 1; int ClosingBracketPos = -1; for (int i = 1; i < S.Length; i++) { if (S[i] == '(') { BracketCnt++; } else if (S[i] == ')') { BracketCnt--; } if (BracketCnt == 0) { ClosingBracketPos = i; break; } } if (ClosingBracketPos > 0) { Condition = S.Substring(0, ClosingBracketPos + 1); OutputControl = OutputControlEnum.Condition; S = S.Substring(Condition.Length).Trim(); //TODO: Maybe add a check for the condition validity } else { Log.Warning("No closing bracket found for condition in setting {0}.".Build(S)); throw new Exception("No closing bracket found for condition in setting {0}.".Build(S)); } } else { //not a condition if (S.Length == 0) { Log.Warning("No data to parse."); throw new Exception("No data to parse."); } int TriggerEndPos = -1; char LastChar = (char)0; for (int i = 0; i < S.Length - 1; i++) { if (S[i] == ' ' && LastChar != '|' && LastChar != (char)0) { TriggerEndPos = i; break; } if (S[i] != ' ') { LastChar = S[i]; } } if (TriggerEndPos == -1) { TriggerEndPos = S.Length; } string Trigger = S.Substring(0, TriggerEndPos).Trim(); //Get output state and table element (if applicable) bool ParseOK = true; switch (Trigger.ToUpper()) { case "ON": case "1": OutputControl = OutputControlEnum.FixedOn; break; case "OFF": case "0": OutputControl = OutputControlEnum.FixedOff; break; case "B": case "BLINK": OutputControl = OutputControlEnum.FixedOn; Blink = -1; BlinkIntervalMs = 1000; break; default: string[] ATE = Trigger.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(Tr => Tr.Trim()).ToArray(); foreach (string E in ATE) { if (E.Length > 1) { if (E[0] == (char)TableElementTypeEnum.NamedElement && E.Substring(1).All(C => char.IsLetterOrDigit(C) || C == '_')) { //Named element } else if (Enum.IsDefined(typeof(TableElementTypeEnum), (int)E[0]) && E.Substring(1).IsInteger()) { //Normal table element } else { Log.Write("Failed: " + E); ParseOK = false; break; } } else { ParseOK = false; break; } } if (ParseOK) { OutputControl = OutputControlEnum.Controlled; TableElement = Trigger; } break; } if (!ParseOK) { Log.Warning("Cant parse the trigger part {0} of the ledcontrol table config setting {1}.".Build(Trigger, SettingData)); throw new Exception("Cant parse the part {0} of the ledcontrol table config setting {1}.".Build(Trigger, SettingData)); } //Remove first part S = S.Substring(Trigger.Length).Trim(); } string[] Parts = S.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); int IntegerCnt = 0; int PartNr = 0; while (Parts.Length > PartNr) { if (Parts[PartNr].ToUpper() == "BLINK") { Blink = -1; BlinkIntervalMs = 1000; } else if (Parts[PartNr].ToUpper() == "INVERT") { Invert = true; } else if (Parts[PartNr].ToUpper() == "NOBOOL") { NoBool = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "APS" && Parts[PartNr].Substring(3).IsInteger()) { PlasmaSpeed = Parts[PartNr].Substring(3).ToInteger(); IsPlasma = true; IsArea = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "APD" && Parts[PartNr].Substring(3).IsInteger()) { PlasmaDensity = Parts[PartNr].Substring(3).ToInteger(); IsPlasma = true; IsArea = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "APC") { ColorName2 = Parts[PartNr].Substring(3); IsPlasma = true; IsArea = true; } //else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "APC" && Parts[PartNr].Substring(3).IsInteger()) //{ // PlasmaScale = Parts[PartNr].Substring(3).ToInteger(); // IsPlasma = true; // IsArea = true; //} else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "SHP") { ShapeName = Parts[PartNr].Substring(3).Trim(); IsArea = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "ABT" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapTop = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "ABL" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapLeft = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "ABW" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapWidth = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "ABH" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapHeight = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "ABF" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapFrame = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "AAS" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapAnimationStepSize = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "AAC" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapAnimationStepCount = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "AAF" && Parts[PartNr].Substring(3).IsInteger()) { AreaBitmapAnimationFrameDuration = 1000 / Parts[PartNr].Substring(3).ToInteger().Limit(10, int.MaxValue); IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length == 4 && Parts[PartNr].Substring(0, 3).ToUpper() == "AAD" && Enum.IsDefined(typeof(MatrixAnimationStepDirectionEnum), (int)Parts[PartNr].Substring(3, 1).ToUpper()[0])) { AreaBitmapAnimationDirection = (MatrixAnimationStepDirectionEnum)Parts[PartNr].Substring(3, 1).ToUpper()[0]; IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length == 4 && Parts[PartNr].Substring(0, 3).ToUpper() == "AAB" && Enum.IsDefined(typeof(AnimationBehaviourEnum), (int)Parts[PartNr].Substring(3, 1).ToUpper()[0])) { AreaBitmapAnimationBehaviour = (AnimationBehaviourEnum)Parts[PartNr].Substring(3, 1).ToUpper()[0]; IsArea = true; IsBitmap = true; } else if (Parts[PartNr].Length > 5 && Parts[PartNr].Substring(0, 5).ToUpper() == "AFDEN" && Parts[PartNr].Substring(5).IsInteger()) { AreaFlickerDensity = Parts[PartNr].Substring(5).ToInteger(); IsArea = true; } else if (Parts[PartNr].Length > 5 && Parts[PartNr].Substring(0, 5).ToUpper() == "AFMIN" && Parts[PartNr].Substring(5).IsInteger()) { AreaFlickerMinDurationMs = Parts[PartNr].Substring(5).ToInteger(); IsArea = true; } else if (Parts[PartNr].Length > 5 && Parts[PartNr].Substring(0, 5).ToUpper() == "AFMAX" && Parts[PartNr].Substring(5).IsInteger()) { AreaFlickerMaxDurationMs = Parts[PartNr].Substring(5).ToInteger(); IsArea = true; } else if (Parts[PartNr].Length > 6 && Parts[PartNr].Substring(0, 6).ToUpper() == "AFFADE" && Parts[PartNr].Substring(6).IsInteger()) { AreaFlickerFadeDurationMs = Parts[PartNr].Substring(6).ToInteger(); IsArea = true; } else if (Parts[PartNr].Length > 2 && Parts[PartNr].Substring(0, 2).ToUpper() == "AT" && Parts[PartNr].Substring(2).IsInteger()) { AreaTop = Parts[PartNr].Substring(2).ToInteger().Limit(0, 100); IsArea = true; } else if (Parts[PartNr].Length > 2 && Parts[PartNr].Substring(0, 2).ToUpper() == "AL" && Parts[PartNr].Substring(2).IsInteger()) { AreaLeft = Parts[PartNr].Substring(2).ToInteger().Limit(0, 100); IsArea = true; } else if (Parts[PartNr].Length > 2 && Parts[PartNr].Substring(0, 2).ToUpper() == "AW" && Parts[PartNr].Substring(2).IsInteger()) { AreaWidth = Parts[PartNr].Substring(2).ToInteger().Limit(0, 100); IsArea = true; } else if (Parts[PartNr].Length > 2 && Parts[PartNr].Substring(0, 2).ToUpper() == "AH" && Parts[PartNr].Substring(2).IsInteger()) { AreaHeight = Parts[PartNr].Substring(2).ToInteger().Limit(0, 100); IsArea = true; } //TODO: Remove parameter AA else if (Parts[PartNr].Length > 2 && Parts[PartNr].Substring(0, 2).ToUpper() == "AA" && Parts[PartNr].Substring(2).IsInteger()) { AreaAcceleration = Parts[PartNr].Substring(2).ToInteger(); IsArea = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "ASA" && Parts[PartNr].Substring(3).IsInteger()) { AreaAcceleration = Parts[PartNr].Substring(3).ToInteger(); IsArea = true; } //TODO:Remove AS para else if (Parts[PartNr].Length > 2 && Parts[PartNr].Substring(0, 2).ToUpper() == "AS" && Parts[PartNr].Substring(2).IsInteger()) { AreaSpeed = Parts[PartNr].Substring(2).ToInteger().Limit(1, 10000); IsArea = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].Substring(0, 3).ToUpper() == "ASS" && Parts[PartNr].Substring(3).IsInteger()) { AreaSpeed = Parts[PartNr].Substring(3).ToInteger().Limit(1, 10000); IsArea = true; } else if (Parts[PartNr].Length > 5 && Parts[PartNr].Substring(0, 3).ToUpper() == "ASS" && Parts[PartNr].ToUpper().Right(2) == "MS" && Parts[PartNr].Substring(3, Parts[PartNr].Length - 5).IsInteger()) { AreaSpeed = (int)((double)100000 / Parts[PartNr].Substring(3, Parts[PartNr].Length - 5).ToInteger()).Limit(10, 100000); IsArea = true; } //TODO:Remove AD para else if (Parts[PartNr].Length == 3 && Parts[PartNr].Substring(0, 2).ToUpper() == "AD" && Enum.IsDefined(typeof(MatrixShiftDirectionEnum), (int)Parts[PartNr].Substring(2, 1).ToUpper()[0])) { AreaDirection = (MatrixShiftDirectionEnum)Parts[PartNr].Substring(2, 1).ToUpper()[0]; IsArea = true; } else if (Parts[PartNr].Length == 4 && Parts[PartNr].Substring(0, 3).ToUpper() == "ASD" && Enum.IsDefined(typeof(MatrixShiftDirectionEnum), (int)Parts[PartNr].Substring(3, 1).ToUpper()[0])) { AreaDirection = (MatrixShiftDirectionEnum)Parts[PartNr].Substring(3, 1).ToUpper()[0]; IsArea = true; } else if (Parts[PartNr].Length > 3 && Parts[PartNr].ToUpper().Substring(0, 3) == "MAX" && Parts[PartNr].Substring(3).IsInteger()) { MaxDurationMs = Parts[PartNr].Substring(3).ToInteger().Limit(0, int.MaxValue); } else if (Parts[PartNr].Length > 3 && Parts[PartNr].ToUpper().Substring(0, 3) == "BNP" && Parts[PartNr].Substring(3).IsInteger()) { BlinkIntervalMsNested = Parts[PartNr].Substring(3).ToInteger().Limit(0, int.MaxValue); } else if (Parts[PartNr].Length > 4 && Parts[PartNr].ToUpper().Substring(0, 4) == "BNPW" && Parts[PartNr].Substring(4).IsInteger()) { BlinkPulseWidthNested = Parts[PartNr].Substring(4).ToInteger().Limit(1, 99); } else if (Parts[PartNr].Length > 3 && Parts[PartNr].ToUpper().Substring(0, 3) == "BPW" && Parts[PartNr].Substring(3).IsInteger()) { BlinkPulseWidth = Parts[PartNr].Substring(3).ToInteger().Limit(1, 99); } else if (Parts[PartNr].Length > 3 && Parts[PartNr].ToUpper().Substring(0, 3) == "BL#" && Parts[PartNr].Substring(3).IsHexString()) { BlinkLow = Parts[PartNr].Substring(3).HexToInt().Limit(0, 255); } else if (Parts[PartNr].Length > 1 && Parts[PartNr].ToUpper().Substring(0, 1) == "BL" && Parts[PartNr].Substring(1).IsInteger()) { BlinkLow = (int)(((double)Parts[PartNr].Substring(2).ToInteger().Limit(0, 48)) * 5.3125); } else if (Parts[PartNr].Length > 1 && Parts[PartNr].ToUpper().Substring(0, 1) == "E" && Parts[PartNr].Substring(1).IsInteger()) { ExtDurationMs = Parts[PartNr].Substring(1).ToInteger().Limit(0, int.MaxValue); } else if (Parts[PartNr].Length > 2 && Parts[PartNr].ToUpper().Substring(0, 2) == "I#" && Parts[PartNr].Substring(2).IsHexString()) { //Intensity setting Intensity = Parts[PartNr].Substring(2).HexToInt().Limit(0, 255); } else if (Parts[PartNr].Length > 1 && Parts[PartNr].ToUpper().Substring(0, 1) == "I" && Parts[PartNr].Substring(1).IsInteger()) { //Intensity setting Intensity = (int)(((double)Parts[PartNr].Substring(1).ToInteger().Limit(0, 48)) * 5.3125); } else if (Parts[PartNr].Length > 1 && Parts[PartNr].ToUpper().Substring(0, 1) == "L" && Parts[PartNr].Substring(1).IsInteger()) { //Layer setting Layer = Parts[PartNr].Substring(1).ToInteger(); } else if (Parts[PartNr].Length > 1 && Parts[PartNr].ToUpper().Substring(0, 1) == "W" && Parts[PartNr].Substring(1).IsInteger()) { //WaitDuration setting WaitDurationMs = Parts[PartNr].Substring(1).ToInteger().Limit(0, int.MaxValue); } else if (Parts[PartNr].Length > 1 && Parts[PartNr].ToUpper().Substring(0, 1) == "M" && Parts[PartNr].Substring(1).IsInteger()) { //MinimumDuration setting MinDurationMs = Parts[PartNr].Substring(1).ToInteger().Limit(0, int.MaxValue); } else if (Parts[PartNr].Length > 1 && Parts[PartNr].ToUpper().Substring(0, 1) == "F" && Parts[PartNr].Substring(1).IsInteger()) { //Dimming duration for up and down FadingUpDurationMs = Parts[PartNr].Substring(1).ToInteger().Limit(0, int.MaxValue); FadingDownDurationMs = FadingUpDurationMs; } else if (Parts[PartNr].Length > 2 && Parts[PartNr].ToUpper().Substring(0, 2) == "FU" && Parts[PartNr].Substring(2).IsInteger()) { //Dimming up duration FadingUpDurationMs = Parts[PartNr].Substring(2).ToInteger().Limit(0, int.MaxValue); } else if (Parts[PartNr].Length > 2 && Parts[PartNr].ToUpper().Substring(0, 2) == "FD" && Parts[PartNr].Substring(2).IsInteger()) { //Dimming down duration FadingDownDurationMs = Parts[PartNr].Substring(2).ToInteger().Limit(0, int.MaxValue); } else if (Parts[PartNr].IsInteger()) { switch (IntegerCnt) { case 0: if (Blink == -1) { //Its a blink interval BlinkIntervalMs = (Parts[PartNr].ToInteger()).Limit(1, int.MaxValue); DurationMs = 0; } else { //Its a duration DurationMs = Parts[PartNr].ToInteger().Limit(1, int.MaxValue); } break; case 1: if (Blink != -1) { Blink = Parts[PartNr].ToInteger().Limit(1, int.MaxValue); if (DurationMs > 0 & Blink >= 1) { BlinkIntervalMs = (DurationMs / Blink).Limit(1, int.MaxValue); DurationMs = 0; } } break; default: Log.Warning("The ledcontrol table config setting {0} contains more than 2 numeric values without a type definition.".Build(SettingData)); throw new Exception("The ledcontrol table config setting {0} contains more than 2 numeric values without a type definition.".Build(SettingData)); } IntegerCnt++; } else if (PartNr == 0) { //This should be a color ColorName = Parts[PartNr]; } else { Log.Warning("Cant parse the part {0} of the ledcontrol table config setting {1}".Build(Parts[PartNr], SettingData)); throw new Exception("Cant parse the part {0} of the ledcontrol table config setting {1}".Build(Parts[PartNr], SettingData)); } PartNr++; } }