From c6e8d4567915fba4d539e9eeb95d59c055f7be8a Mon Sep 17 00:00:00 2001 From: tzim Date: Sun, 11 May 2014 22:05:34 +0000 Subject: [PATCH] --- DMX-2.0/DriverBoitierV3.cs | 42 ++++++++--- DMX-2.0/DriverBoitierV3UI.cs | 19 ++++- DMX-2.0/gtk-gui/DMX2.DriverBoitierV3UI.cs | 88 ++++++++++++----------- DMX-2.0/gtk-gui/gui.stetic | 46 ++++++------ dmx512_micro/dmx512_micro.cpp | 50 +++++++------ 5 files changed, 149 insertions(+), 96 deletions(-) diff --git a/DMX-2.0/DriverBoitierV3.cs b/DMX-2.0/DriverBoitierV3.cs index 4dc58ba..2fde398 100644 --- a/DMX-2.0/DriverBoitierV3.cs +++ b/DMX-2.0/DriverBoitierV3.cs @@ -42,7 +42,7 @@ namespace DMX2 Fin } - const int timeout = 50; + const int timeout = 500; // tampons Entrée/Sortie public byte[] inputbuffer = new byte[516]; @@ -64,7 +64,7 @@ namespace DMX2 byte flags = 0; byte dmxinterval= 40; int usbrefresh = 40; - + bool sync=false; bool reinit=false ; @@ -102,15 +102,16 @@ namespace DMX2 } } + public bool Sync { get { - return (flags & 2)>0; + return sync; } set { - flags = (byte)((flags & 0xFD) | (value?2:0)); - paramFlag = true; + sync = value; } } + public int NbCircuits { get { return nbc1; @@ -231,6 +232,30 @@ namespace DMX2 return false; } + void DmxSync () + { + if (!serial.IsOpen) { + etat = etatAutomate.Erreur; + return; + } + + byte[] tmpBuffer = new byte[2]; + + tmpBuffer [0] = 27; // Esc + tmpBuffer [1] = 69; // 'E' + + serial.Write (tmpBuffer, 0, tmpBuffer.Length); + + if(!WaitForData (1)) { + etat = etatAutomate.Erreur; + return ; + } + + serial.Read(tmpBuffer,0,1); + if(tmpBuffer[0] != 69) + etat = etatAutomate.Erreur; + } + volatile etatAutomate etat = etatAutomate.Deconnecte; DateTime finAttente = DateTime.Now; int compteErreur = 0; @@ -249,6 +274,7 @@ namespace DMX2 finAttente = DateTime.Now.AddMilliseconds (usbrefresh); //Console.WriteLine(DateTime.Now-t); //t = DateTime.Now; + if(sync)DmxSync(); EnvoiTrame (); Reception (); Attente (finAttente); @@ -355,8 +381,8 @@ namespace DMX2 } serial.Read(inputbuffer,0,inputbuffer.Length); - if (flag_input != inputbuffer[0]) { - flag_input = inputbuffer[0]; + if (flag_input != inputbuffer[513]) { + flag_input = inputbuffer[513]; Console.WriteLine(flag_input ); } if(serial.BytesToRead>0) @@ -582,7 +608,7 @@ namespace DMX2 el.SetAttribute("mab",mab.ToString()); el.SetAttribute("brk",brk.ToString()); el.SetAttribute("merge1",((flags&1)>0).ToString()); - el.SetAttribute("sync",((flags&2)>0).ToString()); + el.SetAttribute("sync",sync.ToString()); el.SetAttribute("dmxinterval",dmxinterval.ToString()); el.SetAttribute("usbrefresh",usbrefresh.ToString()); diff --git a/DMX-2.0/DriverBoitierV3UI.cs b/DMX-2.0/DriverBoitierV3UI.cs index 23dd157..09d7af6 100644 --- a/DMX-2.0/DriverBoitierV3UI.cs +++ b/DMX-2.0/DriverBoitierV3UI.cs @@ -46,6 +46,8 @@ namespace DMX2 chkMerge1.Active = drv.Merge; chkSync.Active = drv.Sync; + //caseDMXInt.IsEditable = drv.Sync; + cbUnivers1.Model = lsCbUnivers1; var cellCbUnivers1 = new CellRendererText (); cbUnivers1.PackStart (cellCbUnivers1, false); @@ -88,7 +90,6 @@ namespace DMX2 drv.patch1 = lsCbUnivers1.GetValue (iter, 0) as UniversDMX; } - int a, b, c,d, f; if (!int.TryParse (caseBrk.Text, out a)) return; @@ -106,8 +107,8 @@ namespace DMX2 if (a < 92) a = 92; if (b < 12) b = 12; if (c < 8 || c > 512 ) c = 512; - if (d < 22 ) d = 22; - if (f < 22 || f > 255 ) f = 22; + if (d < 5 ) d = 22; + if (f < 5 || f > 255 ) f = 22; drv.Break = a; drv.Mab = b; @@ -123,6 +124,18 @@ namespace DMX2 { drv.ReInit(); } + + protected void OnChkSyncToggled (object sender, EventArgs e) + { + //SyncCheck(); + } + + protected void OnCaseUSBRefChanged (object sender, EventArgs e) + { + //SyncCheck(); + } + + } } diff --git a/DMX-2.0/gtk-gui/DMX2.DriverBoitierV3UI.cs b/DMX-2.0/gtk-gui/DMX2.DriverBoitierV3UI.cs index 72d4ce6..bfb8537 100644 --- a/DMX-2.0/gtk-gui/DMX2.DriverBoitierV3UI.cs +++ b/DMX-2.0/gtk-gui/DMX2.DriverBoitierV3UI.cs @@ -16,13 +16,13 @@ namespace DMX2 private global::Gtk.CheckButton chkMerge1; private global::Gtk.CheckButton chkSync; private global::Gtk.Label label10; - private global::Gtk.Label label11; private global::Gtk.Label label3; private global::Gtk.Label label4; private global::Gtk.Label label5; private global::Gtk.Label label8; private global::Gtk.Label label9; private global::Gtk.Label labelsync; + private global::Gtk.Label lblDMX; private global::Gtk.HBox hbox1; private global::Gtk.Button btnValider; private global::Gtk.Button btnInit; @@ -164,77 +164,77 @@ namespace DMX2 w10.XOptions = ((global::Gtk.AttachOptions)(4)); w10.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild - this.label11 = new global::Gtk.Label (); - this.label11.Name = "label11"; - this.label11.LabelProp = "Intervale entre\ntrames DMX (ms)"; - this.table1.Add (this.label11); - global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.table1 [this.label11])); - w11.TopAttach = ((uint)(3)); - w11.BottomAttach = ((uint)(4)); - w11.LeftAttach = ((uint)(2)); - w11.RightAttach = ((uint)(3)); - w11.XOptions = ((global::Gtk.AttachOptions)(4)); - w11.YOptions = ((global::Gtk.AttachOptions)(4)); - // Container child table1.Gtk.Table+TableChild this.label3 = new global::Gtk.Label (); this.label3.Name = "label3"; this.label3.LabelProp = "Univer associé"; this.table1.Add (this.label3); - global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.table1 [this.label3])); - w12.XOptions = ((global::Gtk.AttachOptions)(4)); - w12.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.table1 [this.label3])); + w11.XOptions = ((global::Gtk.AttachOptions)(4)); + w11.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label4 = new global::Gtk.Label (); this.label4.Name = "label4"; this.label4.LabelProp = "Break (µs)"; this.table1.Add (this.label4); - global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.table1 [this.label4])); - w13.TopAttach = ((uint)(1)); - w13.BottomAttach = ((uint)(2)); - w13.XOptions = ((global::Gtk.AttachOptions)(4)); - w13.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.table1 [this.label4])); + w12.TopAttach = ((uint)(1)); + w12.BottomAttach = ((uint)(2)); + w12.XOptions = ((global::Gtk.AttachOptions)(4)); + w12.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label5 = new global::Gtk.Label (); this.label5.Name = "label5"; this.label5.LabelProp = "MAB (µs)"; this.table1.Add (this.label5); - global::Gtk.Table.TableChild w14 = ((global::Gtk.Table.TableChild)(this.table1 [this.label5])); - w14.TopAttach = ((uint)(1)); - w14.BottomAttach = ((uint)(2)); - w14.LeftAttach = ((uint)(2)); - w14.RightAttach = ((uint)(3)); - w14.XOptions = ((global::Gtk.AttachOptions)(4)); - w14.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.table1 [this.label5])); + w13.TopAttach = ((uint)(1)); + w13.BottomAttach = ((uint)(2)); + w13.LeftAttach = ((uint)(2)); + w13.RightAttach = ((uint)(3)); + w13.XOptions = ((global::Gtk.AttachOptions)(4)); + w13.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label8 = new global::Gtk.Label (); this.label8.Name = "label8"; this.label8.LabelProp = "Merge"; this.table1.Add (this.label8); - global::Gtk.Table.TableChild w15 = ((global::Gtk.Table.TableChild)(this.table1 [this.label8])); - w15.TopAttach = ((uint)(2)); - w15.BottomAttach = ((uint)(3)); - w15.LeftAttach = ((uint)(2)); - w15.RightAttach = ((uint)(3)); - w15.XOptions = ((global::Gtk.AttachOptions)(4)); - w15.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w14 = ((global::Gtk.Table.TableChild)(this.table1 [this.label8])); + w14.TopAttach = ((uint)(2)); + w14.BottomAttach = ((uint)(3)); + w14.LeftAttach = ((uint)(2)); + w14.RightAttach = ((uint)(3)); + w14.XOptions = ((global::Gtk.AttachOptions)(4)); + w14.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label9 = new global::Gtk.Label (); this.label9.Name = "label9"; this.label9.LabelProp = "Circuits"; this.table1.Add (this.label9); - global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.table1 [this.label9])); - w16.LeftAttach = ((uint)(2)); - w16.RightAttach = ((uint)(3)); - w16.XOptions = ((global::Gtk.AttachOptions)(4)); - w16.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w15 = ((global::Gtk.Table.TableChild)(this.table1 [this.label9])); + w15.LeftAttach = ((uint)(2)); + w15.RightAttach = ((uint)(3)); + w15.XOptions = ((global::Gtk.AttachOptions)(4)); + w15.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.labelsync = new global::Gtk.Label (); this.labelsync.Name = "labelsync"; this.labelsync.LabelProp = "Syncro\nDMX<->USB"; this.table1.Add (this.labelsync); - global::Gtk.Table.TableChild w17 = ((global::Gtk.Table.TableChild)(this.table1 [this.labelsync])); - w17.TopAttach = ((uint)(2)); - w17.BottomAttach = ((uint)(3)); + global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.table1 [this.labelsync])); + w16.TopAttach = ((uint)(2)); + w16.BottomAttach = ((uint)(3)); + w16.XOptions = ((global::Gtk.AttachOptions)(4)); + w16.YOptions = ((global::Gtk.AttachOptions)(4)); + // Container child table1.Gtk.Table+TableChild + this.lblDMX = new global::Gtk.Label (); + this.lblDMX.Name = "lblDMX"; + this.lblDMX.LabelProp = "Intervale entre\ntrames DMX (ms)"; + this.table1.Add (this.lblDMX); + global::Gtk.Table.TableChild w17 = ((global::Gtk.Table.TableChild)(this.table1 [this.lblDMX])); + w17.TopAttach = ((uint)(3)); + w17.BottomAttach = ((uint)(4)); + w17.LeftAttach = ((uint)(2)); + w17.RightAttach = ((uint)(3)); w17.XOptions = ((global::Gtk.AttachOptions)(4)); w17.YOptions = ((global::Gtk.AttachOptions)(4)); this.vbox2.Add (this.table1); @@ -279,6 +279,8 @@ namespace DMX2 this.Child.ShowAll (); } this.Hide (); + this.chkSync.Toggled += new global::System.EventHandler (this.OnChkSyncToggled); + this.caseUSBRef.Changed += new global::System.EventHandler (this.OnCaseUSBRefChanged); this.btnValider.Clicked += new global::System.EventHandler (this.OnButtonValider); this.btnInit.Clicked += new global::System.EventHandler (this.OnBtnInitClicked); } diff --git a/DMX-2.0/gtk-gui/gui.stetic b/DMX-2.0/gtk-gui/gui.stetic index 64f52c9..4e6ae6e 100644 --- a/DMX-2.0/gtk-gui/gui.stetic +++ b/DMX-2.0/gtk-gui/gui.stetic @@ -2763,6 +2763,7 @@ Licence : GPL V2 True True + 3 @@ -2832,6 +2833,7 @@ Licence : GPL V2 True True True + 2 @@ -2868,28 +2870,6 @@ Licence : GPL V2 False - - - - Intervale entre -trames DMX (ms) - - - 3 - 4 - 2 - 3 - True - Fill - Fill - False - True - False - False - True - False - - @@ -3007,6 +2987,28 @@ DMX<->USB False + + + + Intervale entre +trames DMX (ms) + + + 3 + 4 + 2 + 3 + True + Fill + Fill + False + True + False + False + True + False + + 1 diff --git a/dmx512_micro/dmx512_micro.cpp b/dmx512_micro/dmx512_micro.cpp index 95ed6f1..0fee8d3 100644 --- a/dmx512_micro/dmx512_micro.cpp +++ b/dmx512_micro/dmx512_micro.cpp @@ -35,7 +35,7 @@ int main(void) #define TX1PIN 1 // pin DMX serial 1 #define LEDPIN 13 // led interne -#define RX_TX_LED_TIME 3 +#define RX_TX_LED_TIME 12 // tableaux de données @@ -50,7 +50,7 @@ volatile int index_output_pc=0; // sortie USB volatile int index_input_dmx=513; // entrée dmx volatile int index_output_dmx=0; // sortie dmx volatile int etat_input_pc=IINUSB_IDLE; // etat entrée USB -volatile bool emissionPc=0; // flag : emission USB en attente +volatile int emissionPc=0; // flag : emission USB en attente unsigned int blkl = 0, blkcpt=0, rxledcpt=0 ,txledcpt=0; // Gestion des leds unsigned int blinkon, blinkp, interbrk=0; // idem @@ -60,8 +60,7 @@ byte mab_timer_end=25; // Duree MAB (par 2µs) def : 50us int nb_circuits=512; // Nombre de circuits DMX emis int dmx_frame_interval=40; // Intervale entre trames DMX emises bool flag_merge1=1; -bool flag_sync=0; - +bool syncflag=false; // ********************************** USB ***************************** // // lancé par interruption USB sur reception d'un char <- Cette fonction nécessite une modif de la lib arduino @@ -88,7 +87,7 @@ void CDC_accept() index_input_pc=1; tab_input_dmx[517]=68; index_output_pc=1; // on init l'index d'emmission vers le pc ( le 0 n'est pas emit => start code) - emissionPc=1; // activation de l'intéruption registre emmission + emissionPc=1; break; } // Esc 'C' réinit @@ -122,6 +121,16 @@ void CDC_accept() emissionPc=1; break; } + + // Esc 'E' SYNC + if (c==69) { + etat_input_pc=IINUSB_IDLE; + tab_input_dmx[517]=69; + index_output_pc=517; // on init l'index d'emmission vers le pc ( uniquement etat : 65 'A' ) + emissionPc=1; + syncflag=true; + break; + } // si aucune commande n'est trouvée (toujours à 1) on repart à 0 etat_input_pc=IINUSB_IDLE; @@ -133,7 +142,6 @@ void CDC_accept() // si on arrive à 512 if (index_input_pc > 512) { etat_input_pc=0; - if(flag_sync && (index_output_dmx==IOUTDMX_IDLE)) interbrk=1000; } break; @@ -145,7 +153,6 @@ void CDC_accept() brk_timer_end = (inbuffer[1]/2); mab_timer_end = (inbuffer[2]/2); flag_merge1 = inbuffer[3] & 1; - flag_sync = inbuffer[3] & 2; dmx_frame_interval = inbuffer[4]; etat_input_pc=0; @@ -241,6 +248,7 @@ ISR(USART1_UDRE_vect) if (index_output_dmx>nb_circuits) { index_output_dmx=IOUTDMX_FIN; cbi(UCSR1B, UDRIE1); + syncflag=false; } } @@ -309,13 +317,14 @@ void setup() { // ********************************** BOUCLE ********************************* // +int tmptime; void loop() { - // Lancement du Break : après fin de transmisson et ecoulement de "dmx_frame_interval" ms depuis le dernier break if (index_output_dmx==IOUTDMX_IDLE && interbrk >= dmx_frame_interval ) { index_output_dmx=IOUTDMX_BRK; - interbrk=0; + tab_input_dmx[514]= (byte)tmptime ; +tmptime= interbrk=0; pinMode(TX1PIN, OUTPUT); // on met la broche en mode sortie cbi(UCSR1B, TXEN1); //on stop la transmission digitalWrite(TX1PIN, LOW); // on met la broche à 0 @@ -327,24 +336,26 @@ void loop() { } // octets d'état. Pour le moment, tous à 0 - tab_input_dmx[513]= 0; - tab_input_dmx[514]= 0; - tab_input_dmx[515]= 0; - tab_input_dmx[516]= 0; + //tab_input_dmx[513]= 0; + //tab_input_dmx[514]= 0; + //tab_input_dmx[515]= 0; + //tab_input_dmx[516]= 0; if(_usbLineInfo.lineState) { // Si port serie USB ouvert - blinkp=10, blinkon=6; // la led clignote plus vite - if(emissionPc!=0) + blinkp=100, blinkon=70; // la led clignote plus vite + if(!syncflag && emissionPc!=0) + { ecritUSB(); + } } else { - blinkon = 350, blinkp=400; + blinkon = 3500, blinkp=4000; // dans le doute, on force l'etat d'entree etat_input_pc=IINUSB_IDLE; } - int m = millis()>>3; - if (m-blkl) { // Toutes les 8ms - interbrk+=8; + int m = millis(); + if (m-blkl) { // Toutes les ms + interbrk+=(m-blkl) ; tmptime+=(m-blkl); blkcpt++; blkl = m; if(rxledcpt) rxledcpt--; else RXLED0; @@ -356,4 +367,3 @@ void loop() { } -