using System; using System.Collections.Generic; using System.Diagnostics; using System.Collections.ObjectModel; using System.Threading; using System.Xml; namespace DMX2 { public class Conduite : IComparer, IDisposable { public static Conduite Courante = null; Timer timer = null; DateTime dernierTick; DateTime derniereMaj; string _name; int master=100; List circuits = new List(); List univers = new List(); List drivers = new List(); SequenceurMaitre seqmaitre = new SequenceurMaitre(); public Conduite() { timer = new Timer(new TimerCallback(TimerTick),this, 1000,10); derniereMaj = dernierTick=DateTime.Now; // Crée l'univers par défaut var u = new UniversDMX(); Patches.Add(u); u.Nom = "Univers par Défaut"; Pause = false; } public ReadOnlyCollection Circuits { get { return circuits.AsReadOnly(); } } public Circuit NouveauCircuit () { lock (this) { Circuit c = new Circuit (); circuits.Add (c); return c; } } /* public void SupprimeCircuits (IEnumerable lc) { lock (this) { foreach(var c in lc) circuits.Remove (c); foreach(var seq in Sequenceurs) seq.MajCircuitsSupprimes(); } }*/ public Circuit GetCircuitByID (int i) { foreach(Circuit c in circuits) if(c.ID == i) return c; return null; } public string Name { get { return _name; } set { _name = value; } } public int Master { get { return master; } set { master= value; } } public bool Pause { get; set; } public bool BlackOut { get; set ; } public SequenceurMaitre SequenceurMaitre { get { return seqmaitre; } } public List Drivers { get { return drivers; } } int IComparer.Compare (Circuit x, Circuit y) { return Conduite.Courante.circuits.IndexOf(x) - Conduite.Courante.circuits.IndexOf(y); } List sequenceurs= new List(); public ReadOnlyCollection Sequenceurs { get { return sequenceurs.AsReadOnly(); } } public void AjoutSequenceur (Sequenceur seq) { lock (this) { sequenceurs.Add(seq); seq.Renamed += SequenceurRenomme; } } void SequenceurRenomme (object sender, Sequenceur.SeqRenamedEventArgs e) { MainWindow.Win.NextUpdateFull(); } public Sequenceur GetSeqByID (int i) { foreach(Sequenceur seq in sequenceurs) if(seq.ID == i) return seq; return null; } public List Patches { get { return univers; } } static public void TimerTick (object state) { Conduite.Courante.Tick(); } void Tick () { DateTime tickTime = DateTime.Now; TimeSpan deltaT = tickTime - dernierTick; dernierTick = tickTime; if (!Pause) { if (deltaT > TimeSpan.FromMilliseconds (15)) Info.Publish(string.Format ("{0}", deltaT)); lock (this) { seqmaitre.Tick (deltaT); // 'Actionne' les sequenceurs foreach (var seq in sequenceurs) { seq.Tick (deltaT); } // Mets a jour les valeurs circuits. if(BlackOut) { foreach (var c in circuits) c.ValeurCourante = 0; } else { foreach (var c in circuits) { int val = 0; foreach (var seq in Sequenceurs) { val = Math.Max (val, seq.ValeurCircuit (c)); } c.ValeurCourante = val * master / 100; } } } // Cette fonction retourne quasi immédiatement, même si il y'a beaucoup a faire sur l'affichage } if(tickTime - derniereMaj > TimeSpan.FromMilliseconds(50)){ MainWindow.Win.ScheduleUpdate(); derniereMaj = DateTime.Now; } } #region IDisposable implementation bool disposed=false; public void Dispose() { disposed=true; if(timer!=null) timer.Dispose(); foreach(var driver in Drivers) driver.Dispose(); timer=null; } void IDisposable.Dispose () { if(!disposed) Dispose(); } #endregion #region Sauvegarde public XmlDocument Save () { XmlDocument xmlDoc = new XmlDocument (); XmlElement xmlRoot = xmlDoc.CreateElement ("Conduite"); xmlDoc.AppendChild (xmlRoot); xmlRoot.SetAttribute ("nom", this.Name); XmlElement xmlCircuits = xmlDoc.CreateElement ("Circuits"); xmlRoot.AppendChild (xmlCircuits); foreach (Circuit c in circuits) { c.Save(xmlCircuits); } XmlElement xmlSequenceurs = xmlDoc.CreateElement("Sequenceurs"); xmlRoot.AppendChild(xmlSequenceurs); foreach(Sequenceur seq in sequenceurs) { seq.Save(xmlSequenceurs); } XmlElement xmlUniversList = xmlDoc.CreateElement("ListeUnivers"); xmlRoot.AppendChild(xmlUniversList); foreach(UniversDMX univ in univers) { univ.Save(xmlUniversList); } seqmaitre.Save(xmlRoot); return xmlDoc; } public static Conduite Load (XmlDocument doc) { Conduite cond = new Conduite (); cond.LoadDoc (doc); return cond; // cond.Dispose(); // return null; } private void LoadDoc (XmlDocument doc) { XmlElement root = doc.DocumentElement; _name = root.Attributes ["nom"].Value; foreach (var xc in root["Circuits"].ChildNodes) { Circuit c = Circuit.Load (xc as XmlElement); if (c != null) circuits.Add (c); } foreach (var xs in root["Sequenceurs"].ChildNodes) { Sequenceur s = Sequenceur.Load (this, xs as XmlElement); if (s != null){ sequenceurs.Add (s); s.Renamed += SequenceurRenomme; } } univers.Clear(); foreach (var xu in root["ListeUnivers"].ChildNodes) { UniversDMX u = UniversDMX.Load(this,xu as XmlElement); if(u!=null) univers.Add(u); } seqmaitre = SequenceurMaitre.Load(this,root["SequenceurMaitre"]); } #endregion } public class Circuit { static int maxid=1; string name; public const int SNLen= 8; public Circuit() { id=maxid++; Name = "Circuit n°" + id.ToString(); ShortName = "Cir" + id.ToString(); } public string Name { get { return name; } set { name = value; } } string shortName; public string ShortName { get { return shortName; } set { if (value.Length > SNLen) shortName = value.Substring(0,SNLen); else shortName = value; } } int id; public int ID { get { return id; } } int _curval; public int ValeurCourante { get { return _curval; } set { _curval = value; } } public void Save (XmlElement parent) { XmlElement el= parent.OwnerDocument.CreateElement ("Circuit"); parent.AppendChild(el); el.SetAttribute("ID",id.ToString()); el.SetAttribute("name",name); el.SetAttribute("shortName",shortName); } public static Circuit Load (XmlElement xc) { if(xc.Name!="Circuit") throw new ErreurLectureFichier(" attendu."); return new Circuit(xc); } private Circuit(XmlElement xc) { id = int.Parse(xc.GetAttribute("ID")); maxid = Math.Max (maxid,id+1); name = xc.GetAttribute("name"); shortName = xc.GetAttribute("shortName"); } } }