mirror of
https://github.com/jwetzell/qController.git
synced 2026-08-19 14:14:22 +00:00
Initial check-in of module qController
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user