Begin implementing "/update" responses from QLab

This commit is contained in:
2019-04-08 16:06:15 -05:00
parent 091ea32ccc
commit d2b295c328
11 changed files with 107 additions and 54 deletions
+3 -1
View File
@@ -36,8 +36,10 @@
<key>XSAppIconAssets</key>
<string>Assets.xcassets/AppIcon.appiconset</string>
<key>CFBundleShortVersionString</key>
<string>2.0</string>
<string>2.0.1</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
</dict>
</plist>
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using SharpOSC;
using Newtonsoft.Json;
namespace qController
@@ -6,19 +7,29 @@ namespace qController
public class QClient
{
TCPSender tcpSender;
UDPSender udpSender;
public QParser qParser;
public QReceiver qReceiver;
public QClient(string address, int port)
{
qParser = new QParser();
qReceiver = new QReceiver(port + 1);
tcpSender = new TCPSender(address, port);
udpSender = new UDPSender(address, port);
tcpSender.MessageReceived += OnMessageReceived;
qReceiver.UpdateMessageReceived += OnMessageReceived;
}
private void OnMessageReceived(object source, MessageEventArgs args)
{
qParser.ParseMessage(args.Message);
if (!args.Message.Address.Contains("update"))
qParser.ParseMessage(args.Message);
else
ProcessUpdate(args.Message);
}
public void sendString(string address)
@@ -30,7 +41,14 @@ namespace qController
{
tcpSender.Send(new OscMessage(address, args));
}
public void sendStringUDP(string address)
{
udpSender.Send(new OscMessage(address));
}
public void sendArgsUDP(string address, params object[] args)
{
udpSender.Send(new OscMessage(address, args));
}
public OscMessage sendAndReceiveString(string address)
{
return tcpSender.SendAndReceive(new OscMessage(address));
@@ -42,6 +60,38 @@ namespace qController
}
public void ProcessUpdate(OscMessage msg)
{
if (msg.Address.Contains("cue_id"))
{
var updateID = msg.Address.Split('/').Last();
Console.WriteLine("Cue needs to be updated: " + updateID);
}else if (msg.Address.Contains("playbackPosition"))
{
if (msg.Arguments.Count > 0)
{
Console.WriteLine("Playback position to be updated: " + msg.Arguments[0]);
UpdateSelectedCue();
}
}
}
public void UpdateSpecificCue(string cue_id)
{
Console.WriteLine(cue_id);
}
public void UpdateSelectedCue()
{
string valuesForKeys = "[\"displayName\",\"number\",\"type\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"uniqueID\",\"flagged\",\"listName\",\"colorName\",\"name\",\"armed\"]";
sendAndReceiveStringArgs("/cue/selected/valuesForKeys", valuesForKeys);
}
public void Close()
{
udpSender.Close();
qReceiver.Close();
}
}
}
@@ -23,6 +23,8 @@ namespace qController
qClient.qParser.WorkspaceUpdated += this.OnWorkspaceUpdated;
qClient.sendArgsUDP("/updates", 1);
qClient.sendAndReceiveString("/cueLists");
}
@@ -37,7 +39,17 @@ namespace qController
public void OnSelectedCueUpdated(object source, CueEventArgs args)
{
selectedCue = args.SelectedCue;
//Console.WriteLine("Selected Cue Updated: Name=" + selectedCue.listName);
Console.WriteLine("Selected cue updated: " + selectedCue.uniqueID);
foreach (var cueList in qWorkspace.data)
{
foreach( var cue in cueList.cues)
{
if(cue.uniqueID == selectedCue.uniqueID)
{
Console.WriteLine("Cue found in local workspace");
}
}
}
}
public void OnWorkspaceUpdated(object source, WorkspaceEventArgs args)
@@ -48,6 +60,7 @@ namespace qController
}
public void Kill(){
qUpdater.Kill();
qClient.Close();
}
}
}
@@ -73,8 +73,6 @@ namespace qController
JToken selectedCue = OSC2JSON(msg);
Console.WriteLine("Selected Cue Updated");
QCue cue = JsonConvert.DeserializeObject<QCue>(selectedCue.ToString());
Console.WriteLine(cue.uniqueID);
OnSelectedCueUpdated(cue);
}
@@ -1,42 +1,39 @@
using System;
//this class is used for receiving workspace update messages
using System;
using SharpOSC;
using System.Net;
using System.Threading;
namespace qController
{
public class MessageEventArgs : EventArgs{
public OscMessage Message {
get;
set;
}
}
public class QReceiver
{
public delegate void UpdateMessageReceivedHandler(object source, MessageEventArgs args);
public event UpdateMessageReceivedHandler UpdateMessageReceived;
static Thread thread;
private QController owner;
static UDPListener udpListener;
public delegate void MessageReceivedHandler(object source, MessageEventArgs args);
public event MessageReceivedHandler MessageReceived;
public QReceiver(int port, QController ctrl)
public QReceiver(int port)
{
owner = ctrl;
HandleOscPacket callback = delegate (OscPacket packet)
{
var messageReceived = (OscMessage)packet;
if(messageReceived != null)
OnUpdateMessageReceived(messageReceived);
else
Console.WriteLine("Message came back null");
};
udpListener = new UDPListener(port);
thread = new Thread(new ThreadStart(ListenLoop));
thread.Start();
udpListener = new UDPListener(port, callback);
}
public void ListenLoop()
{
Console.WriteLine("Loop Started");
while (true)
/*while (true)
{
OscMessage messageReceived = null;
while(messageReceived == null)
@@ -44,23 +41,20 @@ namespace qController
messageReceived = (OscMessage)udpListener.Receive();
Thread.Sleep(1);
}
OnMessageReceived(messageReceived);
}
OnUpdateMessageReceived(messageReceived);
Console.WriteLine("Loop Ended");
}*/
}
public void Close(){
thread.Abort();
udpListener.Close();
}
protected virtual void OnMessageReceived(OscMessage msg){
Console.WriteLine("Message Received");
if (MessageReceived != null)
MessageReceived(this, new MessageEventArgs(){Message = msg});
protected virtual void OnUpdateMessageReceived(OscMessage msg)
{
if (UpdateMessageReceived != null)
UpdateMessageReceived(this, new MessageEventArgs() { Message = msg });
}
}
}
@@ -6,6 +6,7 @@ namespace qController
{
public class QUpdater
{
private bool active = true;
private QController qController;
private Thread updateThread;
@@ -32,7 +33,7 @@ namespace qController
public void UpdateSelected()
{
string valuesForKeys = "[\"displayName\",\"number\",\"type\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"uniqueID\",\"flagged\",\"listName\",\"colorName\",\"name\",\"armed\"]";
qController.qClient.sendAndReceiveStringArgs("/cue/selected/valuesForKeys", valuesForKeys);
//qController.qClient.sendAndReceiveStringArgs("/cue/selected/valuesForKeys", valuesForKeys);
}
public void UpdateLevels()
{
@@ -32,7 +32,6 @@ namespace SharpOSC
char[] types = new char[0];
List<object> arguments = new List<object>();
List<object> mainArray = arguments; // used as a reference when we are parsing arrays to get the main array back
// Get address
address = getAddress(msg, index);
index += msg.FirstIndexAfter(address.Length, x => x == ',');
@@ -147,7 +146,7 @@ namespace SharpOSC
case ('['):
if (arguments != mainArray)
throw new Exception("SharopOSC does not support nested arrays");
throw new Exception("SharpOSC does not support nested arrays");
arguments = new List<object>(); // make arguments point to a new object array
break;
@@ -247,6 +246,12 @@ namespace SharpOSC
}
}
if (types == null)
{
byte[] term = { 0 };
types = Encoding.ASCII.GetChars(term);
}
if (i >= msg.Length && types == null)
throw new Exception("No null terminator after type string");
@@ -480,6 +485,5 @@ namespace SharpOSC
}
#endregion
}
}
@@ -33,7 +33,6 @@ namespace SharpOSC
string _address;
TcpClient client;
Thread receivingThread;
byte END = 0xc0;
byte ESC = 0xdb;
@@ -81,7 +80,7 @@ namespace SharpOSC
}
} catch(Exception e)
{
Console.WriteLine(e.ToString());
//Console.WriteLine(e.ToString());
}
return response;
}
@@ -103,10 +102,6 @@ namespace SharpOSC
OnMessageReceived(response);
return response;
}
public void StartReceiving()
{
receivingThread.Start();
}
public void Send(OscPacket packet)
{
@@ -145,7 +140,6 @@ namespace SharpOSC
public void Close()
{
client.GetStream().Close();
receivingThread.Abort();
client.Close();
}
@@ -97,10 +97,10 @@ namespace SharpOSC
}
catch (Exception e)
{
// If there is an error reading the packet, null is sent to the callback
}
OscPacketCallback(packet);
Console.WriteLine(e.ToString());
// If there is an error reading the packet, null is sent to the callback
}
OscPacketCallback(packet);
}
else
{
@@ -124,7 +124,7 @@ namespace qController
void sendOSC(object sender, EventArgs e)
{
qController.sendCommand(((QButton)sender).OSCCommand);
qController.qClient.sendStringUDP(((QButton)sender).OSCCommand);
}
void Back(object sender, EventArgs e)
-3
View File
@@ -36,9 +36,6 @@
<Compile Remove="Bespoke.Net\Properties\AssemblyInfo.cs" />
<Compile Remove="Classes\QButton.cs" />
<Compile Remove="Classes\Cues\QDefinitions.cs" />
<Compile Remove="Classes\Communication\QReceiver.cs" />
<Compile Remove="Classes\Communication\SharpOSC\UDPListener.cs" />
<Compile Remove="Classes\Communication\SharpOSC\UDPSender.cs" />
<Compile Remove="Classes\Communication\QSender.cs" />
<Compile Remove="Classes\Communication\QSender.cs" />
</ItemGroup>