diff --git a/AgroBase/AgroBase/AgroBase.csproj b/AgroBase/AgroBase/AgroBase.csproj index 7553bd512..94e27671c 100644 --- a/AgroBase/AgroBase/AgroBase.csproj +++ b/AgroBase/AgroBase/AgroBase.csproj @@ -543,6 +543,7 @@ + diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs index fb609b619..5d9515f4d 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs @@ -57,14 +57,30 @@ this.lblStatusCarroMapa = new System.Windows.Forms.Label(); this.pnlDeteccoesRua = new System.Windows.Forms.Panel(); this.tabPulverizador = new System.Windows.Forms.TabPage(); - this.lblPotenciaSP = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.label2 = new System.Windows.Forms.Label(); + this.cmbModoAgitador = new System.Windows.Forms.ComboBox(); this.nudPotenciaAgitador = new System.Windows.Forms.NumericUpDown(); - this.btnDeslsigarAgitador = new System.Windows.Forms.Button(); this.btnLigarAgitador = new System.Windows.Forms.Button(); - this.lblPressaoSP = new System.Windows.Forms.Label(); - this.nudPressaoSP = new System.Windows.Forms.NumericUpDown(); - this.btnDesligarBomba = new System.Windows.Forms.Button(); + this.lblPotenciaSP = new System.Windows.Forms.Label(); + this.btnDeslsigarAgitador = new System.Windows.Forms.Button(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label7 = new System.Windows.Forms.Label(); + this.nudPotenciaBombaMax = new System.Windows.Forms.NumericUpDown(); + this.label6 = new System.Windows.Forms.Label(); + this.txtKd = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.txtKi = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtKp = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.cmbModoBomba = new System.Windows.Forms.ComboBox(); this.btnLigarBomba = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.btnDesligarBomba = new System.Windows.Forms.Button(); + this.nudPotenciaBombaMin = new System.Windows.Forms.NumericUpDown(); + this.nudPressaoSP = new System.Windows.Forms.NumericUpDown(); + this.lblPressaoSP = new System.Windows.Forms.Label(); this.pnlCameraRua = new System.Windows.Forms.Panel(); this.pnlDir_EF = new System.Windows.Forms.Panel(); this.lblMov_EF = new System.Windows.Forms.Label(); @@ -87,22 +103,7 @@ this.flwCamerasSolo = new System.Windows.Forms.FlowLayoutPanel(); this.chbSonarAtivado = new System.Windows.Forms.CheckBox(); this.lblPressao = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.nudPotenciaBombaMin = new System.Windows.Forms.NumericUpDown(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.cmbModoAgitador = new System.Windows.Forms.ComboBox(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.cmbModoBomba = new System.Windows.Forms.ComboBox(); - this.txtKp = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.txtKi = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.txtKd = new System.Windows.Forms.TextBox(); - this.label7 = new System.Windows.Forms.Label(); - this.nudPotenciaBombaMax = new System.Windows.Forms.NumericUpDown(); + this.chbImuAtivado = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.chartGraficos)).BeginInit(); this.tabControl1.SuspendLayout(); this.tabMapa.SuspendLayout(); @@ -110,16 +111,16 @@ ((System.ComponentModel.ISupportInitialize)(this.gridDados)).BeginInit(); this.tabDeteccoes.SuspendLayout(); this.tabPulverizador.SuspendLayout(); + this.groupBox3.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaAgitador)).BeginInit(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMax)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMin)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nudPressaoSP)).BeginInit(); this.pnlDir_EF.SuspendLayout(); this.pnlDir_ET.SuspendLayout(); this.pnlDir_DT.SuspendLayout(); this.pnlDir_DF.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMin)).BeginInit(); - this.groupBox2.SuspendLayout(); - this.groupBox3.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMax)).BeginInit(); this.SuspendLayout(); // // pnlAtuadores @@ -416,16 +417,40 @@ this.tabPulverizador.Text = "Pulverizador"; this.tabPulverizador.UseVisualStyleBackColor = true; // - // lblPotenciaSP + // groupBox3 // - this.lblPotenciaSP.AutoSize = true; - this.lblPotenciaSP.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPotenciaSP.Location = new System.Drawing.Point(6, 56); - this.lblPotenciaSP.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.lblPotenciaSP.Name = "lblPotenciaSP"; - this.lblPotenciaSP.Size = new System.Drawing.Size(77, 13); - this.lblPotenciaSP.TabIndex = 33; - this.lblPotenciaSP.Text = "Potencia SP"; + this.groupBox3.Controls.Add(this.label2); + this.groupBox3.Controls.Add(this.cmbModoAgitador); + this.groupBox3.Controls.Add(this.nudPotenciaAgitador); + this.groupBox3.Controls.Add(this.btnLigarAgitador); + this.groupBox3.Controls.Add(this.lblPotenciaSP); + this.groupBox3.Controls.Add(this.btnDeslsigarAgitador); + this.groupBox3.Location = new System.Drawing.Point(5, 177); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(453, 106); + this.groupBox3.TabIndex = 38; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Agitador de Calda"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point(6, 16); + this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(107, 13); + this.label2.TabIndex = 37; + this.label2.Text = "Modo de Controle"; + // + // cmbModoAgitador + // + this.cmbModoAgitador.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbModoAgitador.FormattingEnabled = true; + this.cmbModoAgitador.Location = new System.Drawing.Point(6, 32); + this.cmbModoAgitador.Name = "cmbModoAgitador"; + this.cmbModoAgitador.Size = new System.Drawing.Size(121, 21); + this.cmbModoAgitador.TabIndex = 34; // // nudPotenciaAgitador // @@ -438,18 +463,6 @@ this.nudPotenciaAgitador.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; this.nudPotenciaAgitador.ValueChanged += new System.EventHandler(this.nudPotenciaSP_ValueChanged); // - // btnDeslsigarAgitador - // - this.btnDeslsigarAgitador.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnDeslsigarAgitador.Location = new System.Drawing.Point(312, 34); - this.btnDeslsigarAgitador.Margin = new System.Windows.Forms.Padding(2); - this.btnDeslsigarAgitador.Name = "btnDeslsigarAgitador"; - this.btnDeslsigarAgitador.Size = new System.Drawing.Size(136, 28); - this.btnDeslsigarAgitador.TabIndex = 31; - this.btnDeslsigarAgitador.Text = "Desligar Agitador"; - this.btnDeslsigarAgitador.UseVisualStyleBackColor = true; - this.btnDeslsigarAgitador.Click += new System.EventHandler(this.btnDeslsigarAgitador_Click); - // // btnLigarAgitador // this.btnLigarAgitador.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -462,16 +475,206 @@ this.btnLigarAgitador.UseVisualStyleBackColor = true; this.btnLigarAgitador.Click += new System.EventHandler(this.btnLigarAgitador_Click); // - // lblPressaoSP + // lblPotenciaSP // - this.lblPressaoSP.AutoSize = true; - this.lblPressaoSP.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPressaoSP.Location = new System.Drawing.Point(6, 55); - this.lblPressaoSP.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.lblPressaoSP.Name = "lblPressaoSP"; - this.lblPressaoSP.Size = new System.Drawing.Size(72, 13); - this.lblPressaoSP.TabIndex = 29; - this.lblPressaoSP.Text = "Pressão SP"; + this.lblPotenciaSP.AutoSize = true; + this.lblPotenciaSP.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblPotenciaSP.Location = new System.Drawing.Point(6, 56); + this.lblPotenciaSP.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lblPotenciaSP.Name = "lblPotenciaSP"; + this.lblPotenciaSP.Size = new System.Drawing.Size(77, 13); + this.lblPotenciaSP.TabIndex = 33; + this.lblPotenciaSP.Text = "Potencia SP"; + // + // btnDeslsigarAgitador + // + this.btnDeslsigarAgitador.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnDeslsigarAgitador.Location = new System.Drawing.Point(312, 34); + this.btnDeslsigarAgitador.Margin = new System.Windows.Forms.Padding(2); + this.btnDeslsigarAgitador.Name = "btnDeslsigarAgitador"; + this.btnDeslsigarAgitador.Size = new System.Drawing.Size(136, 28); + this.btnDeslsigarAgitador.TabIndex = 31; + this.btnDeslsigarAgitador.Text = "Desligar Agitador"; + this.btnDeslsigarAgitador.UseVisualStyleBackColor = true; + this.btnDeslsigarAgitador.Click += new System.EventHandler(this.btnDeslsigarAgitador_Click); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.label7); + this.groupBox2.Controls.Add(this.nudPotenciaBombaMax); + this.groupBox2.Controls.Add(this.label6); + this.groupBox2.Controls.Add(this.txtKd); + this.groupBox2.Controls.Add(this.label5); + this.groupBox2.Controls.Add(this.txtKi); + this.groupBox2.Controls.Add(this.label4); + this.groupBox2.Controls.Add(this.txtKp); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Controls.Add(this.cmbModoBomba); + this.groupBox2.Controls.Add(this.btnLigarBomba); + this.groupBox2.Controls.Add(this.label1); + this.groupBox2.Controls.Add(this.btnDesligarBomba); + this.groupBox2.Controls.Add(this.nudPotenciaBombaMin); + this.groupBox2.Controls.Add(this.nudPressaoSP); + this.groupBox2.Controls.Add(this.lblPressaoSP); + this.groupBox2.Location = new System.Drawing.Point(5, 6); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(453, 141); + this.groupBox2.TabIndex = 37; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Bomba Pressurizadora"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label7.Location = new System.Drawing.Point(78, 94); + this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(53, 13); + this.label7.TabIndex = 47; + this.label7.Text = "Pot Max"; + // + // nudPotenciaBombaMax + // + this.nudPotenciaBombaMax.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.nudPotenciaBombaMax.Location = new System.Drawing.Point(72, 111); + this.nudPotenciaBombaMax.Margin = new System.Windows.Forms.Padding(2); + this.nudPotenciaBombaMax.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.nudPotenciaBombaMax.Name = "nudPotenciaBombaMax"; + this.nudPotenciaBombaMax.Size = new System.Drawing.Size(55, 19); + this.nudPotenciaBombaMax.TabIndex = 46; + this.nudPotenciaBombaMax.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label6.Location = new System.Drawing.Point(146, 94); + this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(22, 13); + this.label6.TabIndex = 45; + this.label6.Text = "Kd"; + // + // txtKd + // + this.txtKd.Location = new System.Drawing.Point(149, 110); + this.txtKd.Name = "txtKd"; + this.txtKd.Size = new System.Drawing.Size(68, 20); + this.txtKd.TabIndex = 44; + this.txtKd.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.Location = new System.Drawing.Point(146, 55); + this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(18, 13); + this.label5.TabIndex = 43; + this.label5.Text = "Ki"; + // + // txtKi + // + this.txtKi.Location = new System.Drawing.Point(149, 71); + this.txtKi.Name = "txtKi"; + this.txtKi.Size = new System.Drawing.Size(68, 20); + this.txtKi.TabIndex = 42; + this.txtKi.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.Location = new System.Drawing.Point(146, 16); + this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(22, 13); + this.label4.TabIndex = 41; + this.label4.Text = "Kp"; + // + // txtKp + // + this.txtKp.Location = new System.Drawing.Point(149, 32); + this.txtKp.Name = "txtKp"; + this.txtKp.Size = new System.Drawing.Size(68, 20); + this.txtKp.TabIndex = 40; + this.txtKp.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(6, 16); + this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(107, 13); + this.label3.TabIndex = 39; + this.label3.Text = "Modo de Controle"; + // + // cmbModoBomba + // + this.cmbModoBomba.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbModoBomba.FormattingEnabled = true; + this.cmbModoBomba.Location = new System.Drawing.Point(6, 32); + this.cmbModoBomba.Name = "cmbModoBomba"; + this.cmbModoBomba.Size = new System.Drawing.Size(121, 21); + this.cmbModoBomba.TabIndex = 38; + // + // btnLigarBomba + // + this.btnLigarBomba.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnLigarBomba.Location = new System.Drawing.Point(312, 103); + this.btnLigarBomba.Margin = new System.Windows.Forms.Padding(2); + this.btnLigarBomba.Name = "btnLigarBomba"; + this.btnLigarBomba.Size = new System.Drawing.Size(136, 28); + this.btnLigarBomba.TabIndex = 26; + this.btnLigarBomba.Text = "Ligar Bomba"; + this.btnLigarBomba.UseVisualStyleBackColor = true; + this.btnLigarBomba.Click += new System.EventHandler(this.btnLigarBomba_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(6, 94); + this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(50, 13); + this.label1.TabIndex = 35; + this.label1.Text = "Pot Min"; + // + // btnDesligarBomba + // + this.btnDesligarBomba.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnDesligarBomba.Location = new System.Drawing.Point(312, 71); + this.btnDesligarBomba.Margin = new System.Windows.Forms.Padding(2); + this.btnDesligarBomba.Name = "btnDesligarBomba"; + this.btnDesligarBomba.Size = new System.Drawing.Size(136, 28); + this.btnDesligarBomba.TabIndex = 27; + this.btnDesligarBomba.Text = "Desligar Bomba"; + this.btnDesligarBomba.UseVisualStyleBackColor = true; + this.btnDesligarBomba.Click += new System.EventHandler(this.btnDesligarBomba_Click); + // + // nudPotenciaBombaMin + // + this.nudPotenciaBombaMin.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.nudPotenciaBombaMin.Location = new System.Drawing.Point(6, 111); + this.nudPotenciaBombaMin.Margin = new System.Windows.Forms.Padding(2); + this.nudPotenciaBombaMin.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.nudPotenciaBombaMin.Name = "nudPotenciaBombaMin"; + this.nudPotenciaBombaMin.Size = new System.Drawing.Size(55, 19); + this.nudPotenciaBombaMin.TabIndex = 34; + this.nudPotenciaBombaMin.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; // // nudPressaoSP // @@ -489,29 +692,16 @@ this.nudPressaoSP.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; this.nudPressaoSP.ValueChanged += new System.EventHandler(this.nudPressaoSP_ValueChanged); // - // btnDesligarBomba + // lblPressaoSP // - this.btnDesligarBomba.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnDesligarBomba.Location = new System.Drawing.Point(312, 71); - this.btnDesligarBomba.Margin = new System.Windows.Forms.Padding(2); - this.btnDesligarBomba.Name = "btnDesligarBomba"; - this.btnDesligarBomba.Size = new System.Drawing.Size(136, 28); - this.btnDesligarBomba.TabIndex = 27; - this.btnDesligarBomba.Text = "Desligar Bomba"; - this.btnDesligarBomba.UseVisualStyleBackColor = true; - this.btnDesligarBomba.Click += new System.EventHandler(this.btnDesligarBomba_Click); - // - // btnLigarBomba - // - this.btnLigarBomba.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnLigarBomba.Location = new System.Drawing.Point(312, 103); - this.btnLigarBomba.Margin = new System.Windows.Forms.Padding(2); - this.btnLigarBomba.Name = "btnLigarBomba"; - this.btnLigarBomba.Size = new System.Drawing.Size(136, 28); - this.btnLigarBomba.TabIndex = 26; - this.btnLigarBomba.Text = "Ligar Bomba"; - this.btnLigarBomba.UseVisualStyleBackColor = true; - this.btnLigarBomba.Click += new System.EventHandler(this.btnLigarBomba_Click); + this.lblPressaoSP.AutoSize = true; + this.lblPressaoSP.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblPressaoSP.Location = new System.Drawing.Point(6, 55); + this.lblPressaoSP.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lblPressaoSP.Name = "lblPressaoSP"; + this.lblPressaoSP.Size = new System.Drawing.Size(72, 13); + this.lblPressaoSP.TabIndex = 29; + this.lblPressaoSP.Text = "Pressão SP"; // // pnlCameraRua // @@ -726,7 +916,7 @@ // chbSonarAtivado // this.chbSonarAtivado.AutoSize = true; - this.chbSonarAtivado.Location = new System.Drawing.Point(390, 310); + this.chbSonarAtivado.Location = new System.Drawing.Point(300, 310); this.chbSonarAtivado.Margin = new System.Windows.Forms.Padding(2); this.chbSonarAtivado.Name = "chbSonarAtivado"; this.chbSonarAtivado.Size = new System.Drawing.Size(92, 17); @@ -747,194 +937,17 @@ this.lblPressao.TabIndex = 38; this.lblPressao.Text = "80 psi"; // - // label1 + // chbImuAtivado // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.Location = new System.Drawing.Point(6, 94); - this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(50, 13); - this.label1.TabIndex = 35; - this.label1.Text = "Pot Min"; - // - // nudPotenciaBombaMin - // - this.nudPotenciaBombaMin.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.nudPotenciaBombaMin.Location = new System.Drawing.Point(6, 111); - this.nudPotenciaBombaMin.Margin = new System.Windows.Forms.Padding(2); - this.nudPotenciaBombaMin.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.nudPotenciaBombaMin.Name = "nudPotenciaBombaMin"; - this.nudPotenciaBombaMin.Size = new System.Drawing.Size(55, 19); - this.nudPotenciaBombaMin.TabIndex = 34; - this.nudPotenciaBombaMin.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label7); - this.groupBox2.Controls.Add(this.nudPotenciaBombaMax); - this.groupBox2.Controls.Add(this.label6); - this.groupBox2.Controls.Add(this.txtKd); - this.groupBox2.Controls.Add(this.label5); - this.groupBox2.Controls.Add(this.txtKi); - this.groupBox2.Controls.Add(this.label4); - this.groupBox2.Controls.Add(this.txtKp); - this.groupBox2.Controls.Add(this.label3); - this.groupBox2.Controls.Add(this.cmbModoBomba); - this.groupBox2.Controls.Add(this.btnLigarBomba); - this.groupBox2.Controls.Add(this.label1); - this.groupBox2.Controls.Add(this.btnDesligarBomba); - this.groupBox2.Controls.Add(this.nudPotenciaBombaMin); - this.groupBox2.Controls.Add(this.nudPressaoSP); - this.groupBox2.Controls.Add(this.lblPressaoSP); - this.groupBox2.Location = new System.Drawing.Point(5, 6); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(453, 141); - this.groupBox2.TabIndex = 37; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Bomba Pressurizadora"; - // - // groupBox3 - // - this.groupBox3.Controls.Add(this.label2); - this.groupBox3.Controls.Add(this.cmbModoAgitador); - this.groupBox3.Controls.Add(this.nudPotenciaAgitador); - this.groupBox3.Controls.Add(this.btnLigarAgitador); - this.groupBox3.Controls.Add(this.lblPotenciaSP); - this.groupBox3.Controls.Add(this.btnDeslsigarAgitador); - this.groupBox3.Location = new System.Drawing.Point(5, 177); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(453, 106); - this.groupBox3.TabIndex = 38; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "Agitador de Calda"; - // - // cmbModoAgitador - // - this.cmbModoAgitador.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbModoAgitador.FormattingEnabled = true; - this.cmbModoAgitador.Location = new System.Drawing.Point(6, 32); - this.cmbModoAgitador.Name = "cmbModoAgitador"; - this.cmbModoAgitador.Size = new System.Drawing.Size(121, 21); - this.cmbModoAgitador.TabIndex = 34; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.Location = new System.Drawing.Point(6, 16); - this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(107, 13); - this.label2.TabIndex = 37; - this.label2.Text = "Modo de Controle"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label3.Location = new System.Drawing.Point(6, 16); - this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(107, 13); - this.label3.TabIndex = 39; - this.label3.Text = "Modo de Controle"; - // - // cmbModoBomba - // - this.cmbModoBomba.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbModoBomba.FormattingEnabled = true; - this.cmbModoBomba.Location = new System.Drawing.Point(6, 32); - this.cmbModoBomba.Name = "cmbModoBomba"; - this.cmbModoBomba.Size = new System.Drawing.Size(121, 21); - this.cmbModoBomba.TabIndex = 38; - // - // txtKp - // - this.txtKp.Location = new System.Drawing.Point(149, 32); - this.txtKp.Name = "txtKp"; - this.txtKp.Size = new System.Drawing.Size(68, 20); - this.txtKp.TabIndex = 40; - this.txtKp.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.Location = new System.Drawing.Point(146, 16); - this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(22, 13); - this.label4.TabIndex = 41; - this.label4.Text = "Kp"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label5.Location = new System.Drawing.Point(146, 55); - this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(18, 13); - this.label5.TabIndex = 43; - this.label5.Text = "Ki"; - // - // txtKi - // - this.txtKi.Location = new System.Drawing.Point(149, 71); - this.txtKi.Name = "txtKi"; - this.txtKi.Size = new System.Drawing.Size(68, 20); - this.txtKi.TabIndex = 42; - this.txtKi.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label6.Location = new System.Drawing.Point(146, 94); - this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(22, 13); - this.label6.TabIndex = 45; - this.label6.Text = "Kd"; - // - // txtKd - // - this.txtKd.Location = new System.Drawing.Point(149, 110); - this.txtKd.Name = "txtKd"; - this.txtKd.Size = new System.Drawing.Size(68, 20); - this.txtKd.TabIndex = 44; - this.txtKd.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label7.Location = new System.Drawing.Point(78, 94); - this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(53, 13); - this.label7.TabIndex = 47; - this.label7.Text = "Pot Max"; - // - // nudPotenciaBombaMax - // - this.nudPotenciaBombaMax.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.nudPotenciaBombaMax.Location = new System.Drawing.Point(72, 111); - this.nudPotenciaBombaMax.Margin = new System.Windows.Forms.Padding(2); - this.nudPotenciaBombaMax.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.nudPotenciaBombaMax.Name = "nudPotenciaBombaMax"; - this.nudPotenciaBombaMax.Size = new System.Drawing.Size(55, 19); - this.nudPotenciaBombaMax.TabIndex = 46; - this.nudPotenciaBombaMax.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.chbImuAtivado.AutoSize = true; + this.chbImuAtivado.Location = new System.Drawing.Point(396, 310); + this.chbImuAtivado.Margin = new System.Windows.Forms.Padding(2); + this.chbImuAtivado.Name = "chbImuAtivado"; + this.chbImuAtivado.Size = new System.Drawing.Size(84, 17); + this.chbImuAtivado.TabIndex = 39; + this.chbImuAtivado.Text = "IMU ativado"; + this.chbImuAtivado.UseVisualStyleBackColor = true; + this.chbImuAtivado.CheckedChanged += new System.EventHandler(this.chbImuAtivado_CheckedChanged); // // frmOperacaoManual // @@ -942,6 +955,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.White; this.ClientSize = new System.Drawing.Size(1243, 649); + this.Controls.Add(this.chbImuAtivado); this.Controls.Add(this.lblPressao); this.Controls.Add(this.chbSonarAtivado); this.Controls.Add(this.flwCamerasSolo); @@ -980,7 +994,13 @@ this.tabDeteccoes.ResumeLayout(false); this.tabDeteccoes.PerformLayout(); this.tabPulverizador.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaAgitador)).EndInit(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMax)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMin)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nudPressaoSP)).EndInit(); this.pnlDir_EF.ResumeLayout(false); this.pnlDir_EF.PerformLayout(); @@ -990,12 +1010,6 @@ this.pnlDir_DT.PerformLayout(); this.pnlDir_DF.ResumeLayout(false); this.pnlDir_DF.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMin)).EndInit(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.groupBox3.ResumeLayout(false); - this.groupBox3.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudPotenciaBombaMax)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -1073,5 +1087,6 @@ private System.Windows.Forms.TextBox txtKp; private System.Windows.Forms.Label label7; private System.Windows.Forms.NumericUpDown nudPotenciaBombaMax; + private System.Windows.Forms.CheckBox chbImuAtivado; } } \ No newline at end of file diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs index 0359954ed..452940863 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs @@ -464,8 +464,8 @@ namespace AgroBase.Forms.Operacoes var imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU; try { - double angulo = imu?.Rotacao ?? 0; - double anguloCorrigido = imu?.RotacaoCorrigida ?? 0; + double angulo = imu?.yaw ?? 0; + double anguloCorrigido = imu?.YawSeguro ?? 0; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -270, (float)anguloCorrigido); } catch { } @@ -587,9 +587,9 @@ namespace AgroBase.Forms.Operacoes gridDados.Rows[36].Cells[1].Value = (_Atuador?.AnguloBarraDireita ?? 0).ToString("0.00"); gridDados.Rows[37].Cells[1].Value = (Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.AgitadorCalda?._Potencia ?? 0).ToString("0.00"); gridDados.Rows[38].Cells[1].Value = ""; - gridDados.Rows[39].Cells[1].Value = (_IMU?.InclinacaoLateral ?? 0).ToString("0.00"); - gridDados.Rows[40].Cells[1].Value = (_IMU?.InclinacaoFrontal ?? 0).ToString("0.00"); - gridDados.Rows[41].Cells[1].Value = (_IMU?.Rotacao ?? 0).ToString("0.00"); + gridDados.Rows[39].Cells[1].Value = (_IMU?.RollSeguro ?? 0).ToString("0.00"); + gridDados.Rows[40].Cells[1].Value = (_IMU?.PitchSeguro ?? 0).ToString("0.00"); + gridDados.Rows[41].Cells[1].Value = (_IMU?.YawSeguro ?? 0).ToString("0.00"); } #endregion @@ -760,8 +760,17 @@ namespace AgroBase.Forms.Operacoes private void chbSonarAtivado_CheckedChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Parametros.Controle.MovAuxilioSonar = ((CheckBox)sender).Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAuxilioSonar = ((CheckBox)sender).Checked; + var pC = Variaveis.OperacaoEmAndamento.Parametros.Controle; + pC.MovAuxilioSonar = ((CheckBox)sender).Checked; + pC.DirAuxilioSonar = ((CheckBox)sender).Checked; + } + + private void chbImuAtivado_CheckedChanged(object sender, EventArgs e) + { + var pC = Variaveis.OperacaoEmAndamento.Parametros.Controle; + pC.ImuAuxilioMovimento = ((CheckBox)sender).Checked; + pC.ImuAuxilioDirecional = ((CheckBox)sender).Checked; + pC.ImuDirecionalPreferirArco = ((CheckBox)sender).Checked; } private void chbSonarDesvioAutomatico_CheckedChanged(object sender, EventArgs e) diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.Designer.cs b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.Designer.cs index ff4909c27..a33abce68 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.Designer.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.Designer.cs @@ -88,13 +88,16 @@ this.btnSalvar = new System.Windows.Forms.Button(); this.chbSalvar = new System.Windows.Forms.CheckBox(); this.gpbConfiguracoesgerais = new System.Windows.Forms.GroupBox(); + this.chbGravarDadosPosProcessamento = new System.Windows.Forms.CheckBox(); this.txtDensidadeherbicida = new System.Windows.Forms.TextBox(); this.lblUnDensidadeherbicida = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.nudCapacidadereservatorio = new System.Windows.Forms.NumericUpDown(); this.lblUnCapcaidadereservatorio = new System.Windows.Forms.Label(); this.lblCapacidadereservatorio = new System.Windows.Forms.Label(); - this.chbGravarDadosPosProcessamento = new System.Windows.Forms.CheckBox(); + this.chbImuAuxilioMov = new System.Windows.Forms.CheckBox(); + this.chbImuAuxilioDir = new System.Windows.Forms.CheckBox(); + this.chbImuPreferirArco = new System.Windows.Forms.CheckBox(); this.gpbModulos.SuspendLayout(); this.gpbP_Knt.SuspendLayout(); this.gpbP_Sen.SuspendLayout(); @@ -162,7 +165,7 @@ this.gpbModulos.Margin = new System.Windows.Forms.Padding(6); this.gpbModulos.Name = "gpbModulos"; this.gpbModulos.Padding = new System.Windows.Forms.Padding(6); - this.gpbModulos.Size = new System.Drawing.Size(1187, 319); + this.gpbModulos.Size = new System.Drawing.Size(1187, 386); this.gpbModulos.TabIndex = 3; this.gpbModulos.TabStop = false; this.gpbModulos.Text = "Módulos necessários para executar a operação"; @@ -178,7 +181,7 @@ this.gpbP_Knt.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.gpbP_Knt.Location = new System.Drawing.Point(988, 105); this.gpbP_Knt.Name = "gpbP_Knt"; - this.gpbP_Knt.Size = new System.Drawing.Size(190, 205); + this.gpbP_Knt.Size = new System.Drawing.Size(190, 272); this.gpbP_Knt.TabIndex = 15; this.gpbP_Knt.TabStop = false; this.gpbP_Knt.Text = "Ajustes"; @@ -266,7 +269,7 @@ this.gpbP_Gps.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.gpbP_Gps.Location = new System.Drawing.Point(792, 105); this.gpbP_Gps.Name = "gpbP_Gps"; - this.gpbP_Gps.Size = new System.Drawing.Size(190, 205); + this.gpbP_Gps.Size = new System.Drawing.Size(190, 272); this.gpbP_Gps.TabIndex = 12; this.gpbP_Gps.TabStop = false; this.gpbP_Gps.Text = "Ajustes"; @@ -292,7 +295,7 @@ this.gpbP_Sen.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.gpbP_Sen.Location = new System.Drawing.Point(596, 105); this.gpbP_Sen.Name = "gpbP_Sen"; - this.gpbP_Sen.Size = new System.Drawing.Size(190, 205); + this.gpbP_Sen.Size = new System.Drawing.Size(190, 272); this.gpbP_Sen.TabIndex = 12; this.gpbP_Sen.TabStop = false; this.gpbP_Sen.Text = "Ajustes"; @@ -359,7 +362,7 @@ this.gpbP_Atu.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.gpbP_Atu.Location = new System.Drawing.Point(400, 105); this.gpbP_Atu.Name = "gpbP_Atu"; - this.gpbP_Atu.Size = new System.Drawing.Size(190, 205); + this.gpbP_Atu.Size = new System.Drawing.Size(190, 272); this.gpbP_Atu.TabIndex = 12; this.gpbP_Atu.TabStop = false; this.gpbP_Atu.Text = "Ajustes"; @@ -442,6 +445,8 @@ // // gpbP_Dir // + this.gpbP_Dir.Controls.Add(this.chbImuPreferirArco); + this.gpbP_Dir.Controls.Add(this.chbImuAuxilioDir); this.gpbP_Dir.Controls.Add(this.chbDirecionalAutomatico); this.gpbP_Dir.Controls.Add(this.lblAngulomax); this.gpbP_Dir.Controls.Add(this.nudAnguloMinimo); @@ -453,7 +458,7 @@ this.gpbP_Dir.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.gpbP_Dir.Location = new System.Drawing.Point(204, 105); this.gpbP_Dir.Name = "gpbP_Dir"; - this.gpbP_Dir.Size = new System.Drawing.Size(190, 205); + this.gpbP_Dir.Size = new System.Drawing.Size(190, 272); this.gpbP_Dir.TabIndex = 12; this.gpbP_Dir.TabStop = false; this.gpbP_Dir.Text = "Ajustes"; @@ -557,6 +562,7 @@ // // gpbP_Mov // + this.gpbP_Mov.Controls.Add(this.chbImuAuxilioMov); this.gpbP_Mov.Controls.Add(this.chbMovAuxilioSonar); this.gpbP_Mov.Controls.Add(this.chbMovimentacaoAutomatica); this.gpbP_Mov.Controls.Add(this.nudVelocidadeComErvas); @@ -568,7 +574,7 @@ this.gpbP_Mov.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.gpbP_Mov.Location = new System.Drawing.Point(8, 105); this.gpbP_Mov.Name = "gpbP_Mov"; - this.gpbP_Mov.Size = new System.Drawing.Size(190, 205); + this.gpbP_Mov.Size = new System.Drawing.Size(190, 272); this.gpbP_Mov.TabIndex = 10; this.gpbP_Mov.TabStop = false; this.gpbP_Mov.Text = "Ajustes"; @@ -821,13 +827,24 @@ this.gpbConfiguracoesgerais.Controls.Add(this.nudCapacidadereservatorio); this.gpbConfiguracoesgerais.Controls.Add(this.lblUnCapcaidadereservatorio); this.gpbConfiguracoesgerais.Controls.Add(this.lblCapacidadereservatorio); - this.gpbConfiguracoesgerais.Location = new System.Drawing.Point(15, 411); + this.gpbConfiguracoesgerais.Location = new System.Drawing.Point(15, 478); this.gpbConfiguracoesgerais.Name = "gpbConfiguracoesgerais"; - this.gpbConfiguracoesgerais.Size = new System.Drawing.Size(1187, 256); + this.gpbConfiguracoesgerais.Size = new System.Drawing.Size(1187, 189); this.gpbConfiguracoesgerais.TabIndex = 8; this.gpbConfiguracoesgerais.TabStop = false; this.gpbConfiguracoesgerais.Text = "Gerais"; // + // chbGravarDadosPosProcessamento + // + this.chbGravarDadosPosProcessamento.AutoSize = true; + this.chbGravarDadosPosProcessamento.Location = new System.Drawing.Point(14, 156); + this.chbGravarDadosPosProcessamento.Margin = new System.Windows.Forms.Padding(6); + this.chbGravarDadosPosProcessamento.Name = "chbGravarDadosPosProcessamento"; + this.chbGravarDadosPosProcessamento.Size = new System.Drawing.Size(354, 28); + this.chbGravarDadosPosProcessamento.TabIndex = 15; + this.chbGravarDadosPosProcessamento.Text = "Gravar dados para pós processamento"; + this.chbGravarDadosPosProcessamento.UseVisualStyleBackColor = true; + // // txtDensidadeherbicida // this.txtDensidadeherbicida.Location = new System.Drawing.Point(18, 118); @@ -885,16 +902,41 @@ this.lblCapacidadereservatorio.TabIndex = 9; this.lblCapacidadereservatorio.Text = "Capacidade reservatório"; // - // chbGravarDadosPosProcessamento + // chbImuAuxilioMov // - this.chbGravarDadosPosProcessamento.AutoSize = true; - this.chbGravarDadosPosProcessamento.Location = new System.Drawing.Point(14, 219); - this.chbGravarDadosPosProcessamento.Margin = new System.Windows.Forms.Padding(6); - this.chbGravarDadosPosProcessamento.Name = "chbGravarDadosPosProcessamento"; - this.chbGravarDadosPosProcessamento.Size = new System.Drawing.Size(354, 28); - this.chbGravarDadosPosProcessamento.TabIndex = 15; - this.chbGravarDadosPosProcessamento.Text = "Gravar dados para pós processamento"; - this.chbGravarDadosPosProcessamento.UseVisualStyleBackColor = true; + this.chbImuAuxilioMov.AutoSize = true; + this.chbImuAuxilioMov.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F); + this.chbImuAuxilioMov.Location = new System.Drawing.Point(6, 204); + this.chbImuAuxilioMov.Margin = new System.Windows.Forms.Padding(6); + this.chbImuAuxilioMov.Name = "chbImuAuxilioMov"; + this.chbImuAuxilioMov.Size = new System.Drawing.Size(100, 22); + this.chbImuAuxilioMov.TabIndex = 17; + this.chbImuAuxilioMov.Text = "Auxílio IMU"; + this.chbImuAuxilioMov.UseVisualStyleBackColor = true; + // + // chbImuAuxilioDir + // + this.chbImuAuxilioDir.AutoSize = true; + this.chbImuAuxilioDir.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F); + this.chbImuAuxilioDir.Location = new System.Drawing.Point(9, 204); + this.chbImuAuxilioDir.Margin = new System.Windows.Forms.Padding(6); + this.chbImuAuxilioDir.Name = "chbImuAuxilioDir"; + this.chbImuAuxilioDir.Size = new System.Drawing.Size(100, 22); + this.chbImuAuxilioDir.TabIndex = 18; + this.chbImuAuxilioDir.Text = "Auxílio IMU"; + this.chbImuAuxilioDir.UseVisualStyleBackColor = true; + // + // chbImuPreferirArco + // + this.chbImuPreferirArco.AutoSize = true; + this.chbImuPreferirArco.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F); + this.chbImuPreferirArco.Location = new System.Drawing.Point(9, 228); + this.chbImuPreferirArco.Margin = new System.Windows.Forms.Padding(6); + this.chbImuPreferirArco.Name = "chbImuPreferirArco"; + this.chbImuPreferirArco.Size = new System.Drawing.Size(135, 22); + this.chbImuPreferirArco.TabIndex = 19; + this.chbImuPreferirArco.Text = "Auxílio IMU Arco"; + this.chbImuPreferirArco.UseVisualStyleBackColor = true; // // frmParametrizacaoOperacao // @@ -1012,5 +1054,8 @@ private System.Windows.Forms.CheckBox chbMovAuxilioSonar; private System.Windows.Forms.ComboBox cmbAgitadorModo; private System.Windows.Forms.CheckBox chbGravarDadosPosProcessamento; + private System.Windows.Forms.CheckBox chbImuAuxilioMov; + private System.Windows.Forms.CheckBox chbImuAuxilioDir; + private System.Windows.Forms.CheckBox chbImuPreferirArco; } } \ No newline at end of file diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs index b900fc900..0279b2f51 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs @@ -79,6 +79,9 @@ namespace AgroBase.Forms.Operacoes nudAtuarem.Value = Convert.ToInt32(_Parametros.Controle.AtuPercentualInicioPulverizacao); chbImuParadaInclinacao.Checked = _Parametros.Controle.ImuParadaPorInclinacao; + chbImuAuxilioMov.Checked = _Parametros.Controle.ImuAuxilioMovimento; + chbImuAuxilioDir.Checked = _Parametros.Controle.ImuAuxilioDirecional; + chbImuPreferirArco.Checked = _Parametros.Controle.ImuDirecionalPreferirArco; chbOakParadaObstaculo.Checked = _Parametros.Controle.OakParadaPorObstaculo; chbDirAuxilioSonar.Checked = _Parametros.Controle.DirAuxilioSonar; @@ -144,24 +147,28 @@ namespace AgroBase.Forms.Operacoes void SalvarOperacao() { - Variaveis.OperacaoEmAndamento.Parametros.Controle.ImuParadaPorInclinacao = chbImuParadaInclinacao.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.OakParadaPorObstaculo = chbOakParadaObstaculo.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAuxilioSonar = chbDirAuxilioSonar.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.MovAuxilioSonar = chbMovAuxilioSonar.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.FrenagemAutomaticaAoParar = chbFrenagem.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuAgitadorModo = (ModoAgitadorCalda)cmbAgitadorModo.SelectedIndex; - Variaveis.OperacaoEmAndamento.Parametros.Controle.RegistrarDadosPosProcessamento = chbGravarDadosPosProcessamento.Checked; + var pC = Variaveis.OperacaoEmAndamento.Parametros.Controle; + pC.ImuParadaPorInclinacao = chbImuParadaInclinacao.Checked; + pC.ImuAuxilioMovimento = chbImuAuxilioMov.Checked; + pC.ImuAuxilioDirecional = chbImuAuxilioDir.Checked; + pC.ImuDirecionalPreferirArco = chbImuPreferirArco.Checked; + pC.OakParadaPorObstaculo = chbOakParadaObstaculo.Checked; + pC.DirAuxilioSonar = chbDirAuxilioSonar.Checked; + pC.MovAuxilioSonar = chbMovAuxilioSonar.Checked; + pC.FrenagemAutomaticaAoParar = chbFrenagem.Checked; + pC.AtuAgitadorModo = (ModoAgitadorCalda)cmbAgitadorModo.SelectedIndex; + pC.RegistrarDadosPosProcessamento = chbGravarDadosPosProcessamento.Checked; Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios = ModulosMandatorios.Where(x => x.Utilizar).ToList(); - Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico = chbPulverizadorAutomatico.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPercentualInicioPulverizacao = (double)(nudAtuarem.Value / 100); - Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico = chbMovimentacaoAutomatica.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeSErvasPercent = (int)(nudVelocidadeSemErvas.Value); - Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent = (int)(nudVelocidadeComErvas.Value); - Variaveis.OperacaoEmAndamento.Parametros.Controle.DirecionalAutomatico = chbDirecionalAutomatico.Checked; - Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo = (int)(nudAnguloMaximo.Value); - Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento = (int)(nudVelocidadeMP.Value); - Variaveis.OperacaoEmAndamento.Parametros.Controle.AnteciparManobraCorredorM = Convert.ToDouble(txtAnteciparManobraM.Text.Replace(".", ",")); + pC.PulverizadorAutomatico = chbPulverizadorAutomatico.Checked; + pC.AtuPercentualInicioPulverizacao = (double)(nudAtuarem.Value / 100); + pC.MovimentoAutomatico = chbMovimentacaoAutomatica.Checked; + pC.MovVelocidadeSErvasPercent = (int)(nudVelocidadeSemErvas.Value); + pC.MovVelocidadeCErvasPercent = (int)(nudVelocidadeComErvas.Value); + pC.DirecionalAutomatico = chbDirecionalAutomatico.Checked; + pC.DirAnguloMaximo = (int)(nudAnguloMaximo.Value); + pC.DirVelocidadeMovimento = (int)(nudVelocidadeMP.Value); + pC.AnteciparManobraCorredorM = Convert.ToDouble(txtAnteciparManobraM.Text.Replace(".", ",")); Variaveis.OperacaoEmAndamento.tmrLogsInterval = (double)(nudTemposalvarlog.Value * 1000); Variaveis.OperacaoEmAndamento.Parametros.QtdBicos = (int)nudQtdBicos.Value; Variaveis.OperacaoEmAndamento.Parametros.QtdCamerasSolo = (int)nudQtdCameras.Value; diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs index f9e4823a4..bb1ab4dc3 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs @@ -1455,7 +1455,7 @@ namespace AgroBase.Forms.Operacoes lblMagnetometro.ForeColor = !LogImu.Iniciado ? Color.Red : Color.Black; pnlOrientacaoMagnetometro.Invalidate(); pnlInclinacao.Invalidate(); - visualizador3D.AtualizarAngulos(LogImu.InclinacaoFrontal, LogImu.InclinacaoLateral, -LogsOperacao[idxMomentoAtual].Gps.OrientacaoReal); + visualizador3D.AtualizarAngulos(LogImu.PitchSeguro, LogImu.RollSeguro, -LogsOperacao[idxMomentoAtual].Gps.OrientacaoReal); //txtTemperatura.Text = LogImu.Temperatura.ToString("0.00"); //txtAltitude.Text = LogImu.Altitude.ToString("0.00"); //txtPressao.Text = LogImu.Pressao + " Pa (" + (LogImu.Pressao / 101300.0).ToString("0.00") + " atm)"; @@ -1897,8 +1897,8 @@ namespace AgroBase.Forms.Operacoes // Calcular a posição do círculo com base nos ângulos var Log = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual).IMU; - int circlePosX = centerX + (int)((Log?.InclinacaoLateral ?? 0) * (pnlInclinacao.Width / 2 - radius) / 90); - int circlePosY = centerY - (int)((Log?.InclinacaoFrontal ?? 0) * (pnlInclinacao.Height / 2 - radius) / 90); + int circlePosX = centerX + (int)((Log?.RollSeguro ?? 0) * (pnlInclinacao.Width / 2 - radius) / 90); + int circlePosY = centerY - (int)((Log?.PitchSeguro ?? 0) * (pnlInclinacao.Height / 2 - radius) / 90); // Desenhar o círculo Brush brush = new SolidBrush(Color.Red); diff --git a/AgroBase/AgroBase/Forms/frmAcompanhamento.cs b/AgroBase/AgroBase/Forms/frmAcompanhamento.cs index 7fdaddb09..26abc9588 100644 --- a/AgroBase/AgroBase/Forms/frmAcompanhamento.cs +++ b/AgroBase/AgroBase/Forms/frmAcompanhamento.cs @@ -411,8 +411,8 @@ namespace AgroBase.Forms private void pnlOrientacaoMagnetometro_Paint(object sender, PaintEventArgs e) { var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; - double Angulo = _Sensoriamento.IMU.Rotacao; - double AnguloCorrigido = _Sensoriamento.IMU.RotacaoCorrigida; + double Angulo = _Sensoriamento.IMU.yaw; + double AnguloCorrigido = _Sensoriamento.IMU.YawSeguro; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, -90, (float)AnguloCorrigido); } diff --git a/AgroBase/AgroBase/Forms/frmOperarioSonar.cs b/AgroBase/AgroBase/Forms/frmOperarioSonar.cs index 0dfb9317e..eafb4a008 100644 --- a/AgroBase/AgroBase/Forms/frmOperarioSonar.cs +++ b/AgroBase/AgroBase/Forms/frmOperarioSonar.cs @@ -145,7 +145,7 @@ namespace AgroBase.Forms private async void btnLeituraIMU_Click(object sender, EventArgs e) { pnlInclinacao.Invalidate(); - lblLeituraIMU.Text = $"Leitura em: {FuncoesGlobais.TimestampToDate(VisualWorkerService.DadosLeitura.Imu?.timestamp ?? 0)}"; + lblLeituraIMU.Text = $"Leitura em: {FuncoesGlobais.TimestampToDate(VisualWorkerService.DadosLeitura.Imu?.dados?.timestamp ?? 0)}"; } private void AtualizarDadosAnalise() @@ -308,8 +308,8 @@ namespace AgroBase.Forms private void pnlInclinacao_Paint(object sender, PaintEventArgs e) { Panel _pnlInclinacao = sender as Panel; - double AnguloX = VisualWorkerService.DadosLeitura.Imu?.roll ?? 0; - double AnguloY = VisualWorkerService.DadosLeitura.Imu?.pitch ?? 0; + double AnguloX = VisualWorkerService.DadosLeitura.Imu?.dados?.roll ?? 0; + double AnguloY = VisualWorkerService.DadosLeitura.Imu?.dados?.pitch ?? 0; Graphics g = e.Graphics; int centerX = _pnlInclinacao.Width / 2; diff --git a/AgroBase/AgroBase/Forms/frmWT901C.cs b/AgroBase/AgroBase/Forms/frmWT901C.cs index f2eb14e31..c6cd2133c 100644 --- a/AgroBase/AgroBase/Forms/frmWT901C.cs +++ b/AgroBase/AgroBase/Forms/frmWT901C.cs @@ -67,22 +67,37 @@ namespace AgroBase.Forms { if (cmbDispositivo.SelectedIndex < 0 || cmbDispositivo.SelectedIndex >= ListaCameras.Count) return; - var Camera = ListaCameras[cmbDispositivo.SelectedIndex]; - if (Camera.imu == null) return; - - if (Camera.mx_id == Variaveis.OperacaoEmAndamento.DispSen?.Dados?.CameraCaminho?.Id) - Camera.imu = Variaveis.OperacaoEmAndamento.DispSen.Dados?.CameraCaminho?.cam?.imu; - else if (Variaveis.OperacaoEmAndamento.DispSen.Dados?.CamerasSolo?.Any(x => x?.Id == Camera.mx_id) ?? false) - Camera.imu = Variaveis.OperacaoEmAndamento.DispSen.Dados?.CamerasSolo?.FirstOrDefault(x => x?.Id == Camera.mx_id)?.cam?.imu; - - //OperacaoSensoriamentoLogImuModel Imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU; - OperacaoSensoriamentoLogImuModel Imu = new OperacaoSensoriamentoLogImuModel() + OperacaoSensoriamentoLogImuModel Imu = new OperacaoSensoriamentoLogImuModel(); + if (cmbDispositivo.SelectedIndex == 0) { - InclinacaoFrontal = Camera.imu.pitch, - InclinacaoLateral = Camera.imu.roll, - Rotacao = Camera.imu.yaw, - RotacaoCorrigida = Camera.imu.yaw, - }; + var imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU; + Imu = new OperacaoSensoriamentoLogImuModel() + { + InclinacaoFrontal = imu.pitch, + InclinacaoLateral = imu.roll, + Rotacao = imu.yaw, + RotacaoCorrigida = imu.yaw, + }; + } + else + { + var Camera = ListaCameras[cmbDispositivo.SelectedIndex]; + if (Camera.imu == null) return; + + if (Camera.mx_id == Variaveis.OperacaoEmAndamento.DispSen?.Dados?.CameraCaminho?.Id) + Camera.imu = Variaveis.OperacaoEmAndamento.DispSen.Dados?.CameraCaminho?.cam?.imu; + else if (Variaveis.OperacaoEmAndamento.DispSen.Dados?.CamerasSolo?.Any(x => x?.Id == Camera.mx_id) ?? false) + Camera.imu = Variaveis.OperacaoEmAndamento.DispSen.Dados?.CamerasSolo?.FirstOrDefault(x => x?.Id == Camera.mx_id)?.cam?.imu; + + Imu = new OperacaoSensoriamentoLogImuModel() + { + InclinacaoFrontal = Camera.imu.pitch, + InclinacaoLateral = Camera.imu.roll, + Rotacao = Camera.imu.yaw, + RotacaoCorrigida = Camera.imu.yaw, + }; + } + AnguloX = Imu.InclinacaoFrontal; AnguloY = Imu.InclinacaoLateral; AnguloZ = Imu.Rotacao; @@ -96,6 +111,8 @@ namespace AgroBase.Forms ListaCameras = CameraWorkerService.GetListaCameras(); cmbDispositivo.Items.Clear(); cmbDispositivo.Items.AddRange(ListaCameras.Select(x => x.modelo).ToArray()); + + cmbDispositivo.SelectedIndex = 0; } private void PopularDadosGrid() diff --git a/AgroBase/AgroBase/Models/Modules/ModuloIMUModel.cs b/AgroBase/AgroBase/Models/Modules/ModuloIMUModel.cs new file mode 100644 index 000000000..da1dd7d80 --- /dev/null +++ b/AgroBase/AgroBase/Models/Modules/ModuloIMUModel.cs @@ -0,0 +1,452 @@ +using AgroBase.Models.Operadores; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using static AgroBase.Models.Enums; + +namespace AgroBase.Models.Modules +{ + public class ModuloIMUModel + { + // ============================================================ + // Estado geral + // ============================================================ + + public bool valido { get; set; } + + /// + /// normal, single_source, redundante, sem_imu, inicializando... + /// + public string modo { get; set; } = ""; + + // ============================================================ + // Atitude final do robô + // ============================================================ + + public double roll { get; set; } + public double pitch { get; set; } + public double yaw { get; set; } + + public double roll_filtrado { get; set; } + public double pitch_filtrado { get; set; } + public double yaw_filtrado { get; set; } + + /// + /// Compatibilidade com contrato antigo. + /// Normalmente espelha roll_filtrado. + /// + public double roll_seg { get; set; } + + /// + /// Compatibilidade com contrato antigo. + /// Normalmente espelha pitch_filtrado. + /// + public double pitch_seg { get; set; } + + // ============================================================ + // Tendência angular + // ============================================================ + + public double roll_rate_dps { get; set; } + public double pitch_rate_dps { get; set; } + public double yaw_rate_dps { get; set; } + + public double roll_rate_filtrado_dps { get; set; } + public double pitch_rate_filtrado_dps { get; set; } + + // ============================================================ + // Risco / segurança operacional + // ============================================================ + + /// + /// normal, attention, risk, critical, emergency, unknown. + /// + public string risk_level { get; set; } = "unknown"; + + /// + /// 0 normal, 1 attention, 2 risk, 3 critical, 4 emergency. + /// + public int risk_level_num { get; set; } + + public double risk_score { get; set; } + + public List motivos_risco { get; set; } = new List(); + + /// + /// normal, reduzir_velocidade_leve, reduzir_velocidade_forte, + /// parada_controlada, emergency_stop. + /// + public string acao_sugerida { get; set; } = ""; + + /// + /// Fator recomendado para movimentação. + /// 1.0 = normal, 0.70 = reduz leve, 0.35 = reduz forte, 0 = parar. + /// + public double velocidade_factor { get; set; } = 1.0; + + public bool bloquear_avanco { get; set; } + public bool stop { get; set; } + public bool emergency_stop { get; set; } + + // ============================================================ + // Recuperação / intervenção humana + // ============================================================ + + public bool recovery_required { get; set; } + public bool recovery_mode_allowed { get; set; } + public bool auto_resume_allowed { get; set; } + public bool stable_to_resume { get; set; } + + public double stable_to_resume_s { get; set; } + + /// + /// aguardar_operador, operador_pode_liberar_retomada, sem_acao... + /// + public string recovery_hint { get; set; } = ""; + + // ============================================================ + // Fusão / redundância dos sensores + // ============================================================ + + public double confidence { get; set; } + + public string fonte_principal { get; set; } = ""; + + public bool single_source { get; set; } + + public int sensors_count { get; set; } + public int sensors_valid_count { get; set; } + public int sensors_ignored_count { get; set; } + + public bool sensors_agree { get; set; } + + public double roll_disagreement_deg { get; set; } + public double pitch_disagreement_deg { get; set; } + public double max_disagreement_deg { get; set; } + + public List fontes { get; set; } = new List(); + public List fontes_ignoradas { get; set; } = new List(); + public List divergentes { get; set; } = new List(); + + // ============================================================ + // Índices diagnósticos + // ============================================================ + + public double estabilidade_idx { get; set; } + + public double oscilacao_roll_std { get; set; } + public double oscilacao_pitch_std { get; set; } + public double oscilacao_total_std { get; set; } + + // ============================================================ + // Tempo / saúde de publicação + // ============================================================ + + /// + /// Timestamp principal. Normalmente em ms. + /// + public double timestamp { get; set; } + + /// + /// Timestamp do último pacote/fusão. Normalmente em segundos. + /// + public double last_packet_ts { get; set; } + + /// + /// Timestamp da última publicação. Normalmente em segundos. + /// + public double last_publish_ts { get; set; } + + public double ultimo_erro_ts { get; set; } + + /// + /// Latência normalmente em segundos no contrato Python. + /// + public double latencia { get; set; } + + /// + /// Frequência real do loop final. + /// + public double frequencia { get; set; } + + // ============================================================ + // Saúde do módulo final + // ============================================================ + + public ManagerWorkerMessageResponseModulosPendentesModel saude { get; set; } = new ManagerWorkerMessageResponseModulosPendentesModel(); + + // ============================================================ + // Extras + // ============================================================ + + [JsonExtensionData] + public IDictionary Extra { get; set; } = new Dictionary(); + + // ============================================================ + // Helpers para UI / controle + // ============================================================ + + [JsonIgnore] + public bool Iniciado => valido; + + [JsonIgnore] + public bool Operacional => valido && saude != null && (saude.status == StatusModulo.Operante || saude.status == StatusModulo.Alerta); + + [JsonIgnore] + public bool DeveParar => + emergency_stop || + stop || + bloquear_avanco || + risk_level_num >= 3; + + [JsonIgnore] + public bool DeveReduzir => + !DeveParar && risk_level_num >= 1; + + [JsonIgnore] + public double RollSeguro => + roll_filtrado != 0 ? roll_filtrado : + roll_seg != 0 ? roll_seg : + roll; + + [JsonIgnore] + public double PitchSeguro => + pitch_filtrado != 0 ? pitch_filtrado : + pitch_seg != 0 ? pitch_seg : + pitch; + + [JsonIgnore] + public double YawSeguro => + yaw_filtrado != 0 ? yaw_filtrado : yaw; + + [JsonIgnore] + public double LatenciaMsFinal + { + get + { + if (latencia <= 0) return 0; + + // Se veio em segundos. + if (latencia < 10) return latencia * 1000.0; + + // Se algum dia vier direto em ms. + return latencia; + } + } + + [JsonIgnore] + public double TimestampSegundos + { + get + { + if (timestamp <= 0) return 0; + + // timestamp em ms. + if (timestamp > 100000000000.0) + return timestamp / 1000.0; + + return timestamp; + } + } + + [JsonIgnore] + public double IdadeSegundos + { + get + { + var ts = TimestampSegundos; + if (ts <= 0) return 999.0; + + var now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 1000.0; + return Math.Max(0, now - ts); + } + } + + public ModuloIMUModel Clone() + { + return new ModuloIMUModel + { + valido = valido, + modo = modo, + + roll = roll, + pitch = pitch, + yaw = yaw, + + roll_filtrado = roll_filtrado, + pitch_filtrado = pitch_filtrado, + yaw_filtrado = yaw_filtrado, + + roll_seg = roll_seg, + pitch_seg = pitch_seg, + + roll_rate_dps = roll_rate_dps, + pitch_rate_dps = pitch_rate_dps, + yaw_rate_dps = yaw_rate_dps, + + roll_rate_filtrado_dps = roll_rate_filtrado_dps, + pitch_rate_filtrado_dps = pitch_rate_filtrado_dps, + + risk_level = risk_level, + risk_level_num = risk_level_num, + risk_score = risk_score, + motivos_risco = motivos_risco?.ToList() ?? new List(), + + acao_sugerida = acao_sugerida, + velocidade_factor = velocidade_factor, + + bloquear_avanco = bloquear_avanco, + stop = stop, + emergency_stop = emergency_stop, + + recovery_required = recovery_required, + recovery_mode_allowed = recovery_mode_allowed, + auto_resume_allowed = auto_resume_allowed, + stable_to_resume = stable_to_resume, + stable_to_resume_s = stable_to_resume_s, + recovery_hint = recovery_hint, + + confidence = confidence, + fonte_principal = fonte_principal, + single_source = single_source, + + sensors_count = sensors_count, + sensors_valid_count = sensors_valid_count, + sensors_ignored_count = sensors_ignored_count, + sensors_agree = sensors_agree, + + roll_disagreement_deg = roll_disagreement_deg, + pitch_disagreement_deg = pitch_disagreement_deg, + max_disagreement_deg = max_disagreement_deg, + + fontes = fontes?.Select(x => x.Clone()).ToList() ?? new List(), + fontes_ignoradas = fontes_ignoradas?.Select(x => x.Clone()).ToList() ?? new List(), + divergentes = divergentes?.Select(x => x.Clone()).ToList() ?? new List(), + + estabilidade_idx = estabilidade_idx, + oscilacao_roll_std = oscilacao_roll_std, + oscilacao_pitch_std = oscilacao_pitch_std, + oscilacao_total_std = oscilacao_total_std, + + timestamp = timestamp, + last_packet_ts = last_packet_ts, + last_publish_ts = last_publish_ts, + ultimo_erro_ts = ultimo_erro_ts, + latencia = latencia, + frequencia = frequencia, + + saude = saude, + + Extra = Extra?.ToDictionary( + x => x.Key, + x => x.Value?.DeepClone() + ) ?? new Dictionary() + }; + } + } + + public class ModuloIMUFonteModel + { + public string mx_id { get; set; } = ""; + public string modelo { get; set; } = ""; + + public double roll { get; set; } + public double pitch { get; set; } + public double yaw { get; set; } + + public double roll_rate_dps { get; set; } + public double pitch_rate_dps { get; set; } + + public double idade_s { get; set; } + public double confidence { get; set; } + public double peso_base { get; set; } + + [JsonExtensionData] + public IDictionary Extra { get; set; } = new Dictionary(); + + public ModuloIMUFonteModel Clone() + { + return new ModuloIMUFonteModel + { + mx_id = mx_id, + modelo = modelo, + + roll = roll, + pitch = pitch, + yaw = yaw, + + roll_rate_dps = roll_rate_dps, + pitch_rate_dps = pitch_rate_dps, + + idade_s = idade_s, + confidence = confidence, + peso_base = peso_base, + + Extra = Extra?.ToDictionary( + x => x.Key, + x => x.Value?.DeepClone() + ) ?? new Dictionary() + }; + } + } + + public class ModuloIMUFonteIgnoradaModel + { + public string mx_id { get; set; } = ""; + public string modelo { get; set; } = ""; + + public double idade_s { get; set; } + + public List motivos { get; set; } = new List(); + + [JsonExtensionData] + public IDictionary Extra { get; set; } = new Dictionary(); + + public ModuloIMUFonteIgnoradaModel Clone() + { + return new ModuloIMUFonteIgnoradaModel + { + mx_id = mx_id, + modelo = modelo, + idade_s = idade_s, + motivos = motivos?.ToList() ?? new List(), + + Extra = Extra?.ToDictionary( + x => x.Key, + x => x.Value?.DeepClone() + ) ?? new Dictionary() + }; + } + } + + public class ModuloIMUFonteDivergenteModel + { + public string mx_id { get; set; } = ""; + + public double roll { get; set; } + public double pitch { get; set; } + public double confidence { get; set; } + + [JsonExtensionData] + public IDictionary Extra { get; set; } = new Dictionary(); + + public ModuloIMUFonteDivergenteModel Clone() + { + return new ModuloIMUFonteDivergenteModel + { + mx_id = mx_id, + roll = roll, + pitch = pitch, + confidence = confidence, + + Extra = Extra?.ToDictionary( + x => x.Key, + x => x.Value?.DeepClone() + ) ?? new Dictionary() + }; + } + } + +} diff --git a/AgroBase/AgroBase/Models/OAKCameraModel.cs b/AgroBase/AgroBase/Models/OAKCameraModel.cs index a3c7fd56e..ec72b9cdd 100644 --- a/AgroBase/AgroBase/Models/OAKCameraModel.cs +++ b/AgroBase/AgroBase/Models/OAKCameraModel.cs @@ -1,8 +1,11 @@ using AgroBase.Models.Operadores; using AgroBase.Services.Operadores; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Drawing; +using System.Linq; using System.Threading.Tasks; using static AgroBase.Models.Enums; @@ -173,25 +176,249 @@ namespace AgroBase.Models { public OAKImuDataModel dados { get; set; } public ManagerWorkerMessageResponseModulosPendentesModel saude { get; set; } + + public OAKImuModel Clone() + { + return new OAKImuModel() + { + dados = dados?.Clone(), + saude = saude + }; + } } public class OAKImuDataModel { + // ============================================================ + // Identificação / validade + // ============================================================ + + public bool valido { get; set; } + + public string mx_id { get; set; } = ""; + public string sensor { get; set; } = ""; + public string tipo { get; set; } = ""; + + public bool calibrado { get; set; } + public bool calibrando { get; set; } + + // ============================================================ + // Timestamps + // ============================================================ + + /// + /// Timestamp principal. Normalmente em ms no contrato Python. + /// public double timestamp { get; set; } + + /// + /// Timestamp do último pacote recebido da OAK, geralmente em segundos. + /// + public double last_packet_ts { get; set; } + + /// + /// Timestamp da última publicação no Redis, geralmente em segundos. + /// + public double last_publish_ts { get; set; } + + public double ultimo_erro_ts { get; set; } + + // ============================================================ + // Atitude instantânea + // ============================================================ + public double roll { get; set; } - public double roll_seg { get; set; } public double pitch { get; set; } - public double pitch_seg { get; set; } public double yaw { get; set; } + + // Mantém compatibilidade com tela antiga. public double yaw_fixed { get; set; } - public double vel_mps { get; set; } - public bool em_movimento { get; set; } - public double movimento_idx { get; set; } - public double rugosidade_idx { get; set; } - public double impacto_idx { get; set; } - public double estabilidade_idx { get; set; } - public double latencia { get; set; } + + // ============================================================ + // Atitude filtrada / segurança + // ============================================================ + + public double roll_filtrado { get; set; } + public double pitch_filtrado { get; set; } + public double yaw_filtrado { get; set; } + + /// + /// Alias de segurança/compatibilidade. No contrato novo tende a espelhar roll_filtrado. + /// + public double roll_seg { get; set; } + + /// + /// Alias de segurança/compatibilidade. No contrato novo tende a espelhar pitch_filtrado. + /// + public double pitch_seg { get; set; } + + // ============================================================ + // Tendência angular + // ============================================================ + + public double roll_rate_dps { get; set; } + public double pitch_rate_dps { get; set; } + public double yaw_rate_dps { get; set; } + + // ============================================================ + // Qualidade do quaternion / DepthAI + // ============================================================ + + public double? rotation_accuracy_rad { get; set; } + + // Caso a gente publique futuramente qual campo foi usado: + // rotationVector, gameRotationVector, etc. + public string rotation_vector_source { get; set; } = ""; + + // ============================================================ + // Saúde / performance do loop + // ============================================================ + + /// + /// Novo contrato Python pode publicar frequencia. + /// public double frequencia { get; set; } + + /// + /// Campo antigo. + /// + public double frequencia_hz { get; set; } + + /// + /// Novo contrato Python pode publicar latencia em segundos. + /// + public double latencia { get; set; } + + /// + /// Campo antigo, em milissegundos. + /// + public double latencia_ms { get; set; } + + public int packets_lidos { get; set; } + public int packets_publicados { get; set; } + public int erros { get; set; } + + // ============================================================ + // Campos antigos mantidos para compatibilidade + // ============================================================ + + public double rugosidade { get; set; } + public double impacto { get; set; } + public double estabilidade { get; set; } + + public bool movimento_detectado { get; set; } + + // ============================================================ + // Extras + // ============================================================ + + [JsonExtensionData] + public IDictionary Extra { get; set; } = new Dictionary(); + + // ============================================================ + // Helpers seguros para UI + // ============================================================ + + [JsonIgnore] + public double RollSeguro => roll_seg != 0 ? roll_seg : roll_filtrado; + + [JsonIgnore] + public double PitchSeguro => pitch_seg != 0 ? pitch_seg : pitch_filtrado; + + [JsonIgnore] + public double YawSeguro => yaw_filtrado != 0 ? yaw_filtrado : yaw; + + [JsonIgnore] + public double FrequenciaHzFinal + { + get + { + if (frequencia_hz > 0) return frequencia_hz; + if (frequencia > 0) return frequencia; + return 0; + } + } + + [JsonIgnore] + public double LatenciaMsFinal + { + get + { + if (latencia_ms > 0) return latencia_ms; + + // Se latencia vier em segundos, converte para ms. + if (latencia > 0 && latencia < 10) return latencia * 1000.0; + + // Se por algum motivo já vier em ms. + if (latencia >= 10) return latencia; + + return 0; + } + } + + [JsonIgnore] + public bool TemLeituraAtitude => + valido && + (roll != 0 || pitch != 0 || yaw != 0 || roll_filtrado != 0 || pitch_filtrado != 0); + + public OAKImuDataModel Clone() + { + return new OAKImuDataModel + { + valido = valido, + + mx_id = mx_id, + sensor = sensor, + tipo = tipo, + + calibrado = calibrado, + calibrando = calibrando, + + timestamp = timestamp, + last_packet_ts = last_packet_ts, + last_publish_ts = last_publish_ts, + ultimo_erro_ts = ultimo_erro_ts, + + roll = roll, + pitch = pitch, + yaw = yaw, + yaw_fixed = yaw_fixed, + + roll_filtrado = roll_filtrado, + pitch_filtrado = pitch_filtrado, + yaw_filtrado = yaw_filtrado, + + roll_seg = roll_seg, + pitch_seg = pitch_seg, + + roll_rate_dps = roll_rate_dps, + pitch_rate_dps = pitch_rate_dps, + yaw_rate_dps = yaw_rate_dps, + + rotation_accuracy_rad = rotation_accuracy_rad, + rotation_vector_source = rotation_vector_source, + + frequencia = frequencia, + frequencia_hz = frequencia_hz, + + latencia = latencia, + latencia_ms = latencia_ms, + + packets_lidos = packets_lidos, + packets_publicados = packets_publicados, + erros = erros, + + rugosidade = rugosidade, + impacto = impacto, + estabilidade = estabilidade, + movimento_detectado = movimento_detectado, + + Extra = Extra?.ToDictionary( + x => x.Key, + x => x.Value?.DeepClone() + ) ?? new Dictionary() + }; + } } } diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 92148ec9a..39cc29645 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -385,6 +385,9 @@ namespace AgroBase.Models FrenagemAutomaticaAoParar = false, ImuParadaPorInclinacao = false, + ImuAuxilioMovimento = false, + ImuAuxilioDirecional = false, + ImuDirecionalPreferirArco = false, OakParadaPorObstaculo = false, DirAuxilioSonar = false, MovAuxilioSonar = false, @@ -496,6 +499,9 @@ namespace AgroBase.Models FrenagemAutomaticaAoParar = true, ImuParadaPorInclinacao = true, + ImuAuxilioMovimento = true, + ImuAuxilioDirecional = true, + ImuDirecionalPreferirArco = true, OakParadaPorObstaculo = true, DirAuxilioSonar = true, MovAuxilioSonar = true, @@ -637,6 +643,9 @@ namespace AgroBase.Models FrenagemAutomaticaAoParar = false, ImuParadaPorInclinacao = false, + ImuAuxilioMovimento = false, + ImuAuxilioDirecional = false, + ImuDirecionalPreferirArco = false, OakParadaPorObstaculo = false, DirAuxilioSonar = false, MovAuxilioSonar = false, @@ -656,6 +665,7 @@ namespace AgroBase.Models AtuPercentualInicioPulverizacao = 70, AtuPressaoLinha = 85, AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao, + AtuModoControle = ModoControleBomba.OnOff, }; p.ModulosMandatorios = new List() { @@ -775,6 +785,9 @@ namespace AgroBase.Models FrenagemAutomaticaAoParar = true, ImuParadaPorInclinacao = true, + ImuAuxilioMovimento = true, + ImuAuxilioDirecional = true, + ImuDirecionalPreferirArco = true, OakParadaPorObstaculo = true, DirAuxilioSonar = true, MovAuxilioSonar = true, @@ -795,6 +808,7 @@ namespace AgroBase.Models AtuPercentualInicioPulverizacao = 70, AtuPressaoLinha = 85, AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao, + AtuModoControle = ModoControleBomba.OnOff, }; p.ModulosMandatorios = new List() { @@ -874,6 +888,9 @@ namespace AgroBase.Models FrenagemAutomaticaAoParar = true, ImuParadaPorInclinacao = true, + ImuAuxilioMovimento = true, + ImuAuxilioDirecional = true, + ImuDirecionalPreferirArco = true, OakParadaPorObstaculo = true, DirAuxilioSonar = true, MovAuxilioSonar = true, @@ -894,6 +911,7 @@ namespace AgroBase.Models AtuPercentualInicioPulverizacao = 70, AtuPressaoLinha = 85, AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao, + AtuModoControle = ModoControleBomba.OnOff, }; p.ModulosMandatorios = new List() { @@ -1654,7 +1672,7 @@ namespace AgroBase.Models if (Variaveis.OperacaoEmAndamento.Parametros?.Modo == ModoOperacao.Manual) { var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual; - Sonar?.Resumo?.AtualizarStatusBloqueio(true); + Sonar?.Resumo?.AtualizarStatusBloqueioManual(Sonar, true); if (Sonar?.Resumo?.EnviarComandoParada ?? false) { Variaveis.MostrarLog("[OperacaoModel] Deve enviar o comando de parada em tmrLeituras_Tick"); @@ -2647,7 +2665,7 @@ namespace AgroBase.Models return new DateTime().AddSeconds(TempoDecorridoSeg); } } - public OperacaoSensoriamentoLogImuModel IMU { get; set; } + public ModuloIMUModel IMU { get; set; } public OperacaoSensoriamentoLogAtuModel Atuador { get; set; } public OperacaoSensoriamentoLogMovModel Movimentacao { get; set; } public OperacaoSensoriamentoLogDirModel Direcional { get; set; } @@ -2720,23 +2738,10 @@ namespace AgroBase.Models _Reservatorio?.AtualizarAgitadorCalda(pControle?.AtuAgitadorModo ?? ModoAgitadorCalda.SemAgitacao); _Trajetoria?.AtualizarDadosAutonomiaCorredor(); - //var sIMU = LivoxManagerProcess.DadosLeitura.imu; string imu = RedisService.Get(RedisService.ModKey(T_Code.Imu)) ?? ""; - var sIMU = JsonConvert.DeserializeObject(imu); + var sIMU = JsonConvert.DeserializeObject(imu); bool imu_iniciado = sIMU?.timestamp > 0 && HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Imu)?.status != StatusModulo.Desconectado; - var dadosIMU = sIMU != null ? new OperacaoSensoriamentoLogImuModel() - { - Iniciado = imu_iniciado, - InclinacaoLateral = imu_iniciado ? sIMU.pitch : 0, - InclinacaoFrontal = imu_iniciado ? sIMU.roll : 0, - Rotacao = imu_iniciado ? sIMU.yaw : 0, - RotacaoCorrigida = imu_iniciado ? sIMU.yaw_fixed : 0, - EmMovimento = imu_iniciado ? sIMU.em_movimento : false, - IndiceMovimento = imu_iniciado ? sIMU.movimento_idx : 0, - IndiceRugosidade = imu_iniciado ? sIMU.rugosidade_idx : 0, - IndiceEstabilidade = imu_iniciado ? sIMU.estabilidade_idx : 0, - IndiceImpacto = imu_iniciado ? sIMU.impacto_idx : 0, - } : new OperacaoSensoriamentoLogImuModel(); + var dadosIMU = sIMU != null && imu_iniciado ? sIMU.Clone() : new ModuloIMUModel(); var bombaLinha = _DispAtu?.Dados?.BombasPressurizadoras?.FirstOrDefault(x => x.ID == "BMBLN"); var dadosAtuador = _DispAtu != null ? new OperacaoSensoriamentoLogAtuModel() @@ -2750,7 +2755,7 @@ namespace AgroBase.Models PercentualErvasTerreno = _DispAtu.Dados.PercentualErvasTerreno, HerbicidaPorErva = _Reservatorio.HerbicidaPorAtuacao_L, ErvasNoRadar = WeedWorkerService.DadosLeitura?.Analise?.ervas_no_radar ?? false, - PercentualErvasNoRadar = WeedWorkerService.DadosLeitura?.Analise?.estatisticas?.erva?.ema_global ?? 0, + PercentualErvasNoRadar = WeedWorkerService.DadosLeitura?.Analise?.percentual_ervas_no_radar ?? 0, PercentualReservatorio = _Reservatorio.PercentualAtual, VolumeReservatorio = _Reservatorio.VolumeAtual_L, MassaReservatorio = _Reservatorio.MassaAtual_Kg, diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs index b5a02d03c..446f670f8 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs @@ -234,6 +234,48 @@ namespace AgroBase.Models.Operacoes } } + private bool _imuAuxilioMovimento; + public bool ImuAuxilioMovimento + { + get => _imuAuxilioMovimento; + set + { + if (_imuAuxilioMovimento != value) + { + _imuAuxilioMovimento = value; + OnPropertyChanged(nameof(ImuAuxilioMovimento)); + } + } + } + + private bool _imuAuxilioDirecional; + public bool ImuAuxilioDirecional + { + get => _imuAuxilioDirecional; + set + { + if (_imuAuxilioDirecional != value) + { + _imuAuxilioDirecional = value; + OnPropertyChanged(nameof(ImuAuxilioDirecional)); + } + } + } + + private bool _imuDirecionalPreferirArco; + public bool ImuDirecionalPreferirArco + { + get => _imuDirecionalPreferirArco; + set + { + if (_imuDirecionalPreferirArco != value) + { + _imuDirecionalPreferirArco = value; + OnPropertyChanged(nameof(ImuDirecionalPreferirArco)); + } + } + } + private bool _frenagemAutomaticaAoParar; public bool FrenagemAutomaticaAoParar { @@ -617,7 +659,13 @@ namespace AgroBase.Models.Operacoes } : new OperacaoParametrosDadosControleModel(); ModulosSaude = new List(sen?.ModulosSaude ?? new List()); DispositivosMapeados = new List(sen?.DispositivosMapeados ?? new List()); - Imu = sen?.IMU?.Clone(); + Imu = new OperacaoSensoriamentoLogImuModel() + { + Iniciado = sen?.IMU?.Iniciado ?? false, + InclinacaoFrontal = sen?.IMU?.PitchSeguro ?? 0, + InclinacaoLateral = sen?.IMU?.RollSeguro ?? 0, + Rotacao = sen?.IMU?.YawSeguro ?? 0, + }; Atuador = new OperacaoParametrosDadosAtuadorModel() { Iniciado = dAtu?.Conectado ?? false, @@ -809,7 +857,7 @@ namespace AgroBase.Models.Operacoes LivoxLidar = sen?.LivoxLidar?.Clone(); CameraWorkerService.GetListaCameras(); Cameras = CameraWorkerService.ListaCameras; - OperadorVisual = VisualWorkerService.DadosLeitura?.Resumo?.UpdateClone(); + OperadorVisual = VisualWorkerService.DadosLeitura?.Resumo?.Clone(); var l = sen?.Logs; Logs = l != null ? l.Where(x => x.Momento >= UltimoEnvioLog).ToList() : new List(); } diff --git a/AgroBase/AgroBase/Models/Operadores/HealthWorkerModel.cs b/AgroBase/AgroBase/Models/Operadores/HealthWorkerModel.cs index d48578530..26eaa1736 100644 --- a/AgroBase/AgroBase/Models/Operadores/HealthWorkerModel.cs +++ b/AgroBase/AgroBase/Models/Operadores/HealthWorkerModel.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using static AgroBase.Models.Enums; -using static AgroBase.Models.Operadores.OperadoresModels; namespace AgroBase.Models.Operadores { @@ -12,7 +9,6 @@ namespace AgroBase.Models.Operadores public bool Pronto { get; set; } public DateTime ProntoEm { get; set; } public DateTime UltimaMensagem { get; set; } - //public WorkerMessageModel Leitura { get; set; } = new WorkerMessageModel(); public HealthWorkerModel Clone() { @@ -22,7 +18,6 @@ namespace AgroBase.Models.Operadores IniciadoEm = IniciadoEm, Pronto = Pronto, ProntoEm = ProntoEm, - //Leitura = Leitura.Clone() }; } @@ -32,7 +27,6 @@ namespace AgroBase.Models.Operadores IniciadoEm = DateTime.MinValue; Pronto = false; ProntoEm = DateTime.MinValue; - //Leitura = new WorkerMessageModel(); } } diff --git a/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs b/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs index eb83f5057..d90c577ba 100644 --- a/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs +++ b/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs @@ -17,7 +17,7 @@ namespace AgroBase.Models.Operadores [JsonIgnore] public Dictionary CameraFrames { get; set; } = new Dictionary(); public VisualWorkerMessageAnaliseModel Analises { get; set; } = new VisualWorkerMessageAnaliseModel(); - public VisualWorkerMessageIMUModel Imu { get; set; } = new VisualWorkerMessageIMUModel(); + public OAKImuModel Imu { get; set; } = new OAKImuModel(); public StatusModulo Status { get; set; } public bool StatusValido => new List() { StatusModulo.Operante, StatusModulo.Alerta }.Contains(Status); public VisualWorkerResumoModel Resumo { get; set; } @@ -51,7 +51,7 @@ namespace AgroBase.Models.Operadores ProntoEm = DateTime.MinValue; CameraFrames = new Dictionary(); Analises = new VisualWorkerMessageAnaliseModel(); - Imu = new VisualWorkerMessageIMUModel(); + Imu = new OAKImuModel(); Resumo = new VisualWorkerResumoModel(); Status = StatusModulo.Desconectado; Performance = new VisualWorkerPerformanceModel(); @@ -75,27 +75,138 @@ namespace AgroBase.Models.Operadores public class VisualWorkerResumoModel { + // Operacional public StatusCarroMapa StatusCarro { get; set; } public double ErroLateral { get; set; } public double ErroAngular { get; set; } - public string Modo { get; set; } + + // Segurança / bloqueio public bool ParadaDetectada { get; set; } = false; public bool DeveParar { get; set; } = false; public bool EnviarComandoParada { get; set; } = false; public bool EnviarComandoRetomada { get; set; } = false; + + // Novo: operador + técnico enxuto + public VisualWorkerResumoOperacionalModel Operacional { get; set; } = new VisualWorkerResumoOperacionalModel(); + public VisualWorkerResumoTecnicoModel Tecnico { get; set; } = new VisualWorkerResumoTecnicoModel(); + private bool _comandoParadaEnviado { get; set; } = false; - public void AtualizarStatusBloqueio(bool consideraEmMovimento) + public void AtualizarDados(VisualWorkerModel Sonar) { - var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual; Modo = Sonar?.Analises?.matriz_confianca?.block?.decision?.mode ?? "free"; ParadaDetectada = (Sonar?.Analises?.matriz_confianca?.block?.decision?.parar ?? false); StatusCarro = Sonar?.Analises?.segmentacao?.status_corredor ?? StatusCarroMapa.Indefinido; ErroLateral = Sonar?.Analises?.segmentacao?.erro_lateral_pct ?? 0; ErroAngular = Sonar?.Analises?.segmentacao?.erro_angular ?? 0; + AtualizarResumoOperacional(Sonar); + AtualizarResumoTecnico(Sonar); + } + + private void AtualizarResumoOperacional(VisualWorkerModel visual) + { + var block = visual?.Analises?.matriz_confianca?.block; + var decision = block?.decision; + var trend = block?.trend; + var debug = visual?.Analises?.segmentacao?.status_corredor_debug; + + Operacional.DistanciaObstaculoM = block?.d_block_line_m; + Operacional.VelocidadeMaxSugeridaMps = decision?.v_max_sugerida_mps; + Operacional.RiscoObstaculo = decision?.risk_ema ?? trend?.risk_ema ?? 0; + + Operacional.MotivoBloqueio = block?.reason; + Operacional.DetalheBloqueio = block?.reason_detail; + + Operacional.OrigemStatusCorredor = debug?.origem_status; + Operacional.ConfiancaStatusCorredor = debug?.status_modelo_conf ?? 0; + } + + private void AtualizarResumoTecnico(VisualWorkerModel visual) + { + var perf = visual?.Performance; + var ts = visual?.Timestamps; + + Tecnico.FpsModeloIA = GetFps(perf, "segmentacao"); + Tecnico.FpsDeteccao = GetFps(perf, "deteccao"); + Tecnico.FpsMatrizConfianca = GetFps(perf, "matriz_confianca"); + Tecnico.FpsAnalise = GetFps(perf, "analise"); + + Tecnico.LatenciaModeloMs = GetLatenciaMediaMs(perf, "segmentacao"); + Tecnico.LatenciaDeteccaoMs = GetLatenciaMediaMs(perf, "deteccao"); + + var nowUnix = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 1000.0; + + Tecnico.IdadeAnaliseMs = AgeMs(nowUnix, ts?.analise ?? 0); + Tecnico.IdadeSegmentacaoMs = AgeMs(nowUnix, ts?.segmentacao ?? 0); + Tecnico.IdadeDeteccaoMs = AgeMs(nowUnix, ts?.deteccao ?? 0); + Tecnico.IdadeMatrizConfiancaMs = AgeMs(nowUnix, ts?.matriz_confianca ?? 0); + + Tecnico.TemSegmentacao = perf?.visual_cache?.tem_seg ?? false; + Tecnico.TemGrid = perf?.visual_cache?.tem_grid ?? false; + + Tecnico.ModeloTravado = + Tecnico.IdadeSegmentacaoMs > 1500 || + Tecnico.FpsModeloIA <= 0.2; + + Tecnico.VisualAtrasado = + Tecnico.IdadeAnaliseMs > 1500 || + Tecnico.IdadeMatrizConfiancaMs > 1500; + + Tecnico.SaudeVisual = CalcularSaudeVisual(); + } + + private static double GetFps(VisualWorkerPerformanceModel perf, string loopName) + { + if (perf?.loops == null) + return 0; + + return perf.loops.TryGetValue(loopName, out var loop) + ? loop?.fps_real ?? 0 + : 0; + } + + private static double GetLatenciaMediaMs(VisualWorkerPerformanceModel perf, string loopName) + { + if (perf?.loops == null) + return 0; + + if (!perf.loops.TryGetValue(loopName, out var loop) || loop?.latencia_ms == null) + return 0; + + // Ajusta o nome conforme o JSON real: "avg", "mean", "media", etc. + return loop.latencia_ms["avg"]?.Value() + ?? loop.latencia_ms["mean"]?.Value() + ?? loop.latencia_ms["media"]?.Value() + ?? 0; + } + + private static double AgeMs(double nowUnix, double tsUnix) + { + if (tsUnix <= 0) + return 999999; + + return Math.Max(0, (nowUnix - tsUnix) * 1000.0); + } + + private string CalcularSaudeVisual() + { + if (Tecnico.ModeloTravado) + return "travado"; + + if (Tecnico.VisualAtrasado) + return "atrasado"; + + if (Tecnico.FpsModeloIA < 2) + return "lento"; + + return "ok"; + } + + public void AtualizarStatusBloqueioManual(VisualWorkerModel Sonar, bool consideraEmMovimento) + { if (!(Variaveis.OperacaoEmAndamento.Parametros?.Controle?.OakParadaPorObstaculo ?? false)) { _comandoParadaEnviado = false; @@ -136,58 +247,81 @@ namespace AgroBase.Models.Operadores EnviarComandoParada = EnviarComandoParada, EnviarComandoRetomada = EnviarComandoRetomada, _comandoParadaEnviado = _comandoParadaEnviado, + Operacional = Operacional?.Clone() ?? new VisualWorkerResumoOperacionalModel(), + Tecnico = Tecnico?.Clone() ?? new VisualWorkerResumoTecnicoModel(), }; } - public VisualWorkerResumoModel UpdateClone() + } + + public class VisualWorkerResumoTecnicoModel + { + public double FpsModeloIA { get; set; } + public double FpsDeteccao { get; set; } + public double FpsMatrizConfianca { get; set; } + public double FpsAnalise { get; set; } + + public double LatenciaModeloMs { get; set; } + public double LatenciaDeteccaoMs { get; set; } + + public double IdadeAnaliseMs { get; set; } + public double IdadeSegmentacaoMs { get; set; } + public double IdadeDeteccaoMs { get; set; } + public double IdadeMatrizConfiancaMs { get; set; } + + public bool TemSegmentacao { get; set; } + public bool TemGrid { get; set; } + + public bool ModeloTravado { get; set; } + public bool VisualAtrasado { get; set; } + public string SaudeVisual { get; set; } = "desconhecida"; + + public VisualWorkerResumoTecnicoModel Clone() { - AtualizarStatusBloqueio(false); - return Clone(); + return new VisualWorkerResumoTecnicoModel() + { + FpsAnalise = FpsAnalise, + FpsDeteccao = FpsDeteccao, + FpsMatrizConfianca = FpsMatrizConfianca, + FpsModeloIA = FpsModeloIA, + IdadeAnaliseMs = IdadeAnaliseMs, + IdadeDeteccaoMs = IdadeDeteccaoMs, + IdadeMatrizConfiancaMs = IdadeMatrizConfiancaMs, + IdadeSegmentacaoMs = IdadeSegmentacaoMs, + LatenciaDeteccaoMs = LatenciaDeteccaoMs, + LatenciaModeloMs = LatenciaModeloMs, + ModeloTravado = ModeloTravado, + SaudeVisual = SaudeVisual, + TemGrid = TemGrid, + TemSegmentacao = TemSegmentacao, + VisualAtrasado = VisualAtrasado + }; } } - public class VisualWorkerMessageIMUModel + public class VisualWorkerResumoOperacionalModel { - public bool valido { get; set; } - public double timestamp { get; set; } + public double? DistanciaObstaculoM { get; set; } + public double? VelocidadeMaxSugeridaMps { get; set; } + public double RiscoObstaculo { get; set; } - public double roll { get; set; } - public double pitch { get; set; } - public double yaw { get; set; } - public double yaw_fixed { get; set; } + public string MotivoBloqueio { get; set; } + public string DetalheBloqueio { get; set; } - public double frequencia_hz { get; set; } - public double latencia_ms { get; set; } + public string OrigemStatusCorredor { get; set; } + public double ConfiancaStatusCorredor { get; set; } - public double rugosidade { get; set; } - public double impacto { get; set; } - public double estabilidade { get; set; } - - public bool movimento_detectado { get; set; } - - [JsonExtensionData] - public IDictionary Extra { get; set; } = new Dictionary(); - - public VisualWorkerMessageIMUModel Clone() + public VisualWorkerResumoOperacionalModel Clone() { - return new VisualWorkerMessageIMUModel + return new VisualWorkerResumoOperacionalModel() { - valido = valido, - timestamp = timestamp, - roll = roll, - pitch = pitch, - yaw = yaw, - yaw_fixed = yaw_fixed, - frequencia_hz = frequencia_hz, - latencia_ms = latencia_ms, - rugosidade = rugosidade, - impacto = impacto, - estabilidade = estabilidade, - movimento_detectado = movimento_detectado, - Extra = Extra?.ToDictionary( - x => x.Key, - x => x.Value?.DeepClone() - ) ?? new Dictionary() + ConfiancaStatusCorredor = ConfiancaStatusCorredor, + DetalheBloqueio = DetalheBloqueio, + DistanciaObstaculoM = DistanciaObstaculoM, + MotivoBloqueio = MotivoBloqueio, + OrigemStatusCorredor = OrigemStatusCorredor, + RiscoObstaculo = RiscoObstaculo, + VelocidadeMaxSugeridaMps = VelocidadeMaxSugeridaMps }; } } diff --git a/AgroBase/AgroBase/Models/Operadores/WeedWorkerModel.cs b/AgroBase/AgroBase/Models/Operadores/WeedWorkerModel.cs index 990b83105..4b2655c1d 100644 --- a/AgroBase/AgroBase/Models/Operadores/WeedWorkerModel.cs +++ b/AgroBase/AgroBase/Models/Operadores/WeedWorkerModel.cs @@ -17,6 +17,7 @@ namespace AgroBase.Models.Operadores [JsonIgnore] public Dictionary CameraFrames { get; set; } = new Dictionary(); public WeedWorkerAnaliseModel Analise { get; set; } = new WeedWorkerAnaliseModel(); + public OAKImuModel Imu { get; set; } = new OAKImuModel(); public WeedWorkerPerformanceModel Performance { get; set; } = new WeedWorkerPerformanceModel(); public WeedWorkerAnaliseMetricasModel MetricasAnalise { get; set; } = new WeedWorkerAnaliseMetricasModel(); public WeedWorkerRedisTimestampsModel Timestamps { get; set; } = new WeedWorkerRedisTimestampsModel(); @@ -32,6 +33,8 @@ namespace AgroBase.Models.Operadores ProntoEm = ProntoEm, UltimaMensagem = UltimaMensagem, + Imu = Imu?.Clone(), + Analise = Analise?.Clone() ?? new WeedWorkerAnaliseModel(), @@ -60,6 +63,7 @@ namespace AgroBase.Models.Operadores new Dictionary(); Analise = new WeedWorkerAnaliseModel(); + Imu = new OAKImuModel(); MetricasAnalise = new WeedWorkerAnaliseMetricasModel(); Performance = new WeedWorkerPerformanceModel(); Timestamps = new WeedWorkerRedisTimestampsModel(); diff --git a/AgroBase/AgroBase/Services/GPSService.cs b/AgroBase/AgroBase/Services/GPSService.cs index 83dad0454..0684fdc6d 100644 --- a/AgroBase/AgroBase/Services/GPSService.cs +++ b/AgroBase/AgroBase/Services/GPSService.cs @@ -1221,7 +1221,7 @@ namespace AgroBase.Services else if (imuIniciado) { // Apenas o WT901C está disponível - anguloFinal = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.RotacaoCorrigida; + anguloFinal = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.YawSeguro; } else { diff --git a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs index 2b61575d9..28bddea81 100644 --- a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs @@ -361,9 +361,9 @@ namespace AgroBase.Services.Operadores ("frenagem_automatica", pControle.FrenagemAutomaticaAoParar), ("oak_parada_por_bloqueio", pControle.OakParadaPorObstaculo), ("imu_parada_por_inclinacao", pControle.ImuParadaPorInclinacao), - ("imu_auxilio_movimento", false), - ("imu_auxilio_direcional", false), - ("imu_direcional_preferir_arco", false), + ("imu_auxilio_movimento", pControle.ImuAuxilioMovimento), + ("imu_auxilio_direcional", pControle.ImuAuxilioDirecional), + ("imu_direcional_preferir_arco", pControle.ImuDirecionalPreferirArco), ("dir_auxilio_sonar", pControle.DirAuxilioSonar), ("mov_auxilio_sonar", pControle.MovAuxilioSonar), diff --git a/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs index 217064b47..331097031 100644 --- a/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs @@ -301,13 +301,15 @@ namespace AgroBase.Services.Operadores _lastTsPerformanceVisual = tsPerformance; } + + DadosLeitura.Resumo?.AtualizarDados(DadosLeitura); } private static void AtualizarImu() { try { - string mxId = Variaveis.OperacaoEmAndamento?.DispSen?.Dados?.CameraCaminho?.Id; + string mxId = VariaveisEquipamento.Parametros.camera_caminhho_id; if (string.IsNullOrWhiteSpace(mxId)) return; @@ -325,7 +327,7 @@ namespace AgroBase.Services.Operadores imuToken.Type == JTokenType.Null) return; - var imu = imuToken.ToObject(); + var imu = imuToken.ToObject(); if (imu != null) DadosLeitura.Imu = imu; diff --git a/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs index e76c0ad17..f1edb4912 100644 --- a/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs @@ -174,6 +174,8 @@ namespace AgroBase.Services.Operadores public static void AtualizarAnalise() { + AtualizarImu(); + string json = RedisService.Get(CtxKey.DadosWeedWorker); if (string.IsNullOrWhiteSpace(json)) @@ -277,6 +279,40 @@ namespace AgroBase.Services.Operadores } } + private static void AtualizarImu() + { + try + { + string mxId = VariaveisEquipamento.Parametros.camera_ervas_id.FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(mxId)) + return; + + string cameraJson = RedisService.Get(RedisService.CamKey(mxId)); + + if (string.IsNullOrWhiteSpace(cameraJson)) + return; + + JObject root = JObject.Parse(cameraJson); + + JToken imuToken = root["imu"]; + + if (imuToken == null || + imuToken.Type == JTokenType.Null) + return; + + var imu = imuToken.ToObject(); + + if (imu != null) + DadosLeitura.Imu = imu; + } + catch + { + // Mantém a última leitura válida. + } + } + + public static void ReiniciarLeituraAnalise() { RedisService.AtualizarCampos(