mirror of
https://github.com/jwetzell/qController.git
synced 2026-08-17 21:24:20 +00:00
Star work on Multiple Workspaces, Improve Networks
Android version 1.0.5
This commit is contained in:
@@ -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();
|
||||||
|
|
||||||
|
Connect();
|
||||||
|
KickOff();
|
||||||
|
|
||||||
qClient.sendArgsUDP("/updates", 1);
|
|
||||||
qClient.sendAndReceiveString("/cueLists");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user