Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 249 → Rev 250

/QMK-Groundstation/trunk/Forms/mktool.cpp
17,6 → 17,8
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
 
// TODO: Wiederholungssenden wieder einbauen
 
#include <QtGui>
 
#include <QLineEdit>
60,7 → 62,7
tab_Main->removeTab(6);
 
// Tab mit Wegpunkte-Elementen verbergen
tab_Main->removeTab(5);
// tab_Main->removeTab(5);
 
// Settings-Tab hinzufügen.
f_Settings = new wdg_Settings( this );
99,7 → 101,6
Compass->setScaleTicks(0, 0, 3);
Compass->setScale(36, 5, 0);
 
// Compass->setNeedle(new QwtCompassMagnetNeedle(QwtCompassMagnetNeedle::ThinStyle));
Compass->setNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow, true, Qt::red, QColor(Qt::gray).light(130)));
Compass->setPalette(newPalette);
Compass->setMaximumSize(QSize(MeterSize, MeterSize));
196,8 → 197,10
Ticker = new QTimer(this);
 
// Seriell-Port
serialPort = new ManageSerialPort;
// serialPort = new ManageSerialPort;
 
Conn = new cConnection();
 
// neuer Logger
logger = new Logger(Settings, &Mode);
 
205,7 → 208,7
f_LCD = new dlg_LCD(this);
 
// Senden erlauben (Warum auch immer)
AllowSend = true;
// AllowSend = true;
 
Server = new cServer();
 
222,10 → 225,11
 
void MKTool::init_Connections()
{
connect(Dec, SIGNAL(clicked()), this, SLOT(slot_Test()));
connect(Dec, SIGNAL(clicked()), this, SLOT(slot_Test()));
 
// Seriel-Port Empfang
connect(serialPort, SIGNAL(newDataReceived(const QByteArray &)), this, SLOT(slot_newDataReceived(const QByteArray &)));
// Daten Senden / Empfangen
connect(Conn, SIGNAL(newData(sRxData)), this, SLOT(slot_newData(sRxData)));
connect(Conn, SIGNAL(showTerminal(int, QString)), this, SLOT(slot_showTerminal(int, QString)));
 
// Serielle Verbundung öffnen / schließen
connect(ac_ConnectTTY, SIGNAL(triggered()), this, SLOT(slot_OpenPort()));
274,6 → 278,9
connect(pb_Update, SIGNAL(clicked()), this, SLOT(slot_pb_Update()));
connect(pb_HexFile, SIGNAL(clicked()), this, SLOT(slot_pb_HexFile()));
 
// Wegpunkt-Befehl
connect(pb_FlyTo, SIGNAL(clicked()), this, SLOT(slot_pb_SendWaypoint()));
 
// CVS-Record starten / stoppen
connect(ac_RecordCSV, SIGNAL(triggered()), this, SLOT(slot_RecordLog()));
 
344,7 → 351,7
{
Plot[a] = new QwtPlotCurve(Settings->Analog1.Label[a]);
Plot[a]->setPen(QPen(QColor(Def_Colors[a])));
Plot[a]->setRenderHint(QwtPlotItem::RenderAntialiased);
// Plot[a]->setRenderHint(QwtPlotItem::RenderAntialiased);
 
if (Settings->Analog1.PlotView[a])
Plot[a]->attach(qwtPlot);
352,19 → 359,91
qwtPlot->replot();
}
 
 
void MKTool::slot_Test()
{
/*
sRxData RX;
}
 
RX.String = IN->text();
RX.Input = IN->text().toLatin1().data();
void MKTool::parse_TargetKML()
{
QString Tmp = te_KML->toPlainText().simplified();
QStringList List;
 
new_RXData(RX);
*/
if ((Tmp.contains("<kml xmlns=\"http://earth.google.com/kml/2.2\">")) && (Tmp.contains("<coordinates>")))
{
List = Tmp.split("<coordinates>");
List = List[1].split(",");
 
le_TarLong->setText(ToolBox::get_Float((List[0].toDouble() * 10000000), 10000000));
le_TarLat->setText(ToolBox::get_Float((List[1].toDouble() * 10000000), 10000000));
}
}
 
void MKTool::slot_pb_SendWaypoint()
{
if ((Navi.Current.Longitude == 0) && (Navi.Current.Latitude == 0))
{
QMessageBox msgB;
QString msg;
msgB.setText("Fehler: Es konnten keine GPS-Daten vom Mikrokopter empfangen werden");
msgB.exec();
return;
}
//erstelle einen Wegpunkt, den die NaviCtrl auswerten kann
 
Waypoint_t desired_pos;
bool ok_lat, ok_lon;
 
//eingegebene Daten holen
double desired_long, desired_lat;
 
desired_long = le_TarLong->text().toDouble(&ok_lon);
desired_lat = le_TarLat->text().toDouble(&ok_lat);
 
if (ok_lon && desired_long < 100)
desired_long *= 10000000+0.5;
 
if (ok_lat && desired_lat < 100)
desired_lat *= 10000000+0.5;
 
//fülle Wegpunkt-Daten
desired_pos.Position.Altitude = 0;
desired_pos.Position.Longitude = int32_t(desired_long);
desired_pos.Position.Latitude = int32_t(desired_lat);
desired_pos.Position.Status = NEWDATA;
desired_pos.Heading = -1;
desired_pos.ToleranceRadius = 1;
desired_pos.HoldTime = 60;
desired_pos.Event_Flag = 0;
desired_pos.reserve[0] = 0; // reserve
desired_pos.reserve[1] = 0; // reserve
desired_pos.reserve[2] = 0; // reserve
desired_pos.reserve[3] = 0; // reserve
 
//...und sende ihn an die NaviCtrl
int max_radius = 10000;
if (ok_lat && ok_lon &&
abs(Navi.Current.Longitude - desired_pos.Position.Longitude) < max_radius &&
abs(Navi.Current.Latitude - desired_pos.Position.Latitude) < max_radius)
{
Conn->send_Cmd('s', ADDRESS_NC, (char *)&desired_pos, sizeof(desired_pos), false);
}
else
{
QMessageBox msgB;
QString msg;
msg += "Bitte die Eingabe ueberpruefen!\n";
msg += "Die Werte muessen sich in der Naehe der aktuellen Koordinaten befinden\n";
msg += "(Lon: ";
msg += ToolBox::get_Float(Navi.Current.Longitude,10000000);
msg += ", ";
msg += "Lat: ";
msg += ToolBox::get_Float(Navi.Current.Latitude,10000000);
msg += ")";
msgB.setText(msg);
msgB.exec();
}
}
 
void MKTool::slot_ac_Hardware()
{
QAction *Action = (QAction*)sender();
388,7 → 467,7
TX_Data[3] = 0xAA;
TX_Data[4] = 0x00;
TX_Data[5] = '\r';
send_Data('#', ADDRESS_NC, TX_Data, 6, false);
Conn->send_Cmd('#', ADDRESS_NC, TX_Data, 6, false);
ToolBox::Wait(SLEEP);
}
 
396,7 → 475,7
{
lb_Status->setText(tr("Schalte um auf FlightCtrl."));
TX_Data[0] = 0;
send_Data('u', ADDRESS_NC, TX_Data, 1, false);
Conn->send_Cmd('u', ADDRESS_NC, TX_Data, 1, false);
}
else
if (rb_SelMag->isChecked())
403,7 → 482,7
{
lb_Status->setText(tr("Schalte um auf MK3MAG."));
TX_Data[0] = 1;
send_Data('u', ADDRESS_NC, TX_Data, 1, false);
Conn->send_Cmd('u', ADDRESS_NC, TX_Data, 1, false);
}
else
if (rb_SelNC->isChecked())
415,12 → 494,12
TX_Data[3] = 0xAA;
TX_Data[4] = 0x00;
TX_Data[5] = '\r';
send_Data('#', ADDRESS_NC, TX_Data, 6, false);
Conn->send_Cmd('#', ADDRESS_NC, TX_Data, 6, false);
}
ToolBox::Wait(SLEEP);
 
// qDebug("Select RB Hardware");
send_Data('v', ADDRESS_ALL, TX_Data, 0, true);
Conn->send_Cmd('v', ADDRESS_ALL, TX_Data, 0, true);
}
 
// Ticker-Event
432,6 → 511,17
else
TickerDiv = true;
 
if (cb_ClipBoard->isChecked())
{
QString s_OLD = te_KML->toPlainText();
te_KML->clear();
te_KML->paste();
if (s_OLD != te_KML->toPlainText())
{
parse_TargetKML();
}
}
 
for (int a = 0; a < MaxTickerEvents; a++)
{
if (TickerEvent[a] == true)
442,12 → 532,12
if (TickerDiv)
{
QByteArray Temp(LastSend.toUtf8());
serialPort->sendData(Temp);
// serialPort->sendData(Temp);
}
break;
case 1 :
TX_Data[0] = 0;
send_Data('p', ADDRESS_FC, TX_Data, 0, false);
Conn->send_Cmd('p', ADDRESS_FC, TX_Data, 0, false);
break;
case 2 :
if (f_LCD->cb_LCD->isChecked())
459,7 → 549,7
}
TX_Data[0] = LCD_Page;
TX_Data[1] = 0;
send_Data('l', ADDRESS_ALL, TX_Data, 1, true);
Conn->send_Cmd('l', ADDRESS_ALL, TX_Data, 1, true);
}
break;
case 3 :
466,12 → 556,12
if (ac_FastDebug->isChecked())
{
TX_Data[0] = Settings->Data.Debug_Fast / 10;
send_Data('d', ADDRESS_ALL, TX_Data, 1, false);
Conn->send_Cmd('d', ADDRESS_ALL, TX_Data, 1, false);
}
else
{
TX_Data[0] = Settings->Data.Debug_Slow / 10;
send_Data('d', ADDRESS_ALL, TX_Data, 1, false);
Conn->send_Cmd('d', ADDRESS_ALL, TX_Data, 1, false);
}
break;
}
576,7 → 666,7
f_LCD->show();
TX_Data[0] = 0;
TX_Data[1] = 0;
send_Data('l', ADDRESS_ALL, TX_Data, 1, true);
Conn->send_Cmd('l', ADDRESS_ALL, TX_Data, 1, true);
 
Ticker->setInterval(500);
TickerEvent[2] = true;
589,7 → 679,7
TX_Data[1] = Motor2;
TX_Data[2] = Motor3;
TX_Data[3] = Motor4;
send_Data('t', ADDRESS_FC, TX_Data, 4, false);
Conn->send_Cmd('t', ADDRESS_FC, TX_Data, 4, false);
}
 
void MKTool::slot_ac_Config()
737,7 → 827,7
lb_Status->setText(tr("Fordere langsame NaviDaten an."));
TX_Data[0] = Settings->Data.Navi_Slow / 10;
}
send_Data('o', ADDRESS_NC, TX_Data, 1, false);
Conn->send_Cmd('o', ADDRESS_NC, TX_Data, 1, false);
}
}
 
761,7 → 851,7
TX_Data[0] = Settings->Data.Navi_Slow / 10;
}
}
send_Data('o', ADDRESS_NC, TX_Data, 1, false);
Conn->send_Cmd('o', ADDRESS_NC, TX_Data, 1, false);
}
 
void MKTool::slot_ac_FastDebug() // DONE 0.71g
778,7 → 868,7
lb_Status->setText(tr("Fordere langsame DebugDaten an."));
TX_Data[0] = Settings->Data.Debug_Slow / 10;
}
send_Data('d', ADDRESS_ALL, TX_Data, 1, false);
Conn->send_Cmd('d', ADDRESS_ALL, TX_Data, 1, false);
}
}
 
807,7 → 897,7
TX_Data[0] = Settings->Data.Debug_Slow / 10;
}
}
send_Data('d', ADDRESS_ALL, TX_Data, 1, false);
Conn->send_Cmd('d', ADDRESS_ALL, TX_Data, 1, false);
}
 
void MKTool::slot_ac_About()
819,7 → 909,7
{
lb_Status->setText(tr("Analoglabels auslesen."));
TX_Data[0] = 0;
send_Data('a', ADDRESS_ALL, TX_Data, 1, true);
Conn->send_Cmd('a', ADDRESS_ALL, TX_Data, 1, true);
}
 
void MKTool::slot_ac_StartServer()
925,7 → 1015,7
 
Update = new QProcess();
 
if (serialPort->isOpen())
if (Conn->isOpen())
{
slot_OpenPort();
}
985,7 → 1075,7
if ((tab_Main->currentWidget()->objectName() == QString("Tab_2")) && (f_Settings->tab_Par->currentIndex() == 1))
{
TX_Data[0] = 0;
send_Data('p', ADDRESS_FC, TX_Data, 0, true);
Conn->send_Cmd('p', ADDRESS_FC, TX_Data, 0, true);
 
Ticker->setInterval(500);
TickerEvent[1] = true;
1023,8 → 1113,7
TX_Data[0] = LCD_Page + 1;
 
TX_Data[1] = 0;
send_Data('l', ADDRESS_ALL, TX_Data, 1, true);
 
Conn->send_Cmd('l', ADDRESS_ALL, TX_Data, 1, true);
}
 
void MKTool::slot_LCD_DOWN() // DONE 0.71g
1035,10 → 1124,7
TX_Data[0] = LCD_Page - 1;
 
TX_Data[1] = 0;
send_Data('l', ADDRESS_ALL, TX_Data, 1, true);
 
aa--;
 
Conn->send_Cmd('l', ADDRESS_ALL, TX_Data, 1, true);
}
 
// Settings aus MK lesen / in MK schreiben
1047,7 → 1133,7
lb_Status->setText(tr("Lese FlightCtrl-Settings aus."));
TX_Data[0] = f_Settings->sb_Set->value();
TX_Data[1] = 0;
send_Data('q', ADDRESS_FC, TX_Data, 1);
Conn->send_Cmd('q', ADDRESS_FC, TX_Data, 1);
}
 
void MKTool::slot_SetFCSettings() // DONE 0.71g
1056,7 → 1142,7
 
lb_Status->setText(tr("Schreibe FlightCtrl-Settings."));
 
send_Data('s', ADDRESS_FC, TX_Data2, MaxParameter + 2, false);
Conn->send_Cmd('s', ADDRESS_FC, TX_Data2, MaxParameter + 2, false);
}
 
 
1230,12 → 1316,6
{
MyServer->NewPosition(NaviString);
}
 
/*
qDebug(NaviString.Longitude.toLatin1().data());
qDebug(NaviString.Latitude.toLatin1().data());
qDebug(NaviString.Altitude.toLatin1().data());
*/
}
 
// Seriel-Port Bereich, Befehle senden und Daten empfangen
1242,8 → 1322,9
//////////////////////////////////////////////////////////
 
// Neues Datenpacket empfangen -> Verarbeiten
void MKTool::new_RXData(sRxData RX) // DONE 0.71g
void MKTool::slot_newData(sRxData RX) // DONE 0.71g
{
slot_showTerminal(1, RX.String);
 
if (LastSend.length() > 2)
{
1349,7 → 1430,7
}
Position ++;
TX_Data[0] = Position;
send_Data('a', ADDRESS_ALL, TX_Data, 1, true);
Conn->send_Cmd('a', ADDRESS_ALL, TX_Data, 1, true);
}
if (Position == 31)
{
1413,7 → 1494,7
TX_Data[0] = Settings->Data.Debug_Slow / 10;
}
 
send_Data('d', ADDRESS_ALL, TX_Data, 1, false);
Conn->send_Cmd('d', ADDRESS_ALL, TX_Data, 1, false);
 
// Wenn MK3MAG dann andauernd Daten neu anfragen.
if (Mode.ID == ADDRESS_MK3MAG)
1441,7 → 1522,7
TX_Data[0] = Settings->Data.Navi_Slow / 10;
}
 
send_Data('o', ADDRESS_NC, TX_Data, 1, false);
Conn->send_Cmd('o', ADDRESS_NC, TX_Data, 1, false);
}
 
 
1452,7 → 1533,11
{
TX_Data[0] = 0xff;
TX_Data[1] = 0;
send_Data('q', ADDRESS_FC, TX_Data, 1);
 
// DEP: Raus wenn Resend implementiert.
ToolBox::Wait(SLEEP);
Conn->send_Cmd('q', ADDRESS_FC, TX_Data, 1, true);
qDebug("FC - Get Settings");
}
}
// Wenn nicht Lesen und Schreiben der Settings deaktivieren.
1482,52 → 1567,37
}
}
 
// Neue Daten an der Schnittstelle
void MKTool::slot_newDataReceived(const QByteArray &dataReceived) // DONE 0.71g
void MKTool::slot_showTerminal(int Typ, QString Text)
{
const char *RXt;
RXt = dataReceived.data();
int a = 0;
 
while (RXt[a] != '\0')
switch(Typ)
{
if (RXt[a] == '\r')
case 1 :
{
while ((RxData.String.length() > 1) && (RxData.String.at(1) == '#'))
if ((cb_ShowData->isChecked()) && ((tab_Main->currentWidget()->objectName() == QString("Tab_3")) || (cb_ShowAlways->isChecked())))
{
RxData.String.remove(0,1);
te_RX->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
te_RX->insertHtml("<span style=\"color:#00008b;\">" + Text + "<br /></span>");
}
 
if (ToolBox::check_CRC(RxData.String))
}
break;
case 2 :
{
if ((cb_ShowMSG->isChecked()) && ((tab_Main->currentWidget()->objectName() == QString("Tab_3")) || (cb_ShowAlways->isChecked())))
{
RxData.Input = RxData.String.toLatin1().data();
new_RXData(RxData);
 
if ((cb_ShowData->isChecked()) && ((tab_Main->currentWidget()->objectName() == QString("Tab_3")) || (cb_ShowAlways->isChecked())))
{
te_RX->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
// te_RX->insertPlainText(" > " + RxData.String + '\r');
te_RX->insertHtml("<span style=\"color:#00008b;\">" + RxData.String + "<br /></span>");
}
te_RX->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
te_RX->insertHtml("<span style=\"color:#008b00;\">" + Text + "</span>");
}
else
{
if ((cb_ShowMSG->isChecked()) && ((tab_Main->currentWidget()->objectName() == QString("Tab_3")) || (cb_ShowAlways->isChecked())))
{
te_RX->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
// te_RX->insertPlainText(" > " + RxData.String + '\r');
te_RX->insertHtml("<span style=\"color:#008b00;\">" + RxData.String + "<br /></span>");
}
}
RxData.String = QString("");
}
else
break;
case 3 :
{
if (cb_ShowSend->isChecked())
{
RxData.String = RxData.String + QString(RXt[a]);
te_RX->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
te_RX->insertHtml("<span style='color:#8b0000;'>" + Text + "<br /></span>");
}
}
a++;
break;
}
}
 
1534,16 → 1604,16
// Seriellen Port öffnen
void MKTool::slot_OpenPort()
{
if (serialPort->isOpen())
{
if (Conn->isOpen())
{
TX_Data[0] = Settings->Data.Debug_Off / 10;
send_Data('d', ADDRESS_ALL, TX_Data, 1, false);
Conn->send_Cmd('d', ADDRESS_ALL, TX_Data, 1, false);
ToolBox::Wait(SLEEP);
 
if (Mode.ID == ADDRESS_NC)
{
TX_Data[0] = Settings->Data.Navi_Off / 10;
send_Data('o', ADDRESS_NC, TX_Data, 1, false);
Conn->send_Cmd('o', ADDRESS_NC, TX_Data, 1, false);
ToolBox::Wait(SLEEP);
}
 
1553,15 → 1623,13
TX_Data[1] = 0;
TX_Data[2] = 0;
TX_Data[3] = 0;
send_Data('t', ADDRESS_FC, TX_Data, 4, false);
Conn->send_Cmd('t', ADDRESS_FC, TX_Data, 4, false);
ToolBox::Wait(SLEEP);
}
serialPort->close();
// pb_Open->setText("Seriell Verbinden");
 
Conn->Close();
 
ac_ConnectTTY->setText("Seriell Verbinden");
// pb_Open->setIcon(ToolBox::Icon(9));
// ac_ConnectTTY->setIcon(ToolBox::Icon(9));
 
le_Port->setEnabled(true);
 
Ticker->stop();
1568,94 → 1636,26
}
else
{
serialPort->setPort(le_Port->text()); //Port
 
serialPort->setBaudRate(BAUD57600); //BaudRate
serialPort->setDataBits(DATA_8); //DataBits
serialPort->setParity(PAR_NONE); //Parity
serialPort->setStopBits(STOP_1); //StopBits
serialPort->setFlowControl(FLOW_OFF); //FlowControl
 
serialPort->setTimeout(0, 10);
serialPort->enableSending();
serialPort->enableReceiving();
 
serialPort->open();
if (serialPort->isOpen())
if (Conn->Open(le_Port->text()))
{
ac_ConnectTTY->setText("Seriell Trennen");
le_Port->setEnabled(false);
serialPort->receiveData();
 
send_Data('v', ADDRESS_ALL, TX_Data, 0, true);
Conn->send_Cmd('v', ADDRESS_ALL, TX_Data, 0, true);
 
// pb_Open->setText("Seriell Trennen");
ac_ConnectTTY->setText("Seriell Trennen");
// pb_Open->setIcon(ToolBox::Icon(8));
// ac_ConnectTTY->setIcon(ToolBox::Icon(8));
 
Ticker->start(2000);
}
}
}
 
// Daten senden
void MKTool::send_Data(char CMD, int Address, char Data[150],unsigned int Length, bool Resend) // DONE 0.71g
{
if (serialPort->isOpen() && AllowSend)
{
QByteArray Temp;
QString TX_Data;
 
if (CMD != '#')
{
// qDebug("Send data..");
TX_Data = ToolBox::Encode64(Data, Length);
 
TX_Data = QString("#") + (QString('a' + Address)) + QString(CMD) + TX_Data;
 
// qDebug(TX_Data.toLatin1().data());
 
TX_Data = ToolBox::add_CRC(TX_Data) + '\r';
 
// qDebug(TX_Data.toLatin1().data());
 
if (Resend)
{
LastSend = TX_Data;
TickerEvent[0] = true;
}
Temp = QByteArray(TX_Data.toUtf8());
}
else
{
// qDebug("Send Raw..");
for (unsigned int a = 0; a < Length; a++)
{
Temp[a] = Data[a];
// qDebug(QString("%1").arg(Temp[a]).toLatin1().data());
}
}
 
serialPort->sendData(Temp);
 
if (cb_ShowSend->isChecked() && (CMD != '#'))
{
te_RX->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
te_RX->insertHtml("<span style='color:#8b0000;'>" + TX_Data + "<br /></span>");
}
}
}
 
 
// Programm beenden
///////////////////
 
MKTool::~MKTool()
{
// qDebug(" Programm Ende ..!! ");
if (serialPort->isOpen())
if (Conn->isOpen())
{
serialPort->close();
Conn->Close();
}
 
set_Preferences();