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