Commentaires
This commit is contained in:
parent
5f73763b51
commit
5e8a8f6095
8 changed files with 150 additions and 90 deletions
|
|
@ -18,7 +18,6 @@
|
||||||
<DefineConstants>DEBUG;</DefineConstants>
|
<DefineConstants>DEBUG;</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<ConsolePause>false</ConsolePause>
|
|
||||||
<Externalconsole>true</Externalconsole>
|
<Externalconsole>true</Externalconsole>
|
||||||
<Commandlineparameters>fullscreen aguibtn</Commandlineparameters>
|
<Commandlineparameters>fullscreen aguibtn</Commandlineparameters>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
@ -28,7 +27,6 @@
|
||||||
<OutputPath>bin\Release</OutputPath>
|
<OutputPath>bin\Release</OutputPath>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
|
||||||
<ConsolePause>false</ConsolePause>
|
<ConsolePause>false</ConsolePause>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -4,39 +4,85 @@ using System.Linq;
|
||||||
|
|
||||||
namespace DMX2
|
namespace DMX2
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Event data : Objet passé aux cibles d'evenements
|
||||||
|
/// </summary>
|
||||||
public struct EventData
|
public struct EventData
|
||||||
{
|
{
|
||||||
public string id;
|
public string id;
|
||||||
public byte value;
|
public byte value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interface pour les fournisseurs d'evenements
|
||||||
|
/// </summary>
|
||||||
public interface IEventProvider
|
public interface IEventProvider
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Renvoie le nom du sous menu associé au fournisseur d'evenements.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>
|
||||||
|
/// Le nom du menu.
|
||||||
|
/// </value>
|
||||||
string MenuName{ get; }
|
string MenuName{ get; }
|
||||||
//ICollection<string> GetEventList();
|
|
||||||
|
/// <summary>Demande au fournisseur de signaler l'evenement spécifié</summary>
|
||||||
|
/// <param name='eventId'>L'id de l'evenement.</param>
|
||||||
|
/// <returns><c>true</c> si le fournisseur reconnais l'id</returns>
|
||||||
bool Bind (string eventId);
|
bool Bind (string eventId);
|
||||||
|
|
||||||
|
/// <summary>Signale au fournisseur que l'evenement n'est plus attendu </summary>
|
||||||
|
/// <param name='eventId'>L'id de l'evenement.</param>
|
||||||
void Unbind (string eventId);
|
void Unbind (string eventId);
|
||||||
|
|
||||||
|
/// <summary>Demande la construction du sous-menu evenement au fournisseur</summary>
|
||||||
|
/// <returns>Le sous menu</returns>
|
||||||
|
/// <param name='state'>Un objet qui sera devra etre stocké dans Data[EventManager.StateKey]</param>
|
||||||
|
/// <param name='handler'>La delegate qui devra etre associée aux ButtonClickedEvent</param>
|
||||||
Gtk.Menu GetProviderSubMenu( EventManager.EventMenuData state, Gtk.ButtonPressEventHandler handler );
|
Gtk.Menu GetProviderSubMenu( EventManager.EventMenuData state, Gtk.ButtonPressEventHandler handler );
|
||||||
|
|
||||||
|
/// <summary>Appelé par le Timer de la conduite</summary>
|
||||||
|
/// <param name='callback'>Fonction a appeler pour chaque evenement.</param>
|
||||||
void ProcessEvents(EventManagerCallback callback);
|
void ProcessEvents(EventManagerCallback callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interface pour les recepteurs d'evenements.
|
||||||
|
/// </summary>
|
||||||
public interface IEventTarget
|
public interface IEventTarget
|
||||||
{
|
{
|
||||||
|
/// <summary>Fonction appelée lors d'un evenement</summary>
|
||||||
|
/// <returns>Vrai si l'evenement est traité</returns>
|
||||||
|
/// <param name='data'>Evenement</param>
|
||||||
bool FireEvent(EventData data);
|
bool FireEvent(EventData data);
|
||||||
|
|
||||||
|
/// <summary>Indique a la cible qu'on lui associe un evenement</summary>
|
||||||
|
/// <param name='id'>l'id de l'evenement</param>
|
||||||
void Bind(string id);
|
void Bind(string id);
|
||||||
|
|
||||||
|
/// <summary>Indique a la cible qu'on lui des associe un evenement</summary>
|
||||||
|
/// <param name='id'>l'id de l'evenement</param>
|
||||||
void Unbind(string id);
|
void Unbind(string id);
|
||||||
IEnumerable<string> IDs { get; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Callback sur evenement.
|
||||||
|
/// </summary>
|
||||||
public delegate void EventManagerCallback(EventData data);
|
public delegate void EventManagerCallback(EventData data);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Callback appele sur clic sur un bouton de menu de choix d'evenement
|
||||||
|
/// </summary>
|
||||||
public delegate void EventManagerMenuCallBack(object state, string eventId);
|
public delegate void EventManagerMenuCallBack(object state, string eventId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Cible generique d'evenement.
|
||||||
|
/// </summary>
|
||||||
public class actionEventTarget : IEventTarget {
|
public class actionEventTarget : IEventTarget {
|
||||||
public delegate bool EventAction (EventData data);
|
public delegate bool EventAction (EventData data);
|
||||||
EventAction action;
|
EventAction action;
|
||||||
List<string> eventIds = new List<string>();
|
|
||||||
public actionEventTarget(EventAction _action)
|
public actionEventTarget(EventAction _action)
|
||||||
{
|
{
|
||||||
action=_action;
|
action=_action;
|
||||||
|
|
@ -47,30 +93,17 @@ namespace DMX2
|
||||||
return action(data);
|
return action(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IEventTarget.Bind (string id)
|
void IEventTarget.Bind (string id){} // Rien a faire ici
|
||||||
{
|
void IEventTarget.Unbind (string id){}
|
||||||
if(!eventIds.Contains(id))
|
|
||||||
eventIds.Add(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IEventTarget.Unbind (string id)
|
|
||||||
{
|
|
||||||
eventIds.Remove(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
IEnumerable<string> IEventTarget.IDs {
|
|
||||||
get {
|
|
||||||
return eventIds;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class EventManager
|
public class EventManager
|
||||||
{
|
{
|
||||||
static public object StateKey = new object();
|
Dictionary<string,eventBinding> bindings = new Dictionary<string,eventBinding>();
|
||||||
static public object EventIdKey = new object();
|
List<IEventProvider> providers = new List<IEventProvider>();
|
||||||
|
|
||||||
class eventBinding
|
class eventBinding
|
||||||
{
|
{
|
||||||
|
|
@ -91,9 +124,6 @@ namespace DMX2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<string,eventBinding> bindings = new Dictionary<string,eventBinding>();
|
|
||||||
List<IEventProvider> providers = new List<IEventProvider>();
|
|
||||||
|
|
||||||
public EventManager ()
|
public EventManager ()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -102,15 +132,20 @@ namespace DMX2
|
||||||
public void RegisterProvider (IEventProvider prov)
|
public void RegisterProvider (IEventProvider prov)
|
||||||
{
|
{
|
||||||
providers.Add (prov);
|
providers.Add (prov);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Menus
|
||||||
|
// Cles pour association d'etat au elements de menu
|
||||||
|
static public object StateKey = new object();
|
||||||
|
static public object EventIdKey = new object();
|
||||||
|
|
||||||
|
// Objet associe aux menus afin de pourvoir retransmettre les infos au createur du menu
|
||||||
public class EventMenuData {
|
public class EventMenuData {
|
||||||
public EventManagerMenuCallBack CallBack;
|
public EventManagerMenuCallBack CallBack;
|
||||||
public object state;
|
public object state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary> Appelé par l'interface. L'objet 'state' sera retransmis tel quel lors de l'appel au callback </summary>
|
||||||
public Gtk.Menu GetMenu (object state, EventManagerMenuCallBack callback)
|
public Gtk.Menu GetMenu (object state, EventManagerMenuCallBack callback)
|
||||||
{
|
{
|
||||||
Gtk.Menu menu = new Gtk.Menu ();
|
Gtk.Menu menu = new Gtk.Menu ();
|
||||||
|
|
@ -126,6 +161,7 @@ namespace DMX2
|
||||||
if(provitem.Submenu!=null) menu.Add(provitem);
|
if(provitem.Submenu!=null) menu.Add(provitem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Creation de l'element 'Aucun' retournant un ID vide, pour permettre la desassociation
|
||||||
Gtk.MenuItem itemNone = new Gtk.MenuItem("Aucun");
|
Gtk.MenuItem itemNone = new Gtk.MenuItem("Aucun");
|
||||||
itemNone.Data[StateKey] = evd;
|
itemNone.Data[StateKey] = evd;
|
||||||
itemNone.Data[EventIdKey] = "";
|
itemNone.Data[EventIdKey] = "";
|
||||||
|
|
@ -136,14 +172,17 @@ namespace DMX2
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary> Traitement du clic sur les menus generes au dessus </summary>
|
||||||
void HandleButtonPressEvent (object o, Gtk.ButtonPressEventArgs args)
|
void HandleButtonPressEvent (object o, Gtk.ButtonPressEventArgs args)
|
||||||
{
|
{
|
||||||
Gtk.MenuItem item = o as Gtk.MenuItem;
|
Gtk.MenuItem item = o as Gtk.MenuItem;
|
||||||
EventMenuData evd = item.Data[EventManager.StateKey] as EventMenuData;
|
EventMenuData evd = item.Data[EventManager.StateKey] as EventMenuData; // On récupere l'objet d'etat et la fonction a rappeler
|
||||||
string id = item.Data[EventManager.EventIdKey] as string;
|
string id = item.Data[EventManager.EventIdKey] as string; // ainsi que l'id evenement
|
||||||
evd.CallBack(evd.state,id);
|
evd.CallBack(evd.state,id); // Appel de la fonction
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
///<summary> Appelé par le Timer de la conduite ... appel le traitement pour l'ensemble des fournisseurs </summary>
|
||||||
public void ProcessEvents ()
|
public void ProcessEvents ()
|
||||||
{
|
{
|
||||||
foreach (IEventProvider prov in providers) {
|
foreach (IEventProvider prov in providers) {
|
||||||
|
|
@ -156,6 +195,7 @@ namespace DMX2
|
||||||
providers.Remove(prov);
|
providers.Remove(prov);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary> Enregistrement d'une association id => cible
|
||||||
public bool Bind (string eventId, IEventTarget target)
|
public bool Bind (string eventId, IEventTarget target)
|
||||||
{
|
{
|
||||||
if(!bindings.ContainsKey(eventId))
|
if(!bindings.ContainsKey(eventId))
|
||||||
|
|
@ -168,6 +208,7 @@ namespace DMX2
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary> Desenregistrement de toutes les associations d'une cible</summary>
|
||||||
public void Unbind (IEventTarget target)
|
public void Unbind (IEventTarget target)
|
||||||
{
|
{
|
||||||
var q = from bind in bindings where bind.Value.Targets.Contains(target) select bind.Key;
|
var q = from bind in bindings where bind.Value.Targets.Contains(target) select bind.Key;
|
||||||
|
|
@ -175,7 +216,7 @@ namespace DMX2
|
||||||
Unbind(id,target);
|
Unbind(id,target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary> Desenregistrement d'une association id => cible</summary>
|
||||||
public void Unbind (string eventId, IEventTarget target)
|
public void Unbind (string eventId, IEventTarget target)
|
||||||
{
|
{
|
||||||
if (!bindings.ContainsKey (eventId)) return;
|
if (!bindings.ContainsKey (eventId)) return;
|
||||||
|
|
@ -190,6 +231,7 @@ namespace DMX2
|
||||||
target.Unbind(eventId);
|
target.Unbind(eventId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary> Fonction appelee sur evenement</summary>
|
||||||
public void EventCallBack (EventData data)
|
public void EventCallBack (EventData data)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Event {0} => {1}",data.id,data.value);
|
Console.WriteLine("Event {0} => {1}",data.id,data.value);
|
||||||
|
|
@ -197,14 +239,18 @@ namespace DMX2
|
||||||
foreach (IEventTarget target in bindings[data.id].Targets) {
|
foreach (IEventTarget target in bindings[data.id].Targets) {
|
||||||
target.FireEvent(data);
|
target.FireEvent(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool SaveBindings (System.Xml.XmlElement xmlParent, IEventTarget target)
|
public bool SaveBindings (System.Xml.XmlElement xmlParent, IEventTarget target)
|
||||||
{
|
{
|
||||||
bool ret=false;
|
bool ret=false;
|
||||||
System.Xml.XmlElement xmlB;
|
System.Xml.XmlElement xmlB;
|
||||||
foreach (string id in target.IDs) {
|
var q = from bind in bindings
|
||||||
|
where bind.Value.Targets.Contains(target)
|
||||||
|
select bind.Key;
|
||||||
|
|
||||||
|
foreach (string id in q) {
|
||||||
ret=true;
|
ret=true;
|
||||||
xmlParent.AppendChild(xmlB = xmlParent.OwnerDocument.CreateElement("EventBinding"));
|
xmlParent.AppendChild(xmlB = xmlParent.OwnerDocument.CreateElement("EventBinding"));
|
||||||
xmlB.SetAttribute("id",id);
|
xmlB.SetAttribute("id",id);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@ namespace DMX2
|
||||||
{
|
{
|
||||||
public partial class MidiEventProvider : IEventProvider
|
public partial class MidiEventProvider : IEventProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Classe pour contenir et gérer un unique Handle d'acces au sequenceur midi Alsa.
|
||||||
|
/// </summary>
|
||||||
public class MidiSeqHandle : IDisposable
|
public class MidiSeqHandle : IDisposable
|
||||||
{
|
{
|
||||||
static MidiSeqHandle singleton = new MidiSeqHandle();
|
static MidiSeqHandle singleton = new MidiSeqHandle();
|
||||||
|
|
@ -18,7 +22,7 @@ namespace DMX2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public MidiSeqHandle(){
|
MidiSeqHandle(){
|
||||||
snd_seq_open(out midi_seq_handle, "default",SND_SEQ_OPEN_DUPLEX,0);
|
snd_seq_open(out midi_seq_handle, "default",SND_SEQ_OPEN_DUPLEX,0);
|
||||||
snd_seq_set_client_name(midi_seq_handle,"DMX2");
|
snd_seq_set_client_name(midi_seq_handle,"DMX2");
|
||||||
snd_seq_create_simple_port(midi_seq_handle,"dmx_ctrl",
|
snd_seq_create_simple_port(midi_seq_handle,"dmx_ctrl",
|
||||||
|
|
@ -27,13 +31,16 @@ namespace DMX2
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IDisposable implementation
|
#region IDisposable implementation
|
||||||
public void Dispose ()
|
void IDisposable.Dispose ()
|
||||||
{
|
{
|
||||||
if(midi_seq_handle != IntPtr.Zero)
|
if(midi_seq_handle != IntPtr.Zero)
|
||||||
snd_seq_close(midi_seq_handle);
|
snd_seq_close(midi_seq_handle);
|
||||||
midi_seq_handle = IntPtr.Zero;
|
midi_seq_handle = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
~MidiSeqHandle(){
|
||||||
|
((IDisposable)this).Dispose ();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,8 +54,10 @@ namespace DMX2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Dictionary<string,internalEvent> eventlist = new Dictionary<string, internalEvent>();
|
Dictionary<string,internalEvent> eventlist = new Dictionary<string, internalEvent>();
|
||||||
|
EventData last;
|
||||||
|
internalEvent levent=null;
|
||||||
|
bool connected=false;
|
||||||
|
|
||||||
public MidiEventProvider (EventManager manager)
|
public MidiEventProvider (EventManager manager)
|
||||||
{
|
{
|
||||||
|
|
@ -56,27 +65,24 @@ namespace DMX2
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IEventProvider implementation
|
#region IEventProvider implementation
|
||||||
/*ICollection<string> IEventProvider.GetEventList ()
|
|
||||||
{
|
|
||||||
return eventlist.Keys;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
bool IEventProvider.Bind (string eventId)
|
bool IEventProvider.Bind (string eventId)
|
||||||
{
|
{
|
||||||
|
// On indique a l'EventManager qu'on traite, si l'ID commence par 'MIDI-'
|
||||||
return eventId.StartsWith("MIDI-");
|
return eventId.StartsWith("MIDI-");
|
||||||
}
|
}
|
||||||
|
|
||||||
void IEventProvider.Unbind (string eventId)
|
void IEventProvider.Unbind (string eventId)
|
||||||
{
|
{
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Gtk.Menu IEventProvider.GetProviderSubMenu (EventManager.EventMenuData state, Gtk.ButtonPressEventHandler handler)
|
Gtk.Menu IEventProvider.GetProviderSubMenu (EventManager.EventMenuData state, Gtk.ButtonPressEventHandler handler)
|
||||||
{
|
{
|
||||||
if(!connected) return null;
|
if(!connected) return null; // Si pas encore recu d'evenements => pas de menu
|
||||||
Gtk.Menu retmenu = new Gtk.Menu ();
|
Gtk.Menu retmenu = new Gtk.Menu ();
|
||||||
if (levent != null) {
|
|
||||||
|
if (levent != null) { // Creation du sous menu "Dernier"
|
||||||
Gtk.MenuItem lmenuitem = new Gtk.MenuItem ("Dernier");
|
Gtk.MenuItem lmenuitem = new Gtk.MenuItem ("Dernier");
|
||||||
retmenu.Add (lmenuitem);
|
retmenu.Add (lmenuitem);
|
||||||
Gtk.Menu lmenu = new Gtk.Menu ();
|
Gtk.Menu lmenu = new Gtk.Menu ();
|
||||||
|
|
@ -87,13 +93,14 @@ namespace DMX2
|
||||||
item.ButtonPressEvent += handler;
|
item.ButtonPressEvent += handler;
|
||||||
lmenu.Add (item);
|
lmenu.Add (item);
|
||||||
}
|
}
|
||||||
Gtk.MenuItem evmenuitem = new Gtk.MenuItem ("Events");
|
|
||||||
|
Gtk.MenuItem evmenuitem = new Gtk.MenuItem ("Events"); // Creation du sous menu "Events"
|
||||||
retmenu.Add (evmenuitem);
|
retmenu.Add (evmenuitem);
|
||||||
Gtk.Menu evmenu = new Gtk.Menu ();
|
Gtk.Menu evmenu = new Gtk.Menu ();
|
||||||
evmenuitem.Submenu = evmenu;
|
evmenuitem.Submenu = evmenu;
|
||||||
|
|
||||||
List<string> sortedKeys = eventlist.Keys.ToList();
|
List<string> sortedKeys = eventlist.Keys.ToList(); // On recupere des IDs
|
||||||
sortedKeys.Sort();
|
sortedKeys.Sort(); // et on les trie
|
||||||
|
|
||||||
foreach ( string key in sortedKeys ) {
|
foreach ( string key in sortedKeys ) {
|
||||||
internalEvent evt= eventlist[key];
|
internalEvent evt= eventlist[key];
|
||||||
|
|
@ -108,27 +115,26 @@ namespace DMX2
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EventData last; internalEvent levent=null;
|
|
||||||
bool connected=false;
|
|
||||||
|
|
||||||
void IEventProvider.ProcessEvents (EventManagerCallback callback)
|
void IEventProvider.ProcessEvents (EventManagerCallback callback)
|
||||||
{
|
{
|
||||||
IntPtr evPtr;
|
IntPtr evPtr; // Pointeur vers la structure non managée alsa-seq
|
||||||
|
|
||||||
|
// Tant qu'il y des evenements midi en attente
|
||||||
while ((snd_seq_event_input_pending(MidiSeqHandle.Handle,1))>0) {
|
while ((snd_seq_event_input_pending(MidiSeqHandle.Handle,1))>0) {
|
||||||
snd_seq_event_input(MidiSeqHandle.Handle, out evPtr);
|
snd_seq_event_input(MidiSeqHandle.Handle, out evPtr); // Recup du pointeur vers l'ev
|
||||||
snd_seq_event_t evS =(snd_seq_event_t) Marshal.PtrToStructure(evPtr,typeof(snd_seq_event_t));
|
snd_seq_event_t evS =(snd_seq_event_t) Marshal.PtrToStructure(evPtr,typeof(snd_seq_event_t)); // Copie de la zone mémoire dans une structure managee
|
||||||
snd_seq_free_event(evPtr);
|
snd_seq_free_event(evPtr); // liberation du pointeur
|
||||||
|
|
||||||
string id=null, description=null; int value=0;
|
string id=null, description=null; int value=0;
|
||||||
|
|
||||||
switch (evS.type) {
|
switch (evS.type) {
|
||||||
case snd_seq_event_type_t.SND_SEQ_EVENT_PORT_SUBSCRIBED:
|
case snd_seq_event_type_t.SND_SEQ_EVENT_PORT_SUBSCRIBED: // Connection d'un périph midi
|
||||||
connected = true;
|
connected = true;
|
||||||
continue;
|
continue;
|
||||||
case snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER:
|
case snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER:
|
||||||
id= string.Format("MIDI-CTRL-C{0}P{1}",evS.data_ev_ctrl.channel,evS.data_ev_ctrl.param);
|
id= string.Format("MIDI-CTRL-C{0}P{1}",evS.data_ev_ctrl.channel,evS.data_ev_ctrl.param);
|
||||||
description = string.Format("Controller Ch {0} Param {1}",evS.data_ev_ctrl.channel,evS.data_ev_ctrl.param);
|
description = string.Format("Controller Ch {0} Param {1}",evS.data_ev_ctrl.channel,evS.data_ev_ctrl.param);
|
||||||
value = 255 * evS.data_ev_ctrl.value / 127;
|
value = 255 * evS.data_ev_ctrl.value / 127; // Conversion {0,127} => {0,255}
|
||||||
break;
|
break;
|
||||||
case snd_seq_event_type_t.SND_SEQ_EVENT_NOTEON:
|
case snd_seq_event_type_t.SND_SEQ_EVENT_NOTEON:
|
||||||
id= string.Format("MIDI-NOTE-C{0}N{1}",evS.data_ev_note.channel, evS.data_ev_note.note );
|
id= string.Format("MIDI-NOTE-C{0}N{1}",evS.data_ev_note.channel, evS.data_ev_note.note );
|
||||||
|
|
@ -147,24 +153,28 @@ namespace DMX2
|
||||||
//TODO : Regarder si d'autres controles interessants.
|
//TODO : Regarder si d'autres controles interessants.
|
||||||
default:
|
default:
|
||||||
id= null;
|
id= null;
|
||||||
Info.Publish(string.Format ("event {0}", evS.type) );
|
#if DEBUG
|
||||||
|
Info.Publish(string.Format ("event {0}", evS.type) ); // On affiche les evenements inconnus
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
connected=true;
|
connected=true;
|
||||||
|
|
||||||
if(id!=null)
|
if(id!=null)
|
||||||
{
|
{
|
||||||
if(!eventlist.ContainsKey(id))
|
if(!eventlist.ContainsKey(id))
|
||||||
eventlist.Add(id,new internalEvent(id,description));
|
eventlist.Add(id,new internalEvent(id,description));
|
||||||
levent= eventlist[id];
|
levent= eventlist[id]; //Dernier Evenement recu conserve pour menu
|
||||||
EventData evData = new EventData();
|
EventData evData = new EventData();
|
||||||
evData.id = id;
|
evData.id = id;
|
||||||
evData.value = (byte)value;
|
evData.value = (byte)value;
|
||||||
if(evData.Equals(last)) continue;
|
|
||||||
|
if(evData.Equals(last)) continue; // On ignore les evenements répétés à l'identique
|
||||||
|
|
||||||
callback(evData);
|
callback(evData);
|
||||||
last = evData;
|
last = evData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,9 +185,6 @@ namespace DMX2
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,9 @@ namespace DMX2
|
||||||
public abstract SequenceurUI GetUI();
|
public abstract SequenceurUI GetUI();
|
||||||
|
|
||||||
public abstract int ValeurCircuit(Circuit c);
|
public abstract int ValeurCircuit(Circuit c);
|
||||||
|
|
||||||
public abstract void Tick(TimeSpan time);
|
public abstract void Tick(TimeSpan time);
|
||||||
|
|
||||||
public static Sequenceur Load (Conduite conduite, XmlElement el)
|
public static Sequenceur Load (Conduite conduite, XmlElement el)
|
||||||
{
|
{
|
||||||
switch (el.Name) {
|
switch (el.Name) {
|
||||||
|
|
@ -66,10 +68,6 @@ namespace DMX2
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*public virtual void MajCircuitsSupprimes()
|
|
||||||
{
|
|
||||||
}*/
|
|
||||||
|
|
||||||
public abstract void Save (XmlElement parent);
|
public abstract void Save (XmlElement parent);
|
||||||
|
|
||||||
public abstract void Command (string command);
|
public abstract void Command (string command);
|
||||||
|
|
|
||||||
|
|
@ -152,11 +152,11 @@ namespace DMX2
|
||||||
valeursrecues.Remove(id);
|
valeursrecues.Remove(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<string> IEventTarget.IDs {
|
/*IEnumerable<string> IEventTarget.IDs {
|
||||||
get {
|
get {
|
||||||
return valeursrecues.Keys;
|
return valeursrecues.Keys;
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -531,20 +531,20 @@ namespace DMX2
|
||||||
|
|
||||||
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("Master"));
|
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("Master"));
|
||||||
xmlEl.SetAttribute("value",master.ToString());
|
xmlEl.SetAttribute("value",master.ToString());
|
||||||
EventManager.SaveBindings(xmlEl,masterEventTarget);
|
Conduite.Courante.EventManager.SaveBindings(xmlEl,masterEventTarget);
|
||||||
|
|
||||||
xmlEl = parent.OwnerDocument.CreateElement ("EffetSuivant");
|
xmlEl = parent.OwnerDocument.CreateElement ("EffetSuivant");
|
||||||
if(EventManager.SaveBindings(xmlEl,goNextEventTarget )) el.AppendChild(xmlEl);
|
if(Conduite.Courante.EventManager.SaveBindings(xmlEl,goNextEventTarget )) el.AppendChild(xmlEl);
|
||||||
|
|
||||||
xmlEl = parent.OwnerDocument.CreateElement ("EffetPrecedent");
|
xmlEl = parent.OwnerDocument.CreateElement ("EffetPrecedent");
|
||||||
if(EventManager.SaveBindings(xmlEl,goBackEventTarget )) el.AppendChild(xmlEl);
|
if(Conduite.Courante.EventManager.SaveBindings(xmlEl,goBackEventTarget )) el.AppendChild(xmlEl);
|
||||||
|
|
||||||
foreach (Circuit c in circuitsSeq) {
|
foreach (Circuit c in circuitsSeq) {
|
||||||
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("CircuitSeq"));
|
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("CircuitSeq"));
|
||||||
xmlEl.SetAttribute("id",c.ID.ToString());
|
xmlEl.SetAttribute("id",c.ID.ToString());
|
||||||
|
|
||||||
if(targets.ContainsKey(c))
|
if(targets.ContainsKey(c))
|
||||||
EventManager.SaveBindings(xmlEl,targets[c]);
|
Conduite.Courante.EventManager.SaveBindings(xmlEl,targets[c]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -439,13 +439,13 @@ namespace DMX2
|
||||||
|
|
||||||
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("Master"));
|
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("Master"));
|
||||||
xmlEl.SetAttribute("value",master.ToString());
|
xmlEl.SetAttribute("value",master.ToString());
|
||||||
EventManager.SaveBindings(xmlEl,masterEventTarget);
|
Conduite.Courante.EventManager.SaveBindings(xmlEl,masterEventTarget);
|
||||||
|
|
||||||
xmlEl = parent.OwnerDocument.CreateElement ("EffetSuivant");
|
xmlEl = parent.OwnerDocument.CreateElement ("EffetSuivant");
|
||||||
if(EventManager.SaveBindings(xmlEl,goNextEventTarget )) el.AppendChild(xmlEl);
|
if(Conduite.Courante.EventManager.SaveBindings(xmlEl,goNextEventTarget )) el.AppendChild(xmlEl);
|
||||||
|
|
||||||
xmlEl = parent.OwnerDocument.CreateElement ("EffetPrecedent");
|
xmlEl = parent.OwnerDocument.CreateElement ("EffetPrecedent");
|
||||||
if(EventManager.SaveBindings(xmlEl,goBackEventTarget )) el.AppendChild(xmlEl);
|
if(Conduite.Courante.EventManager.SaveBindings(xmlEl,goBackEventTarget )) el.AppendChild(xmlEl);
|
||||||
|
|
||||||
foreach (Circuit c in circuitsSeq) {
|
foreach (Circuit c in circuitsSeq) {
|
||||||
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("CircuitSeq"));
|
el.AppendChild(xmlEl = parent.OwnerDocument.CreateElement ("CircuitSeq"));
|
||||||
|
|
|
||||||
|
|
@ -268,10 +268,10 @@ namespace DMX2
|
||||||
l.Save(el);
|
l.Save(el);
|
||||||
|
|
||||||
XmlElement xmlEl = parent.OwnerDocument.CreateElement ("EffetSuivant");
|
XmlElement xmlEl = parent.OwnerDocument.CreateElement ("EffetSuivant");
|
||||||
if(EventManager.SaveBindings(xmlEl,goNextEventTarget )) el.AppendChild(xmlEl);
|
if(Conduite.Courante.EventManager.SaveBindings(xmlEl,goNextEventTarget )) el.AppendChild(xmlEl);
|
||||||
|
|
||||||
xmlEl = parent.OwnerDocument.CreateElement ("EffetPrecedent");
|
xmlEl = parent.OwnerDocument.CreateElement ("EffetPrecedent");
|
||||||
if(EventManager.SaveBindings(xmlEl,goBackEventTarget )) el.AppendChild(xmlEl);
|
if(Conduite.Courante.EventManager.SaveBindings(xmlEl,goBackEventTarget )) el.AppendChild(xmlEl);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,20 @@ using System.Xml;
|
||||||
|
|
||||||
namespace DMX2
|
namespace DMX2
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Univers DMX.
|
||||||
|
/// Chaque univers DMX représente un patch des circuits virtuels sur 512 dimmers DMX
|
||||||
|
/// </summary>
|
||||||
public class UniversDMX
|
public class UniversDMX
|
||||||
{
|
{
|
||||||
|
/// <summary> structure indiquant le mode de calcul d'un octet sur la tramme DMX </summary>
|
||||||
|
public struct Dimmer {
|
||||||
|
public Circuit circuitAssocié;
|
||||||
|
public FTransfer fonctionTransfert;
|
||||||
|
public float param1; // Paramètres pour fonction de transfert
|
||||||
|
public float param2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static int maxid=1;
|
public static int maxid=1;
|
||||||
|
|
||||||
|
|
@ -32,6 +44,7 @@ namespace DMX2
|
||||||
return allumageForce;
|
return allumageForce;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Nom;
|
public string Nom;
|
||||||
public enum FTransfer {
|
public enum FTransfer {
|
||||||
lineaire,
|
lineaire,
|
||||||
|
|
@ -39,13 +52,6 @@ namespace DMX2
|
||||||
exp
|
exp
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct Dimmer {
|
|
||||||
public Circuit circuitAssocié;
|
|
||||||
public FTransfer fonctionTransfert;
|
|
||||||
public float param1; // Paramètres pour fonction de transfert
|
|
||||||
public float param2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dimmer[] Dimmers {
|
public Dimmer[] Dimmers {
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
|
@ -53,7 +59,10 @@ namespace DMX2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Calcule la trame DMX </summary>
|
||||||
|
/// <param name='valeurs'> tampon pour le stockage de la trame calculée </param>
|
||||||
|
/// <param name='offset'> Offset de début de trame dans le tampon </param>
|
||||||
|
/// <param name='count'> Nombre d'octets a calculer </param>
|
||||||
public void CalculUnivers(byte[] valeurs, int offset, int count)
|
public void CalculUnivers(byte[] valeurs, int offset, int count)
|
||||||
{
|
{
|
||||||
Dimmer g;
|
Dimmer g;
|
||||||
|
|
@ -72,8 +81,10 @@ namespace DMX2
|
||||||
valeurs[i+offset] = (byte)( g.circuitAssocié.ValeurCourante * g.param1 /100);
|
valeurs[i+offset] = (byte)( g.circuitAssocié.ValeurCourante * g.param1 /100);
|
||||||
break;
|
break;
|
||||||
case FTransfer.log:
|
case FTransfer.log:
|
||||||
|
// TODO : Ft Log
|
||||||
break;
|
break;
|
||||||
case FTransfer.exp:
|
case FTransfer.exp:
|
||||||
|
// TODO : Ft Exp
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException ();
|
throw new ArgumentOutOfRangeException ();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue