refactoring and bug fix

This commit is contained in:
2025-03-29 17:50:17 +11:00
parent 882b036c80
commit ffa9b50b12
8 changed files with 861 additions and 367 deletions

View File

@ -28,66 +28,29 @@
/// </summary>
private void InitializeComponent()
{
this.PortSelector = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.Send_btn = new System.Windows.Forms.Button();
this.Connect_btn = new System.Windows.Forms.Button();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.InfoLabel = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.SpeedSelector = new System.Windows.Forms.ComboBox();
this.SendContinuous_btn = new System.Windows.Forms.Button();
this.IMU_label = new System.Windows.Forms.Label();
this.TestWrite_btn = new System.Windows.Forms.Button();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.ratePID_control = new TelemetryIO.RatePID();
this.monitorVars1 = new TelemetryIO.MonitorVars();
this.name_label = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.Connect_btn = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.SpeedSelector = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.PortSelector = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label();
this.ratePID_control = new TelemetryIO.RatePID();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// PortSelector
//
this.PortSelector.FormattingEnabled = true;
this.PortSelector.Location = new System.Drawing.Point(63, 12);
this.PortSelector.Name = "PortSelector";
this.PortSelector.Size = new System.Drawing.Size(121, 21);
this.PortSelector.TabIndex = 0;
this.PortSelector.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PortSelector_RefreshItems);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label1.Location = new System.Drawing.Point(16, 14);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(41, 17);
this.label1.TabIndex = 1;
this.label1.Text = "Порт";
//
// Send_btn
//
this.Send_btn.Location = new System.Drawing.Point(118, 57);
this.Send_btn.Name = "Send_btn";
this.Send_btn.Size = new System.Drawing.Size(66, 21);
this.Send_btn.TabIndex = 2;
this.Send_btn.Text = "Send";
this.Send_btn.UseVisualStyleBackColor = true;
this.Send_btn.Click += new System.EventHandler(this.Send_btn_Click);
//
// Connect_btn
//
this.Connect_btn.Location = new System.Drawing.Point(19, 57);
this.Connect_btn.Name = "Connect_btn";
this.Connect_btn.Size = new System.Drawing.Size(79, 21);
this.Connect_btn.TabIndex = 3;
this.Connect_btn.Text = "Подключить";
this.Connect_btn.UseVisualStyleBackColor = true;
this.Connect_btn.Click += new System.EventHandler(this.Connect_btn_Click);
//
// InfoLabel
//
this.InfoLabel.Location = new System.Drawing.Point(12, 793);
@ -96,52 +59,6 @@
this.InfoLabel.TabIndex = 4;
this.InfoLabel.Text = "Ok";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label2.Location = new System.Drawing.Point(208, 14);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(69, 17);
this.label2.TabIndex = 6;
this.label2.Text = "Скорость";
//
// SpeedSelector
//
this.SpeedSelector.FormattingEnabled = true;
this.SpeedSelector.Location = new System.Drawing.Point(283, 12);
this.SpeedSelector.Name = "SpeedSelector";
this.SpeedSelector.Size = new System.Drawing.Size(121, 21);
this.SpeedSelector.TabIndex = 5;
//
// SendContinuous_btn
//
this.SendContinuous_btn.Location = new System.Drawing.Point(190, 57);
this.SendContinuous_btn.Name = "SendContinuous_btn";
this.SendContinuous_btn.Size = new System.Drawing.Size(109, 21);
this.SendContinuous_btn.TabIndex = 7;
this.SendContinuous_btn.Text = "Send_Continuous";
this.SendContinuous_btn.UseVisualStyleBackColor = true;
this.SendContinuous_btn.Click += new System.EventHandler(this.SendContinuous_btn_Click);
//
// IMU_label
//
this.IMU_label.Location = new System.Drawing.Point(496, 16);
this.IMU_label.Name = "IMU_label";
this.IMU_label.Size = new System.Drawing.Size(208, 19);
this.IMU_label.TabIndex = 8;
this.IMU_label.Text = "label3";
//
// TestWrite_btn
//
this.TestWrite_btn.Location = new System.Drawing.Point(318, 56);
this.TestWrite_btn.Name = "TestWrite_btn";
this.TestWrite_btn.Size = new System.Drawing.Size(75, 23);
this.TestWrite_btn.TabIndex = 9;
this.TestWrite_btn.Text = "TestWrite";
this.TestWrite_btn.UseVisualStyleBackColor = true;
this.TestWrite_btn.Click += new System.EventHandler(this.TestWrite_btn_Click);
//
// tabControl1
//
this.tabControl1.Alignment = System.Windows.Forms.TabAlignment.Bottom;
@ -177,16 +94,6 @@
this.tabPage2.Text = "Monitor";
this.tabPage2.UseVisualStyleBackColor = true;
//
// ratePID_control
//
this.ratePID_control.BackColor = System.Drawing.Color.AntiqueWhite;
this.ratePID_control.bottom_label = null;
this.ratePID_control.Location = new System.Drawing.Point(6, 6);
this.ratePID_control.Name = "ratePID_control";
this.ratePID_control.serial = null;
this.ratePID_control.Size = new System.Drawing.Size(1240, 600);
this.ratePID_control.TabIndex = 11;
//
// monitorVars1
//
this.monitorVars1.Location = new System.Drawing.Point(6, 6);
@ -198,57 +105,144 @@
// name_label
//
this.name_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.name_label.Location = new System.Drawing.Point(1203, 10);
this.name_label.Location = new System.Drawing.Point(402, 11);
this.name_label.Name = "name_label";
this.name_label.Size = new System.Drawing.Size(148, 23);
this.name_label.TabIndex = 11;
this.name_label.Text = "name";
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(1287, 12);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(64, 64);
this.pictureBox1.TabIndex = 12;
this.pictureBox1.TabStop = false;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.Connect_btn);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.SpeedSelector);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.PortSelector);
this.groupBox1.Location = new System.Drawing.Point(12, 4);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(232, 100);
this.groupBox1.TabIndex = 13;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Подключение";
//
// Connect_btn
//
this.Connect_btn.Location = new System.Drawing.Point(79, 71);
this.Connect_btn.Name = "Connect_btn";
this.Connect_btn.Size = new System.Drawing.Size(121, 21);
this.Connect_btn.TabIndex = 9;
this.Connect_btn.Text = "Подключить";
this.Connect_btn.UseVisualStyleBackColor = true;
this.Connect_btn.Click += new System.EventHandler(this.Connect_btn_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label2.Location = new System.Drawing.Point(4, 46);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(69, 17);
this.label2.TabIndex = 8;
this.label2.Text = "Скорость";
//
// SpeedSelector
//
this.SpeedSelector.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.SpeedSelector.FormattingEnabled = true;
this.SpeedSelector.Location = new System.Drawing.Point(79, 44);
this.SpeedSelector.Name = "SpeedSelector";
this.SpeedSelector.Size = new System.Drawing.Size(121, 21);
this.SpeedSelector.TabIndex = 7;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label1.Location = new System.Drawing.Point(7, 19);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(41, 17);
this.label1.TabIndex = 3;
this.label1.Text = "Порт";
//
// PortSelector
//
this.PortSelector.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.PortSelector.FormattingEnabled = true;
this.PortSelector.Location = new System.Drawing.Point(79, 18);
this.PortSelector.Name = "PortSelector";
this.PortSelector.Size = new System.Drawing.Size(121, 21);
this.PortSelector.TabIndex = 2;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label3.Location = new System.Drawing.Point(266, 12);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(130, 20);
this.label3.TabIndex = 14;
this.label3.Text = "Имя устройства";
//
// ratePID_control
//
this.ratePID_control.BackColor = System.Drawing.Color.AntiqueWhite;
this.ratePID_control.bottom_label = null;
this.ratePID_control.Location = new System.Drawing.Point(6, 6);
this.ratePID_control.Name = "ratePID_control";
this.ratePID_control.serial = null;
this.ratePID_control.Size = new System.Drawing.Size(1299, 642);
this.ratePID_control.TabIndex = 11;
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1363, 820);
this.Controls.Add(this.label3);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.name_label);
this.Controls.Add(this.tabControl1);
this.Controls.Add(this.TestWrite_btn);
this.Controls.Add(this.IMU_label);
this.Controls.Add(this.SendContinuous_btn);
this.Controls.Add(this.label2);
this.Controls.Add(this.SpeedSelector);
this.Controls.Add(this.InfoLabel);
this.Controls.Add(this.Connect_btn);
this.Controls.Add(this.Send_btn);
this.Controls.Add(this.label1);
this.Controls.Add(this.PortSelector);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "MainForm";
this.Text = "Form1";
this.Text = "TelemetryIO";
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ComboBox PortSelector;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button Send_btn;
private System.Windows.Forms.Button Connect_btn;
private System.Windows.Forms.Label InfoLabel;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox SpeedSelector;
private System.Windows.Forms.Button SendContinuous_btn;
private System.Windows.Forms.Label IMU_label;
private System.Windows.Forms.Button TestWrite_btn;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private RatePID ratePID_control;
private MonitorVars monitorVars1;
private System.Windows.Forms.Label name_label;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Button Connect_btn;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox SpeedSelector;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ComboBox PortSelector;
private System.Windows.Forms.Label label3;
private RatePID ratePID_control;
}
}

View File

@ -23,7 +23,7 @@ namespace TelemetryIO
private System.Timers.Timer packageReceivingTimeout = new System.Timers.Timer(5);
private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
private System.Timers.Timer packageTransferTimer = new System.Timers.Timer(50);
private FormClosingEventArgs formArgs;
public MainForm()
{
InitializeComponent();
@ -33,17 +33,20 @@ namespace TelemetryIO
SpeedSelector.Items.AddRange(speedItems);
SpeedSelector.SelectedIndex = 3;
Send_btn.Enabled = false;
packageTransferTimer.AutoReset = true;
timer.Interval = 100;
timer.Interval = 500;
timer.Start();
timer.Tick += Timer_Tick;
ratePID_control.SubscribeOnEvent(serial);
monitorVars1.subscribeOnMonitoringItemsReceived(serial);
ratePID_control.bottom_label = InfoLabel;
serial.HandShakeOccurred += Serial_HandShakeOccurred;
serial.AnswerReceived += Serial_AnswerReceived;
}
private void Serial_AnswerReceived(object sender, SerialEventArgs e)
{
if(e.Answer == "EXITAPP") base.OnFormClosing(formArgs);
}
private void Serial_HandShakeOccurred(object sender, EventArgs e)
@ -62,23 +65,12 @@ namespace TelemetryIO
private void Timer_Tick(object sender, EventArgs e)
{
if (name_label.InvokeRequired) {
name_label.BeginInvoke(new Action(() => IMU_label.Text = Telemetry.Instance.name)); // Асинхронный вызов
name_label.BeginInvoke(new Action(() => name_label.Text = Telemetry.Instance.name)); // Асинхронный вызов
}
else
{
name_label.Text = Telemetry.Instance.name;
}
UpdateLabel(serial.view_str);
}
private void serialSend()
{
}
private void Send_btn_Click(object sender, EventArgs e)
{
serial.sendTest();
}
private void Connect_btn_Click(object sender, EventArgs e)
@ -115,16 +107,13 @@ namespace TelemetryIO
return;
}
b.Text = "Отключить";
Send_btn.Enabled = true;
}
}
else
{
serial.Close();
b.Text = "Подключить";
Send_btn.Enabled = false;
}
}
private void PortSelector_RefreshItems(object sender, MouseEventArgs e)
@ -134,50 +123,10 @@ namespace TelemetryIO
PortSelector.SelectedIndex = 0;
}
private void SendContinuous_btn_Click(object sender, EventArgs e)
{
serial.sendTestCont();
/*Button b = sender as Button;
if (sendContinuousFlag == true)
{
sendContinuousFlag = false;
packageTransferTimer.Stop();
b.Text = "Stop_Sending";
}
else
{
sendContinuousFlag = true;
send_queue.Add(prepareTelegram());
packageTransferTimer.Start();
b.Text = "Send_Continuous";
}*/
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
serial.Exit();
base.OnFormClosing(e);
}
public void UpdateLabel(string newText)
{
if (IMU_label.InvokeRequired)
{
IMU_label.BeginInvoke(new Action(() => IMU_label.Text = newText)); // Асинхронный вызов
}
else
{
IMU_label.Text = newText;
}
}
private void TestWrite_btn_Click(object sender, EventArgs e)
{
float[] f = {0, 1, 2, 3, 4, 5, 6, 7, 8};
serial.sendTestWrite(f);
formArgs = e;
if(serial.isOpen)serial.requestExit();
}
}
}

View File

@ -117,4 +117,350 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
0ppQFP0Pxd+g80pnxg0AAAAASUVORK5CYII=
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAMMOAADDDgAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEANQEBAPkBA
QGhAQECDQEBAkEBAQI9AQECBQEBAakBAQEVAQEAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBACEBA
QGFAQEC8QEBA+kBAQP9AQED/QEBA/0BAQP9AQED/QEBA/0BAQP9AQED/QEBA/0BAQNlAQECPQEBAPEBA
QAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABAQEADQEBAaEBAQOhAQED/QEBA/0BAQPpAQEDLQEBAnUBAQIBAQEBwQEBAcEBAQH5AQECYQEBAvkBA
QPFAQED/QEBA/0BAQP9AQEDYQEBAZUBAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABAQEAbQEBAwUBAQP9AQED/QEBAzEBAQGJAQEARAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABAQEADQEBAOEBAQIhAQEDlQEBA/0BAQP9AQEDdQEBAUAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAkQEBA4UBAQP9AQEDlQEBAVEBAQAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBABEBAQFhAQEDTQEBA/0BA
QP9AQEClQEBADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAVQEBA4EBAQP9AQEDBQEBAFQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAQEBABEBAQG1AQEDzQEBA/0BAQNRAQEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEABQEBAukBA
QP9AQEDGQEBACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAJEBAQNJAQED/QEBA4UBAQB8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAQEBAXEBAQP9AQEDpQEBAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAPQEBAxUBA
QP9AQEDWQEBADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAQEBAA0BAQN9AQED/QEBAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEBAQA5AQEDTQEBA/0BAQKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQFJAQED/QEBA2UBAQAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAJkBAQPZAQED+QEBAPQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQECpQEBA/0BA
QG8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQECBQEBA/0BA
QLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABAQEAEQEBA8EBAQP9AQEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAADgAAABMAAAAUAAAAEgAAAA4AAAAJAAAABAAA
AAAAAAAAQEBAEkBAQPVAQED+QEBAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAA09PT/38yGv9/Mhr/fzIa/9PT0//T09P/09PT/9PT0/9/Mhr/fzIa/38y
Gv/T09P/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAoAAAANAAAADwAAAA8AAAALAAAABQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT0//T09P/09PT/9PT0//T09P/09PT/9PT
0//T09P/09PT/9PT0//T09P/09PT/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADT09P/09PT/9PT
0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT
0//T09P/09PT/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADT09P/09PT/9PT0//T09P/09PT/9PT
0//T09P/09PT/9PT0//T09P/09PT/9PT0/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////////////////////////4Af///////8AAH///////AAAH//////4D/AP//////A//gP/
////4P//gf/////B///g/////8P///B/////h///+H////+H///8P////4////4/////D//4Bh////8f
/+ABHgD//h//wAAYAD/+H/+AABAAH/4f/4HwAAAP/A//B/ABxg/4B/8HwAHHB/gD/wACA4cHwAD/AAID
h4fAAP8ABgcDh8AA/wgOBgGHwAD/Dh4AAIfAAP8PHgAAB8AA/wccAfAHwAD/gxgh/g/AAP+AACD8D8AA
/8AAcAAfwAD/4AH4AD/AAP/gAfwAf8AA/8AA+AB/wAD/gADwAD/AAP+CMGAwH8AA/w44QfwfwAD+DjwD
+A/AAP4cPAfgD8AA/hwcAAEPwAD+GA4AAY/AAP4ABgQDj8AA/gAABwcPwAD+A4AHjw/AAP4P8AOPD8AA
/wPwQ44P4AH/AABAyB/gAf+AAOAAH+AB/8AB8AA/4AH/8Af8AH/gAf////4B/+AB////////4AH/////
///gAf///////+AB////////4AH/////////////////////////////////////////////////////
//////////////////////////////////////////////////8=
</value>
</data>
</root>

View File

@ -16,6 +16,7 @@ namespace TelemetryIO.Models
public string name = "";
public float[] raw_imu = new float[6];
public float[] quaternion = new float[4];
public float[] battery = new float[4];
public float[] motor_act = new float[4];
public float[] motor_sp = new float[4];
public float[] pid0 = new float[9];
@ -24,26 +25,28 @@ namespace TelemetryIO.Models
public float[] pid3 = new float[9];
private Telemetry() {
dictMonitor.Add("rawAx", new VarAddress(0, 0));
dictMonitor.Add("rawAy", new VarAddress(0, 1));
dictMonitor.Add("rawAz", new VarAddress(0, 2));
dictMonitor.Add("rawGx", new VarAddress(0, 3));
dictMonitor.Add("rawGy", new VarAddress(0, 4));
dictMonitor.Add("rawGz", new VarAddress(0, 5));
dictMonitor.Add("rawAx", new VarAddress(RAW_IMU_ADDRESS, 0));
dictMonitor.Add("rawAy", new VarAddress(RAW_IMU_ADDRESS, 1));
dictMonitor.Add("rawAz", new VarAddress(RAW_IMU_ADDRESS, 2));
dictMonitor.Add("rawGx", new VarAddress(RAW_IMU_ADDRESS, 3));
dictMonitor.Add("rawGy", new VarAddress(RAW_IMU_ADDRESS, 4));
dictMonitor.Add("rawGz", new VarAddress(RAW_IMU_ADDRESS, 5));
dictMonitor.Add("Qw", new VarAddress(1, 0));
dictMonitor.Add("Qx", new VarAddress(1, 1));
dictMonitor.Add("Qy", new VarAddress(1, 2));
dictMonitor.Add("Qz", new VarAddress(1, 3));
dictMonitor.Add("Qw", new VarAddress(Q_ADDRESS, 0));
dictMonitor.Add("Qx", new VarAddress(Q_ADDRESS, 1));
dictMonitor.Add("Qy", new VarAddress(Q_ADDRESS, 2));
dictMonitor.Add("Qz", new VarAddress(Q_ADDRESS, 3));
dictMonitor.Add("motor0_Act", new VarAddress(100, 0));
dictMonitor.Add("motor1_Act", new VarAddress(100, 1));
dictMonitor.Add("motor2_Act", new VarAddress(100, 2));
dictMonitor.Add("motor3_Act", new VarAddress(100, 3));
dictMonitor.Add("motor4_Act", new VarAddress(100, 4));
dictMonitor.Add("motor5_Act", new VarAddress(100, 5));
dictMonitor.Add("motor6_Act", new VarAddress(100, 6));
dictMonitor.Add("motor7_Act", new VarAddress(100, 7));
dictMonitor.Add("Battery[V]", new VarAddress(BAT_ADDRESS, 0));
dictMonitor.Add("motor0_Act", new VarAddress(MOTORS_ACT_ADDRESS, 0));
dictMonitor.Add("motor1_Act", new VarAddress(MOTORS_ACT_ADDRESS, 1));
dictMonitor.Add("motor2_Act", new VarAddress(MOTORS_ACT_ADDRESS, 2));
dictMonitor.Add("motor3_Act", new VarAddress(MOTORS_ACT_ADDRESS, 3));
dictMonitor.Add("motor4_Act", new VarAddress(MOTORS_ACT_ADDRESS, 4));
dictMonitor.Add("motor5_Act", new VarAddress(MOTORS_ACT_ADDRESS, 5));
dictMonitor.Add("motor6_Act", new VarAddress(MOTORS_ACT_ADDRESS, 6));
dictMonitor.Add("motor7_Act", new VarAddress(MOTORS_ACT_ADDRESS, 7));
}
public VarAddress getVarAdress(string name)
@ -81,35 +84,43 @@ namespace TelemetryIO.Models
if (slot != 9999) Debug.WriteLine(slot);
switch (slot)
{
case 0://RAW IMU
case RAW_IMU_ADDRESS://RAW IMU
set_float(raw_imu, data, offset, len);
break;
case 1://quaternion
case Q_ADDRESS://quaternion
set_float(quaternion, data, offset, len);
break;
case 100://motors act
case BAT_ADDRESS://battery
set_float(battery, data, offset, len);
break;
case MOTORS_ACT_ADDRESS://motors act
set_float(motor_act, data, offset, len);
break;
case 1000:
case MOTORS_SP_ADDRESS://motors act
set_float(motor_sp, data, offset, len);
break;
case PID0_ADDRESS:
set_float(pid0, data, offset, len);
break;
case 1001:
case PID1_ADDRESS:
set_float(pid1, data, offset, len);
break;
case 1002:
case PID2_ADDRESS:
set_float(pid2, data, offset, len);
break;
case 1003:
case PID3_ADDRESS:
set_float(pid3, data, offset, len);
break;
case 9999:
case NAME_ADDRESS:
set_name(data);
break;
}
@ -132,6 +143,20 @@ namespace TelemetryIO.Models
name = Encoding.ASCII.GetString(data, 0, 16);
}
public const int RAW_IMU_ADDRESS = 0;
public const int Q_ADDRESS = 1;
public const int BAT_ADDRESS = 50;
public const int MOTORS_ACT_ADDRESS = 100;
public const int MOTORS_SP_ADDRESS = 101;
public const int PID0_ADDRESS = 1000;
public const int PID1_ADDRESS = 1001;
public const int PID2_ADDRESS = 1002;
public const int PID3_ADDRESS = 1003;
public const int NAME_ADDRESS = 9999;
}
public class VarAddress

View File

@ -29,102 +29,127 @@
private void InitializeComponent()
{
this.MainFormPlot = new ScottPlot.WinForms.FormsPlot();
this.mon_test_label = new System.Windows.Forms.Label();
this.add_btn = new System.Windows.Forms.Button();
this.del_btn = new System.Windows.Forms.Button();
this.monNames_label = new System.Windows.Forms.Label();
this.monitorItems_cb = new System.Windows.Forms.ComboBox();
this.monitorItems_lb = new System.Windows.Forms.ListBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.AutoScale_check = new System.Windows.Forms.CheckBox();
this.StartStop_btn = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// MainFormPlot
//
this.MainFormPlot.DisplayScale = 0F;
this.MainFormPlot.Location = new System.Drawing.Point(238, 58);
this.MainFormPlot.Location = new System.Drawing.Point(238, 0);
this.MainFormPlot.Name = "MainFormPlot";
this.MainFormPlot.Size = new System.Drawing.Size(923, 539);
this.MainFormPlot.Size = new System.Drawing.Size(951, 597);
this.MainFormPlot.TabIndex = 0;
//
// mon_test_label
//
this.mon_test_label.AutoSize = true;
this.mon_test_label.Location = new System.Drawing.Point(3, 11);
this.mon_test_label.Name = "mon_test_label";
this.mon_test_label.Size = new System.Drawing.Size(78, 13);
this.mon_test_label.TabIndex = 2;
this.mon_test_label.Text = "mon_test_label";
//
// add_btn
//
this.add_btn.Location = new System.Drawing.Point(20, 88);
this.add_btn.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.add_btn.Location = new System.Drawing.Point(130, 3);
this.add_btn.Name = "add_btn";
this.add_btn.Size = new System.Drawing.Size(75, 23);
this.add_btn.Size = new System.Drawing.Size(87, 26);
this.add_btn.TabIndex = 3;
this.add_btn.Text = "add_btn";
this.add_btn.Text = "Добавить";
this.add_btn.UseVisualStyleBackColor = true;
this.add_btn.Click += new System.EventHandler(this.add_btn_Click);
//
// del_btn
//
this.del_btn.Location = new System.Drawing.Point(20, 135);
this.del_btn.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.del_btn.Location = new System.Drawing.Point(67, 439);
this.del_btn.Name = "del_btn";
this.del_btn.Size = new System.Drawing.Size(75, 23);
this.del_btn.TabIndex = 4;
this.del_btn.Text = "del_btn";
this.del_btn.Text = "Удалить";
this.del_btn.UseVisualStyleBackColor = true;
this.del_btn.Click += new System.EventHandler(this.del_btn_Click);
//
// monNames_label
//
this.monNames_label.AutoSize = true;
this.monNames_label.Location = new System.Drawing.Point(597, 11);
this.monNames_label.Name = "monNames_label";
this.monNames_label.Size = new System.Drawing.Size(35, 13);
this.monNames_label.TabIndex = 5;
this.monNames_label.Text = "label1";
//
// monitorItems_cb
//
this.monitorItems_cb.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.monitorItems_cb.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.monitorItems_cb.FormattingEnabled = true;
this.monitorItems_cb.Location = new System.Drawing.Point(20, 58);
this.monitorItems_cb.Location = new System.Drawing.Point(3, 3);
this.monitorItems_cb.Name = "monitorItems_cb";
this.monitorItems_cb.Size = new System.Drawing.Size(121, 21);
this.monitorItems_cb.Size = new System.Drawing.Size(121, 24);
this.monitorItems_cb.TabIndex = 6;
//
// monitorItems_lb
//
this.monitorItems_lb.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.monitorItems_lb.FormattingEnabled = true;
this.monitorItems_lb.Location = new System.Drawing.Point(20, 180);
this.monitorItems_lb.ItemHeight = 16;
this.monitorItems_lb.Location = new System.Drawing.Point(3, 52);
this.monitorItems_lb.Name = "monitorItems_lb";
this.monitorItems_lb.Size = new System.Drawing.Size(121, 316);
this.monitorItems_lb.Size = new System.Drawing.Size(214, 372);
this.monitorItems_lb.TabIndex = 8;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.AutoScale_check);
this.groupBox1.Controls.Add(this.StartStop_btn);
this.groupBox1.Location = new System.Drawing.Point(3, 480);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(214, 100);
this.groupBox1.TabIndex = 11;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Управление трендом";
//
// AutoScale_check
//
this.AutoScale_check.AutoSize = true;
this.AutoScale_check.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.AutoScale_check.Location = new System.Drawing.Point(45, 67);
this.AutoScale_check.Name = "AutoScale_check";
this.AutoScale_check.Size = new System.Drawing.Size(120, 21);
this.AutoScale_check.TabIndex = 12;
this.AutoScale_check.Text = "Авто масштаб";
this.AutoScale_check.UseVisualStyleBackColor = true;
this.AutoScale_check.CheckedChanged += new System.EventHandler(this.AutoScale_check_CheckedChanged);
//
// StartStop_btn
//
this.StartStop_btn.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.StartStop_btn.Location = new System.Drawing.Point(51, 24);
this.StartStop_btn.Name = "StartStop_btn";
this.StartStop_btn.Size = new System.Drawing.Size(108, 31);
this.StartStop_btn.TabIndex = 11;
this.StartStop_btn.Text = "Старт";
this.StartStop_btn.UseVisualStyleBackColor = true;
this.StartStop_btn.Click += new System.EventHandler(this.StartStop_btn_Click);
//
// MonitorVars
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.monitorItems_lb);
this.Controls.Add(this.monitorItems_cb);
this.Controls.Add(this.monNames_label);
this.Controls.Add(this.del_btn);
this.Controls.Add(this.add_btn);
this.Controls.Add(this.mon_test_label);
this.Controls.Add(this.MainFormPlot);
this.Name = "MonitorVars";
this.Size = new System.Drawing.Size(1240, 600);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private ScottPlot.WinForms.FormsPlot MainFormPlot;
private System.Windows.Forms.Label mon_test_label;
private System.Windows.Forms.Button add_btn;
private System.Windows.Forms.Button del_btn;
private System.Windows.Forms.Label monNames_label;
private System.Windows.Forms.ComboBox monitorItems_cb;
private System.Windows.Forms.ListBox monitorItems_lb;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.CheckBox AutoScale_check;
private System.Windows.Forms.Button StartStop_btn;
}
}

View File

@ -3,9 +3,11 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using TelemetryIO.Models;
@ -20,12 +22,16 @@ namespace TelemetryIO
private List<string> monitorNames = new List<string>();
private List<ScottPlot.Plottables.Signal> signals = new List<ScottPlot.Plottables.Signal>();
private List<MonitorItem> monItems = new List<MonitorItem>();
private List<int[]>[] plotContent = new List<int[]>[32];
private Timer updateTimer = new Timer();
private System.Windows.Forms.Timer updateTimer = new System.Windows.Forms.Timer();
private float[] monitoring = new float[32];
private int test_index = 0;
private bool isSubscribed = false;
private bool isMonitoring = true;
private bool isAutoScale = true;
private string processingName = "";
private int processingIndex = -1;
@ -35,14 +41,12 @@ namespace TelemetryIO
initMonitoringBuffer();
updateTimer.Interval = 100;
MainFormPlot.Plot.Axes.AutoScale();
AutoScale_check.Checked = isAutoScale;
monitorItems_cb.Items.AddRange(Telemetry.Instance.getKeys());
monitorItems_cb.SelectedIndex = 0;
updateTimer.Tick += UpdateTimer_Tick;
updateTimer.Start();
//MainFormPlot.
}
public void subscribeOnMonitoringItemsReceived(SerialHandler s)
@ -58,7 +62,7 @@ namespace TelemetryIO
{
if(e.Answer == "ADD")
{
monitorNames.Add(processingName);
MonitorItem item = new MonitorItem(processingName, processingIndex);
processingIndex++;
if (monitorItems_lb.InvokeRequired)
{
@ -68,14 +72,21 @@ namespace TelemetryIO
{
monitorItems_lb.Items.Add(processingName);
}
monitorList.Add(new double[1024]);
MainFormPlot.Plot.Add.Signal(monitorList[monitorList.Count - 1]);
if (StartStop_btn.InvokeRequired)
{
StartStop_btn.Invoke(new Action(() => StartStop_btn.Enabled = true));
}
else
{
StartStop_btn.Enabled = true;
}
monItems.Add(item);
}
else if(e.Answer == "REMOVE")
{
monitorNames.RemoveAt(processingIndex);
monitorList.RemoveAt(processingIndex);
monItems.RemoveAt(processingIndex);
if (monitorItems_lb.InvokeRequired)
{
monitorItems_lb.Invoke(new Action(() => monitorItems_lb.Items.RemoveAt(processingIndex)));
@ -88,55 +99,89 @@ namespace TelemetryIO
if (processingIndex >= 0) processingIndex--;
}else if(e.Answer == "REMOVEALL")
{
monitorNames.Clear();
monitorList.Clear();
monItems.Clear();
if (monitorItems_lb.InvokeRequired)
{
monitorItems_lb.Invoke(new Action(() => monitorItems_lb.Items.Clear()));
}
else
{
monitorItems_lb.Items.Clear();
}
if (StartStop_btn.InvokeRequired)
{
StartStop_btn.Invoke(new Action(() =>
{
StartStop_btn.Text = "Старт";
StartStop_btn.Enabled = false;
})
);
}
else
{
StartStop_btn.Text = "Старт";
StartStop_btn.Enabled = false;
}
isMonitoring = false;
}
else if (e.Answer == "MONITORON")
{
if (StartStop_btn.InvokeRequired)
{
StartStop_btn.Invoke(new Action(() => StartStop_btn.Text = "Стоп"));
}
else StartStop_btn.Text = "Стоп";
isMonitoring = true;
}
else if (e.Answer == "MONITOROFF")
{
if (StartStop_btn.InvokeRequired)
{
StartStop_btn.Invoke(new Action(() => StartStop_btn.Text = "Старт"));
}
else StartStop_btn.Text = "Старт";
isMonitoring = false;
}
}
private void Serial_MonitoringItemsReceived(object sender, MonitoringEventArgs e)
{
for(int i = 0; i < monitorList.Count; i++)
for(int i = 0; i < monItems.Count; i++)
{
ShiftLeft(monitorList[i]);
monitorList[i][monitorList[i].Length - 1] = e.Data[i];
monItems[i].Insert(e.Data[i]);
}
monitoring = new float[monitorList.Count];
for (int i = 0; i < monitorList.Count; i++)
monitoring = new float[monItems.Count];
for (int i = 0; i < monItems.Count; i++)
{
monitoring[i] = (float)monitorList[i][monitorList[i].Length - 1];
monitoring[i] = (float)monItems[i].Last;
}
}
private void UpdateTimer_Tick(object sender, EventArgs e)
{
if (mon_test_label.InvokeRequired)
{
mon_test_label.Invoke(new Action(() => mon_test_label.Text = string.Join(", ", monitoring)));
}
else
{
mon_test_label.Text = string.Join(", ", monitoring);
}
if (monNames_label.InvokeRequired)
{
monNames_label.Invoke(new Action(() => monNames_label.Text = string.Join(", ", monitorNames)));
}
else monNames_label.Text = string.Join(", ", monitorNames);
if (monitorList.Count > 0)
if (monItems.Count > 0)
{
MainFormPlot.Plot.Clear();
for(int i = 0; i < monitorList.Count; i++)
for(int i = 0; i < monItems.Count; i++)
{
var sig = MainFormPlot.Plot.Add.Signal(monitorList[i]);
sig.LegendText = monitorNames[i];
var sig = MainFormPlot.Plot.Add.Signal(monItems[i].data);
sig.LegendText = monItems[i].name;
sig.Color = ScottPlot.Color.FromColor(monItems[i].color);
if (monitorItems_lb.InvokeRequired)
{
monitorItems_lb.Invoke(new Action(() => monitorItems_lb.Items[i] = monItems[i].name + "\t" + monItems[i].Last));
}
else
{
monitorItems_lb.Items[i] = monItems[i].name + "\t" + monItems[i].Last;
}
}
MainFormPlot.Plot.Legend.IsVisible = true;
MainFormPlot.Plot.Legend.Orientation = ScottPlot.Orientation.Horizontal;
MainFormPlot.Plot.Axes.AutoScale();
if(isAutoScale) MainFormPlot.Plot.Axes.AutoScale();
MainFormPlot.Refresh();
}
}
@ -164,9 +209,93 @@ namespace TelemetryIO
serial.RemoveMonitoringItem(processingIndex);
}
private void ShiftLeft(double[] arr)
private void StartStop_btn_Click(object sender, EventArgs e)
{
Buffer.BlockCopy(arr, sizeof(double), arr, 0, (arr.Length - 1)*sizeof(double));
if(isMonitoring)
{
serial.stopMonitoring();
}
else
{
serial.startMonitoring();
}
}
private void AutoScale_check_CheckedChanged(object sender, EventArgs e)
{
CheckBox cb = sender as CheckBox;
if (cb.Checked) isAutoScale = true;
else isAutoScale = false;
}
}
public class MonitorItem
{
public double[] data = new double[2048];
public System.Drawing.Color color = System.Drawing.Color.Red;
public string name = "";
public int order = 0;
private static int col = 0;
private bool firstScan = true;
public int Length
{
get { return data.Length; }
}
public double Last
{
get { return data[data.Length - 1]; }
}
private System.Drawing.Color[] colors =
{
System.Drawing.Color.Red,
System.Drawing.Color.Green,
System.Drawing.Color.Blue,
System.Drawing.Color.Orange,
System.Drawing.Color.Orchid,
System.Drawing.Color.Purple,
System.Drawing.Color.Pink,
System.Drawing.Color.Black,
System.Drawing.Color.Gray,
System.Drawing.Color.SkyBlue,
System.Drawing.Color.Magenta,
System.Drawing.Color.DarkGreen,
System.Drawing.Color.LightGreen,
System.Drawing.Color.YellowGreen,
System.Drawing.Color.DarkRed,
};
private void init()
{
color = colors[col % 16];
col++;
}
public MonitorItem()
{
init();
}
public MonitorItem(string name, int order)
{
this.name = name;
this.order = order;
init();
}
public void Insert(double d)
{
if (firstScan)
{
for(int i = 0; i < data.Length; i++)
{
data[i] = d;
}
firstScan = false;
return;
}
Buffer.BlockCopy(data, sizeof(double), data, 0, (data.Length - 1) * sizeof(double));
data[data.Length - 1] = d;
}
}
}

View File

@ -160,9 +160,10 @@
//
// Save_btn
//
this.Save_btn.Location = new System.Drawing.Point(1012, 562);
this.Save_btn.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.Save_btn.Location = new System.Drawing.Point(1097, 608);
this.Save_btn.Name = "Save_btn";
this.Save_btn.Size = new System.Drawing.Size(75, 23);
this.Save_btn.Size = new System.Drawing.Size(90, 30);
this.Save_btn.TabIndex = 18;
this.Save_btn.Text = "Сохранить";
this.Save_btn.UseVisualStyleBackColor = true;
@ -170,9 +171,10 @@
//
// button1
//
this.button1.Location = new System.Drawing.Point(1107, 562);
this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.button1.Location = new System.Drawing.Point(1193, 608);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.Size = new System.Drawing.Size(90, 30);
this.button1.TabIndex = 19;
this.button1.Text = "Отменить";
this.button1.UseVisualStyleBackColor = true;
@ -1167,7 +1169,7 @@
this.Controls.Add(this.button1);
this.Controls.Add(this.Save_btn);
this.Name = "RatePID";
this.Size = new System.Drawing.Size(1200, 600);
this.Size = new System.Drawing.Size(1300, 650);
this.tabControl1.ResumeLayout(false);
this.tab_pid0.ResumeLayout(false);
this.pid0_panel.ResumeLayout(false);

View File

@ -56,6 +56,8 @@ namespace TelemetryIO
private bool isTimeout = false;
private readonly int responseTimeout = 2000;
private System.Timers.Timer timeout = new System.Timers.Timer(3000);
private bool exitPending = false;
public struct Telegram
@ -101,84 +103,101 @@ namespace TelemetryIO
private void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
while (sp.BytesToRead > 0)
try
{
if (!sp.IsOpen) return;
byte b = (byte)sp.ReadByte();
while (sp.BytesToRead > 0)
{
if (!sp.IsOpen) return;
byte b = (byte)sp.ReadByte();
if (b == ESCAPE_END)
{//END BYTE IS RECEIVED
timeout.Stop();
isTimeout = false;
byte[] unscape = EscapeSeqToBytes(rx_buf.ToArray());
uint checksum = crc32(unscape, unscape.Length - 4);
uint re_checksum = DataSlots.bytes_to_uint(unscape, unscape.Length - 4);
if (re_checksum == checksum)
{
//Parse telegram
int cmd = DataSlots.bytes_to_int(unscape, 0);
int slot = DataSlots.bytes_to_int(unscape, 4);
int len = DataSlots.bytes_to_int(unscape, 8);
int offset = DataSlots.bytes_to_int(unscape, 12);
byte[] data = new byte[len];
Array.Copy(unscape, 16, data, 0, len);
if (b == ESCAPE_END)
{//END BYTE IS RECEIVED
timeout.Stop();
isTimeout = false;
byte[] unscape = EscapeSeqToBytes(rx_buf.ToArray());
uint checksum = crc32(unscape, unscape.Length - 4);
uint re_checksum = DataSlots.bytes_to_uint(unscape, unscape.Length - 4);
if (re_checksum == checksum)
{
//Parse telegram
int cmd = DataSlots.bytes_to_int(unscape, 0);
int slot = DataSlots.bytes_to_int(unscape, 4);
int len = DataSlots.bytes_to_int(unscape, 8);
int offset = DataSlots.bytes_to_int(unscape, 12);
byte[] data = new byte[len];
Array.Copy(unscape, 16, data, 0, len);
if (cmd == TELE_CMD_RD_ONCE)
{
telemetry.setSlot(slot, data, offset, len);
OnAnswerReceived(slot.ToString());
//DataSlots.setSlot(slot, data, offset, len);
}
else if (cmd == TELE_CMD_RD_MON_ON)
{//READ MONITORING DATA
for(int i = 0; i < data.Length/4; i++)
if (cmd == TELE_CMD_RD_ONCE)
{
monitor[i] = BitConverter.ToSingle(data, i*4);
telemetry.setSlot(slot, data, offset, len);
OnAnswerReceived(slot.ToString());
//DataSlots.setSlot(slot, data, offset, len);
}
OnMonitoringItemsReceived(monitor);
view_str = string.Join(", ", monitor.Select(x => "" + x).ToArray(), 0, data.Length/4);
}
else if (cmd == TELE_CMD_WR)
{//WRITTING OPERATION IS DONE WITH SUCCESS
if (data[0] == 'O' && data[1] == 'k')
else if (cmd == TELE_CMD_RD_MON_ON)
{//READ MONITORING DATA
for (int i = 0; i < data.Length / 4; i++)
{
monitor[i] = BitConverter.ToSingle(data, i * 4);
}
OnMonitoringItemsReceived(monitor);
OnAnswerReceived("MONITORON");
view_str = string.Join(", ", monitor.Select(x => "" + x).ToArray(), 0, data.Length / 4);
}
else if (cmd == TELE_CMD_WR)
{//WRITTING OPERATION IS DONE WITH SUCCESS
if (data[0] == 'O' && data[1] == 'k')
{
Debug.Write("Data is written\n");
OnAnswerReceived("Data is written");
}
}
else if (cmd == TELE_CMD_HELLO)
{//HANDSHAKING ANSWER
telemetry.setSlot(9999, data, 0, 0);
view_str = Encoding.ASCII.GetString(data);
req_buffer.Clear();
OnHandShakeOccurred();
getPIDs();
}
else if (cmd == TELE_CMD_RD_MON_ADD)
{
Debug.Write("Data is written\n");
OnAnswerReceived("Data is written");
OnAnswerReceived("ADD");
isMonitorEmpty = false;
}
}else if(cmd == TELE_CMD_HELLO)
{//HANDSHAKING ANSWER
telemetry.setSlot(9999, data, 0, 0);
view_str = Encoding.ASCII.GetString(data);
req_buffer.Clear();
OnHandShakeOccurred();
getPIDs();
}else if(cmd == TELE_CMD_RD_MON_ADD)
{
OnAnswerReceived("ADD");
isMonitorEmpty = false;
}
else if(cmd == TELE_CMD_RD_MON_REMOVE)
{
OnAnswerReceived("REMOVE");
}else if(cmd == TELE_CMD_RD_MON_REMOVEALL)
{
OnAnswerReceived("REMOVEALL");
isMonitorEmpty = true;
else if (cmd == TELE_CMD_RD_MON_REMOVE)
{
OnAnswerReceived("REMOVE");
}
else if (cmd == TELE_CMD_RD_MON_REMOVEALL)
{
if (exitPending)
{
com_port.Close();
OnAnswerReceived("EXITAPP");
}
else OnAnswerReceived("REMOVEALL");
}
else if (cmd == TELE_CMD_RD_MON_OFF)
{
OnAnswerReceived("MONITOROFF");
}
Debug.WriteLine($"cmd = {cmd}");
waitingForResponse = false;
sendNextRequest();
}
}
waitingForResponse = false;
sendNextRequest();
}
else if (b == ESCAPE_BEGIN)
{//START BYTE IS RECEIVED
rx_buf.Clear();
}
else
{//FILLING BUFFER
rx_buf.Add(b);
else if (b == ESCAPE_BEGIN)
{//START BYTE IS RECEIVED
rx_buf.Clear();
}
else
{//FILLING BUFFER
rx_buf.Add(b);
}
}
}catch(Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
@ -202,6 +221,7 @@ namespace TelemetryIO
isTimeout = true;
req_buffer.Clear();
this.Close();
if(exitPending) OnAnswerReceived("EXITAPP");
}
}
}
@ -213,11 +233,10 @@ namespace TelemetryIO
com_port.Close();
}
public void Exit()
public void requestExit()
{
RemoveMonitoringItems();
while (isMonitorEmpty || isTimeout) ;
if(!isTimeout)Close();
exitPending = true;
}
public void putRequest(byte[] request)
@ -292,6 +311,11 @@ namespace TelemetryIO
putRequest(prepareTelegram(TELE_CMD_RD_MON_REMOVEALL, 0, new byte[0], 0));
}
public void saveFloats(float[] data)
{
prepareTelegram(TELE_CMD_WR, 1000, data, 0);
}
byte crc8(byte[] data, int length)
{
byte crc = 0x00; // Initial value