diff --git a/commhandler.cpp b/commhandler.cpp
index a27942c..a86ac65 100644
--- a/commhandler.cpp
+++ b/commhandler.cpp
@@ -18,6 +18,10 @@ commHandler::commHandler()
setupComm(); // basic parameters
openPort();
+ qDebug() << "Serial buffer size: " << port->readBufferSize();
+ //port->setReadBufferSize(1024); // manually. 256 never saw any return from the radio. why...
+ //qDebug() << "Serial buffer size: " << port->readBufferSize();
+
connect(port, SIGNAL(readyRead()), this, SLOT(receiveDataIn()));
}
@@ -60,10 +64,57 @@ void commHandler::receiveDataIn()
// connected to comm port data signal
// inPortData.append(port->readAll());
+ // OLD: inPortData = port->readAll();
+
+ // new code:
+ port->startTransaction();
inPortData = port->readAll();
+ if(inPortData.startsWith("\xFE\xFE"))
+ {
+ if(inPortData.endsWith("\xFD"))
+ {
+ // good!
+ port->commitTransaction();
+ emit haveDataFromPort(inPortData);
+ // PRoblem: We often get several chunks together this way
+ // if we can split and individually send them that would be better.
+ // could emit several at each FE....FD segment.
+ // should probbly make the buffer smaller to reduce this
+ if(rolledBack)
+ {
+ qDebug() << "Rolled back and was successfull. Length: " << inPortData.length();
+ //printHex(inPortData, false, true);
+ rolledBack = false;
+ }
+ } else {
+ // did not receive the entire thing so roll back:
+ qDebug() << "Rolling back transaction. End not detected. Lenth: " << inPortData.length();
+ //printHex(inPortData, false, true);
+ port->rollbackTransaction();
+ rolledBack = true;
+ }
+ } else {
+ port->commitTransaction();
+ qDebug() << "Warning: received data with invalid start. Dropping data.";
+ qDebug() << "THIS SHOULD ONLY HAPPEN ONCE!!";
+ // THIS SHOULD ONLY HAPPEN ONCE!
+
+ //qDebug() << "Data start: 0x" << (char)inPortData[00] << (char)inPortData[01]; // danger
+ // unrecoverable. We did not receive the start and must
+ // have missed it earlier because we did not roll back to
+ // preserve the beginning.
+ //printHex(inPortData, false, true);
+
+ }
+
+
+
+ // Here is where we can be smart about this:
+ // port->startTransaction(); port->rollbackTransaction();
+ // port->commitTransaction();
// qDebug() << "Data: " << inPortData;
- emit haveDataFromPort(inPortData);
+ // OLD: emit haveDataFromPort(inPortData);
}
void commHandler::openPort()
@@ -100,3 +151,37 @@ void commHandler::debugThis()
emit haveDataFromPort(inPortData);
}
+
+
+void commHandler::printHex(const QByteArray &pdata, bool printVert, bool printHoriz)
+{
+ qDebug() << "---- Begin hex dump -----:";
+ QString sdata("DATA: ");
+ QString index("INDEX: ");
+ QStringList strings;
+
+ for(int i=0; i < pdata.length(); i++)
+ {
+ strings << QString("[%1]: %2").arg(i,8,10,QChar('0')).arg((unsigned char)pdata[i], 2, 16, QChar('0'));
+ sdata.append(QString("%1 ").arg((unsigned char)pdata[i], 2, 16, QChar('0')) );
+ index.append(QString("%1 ").arg(i, 2, 10, QChar('0')));
+ }
+
+ if(printVert)
+ {
+ for(int i=0; i < strings.length(); i++)
+ {
+ //sdata = QString(strings.at(i));
+ qDebug() << strings.at(i);
+ }
+ }
+
+ if(printHoriz)
+ {
+ qDebug() << index;
+ qDebug() << sdata;
+ }
+ qDebug() << "----- End hex dump -----";
+}
+
+
diff --git a/commhandler.h b/commhandler.h
index 3125783..c319690 100644
--- a/commhandler.h
+++ b/commhandler.h
@@ -50,10 +50,13 @@ private:
QSerialPort *port;
qint32 baudrate;
unsigned char stopbits;
+ bool rolledBack;
bool isConnected; // port opened
mutable QMutex mutex;
+ void printHex(const QByteArray &pdata, bool printVert, bool printHoriz);
+
};
#endif // COMMHANDLER_H
diff --git a/main.cpp b/main.cpp
index df26f3a..b20814f 100644
--- a/main.cpp
+++ b/main.cpp
@@ -7,6 +7,8 @@
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
+ //a.setStyle( "Fusion" );
+
wfmain w;
w.show();
diff --git a/qdarkstyle/rc/Hmovetoolbar.png b/qdarkstyle/rc/Hmovetoolbar.png
new file mode 100644
index 0000000..cead99e
Binary files /dev/null and b/qdarkstyle/rc/Hmovetoolbar.png differ
diff --git a/qdarkstyle/rc/Hsepartoolbar.png b/qdarkstyle/rc/Hsepartoolbar.png
new file mode 100644
index 0000000..7f183c8
Binary files /dev/null and b/qdarkstyle/rc/Hsepartoolbar.png differ
diff --git a/qdarkstyle/rc/Vmovetoolbar.png b/qdarkstyle/rc/Vmovetoolbar.png
new file mode 100644
index 0000000..512edce
Binary files /dev/null and b/qdarkstyle/rc/Vmovetoolbar.png differ
diff --git a/qdarkstyle/rc/Vsepartoolbar.png b/qdarkstyle/rc/Vsepartoolbar.png
new file mode 100644
index 0000000..d9dc156
Binary files /dev/null and b/qdarkstyle/rc/Vsepartoolbar.png differ
diff --git a/qdarkstyle/rc/branch_closed-on.png b/qdarkstyle/rc/branch_closed-on.png
new file mode 100644
index 0000000..d081e9b
Binary files /dev/null and b/qdarkstyle/rc/branch_closed-on.png differ
diff --git a/qdarkstyle/rc/branch_closed.png b/qdarkstyle/rc/branch_closed.png
new file mode 100644
index 0000000..d652159
Binary files /dev/null and b/qdarkstyle/rc/branch_closed.png differ
diff --git a/qdarkstyle/rc/branch_open-on.png b/qdarkstyle/rc/branch_open-on.png
new file mode 100644
index 0000000..ec372b2
Binary files /dev/null and b/qdarkstyle/rc/branch_open-on.png differ
diff --git a/qdarkstyle/rc/branch_open.png b/qdarkstyle/rc/branch_open.png
new file mode 100644
index 0000000..66f8e1a
Binary files /dev/null and b/qdarkstyle/rc/branch_open.png differ
diff --git a/qdarkstyle/rc/checkbox_checked.png b/qdarkstyle/rc/checkbox_checked.png
new file mode 100644
index 0000000..830cfee
Binary files /dev/null and b/qdarkstyle/rc/checkbox_checked.png differ
diff --git a/qdarkstyle/rc/checkbox_checked_disabled.png b/qdarkstyle/rc/checkbox_checked_disabled.png
new file mode 100644
index 0000000..cb63cc2
Binary files /dev/null and b/qdarkstyle/rc/checkbox_checked_disabled.png differ
diff --git a/qdarkstyle/rc/checkbox_checked_focus.png b/qdarkstyle/rc/checkbox_checked_focus.png
new file mode 100644
index 0000000..671be27
Binary files /dev/null and b/qdarkstyle/rc/checkbox_checked_focus.png differ
diff --git a/qdarkstyle/rc/checkbox_indeterminate.png b/qdarkstyle/rc/checkbox_indeterminate.png
new file mode 100644
index 0000000..41024f7
Binary files /dev/null and b/qdarkstyle/rc/checkbox_indeterminate.png differ
diff --git a/qdarkstyle/rc/checkbox_indeterminate_focus.png b/qdarkstyle/rc/checkbox_indeterminate_focus.png
new file mode 100644
index 0000000..415f9b6
Binary files /dev/null and b/qdarkstyle/rc/checkbox_indeterminate_focus.png differ
diff --git a/qdarkstyle/rc/checkbox_unchecked.png b/qdarkstyle/rc/checkbox_unchecked.png
new file mode 100644
index 0000000..2159aca
Binary files /dev/null and b/qdarkstyle/rc/checkbox_unchecked.png differ
diff --git a/qdarkstyle/rc/checkbox_unchecked_disabled.png b/qdarkstyle/rc/checkbox_unchecked_disabled.png
new file mode 100644
index 0000000..ade721e
Binary files /dev/null and b/qdarkstyle/rc/checkbox_unchecked_disabled.png differ
diff --git a/qdarkstyle/rc/checkbox_unchecked_focus.png b/qdarkstyle/rc/checkbox_unchecked_focus.png
new file mode 100644
index 0000000..e4258cc
Binary files /dev/null and b/qdarkstyle/rc/checkbox_unchecked_focus.png differ
diff --git a/qdarkstyle/rc/close-hover.png b/qdarkstyle/rc/close-hover.png
new file mode 100644
index 0000000..657943a
Binary files /dev/null and b/qdarkstyle/rc/close-hover.png differ
diff --git a/qdarkstyle/rc/close-pressed.png b/qdarkstyle/rc/close-pressed.png
new file mode 100644
index 0000000..937d005
Binary files /dev/null and b/qdarkstyle/rc/close-pressed.png differ
diff --git a/qdarkstyle/rc/close.png b/qdarkstyle/rc/close.png
new file mode 100644
index 0000000..bc0f576
Binary files /dev/null and b/qdarkstyle/rc/close.png differ
diff --git a/qdarkstyle/rc/down_arrow.png b/qdarkstyle/rc/down_arrow.png
new file mode 100644
index 0000000..e271f7f
Binary files /dev/null and b/qdarkstyle/rc/down_arrow.png differ
diff --git a/qdarkstyle/rc/down_arrow_disabled.png b/qdarkstyle/rc/down_arrow_disabled.png
new file mode 100644
index 0000000..5805d98
Binary files /dev/null and b/qdarkstyle/rc/down_arrow_disabled.png differ
diff --git a/qdarkstyle/rc/left_arrow.png b/qdarkstyle/rc/left_arrow.png
new file mode 100644
index 0000000..f808d2d
Binary files /dev/null and b/qdarkstyle/rc/left_arrow.png differ
diff --git a/qdarkstyle/rc/left_arrow_disabled.png b/qdarkstyle/rc/left_arrow_disabled.png
new file mode 100644
index 0000000..f5b9af8
Binary files /dev/null and b/qdarkstyle/rc/left_arrow_disabled.png differ
diff --git a/qdarkstyle/rc/radio_checked.png b/qdarkstyle/rc/radio_checked.png
new file mode 100644
index 0000000..235e6b0
Binary files /dev/null and b/qdarkstyle/rc/radio_checked.png differ
diff --git a/qdarkstyle/rc/radio_checked_disabled.png b/qdarkstyle/rc/radio_checked_disabled.png
new file mode 100644
index 0000000..bf0051e
Binary files /dev/null and b/qdarkstyle/rc/radio_checked_disabled.png differ
diff --git a/qdarkstyle/rc/radio_checked_focus.png b/qdarkstyle/rc/radio_checked_focus.png
new file mode 100644
index 0000000..700c6b5
Binary files /dev/null and b/qdarkstyle/rc/radio_checked_focus.png differ
diff --git a/qdarkstyle/rc/radio_unchecked.png b/qdarkstyle/rc/radio_unchecked.png
new file mode 100644
index 0000000..9a4def6
Binary files /dev/null and b/qdarkstyle/rc/radio_unchecked.png differ
diff --git a/qdarkstyle/rc/radio_unchecked_disabled.png b/qdarkstyle/rc/radio_unchecked_disabled.png
new file mode 100644
index 0000000..6ece890
Binary files /dev/null and b/qdarkstyle/rc/radio_unchecked_disabled.png differ
diff --git a/qdarkstyle/rc/radio_unchecked_focus.png b/qdarkstyle/rc/radio_unchecked_focus.png
new file mode 100644
index 0000000..564e022
Binary files /dev/null and b/qdarkstyle/rc/radio_unchecked_focus.png differ
diff --git a/qdarkstyle/rc/right_arrow.png b/qdarkstyle/rc/right_arrow.png
new file mode 100644
index 0000000..9b0a4e6
Binary files /dev/null and b/qdarkstyle/rc/right_arrow.png differ
diff --git a/qdarkstyle/rc/right_arrow_disabled.png b/qdarkstyle/rc/right_arrow_disabled.png
new file mode 100644
index 0000000..5c0bee4
Binary files /dev/null and b/qdarkstyle/rc/right_arrow_disabled.png differ
diff --git a/qdarkstyle/rc/sizegrip.png b/qdarkstyle/rc/sizegrip.png
new file mode 100644
index 0000000..350583a
Binary files /dev/null and b/qdarkstyle/rc/sizegrip.png differ
diff --git a/qdarkstyle/rc/stylesheet-branch-end.png b/qdarkstyle/rc/stylesheet-branch-end.png
new file mode 100644
index 0000000..cb5d3b5
Binary files /dev/null and b/qdarkstyle/rc/stylesheet-branch-end.png differ
diff --git a/qdarkstyle/rc/stylesheet-branch-more.png b/qdarkstyle/rc/stylesheet-branch-more.png
new file mode 100644
index 0000000..6271140
Binary files /dev/null and b/qdarkstyle/rc/stylesheet-branch-more.png differ
diff --git a/qdarkstyle/rc/stylesheet-vline.png b/qdarkstyle/rc/stylesheet-vline.png
new file mode 100644
index 0000000..87536cc
Binary files /dev/null and b/qdarkstyle/rc/stylesheet-vline.png differ
diff --git a/qdarkstyle/rc/transparent.png b/qdarkstyle/rc/transparent.png
new file mode 100644
index 0000000..483df25
Binary files /dev/null and b/qdarkstyle/rc/transparent.png differ
diff --git a/qdarkstyle/rc/undock.png b/qdarkstyle/rc/undock.png
new file mode 100644
index 0000000..88691d7
Binary files /dev/null and b/qdarkstyle/rc/undock.png differ
diff --git a/qdarkstyle/rc/up_arrow.png b/qdarkstyle/rc/up_arrow.png
new file mode 100644
index 0000000..abcc724
Binary files /dev/null and b/qdarkstyle/rc/up_arrow.png differ
diff --git a/qdarkstyle/rc/up_arrow_disabled.png b/qdarkstyle/rc/up_arrow_disabled.png
new file mode 100644
index 0000000..b9c8e3b
Binary files /dev/null and b/qdarkstyle/rc/up_arrow_disabled.png differ
diff --git a/qdarkstyle/style.qrc b/qdarkstyle/style.qrc
new file mode 100644
index 0000000..ac14bc5
--- /dev/null
+++ b/qdarkstyle/style.qrc
@@ -0,0 +1,46 @@
+
+
+ rc/up_arrow_disabled.png
+ rc/Hmovetoolbar.png
+ rc/stylesheet-branch-end.png
+ rc/branch_closed-on.png
+ rc/stylesheet-vline.png
+ rc/branch_closed.png
+ rc/branch_open-on.png
+ rc/transparent.png
+ rc/right_arrow_disabled.png
+ rc/sizegrip.png
+ rc/close.png
+ rc/close-hover.png
+ rc/close-pressed.png
+ rc/down_arrow.png
+ rc/Vmovetoolbar.png
+ rc/left_arrow.png
+ rc/stylesheet-branch-more.png
+ rc/up_arrow.png
+ rc/right_arrow.png
+ rc/left_arrow_disabled.png
+ rc/Hsepartoolbar.png
+ rc/branch_open.png
+ rc/Vsepartoolbar.png
+ rc/down_arrow_disabled.png
+ rc/undock.png
+ rc/checkbox_checked_disabled.png
+ rc/checkbox_checked_focus.png
+ rc/checkbox_checked.png
+ rc/checkbox_indeterminate.png
+ rc/checkbox_indeterminate_focus.png
+ rc/checkbox_unchecked_disabled.png
+ rc/checkbox_unchecked_focus.png
+ rc/checkbox_unchecked.png
+ rc/radio_checked_disabled.png
+ rc/radio_checked_focus.png
+ rc/radio_checked.png
+ rc/radio_unchecked_disabled.png
+ rc/radio_unchecked_focus.png
+ rc/radio_unchecked.png
+
+
+ style.qss
+
+
diff --git a/qdarkstyle/style.qss b/qdarkstyle/style.qss
new file mode 100644
index 0000000..399c38d
--- /dev/null
+++ b/qdarkstyle/style.qss
@@ -0,0 +1,1235 @@
+QToolTip {
+ border: 1px solid #76797C;
+ background-color: #5A7566;
+ color: white;
+ padding: 0px; /*remove padding, for fix combobox tooltip.*/
+ opacity: 200;
+}
+
+QWidget {
+ color: #eff0f1;
+ background-color: #31363b;
+ selection-background-color: #3daee9;
+ selection-color: #eff0f1;
+ background-clip: border;
+ border-image: none;
+ border: 0px transparent black;
+ outline: 0;
+}
+
+QWidget:item:hover {
+ background-color: #18465d;
+ color: #eff0f1;
+}
+
+QWidget:item:selected {
+ background-color: #18465d;
+}
+
+QCheckBox {
+ spacing: 5px;
+ outline: none;
+ color: #eff0f1;
+ margin-bottom: 2px;
+}
+
+QCheckBox:disabled {
+ color: #76797C;
+}
+
+QCheckBox::indicator,
+QGroupBox::indicator {
+ width: 18px;
+ height: 18px;
+}
+
+QGroupBox::indicator {
+ margin-left: 2px;
+}
+
+QCheckBox::indicator:unchecked,
+QGroupBox::indicator:unchecked {
+ image: url(:/qss_icons/rc/checkbox_unchecked.png);
+}
+
+QCheckBox::indicator:unchecked:hover,
+QCheckBox::indicator:unchecked:focus,
+QCheckBox::indicator:unchecked:pressed,
+QGroupBox::indicator:unchecked:hover,
+QGroupBox::indicator:unchecked:focus,
+QGroupBox::indicator:unchecked:pressed {
+ border: none;
+ image: url(:/qss_icons/rc/checkbox_unchecked_focus.png);
+}
+
+QCheckBox::indicator:checked,
+QGroupBox::indicator:checked {
+ image: url(:/qss_icons/rc/checkbox_checked.png);
+}
+
+QCheckBox::indicator:checked:hover,
+QCheckBox::indicator:checked:focus,
+QCheckBox::indicator:checked:pressed,
+QGroupBox::indicator:checked:hover,
+QGroupBox::indicator:checked:focus,
+QGroupBox::indicator:checked:pressed {
+ border: none;
+ image: url(:/qss_icons/rc/checkbox_checked_focus.png);
+}
+
+QCheckBox::indicator:indeterminate {
+ image: url(:/qss_icons/rc/checkbox_indeterminate.png);
+}
+
+QCheckBox::indicator:indeterminate:focus,
+QCheckBox::indicator:indeterminate:hover,
+QCheckBox::indicator:indeterminate:pressed {
+ image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png);
+}
+
+QCheckBox::indicator:checked:disabled,
+QGroupBox::indicator:checked:disabled {
+ image: url(:/qss_icons/rc/checkbox_checked_disabled.png);
+}
+
+QCheckBox::indicator:unchecked:disabled,
+QGroupBox::indicator:unchecked:disabled {
+ image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png);
+}
+
+QRadioButton {
+ spacing: 5px;
+ outline: none;
+ color: #eff0f1;
+ margin-bottom: 2px;
+}
+
+QRadioButton:disabled {
+ color: #76797C;
+}
+
+QRadioButton::indicator {
+ width: 21px;
+ height: 21px;
+}
+
+QRadioButton::indicator:unchecked {
+ image: url(:/qss_icons/rc/radio_unchecked.png);
+}
+
+QRadioButton::indicator:unchecked:hover,
+QRadioButton::indicator:unchecked:focus,
+QRadioButton::indicator:unchecked:pressed {
+ border: none;
+ outline: none;
+ image: url(:/qss_icons/rc/radio_unchecked_focus.png);
+}
+
+QRadioButton::indicator:checked {
+ border: none;
+ outline: none;
+ image: url(:/qss_icons/rc/radio_checked.png);
+}
+
+QRadioButton::indicator:checked:hover,
+QRadioButton::indicator:checked:focus,
+QRadioButton::indicator:checked:pressed {
+ border: none;
+ outline: none;
+ image: url(:/qss_icons/rc/radio_checked_focus.png);
+}
+
+QRadioButton::indicator:checked:disabled {
+ outline: none;
+ image: url(:/qss_icons/rc/radio_checked_disabled.png);
+}
+
+QRadioButton::indicator:unchecked:disabled {
+ image: url(:/qss_icons/rc/radio_unchecked_disabled.png);
+}
+
+QMenuBar {
+ background-color: #31363b;
+ color: #eff0f1;
+}
+
+QMenuBar::item {
+ background: transparent;
+}
+
+QMenuBar::item:selected {
+ background: transparent;
+ border: 1px solid #76797C;
+}
+
+QMenuBar::item:pressed {
+ border: 1px solid #76797C;
+ background-color: #3daee9;
+ color: #eff0f1;
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+
+QMenu {
+ border: 1px solid #76797C;
+ color: #eff0f1;
+ margin: 2px;
+}
+
+QMenu::icon {
+ margin: 5px;
+}
+
+QMenu::item {
+ padding: 5px 30px 5px 30px;
+ border: 1px solid transparent;
+ /* reserve space for selection border */
+}
+
+QMenu::item:selected {
+ color: #eff0f1;
+}
+
+QMenu::separator {
+ height: 2px;
+ background: lightblue;
+ margin-left: 10px;
+ margin-right: 5px;
+}
+
+QMenu::indicator {
+ width: 18px;
+ height: 18px;
+}
+
+
+/* non-exclusive indicator = check box style indicator
+ (see QActionGroup::setExclusive) */
+
+QMenu::indicator:non-exclusive:unchecked {
+ image: url(:/qss_icons/rc/checkbox_unchecked.png);
+}
+
+QMenu::indicator:non-exclusive:unchecked:selected {
+ image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png);
+}
+
+QMenu::indicator:non-exclusive:checked {
+ image: url(:/qss_icons/rc/checkbox_checked.png);
+}
+
+QMenu::indicator:non-exclusive:checked:selected {
+ image: url(:/qss_icons/rc/checkbox_checked_disabled.png);
+}
+
+
+/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */
+
+QMenu::indicator:exclusive:unchecked {
+ image: url(:/qss_icons/rc/radio_unchecked.png);
+}
+
+QMenu::indicator:exclusive:unchecked:selected {
+ image: url(:/qss_icons/rc/radio_unchecked_disabled.png);
+}
+
+QMenu::indicator:exclusive:checked {
+ image: url(:/qss_icons/rc/radio_checked.png);
+}
+
+QMenu::indicator:exclusive:checked:selected {
+ image: url(:/qss_icons/rc/radio_checked_disabled.png);
+}
+
+QMenu::right-arrow {
+ margin: 5px;
+ image: url(:/qss_icons/rc/right_arrow.png)
+}
+
+QWidget:disabled {
+ color: #454545;
+ background-color: #31363b;
+}
+
+QAbstractItemView {
+ alternate-background-color: #31363b;
+ color: #eff0f1;
+ border: 1px solid #3A3939;
+ border-radius: 2px;
+}
+
+QWidget:focus,
+QMenuBar:focus {
+ border: 1px solid #3daee9;
+}
+
+QTabWidget:focus,
+QCheckBox:focus,
+QRadioButton:focus,
+QSlider:focus {
+ border: none;
+}
+
+QLineEdit {
+ background-color: #232629;
+ padding: 5px;
+ border-style: solid;
+ border: 1px solid #76797C;
+ border-radius: 2px;
+ color: #eff0f1;
+}
+
+QAbstractItemView QLineEdit {
+ padding: 0;
+}
+
+QGroupBox {
+ border: 1px solid #76797C;
+ border-radius: 2px;
+ margin-top: 20px;
+}
+
+QGroupBox::title {
+ subcontrol-origin: margin;
+ subcontrol-position: top center;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 10px;
+}
+
+QAbstractScrollArea {
+ border-radius: 2px;
+ border: 1px solid #76797C;
+ background-color: transparent;
+}
+
+QScrollBar:horizontal {
+ height: 15px;
+ margin: 3px 15px 3px 15px;
+ border: 1px transparent #2A2929;
+ border-radius: 4px;
+ background-color: #2A2929;
+}
+
+QScrollBar::handle:horizontal {
+ background-color: #605F5F;
+ min-width: 5px;
+ border-radius: 4px;
+}
+
+QScrollBar::add-line:horizontal {
+ margin: 0px 3px 0px 3px;
+ border-image: url(:/qss_icons/rc/right_arrow_disabled.png);
+ width: 10px;
+ height: 10px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:horizontal {
+ margin: 0px 3px 0px 3px;
+ border-image: url(:/qss_icons/rc/left_arrow_disabled.png);
+ height: 10px;
+ width: 10px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:horizontal:hover,
+QScrollBar::add-line:horizontal:on {
+ border-image: url(:/qss_icons/rc/right_arrow.png);
+ height: 10px;
+ width: 10px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:horizontal:hover,
+QScrollBar::sub-line:horizontal:on {
+ border-image: url(:/qss_icons/rc/left_arrow.png);
+ height: 10px;
+ width: 10px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::up-arrow:horizontal,
+QScrollBar::down-arrow:horizontal {
+ background: none;
+}
+
+QScrollBar::add-page:horizontal,
+QScrollBar::sub-page:horizontal {
+ background: none;
+}
+
+QScrollBar:vertical {
+ background-color: #2A2929;
+ width: 15px;
+ margin: 15px 3px 15px 3px;
+ border: 1px transparent #2A2929;
+ border-radius: 4px;
+}
+
+QScrollBar::handle:vertical {
+ background-color: #605F5F;
+ min-height: 5px;
+ border-radius: 4px;
+}
+
+QScrollBar::sub-line:vertical {
+ margin: 3px 0px 3px 0px;
+ border-image: url(:/qss_icons/rc/up_arrow_disabled.png);
+ height: 10px;
+ width: 10px;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:vertical {
+ margin: 3px 0px 3px 0px;
+ border-image: url(:/qss_icons/rc/down_arrow_disabled.png);
+ height: 10px;
+ width: 10px;
+ subcontrol-position: bottom;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:vertical:hover,
+QScrollBar::sub-line:vertical:on {
+ border-image: url(:/qss_icons/rc/up_arrow.png);
+ height: 10px;
+ width: 10px;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:vertical:hover,
+QScrollBar::add-line:vertical:on {
+ border-image: url(:/qss_icons/rc/down_arrow.png);
+ height: 10px;
+ width: 10px;
+ subcontrol-position: bottom;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::up-arrow:vertical,
+QScrollBar::down-arrow:vertical {
+ background: none;
+}
+
+QScrollBar::add-page:vertical,
+QScrollBar::sub-page:vertical {
+ background: none;
+}
+
+QTextEdit {
+ background-color: #232629;
+ color: #eff0f1;
+ border: 1px solid #76797C;
+}
+
+QPlainTextEdit {
+ background-color: #232629;
+ ;
+ color: #eff0f1;
+ border-radius: 2px;
+ border: 1px solid #76797C;
+}
+
+QHeaderView::section {
+ background-color: #76797C;
+ color: #eff0f1;
+ padding: 5px;
+ border: 1px solid #76797C;
+}
+
+QSizeGrip {
+ image: url(:/qss_icons/rc/sizegrip.png);
+ width: 12px;
+ height: 12px;
+}
+
+QMainWindow::separator {
+ background-color: #31363b;
+ color: white;
+ padding-left: 4px;
+ spacing: 2px;
+ border: 1px dashed #76797C;
+}
+
+QMainWindow::separator:hover {
+ background-color: #787876;
+ color: white;
+ padding-left: 4px;
+ border: 1px solid #76797C;
+ spacing: 2px;
+}
+
+QMenu::separator {
+ height: 1px;
+ background-color: #76797C;
+ color: white;
+ padding-left: 4px;
+ margin-left: 10px;
+ margin-right: 5px;
+}
+
+QFrame {
+ border-radius: 2px;
+ border: 1px solid #76797C;
+}
+
+QFrame[frameShape="0"] {
+ border-radius: 2px;
+ border: 1px transparent #76797C;
+}
+
+QStackedWidget {
+ border: 1px transparent black;
+}
+
+QToolBar {
+ border: 1px transparent #393838;
+ background: 1px solid #31363b;
+ font-weight: bold;
+}
+
+QToolBar::handle:horizontal {
+ image: url(:/qss_icons/rc/Hmovetoolbar.png);
+}
+
+QToolBar::handle:vertical {
+ image: url(:/qss_icons/rc/Vmovetoolbar.png);
+}
+
+QToolBar::separator:horizontal {
+ image: url(:/qss_icons/rc/Hsepartoolbar.png);
+}
+
+QToolBar::separator:vertical {
+ image: url(:/qss_icons/rc/Vsepartoolbar.png);
+}
+
+QToolButton#qt_toolbar_ext_button {
+ background: #58595a
+}
+
+QPushButton {
+ color: #eff0f1;
+ background-color: #31363b;
+ border-width: 1px;
+ border-color: #76797C;
+ border-style: solid;
+ padding: 5px;
+ border-radius: 2px;
+ outline: none;
+}
+
+QPushButton:disabled {
+ background-color: #31363b;
+ border-width: 1px;
+ border-color: #454545;
+ border-style: solid;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ border-radius: 2px;
+ color: #454545;
+}
+
+QPushButton:focus {
+ background-color: #3daee9;
+ color: white;
+}
+
+QPushButton:pressed {
+ background-color: #3daee9;
+ padding-top: -15px;
+ padding-bottom: -17px;
+}
+
+QComboBox {
+ selection-background-color: #3daee9;
+ border-style: solid;
+ border: 1px solid #76797C;
+ border-radius: 2px;
+ padding: 5px;
+ min-width: 75px;
+}
+
+QPushButton:checked {
+ background-color: #76797C;
+ border-color: #6A6969;
+}
+
+QComboBox:hover,
+QPushButton:hover,
+QAbstractSpinBox:hover,
+QLineEdit:hover,
+QTextEdit:hover,
+QPlainTextEdit:hover,
+QAbstractView:hover,
+QTreeView:hover {
+ border: 1px solid #3daee9;
+ color: #eff0f1;
+}
+
+QComboBox:on {
+ padding-top: 3px;
+ padding-left: 4px;
+ selection-background-color: #4a4a4a;
+}
+
+QComboBox QAbstractItemView {
+ background-color: #232629;
+ border-radius: 2px;
+ border: 1px solid #76797C;
+ selection-background-color: #18465d;
+}
+
+QComboBox::drop-down {
+ subcontrol-origin: padding;
+ subcontrol-position: top right;
+ width: 15px;
+ border-left-width: 0px;
+ border-left-color: darkgray;
+ border-left-style: solid;
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+QComboBox::down-arrow {
+ image: url(:/qss_icons/rc/down_arrow_disabled.png);
+}
+
+QComboBox::down-arrow:on,
+QComboBox::down-arrow:hover,
+QComboBox::down-arrow:focus {
+ image: url(:/qss_icons/rc/down_arrow.png);
+}
+
+QAbstractSpinBox {
+ padding: 5px;
+ border: 1px solid #76797C;
+ background-color: #232629;
+ color: #eff0f1;
+ border-radius: 2px;
+ min-width: 75px;
+}
+
+QAbstractSpinBox:up-button {
+ background-color: transparent;
+ subcontrol-origin: border;
+ subcontrol-position: center right;
+}
+
+QAbstractSpinBox:down-button {
+ background-color: transparent;
+ subcontrol-origin: border;
+ subcontrol-position: center left;
+}
+
+QAbstractSpinBox::up-arrow,
+QAbstractSpinBox::up-arrow:disabled,
+QAbstractSpinBox::up-arrow:off {
+ image: url(:/qss_icons/rc/up_arrow_disabled.png);
+ width: 10px;
+ height: 10px;
+}
+
+QAbstractSpinBox::up-arrow:hover {
+ image: url(:/qss_icons/rc/up_arrow.png);
+}
+
+QAbstractSpinBox::down-arrow,
+QAbstractSpinBox::down-arrow:disabled,
+QAbstractSpinBox::down-arrow:off {
+ image: url(:/qss_icons/rc/down_arrow_disabled.png);
+ width: 10px;
+ height: 10px;
+}
+
+QAbstractSpinBox::down-arrow:hover {
+ image: url(:/qss_icons/rc/down_arrow.png);
+}
+
+QLabel {
+ border: 0px solid black;
+}
+
+QTabWidget {
+ border: 0px transparent black;
+}
+
+QTabWidget::pane {
+ border: 1px solid #76797C;
+ padding: 5px;
+ margin: 0px;
+}
+
+QTabWidget::tab-bar {
+ /* left: 5px; move to the right by 5px */
+}
+
+QTabBar {
+ qproperty-drawBase: 0;
+ border-radius: 3px;
+}
+
+QTabBar:focus {
+ border: 0px transparent black;
+}
+
+QTabBar::close-button {
+ image: url(:/qss_icons/rc/close.png);
+ background: transparent;
+}
+
+QTabBar::close-button:hover {
+ image: url(:/qss_icons/rc/close-hover.png);
+ background: transparent;
+}
+
+QTabBar::close-button:pressed {
+ image: url(:/qss_icons/rc/close-pressed.png);
+ background: transparent;
+}
+
+
+/* TOP TABS */
+
+QTabBar::tab:top {
+ color: #eff0f1;
+ border: 1px solid #76797C;
+ border-bottom: 1px transparent black;
+ background-color: #31363b;
+ padding: 5px;
+ min-width: 50px;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+
+QTabBar::tab:top:selected {
+ color: #eff0f1;
+ background-color: #54575B;
+ border: 1px solid #76797C;
+ border-bottom: 2px solid #3daee9;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+
+QTabBar::tab:top:!selected:hover {
+ background-color: #3daee9;
+}
+
+
+/* BOTTOM TABS */
+
+QTabBar::tab:bottom {
+ color: #eff0f1;
+ border: 1px solid #76797C;
+ border-top: 1px transparent black;
+ background-color: #31363b;
+ padding: 5px;
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+ min-width: 50px;
+}
+
+QTabBar::tab:bottom:selected {
+ color: #eff0f1;
+ background-color: #54575B;
+ border: 1px solid #76797C;
+ border-top: 2px solid #3daee9;
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+QTabBar::tab:bottom:!selected:hover {
+ background-color: #3daee9;
+}
+
+
+/* LEFT TABS */
+
+QTabBar::tab:left {
+ color: #eff0f1;
+ border: 1px solid #76797C;
+ border-left: 1px transparent black;
+ background-color: #31363b;
+ padding: 5px;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ min-height: 50px;
+}
+
+QTabBar::tab:left:selected {
+ color: #eff0f1;
+ background-color: #54575B;
+ border: 1px solid #76797C;
+ border-left: 2px solid #3daee9;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+QTabBar::tab:left:!selected:hover {
+ background-color: #3daee9;
+}
+
+
+/* RIGHT TABS */
+
+QTabBar::tab:right {
+ color: #eff0f1;
+ border: 1px solid #76797C;
+ border-right: 1px transparent black;
+ background-color: #31363b;
+ padding: 5px;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ min-height: 50px;
+}
+
+QTabBar::tab:right:selected {
+ color: #eff0f1;
+ background-color: #54575B;
+ border: 1px solid #76797C;
+ border-right: 2px solid #3daee9;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+QTabBar::tab:right:!selected:hover {
+ background-color: #3daee9;
+}
+
+QTabBar QToolButton::right-arrow:enabled {
+ image: url(:/qss_icons/rc/right_arrow.png);
+}
+
+QTabBar QToolButton::left-arrow:enabled {
+ image: url(:/qss_icons/rc/left_arrow.png);
+}
+
+QTabBar QToolButton::right-arrow:disabled {
+ image: url(:/qss_icons/rc/right_arrow_disabled.png);
+}
+
+QTabBar QToolButton::left-arrow:disabled {
+ image: url(:/qss_icons/rc/left_arrow_disabled.png);
+}
+
+QDockWidget {
+ background: #31363b;
+ border: 1px solid #403F3F;
+ titlebar-close-icon: url(:/qss_icons/rc/close.png);
+ titlebar-normal-icon: url(:/qss_icons/rc/undock.png);
+}
+
+QDockWidget::close-button,
+QDockWidget::float-button {
+ border: 1px solid transparent;
+ border-radius: 2px;
+ background: transparent;
+}
+
+QDockWidget::close-button:hover,
+QDockWidget::float-button:hover {
+ background: rgba(255, 255, 255, 10);
+}
+
+QDockWidget::close-button:pressed,
+QDockWidget::float-button:pressed {
+ padding: 1px -1px -1px 1px;
+ background: rgba(255, 255, 255, 10);
+}
+
+QTreeView,
+QListView {
+ border: 1px solid #76797C;
+ background-color: #232629;
+}
+
+QTreeView:branch:selected,
+QTreeView:branch:hover {
+ background: url(:/qss_icons/rc/transparent.png);
+}
+
+QTreeView::branch:has-siblings:!adjoins-item {
+ border-image: url(:/qss_icons/rc/transparent.png);
+}
+
+QTreeView::branch:has-siblings:adjoins-item {
+ border-image: url(:/qss_icons/rc/transparent.png);
+}
+
+QTreeView::branch:!has-children:!has-siblings:adjoins-item {
+ border-image: url(:/qss_icons/rc/transparent.png);
+}
+
+QTreeView::branch:has-children:!has-siblings:closed,
+QTreeView::branch:closed:has-children:has-siblings {
+ image: url(:/qss_icons/rc/branch_closed.png);
+}
+
+QTreeView::branch:open:has-children:!has-siblings,
+QTreeView::branch:open:has-children:has-siblings {
+ image: url(:/qss_icons/rc/branch_open.png);
+}
+
+QTreeView::branch:has-children:!has-siblings:closed:hover,
+QTreeView::branch:closed:has-children:has-siblings:hover {
+ image: url(:/qss_icons/rc/branch_closed-on.png);
+}
+
+QTreeView::branch:open:has-children:!has-siblings:hover,
+QTreeView::branch:open:has-children:has-siblings:hover {
+ image: url(:/qss_icons/rc/branch_open-on.png);
+}
+
+QListView::item:!selected:hover,
+QTreeView::item:!selected:hover {
+ background: #18465d;
+ outline: 0;
+ color: #eff0f1
+}
+
+QListView::item:selected:hover,
+QTreeView::item:selected:hover {
+ background: #287399;
+ color: #eff0f1;
+}
+
+QTreeView::indicator:checked,
+QListView::indicator:checked {
+ image: url(:/qss_icons/rc/checkbox_checked.png);
+}
+
+QTreeView::indicator:unchecked,
+QListView::indicator:unchecked {
+ image: url(:/qss_icons/rc/checkbox_unchecked.png);
+}
+
+QTreeView::indicator:indeterminate,
+QListView::indicator:indeterminate {
+ image: url(:/qss_icons/rc/checkbox_indeterminate.png);
+}
+
+QTreeView::indicator:checked:hover,
+QTreeView::indicator:checked:focus,
+QTreeView::indicator:checked:pressed,
+QListView::indicator:checked:hover,
+QListView::indicator:checked:focus,
+QListView::indicator:checked:pressed {
+ image: url(:/qss_icons/rc/checkbox_checked_focus.png);
+}
+
+QTreeView::indicator:unchecked:hover,
+QTreeView::indicator:unchecked:focus,
+QTreeView::indicator:unchecked:pressed,
+QListView::indicator:unchecked:hover,
+QListView::indicator:unchecked:focus,
+QListView::indicator:unchecked:pressed {
+ image: url(:/qss_icons/rc/checkbox_unchecked_focus.png);
+}
+
+QTreeView::indicator:indeterminate:hover,
+QTreeView::indicator:indeterminate:focus,
+QTreeView::indicator:indeterminate:pressed,
+QListView::indicator:indeterminate:hover,
+QListView::indicator:indeterminate:focus,
+QListView::indicator:indeterminate:pressed {
+ image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png);
+}
+
+QSlider::groove:horizontal {
+ border: 1px solid #565a5e;
+ height: 4px;
+ background: #565a5e;
+ margin: 0px;
+ border-radius: 2px;
+}
+
+QSlider::handle:horizontal {
+ background: #232629;
+ border: 1px solid #565a5e;
+ width: 16px;
+ height: 16px;
+ margin: -8px 0;
+ border-radius: 9px;
+}
+
+QSlider::groove:vertical {
+ border: 1px solid #565a5e;
+ width: 4px;
+ background: #565a5e;
+ margin: 0px;
+ border-radius: 3px;
+}
+
+QSlider::handle:vertical {
+ background: #232629;
+ border: 1px solid #565a5e;
+ width: 16px;
+ height: 16px;
+ margin: 0 -8px;
+ border-radius: 9px;
+}
+
+QToolButton {
+ background-color: transparent;
+ border: 1px transparent #76797C;
+ border-radius: 2px;
+ margin: 3px;
+ padding: 5px;
+}
+
+QToolButton[popupMode="1"] {
+ /* only for MenuButtonPopup */
+ padding-right: 20px;
+ /* make way for the popup button */
+ border: 1px #76797C;
+ border-radius: 5px;
+}
+
+QToolButton[popupMode="2"] {
+ /* only for InstantPopup */
+ padding-right: 10px;
+ /* make way for the popup button */
+ border: 1px #76797C;
+}
+
+QToolButton:hover,
+QToolButton::menu-button:hover {
+ background-color: transparent;
+ border: 1px solid #3daee9;
+ padding: 5px;
+}
+
+QToolButton:checked,
+QToolButton:pressed,
+QToolButton::menu-button:pressed {
+ background-color: #3daee9;
+ border: 1px solid #3daee9;
+ padding: 5px;
+}
+
+
+/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */
+
+QToolButton::menu-indicator {
+ image: url(:/qss_icons/rc/down_arrow.png);
+ top: -7px;
+ left: -2px;
+ /* shift it a bit */
+}
+
+
+/* the subcontrols below are used only in the MenuButtonPopup mode */
+
+QToolButton::menu-button {
+ border: 1px transparent #76797C;
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+ /* 16px width + 4px for border = 20px allocated above */
+ width: 16px;
+ outline: none;
+}
+
+QToolButton::menu-arrow {
+ image: url(:/qss_icons/rc/down_arrow.png);
+}
+
+QToolButton::menu-arrow:open {
+ border: 1px solid #76797C;
+}
+
+QPushButton::menu-indicator {
+ subcontrol-origin: padding;
+ subcontrol-position: bottom right;
+ left: 8px;
+}
+
+QTableView {
+ border: 1px solid #76797C;
+ gridline-color: #31363b;
+ background-color: #232629;
+}
+
+QTableView,
+QHeaderView {
+ border-radius: 0px;
+}
+
+QTableView::item:pressed,
+QListView::item:pressed,
+QTreeView::item:pressed {
+ background: #18465d;
+ color: #eff0f1;
+}
+
+QTableView::item:selected:active,
+QTreeView::item:selected:active,
+QListView::item:selected:active {
+ background: #287399;
+ color: #eff0f1;
+}
+
+QHeaderView {
+ background-color: #31363b;
+ border: 1px transparent;
+ border-radius: 0px;
+ margin: 0px;
+ padding: 0px;
+}
+
+QHeaderView::section {
+ background-color: #31363b;
+ color: #eff0f1;
+ padding: 5px;
+ border: 1px solid #76797C;
+ border-radius: 0px;
+ text-align: center;
+}
+
+QHeaderView::section::vertical::first,
+QHeaderView::section::vertical::only-one {
+ border-top: 1px solid #76797C;
+}
+
+QHeaderView::section::vertical {
+ border-top: transparent;
+}
+
+QHeaderView::section::horizontal::first,
+QHeaderView::section::horizontal::only-one {
+ border-left: 1px solid #76797C;
+}
+
+QHeaderView::section::horizontal {
+ border-left: transparent;
+}
+
+QHeaderView::section:checked {
+ color: white;
+ background-color: #334e5e;
+}
+
+
+/* style the sort indicator */
+
+QHeaderView::down-arrow {
+ image: url(:/qss_icons/rc/down_arrow.png);
+}
+
+QHeaderView::up-arrow {
+ image: url(:/qss_icons/rc/up_arrow.png);
+}
+
+QTableCornerButton::section {
+ background-color: #31363b;
+ border: 1px transparent #76797C;
+ border-radius: 0px;
+}
+
+QToolBox {
+ padding: 5px;
+ border: 1px transparent black;
+}
+
+QToolBox::tab {
+ color: #eff0f1;
+ background-color: #31363b;
+ border: 1px solid #76797C;
+ border-bottom: 1px transparent #31363b;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+}
+
+QToolBox::tab:selected {
+ /* italicize selected tabs */
+ font: italic;
+ background-color: #31363b;
+ border-color: #3daee9;
+}
+
+QStatusBar::item {
+ border: 0px transparent dark;
+}
+
+QFrame[height="3"],
+QFrame[width="3"] {
+ background-color: #76797C;
+}
+
+QSplitter::handle {
+ border: 1px dashed #76797C;
+}
+
+QSplitter::handle:hover {
+ background-color: #787876;
+ border: 1px solid #76797C;
+}
+
+QSplitter::handle:horizontal {
+ width: 1px;
+}
+
+QSplitter::handle:vertical {
+ height: 1px;
+}
+
+QProgressBar {
+ border: 1px solid #76797C;
+ border-radius: 5px;
+ text-align: center;
+}
+
+QProgressBar::chunk {
+ background-color: #05B8CC;
+}
+
+QDateEdit {
+ selection-background-color: #3daee9;
+ border-style: solid;
+ border: 1px solid #3375A3;
+ border-radius: 2px;
+ padding: 1px;
+ min-width: 75px;
+}
+
+QDateEdit:on {
+ padding-top: 3px;
+ padding-left: 4px;
+ selection-background-color: #4a4a4a;
+}
+
+QDateEdit QAbstractItemView {
+ background-color: #232629;
+ border-radius: 2px;
+ border: 1px solid #3375A3;
+ selection-background-color: #3daee9;
+}
+
+QDateEdit::drop-down {
+ subcontrol-origin: padding;
+ subcontrol-position: top right;
+ width: 15px;
+ border-left-width: 0px;
+ border-left-color: darkgray;
+ border-left-style: solid;
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+QDateEdit::down-arrow {
+ image: url(:/qss_icons/rc/down_arrow_disabled.png);
+}
+
+QDateEdit::down-arrow:on,
+QDateEdit::down-arrow:hover,
+QDateEdit::down-arrow:focus {
+ image: url(:/qss_icons/rc/down_arrow.png);
+}
diff --git a/rigcommander.cpp b/rigcommander.cpp
index 910405b..5704acb 100644
--- a/rigcommander.cpp
+++ b/rigcommander.cpp
@@ -243,91 +243,126 @@ void rigCommander::handleNewData(const QByteArray &data)
parseData(data);
}
-void rigCommander::parseData(QByteArray data)
+void rigCommander::parseData(QByteArray dataInput)
{
+ // TODO: Clean this up.
+ // It finally works very nicely, needs to be streamlined.
+ //
- // Data echo'd back from the rig start with this:
- // fe fe 94 e0 ...... fd
+ int index = 0;
+ volatile int count = 0; // debug purposes
- // Data from the rig that is not an echo start with this:
- // fe fe e0 94 ...... fd (for example, a reply to a query)
-
- // Data from the rig that was not asked for is sent to controller 0x00:
- // fe fe 00 94 ...... fd (for example, user rotates the tune control or changes the mode)
-
- //qDebug() << "Data received: ";
- //printHex(data, false, true);
- if(data.length() < 4)
+ // use this:
+ QList dataList = dataInput.split('\xFD');
+ QByteArray data;
+ // qDebug() << "data list has this many elements: " << dataList.size();
+ if (dataList.last().isEmpty())
{
- if(data.length())
- {
- qDebug() << "Data length too short: " << data.length() << " bytes. Data:";
- printHex(data, false, true);
- }
- return;
+ dataList.removeLast(); // if the original ended in FD, then there is a blank entry at the end.
}
-
- if(!data.startsWith("\xFE\xFE"))
+ // Only thing is, each frame is missing '\xFD' at the end. So append! Keeps the frames intact.
+ for(index = 0; index < dataList.count(); index++)
{
- qDebug() << "Warning: Invalid data received, did not start with FE FE.";
- // find 94 e0 and shift over,
- // or look inside for a second FE FE
- // Often a local echo will miss a few bytes at the beginning.
- if(data.startsWith('\xFE'))
+ data = dataList[index];
+ data.append('\xFD'); // because we expect it to be there.
+ // foreach(listitem)
+ // listitem.append('\xFD');
+ // continue parsing...
+
+ count++;
+ // Data echo'd back from the rig start with this:
+ // fe fe 94 e0 ...... fd
+
+ // Data from the rig that is not an echo start with this:
+ // fe fe e0 94 ...... fd (for example, a reply to a query)
+
+ // Data from the rig that was not asked for is sent to controller 0x00:
+ // fe fe 00 94 ...... fd (for example, user rotates the tune control or changes the mode)
+
+ //qDebug() << "Data received: ";
+ //printHex(data, false, true);
+ if(data.length() < 4)
{
- data.prepend('\xFE');
- qDebug() << "Warning: Working with prepended data stream.";
- parseData(payloadIn);
- return;
- } else {
- qDebug() << "Error: Could not reconstruct corrupted data: ";
- printHex(data, false, true);
- // data.right(data.length() - data.find('\xFE\xFE'));
- // if found do not return and keep going.
- return;
+ if(data.length())
+ {
+ // Finally this almost never happens
+ qDebug() << "Data length too short: " << data.length() << " bytes. Data:";
+ printHex(data, false, true);
+ }
+ // no
+ //return;
+ // maybe:
+ // continue;
+ }
+
+ if(!data.startsWith("\xFE\xFE"))
+ {
+ qDebug() << "Warning: Invalid data received, did not start with FE FE.";
+ // find 94 e0 and shift over,
+ // or look inside for a second FE FE
+ // Often a local echo will miss a few bytes at the beginning.
+ if(data.startsWith('\xFE'))
+ {
+ data.prepend('\xFE');
+ qDebug() << "Warning: Working with prepended data stream.";
+ parseData(payloadIn);
+ return;
+ } else {
+ qDebug() << "Error: Could not reconstruct corrupted data: ";
+ printHex(data, false, true);
+ // data.right(data.length() - data.find('\xFE\xFE'));
+ // if found do not return and keep going.
+ return;
+ }
+ }
+
+ if((unsigned char)data[02] == civAddr)
+ {
+ // data is or begins with an echoback from what we sent
+ // find the first 'fd' and cut it. Then continue.
+ //payloadIn = data.right(data.length() - data.indexOf('\xfd')-1);
+ // qDebug() << "[FOUND] Trimmed off echo:";
+ //printHex(payloadIn, false, true);
+ //parseData(payloadIn);
+ //return;
+ }
+
+ switch(data[02])
+ {
+ // case civAddr: // can't have a variable here :-(
+ // // data is or begins with an echoback from what we sent
+ // // find the first 'fd' and cut it. Then continue.
+ // payloadIn = data.right(data.length() - data.indexOf('\xfd')-1);
+ // //qDebug() << "Trimmed off echo:";
+ // //printHex(payloadIn, false, true);
+ // parseData(payloadIn);
+ // break;
+ case '\xE0':
+ // data is a reply to some query we sent
+ // extract the payload out and parse.
+ // payload = getpayload(data); // or something
+ // parse (payload); // recursive ok?
+ payloadIn = data.right(data.length() - 4);
+ parseCommand();
+ break;
+ case '\x00':
+ // data send initiated by the rig due to user control
+ // extract the payload out and parse.
+ payloadIn = data.right(data.length() - 4);
+ parseCommand();
+ break;
+ default:
+ // could be for other equipment on the CIV network.
+ // just drop for now.
+ break;
}
}
-
- if((unsigned char)data[02] == civAddr)
+ /*
+ if(dataList.length() > 1)
{
- // data is or begins with an echoback from what we sent
- // find the first 'fd' and cut it. Then continue.
- payloadIn = data.right(data.length() - data.indexOf('\xfd')-1);
- //qDebug() << "Trimmed off echo:";
- //printHex(payloadIn, false, true);
- parseData(payloadIn);
- return;
- }
-
- switch(data[02])
- {
-// case civAddr: // can't have a variable here :-(
-// // data is or begins with an echoback from what we sent
-// // find the first 'fd' and cut it. Then continue.
-// payloadIn = data.right(data.length() - data.indexOf('\xfd')-1);
-// //qDebug() << "Trimmed off echo:";
-// //printHex(payloadIn, false, true);
-// parseData(payloadIn);
-// break;
- case '\xE0':
- // data is a reply to some query we sent
- // extract the payload out and parse.
- // payload = getpayload(data); // or something
- // parse (payload); // recursive ok?
- payloadIn = data.right(data.length() - 4);
- parseCommand();
- break;
- case '\x00':
- // data send initiated by the rig due to user control
- // extract the payload out and parse.
- payloadIn = data.right(data.length() - 4);
- parseCommand();
- break;
- default:
- // could be for other equipment on the CIV network.
- // just drop for now.
- break;
+ qDebug() << "Recovered " << count << " frames from single data with size" << dataList.count();
}
+ */
}
void rigCommander::parseCommand()
@@ -373,6 +408,8 @@ void rigCommander::parseCommand()
printHex(payloadIn, false, true);
break;
}
+ // is any payload left?
+
}
void rigCommander::parseSpectrum()
diff --git a/wfmain.cpp b/wfmain.cpp
index f00bd5c..01ebb31 100644
--- a/wfmain.cpp
+++ b/wfmain.cpp
@@ -126,9 +126,78 @@ wfmain::~wfmain()
delete ui;
}
-void wfmain::setDarkTheme(bool dark)
+void wfmain::on_useDarkThemeChk_clicked(bool checked)
{
- //theParent->setStyle();
+ setAppTheme(checked);
+ setPlotTheme(wf, checked);
+ setPlotTheme(plot, checked);
+
+}
+
+void wfmain::setAppTheme(bool isDark)
+{
+ if(isDark)
+ {
+ QFile f(":qdarkstyle/style.qss");
+ if (!f.exists())
+ {
+ printf("Unable to set stylesheet, file not found\n");
+ }
+ else
+ {
+ f.open(QFile::ReadOnly | QFile::Text);
+ QTextStream ts(&f);
+ qApp->setStyleSheet(ts.readAll());
+ }
+ } else {
+ qApp->setStyleSheet("");
+ }
+
+}
+
+void wfmain::setPlotTheme(QCustomPlot *plot, bool isDark)
+{
+ if(isDark)
+ {
+ plot->setBackground(QColor(0,0,0,255));
+ plot->xAxis->grid()->setPen(QColor(75,75,75,255));
+ plot->yAxis->grid()->setPen(QColor(75,75,75,255));
+
+ plot->legend->setTextColor(QColor(255,255,255,255));
+ plot->legend->setBorderPen(QColor(255,255,255,255));
+ plot->legend->setBrush(QColor(0,0,0,200));
+
+ plot->xAxis->setTickLabelColor(Qt::white);
+ plot->xAxis->setLabelColor(Qt::white);
+ plot->yAxis->setTickLabelColor(Qt::white);
+ plot->yAxis->setLabelColor(Qt::white);
+ plot->xAxis->setBasePen(QPen(Qt::white));
+ plot->xAxis->setTickPen(QPen(Qt::white));
+ plot->yAxis->setBasePen(QPen(Qt::white));
+ plot->yAxis->setTickPen(QPen(Qt::white));
+ plot->graph(0)->setPen(QPen(Qt::lightGray)); // magenta, yellow, green, lightGray
+ } else {
+ plot->setBackground(QColor(255,255,255,255));
+
+ plot->xAxis->grid()->setPen(QColor(200,200,200,255));
+ plot->yAxis->grid()->setPen(QColor(200,200,200,255));
+
+ plot->legend->setTextColor(QColor(0,0,0,255));
+ plot->legend->setBorderPen(QColor(0,0,0,255));
+ plot->legend->setBrush(QColor(255,255,255,200));
+
+ plot->xAxis->setTickLabelColor(Qt::black);
+ plot->xAxis->setLabelColor(Qt::black);
+ plot->yAxis->setTickLabelColor(Qt::black);
+ plot->yAxis->setLabelColor(Qt::black);
+ plot->xAxis->setBasePen(QPen(Qt::black));
+ plot->xAxis->setTickPen(QPen(Qt::black));
+ plot->yAxis->setBasePen(QPen(Qt::black));
+ plot->yAxis->setTickPen(QPen(Qt::black));
+ plot->graph(0)->setPen(QPen(Qt::blue));
+
+ }
+
}
void wfmain::runDelayedCommand()
@@ -170,7 +239,7 @@ void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double e
//qDebug() << "Spectrum data received at UI! Length: " << specLen;
if(specLen != 475)
{
- //qDebug () << "Unusual spectrum: length: " << specLen;
+ qDebug () << "Unusual spectrum: length: " << specLen;
if(specLen > 475)
{
specLen = 475;
@@ -508,3 +577,5 @@ void wfmain::on_modeSelectCombo_currentIndexChanged(int index)
}
}
}
+
+
diff --git a/wfmain.h b/wfmain.h
index 2216ea3..f2055d1 100644
--- a/wfmain.h
+++ b/wfmain.h
@@ -94,13 +94,16 @@ private slots:
void on_modeSelectCombo_currentIndexChanged(int index);
+ void on_useDarkThemeChk_clicked(bool checked);
+
private:
Ui::wfmain *ui;
QCustomPlot *plot; // line plot
QCustomPlot *wf; // waterfall image
QCPItemTracer * tracer; // marker of current frequency
//commHandler *comm;
- void setDarkTheme(bool dark);
+ void setAppTheme(bool isDark);
+ void setPlotTheme(QCustomPlot *plot, bool isDark);
QWidget * theParent;
rigCommander * rig;
diff --git a/wfmain.ui b/wfmain.ui
index 84a79af..5de3a85 100644
--- a/wfmain.ui
+++ b/wfmain.ui
@@ -18,7 +18,7 @@
-
- 0
+ 3
@@ -910,7 +910,7 @@
-
-
+
Use Dark Theme
diff --git a/wfview.pro b/wfview.pro
index 8251ccf..62fbdb6 100644
--- a/wfview.pro
+++ b/wfview.pro
@@ -20,6 +20,9 @@ QMAKE_CXXFLAGS += -march=native
DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += QCUSTOMPLOT_COMPILE_LIBRARY
+RESOURCES += qdarkstyle/style.qrc
+
+
#CONFIG(debug, release|debug) {
# win32:QCPLIB = qcustomplotd1
# else: QCPLIB = qcustomplotd