Implement notes, and work on updating cue info

This commit is contained in:
2019-04-09 16:04:59 -05:00
parent a57aa970ca
commit 886fe0cf0b
12 changed files with 79 additions and 53 deletions
+1 -1
View File
@@ -36,7 +36,7 @@
<key>XSAppIconAssets</key> <key>XSAppIconAssets</key>
<string>Assets.xcassets/AppIcon.appiconset</string> <string>Assets.xcassets/AppIcon.appiconset</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>2.0.1</string> <string>2.0.2</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.0</string> <string>1.0</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
@@ -113,7 +113,7 @@ namespace qController
name.Text = cue.name; name.Text = cue.name;
number.Text = cue.number; number.Text = cue.number;
type.Text = cue.type; type.Text = cue.type;
//notes.Text = cue.notes; notes.Text = cue.notes;
} }
} }
} }
@@ -1,5 +1,6 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading;
using SharpOSC; using SharpOSC;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace qController namespace qController
@@ -49,14 +50,14 @@ namespace qController
{ {
udpSender.Send(new OscMessage(address, args)); udpSender.Send(new OscMessage(address, args));
} }
public OscMessage sendAndReceiveString(string address) public void sendAndReceiveString(string address)
{ {
return tcpSender.SendAndReceive(new OscMessage(address)); tcpSender.SendAndReceive(new OscMessage(address));
} }
public OscMessage sendAndReceiveStringArgs(string address, params object[] args) public void sendAndReceiveStringArgs(string address, params object[] args)
{ {
return tcpSender.SendAndReceive(new OscMessage(address, args)); tcpSender.SendAndReceive(new OscMessage(address,args));
} }
@@ -91,14 +92,15 @@ namespace qController
public void UpdateSpecificCue(string cue_id) public void UpdateSpecificCue(string cue_id)
{ {
Console.WriteLine("Cue needs to be updated: " + cue_id); Console.WriteLine("Cue needs to be updated: " + cue_id);
string valuesForKeys = "[\"displayName\",\"number\",\"type\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"uniqueID\",\"flagged\",\"listName\",\"colorName\",\"name\",\"armed\"]"; string valuesForKeys = "[\"displayName\",\"number\",\"type\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"uniqueID\",\"flagged\",\"listName\",\"colorName\",\"name\",\"armed\",\"notes\"]";
string address = "/cue/" + cue_id + "/valuesForKeys"; string address = "/cue_id/" + cue_id + "/valuesForKeys";
sendAndReceiveStringArgs(address, valuesForKeys); sendAndReceiveStringArgs(address, valuesForKeys);
} }
public void UpdateSelectedCue() 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\"]"; string valuesForKeys = "[\"displayName\",\"number\",\"type\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"uniqueID\",\"flagged\",\"listName\",\"colorName\",\"name\",\"armed\",\"notes\"]";
sendAndReceiveStringArgs("/cue/selected/valuesForKeys", valuesForKeys); sendAndReceiveStringArgs("/cue/selected/valuesForKeys", valuesForKeys);
} }
@@ -23,11 +23,10 @@ namespace qController
qClient.qParser.SelectedCueUpdated += this.OnSelectedCueUpdated; qClient.qParser.SelectedCueUpdated += this.OnSelectedCueUpdated;
qClient.qParser.WorkspaceUpdated += this.OnWorkspaceUpdated; qClient.qParser.WorkspaceUpdated += this.OnWorkspaceUpdated;
qClient.qParser.PlaybackPositionUpdated += this.OnPlaybackPositionUpdated; qClient.qParser.PlaybackPositionUpdated += this.OnPlaybackPositionUpdated;
qClient.qParser.CueInfoUpdated += this.OnCueUpdateReceived;
qClient.sendArgsUDP("/updates", 1); qClient.sendArgsUDP("/updates", 1);
qClient.sendAndReceiveString("/cueLists"); qClient.sendAndReceiveString("/cueLists");
} }
public void sendCommand(string cmd){ public void sendCommand(string cmd){
@@ -48,6 +47,7 @@ namespace qController
{ {
qWorkspace = args.UpdatedWorkspace; qWorkspace = args.UpdatedWorkspace;
Console.WriteLine("Workspace updated in QController: " + qWorkspace.workspace_id); Console.WriteLine("Workspace updated in QController: " + qWorkspace.workspace_id);
qWorkspace.PrintStats();
} }
public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args) public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args)
@@ -59,7 +59,7 @@ namespace qController
public void OnCueUpdateReceived(object source, CueEventArgs args) public void OnCueUpdateReceived(object source, CueEventArgs args)
{ {
qWorkspace.UpdateCue(args.Cue); qWorkspace.UpdateCue(args.Cue);
Console.WriteLine("Cue updated: " + args.Cue.uniqueID ); Console.WriteLine("Cue updated in QController: " + args.Cue.uniqueID );
} }
public void Kill(){ public void Kill(){
qUpdater.Kill(); qUpdater.Kill();
@@ -100,7 +100,6 @@ namespace qController
public void ParseCueUpdateInfo(OscMessage msg) public void ParseCueUpdateInfo(OscMessage msg)
{ {
JToken cueUpdate = OSC2JSON(msg); JToken cueUpdate = OSC2JSON(msg);
Console.WriteLine("Cue Update Received");
QCue cue = JsonConvert.DeserializeObject<QCue>(cueUpdate.ToString()); QCue cue = JsonConvert.DeserializeObject<QCue>(cueUpdate.ToString());
OnCueInfoUpdated(cue); OnCueInfoUpdated(cue);
} }
@@ -15,40 +15,33 @@ namespace qController
static Thread thread; static Thread thread;
static UDPListener udpListener; static UDPListener udpListener;
static int Port;
public QReceiver(int port) public QReceiver(int port)
{ {
HandleOscPacket callback = delegate (OscPacket packet) Port = port;
{ thread = new Thread(new ThreadStart(ListenLoop));
var messageReceived = (OscMessage)packet; thread.Start();
if(messageReceived != null)
OnUpdateMessageReceived(messageReceived);
else
Console.WriteLine("Message came back null");
};
udpListener = new UDPListener(port, callback);
} }
public void ListenLoop() public void ListenLoop()
{ {
/*while (true) HandleOscPacket callback = delegate (OscPacket packet)
{ {
OscMessage messageReceived = null; var messageReceived = (OscMessage)packet;
while(messageReceived == null) if (messageReceived != null)
{ OnUpdateMessageReceived(messageReceived);
messageReceived = (OscMessage)udpListener.Receive(); else
Thread.Sleep(1); Console.WriteLine("Message came back null");
} };
OnUpdateMessageReceived(messageReceived);
}*/ udpListener = new UDPListener(Port, callback);
} }
public void Close(){ public void Close(){
udpListener.Close(); udpListener.Close();
thread.Abort();
} }
protected virtual void OnUpdateMessageReceived(OscMessage msg) protected virtual void OnUpdateMessageReceived(OscMessage msg)
@@ -27,8 +27,8 @@ namespace SharpOSC
private static OscMessage parseMessage(byte[] msg) private static OscMessage parseMessage(byte[] msg)
{ {
int index = 0; int index = 0;
//Console.WriteLine("Raw OSC DATA: " + System.Text.Encoding.ASCII.GetString(msg));
string address = null; string address = null;
char[] types = new char[0]; char[] types = new char[0];
List<object> arguments = new List<object>(); 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 List<object> mainArray = arguments; // used as a reference when we are parsing arrays to get the main array back
@@ -287,8 +287,12 @@ namespace SharpOSC
break; break;
} }
} }
if (output == null)
if (i >= msg.Length && output == null) {
byte[] term = { 0 };
output = Encoding.ASCII.GetString(term);
}
if (i >= msg.Length && output == null)
throw new Exception("No null terminator after type string"); throw new Exception("No null terminator after type string");
return output.Replace("\0", ""); return output.Replace("\0", "");
@@ -56,12 +56,15 @@ namespace SharpOSC
client.Close(); client.Close();
} }
public OscMessage Receive() public async void Receive()
{ {
Random random = new Random();
int num = random.Next(1000);
OscMessage response = new OscMessage("/null"); OscMessage response = new OscMessage("/null");
NetworkStream netStream = client.GetStream();
try try
{ {
NetworkStream netStream = client.GetStream();
netStream.ReadTimeout = 250; netStream.ReadTimeout = 250;
List<byte> responseData = new List<byte>(); List<byte> responseData = new List<byte>();
if (netStream.CanRead) if (netStream.CanRead)
@@ -71,36 +74,37 @@ namespace SharpOSC
int bytesRead = 0; int bytesRead = 0;
do do
{ {
bytesRead = netStream.Read(buffer, 0, buffer.Length); bytesRead = await netStream.ReadAsync(buffer, 0, buffer.Length);
responseData.AddRange(buffer); responseData.AddRange(buffer);
Thread.Sleep(1);
//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()));
response = (OscMessage)OscPacket.GetPacket(responseData.Skip(1).ToArray()); response = (OscMessage)OscPacket.GetPacket(responseData.Skip(1).ToArray());
netStream.Close();
client.Close();
} }
} catch(Exception e) } catch(Exception e)
{ {
//Console.WriteLine(e.ToString()); Console.WriteLine(e.ToString());
} }
return response; netStream.Close();
client.Close();
OnMessageReceived(response);
} }
public OscMessage 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();
netStream.Write(slipData.ToArray(), 0, slipData.ToArray().Length); netStream.Write(slipData.ToArray(), 0, slipData.ToArray().Length);
OscMessage response = Receive(); Receive();
return response;
} }
public OscMessage SendAndReceive(OscPacket packet) public void SendAndReceive(OscPacket packet)
{ {
byte[] data = packet.GetBytes(); byte[] data = packet.GetBytes();
OscMessage response = SendAndReceive(data); SendAndReceive(data);
OnMessageReceived(response);
return response;
} }
public void Send(OscPacket packet) public void Send(OscPacket packet)
@@ -100,6 +100,7 @@ namespace SharpOSC
Console.WriteLine(e.ToString()); Console.WriteLine(e.ToString());
// If there is an error reading the packet, null is sent to the callback // If there is an error reading the packet, null is sent to the callback
} }
Console.WriteLine("Raw UDP In: " + System.Text.Encoding.ASCII.GetString(bytes));
OscPacketCallback(packet); OscPacketCallback(packet);
} }
else else
@@ -25,5 +25,6 @@ namespace qController
public bool isBroken { get; set; } public bool isBroken { get; set; }
public string displayName { get; set; } public string displayName { get; set; }
public bool isLoaded { get; set; } public bool isLoaded { get; set; }
public string notes { get; set; }
} }
} }
@@ -39,5 +39,13 @@ namespace qController
} }
} }
} }
public void PrintStats()
{
foreach (var cueList in data)
{
Console.WriteLine(cueList.listName + "("+ cueList.cues.Count + " cues)");
}
}
} }
} }
+15 -1
View File
@@ -20,7 +20,7 @@ namespace qController
qController.qClient.qParser.SelectedCueUpdated += SelectedCueUpdated; qController.qClient.qParser.SelectedCueUpdated += SelectedCueUpdated;
qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated; qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated;
qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated; qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated;
qController.qClient.sendAndReceiveString("/cueLists"); qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived;
NavigationPage.SetHasNavigationBar(this, false); NavigationPage.SetHasNavigationBar(this, false);
instanceName.Text = name; instanceName.Text = name;
@@ -183,6 +183,20 @@ 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(() =>
{
qCell.UpdateSelectedCue(args.Cue);
});
}
}
protected override void OnDisappearing() protected override void OnDisappearing()
{ {
base.OnDisappearing(); base.OnDisappearing();