Initial check-in of module qController

This commit is contained in:
2018-06-01 15:09:01 -05:00
commit 30e23418a6
126 changed files with 10486 additions and 0 deletions
@@ -0,0 +1,18 @@
using System;
using System.Net;
namespace qController
{
public class IPHelper
{
public IPHelper()
{
}
public static bool IsValidAddress(string ipString){
if ((ipString.Split('.').Length - 1) != 3) return false;
IPAddress address;
return IPAddress.TryParse(ipString, out address);
}
}
}
@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace qController
{
public class QController
{
public QSender qSender;
QReceiver qReceiver;
QUpdater qUpdater;
public QParser qParser;
QCue selectedCue;
public QController(string address, int port)
{
qSender = new QSender(address, port);
qReceiver = new QReceiver(port+1, this);
qParser = new QParser();
qUpdater = new QUpdater(this);
qUpdater.Start();
qParser.SelectedCueUpdated += this.OnSelectedCueUpdated;
qReceiver.PacketReceived += qParser.OnPacketReceived;
}
public void sendCommand(string cmd){
qSender.sendString(cmd);
}
public void updateCueValue(QCue cue, string property, object newValue){
// qSender.sendArgs("/cue_id/"+cue.uniqueID+"/"+property, newValue);
}
public void OnSelectedCueUpdated(object source, CueEventArgs args)
{
selectedCue = args.SelectedCue;
//Console.WriteLine("Selected Cue Updated: Name=" + selectedCue.listName);
}
public void Kill(){
qReceiver.Close();
qUpdater.Kill();
}
}
}
@@ -0,0 +1,26 @@
//Currently deprecated would like to resurrect
using System;
using System.Collections.Generic;
using Zeroconf;
namespace qController
{
public class QFinder
{
public QFinder()
{
}
public async void SearchForWorkspaces()
{
IReadOnlyList<IZeroconfHost> results = await ZeroconfResolver.ResolveAsync("_qlab._udp.local.");
foreach (var result in results){
Console.WriteLine(result.IPAddress);
}
Console.WriteLine("Done");
}
}
}
@@ -0,0 +1,91 @@
using System;
using Rug.Osc;
using Newtonsoft.Json.Linq;
namespace qController
{
public class CueEventArgs : EventArgs
{
public QCue SelectedCue
{
get;
set;
}
}
public class AudioLevelArgs : EventArgs
{
public JToken levels
{
get;
set;
}
}
public class QParser
{
public QParser()
{
}
public delegate void SelectedCueUpdatedHandler(object source, CueEventArgs args);
public delegate void AudioLevelsUpdatedHandler(object source, AudioLevelArgs args);
public event SelectedCueUpdatedHandler SelectedCueUpdated;
public event AudioLevelsUpdatedHandler AudioLevelsUpdated;
public void ParsePacket(OscPacket packet){
OscMessage msg = (OscMessage)packet;
if (msg.Address.Contains("selectedCues"))
ParseSelectedCueInfo(msg);
else if (msg.Address.Contains("notes"))
ParseNoteInfo(msg);
else if (msg.Address.Contains("levels"))
ParseLevelInfo(msg);
}
public void OnPacketReceived(object source, PacketEventArgs args){
//Console.WriteLine("Packet Received");
ParsePacket(args.Packet);
}
public void ParseSelectedCueInfo(OscMessage msg){
JArray selectedCues = (JArray)OSC2JSON(msg);
if(selectedCues.Count > 0){
foreach(JObject item in selectedCues){
QCue parsedCue = new QCue(item);
OnSelectedCueUpdated(parsedCue);
}
}else{
Console.WriteLine("No Cues Selected");
}
}
public void ParseNoteInfo(OscMessage msg){
//JToken cueInfo = OSC2JSON(msg);
}
public void ParseLevelInfo(OscMessage msg){
JToken levels = OSC2JSON(msg)[0];
OnAudioLevelsUpdated(levels);
}
public JToken OSC2JSON(OscMessage Msg){
JObject json = JObject.Parse(Msg.ToArray()[0].ToString());
return json.GetValue("data");
}
protected virtual void OnSelectedCueUpdated(QCue cue)
{
if (SelectedCueUpdated != null)
SelectedCueUpdated(this, new CueEventArgs() { SelectedCue = cue });
}
protected virtual void OnAudioLevelsUpdated(JToken audioLevels){
if (AudioLevelsUpdated != null)
AudioLevelsUpdated(this, new AudioLevelArgs { levels = audioLevels });
}
}
}
@@ -0,0 +1,80 @@
using System;
using Rug.Osc;
using System.Net;
using System.Threading;
namespace qController
{
public class PacketEventArgs : EventArgs{
public OscPacket Packet {
get;
set;
}
}
public class QReceiver
{
static OscReceiver qReceiver;
static Thread thread;
private QController owner;
public delegate void PacketReceivedHandler(object source, PacketEventArgs args);
public event PacketReceivedHandler PacketReceived;
public QReceiver(int port, QController ctrl)
{
qReceiver = new OscReceiver(port);
thread = new Thread(new ThreadStart(ListenLoop));
owner = ctrl;
qReceiver.Connect();
thread.Start();
}
public void ListenLoop()
{
Console.WriteLine("Loop Started");
try
{
while (qReceiver.State != OscSocketState.Closed)
{
// if we are in a state to recieve
if (qReceiver.State == OscSocketState.Connected)
{
// get the next message
// this will block until one arrives or the socket is closed
OscPacket packet = qReceiver.Receive();
OnPacketReceived(packet);
// Write the packet to the console
// DO SOMETHING HERE!
}
}
}
catch (Exception ex)
{
// if the socket was connected when this happens
// then tell the user
if (qReceiver.State == OscSocketState.Connected)
{
Console.WriteLine("Exception in listen loop");
Console.WriteLine(ex.Message);
}
}
Console.WriteLine("Loop Ended");
}
public void Close(){
qReceiver.Close();
thread.Abort();
}
protected virtual void OnPacketReceived(OscPacket pkt){
if (PacketReceived != null)
PacketReceived(this, new PacketEventArgs(){Packet = pkt});
}
}
}
@@ -0,0 +1,31 @@
using System;
using System.Net;
using Rug.Osc;
namespace qController
{
public class QSender
{
OscSender qSender;
public QSender(string address, int port)
{
IPAddress ipAddress = IPAddress.Parse(address);
qSender = new OscSender(ipAddress, port);
}
public void sendString(string address) {
qSender.Connect();
qSender.Send(new OscMessage(address,new object[]{}));
qSender.Close();
}
public void sendArgs(string msg, object args){
qSender.Connect();
qSender.Send(new OscMessage(msg,args));
qSender.Close();
}
}
}
@@ -0,0 +1,27 @@
using System;
using Xamarin.Forms;
namespace qController
{
public class QUpdater
{
private bool active = true;
private QController qController;
public QUpdater(QController controller)
{
qController = controller;
}
public void Start(){
active = true;
Device.StartTimer(TimeSpan.FromSeconds(0.01), () => {
qController.sendCommand("/selectedCues");
qController.sendCommand("/cue/selected/levels");
return active;
});
}
public void Kill(){
active = false;
}
}
}