From 4ca07bbef0bc8b2ae715f2bf1fcf700e9627427a Mon Sep 17 00:00:00 2001 From: tzim Date: Wed, 21 May 2014 20:10:16 +0000 Subject: [PATCH] correction du mode de pagination --- DMX-2.0/MidiEventProvider.cs | 126 ++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 47 deletions(-) diff --git a/DMX-2.0/MidiEventProvider.cs b/DMX-2.0/MidiEventProvider.cs index 85f6e2c..79fbff8 100644 --- a/DMX-2.0/MidiEventProvider.cs +++ b/DMX-2.0/MidiEventProvider.cs @@ -28,8 +28,10 @@ namespace DMX2 class internalEvent { - public string InternalName{ get; set; } + readonly string internalName; bool bound=false; + readonly int page; + readonly int midiEvCode; public bool Bound { get { @@ -40,26 +42,40 @@ namespace DMX2 } } - public internalEvent(string _id) - { - InternalName=_id; + public string InternalName { + get { + return internalName; + } } - - int[] sources=null; - public IEnumerable Sources { + public int Page { get { - if(sources == null || sources.Length!=lastknownvalues.Count) sources = lastknownvalues.Keys.ToArray(); - return sources; + return page; + } + } + + public int MidiEvCode { + get { + return midiEvCode; } } - readonly Dictionary lastknownvalues = new Dictionary(); + public internalEvent(string _id, int _page, int _evHCode) + { + internalName=_id; + page=_page; + midiEvCode = _evHCode; + } - public Dictionary LastKnownValues { + byte lastknownvalue; + + public byte LastKnownValue { get { - return lastknownvalues; + return lastknownvalue; + } + set { + lastknownvalue = value; } } @@ -75,17 +91,14 @@ namespace DMX2 } abstract class feedbackinfo : IFeedbackInfo { - MidiEventProvider prov; + readonly internalEvent iev; protected AlsaSeqLib.snd_seq_event_t ev; - string eventId; - int page; - public feedbackinfo(MidiEventProvider _prov, string _eventId, int _page){ + public feedbackinfo(MidiEventProvider _prov, internalEvent _iev){ prov = _prov; - eventId = _eventId; - page = _page; + iev=_iev; } protected abstract bool UpdateEvent(byte data); @@ -93,33 +106,29 @@ namespace DMX2 #region IFeedbackInfo implementation bool IFeedbackInfo.FeedBack (byte data) { - if (!prov.eventlist.ContainsKey (eventId)) - return false; bool update = UpdateEvent (data); + iev.StoredEvent = ev; + if (!update) return true; - prov.eventlist[eventId].StoredEvent = ev; + iev.LastKnownValue = data; - if(!update) return true; - - foreach (var src in prov.eventlist[eventId].Sources) { - if(prov.HasFeedback(src)) - { - prov.eventlist[eventId].LastKnownValues[src]=data; + if (prov.CurrentPage == iev.Page || iev.Page == 0) { + prov.SendEvent (ev); + foreach (int srcid in prov.feedbacksources) { + int lnvk = srcid ^ iev.MidiEvCode; + prov.lastKnownValues[lnvk] = data; } } - if(prov.CurrentPage == page || page == 0) - prov.SendEvent (ev); - return true; } #endregion } class ctrlfeedbackinfo : feedbackinfo { - public ctrlfeedbackinfo(MidiEventProvider _prov, string _eventId, int _page, byte channel,uint param) - :base(_prov,_eventId,_page) + public ctrlfeedbackinfo(MidiEventProvider _prov, internalEvent _iev, byte channel,uint param) + :base(_prov,_iev) { ev = new AlsaSeqLib.snd_seq_event_t(); ev.data_ev_ctrl.channel = channel; @@ -137,8 +146,8 @@ namespace DMX2 } class pitchbendfeedbackinfo : feedbackinfo { - public pitchbendfeedbackinfo(MidiEventProvider _prov, string _eventId,int _page, byte channel) - :base(_prov,_eventId,_page) + public pitchbendfeedbackinfo(MidiEventProvider _prov, internalEvent _iev, byte channel) + :base(_prov,_iev) { ev = new AlsaSeqLib.snd_seq_event_t(); ev.data_ev_ctrl.channel = channel; @@ -175,6 +184,7 @@ namespace DMX2 readonly Dictionary knowndevices = new Dictionary(); readonly List feedbacksources = new List(); readonly List unpaginatedchannels = new List(); + readonly Dictionary lastKnownValues = new Dictionary(); EventData last; @@ -265,21 +275,38 @@ namespace DMX2 public void Refresh () { - string pageStr = string.Format("PAGE{0}",page); foreach (var ievent in eventlist.Values) { - if (ievent.InternalName.Contains(pageStr)){ + if (ievent.Page == page){ SendEvent(ievent.StoredEvent); + foreach(int src in feedbacksources){ + int lnvk = src ^ ievent.MidiEvCode; + lastKnownValues[lnvk] = ievent.LastKnownValue; + } } } } #region IEventProvider implementation + + static System.Text.RegularExpressions.Regex regexEventID = new System.Text.RegularExpressions.Regex( + @"MIDI-PAGE(?\d+)-(?.+)", + System.Text.RegularExpressions.RegexOptions.Compiled); + bool IEventProvider.Bind (string eventId) { // On indique a l'EventManager qu'on traite, si l'ID commence par 'MIDI-' - if(! eventId.StartsWith("MIDI-")) return false; - if(! eventlist.ContainsKey(eventId)) eventlist.Add(eventId, new internalEvent(eventId)); + if (! eventId.StartsWith ("MIDI-")) + return false; + + if (! eventlist.ContainsKey (eventId)) { + var res = regexEventID.Match (eventId); + if (!res.Success) return false; + int _page = byte.Parse (res.Groups ["page"].Value); + int _evHC = res.Groups["id"].Value.GetHashCode(); + eventlist.Add (eventId, new internalEvent (eventId,_page,_evHC )); + } + eventlist[eventId].Bound = true; return true; } @@ -346,11 +373,11 @@ namespace DMX2 connected = true; continue; case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER: - if(evS.data_ev_ctrl.param==127 && value>0){ + if(evS.data_ev_ctrl.param==127 && evS.data_ev_ctrl.value >0){ CurrentPage++; continue; } - if(evS.data_ev_ctrl.param==126 && value>0){ + if(evS.data_ev_ctrl.param==126 && evS.data_ev_ctrl.value>0){ CurrentPage--; continue; } @@ -401,6 +428,8 @@ namespace DMX2 if(id!=null) { + int evHC = id.GetHashCode(); + if(channel == 255 || unpaginatedchannels.Contains(channel)) evpage= 0; else @@ -410,19 +439,20 @@ namespace DMX2 if(!eventlist.ContainsKey(id)) - eventlist.Add(id,new internalEvent(id)); + eventlist.Add(id,new internalEvent(id,page,evHC)); levent= eventlist[id]; //Dernier Evenement recu conserve pour menu int srcid = evS.source.client <<8 + evS.source.port; - if(!eventlist[id].LastKnownValues.ContainsKey(srcid)) - eventlist[id].LastKnownValues[srcid] = (byte)value; + int lnvk = srcid ^ evHC; + if(!lastKnownValues.ContainsKey(lnvk)) + lastKnownValues[lnvk]= (byte)value; EventData evData = new EventData(); evData.id = id; evData.value = (byte)value; - evData.prev_value = eventlist[id].LastKnownValues[srcid]; + evData.prev_value = lastKnownValues[lnvk]; - eventlist[id].LastKnownValues[srcid] = (byte)value; + lastKnownValues[lnvk] = (byte)value; if(evData.Equals(last)) continue; last = evData; @@ -457,19 +487,21 @@ namespace DMX2 IFeedbackInfo IEventProvider.GetFeedbackInfo (string eventId) { + if(!eventlist.ContainsKey(eventId)) return null; + var res = regexCtrlEventID.Match (eventId); if (res.Success) { Console.WriteLine("Succes"); byte chan = byte.Parse (res.Groups ["chan"].Value); uint param = uint.Parse (res.Groups ["param"].Value); - return new ctrlfeedbackinfo (this, eventId, page, chan, param); + return new ctrlfeedbackinfo (this, eventlist[eventId],chan, param); } res = regexPbEventID.Match (eventId); if (res.Success) { Console.WriteLine("Succes"); byte chan = byte.Parse (res.Groups ["chan"].Value); - return new pitchbendfeedbackinfo (this, eventId,page, chan); + return new pitchbendfeedbackinfo (this, eventlist[eventId], chan); } return null;