From 96e59cca3c60f3444b120daa31d124f49a5acbc8 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 28 Feb 2016 14:19:35 +0100 Subject: [PATCH] SerialConnect: allow custom baudrates from the GUI --- src/apps/serialconnect/CustomRateWindow.cpp | 68 +++++++++++++++++++++ src/apps/serialconnect/CustomRateWindow.h | 28 +++++++++ src/apps/serialconnect/Jamfile | 2 + src/apps/serialconnect/SerialApp.cpp | 8 +++ src/apps/serialconnect/SerialApp.h | 11 ++-- src/apps/serialconnect/SerialWindow.cpp | 24 ++++++-- 6 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 src/apps/serialconnect/CustomRateWindow.cpp create mode 100644 src/apps/serialconnect/CustomRateWindow.h diff --git a/src/apps/serialconnect/CustomRateWindow.cpp b/src/apps/serialconnect/CustomRateWindow.cpp new file mode 100644 index 0000000000..53eb5e422c --- /dev/null +++ b/src/apps/serialconnect/CustomRateWindow.cpp @@ -0,0 +1,68 @@ +/* + * Copyright 2016, Adrien Destugues, pulkomandy@pulkomandy.tk + * Distributed under terms of the MIT license. + */ + + +#include "CustomRateWindow.h" + +#include "SerialApp.h" + +#include +#include +#include +#include + + +#define B_TRANSLATION_CONTEXT "Custom baudrate window" + + +static const uint32 kOkButtonMsg = 'ok'; + +CustomRateWindow::CustomRateWindow(int baudrate) + : BWindow(BRect(100, 100, 200, 150), B_TRANSLATE("Custom baudrate"), + B_FLOATING_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_CLOSE_ON_ESCAPE + | B_AUTO_UPDATE_SIZE_LIMITS) +{ + BGroupLayout* layout = new BGroupLayout(B_HORIZONTAL); + SetLayout(layout); + + BGroupView* root = new BGroupView(B_VERTICAL); + AddChild(root); + + BGroupLayoutBuilder(root) + .SetInsets(B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING, + B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING) + .AddGroup(B_HORIZONTAL) + .Add(fSpinner = new BSpinner("spin", B_TRANSLATE("Baudrate:"), NULL)) + .End() + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(new BButton("ok", B_TRANSLATE("Ok"), new BMessage(kOkButtonMsg))) + .Add(new BButton("cancel", B_TRANSLATE("Cancel"), + new BMessage(B_QUIT_REQUESTED))) + .End() + .End(); + + fSpinner->SetMinValue(50); + fSpinner->SetMaxValue(3000000); + fSpinner->SetValue(baudrate); + + CenterOnScreen(); +} + + +void +CustomRateWindow::MessageReceived(BMessage* message) +{ + if (message->what == kOkButtonMsg) + { + BMessage* settings = new BMessage(kMsgSettings); + settings->AddInt32("baudrate", fSpinner->Value()); + be_app->PostMessage(settings); + Quit(); + return; + } + + BWindow::MessageReceived(message); +} diff --git a/src/apps/serialconnect/CustomRateWindow.h b/src/apps/serialconnect/CustomRateWindow.h new file mode 100644 index 0000000000..cfa69390d7 --- /dev/null +++ b/src/apps/serialconnect/CustomRateWindow.h @@ -0,0 +1,28 @@ +/* + * Copyright 2016, Adrien Destugues, pulkomandy@pulkomandy.tk + * Distributed under terms of the MIT license. + */ + + +#ifndef CUSTOMRATEWINDOW_H +#define CUSTOMRATEWINDOW_H + + +#include + + +class BSpinner; + + +class CustomRateWindow: public BWindow +{ + public: + CustomRateWindow(int baudrate); + void MessageReceived(BMessage* message); + + private: + BSpinner* fSpinner; +}; + + +#endif /* !CUSTOMRATEWINDOW_H */ diff --git a/src/apps/serialconnect/Jamfile b/src/apps/serialconnect/Jamfile index 953b0c9a03..1a63ae473a 100644 --- a/src/apps/serialconnect/Jamfile +++ b/src/apps/serialconnect/Jamfile @@ -1,10 +1,12 @@ SubDir HAIKU_TOP src apps serialconnect ; SubDirSysHdrs [ FDirName $(HAIKU_TOP) src apps serialconnect libvterm include ] ; +SubDirSysHdrs [ FDirName $(HAIKU_TOP) headers private interface ] ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps serialconnect libvterm src ] ; Application SerialConnect : + CustomRateWindow.cpp SerialApp.cpp SerialWindow.cpp TermView.cpp diff --git a/src/apps/serialconnect/SerialApp.cpp b/src/apps/serialconnect/SerialApp.cpp index dfce199680..3ee92462ac 100644 --- a/src/apps/serialconnect/SerialApp.cpp +++ b/src/apps/serialconnect/SerialApp.cpp @@ -15,6 +15,7 @@ #include #include +#include "CustomRateWindow.h" #include "SerialWindow.h" @@ -146,6 +147,13 @@ void SerialApp::MessageReceived(BMessage* message) debugger("Invalid BMessage received"); return; } + case kMsgCustomBaudrate: + { + // open the custom baudrate selector window + CustomRateWindow* window = new CustomRateWindow(fSerialPort.DataRate()); + window->Show(); + return; + } case kMsgSettings: { int32 baudrate; diff --git a/src/apps/serialconnect/SerialApp.h b/src/apps/serialconnect/SerialApp.h index 03f83d713e..8aff941a06 100644 --- a/src/apps/serialconnect/SerialApp.h +++ b/src/apps/serialconnect/SerialApp.h @@ -52,11 +52,12 @@ class SerialApp: public BApplication enum messageConstants { - kMsgDataRead = 'dare', - kMsgDataWrite = 'dawr', - kMsgLogfile = 'logf', - kMsgOpenPort = 'open', - kMsgSettings = 'stty', + kMsgCustomBaudrate = 'cust', + kMsgDataRead = 'dard', + kMsgDataWrite = 'dawr', + kMsgLogfile = 'logf', + kMsgOpenPort = 'open', + kMsgSettings = 'stty', }; #endif diff --git a/src/apps/serialconnect/SerialWindow.cpp b/src/apps/serialconnect/SerialWindow.cpp index d47c05c157..9737603b9a 100644 --- a/src/apps/serialconnect/SerialWindow.cpp +++ b/src/apps/serialconnect/SerialWindow.cpp @@ -174,6 +174,10 @@ SerialWindow::SerialWindow() fBaudrateMenu->AddItem(item); } + message = new BMessage(kMsgCustomBaudrate); + BMenuItem* custom = new BMenuItem("custom" B_UTF8_ELLIPSIS, message); + fBaudrateMenu->AddItem(custom); + fBaudrateMenu->SetTargetForItems(be_app); message = new BMessage(kMsgSettings); @@ -351,13 +355,25 @@ void SerialWindow::MessageReceived(BMessage* message) } if (message->FindInt32("baudrate", &baudrate) == B_OK) { - for (int i = 0; i < fBaudrateMenu->CountItems(); i++) { - BMenuItem* item = fBaudrateMenu->ItemAt(i); - int32 code; + int i; + BMenuItem* item = NULL; + for (i = 0; i < fBaudrateMenu->CountItems(); i++) { + item = fBaudrateMenu->ItemAt(i); + int32 code = 0; item->Message()->FindInt32("baudrate", &code); - if (baudrate == code) + if (baudrate == code) { item->SetMarked(true); + break; + } + } + + if (i == fBaudrateMenu->CountItems() && item != NULL) { + // Rate was not found, mark it as "custom". + // Since that is the last item in the menu, we still point + // to it. + item->SetMarked(true); + item->Message()->SetInt32("baudrate", baudrate); } }