Star work on Multiple Workspaces, Improve Networks

Android version 1.0.5
This commit is contained in:
2019-04-25 08:44:20 -05:00
parent 17b66f9113
commit 5ad19ffbdb
10 changed files with 107 additions and 52 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="21" android:versionName="1.0.4" package="com.jwetzell.qlabcontroller"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="22" android:versionName="1.0.5" package="com.jwetzell.qlabcontroller">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" /> <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application android:label="qController" android:icon="@drawable/icon"></application> <application android:label="qController" android:icon="@drawable/icon"></application>
@@ -77,7 +77,6 @@ namespace qController
} }
public void sendAndReceiveString(string address) public void sendAndReceiveString(string address)
{ {
tcpSender.SendAndReceive(new OscMessage(address));
try try
{ {
tcpSender.SendAndReceive(new OscMessage(address)); tcpSender.SendAndReceive(new OscMessage(address));
@@ -110,14 +109,14 @@ namespace qController
else if (msg.Address.Contains("cue_id")) else if (msg.Address.Contains("cue_id"))
{ {
var updateID = msg.Address.Split('/').Last(); var updateID = msg.Address.Split('/').Last();
UpdateSpecificCue(updateID); //UpdateSpecificCue(updateID);
} }
else if (msg.Address.Contains("playbackPosition")) else if (msg.Address.Contains("playbackPosition"))
{ {
if (msg.Arguments.Count > 0) if (msg.Arguments.Count > 0)
{ {
qParser.ParseMessage(msg); qParser.ParseMessage(msg);
UpdateSelectedCue(); //UpdateSelectedCue();
} }
} }
else if (msg.Address.Contains("workspace")) else if (msg.Address.Contains("workspace"))
@@ -128,9 +127,7 @@ namespace qController
public void UpdateSpecificCue(string cue_id) public void UpdateSpecificCue(string cue_id)
{ {
string valuesForKeys = "[\"number\",\"uniqueID\",\"flagged\",\"listName\",\"type\",\"colorName\",\"name\",\"armed\",\"displayName\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"notes\",\"levels\"]"; string valuesForKeys = "[\"number\",\"uniqueID\",\"flagged\",\"listName\",\"type\",\"colorName\",\"name\",\"armed\",\"displayName\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"notes\",\"levels\"]";
string address = "/cue_id/" + cue_id + "/valuesForKeys"; string address = "/cue_id/" + cue_id + "/valuesForKeys";
sendAndReceiveStringArgs(address, valuesForKeys); sendAndReceiveStringArgs(address, valuesForKeys);
} }
@@ -9,7 +9,7 @@ namespace qController
public class QController public class QController
{ {
QUpdater qUpdater; public QUpdater qUpdater;
public QClient qClient; public QClient qClient;
public QWorkSpace qWorkspace; public QWorkSpace qWorkspace;
public string playbackPosition; public string playbackPosition;
@@ -19,14 +19,24 @@ namespace qController
qClient = new QClient(address, port); qClient = new QClient(address, port);
qUpdater = new QUpdater(this); qUpdater = new QUpdater(this);
qUpdater.Start(); qUpdater.Start();
//Connect();
qClient.sendArgsUDP("/updates", 1); Connect();
qClient.sendAndReceiveString("/cueLists"); KickOff();
} }
public void Connect() public void Connect()
{ {
qClient.sendStringUDP("/connect"); Console.WriteLine("QCONTROLLER CONNECT CALLED");
//qClient.sendStringUDP("/connect");
qClient.sendArgsUDP("/updates", 1);
qClient.sendAndReceiveString("/cueLists");
}
public void KickOff()
{
qClient.sendArgsUDP("/workspaces");
} }
public void Disconnect() public void Disconnect()
@@ -44,6 +44,15 @@ namespace qController
} }
} }
public class WorkspaceInfoArgs : EventArgs
{
public List<QInfo> WorkspaceInfo
{
get;
set;
}
}
public class ChildrenEventArgs : EventArgs public class ChildrenEventArgs : EventArgs
{ {
public string cue_id public string cue_id
@@ -71,6 +80,8 @@ namespace qController
public delegate void ConnectionStatusHandler(object source, ConnectEventArgs args); public delegate void ConnectionStatusHandler(object source, ConnectEventArgs args);
public delegate void ChildrenUpdateHandler(object source, ChildrenEventArgs args); public delegate void ChildrenUpdateHandler(object source, ChildrenEventArgs args);
public delegate void WorkspaceDisconnectHandler(object source, EventArgs args); public delegate void WorkspaceDisconnectHandler(object source, EventArgs args);
public delegate void WorkspaceInfoHandler(object source, WorkspaceInfoArgs args);
public event WorkspaceInfoHandler WorkspaceInfoReceived;
public event WorkspaceDisconnectHandler WorkspaceDisconnect; public event WorkspaceDisconnectHandler WorkspaceDisconnect;
public event ChildrenUpdateHandler ChildrenUpdated; public event ChildrenUpdateHandler ChildrenUpdated;
public event ConnectionStatusHandler ConnectionStatusChanged; public event ConnectionStatusHandler ConnectionStatusChanged;
@@ -86,22 +97,20 @@ namespace qController
{ {
ParseCueUpdateInfo(msg); ParseCueUpdateInfo(msg);
} }
else if (msg.Address.Contains("notes"))
ParseNoteInfo(msg);
else if (msg.Address.Contains("cueLists")) else if (msg.Address.Contains("cueLists"))
ParseWorkspaceInfo(msg); ParseWorkspaceInfo(msg);
else if (msg.Address.Contains("playbackPosition")) else if (msg.Address.Contains("playbackPosition"))
ParsePositionUpdateInfo(msg); ParsePositionUpdateInfo(msg);
else if (msg.Address.Contains("thump")) else if (msg.Address.Contains("thump"))
Console.WriteLine("Heartbeat Received"); Console.WriteLine("Heartbeat Received");
else if (msg.Address.Contains("disconnect"))
OnWorkspaceDisconnect();
else if (msg.Address.Contains("connect")) else if (msg.Address.Contains("connect"))
ParseConnectInfo(msg); ParseConnectInfo(msg);
else if (msg.Address.Contains("children")) else if (msg.Address.Contains("children"))
ParseChildrenInfo(msg); ParseChildrenInfo(msg);
else if (msg.Address.Contains("workspaces")) else if (msg.Address.Contains("workspaces"))
ParseInstanceInfo(msg); ParseQInfo(msg);
else if (msg.Address.Contains("disconnect"))
OnWorkspaceDisconnect();
else else
{ {
Console.WriteLine("Unknown message type"); Console.WriteLine("Unknown message type");
@@ -116,8 +125,11 @@ namespace qController
public void ParseConnectInfo(OscMessage msg) public void ParseConnectInfo(OscMessage msg)
{ {
JToken connectStatus = OSC2JSON(msg); if (msg.Arguments.Count > 0)
OnConnectionStatusChanged(connectStatus.ToString()); {
JToken connectStatus = OSC2JSON(msg);
OnConnectionStatusChanged(connectStatus.ToString());
}
} }
public void ParsePositionUpdateInfo(OscMessage msg) public void ParsePositionUpdateInfo(OscMessage msg)
@@ -141,15 +153,11 @@ namespace qController
OnSelectedCueUpdated(cue); OnSelectedCueUpdated(cue);
} }
public void ParseInstanceInfo(OscMessage msg) public void ParseQInfo(OscMessage msg)
{ {
//Console.WriteLine(OSC2JSON(msg)); JToken qInfo = OSC2JSON(msg);
return; List<QInfo> qWorkspaceInfo = JsonConvert.DeserializeObject<List<QInfo>>(qInfo.ToString());
} OnWorkspaceInfoReceived(qWorkspaceInfo);
public void ParseNoteInfo(OscMessage msg){
//JToken cueInfo = OSC2JSON(msg);
return;
} }
public void ParseWorkspaceInfo(OscMessage msg) public void ParseWorkspaceInfo(OscMessage msg)
@@ -214,6 +222,11 @@ namespace qController
if (WorkspaceDisconnect != null) if (WorkspaceDisconnect != null)
WorkspaceDisconnect(this, new EventArgs()); WorkspaceDisconnect(this, new EventArgs());
} }
protected virtual void OnWorkspaceInfoReceived(List<QInfo> workspaces)
{
if (WorkspaceInfoReceived != null)
WorkspaceInfoReceived(this, new WorkspaceInfoArgs() { WorkspaceInfo = workspaces });
}
} }
} }
@@ -67,18 +67,6 @@ namespace qController
qController.qWorkspace = args.UpdatedWorkspace; qController.qWorkspace = args.UpdatedWorkspace;
qController.playbackPosition = null; qController.playbackPosition = null;
qController.qWorkspace.CheckPopulated(); qController.qWorkspace.CheckPopulated();
RefreshGroupCues();
//qController.qClient.UpdateSelectedCue();
}
public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args)
{
qController.playbackPosition = args.PlaybackPosition;
}
public void RefreshGroupCues()
{
if (qController.qWorkspace.IsPopulated) if (qController.qWorkspace.IsPopulated)
{ {
Console.WriteLine("Workspace group cues are already populated"); Console.WriteLine("Workspace group cues are already populated");
@@ -86,6 +74,19 @@ namespace qController
qController.qClient.UpdateSelectedCue(); qController.qClient.UpdateSelectedCue();
return; return;
} }
//RefreshGroupCues();
//qController.qClient.UpdateSelectedCue();
}
public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args)
{
qController.playbackPosition = args.PlaybackPosition;
qController.qClient.UpdateSpecificCue(args.PlaybackPosition);
}
public void RefreshGroupCues()
{
Console.WriteLine("Workspace group cues are not populated"); Console.WriteLine("Workspace group cues are not populated");
foreach (var cueList in qController.qWorkspace.data) foreach (var cueList in qController.qWorkspace.data)
{ {
@@ -78,7 +78,7 @@ namespace SharpOSC
//Console.WriteLine( "Thread " + num + ": Bytes read: " + bytesRead + " - " + Encoding.ASCII.GetString(buffer)); //Console.WriteLine( "Thread " + num + ": Bytes read: " + bytesRead + " - " + Encoding.ASCII.GetString(buffer));
} while (netStream.DataAvailable); } while (netStream.DataAvailable);
//Console.WriteLine("Raw TCP In: " + System.Text.Encoding.ASCII.GetString(responseData.ToArray())); Console.WriteLine("Raw TCP In: " + System.Text.Encoding.ASCII.GetString(responseData.ToArray()));
response = (OscMessage)OscPacket.GetPacket(responseData.Skip(1).ToArray()); response = (OscMessage)OscPacket.GetPacket(responseData.Skip(1).ToArray());
} }
} catch(Exception e) } catch(Exception e)
@@ -90,6 +90,7 @@ namespace SharpOSC
public void SendAndReceive(byte[] message) public void SendAndReceive(byte[] message)
{ {
client = new TcpClient(Address, Port); client = new TcpClient(Address, Port);
byte[] slipData = SlipEncode(message); byte[] slipData = SlipEncode(message);
NetworkStream netStream = client.GetStream(); NetworkStream netStream = client.GetStream();
@@ -99,6 +100,8 @@ namespace SharpOSC
public void SendAndReceive(OscPacket packet) public void SendAndReceive(OscPacket packet)
{ {
OscMessage msg = (OscMessage)packet;
Console.WriteLine("TCP Message Sent: " + msg.Address);
byte[] data = packet.GetBytes(); byte[] data = packet.GetBytes();
SendAndReceive(data); SendAndReceive(data);
} }
@@ -151,7 +151,8 @@ namespace SharpOSC
{ {
byte[] bytes = queue.Dequeue(); byte[] bytes = queue.Dequeue();
var packet = OscPacket.GetPacket(bytes); var packet = OscPacket.GetPacket(bytes);
return packet; Console.WriteLine("Raw UDP In: " + System.Text.Encoding.ASCII.GetString(bytes));
return packet;
} }
else else
return null; return null;
@@ -0,0 +1,11 @@
using System;
namespace qController
{
public class QInfo
{
public string version { get; set; }
public string displayName { get; set; }
public string uniqueID { get; set; }
public bool hasPasscode { get; set; }
}
}
@@ -33,6 +33,7 @@ namespace qController
{ {
if(data[i].cues[j].uniqueID == cue.uniqueID) if(data[i].cues[j].uniqueID == cue.uniqueID)
{ {
//Console.WriteLine("Cue found and updated in workspace: " + cue.uniqueID);
data[i].cues[j] = cue; data[i].cues[j] = cue;
return; return;
} }
+31 -13
View File
@@ -18,15 +18,31 @@ namespace qController
InitializeComponent(); InitializeComponent();
qController = new QController(address, 53000); qController = new QController(address, 53000);
qController.qClient.qParser.WorkspaceInfoReceived += WorkspaceInfoReceived;
qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated; qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated;
qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated; qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated;
qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived; qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived;
qController.qClient.qParser.ChildrenUpdated += OnChildrenUpdated; qController.qClient.qParser.ChildrenUpdated += OnChildrenUpdated;
instanceName.Text = name;
App.rootPage.MenuItemSelected += OnMenuItemSelected; App.rootPage.MenuItemSelected += OnMenuItemSelected;
qController.Connect();
instanceName.Text = name;
InitGUI(); InitGUI();
}
private void WorkspaceInfoReceived(object source, WorkspaceInfoArgs args)
{
if(args.WorkspaceInfo.Count > 1)
{
Console.WriteLine("MULTIPLE WORKSPACES ON SELECTED COMPUTER");
}
else
{
Console.WriteLine("ONLY ONE WORKSPACE ON SELECTED COMPUTER");
//qController.Connect();
}
} }
private void InitGUI() private void InitGUI()
@@ -144,22 +160,25 @@ namespace qController
{ {
if(e.UpdatedWorkspace.data.Count > 0) if(e.UpdatedWorkspace.data.Count > 0)
{ {
App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace);
qController.qWorkspace = e.UpdatedWorkspace; qController.qWorkspace = e.UpdatedWorkspace;
qController.qWorkspace.CheckPopulated(); qController.qWorkspace.CheckPopulated();
if (qController.qWorkspace.IsPopulated) if (qController.qWorkspace.IsPopulated)
{ {
App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace);
if (qCell.activeCue == null) if (qCell.activeCue == null)
{ {
QCue noSelect = new QCue(); Device.BeginInvokeOnMainThread(() => {
noSelect.listName = "No Cue Selected"; QCue noSelect = new QCue();
noSelect.type = ""; noSelect.listName = "No Cue Selected";
noSelect.notes = "Workspace has loaded but no cue is selected"; noSelect.type = "";
noSelect.number = "!"; noSelect.notes = "Workspace has loaded but no cue is selected";
qCell.UpdateSelectedCue(noSelect); noSelect.number = "!";
qCell.UpdateSelectedCue(noSelect);
});
} }
Console.WriteLine("Workspace updated in ControlPage: " + qController.qWorkspace.workspace_id);
} }
Console.WriteLine("Workspace updated in ControlPage: " + qController.qWorkspace.workspace_id);
} }
} }
@@ -183,12 +202,11 @@ namespace qController
public void OnCueUpdateReceived(object sender, CueEventArgs args) public void OnCueUpdateReceived(object sender, CueEventArgs args)
{ {
qController.qWorkspace.UpdateCue(args.Cue); qController.qWorkspace.UpdateCue(args.Cue);
Console.WriteLine("Cue updated in ControlPage: " + args.Cue.uniqueID);
if (args.Cue.uniqueID == qController.playbackPosition) if (args.Cue.uniqueID == qController.playbackPosition)
{ {
Console.WriteLine("Cue that was updated is equal to the playback position.");
Device.BeginInvokeOnMainThread(() => Device.BeginInvokeOnMainThread(() =>
{ {
Console.WriteLine("Refreshing Currently Displayed Cue");
if (args.Cue.levels != null) if (args.Cue.levels != null)
sLayout.Children.Add(qSelectedCueOptions); sLayout.Children.Add(qSelectedCueOptions);
else else