using System; using System.Threading; using System.IO.Ports; namespace DMX2 { public class DriverBoitierV2 : DriverDMX, IEventProvider { struct buttonState { public buttonState(byte _button, bool _pressed){ button=_button; pressed=_pressed; } public byte button; public bool pressed; } enum etatAutomate { Deconnecte, Transmission, Erreur, Reset, Parametrage, Fin } bool[] buttons = new bool[8]; bool[] watchButtons = new bool[8]; // tampons Entrée/Sortie public byte[] inputbuffer = new byte[532]; byte[] outputbuffer = new byte[514]; //Thread de boucle Thread loopthread=null; public UniversDMX patch1=null; public UniversDMX patch2=null; string portname = ""; SerialPort serial = null; public DriverBoitierV2 (string serialport, string id): base(id) { portname = serialport; outputbuffer[0]=27; outputbuffer[1]=68; Start(); } void Start () { if (loopthread == null) { loopthread = new Thread(new ThreadStart(MainLoop)); loopthread.Start(); } } void Connection () { Console.WriteLine ("DriverV2.Connection()"); if (serial != null) { serial.Close (); serial.Dispose (); } serial = new SerialPort (portname, 460800, Parity.None, 8, StopBits.One); //serial.DtrEnable = false; serial.ReadTimeout = 200; serial.WriteTimeout = 200; try { serial.Open (); etat = etatAutomate.Transmission; } catch { etat = etatAutomate.Deconnecte; } } volatile etatAutomate etat = etatAutomate.Deconnecte; DateTime finAttente = DateTime.Now; int compteErreur = 0; void MainLoop() { while(etat != etatAutomate.Fin) { switch (etat) { case etatAutomate.Deconnecte: Connection(); compteErreur= 0; Attente(DateTime.Now.AddMilliseconds(1000)); serial.DiscardInBuffer(); break; case etatAutomate.Transmission: finAttente = DateTime.Now.AddMilliseconds (22); EnvoiTrame(); Reception(); Attente(finAttente); break; case etatAutomate.Erreur: compteErreur ++; if(compteErreur>3){ Deconnecte(); Attente(DateTime.Now.AddSeconds(2)); } else { Attente(DateTime.Now.AddSeconds(1)); etat = etatAutomate.Transmission; } break; // case etatAutomate.Parametrage: // EnvoiParam(); // break; // case etatAutomate.Reset: // EnvoiReset(); // break; } } Deconnecte(); } void Attente (DateTime date) { int sleeptime = (int) (date - DateTime.Now).TotalMilliseconds; if(sleeptime>2) Thread.Sleep(sleeptime); while (DateTime.Now\d+)?", System.Text.RegularExpressions.RegexOptions.Compiled); System.Collections.Concurrent.ConcurrentQueue eventsPending = new System.Collections.Concurrent.ConcurrentQueue(); bool IEventProvider.Bind (string eventId) { var res = regexEventID.Match (eventId); if (res.Success) { int bt = int.Parse (res.Groups ["button"].Value); if(bt<0||bt>7) return false; watchButtons[bt] = true; return true; } return false; } void IEventProvider.Unbind (string eventId) { var res = regexEventID.Match (eventId); if (res.Success) { int bt = int.Parse (res.Groups ["button"].Value); if(bt<0||bt>7) return ; watchButtons[bt] = false; } return; } Gtk.Menu IEventProvider.GetProviderSubMenu (EventManager.EventMenuData state, Gtk.ButtonPressEventHandler handler) { Gtk.Menu retmenu = new Gtk.Menu (); Gtk.MenuItem evmenuitem = new Gtk.MenuItem ("Boutons"); retmenu.Add (evmenuitem); Gtk.Menu evmenu = new Gtk.Menu (); evmenuitem.Submenu = evmenu; for (int i= 0; i<8;i++ ) { Gtk.MenuItem item = new Gtk.MenuItem(string.Format("Bouton {0}",i+1)); item.Data[EventManager.EventIdKey] = string.Format("BV2-B{0}",i); item.Data[EventManager.StateKey] = state; item.ButtonPressEvent += handler; evmenu.Add (item); } return retmenu; } void IEventProvider.ProcessEvents (EventManagerCallback callback) { buttonState bt; EventData evd; while (eventsPending.TryDequeue(out bt)) { evd.id= string.Format("BV2-B{0}",bt.button ); evd.value = bt.pressed?(byte)0xFF:(byte)0x00; callback(evd); } } string IEventProvider.MenuName { get { return "Boitier V2"; } } #endregion } }