private SynchronizeData CreateSynchronizeDataForGuidList(Dictionary <uint, string> modfiedGuidList) { Dictionary <uint, SnapshotNode> modifiedGuids = new Dictionary <uint, SnapshotNode>(); SynchronizeData syncDataReturn = new SynchronizeData(); if (modfiedGuidList != null) { //foreach (uint guid in modfiedGuidList) foreach (var kvp in modfiedGuidList) { // Get the uid recognized by the graphIDE uint guid = kvp.Key; string name = kvp.Value; SnapshotNode sNode = new SnapshotNode(this.graphCompiler.GetRealUID(guid), SnapshotNodeType.Identifier, name); if (!modifiedGuids.ContainsKey(sNode.Id)) { modifiedGuids.Add(sNode.Id, sNode); } } foreach (KeyValuePair <uint, SnapshotNode> kvp in modifiedGuids) { syncDataReturn.ModifiedNodes.Add(kvp.Value); } } return(syncDataReturn); }
internal void SynchronizeToLiveRunner(DeltaNodes deltaNodes) { if (false != deltaNodes.IsEmpty) { throw new InvalidOperationException("Nothing to send to 'lifeRunner'"); } // If there is something that we would like to query // the value for, add it into the modified node list. if (false == scheduledDeltaNodes.IsEmpty) { deltaNodes.AppendToRemovedNodes(scheduledDeltaNodes.RemovedNodes); deltaNodes.AppendToAddedNodes(scheduledDeltaNodes.AddedNodes); deltaNodes.AppendToModifiedNodes(scheduledDeltaNodes.ModifiedNodes); scheduledDeltaNodes.Reset(); } // Compact the DeltaNodes so that there is no duplicate and no node // exists in more than one list (e.g. addedNodes and modifiedNodes). deltaNodes.Compact(); SynchronizeData sd = new SynchronizeData(); if (null != deltaNodes.RemovedNodes && (deltaNodes.RemovedNodes.Count > 0)) { foreach (IVisualNode node in deltaNodes.RemovedNodes) { sd.RemovedNodes.Add(node.NodeId); } } if (null != deltaNodes.AddedNodes && (deltaNodes.AddedNodes.Count > 0)) { sd.AddedNodes = this.CreateSnapshotNodesFromVisualNodes(deltaNodes.AddedNodes); } if (null != deltaNodes.ModifiedNodes && (deltaNodes.ModifiedNodes.Count > 0)) { sd.ModifiedNodes = this.CreateSnapshotNodesFromVisualNodes(deltaNodes.ModifiedNodes); } // Tell the graph compiler that some variables are undefined. MergeUndefinedVariablesIntoData(deltaNodes.Undefinitions, sd); this.sdc.sdList.Add(sd); if (Configurations.EnableLiveExection) { try { this.CurrentSynchronizer.PushUpdate(sd); } catch (Exception e) { Debug.WriteLine(e); } } }
protected ConnectionResult WaitRecall(IList <string> deviceCodes, TimeSpan timeOut, out IList <Telemetry> telemetries) { StringBuilder devices = new StringBuilder(deviceCodes.Count); foreach (string deviceCode in deviceCodes) { devices.Append(deviceCode).Append("; "); } Logger.Debug($"Waiting Telemetry from {devices}"); var sTime = new SynchronizeData(); var sData = new SynchronizeData(); ConcurrentBag <Telemetry> concurrent = new ConcurrentBag <Telemetry>(); void TimeElapsed() { Task.Delay(timeOut).Wait(); sTime.IsEmty = false; } void OnTelemetry(object sender, Telemetry args) { if (!deviceCodes.Contains(args.DeviceCode)) { return; } concurrent.Add(args); lock (deviceCodes) { deviceCodes.Remove(args.DeviceCode); } if (deviceCodes.Count == 0) { sData.IsEmty = false; } } DbController.DataAdded += OnTelemetry; Task.Run(() => TimeElapsed()); while (sData.IsEmty && sTime.IsEmty) { } DbController.DataAdded -= OnTelemetry; telemetries = concurrent.ToArray(); if (sData.ResultInfo == SynchronizeResult.Empty) { StringBuilder devicesLost = new StringBuilder(deviceCodes.Count); foreach (string deviceCode in deviceCodes) { devicesLost.Append(deviceCode).Append("; "); } Logger.Error($"Not Found Telemetry from {devicesLost}"); return(ConnectionResult.NotFound); } Logger.Debug($"Waiting Telemetry from {devices}"); return(ConnectionResult.Successful); }
/// <summary> /// Push new synchronization data, returns immediately and will /// trigger a GraphUpdateReady when the value when the execution /// is completed /// </summary> /// <param name="syncData"></param> public void BeginUpdateGraph(SynchronizeData syncData) { lock (taskQueue) { taskQueue.Enqueue( new UpdateGraphTask(syncData, this)); } //Todo(Luke) add a Monitor queue to prevent having to have the //work poll }
public GraphUpdateReadyEventArgs(SynchronizeData syncData, EventStatus resultStatus, String errorString) { this.SyncData = syncData; this.ResultStatus = resultStatus; this.ErrorString = errorString; if (string.IsNullOrEmpty(this.ErrorString)) { this.ErrorString = ""; } Errors = new List <ErrorObject>(); Warnings = new List <ErrorObject>(); }
private void ReportRuntimeWarnings(string code, SynchronizeData syncDataReturn, Dictionary <uint, string> modifiedGuidList, ref GraphUpdateReadyEventArgs retArgs) { //GraphUpdateReadyEventArgs retArgs = null; if (runner.runnerCore.RuntimeStatus.Warnings.Count > 0) { if (retArgs == null) { retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); } foreach (var err in runner.runnerCore.RuntimeStatus.Warnings) { string msg = err.message; int lineNo = err.Line; // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } string varName = GetVarNameFromCode(lineNo, code); foreach (var kvp in modifiedGuidList) { // Get the uid recognized by the graphIDE uint guid = kvp.Key; string name = kvp.Value; if (name.Equals(varName)) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } if (retArgs.Warnings.Count == 0) { LogWarningsFromInputNodes(retArgs, varName, msg); } } } }
public void UpdateGraph(SynchronizeData syndData) { while (true) { lock (taskQueue) { //Spin waiting for the queue to be empty if (taskQueue.Count == 0) { string code = null; SynchronizeInternal(syndData, out code); return; } } Thread.Sleep(0); } }
protected ConnectionResult WaitRecall(string deviceCode, TimeSpan timeOut, out string ip) { Logger.Debug($"Waiting {CallType.Recall} from {deviceCode}"); var sTime = new SynchronizeData(); var sData = new SynchronizeData <string>(); void TimeElapsed() { Task.Delay(timeOut).Wait(); sTime.IsEmty = false; } void OnCallReady(RemoteHostInfo hostInfo, EventCallArgs args) { if (args.Message.DeviceCode != deviceCode) { return; } if (args.CallInfo.CallType != CallType.Recall) { return; } sData.IsEmty = false; sData.Data = hostInfo.Host; } Server.CallReceived += OnCallReady; Task.Run(() => TimeElapsed()); while (sData.IsEmty && sTime.IsEmty) { } Server.CallReceived -= OnCallReady; ip = sData.Data; if (sData.ResultInfo == SynchronizeResult.Empty) { Logger.Error($"Not Found {CallType.Recall} from {deviceCode}"); return(ConnectionResult.NotFound); } Logger.Debug($"Waited {CallType.Recall} from {deviceCode}"); return(ConnectionResult.Successful); }
internal void PushUpdate(SynchronizeData data) { if (null == this.runner) // Running in headless mode. { return; } if (Configurations.DumpDebugInfo) { System.Diagnostics.Debug.WriteLine("Sync: " + data); } Validity.Assert(data != null); try { runner.BeginUpdateGraph(data); } catch (Exception e) { //TODO Failsafe handler here System.Diagnostics.Debug.WriteLine("PushUpdate threw: " + e); } }
protected ConnectionResult WaitReady(string deviceCode, TimeSpan timeOut) { var sData = new SynchronizeData(); var sTime = new SynchronizeData(); void TimeElapsed() { Task.Delay(timeOut).Wait(); sTime.IsEmty = false; } void OnCallReady(RemoteHostInfo hostInfo, EventCallArgs args) { if (args.Message.DeviceCode != deviceCode) { return; } if (args.CallInfo.CallType != CallType.Ready) { return; } sData.IsEmty = false; } Server.CallReceived += OnCallReady; Task.Run(() => TimeElapsed()); while (sData.IsEmty && sTime.IsEmty) { } Server.CallReceived -= OnCallReady; if (sData.ResultInfo == SynchronizeResult.Empty) { return(ConnectionResult.NotFound); } return(ConnectionResult.Successful); }
private SynchronizeData CreateSynchronizeDataForGuidList(Dictionary<uint, string> modfiedGuidList) { Dictionary<uint, SnapshotNode> modifiedGuids = new Dictionary<uint, SnapshotNode>(); SynchronizeData syncDataReturn = new SynchronizeData(); if (modfiedGuidList != null) { //foreach (uint guid in modfiedGuidList) foreach (var kvp in modfiedGuidList) { // Get the uid recognized by the graphIDE uint guid = kvp.Key; string name = kvp.Value; SnapshotNode sNode = new SnapshotNode(this.graphCompiler.GetRealUID(guid), SnapshotNodeType.Identifier, name); if (!modifiedGuids.ContainsKey(sNode.Id)) { modifiedGuids.Add(sNode.Id, sNode); } } foreach (KeyValuePair<uint, SnapshotNode> kvp in modifiedGuids) syncDataReturn.ModifiedNodes.Add(kvp.Value); } return syncDataReturn; }
private void ReportErrors(string code, SynchronizeData syncDataReturn, Dictionary<uint, string> modifiedGuidList, ref GraphUpdateReadyEventArgs retArgs) { Dictionary<ulong, ProtoCore.Core.ErrorEntry> errorMap = runner.runnerCore.LocationErrorMap; if (errorMap.Count == 0) return; retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); foreach (var kvp in errorMap) { ProtoCore.Core.ErrorEntry err = kvp.Value; string msg = err.Message; int lineNo = err.Line; // If error is a Build error if (err.BuildId != ProtoCore.BuildData.WarningID.kDefault) { // Error comes from imported DS file if (!string.IsNullOrEmpty(err.FileName)) { msg += " At line " + err.Line + ", column " + err.Col + ", in " + Path.GetFileName(err.FileName); if (err.Type == ProtoCore.Core.ErrorType.Error) { retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); } else if (err.Type == ProtoCore.Core.ErrorType.Warning) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); } continue; } } string varName = GetVarNameFromCode(lineNo, code); // Errors if (err.Type == ProtoCore.Core.ErrorType.Error) { // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex || varName == null) { retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } foreach (var pair in runner.graphCompiler.mapModifiedName) { string name = pair.Key; if (name.Equals(varName)) { uint guid = pair.Value; retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } } else if(err.Type == ProtoCore.Core.ErrorType.Warning) // Warnings { // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex || varName == null) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } foreach (var pair in modifiedGuidList) { // Get the uid recognized by the graphIDE string name = pair.Value; if (name.Equals(varName)) { uint guid = pair.Key; retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } if (retArgs.Warnings.Count == 0) { foreach (var pair in runner.graphCompiler.mapModifiedName) { string name = pair.Key; if (name.Equals(varName)) { uint guid = pair.Value; retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } } } } }
public UpdateGraphTask(SynchronizeData syncData, LiveRunner runner) : base(runner) { this.syncData = syncData; }
public GraphUpdateReadyEventArgs(SynchronizeData syncData) : this(syncData, EventStatus.OK, null) { }
private void ReportBuildErrorsAndWarnings(string code, SynchronizeData syncDataReturn, Dictionary<uint, string> modifiedGuidList, ref GraphUpdateReadyEventArgs retArgs) { //GraphUpdateReadyEventArgs retArgs = null; if (runner.compileState.BuildStatus.ErrorCount > 0) { retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); foreach (var err in runner.compileState.BuildStatus.Errors) { string msg = err.Message; int lineNo = err.Line; // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex) { retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } string varName = GetVarNameFromCode(lineNo, code); foreach (var ssnode in syncData.AddedNodes) { if (ssnode.Content.Contains(varName)) { uint id = ssnode.Id; retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = id }); break; } } if (retArgs.Errors.Count == 0) { foreach (var ssnode in syncData.ModifiedNodes) { if (ssnode.Content.Contains(varName)) { uint id = ssnode.Id; retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = id }); break; } } } } } if (runner.compileState.BuildStatus.WarningCount > 0) { if (retArgs == null) retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); foreach (var warning in runner.compileState.BuildStatus.Warnings) { string msg = warning.msg; int lineNo = warning.line; // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } string varName = GetVarNameFromCode(lineNo, code); // This array should be empty for Build errors /*foreach (var ssnode in syncDataReturn.ModifiedNodes) { if(ssnode.Content.Contains(varName)) { uint id = ssnode.Id; retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = id }); break; } }*/ foreach (var kvp in modifiedGuidList) { // Get the uid recognized by the graphIDE uint guid = kvp.Key; string name = kvp.Value; if (name.Equals(varName)) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } if(retArgs.Warnings.Count == 0) { LogWarningsFromInputNodes(retArgs, varName, msg); } } } }
private void ReportErrors(string code, SynchronizeData syncDataReturn, Dictionary <uint, string> modifiedGuidList, ref GraphUpdateReadyEventArgs retArgs) { Dictionary <ulong, ProtoCore.Core.ErrorEntry> errorMap = runner.runnerCore.LocationErrorMap; if (errorMap.Count == 0) { return; } retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); foreach (var kvp in errorMap) { ProtoCore.Core.ErrorEntry err = kvp.Value; string msg = err.Message; int lineNo = err.Line; // If error is a Build error if (err.BuildId != ProtoCore.BuildData.WarningID.kDefault) { // Error comes from imported DS file if (!string.IsNullOrEmpty(err.FileName)) { msg += " At line " + err.Line + ", column " + err.Col + ", in " + Path.GetFileName(err.FileName); if (err.Type == ProtoCore.Core.ErrorType.Error) { retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); } else if (err.Type == ProtoCore.Core.ErrorType.Warning) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); } continue; } } string varName = GetVarNameFromCode(lineNo, code); // Errors if (err.Type == ProtoCore.Core.ErrorType.Error) { // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex || varName == null) { retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } foreach (var pair in runner.graphCompiler.mapModifiedName) { string name = pair.Key; if (name.Equals(varName)) { uint guid = pair.Value; retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } } else if (err.Type == ProtoCore.Core.ErrorType.Warning) // Warnings { // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex || varName == null) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } foreach (var pair in modifiedGuidList) { // Get the uid recognized by the graphIDE string name = pair.Value; if (name.Equals(varName)) { uint guid = pair.Key; retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } if (retArgs.Warnings.Count == 0) { foreach (var pair in runner.graphCompiler.mapModifiedName) { string name = pair.Key; if (name.Equals(varName)) { uint guid = pair.Value; retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } } } } }
private void ReportBuildErrorsAndWarnings(string code, SynchronizeData syncDataReturn, Dictionary <uint, string> modifiedGuidList, ref GraphUpdateReadyEventArgs retArgs) { //GraphUpdateReadyEventArgs retArgs = null; if (runner.compileState.BuildStatus.ErrorCount > 0) { retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); foreach (var err in runner.compileState.BuildStatus.Errors) { string msg = err.Message; int lineNo = err.Line; // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex) { retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } string varName = GetVarNameFromCode(lineNo, code); foreach (var ssnode in syncData.AddedNodes) { if (ssnode.Content.Contains(varName)) { uint id = ssnode.Id; retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = id }); break; } } if (retArgs.Errors.Count == 0) { foreach (var ssnode in syncData.ModifiedNodes) { if (ssnode.Content.Contains(varName)) { uint id = ssnode.Id; retArgs.Errors.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = id }); break; } } } } } if (runner.compileState.BuildStatus.WarningCount > 0) { if (retArgs == null) { retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); } foreach (var warning in runner.compileState.BuildStatus.Warnings) { string msg = warning.msg; int lineNo = warning.line; // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } string varName = GetVarNameFromCode(lineNo, code); // This array should be empty for Build errors /*foreach (var ssnode in syncDataReturn.ModifiedNodes) * { * if(ssnode.Content.Contains(varName)) * { * uint id = ssnode.Id; * * retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = id }); * break; * } * }*/ foreach (var kvp in modifiedGuidList) { // Get the uid recognized by the graphIDE uint guid = kvp.Key; string name = kvp.Value; if (name.Equals(varName)) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid) }); break; } } if (retArgs.Warnings.Count == 0) { LogWarningsFromInputNodes(retArgs, varName, msg); } } } }
private void ReportRuntimeWarnings(string code, SynchronizeData syncDataReturn, Dictionary<uint, string> modifiedGuidList, ref GraphUpdateReadyEventArgs retArgs) { //GraphUpdateReadyEventArgs retArgs = null; if (runner.runnerCore.RuntimeStatus.Warnings.Count > 0) { if(retArgs == null) retArgs = new GraphUpdateReadyEventArgs(syncDataReturn); foreach (var err in runner.runnerCore.RuntimeStatus.Warnings) { string msg = err.message; int lineNo = err.Line; // TODO: How can the lineNo be invalid ? if (lineNo == ProtoCore.DSASM.Constants.kInvalidIndex) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = 0 }); continue; } string varName = GetVarNameFromCode(lineNo, code); foreach (var kvp in modifiedGuidList) { // Get the uid recognized by the graphIDE uint guid = kvp.Key; string name = kvp.Value; if(name.Equals(varName)) { retArgs.Warnings.Add(new GraphUpdateReadyEventArgs.ErrorObject { Message = msg, Id = runner.graphCompiler.GetRealUID(guid)}); break; } } if (retArgs.Warnings.Count == 0) { LogWarningsFromInputNodes(retArgs, varName, msg); } } } }