fix up SLIP decoding and data-less qlab replies

This commit is contained in:
2025-01-26 19:14:18 -06:00
parent e0c300e60d
commit 8ad3d686f4
6 changed files with 68 additions and 40 deletions
@@ -81,22 +81,42 @@ namespace qController.Communication
public void ParseCueUpdateInfo(OscMessage msg) public void ParseCueUpdateInfo(OscMessage msg)
{ {
JToken cueUpdate = OSC2JSON(msg); JToken cueUpdate = OSC2JSON(msg);
if(cueUpdate != null)
{
QCue cue = JsonConvert.DeserializeObject<QCue>(cueUpdate.ToString()); QCue cue = JsonConvert.DeserializeObject<QCue>(cueUpdate.ToString());
OnCueInfoUpdated(cue); OnCueInfoUpdated(cue);
}else
{
Log.Debug("QPARSER - cue update info does not have any data");
}
} }
public void ParseSelectedCueInfo(OscMessage msg){ public void ParseSelectedCueInfo(OscMessage msg){
JToken selectedCue = OSC2JSON(msg); JToken selectedCue = OSC2JSON(msg);
if (selectedCue != null)
{
QCue cue = JsonConvert.DeserializeObject<QCue>(selectedCue.ToString()); QCue cue = JsonConvert.DeserializeObject<QCue>(selectedCue.ToString());
OnSelectedCueUpdated(cue); OnSelectedCueUpdated(cue);
} }
else
{
Log.Debug("QPARSER - selected does not have any data");
}
}
public void ParseQInfo(OscMessage msg) public void ParseQInfo(OscMessage msg)
{ {
JToken qInfo = OSC2JSON(msg); JToken qInfo = OSC2JSON(msg);
if (qInfo != null)
{
List<QWorkspaceInfo> qWorkspaceInfo = JsonConvert.DeserializeObject<List<QWorkspaceInfo>>(qInfo.ToString()); List<QWorkspaceInfo> qWorkspaceInfo = JsonConvert.DeserializeObject<List<QWorkspaceInfo>>(qInfo.ToString());
OnWorkspaceInfoReceived(qWorkspaceInfo); OnWorkspaceInfoReceived(qWorkspaceInfo);
} }
else
{
Log.Debug("QPARSER - selected does not have any data");
}
}
public void ParseWorkspaceInfo(OscMessage msg) public void ParseWorkspaceInfo(OscMessage msg)
{ {
@@ -131,8 +151,15 @@ namespace qController.Communication
{ {
string cue_id = msg.Address.Split('/')[3]; string cue_id = msg.Address.Split('/')[3];
JToken children_obj = OSC2JSON(msg); JToken children_obj = OSC2JSON(msg);
if(children_obj != null)
{
List<QCue> children = JsonConvert.DeserializeObject<List<QCue>>(children_obj.ToString()); List<QCue> children = JsonConvert.DeserializeObject<List<QCue>>(children_obj.ToString());
OnChildrenUpdated(cue_id, children); OnChildrenUpdated(cue_id, children);
}else
{
Log.Debug("QPARSER - children info message does not have any data");
}
} }
} }
@@ -157,6 +184,7 @@ namespace qController.Communication
protected virtual void OnPlaybackPositionUpdated(string id) protected virtual void OnPlaybackPositionUpdated(string id)
{ {
Log.Error(id);
PlaybackPositionUpdated?.Invoke(this, new PlaybackPositionArgs() { PlaybackPosition = id }); PlaybackPositionUpdated?.Invoke(this, new PlaybackPositionArgs() { PlaybackPosition = id });
} }
protected virtual void OnConnectionStatusChanged(string status, string workspace_id) protected virtual void OnConnectionStatusChanged(string status, string workspace_id)
@@ -17,6 +17,11 @@ namespace SharpOSC
Arguments.AddRange(args); Arguments.AddRange(args);
} }
public override string ToString()
{
return "Address: " + Address + " Args: " + string.Join(",", Arguments);
}
public override byte[] GetBytes() public override byte[] GetBytes()
{ {
List<byte[]> parts = new List<byte[]>(); List<byte[]> parts = new List<byte[]>();
@@ -15,6 +15,11 @@ namespace SharpOSC
return parseMessage(OscData); return parseMessage(OscData);
} }
public static OscMessage GetMessage(byte[] OscData)
{
return parseMessage(OscData);
}
public abstract byte[] GetBytes(); public abstract byte[] GetBytes();
#region Parse OSC packages #region Parse OSC packages
@@ -8,12 +8,12 @@ namespace SharpOSC
public static readonly byte ESC = 0xdb; public static readonly byte ESC = 0xdb;
public static readonly byte ESC_END = 0xDC; public static readonly byte ESC_END = 0xDC;
public static readonly byte ESC_ESC = 0xDD; public static readonly byte ESC_ESC = 0xDD;
private static List<byte> buffer = new List<byte>();
public static List<byte[]> Decode(byte[] data) public static List<byte[]> Decode(byte[] data)
{ {
List<byte[]> messages = new List<byte[]>(); List<byte[]> messages = new List<byte[]>();
List<byte> buffer = new List<byte>();
bool escapeNext = false; bool escapeNext = false;
for (int i = 0; i < data.Length; i++) for (int i = 0; i < data.Length; i++)
{ {
@@ -36,8 +36,6 @@ namespace SharpOSC
TcpSharpSocketClient? tcpClient; TcpSharpSocketClient? tcpClient;
private List<byte> frameStream = new List<byte>();
public TCPClient(string address, int port) public TCPClient(string address, int port)
{ {
_port = port; _port = port;
@@ -78,39 +76,28 @@ namespace SharpOSC
private void DataReceived(object sender, OnClientDataReceivedEventArgs e) private void DataReceived(object sender, OnClientDataReceivedEventArgs e)
{ {
frameStream.AddRange(e.Data); List<byte[]> messages = SlipFrame.Decode(e.Data);
_log.Debug("tcpclient: " + messages.Count + " messages pulled from slip");
int i = 0;
int frameEnd = frameStream.FindIndex(1, frameByte => frameByte.Equals(SlipFrame.END));
while (frameEnd > 0)
{
List<byte> frame = frameStream.GetRange(0, frameEnd + 1);
frameStream.RemoveRange(0, frameEnd + 1);
List<byte[]> messages = SlipFrame.Decode(frame.ToArray());
foreach (var message in messages) foreach (var message in messages)
{ {
try try
{ {
OscPacket packet = OscPacket.GetPacket(message);
OscMessage responseMessage = (OscMessage)packet;
if (packet == null)
{
_log.Error("packet is null");
}
OscMessage responseMessage = OscPacket.GetMessage(message);
if (responseMessage == null) if (responseMessage == null)
{ {
_log.Error("responeMessage is null"); _log.Error("responseMessage is null");
} } else
{
OnMessageReceived(responseMessage); OnMessageReceived(responseMessage);
} }
}
catch (Exception ex) catch (Exception ex)
{ {
_log.Error($"Exception parsing OSC message: {ex.ToString()}"); _log.Error($"Exception parsing OSC message: {ex.ToString()}");
} }
} }
frameEnd = frameStream.FindIndex(0, frameByte => frameByte.Equals(SlipFrame.END));
}
} }
private void ClientConnected(object sender, OnClientConnectedEventArgs e) private void ClientConnected(object sender, OnClientConnectedEventArgs e)
+3
View File
@@ -289,6 +289,9 @@ namespace qController
} }
qCell.UpdateSelectedCue(cue); qCell.UpdateSelectedCue(cue);
}); });
} else
{
Log.Error("Playback Position has been updated but cue is null?");
} }
} }