863 lines
33 KiB
C++
863 lines
33 KiB
C++
#pragma once
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
#include "Converter.h"
|
|
#include "ConvNorm.h"
|
|
|
|
struct PointG { double Latitude; double Longitude; };
|
|
|
|
float GPS_LocalDistance(PointG p1, PointG p2, float& dx, float& dy) // light formula
|
|
{
|
|
const float pi = 3.14159265359;
|
|
const float er = 6371000; // Radius of the earth in m
|
|
|
|
float lat = p1.Latitude - p2.Latitude;
|
|
float lon = p1.Longitude - p2.Longitude;
|
|
|
|
float y = er / 360 * (lat * pi * 2); // lat
|
|
dy = y;
|
|
|
|
float l = ((float)(p1.Latitude + p2.Latitude)) / 2;
|
|
float r = cosf(l * pi / 180) * er;
|
|
float x = r / 360 * (lon * pi * 2); // long
|
|
dx = x;
|
|
|
|
float d = sqrtf(x * x + y * y);
|
|
return d;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
float PlotsData[7];
|
|
bool PlotsReady = false;
|
|
|
|
HANDLE PortCOM;
|
|
HANDLE FileLOG;
|
|
HANDLE MainThread;
|
|
|
|
void SaveLogFile(HANDLE file, unsigned char data[28], unsigned long size)
|
|
{
|
|
float table[7];
|
|
memcpy(table, data, size);
|
|
memcpy(PlotsData, data, size);
|
|
PlotsReady = true;
|
|
|
|
if (!file) return;
|
|
|
|
char buf[1024];
|
|
sprintf(buf, "%d|%f|%f|%f|%f|%f|%f\r\n", (int)table[0], table[1], table[2], table[3], table[4], table[5], table[6]);
|
|
|
|
WriteFile(file, buf, strlen(buf), 0, 0);
|
|
}
|
|
|
|
unsigned long __stdcall RecvThread(void*)
|
|
{
|
|
long wait = 0;
|
|
|
|
private enum class RecvModeEnum : char { Begin, Data };
|
|
|
|
bool mode = false;
|
|
|
|
unsigned char data[29];
|
|
unsigned long size;
|
|
|
|
unsigned long len;
|
|
|
|
while (1)
|
|
{
|
|
if (!PortCOM)
|
|
{
|
|
CloseHandle(MainThread);
|
|
CloseHandle(FileLOG);
|
|
MainThread = 0;
|
|
return 0;
|
|
}
|
|
|
|
if (wait < GetTickCount()) mode = false;
|
|
|
|
if(!mode)
|
|
{
|
|
wait = GetTickCount() + 20;
|
|
|
|
ReadFile(PortCOM, data, 1, &len, 0);
|
|
if (!len) continue;
|
|
if (data[0] == 'Z') mode = true;
|
|
size = 0;
|
|
}
|
|
|
|
if(mode)
|
|
{
|
|
ReadFile(PortCOM, data + size, sizeof(data) - size, &len, 0);
|
|
if (!len) continue;
|
|
size += len;
|
|
if (size < sizeof(data)) continue;
|
|
|
|
if (data[28] == 'V') SaveLogFile(FileLOG, data, sizeof(data) - 1);
|
|
|
|
mode = false;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
namespace HexapodControl
|
|
{
|
|
|
|
using namespace System;
|
|
using namespace System::ComponentModel;
|
|
using namespace System::Collections;
|
|
using namespace System::Windows::Forms;
|
|
using namespace System::Data;
|
|
using namespace System::Drawing;
|
|
using namespace System::IO;
|
|
|
|
/// <summary>
|
|
/// Summary for Form1
|
|
///
|
|
/// WARNING: If you change the name of this class, you will need to change the
|
|
/// 'Resource File Name' property for the managed resource compiler tool
|
|
/// associated with all .resx files this class depends on. Otherwise,
|
|
/// the designers will not be able to interact properly with localized
|
|
/// resources associated with this form.
|
|
/// </summary>
|
|
public ref class Form1 : public System::Windows::Forms::Form
|
|
{
|
|
public:
|
|
Form1(void)
|
|
{
|
|
InitializeComponent();
|
|
//
|
|
|
|
}
|
|
|
|
protected:
|
|
/// <summary>
|
|
/// Clean up any resources being used.
|
|
|
|
String^ RecordsFolder = "";
|
|
private: System::Windows::Forms::OpenFileDialog^ openFileDialog_Open;
|
|
private: System::Windows::Forms::Button^ button_File;
|
|
private: System::Windows::Forms::GroupBox^ groupBox1;
|
|
private: System::Windows::Forms::CheckedListBox^ checkedListBox_List;
|
|
private: System::Windows::Forms::CheckBox^ checkBox_Auto;
|
|
private: System::Windows::Forms::Label^ label2;
|
|
private: System::Windows::Forms::Label^ label1;
|
|
private: System::Windows::Forms::NumericUpDown^ numericUpDown_Graph_MinY;
|
|
private: System::Windows::Forms::NumericUpDown^ numericUpDown_Track;
|
|
private: System::Windows::Forms::Label^ label3;
|
|
private: System::Windows::Forms::Panel^ panel_Opt;
|
|
|
|
private: System::Windows::Forms::NumericUpDown^ numericUpDown_Gain;
|
|
|
|
private: System::Windows::Forms::Label^ label4;
|
|
private: System::Windows::Forms::Button^ button_Gain_Clear;
|
|
private: System::Windows::Forms::NumericUpDown^ numericUpDown_Shift;
|
|
private: System::Windows::Forms::Label^ label5;
|
|
|
|
|
|
private: System::Windows::Forms::NumericUpDown^ numericUpDown_Graph_MaxY;
|
|
|
|
protected:
|
|
|
|
protected:
|
|
/// </summary>
|
|
~Form1()
|
|
{
|
|
if (components)
|
|
{
|
|
delete components;
|
|
}
|
|
}
|
|
private: System::Windows::Forms::DataVisualization::Charting::Chart^ chart_Graph;
|
|
protected:
|
|
|
|
|
|
private: System::Windows::Forms::Panel^ panel1;
|
|
private: System::Windows::Forms::Timer^ timer_Tick;
|
|
|
|
private: System::Windows::Forms::Button^ button_Start;
|
|
private: System::Windows::Forms::GroupBox^ groupBox_P1;
|
|
private: System::Windows::Forms::ComboBox^ comboBox_Port;
|
|
|
|
private: System::Windows::Forms::Button^ button_Connect;
|
|
|
|
|
|
|
|
|
|
private: System::ComponentModel::IContainer^ components;
|
|
private:
|
|
/// <summary>
|
|
/// Required designer variable.
|
|
/// </summary>
|
|
|
|
|
|
#pragma region Windows Form Designer generated code
|
|
/// <summary>
|
|
/// Required method for Designer support - do not modify
|
|
/// the contents of this method with the code editor.
|
|
/// </summary>
|
|
void InitializeComponent(void)
|
|
{
|
|
this->components = (gcnew System::ComponentModel::Container());
|
|
System::Windows::Forms::DataVisualization::Charting::ChartArea^ chartArea1 = (gcnew System::Windows::Forms::DataVisualization::Charting::ChartArea());
|
|
System::Windows::Forms::DataVisualization::Charting::Legend^ legend1 = (gcnew System::Windows::Forms::DataVisualization::Charting::Legend());
|
|
System::Windows::Forms::DataVisualization::Charting::Series^ series1 = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
|
|
System::Windows::Forms::DataVisualization::Charting::Series^ series2 = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
|
|
System::Windows::Forms::DataVisualization::Charting::Series^ series3 = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
|
|
System::Windows::Forms::DataVisualization::Charting::Series^ series4 = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
|
|
System::Windows::Forms::DataVisualization::Charting::Series^ series5 = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
|
|
System::Windows::Forms::DataVisualization::Charting::Series^ series6 = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
|
|
this->chart_Graph = (gcnew System::Windows::Forms::DataVisualization::Charting::Chart());
|
|
this->panel1 = (gcnew System::Windows::Forms::Panel());
|
|
this->button_File = (gcnew System::Windows::Forms::Button());
|
|
this->comboBox_Port = (gcnew System::Windows::Forms::ComboBox());
|
|
this->button_Connect = (gcnew System::Windows::Forms::Button());
|
|
this->button_Start = (gcnew System::Windows::Forms::Button());
|
|
this->timer_Tick = (gcnew System::Windows::Forms::Timer(this->components));
|
|
this->groupBox_P1 = (gcnew System::Windows::Forms::GroupBox());
|
|
this->openFileDialog_Open = (gcnew System::Windows::Forms::OpenFileDialog());
|
|
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
|
|
this->panel_Opt = (gcnew System::Windows::Forms::Panel());
|
|
this->numericUpDown_Shift = (gcnew System::Windows::Forms::NumericUpDown());
|
|
this->label5 = (gcnew System::Windows::Forms::Label());
|
|
this->button_Gain_Clear = (gcnew System::Windows::Forms::Button());
|
|
this->numericUpDown_Gain = (gcnew System::Windows::Forms::NumericUpDown());
|
|
this->label4 = (gcnew System::Windows::Forms::Label());
|
|
this->numericUpDown_Track = (gcnew System::Windows::Forms::NumericUpDown());
|
|
this->label3 = (gcnew System::Windows::Forms::Label());
|
|
this->label2 = (gcnew System::Windows::Forms::Label());
|
|
this->label1 = (gcnew System::Windows::Forms::Label());
|
|
this->numericUpDown_Graph_MinY = (gcnew System::Windows::Forms::NumericUpDown());
|
|
this->numericUpDown_Graph_MaxY = (gcnew System::Windows::Forms::NumericUpDown());
|
|
this->checkBox_Auto = (gcnew System::Windows::Forms::CheckBox());
|
|
this->checkedListBox_List = (gcnew System::Windows::Forms::CheckedListBox());
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->chart_Graph))->BeginInit();
|
|
this->panel1->SuspendLayout();
|
|
this->groupBox_P1->SuspendLayout();
|
|
this->groupBox1->SuspendLayout();
|
|
this->panel_Opt->SuspendLayout();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Shift))->BeginInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Gain))->BeginInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Track))->BeginInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Graph_MinY))->BeginInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Graph_MaxY))->BeginInit();
|
|
this->SuspendLayout();
|
|
//
|
|
// chart_Graph
|
|
//
|
|
chartArea1->Name = L"ChartArea1";
|
|
this->chart_Graph->ChartAreas->Add(chartArea1);
|
|
this->chart_Graph->Dock = System::Windows::Forms::DockStyle::Fill;
|
|
legend1->Name = L"Legend1";
|
|
this->chart_Graph->Legends->Add(legend1);
|
|
this->chart_Graph->Location = System::Drawing::Point(3, 16);
|
|
this->chart_Graph->Name = L"chart_Graph";
|
|
series1->BorderWidth = 2;
|
|
series1->ChartArea = L"ChartArea1";
|
|
series1->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::FastLine;
|
|
series1->Color = System::Drawing::Color::Red;
|
|
series1->Legend = L"Legend1";
|
|
series1->Name = L"gX";
|
|
series1->XValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series1->YValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series2->BorderWidth = 2;
|
|
series2->ChartArea = L"ChartArea1";
|
|
series2->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::FastLine;
|
|
series2->Color = System::Drawing::Color::Blue;
|
|
series2->Legend = L"Legend1";
|
|
series2->Name = L"gY";
|
|
series2->XValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series2->YValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series3->BorderWidth = 2;
|
|
series3->ChartArea = L"ChartArea1";
|
|
series3->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::FastLine;
|
|
series3->Color = System::Drawing::Color::Green;
|
|
series3->Legend = L"Legend1";
|
|
series3->Name = L"gZ";
|
|
series3->XValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series3->YValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series4->ChartArea = L"ChartArea1";
|
|
series4->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::FastLine;
|
|
series4->Legend = L"Legend1";
|
|
series4->Name = L"iX";
|
|
series4->XValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series4->YValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series5->ChartArea = L"ChartArea1";
|
|
series5->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::FastLine;
|
|
series5->Legend = L"Legend1";
|
|
series5->Name = L"iY";
|
|
series5->XValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series5->YValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series6->ChartArea = L"ChartArea1";
|
|
series6->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::FastLine;
|
|
series6->Legend = L"Legend1";
|
|
series6->Name = L"iZ";
|
|
series6->XValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
series6->YValueType = System::Windows::Forms::DataVisualization::Charting::ChartValueType::Double;
|
|
this->chart_Graph->Series->Add(series1);
|
|
this->chart_Graph->Series->Add(series2);
|
|
this->chart_Graph->Series->Add(series3);
|
|
this->chart_Graph->Series->Add(series4);
|
|
this->chart_Graph->Series->Add(series5);
|
|
this->chart_Graph->Series->Add(series6);
|
|
this->chart_Graph->Size = System::Drawing::Size(689, 669);
|
|
this->chart_Graph->TabIndex = 1;
|
|
this->chart_Graph->Text = L"chart1";
|
|
//
|
|
// panel1
|
|
//
|
|
this->panel1->Controls->Add(this->button_File);
|
|
this->panel1->Controls->Add(this->comboBox_Port);
|
|
this->panel1->Controls->Add(this->button_Connect);
|
|
this->panel1->Controls->Add(this->button_Start);
|
|
this->panel1->Dock = System::Windows::Forms::DockStyle::Left;
|
|
this->panel1->Location = System::Drawing::Point(0, 0);
|
|
this->panel1->Name = L"panel1";
|
|
this->panel1->Size = System::Drawing::Size(135, 688);
|
|
this->panel1->TabIndex = 2;
|
|
//
|
|
// button_File
|
|
//
|
|
this->button_File->Location = System::Drawing::Point(29, 611);
|
|
this->button_File->Name = L"button_File";
|
|
this->button_File->Size = System::Drawing::Size(75, 23);
|
|
this->button_File->TabIndex = 4;
|
|
this->button_File->Text = L"File";
|
|
this->button_File->UseVisualStyleBackColor = true;
|
|
this->button_File->Click += gcnew System::EventHandler(this, &Form1::button_File_Click);
|
|
//
|
|
// comboBox_Port
|
|
//
|
|
this->comboBox_Port->FormattingEnabled = true;
|
|
this->comboBox_Port->Location = System::Drawing::Point(8, 12);
|
|
this->comboBox_Port->Name = L"comboBox_Port";
|
|
this->comboBox_Port->Size = System::Drawing::Size(121, 21);
|
|
this->comboBox_Port->TabIndex = 3;
|
|
this->comboBox_Port->DropDown += gcnew System::EventHandler(this, &Form1::comboBox_Port_DropDown);
|
|
//
|
|
// button_Connect
|
|
//
|
|
this->button_Connect->Location = System::Drawing::Point(8, 39);
|
|
this->button_Connect->Name = L"button_Connect";
|
|
this->button_Connect->Size = System::Drawing::Size(121, 23);
|
|
this->button_Connect->TabIndex = 2;
|
|
this->button_Connect->Text = L"Connect";
|
|
this->button_Connect->UseVisualStyleBackColor = true;
|
|
this->button_Connect->Click += gcnew System::EventHandler(this, &Form1::button_Connect_Click);
|
|
//
|
|
// button_Start
|
|
//
|
|
this->button_Start->Dock = System::Windows::Forms::DockStyle::Bottom;
|
|
this->button_Start->Location = System::Drawing::Point(0, 653);
|
|
this->button_Start->Name = L"button_Start";
|
|
this->button_Start->Size = System::Drawing::Size(135, 35);
|
|
this->button_Start->TabIndex = 1;
|
|
this->button_Start->Text = L"Start";
|
|
this->button_Start->UseVisualStyleBackColor = true;
|
|
this->button_Start->Click += gcnew System::EventHandler(this, &Form1::button_Start_Click);
|
|
//
|
|
// timer_Tick
|
|
//
|
|
this->timer_Tick->Interval = 10;
|
|
this->timer_Tick->Tick += gcnew System::EventHandler(this, &Form1::timer_Tick_Tick);
|
|
//
|
|
// groupBox_P1
|
|
//
|
|
this->groupBox_P1->Controls->Add(this->chart_Graph);
|
|
this->groupBox_P1->Dock = System::Windows::Forms::DockStyle::Fill;
|
|
this->groupBox_P1->Location = System::Drawing::Point(135, 0);
|
|
this->groupBox_P1->MinimumSize = System::Drawing::Size(676, 688);
|
|
this->groupBox_P1->Name = L"groupBox_P1";
|
|
this->groupBox_P1->Size = System::Drawing::Size(695, 688);
|
|
this->groupBox_P1->TabIndex = 3;
|
|
this->groupBox_P1->TabStop = false;
|
|
//
|
|
// openFileDialog_Open
|
|
//
|
|
this->openFileDialog_Open->FileName = L"openFileDialog1";
|
|
this->openFileDialog_Open->Multiselect = true;
|
|
//
|
|
// groupBox1
|
|
//
|
|
this->groupBox1->Controls->Add(this->panel_Opt);
|
|
this->groupBox1->Controls->Add(this->numericUpDown_Track);
|
|
this->groupBox1->Controls->Add(this->label3);
|
|
this->groupBox1->Controls->Add(this->label2);
|
|
this->groupBox1->Controls->Add(this->label1);
|
|
this->groupBox1->Controls->Add(this->numericUpDown_Graph_MinY);
|
|
this->groupBox1->Controls->Add(this->numericUpDown_Graph_MaxY);
|
|
this->groupBox1->Controls->Add(this->checkBox_Auto);
|
|
this->groupBox1->Controls->Add(this->checkedListBox_List);
|
|
this->groupBox1->Dock = System::Windows::Forms::DockStyle::Right;
|
|
this->groupBox1->Location = System::Drawing::Point(830, 0);
|
|
this->groupBox1->Name = L"groupBox1";
|
|
this->groupBox1->Size = System::Drawing::Size(128, 688);
|
|
this->groupBox1->TabIndex = 4;
|
|
this->groupBox1->TabStop = false;
|
|
this->groupBox1->Text = L" options ";
|
|
//
|
|
// panel_Opt
|
|
//
|
|
this->panel_Opt->BorderStyle = System::Windows::Forms::BorderStyle::Fixed3D;
|
|
this->panel_Opt->Controls->Add(this->numericUpDown_Shift);
|
|
this->panel_Opt->Controls->Add(this->label5);
|
|
this->panel_Opt->Controls->Add(this->button_Gain_Clear);
|
|
this->panel_Opt->Controls->Add(this->numericUpDown_Gain);
|
|
this->panel_Opt->Controls->Add(this->label4);
|
|
this->panel_Opt->Dock = System::Windows::Forms::DockStyle::Bottom;
|
|
this->panel_Opt->Enabled = false;
|
|
this->panel_Opt->Location = System::Drawing::Point(3, 245);
|
|
this->panel_Opt->Name = L"panel_Opt";
|
|
this->panel_Opt->Size = System::Drawing::Size(122, 440);
|
|
this->panel_Opt->TabIndex = 8;
|
|
//
|
|
// numericUpDown_Shift
|
|
//
|
|
this->numericUpDown_Shift->DecimalPlaces = 3;
|
|
this->numericUpDown_Shift->Increment = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 65536 });
|
|
this->numericUpDown_Shift->Location = System::Drawing::Point(36, 8);
|
|
this->numericUpDown_Shift->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 32000, 0, 0, 0 });
|
|
this->numericUpDown_Shift->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 32000, 0, 0, System::Int32::MinValue });
|
|
this->numericUpDown_Shift->Name = L"numericUpDown_Shift";
|
|
this->numericUpDown_Shift->Size = System::Drawing::Size(75, 20);
|
|
this->numericUpDown_Shift->TabIndex = 6;
|
|
this->numericUpDown_Shift->ValueChanged += gcnew System::EventHandler(this, &Form1::numericUpDown_Gain_ValueChanged);
|
|
//
|
|
// label5
|
|
//
|
|
this->label5->AutoSize = true;
|
|
this->label5->Location = System::Drawing::Point(6, 10);
|
|
this->label5->Name = L"label5";
|
|
this->label5->Size = System::Drawing::Size(31, 13);
|
|
this->label5->TabIndex = 5;
|
|
this->label5->Text = L"Shift:";
|
|
//
|
|
// button_Gain_Clear
|
|
//
|
|
this->button_Gain_Clear->Location = System::Drawing::Point(9, 60);
|
|
this->button_Gain_Clear->Name = L"button_Gain_Clear";
|
|
this->button_Gain_Clear->Size = System::Drawing::Size(102, 23);
|
|
this->button_Gain_Clear->TabIndex = 4;
|
|
this->button_Gain_Clear->Text = L"clean";
|
|
this->button_Gain_Clear->UseVisualStyleBackColor = true;
|
|
this->button_Gain_Clear->Click += gcnew System::EventHandler(this, &Form1::button_Gain_Clear_Click);
|
|
//
|
|
// numericUpDown_Gain
|
|
//
|
|
this->numericUpDown_Gain->DecimalPlaces = 3;
|
|
this->numericUpDown_Gain->Increment = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 131072 });
|
|
this->numericUpDown_Gain->Location = System::Drawing::Point(36, 34);
|
|
this->numericUpDown_Gain->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000, 0, 0, 0 });
|
|
this->numericUpDown_Gain->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 196608 });
|
|
this->numericUpDown_Gain->Name = L"numericUpDown_Gain";
|
|
this->numericUpDown_Gain->Size = System::Drawing::Size(75, 20);
|
|
this->numericUpDown_Gain->TabIndex = 3;
|
|
this->numericUpDown_Gain->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 0 });
|
|
this->numericUpDown_Gain->ValueChanged += gcnew System::EventHandler(this, &Form1::numericUpDown_Gain_ValueChanged);
|
|
//
|
|
// label4
|
|
//
|
|
this->label4->AutoSize = true;
|
|
this->label4->Location = System::Drawing::Point(6, 36);
|
|
this->label4->Name = L"label4";
|
|
this->label4->Size = System::Drawing::Size(32, 13);
|
|
this->label4->TabIndex = 0;
|
|
this->label4->Text = L"Gain:";
|
|
//
|
|
// numericUpDown_Track
|
|
//
|
|
this->numericUpDown_Track->Location = System::Drawing::Point(41, 219);
|
|
this->numericUpDown_Track->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 0 });
|
|
this->numericUpDown_Track->Name = L"numericUpDown_Track";
|
|
this->numericUpDown_Track->Size = System::Drawing::Size(57, 20);
|
|
this->numericUpDown_Track->TabIndex = 7;
|
|
this->numericUpDown_Track->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 10, 0, 0, 0 });
|
|
//
|
|
// label3
|
|
//
|
|
this->label3->AutoSize = true;
|
|
this->label3->Location = System::Drawing::Point(3, 221);
|
|
this->label3->Name = L"label3";
|
|
this->label3->Size = System::Drawing::Size(38, 13);
|
|
this->label3->TabIndex = 6;
|
|
this->label3->Text = L"Track:";
|
|
//
|
|
// label2
|
|
//
|
|
this->label2->AutoSize = true;
|
|
this->label2->Location = System::Drawing::Point(6, 187);
|
|
this->label2->Name = L"label2";
|
|
this->label2->Size = System::Drawing::Size(37, 13);
|
|
this->label2->TabIndex = 5;
|
|
this->label2->Text = L"Min Y:";
|
|
//
|
|
// label1
|
|
//
|
|
this->label1->AutoSize = true;
|
|
this->label1->Location = System::Drawing::Point(3, 161);
|
|
this->label1->Name = L"label1";
|
|
this->label1->Size = System::Drawing::Size(40, 13);
|
|
this->label1->TabIndex = 4;
|
|
this->label1->Text = L"Max Y:";
|
|
//
|
|
// numericUpDown_Graph_MinY
|
|
//
|
|
this->numericUpDown_Graph_MinY->Location = System::Drawing::Point(50, 185);
|
|
this->numericUpDown_Graph_MinY->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 32000, 0, 0, 0 });
|
|
this->numericUpDown_Graph_MinY->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 32000, 0, 0, System::Int32::MinValue });
|
|
this->numericUpDown_Graph_MinY->Name = L"numericUpDown_Graph_MinY";
|
|
this->numericUpDown_Graph_MinY->Size = System::Drawing::Size(75, 20);
|
|
this->numericUpDown_Graph_MinY->TabIndex = 3;
|
|
this->numericUpDown_Graph_MinY->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000, 0, 0, System::Int32::MinValue });
|
|
this->numericUpDown_Graph_MinY->ValueChanged += gcnew System::EventHandler(this, &Form1::numericUpDown_Graph_MaxY_ValueChanged);
|
|
//
|
|
// numericUpDown_Graph_MaxY
|
|
//
|
|
this->numericUpDown_Graph_MaxY->Location = System::Drawing::Point(50, 159);
|
|
this->numericUpDown_Graph_MaxY->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 32000, 0, 0, 0 });
|
|
this->numericUpDown_Graph_MaxY->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 32000, 0, 0, System::Int32::MinValue });
|
|
this->numericUpDown_Graph_MaxY->Name = L"numericUpDown_Graph_MaxY";
|
|
this->numericUpDown_Graph_MaxY->Size = System::Drawing::Size(75, 20);
|
|
this->numericUpDown_Graph_MaxY->TabIndex = 2;
|
|
this->numericUpDown_Graph_MaxY->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000, 0, 0, 0 });
|
|
this->numericUpDown_Graph_MaxY->ValueChanged += gcnew System::EventHandler(this, &Form1::numericUpDown_Graph_MaxY_ValueChanged);
|
|
//
|
|
// checkBox_Auto
|
|
//
|
|
this->checkBox_Auto->AutoSize = true;
|
|
this->checkBox_Auto->Location = System::Drawing::Point(17, 134);
|
|
this->checkBox_Auto->Name = L"checkBox_Auto";
|
|
this->checkBox_Auto->Size = System::Drawing::Size(47, 17);
|
|
this->checkBox_Auto->TabIndex = 1;
|
|
this->checkBox_Auto->Text = L"auto";
|
|
this->checkBox_Auto->UseVisualStyleBackColor = true;
|
|
this->checkBox_Auto->CheckedChanged += gcnew System::EventHandler(this, &Form1::checkBox_Auto_CheckedChanged);
|
|
//
|
|
// checkedListBox_List
|
|
//
|
|
this->checkedListBox_List->Dock = System::Windows::Forms::DockStyle::Top;
|
|
this->checkedListBox_List->FormattingEnabled = true;
|
|
this->checkedListBox_List->Location = System::Drawing::Point(3, 16);
|
|
this->checkedListBox_List->Name = L"checkedListBox_List";
|
|
this->checkedListBox_List->Size = System::Drawing::Size(122, 109);
|
|
this->checkedListBox_List->TabIndex = 0;
|
|
this->checkedListBox_List->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::checkedListBox_List_SelectedIndexChanged);
|
|
this->checkedListBox_List->DoubleClick += gcnew System::EventHandler(this, &Form1::checkedListBox_List_SelectedIndexChanged);
|
|
//
|
|
// Form1
|
|
//
|
|
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
|
|
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
|
|
this->ClientSize = System::Drawing::Size(958, 688);
|
|
this->Controls->Add(this->groupBox_P1);
|
|
this->Controls->Add(this->groupBox1);
|
|
this->Controls->Add(this->panel1);
|
|
this->MinimumSize = System::Drawing::Size(974, 727);
|
|
this->Name = L"Form1";
|
|
this->Text = L"Telemetry";
|
|
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->chart_Graph))->EndInit();
|
|
this->panel1->ResumeLayout(false);
|
|
this->groupBox_P1->ResumeLayout(false);
|
|
this->groupBox1->ResumeLayout(false);
|
|
this->groupBox1->PerformLayout();
|
|
this->panel_Opt->ResumeLayout(false);
|
|
this->panel_Opt->PerformLayout();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Shift))->EndInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Gain))->EndInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Track))->EndInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Graph_MinY))->EndInit();
|
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDown_Graph_MaxY))->EndInit();
|
|
this->ResumeLayout(false);
|
|
|
|
}
|
|
#pragma endregion
|
|
|
|
private: void ToCharString(String^ str1, char* str2)
|
|
{
|
|
for (int a = 0; a < str1->Length; a++) *str2++ = str1[a];
|
|
*str2 = '\0';
|
|
}
|
|
|
|
private: System::Void button_Connect_Click(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
if (button_Connect->Text == "Connect")
|
|
{
|
|
char text[128] = "\\\\.\\";
|
|
|
|
ToCharString(comboBox_Port->Text, text + 4);
|
|
|
|
PortCOM = CreateFileA(text, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
|
|
if (PortCOM == INVALID_HANDLE_VALUE)
|
|
{
|
|
PortCOM = 0;
|
|
MessageBox::Show("Error to connect", "Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
|
|
return;
|
|
}
|
|
//---
|
|
DCB serial = { sizeof(serial) };
|
|
GetCommState(PortCOM, &serial);
|
|
serial.BaudRate = 460800;
|
|
serial.ByteSize = 8;
|
|
serial.StopBits = ONESTOPBIT;
|
|
serial.Parity = NOPARITY;
|
|
SetCommState(PortCOM, &serial);
|
|
//---
|
|
COMMTIMEOUTS tim;
|
|
GetCommTimeouts(PortCOM, &tim);
|
|
tim.ReadIntervalTimeout = 1;
|
|
tim.ReadTotalTimeoutConstant = 1;
|
|
tim.ReadTotalTimeoutMultiplier = 1;
|
|
SetCommTimeouts(PortCOM, &tim);
|
|
//---
|
|
timer_Tick->Enabled = true;
|
|
button_Connect->Text = "Disonnect";
|
|
//---
|
|
for (int a = 0; a < chart_Graph->Series->Count; a++) chart_Graph->Series[a]->Points->Clear();
|
|
//---
|
|
MainThread = CreateThread(0, 0, RecvThread, 0, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
CloseHandle(PortCOM);
|
|
PortCOM = 0;
|
|
timer_Tick->Enabled = false;
|
|
button_Connect->Text = "Connect";
|
|
}
|
|
}
|
|
|
|
private: System::Void comboBox_Port_DropDown(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
comboBox_Port->Items->Clear();
|
|
for each (String ^ p in System::IO::Ports::SerialPort::GetPortNames())
|
|
{
|
|
comboBox_Port->Items->Add(p);
|
|
}
|
|
}
|
|
|
|
private: System::Void timer_Tick_Tick(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
if (!PlotsReady) return;
|
|
PlotsReady = false;
|
|
|
|
for (int a = 0; a < chart_Graph->Series->Count; a++)
|
|
{
|
|
chart_Graph->Series[a]->Points->AddY((double)PlotsData[a + 1]);
|
|
while (chart_Graph->Series[a]->Points->Count > numericUpDown_Track->Value * 100) chart_Graph->Series[a]->Points->RemoveAt(0);
|
|
}
|
|
}
|
|
|
|
private: System::Void button_Start_Click(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
if (button_Start->Text=="Stop")
|
|
{
|
|
if (FileLOG) CloseHandle(FileLOG);
|
|
FileLOG = 0;
|
|
button_Start->Text = "Start";
|
|
return;
|
|
}
|
|
|
|
DateTime dt = DateTime::Now;
|
|
String^ file = Path::Combine(RecordsFolder, "record=" + dt.ToString("yyyy-MM-dd+HH_mm_ss") + ".tel");
|
|
try
|
|
{
|
|
char text[256];
|
|
|
|
ToCharString(file, text);
|
|
|
|
FileLOG = CreateFileA(text, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_NEW, 0, 0);
|
|
if (FileLOG == INVALID_HANDLE_VALUE)
|
|
{
|
|
FileLOG = 0;
|
|
MessageBox::Show("Error to create file", "Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
|
|
return;
|
|
}
|
|
button_Start->Text = "Stop";
|
|
}
|
|
catch(...)
|
|
{
|
|
MessageBox::Show("Incorrect save file!", "Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
|
|
}
|
|
}
|
|
|
|
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
try
|
|
{
|
|
String^ folder = Environment::GetFolderPath(Environment::SpecialFolder::ApplicationData);
|
|
String^ specificFolder = Path::Combine(folder, "Telem");
|
|
//---
|
|
RecordsFolder = Path::Combine(specificFolder, "Records");
|
|
Directory::CreateDirectory(RecordsFolder);
|
|
|
|
openFileDialog_Open->InitialDirectory = RecordsFolder;
|
|
}
|
|
catch(...) { }
|
|
|
|
for each (auto s in chart_Graph->Series)
|
|
{
|
|
checkedListBox_List->Items->Add(s->Name, true);
|
|
}
|
|
|
|
MainDataRecord->Clear();
|
|
for (int a = 0; a < 6; a++) { MainDataGain[a] = 1; MainDataShift[a] = 0; }
|
|
|
|
numericUpDown_Graph_MaxY_ValueChanged(sender, e);
|
|
}
|
|
|
|
private: System::Collections::Generic::List<array<double>^>^ MainDataRecord = gcnew System::Collections::Generic::List<array<double>^>();
|
|
private: array<double>^ MainDataGain = gcnew array<double>(6);
|
|
private: array<double>^ MainDataShift = gcnew array<double>(6);
|
|
|
|
private: System::Void button_File_Click(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
if (openFileDialog_Open->ShowDialog() != System::Windows::Forms::DialogResult::OK) return;
|
|
|
|
CloseHandle(PortCOM);
|
|
PortCOM = 0;
|
|
timer_Tick->Enabled = false;
|
|
button_Connect->Text = "Connect";
|
|
|
|
for (int a = 0; a < chart_Graph->Series->Count; a++)
|
|
{
|
|
chart_Graph->Series[a]->Points->Clear();
|
|
}
|
|
|
|
MainDataRecord->Clear();
|
|
for (int a = 0; a < 6; a++) { MainDataGain[a] = 1; MainDataShift[a] = 0; }
|
|
panel_Opt->Enabled = true;
|
|
|
|
System::Globalization::CultureInfo^ nonInvariantCulture = gcnew System::Globalization::CultureInfo("en-US");
|
|
nonInvariantCulture->NumberFormat->NumberDecimalSeparator = ".";
|
|
System::Threading::Thread::CurrentThread->CurrentCulture = nonInvariantCulture;
|
|
|
|
array<String^>^ text = File::ReadAllLines(openFileDialog_Open->FileName);
|
|
|
|
static bool first = false;
|
|
static PointG fff = { 47.31941467, 38.78046767 };
|
|
|
|
static int counter = 0;
|
|
|
|
for each (String ^ line in text)
|
|
{
|
|
array<String^>^ elems =line->Split(',');
|
|
if (elems->Length < 6) continue;
|
|
if (elems[0][0] == 'G')
|
|
{
|
|
PointG g;
|
|
|
|
for (int a = 3, b=0; a < 6; a++, b++)
|
|
{
|
|
double v = Convert::ToDouble(elems[a]);
|
|
if (b == 1) g.Latitude = v;
|
|
if (b == 2) g.Longitude = v;
|
|
}
|
|
|
|
if (!first)
|
|
{
|
|
first = true;
|
|
fff = g;
|
|
}
|
|
|
|
static float ldx=0, ldy=0;
|
|
|
|
float dx, dy;
|
|
|
|
static float cdx = 0, cdy = 0;
|
|
|
|
float dis = GPS_LocalDistance(fff, g, dx, dy);
|
|
|
|
/*if (counter > 1)
|
|
{
|
|
cdx = (cdx*2 + (dx - ldx)) / 3;
|
|
cdy = (cdy*2 + (dy - ldy)) / 3;
|
|
|
|
chart_Graph->Series[0]->Points->AddY(cdx);
|
|
chart_Graph->Series[1]->Points->AddY(cdy);
|
|
ldx = dx;
|
|
ldy = dy;
|
|
counter = 0;
|
|
}
|
|
else counter++;*/
|
|
|
|
chart_Graph->Series[0]->Points->AddY(dx);
|
|
chart_Graph->Series[1]->Points->AddY(dy);
|
|
chart_Graph->Series[2]->Points->AddY(dis);
|
|
}
|
|
}
|
|
}
|
|
|
|
private: System::Void checkedListBox_List_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
for (int a = 0; a < checkedListBox_List->Items->Count; a++)
|
|
{
|
|
chart_Graph->Series[a]->Enabled = checkedListBox_List->GetItemChecked(a);
|
|
}
|
|
int index = checkedListBox_List->SelectedIndex;
|
|
if (index == -1) return;
|
|
numericUpDown_Gain->Value = (Decimal)MainDataGain[index];
|
|
numericUpDown_Shift->Value = (Decimal)MainDataShift[index];
|
|
}
|
|
private: System::Void checkBox_Auto_CheckedChanged(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
if (checkBox_Auto->Checked)
|
|
{
|
|
chart_Graph->ChartAreas[0]->AxisY->Minimum = double::NaN;
|
|
chart_Graph->ChartAreas[0]->AxisY->Maximum = double::NaN;
|
|
numericUpDown_Graph_MinY->Enabled = false;
|
|
numericUpDown_Graph_MaxY->Enabled = false;
|
|
}
|
|
else
|
|
{
|
|
numericUpDown_Graph_MaxY_ValueChanged(sender, e);
|
|
numericUpDown_Graph_MinY->Enabled = true;
|
|
numericUpDown_Graph_MaxY->Enabled = true;
|
|
|
|
}
|
|
}
|
|
private: System::Void numericUpDown_Graph_MaxY_ValueChanged(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
chart_Graph->ChartAreas[0]->AxisY->Minimum = (double)numericUpDown_Graph_MinY->Value;
|
|
chart_Graph->ChartAreas[0]->AxisY->Maximum = (double)numericUpDown_Graph_MaxY->Value;
|
|
}
|
|
|
|
private: System::Void numericUpDown_Gain_ValueChanged(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
int index = checkedListBox_List->SelectedIndex;
|
|
if (index == -1) return;
|
|
chart_Graph->Series[index]->Points->Clear();
|
|
for (int a = 0; a < MainDataRecord->Count; a++)
|
|
{
|
|
array<double>^ values = MainDataRecord[a];
|
|
chart_Graph->Series[index]->Points->AddY((Convert::ToDouble(numericUpDown_Shift->Value) + values[index]) * Convert::ToDouble(numericUpDown_Gain->Value));
|
|
}
|
|
MainDataGain[index] = Convert::ToDouble(numericUpDown_Gain->Value);
|
|
MainDataShift[index] = Convert::ToDouble(numericUpDown_Shift->Value);
|
|
}
|
|
|
|
private: System::Void button_Gain_Clear_Click(System::Object^ sender, System::EventArgs^ e)
|
|
{
|
|
for (int a = 0; a < 6; a++)
|
|
{
|
|
MainDataGain[a] = 1;
|
|
MainDataShift[a] = 0;
|
|
chart_Graph->Series[a]->Points->Clear();
|
|
}
|
|
|
|
for (int a = 0; a < 6; a++)
|
|
{
|
|
for (int b = 0; b < MainDataRecord->Count; b++)
|
|
{
|
|
array<double>^ values = MainDataRecord[b];
|
|
chart_Graph->Series[a]->Points->AddY(values[a]);
|
|
}
|
|
}
|
|
|
|
numericUpDown_Gain->Value = 1;
|
|
numericUpDown_Shift->Value = 0;
|
|
}
|
|
};
|
|
}
|
|
|