using System.Text.Json;
using RobotNet.VDA5050.Type;
namespace RobotNet10.RobotApp.Navigation;
// Use aliases so Node/Edge resolve to VDA5050 (this file is in Navigation namespace which has native Node/Edge structs).
using VdaNode = RobotNet.VDA5050.Order.Node;
using VdaEdge = RobotNet.VDA5050.Order.Edge;
using VdaTrajectory = RobotNet.VDA5050.Order.Trajectory;
using VdaOrderMsg = RobotNet.VDA5050.Order.OrderMsg;
///
/// Converts VDA5050 order (Node[]/Edge[] from MQTT) to OrderData for Navigation C API (MoveToOrder).
///
public static class VDA5050ToOrderDataConverter
{
///
/// Convert VDA5050 nodes and edges (e.g. from OrderMsg received via MQTT) to OrderData for navigation.
///
public static OrderData ToOrderData(VdaNode[] nodes, VdaEdge[] edges, VdaOrderMsg? orderMsg = null)
{
var data = new OrderData
{
HeaderId = (int)(orderMsg?.HeaderId ?? 0),
Timestamp = orderMsg?.Timestamp.ToString("o") ?? DateTime.UtcNow.ToString("o"),
Version = orderMsg?.Version ?? "2.1.0",
Manufacturer = orderMsg?.Manufacturer ?? string.Empty,
SerialNumber = orderMsg?.SerialNumber ?? string.Empty,
OrderId = orderMsg?.OrderId ?? string.Empty,
OrderUpdateId = (uint)(orderMsg?.OrderUpdateId ?? 0),
ZoneSetId = orderMsg?.ZoneSetId,
Nodes = new List(nodes.Length),
Edges = new List(edges.Length)
};
foreach (var n in nodes)
data.Nodes.Add(ToOrderNodeData(n));
foreach (var e in edges)
data.Edges.Add(ToOrderEdgeData(e));
return data;
}
private static OrderNodeData ToOrderNodeData(VdaNode n)
{
var node = new OrderNodeData
{
NodeId = n.NodeId,
SequenceId = n.SequenceId,
NodeDescription = n.NodeDescription ?? string.Empty,
Released = n.Released,
NodePosition = n.NodePosition != null ? new OrderNodePositionData
{
X = n.NodePosition.X,
Y = n.NodePosition.Y,
Theta = n.NodePosition.Theta,
AllowedDeviationXY = n.NodePosition.AllowedDeviationXY,
AllowedDeviationTheta = n.NodePosition.AllowedDeviationTheta,
MapId = n.NodePosition.MapId,
MapDescription = n.NodePosition.MapDescription
} : null,
Actions = new List()
};
return node;
}
private static OrderEdgeData ToOrderEdgeData(VdaEdge e)
{
var edge = new OrderEdgeData
{
EdgeId = e.EdgeId,
SequenceId = e.SequenceId,
EdgeDescription = e.EdgeDescription,
Released = e.Released,
StartNodeId = e.StartNodeId,
EndNodeId = e.EndNodeId,
MaxSpeed = e.MaxSpeed,
MaxHeight = e.MaxHeight,
MinHeight = e.MinHeight,
Orientation = e.Orientation ?? 0,
OrientationType = e.OrientationType.HasValue ? JsonSerializer.SerializeToElement((int)e.OrientationType.Value) : null,
Direction = e.Direction ?? string.Empty,
RotationAllowed = e.RotationAllowed,
MaxRotationSpeed = e.MaxRotationSpeed,
Length = e.Length ?? 0,
Trajectory = e.Trajectory != null ? ToOrderTrajectoryData(e.Trajectory) : null,
Actions = new List()
};
return edge;
}
private static OrderTrajectoryData? ToOrderTrajectoryData(VdaTrajectory? t)
{
if (t == null) return null;
return new OrderTrajectoryData
{
Degree = (uint)t.Degree,
KnotVector = t.KnotVector?.ToList() ?? new List(),
ControlPoints = t.ControlPoints?.Select(cp => new OrderControlPointData
{
X = cp.X,
Y = cp.Y,
Weight = cp.Weight ?? 1.0
}).ToList() ?? new List()
};
}
}