hot reload

This commit is contained in:
EugeneTes
2026-02-18 11:01:35 +01:00
parent 2bac7140a4
commit 14fe822962
9 changed files with 345 additions and 47 deletions

View File

@@ -1,6 +1,7 @@
using Hawkeye.VisionBuilder.Workflow.Configuration;
using Hawkeye.VisionBuilder.Workflow.Links;
using OpenCvSharp;
using Serilog;
using System.ComponentModel.Design.Serialization;
using System.Diagnostics;
using System.Drawing;
@@ -472,4 +473,77 @@ public class WorkflowList
return workflowList;
}
public void HotReloadParameters(string fileName)
{
string jsonString = File.ReadAllText(fileName);
var workflowData = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);
if (workflowData == null) return;
// Update Configuration
if (workflowData.ContainsKey("Configuration"))
{
var configElement = (JsonElement)workflowData["Configuration"];
var configData = JsonSerializer.Deserialize<Dictionary<string, object>>(configElement.GetRawText());
if (configData != null)
{
var convertedConfigData = ConvertJsonElementsToNatives(configData);
if (convertedConfigData.ContainsKey("RuntimeCameraType"))
Configuration.RuntimeCameraType = Enum.Parse<ECameraType>(convertedConfigData["RuntimeCameraType"].ToString());
if (convertedConfigData.ContainsKey("DevelopmentCameraType"))
Configuration.DevelopmentCameraType = Enum.Parse<ECameraType>(convertedConfigData["DevelopmentCameraType"].ToString());
if (convertedConfigData.ContainsKey("Outputs"))
Configuration.Outputs = Enum.Parse<EOutputs>(convertedConfigData["Outputs"].ToString());
if (convertedConfigData.ContainsKey("EmulationPath"))
Configuration.EmulationPath = convertedConfigData["EmulationPath"].ToString();
if (convertedConfigData.ContainsKey("PythonPath"))
Configuration.PythonPath = convertedConfigData["PythonPath"].ToString();
if (convertedConfigData.ContainsKey("ResultPin"))
Configuration.ResultPin = (int)convertedConfigData["ResultPin"];
if (convertedConfigData.ContainsKey("SerialPort"))
Configuration.SerialPort = convertedConfigData["SerialPort"].ToString();
if (convertedConfigData.ContainsKey("Delay"))
Configuration.Delay = (int)convertedConfigData["Delay"];
}
}
// Update operation parameters by matching Id — do NOT recreate the Operations list
if (workflowData.ContainsKey("Operations"))
{
var operationsElement = (JsonElement)workflowData["Operations"];
var operationsArray = JsonSerializer.Deserialize<List<Dictionary<string, object>>>(operationsElement.GetRawText());
if (operationsArray != null)
{
foreach (var operationData in operationsArray)
{
if (!operationData.ContainsKey("Data")) continue;
var dataElement = (JsonElement)operationData["Data"];
var operationDict = JsonSerializer.Deserialize<Dictionary<string, object>>(dataElement.GetRawText());
if (operationDict == null) continue;
var convertedDict = ConvertJsonElementsToNatives(operationDict);
if (!convertedDict.ContainsKey("Id")) continue;
var id = new Guid(convertedDict["Id"].ToString());
var existingOp = Operations.FirstOrDefault(x => x.Id == id);
if (existingOp != null)
{
existingOp.Load(convertedDict);
}
else
{
Log.Warning("HotReload: no matching operation for Id {Id}", id);
}
}
}
}
}
}