public void EvaluateProgramCondition(object evalArguments) { ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program; ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback; // bool isConditionSatisfied = false; // while (isEngineRunning && program.IsEnabled) { if (program.IsRunning || !isEngineEnabled) { Thread.Sleep(1000); continue; } // program.RoutedEventAck.WaitOne(1000); // try { isConditionSatisfied = false; // var result = program.EvaluateCondition(); if (result != null && result.Exception != null) { // runtime error occurred, script is being disabled // so user can notice and fix it List <ProgramError> error = new List <ProgramError>() { program.GetFormattedError(result.Exception, true) }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' ')); } else { isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false); } // bool lastResult = program.LastConditionEvaluationResult; program.LastConditionEvaluationResult = isConditionSatisfied; // if (program.ConditionType == ConditionType.OnSwitchTrue) { isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnSwitchFalse) { isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once) { // noop } else if (program.ConditionType == ConditionType.OnFalse) { isConditionSatisfied = !isConditionSatisfied; } } catch (Exception ex) { // a runtime error occured List <ProgramError> error = new List <ProgramError>() { program.GetFormattedError(ex, true) }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' ')); } // callback(program, isConditionSatisfied); // program.RoutedEventAck.Reset(); } }
// TODO: v1.1 !!!IMPORTANT!!! possibly move this inside ProgramEngineBase.cs class and rename to EvaluateStartupCode public void EvaluateProgramCondition(object evalArguments) { ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program; ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback; // bool isConditionSatisfied = false; // while (isEngineRunning && program.IsEnabled) { // the startup code is not evaluated while the program is running if (program.IsRunning || !isEngineEnabled) { Thread.Sleep(1000); continue; } // wait 1 second or a new event program.Engine.RoutedEventAck.WaitOne(1000); // check if the program is still allowed to run if (program.IsRunning || !program.IsEnabled) { program.Engine.RoutedEventAck.Reset(); continue; } // evaluate and get result from the code try { isConditionSatisfied = false; program.WillRun = false; // var result = program.EvaluateCondition(); if (result != null && result.Exception != null) { // runtime error occurred, script is being disabled // so user can notice and fix it List <ProgramError> error = new List <ProgramError>() { program.GetFormattedError(result.Exception, true) }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' ')); } else { isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false); } // bool lastResult = program.LastConditionEvaluationResult; program.LastConditionEvaluationResult = isConditionSatisfied; // if (program.ConditionType == ConditionType.OnSwitchTrue) { isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnSwitchFalse) { isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once) { // noop } else if (program.ConditionType == ConditionType.OnFalse) { isConditionSatisfied = !isConditionSatisfied; } } catch (Exception ex) { // a runtime error occured if (!ex.GetType().Equals(typeof(System.Reflection.TargetException))) { List <ProgramError> error = new List <ProgramError>() { program.GetFormattedError(ex, true) }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' ')); } } // callback(program, isConditionSatisfied); // program.Engine.RoutedEventAck.Reset(); } }
public void EvaluateProgramConditionAsync(ProgramBlock p, ConditionEvaluationCallback callback) { p.IsEvaluatingConditionBlock = true; Thread evaluatorthread = new Thread(new ThreadStart(delegate() { bool conditionsatisfied = false; // while (_enginerunning) { if (p.IsRunning || !p.IsEnabled || !_engineenabled) { Thread.Sleep(500); continue; } // System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); try { conditionsatisfied = false; // if (p.Type.ToLower() == "csharp") { MethodRunResult res = p.EvaluateConditionStatement(_homegenie); if (res != null && res.Exception != null) { // runtime error occurred, script is being disabled // so user can notice and fix it p.ScriptErrors = res.Exception.Message + "\n" + res.Exception.StackTrace; p.IsEnabled = false; } else { conditionsatisfied = (bool)res.ReturnValue; } } else { // it is a Wizard Script conditionsatisfied = (p.Conditions.Count > 0); for (int c = 0; c < p.Conditions.Count; c++) { bool res = _mcp_verifyCondition(p.Conditions[c]); conditionsatisfied = (conditionsatisfied && res); } } // bool lasteval = p.LastConditionEvaluationResult; p.LastConditionEvaluationResult = conditionsatisfied; // if (p.ConditionType == ConditionType.OnSwitchTrue) { conditionsatisfied = (conditionsatisfied == true && conditionsatisfied != lasteval); } else if (p.ConditionType == ConditionType.OnSwitchFalse) { conditionsatisfied = (conditionsatisfied == false && conditionsatisfied != lasteval); } else if (p.ConditionType == ConditionType.OnTrue || p.ConditionType == ConditionType.Once) { // noop } else if (p.ConditionType == ConditionType.OnFalse) { conditionsatisfied = !conditionsatisfied; } } catch (Exception ex) { // a runtime error occured p.ScriptErrors = ex.Message + "\n" + ex.StackTrace; p.IsEnabled = false; } // sw.Stop(); // callback(p, conditionsatisfied); // int delaynext = (int)(400 + (sw.ElapsedMilliseconds > 400 ? sw.ElapsedMilliseconds - 400 : 0)); if (delaynext > 500) { delaynext = 500; } // Thread.Sleep(delaynext); } p.IsEvaluatingConditionBlock = false; })); //evaluatorthread.Priority = ThreadPriority.AboveNormal; evaluatorthread.Start(); }
public void EvaluateProgramCondition(object evalArguments) { ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program; ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback; // bool isConditionSatisfied = false; // while (isEngineRunning && program.IsEnabled) { if (program.IsRunning || !isEngineEnabled) { Thread.Sleep(1000); continue; } // try { isConditionSatisfied = false; // if (program.Type.ToLower() != "wizard") { var result = program.EvaluateCondition(); if (result != null && result.Exception != null) { // runtime error occurred, script is being disabled // so user can notice and fix it List <ProgramError> error = new List <ProgramError>() { new ProgramError() { CodeBlock = "TC", Column = 0, Line = 0, ErrorNumber = "-1", ErrorMessage = result.Exception.Message } }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent( program, "Runtime.Error", "TC: " + result.Exception.Message.Replace( '\n', ' ' ) ); } else { isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false); } } else { // it is a Wizard Script isConditionSatisfied = (program.Conditions.Count > 0); for (int c = 0; c < program.Conditions.Count; c++) { bool res = VerifyProgramCondition(program.Conditions[c]); isConditionSatisfied = (isConditionSatisfied && res); } } // bool lastResult = program.LastConditionEvaluationResult; program.LastConditionEvaluationResult = isConditionSatisfied; // if (program.ConditionType == ConditionType.OnSwitchTrue) { isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnSwitchFalse) { isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once) { // noop } else if (program.ConditionType == ConditionType.OnFalse) { isConditionSatisfied = !isConditionSatisfied; } } catch (Exception ex) { // a runtime error occured List <ProgramError> error = new List <ProgramError>() { new ProgramError() { CodeBlock = "TC", Column = 0, Line = 0, ErrorNumber = "-1", ErrorMessage = ex.Message } }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent(program, "Runtime.Error", "TC: " + ex.Message.Replace('\n', ' ')); } // callback(program, isConditionSatisfied); // Thread.Sleep(500); } }
public void EvaluateProgramCondition(object evalArguments) { ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program; ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback; // bool isConditionSatisfied = false; // while (isEngineRunning && program.IsEnabled) { if (program.IsRunning || !isEngineEnabled) { Thread.Sleep(1000); continue; } // try { isConditionSatisfied = false; // if (program.Type.ToLower() != "wizard") { var result = program.EvaluateCondition(); if (result != null && result.Exception != null) { // runtime error occurred, script is being disabled // so user can notice and fix it List <ProgramError> error = new List <ProgramError>() { program.GetFormattedError(result.Exception, true) }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' ')); } else { isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false); } } else { // it is a Wizard Script isConditionSatisfied = (program.Conditions.Count > 0); for (int c = 0; c < program.Conditions.Count; c++) { // check for OR logic operator if (program.Conditions[c].ComparisonOperator == ComparisonOperator.LogicOrJoint) { if (isConditionSatisfied) { break; } else { isConditionSatisfied = (c < program.Conditions.Count - 1); continue; } } // bool res = false; try { res = VerifyProgramCondition(program.Conditions[c]); } catch { // TODO: report/handle exception } isConditionSatisfied = (isConditionSatisfied && res); } } // bool lastResult = program.LastConditionEvaluationResult; program.LastConditionEvaluationResult = isConditionSatisfied; // if (program.ConditionType == ConditionType.OnSwitchTrue) { isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnSwitchFalse) { isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult); } else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once) { // noop } else if (program.ConditionType == ConditionType.OnFalse) { isConditionSatisfied = !isConditionSatisfied; } } catch (Exception ex) { // a runtime error occured List <ProgramError> error = new List <ProgramError>() { program.GetFormattedError(ex, true) }; program.ScriptErrors = JsonConvert.SerializeObject(error); program.IsEnabled = false; RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' ')); } // callback(program, isConditionSatisfied); // Thread.Sleep(500); } }