diff --git a/Droid/Properties/AndroidManifest.xml b/Droid/Properties/AndroidManifest.xml index 31ef2d2..c3819b4 100644 --- a/Droid/Properties/AndroidManifest.xml +++ b/Droid/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - + diff --git a/qController.Standard/Classes/Communication/QClient.cs b/qController.Standard/Classes/Communication/QClient.cs index 621c122..b38085f 100644 --- a/qController.Standard/Classes/Communication/QClient.cs +++ b/qController.Standard/Classes/Communication/QClient.cs @@ -77,7 +77,6 @@ namespace qController } public void sendAndReceiveString(string address) { - tcpSender.SendAndReceive(new OscMessage(address)); try { tcpSender.SendAndReceive(new OscMessage(address)); @@ -110,14 +109,14 @@ namespace qController else if (msg.Address.Contains("cue_id")) { var updateID = msg.Address.Split('/').Last(); - UpdateSpecificCue(updateID); + //UpdateSpecificCue(updateID); } else if (msg.Address.Contains("playbackPosition")) { if (msg.Arguments.Count > 0) { qParser.ParseMessage(msg); - UpdateSelectedCue(); + //UpdateSelectedCue(); } } else if (msg.Address.Contains("workspace")) @@ -128,9 +127,7 @@ namespace qController 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 address = "/cue_id/" + cue_id + "/valuesForKeys"; sendAndReceiveStringArgs(address, valuesForKeys); } diff --git a/qController.Standard/Classes/Communication/QController.cs b/qController.Standard/Classes/Communication/QController.cs index 86ba16a..4cc3d40 100644 --- a/qController.Standard/Classes/Communication/QController.cs +++ b/qController.Standard/Classes/Communication/QController.cs @@ -9,7 +9,7 @@ namespace qController public class QController { - QUpdater qUpdater; + public QUpdater qUpdater; public QClient qClient; public QWorkSpace qWorkspace; public string playbackPosition; @@ -19,14 +19,24 @@ namespace qController qClient = new QClient(address, port); qUpdater = new QUpdater(this); qUpdater.Start(); + //Connect(); - qClient.sendArgsUDP("/updates", 1); - qClient.sendAndReceiveString("/cueLists"); + Connect(); + KickOff(); + } 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() diff --git a/qController.Standard/Classes/Communication/QParser.cs b/qController.Standard/Classes/Communication/QParser.cs index 5a5ff71..e5b262d 100644 --- a/qController.Standard/Classes/Communication/QParser.cs +++ b/qController.Standard/Classes/Communication/QParser.cs @@ -44,6 +44,15 @@ namespace qController } } + public class WorkspaceInfoArgs : EventArgs + { + public List WorkspaceInfo + { + get; + set; + } + } + public class ChildrenEventArgs : EventArgs { public string cue_id @@ -71,6 +80,8 @@ namespace qController public delegate void ConnectionStatusHandler(object source, ConnectEventArgs args); public delegate void ChildrenUpdateHandler(object source, ChildrenEventArgs 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 ChildrenUpdateHandler ChildrenUpdated; public event ConnectionStatusHandler ConnectionStatusChanged; @@ -86,22 +97,20 @@ namespace qController { ParseCueUpdateInfo(msg); } - else if (msg.Address.Contains("notes")) - ParseNoteInfo(msg); else if (msg.Address.Contains("cueLists")) ParseWorkspaceInfo(msg); else if (msg.Address.Contains("playbackPosition")) ParsePositionUpdateInfo(msg); else if (msg.Address.Contains("thump")) Console.WriteLine("Heartbeat Received"); + else if (msg.Address.Contains("disconnect")) + OnWorkspaceDisconnect(); else if (msg.Address.Contains("connect")) ParseConnectInfo(msg); else if (msg.Address.Contains("children")) ParseChildrenInfo(msg); else if (msg.Address.Contains("workspaces")) - ParseInstanceInfo(msg); - else if (msg.Address.Contains("disconnect")) - OnWorkspaceDisconnect(); + ParseQInfo(msg); else { Console.WriteLine("Unknown message type"); @@ -116,8 +125,11 @@ namespace qController public void ParseConnectInfo(OscMessage msg) { - JToken connectStatus = OSC2JSON(msg); - OnConnectionStatusChanged(connectStatus.ToString()); + if (msg.Arguments.Count > 0) + { + JToken connectStatus = OSC2JSON(msg); + OnConnectionStatusChanged(connectStatus.ToString()); + } } public void ParsePositionUpdateInfo(OscMessage msg) @@ -141,15 +153,11 @@ namespace qController OnSelectedCueUpdated(cue); } - public void ParseInstanceInfo(OscMessage msg) + public void ParseQInfo(OscMessage msg) { - //Console.WriteLine(OSC2JSON(msg)); - return; - } - - public void ParseNoteInfo(OscMessage msg){ - //JToken cueInfo = OSC2JSON(msg); - return; + JToken qInfo = OSC2JSON(msg); + List qWorkspaceInfo = JsonConvert.DeserializeObject>(qInfo.ToString()); + OnWorkspaceInfoReceived(qWorkspaceInfo); } public void ParseWorkspaceInfo(OscMessage msg) @@ -214,6 +222,11 @@ namespace qController if (WorkspaceDisconnect != null) WorkspaceDisconnect(this, new EventArgs()); } + protected virtual void OnWorkspaceInfoReceived(List workspaces) + { + if (WorkspaceInfoReceived != null) + WorkspaceInfoReceived(this, new WorkspaceInfoArgs() { WorkspaceInfo = workspaces }); + } } } diff --git a/qController.Standard/Classes/Communication/QUpdater.cs b/qController.Standard/Classes/Communication/QUpdater.cs index 43e9a7b..77c355a 100644 --- a/qController.Standard/Classes/Communication/QUpdater.cs +++ b/qController.Standard/Classes/Communication/QUpdater.cs @@ -67,18 +67,6 @@ namespace qController qController.qWorkspace = args.UpdatedWorkspace; qController.playbackPosition = null; 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) { Console.WriteLine("Workspace group cues are already populated"); @@ -86,6 +74,19 @@ namespace qController qController.qClient.UpdateSelectedCue(); 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"); foreach (var cueList in qController.qWorkspace.data) { diff --git a/qController.Standard/Classes/Communication/SharpOSC/TCPSender.cs b/qController.Standard/Classes/Communication/SharpOSC/TCPSender.cs index 9f4765b..247fce2 100644 --- a/qController.Standard/Classes/Communication/SharpOSC/TCPSender.cs +++ b/qController.Standard/Classes/Communication/SharpOSC/TCPSender.cs @@ -78,7 +78,7 @@ namespace SharpOSC //Console.WriteLine( "Thread " + num + ": Bytes read: " + bytesRead + " - " + Encoding.ASCII.GetString(buffer)); } 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()); } } catch(Exception e) @@ -90,6 +90,7 @@ namespace SharpOSC public void SendAndReceive(byte[] message) { + client = new TcpClient(Address, Port); byte[] slipData = SlipEncode(message); NetworkStream netStream = client.GetStream(); @@ -99,6 +100,8 @@ namespace SharpOSC public void SendAndReceive(OscPacket packet) { + OscMessage msg = (OscMessage)packet; + Console.WriteLine("TCP Message Sent: " + msg.Address); byte[] data = packet.GetBytes(); SendAndReceive(data); } diff --git a/qController.Standard/Classes/Communication/SharpOSC/UDPListener.cs b/qController.Standard/Classes/Communication/SharpOSC/UDPListener.cs index 9f75be8..1a8f249 100755 --- a/qController.Standard/Classes/Communication/SharpOSC/UDPListener.cs +++ b/qController.Standard/Classes/Communication/SharpOSC/UDPListener.cs @@ -151,7 +151,8 @@ namespace SharpOSC { byte[] bytes = queue.Dequeue(); var packet = OscPacket.GetPacket(bytes); - return packet; + Console.WriteLine("Raw UDP In: " + System.Text.Encoding.ASCII.GetString(bytes)); + return packet; } else return null; diff --git a/qController.Standard/Classes/Cues/QInfo.cs b/qController.Standard/Classes/Cues/QInfo.cs new file mode 100644 index 0000000..9724e55 --- /dev/null +++ b/qController.Standard/Classes/Cues/QInfo.cs @@ -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; } + } +} diff --git a/qController.Standard/Classes/Cues/QWorkSpace.cs b/qController.Standard/Classes/Cues/QWorkSpace.cs index f3fc82c..c0878f3 100644 --- a/qController.Standard/Classes/Cues/QWorkSpace.cs +++ b/qController.Standard/Classes/Cues/QWorkSpace.cs @@ -33,6 +33,7 @@ namespace qController { if(data[i].cues[j].uniqueID == cue.uniqueID) { + //Console.WriteLine("Cue found and updated in workspace: " + cue.uniqueID); data[i].cues[j] = cue; return; } diff --git a/qController.Standard/Pages/ControlPage.xaml.cs b/qController.Standard/Pages/ControlPage.xaml.cs index 89baa97..81995a9 100644 --- a/qController.Standard/Pages/ControlPage.xaml.cs +++ b/qController.Standard/Pages/ControlPage.xaml.cs @@ -18,15 +18,31 @@ namespace qController InitializeComponent(); qController = new QController(address, 53000); + qController.qClient.qParser.WorkspaceInfoReceived += WorkspaceInfoReceived; qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated; qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated; qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived; qController.qClient.qParser.ChildrenUpdated += OnChildrenUpdated; - instanceName.Text = name; App.rootPage.MenuItemSelected += OnMenuItemSelected; - qController.Connect(); + + instanceName.Text = name; + 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() @@ -144,22 +160,25 @@ namespace qController { if(e.UpdatedWorkspace.data.Count > 0) { - App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace); qController.qWorkspace = e.UpdatedWorkspace; qController.qWorkspace.CheckPopulated(); + if (qController.qWorkspace.IsPopulated) { + App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace); if (qCell.activeCue == null) { - QCue noSelect = new QCue(); - noSelect.listName = "No Cue Selected"; - noSelect.type = ""; - noSelect.notes = "Workspace has loaded but no cue is selected"; - noSelect.number = "!"; - qCell.UpdateSelectedCue(noSelect); + Device.BeginInvokeOnMainThread(() => { + QCue noSelect = new QCue(); + noSelect.listName = "No Cue Selected"; + noSelect.type = ""; + noSelect.notes = "Workspace has loaded but no cue is selected"; + 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) { qController.qWorkspace.UpdateCue(args.Cue); - Console.WriteLine("Cue updated in ControlPage: " + args.Cue.uniqueID); if (args.Cue.uniqueID == qController.playbackPosition) { - Console.WriteLine("Cue that was updated is equal to the playback position."); Device.BeginInvokeOnMainThread(() => { + Console.WriteLine("Refreshing Currently Displayed Cue"); if (args.Cue.levels != null) sLayout.Children.Add(qSelectedCueOptions); else