1dae0a4e0SAdrien Destugues - PulkoMandy /* 21eb38608SAdrien Destugues * Copyright 2012-2019, Adrien Destugues, pulkomandy@pulkomandy.tk 3dae0a4e0SAdrien Destugues - PulkoMandy * Distributed under the terms of the MIT licence. 4dae0a4e0SAdrien Destugues - PulkoMandy */ 5dae0a4e0SAdrien Destugues - PulkoMandy 6dae0a4e0SAdrien Destugues - PulkoMandy 7dae0a4e0SAdrien Destugues - PulkoMandy #include "SerialWindow.h" 8dae0a4e0SAdrien Destugues - PulkoMandy 904434656SAdrien Destugues - PulkoMandy #include <stdio.h> 1004434656SAdrien Destugues - PulkoMandy 11*2e6ca31cSMurai Takashi #include <Catalog.h> 123cfd6956SRene Gollent #include <FilePanel.h> 13dae0a4e0SAdrien Destugues - PulkoMandy #include <GroupLayout.h> 14dae0a4e0SAdrien Destugues - PulkoMandy #include <Menu.h> 15dae0a4e0SAdrien Destugues - PulkoMandy #include <MenuBar.h> 16dae0a4e0SAdrien Destugues - PulkoMandy #include <MenuItem.h> 17b59ed154SAdrien Destugues #include <ScrollView.h> 18dae0a4e0SAdrien Destugues - PulkoMandy #include <SerialPort.h> 19ce058fa0SAdrien Destugues #include <StatusBar.h> 20dae0a4e0SAdrien Destugues - PulkoMandy 21f441fd03SAdrien Destugues - PulkoMandy #include "SerialApp.h" 22dae0a4e0SAdrien Destugues - PulkoMandy #include "TermView.h" 23dae0a4e0SAdrien Destugues - PulkoMandy 24dae0a4e0SAdrien Destugues - PulkoMandy 25*2e6ca31cSMurai Takashi #define B_TRANSLATION_CONTEXT "SerialWindow" 26*2e6ca31cSMurai Takashi 27*2e6ca31cSMurai Takashi 28e0bf43c1SAlexander von Gluck IV const int SerialWindow::kBaudrates[] = { 50, 75, 110, 134, 150, 200, 300, 600, 29e0bf43c1SAlexander von Gluck IV 1200, 1800, 2400, 4800, 9600, 19200, 31250, 38400, 57600, 115200, 230400 30ccc6b9beSAdrien Destugues }; 31ccc6b9beSAdrien Destugues 32ccc6b9beSAdrien Destugues 33e2367275SAdrien Destugues // The values for these constants are not in the expected order, so we have to 34e2367275SAdrien Destugues // rely on this lookup table if we want to keep the menu items sorted. 35e2367275SAdrien Destugues const int SerialWindow::kBaudrateConstants[] = { B_50_BPS, B_75_BPS, B_110_BPS, 36e2367275SAdrien Destugues B_134_BPS, B_150_BPS, B_200_BPS, B_300_BPS, B_600_BPS, B_1200_BPS, 37e2367275SAdrien Destugues B_1800_BPS, B_2400_BPS, B_4800_BPS, B_9600_BPS, B_19200_BPS, B_31250_BPS, 38e2367275SAdrien Destugues B_38400_BPS, B_57600_BPS, B_115200_BPS, B_230400_BPS 39e2367275SAdrien Destugues }; 40e2367275SAdrien Destugues 41e2367275SAdrien Destugues 42*2e6ca31cSMurai Takashi const char* SerialWindow::kWindowTitle = 43*2e6ca31cSMurai Takashi B_TRANSLATE_MARK_SYSTEM_NAME("SerialConnect"); 44ccc6b9beSAdrien Destugues 45ccc6b9beSAdrien Destugues 46dae0a4e0SAdrien Destugues - PulkoMandy SerialWindow::SerialWindow() 47*2e6ca31cSMurai Takashi : BWindow(BRect(100, 100, 400, 400), 48*2e6ca31cSMurai Takashi B_TRANSLATE_NOCOLLECT_SYSTEM_NAME(SerialWindow::kWindowTitle), 49f441fd03SAdrien Destugues - PulkoMandy B_DOCUMENT_WINDOW, B_QUIT_ON_WINDOW_CLOSE | B_AUTO_UPDATE_SIZE_LIMITS) 50469e6cd2SAdrien Destugues - PulkoMandy , fLogFilePanel(NULL) 5183776950SAdrien Destugues , fSendFilePanel(NULL) 52dae0a4e0SAdrien Destugues - PulkoMandy { 53b59ed154SAdrien Destugues BMenuBar* menuBar = new BMenuBar(Bounds(), "menuBar"); 54b59ed154SAdrien Destugues menuBar->ResizeToPreferred(); 55dae0a4e0SAdrien Destugues - PulkoMandy 56b59ed154SAdrien Destugues BRect r = Bounds(); 57b59ed154SAdrien Destugues r.top = menuBar->Bounds().bottom + 1; 58b59ed154SAdrien Destugues r.right -= B_V_SCROLL_BAR_WIDTH; 59b59ed154SAdrien Destugues fTermView = new TermView(r); 60b59ed154SAdrien Destugues fTermView->ResizeToPreferred(); 61b59ed154SAdrien Destugues 62b59ed154SAdrien Destugues r = fTermView->Frame(); 63b59ed154SAdrien Destugues r.left = r.right + 1; 64b59ed154SAdrien Destugues r.right = r.left + B_V_SCROLL_BAR_WIDTH; 65b59ed154SAdrien Destugues r.top -= 1; 66b59ed154SAdrien Destugues r.bottom -= B_H_SCROLL_BAR_HEIGHT - 1; 671eb38608SAdrien Destugues 68b59ed154SAdrien Destugues BScrollBar* scrollBar = new BScrollBar(r, "scrollbar", NULL, 0, 0, 69b59ed154SAdrien Destugues B_VERTICAL); 70b59ed154SAdrien Destugues 71b59ed154SAdrien Destugues scrollBar->SetTarget(fTermView); 72b59ed154SAdrien Destugues 73b59ed154SAdrien Destugues ResizeTo(r.right - 1, r.bottom + B_H_SCROLL_BAR_HEIGHT - 1); 74dae0a4e0SAdrien Destugues - PulkoMandy 75ce058fa0SAdrien Destugues r = fTermView->Frame(); 76ce058fa0SAdrien Destugues r.top = r.bottom - 37; 77ce058fa0SAdrien Destugues 78*2e6ca31cSMurai Takashi fStatusBar = new BStatusBar(r, B_TRANSLATE("file transfer progress"), 79*2e6ca31cSMurai Takashi NULL, NULL); 80ce058fa0SAdrien Destugues fStatusBar->SetResizingMode(B_FOLLOW_BOTTOM | B_FOLLOW_LEFT_RIGHT); 81ce058fa0SAdrien Destugues fStatusBar->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); 82ce058fa0SAdrien Destugues fStatusBar->Hide(); 83ce058fa0SAdrien Destugues 84dae0a4e0SAdrien Destugues - PulkoMandy AddChild(menuBar); 85f441fd03SAdrien Destugues - PulkoMandy AddChild(fTermView); 86b59ed154SAdrien Destugues AddChild(scrollBar); 87ce058fa0SAdrien Destugues AddChild(fStatusBar); 88dae0a4e0SAdrien Destugues - PulkoMandy 89*2e6ca31cSMurai Takashi fConnectionMenu = new BMenu(B_TRANSLATE("Connection")); 90*2e6ca31cSMurai Takashi fFileMenu = new BMenu(B_TRANSLATE("File")); 91*2e6ca31cSMurai Takashi BMenu* settingsMenu = new BMenu(B_TRANSLATE("Settings")); 92*2e6ca31cSMurai Takashi BMenu* editMenu = new BMenu(B_TRANSLATE("Edit")); 93dae0a4e0SAdrien Destugues - PulkoMandy 94469e6cd2SAdrien Destugues - PulkoMandy fConnectionMenu->SetRadioMode(true); 95469e6cd2SAdrien Destugues - PulkoMandy 9604434656SAdrien Destugues - PulkoMandy menuBar->AddItem(fConnectionMenu); 971eb38608SAdrien Destugues menuBar->AddItem(editMenu); 98ce058fa0SAdrien Destugues menuBar->AddItem(fFileMenu); 99dae0a4e0SAdrien Destugues - PulkoMandy menuBar->AddItem(settingsMenu); 100dae0a4e0SAdrien Destugues - PulkoMandy 101*2e6ca31cSMurai Takashi BMenuItem* logFile = new BMenuItem( 102*2e6ca31cSMurai Takashi B_TRANSLATE("Log to file" B_UTF8_ELLIPSIS), new BMessage(kMsgLogfile)); 103ce058fa0SAdrien Destugues fFileMenu->AddItem(logFile); 1048bff17cfSAdrien Destugues 1058bff17cfSAdrien Destugues // The "send" items are disabled initially. They are enabled only once we 1068bff17cfSAdrien Destugues // are connected to a serial port. 1078bff17cfSAdrien Destugues BMessage* sendMsg = new BMessage(kMsgSendFile); 1088bff17cfSAdrien Destugues sendMsg->AddString("protocol", "xmodem"); 109*2e6ca31cSMurai Takashi BMenuItem* xmodemSend = new BMenuItem( 110*2e6ca31cSMurai Takashi B_TRANSLATE("XModem send" B_UTF8_ELLIPSIS), 1118bff17cfSAdrien Destugues sendMsg); 112ce058fa0SAdrien Destugues fFileMenu->AddItem(xmodemSend); 113ce058fa0SAdrien Destugues xmodemSend->SetEnabled(false); 1148bff17cfSAdrien Destugues 115*2e6ca31cSMurai Takashi BMenuItem* rawSend = new BMenuItem(B_TRANSLATE("Raw send" B_UTF8_ELLIPSIS), 1168bff17cfSAdrien Destugues new BMessage(kMsgSendFile)); 1178bff17cfSAdrien Destugues fFileMenu->AddItem(rawSend); 1188bff17cfSAdrien Destugues rawSend->SetEnabled(false); 1198bff17cfSAdrien Destugues 120ce058fa0SAdrien Destugues #if 0 1218bff17cfSAdrien Destugues // TODO implement this 122469e6cd2SAdrien Destugues - PulkoMandy BMenuItem* xmodemReceive = new BMenuItem( 123469e6cd2SAdrien Destugues - PulkoMandy "X/Y/Zmodem receive" B_UTF8_ELLIPSIS, NULL); 124ce058fa0SAdrien Destugues fFileMenu->AddItem(xmodemReceive); 125ce058fa0SAdrien Destugues xmodemReceive->SetEnabled(false); 126ccc6b9beSAdrien Destugues #endif 127dae0a4e0SAdrien Destugues - PulkoMandy 1281eb38608SAdrien Destugues // Items for the edit menu 129*2e6ca31cSMurai Takashi BMenuItem* clearScreen = new BMenuItem(B_TRANSLATE("Clear history"), 1301eb38608SAdrien Destugues new BMessage(kMsgClear)); 1311eb38608SAdrien Destugues editMenu->AddItem(clearScreen); 1321eb38608SAdrien Destugues 1331eb38608SAdrien Destugues // TODO copy (when we have selection), paste 1341eb38608SAdrien Destugues 13504434656SAdrien Destugues - PulkoMandy // Configuring all this by menus may be a bit unhandy. Make a setting 13604434656SAdrien Destugues - PulkoMandy // window instead ? 137*2e6ca31cSMurai Takashi fBaudrateMenu = new BMenu(B_TRANSLATE("Baud rate")); 138ccc6b9beSAdrien Destugues fBaudrateMenu->SetRadioMode(true); 139ccc6b9beSAdrien Destugues settingsMenu->AddItem(fBaudrateMenu); 14004434656SAdrien Destugues - PulkoMandy 141*2e6ca31cSMurai Takashi fParityMenu = new BMenu(B_TRANSLATE("Parity")); 142ccc6b9beSAdrien Destugues fParityMenu->SetRadioMode(true); 143ccc6b9beSAdrien Destugues settingsMenu->AddItem(fParityMenu); 14404434656SAdrien Destugues - PulkoMandy 145*2e6ca31cSMurai Takashi fStopbitsMenu = new BMenu(B_TRANSLATE("Stop bits")); 146ccc6b9beSAdrien Destugues fStopbitsMenu->SetRadioMode(true); 147ccc6b9beSAdrien Destugues settingsMenu->AddItem(fStopbitsMenu); 14804434656SAdrien Destugues - PulkoMandy 149*2e6ca31cSMurai Takashi fFlowcontrolMenu = new BMenu(B_TRANSLATE("Flow control")); 150ccc6b9beSAdrien Destugues fFlowcontrolMenu->SetRadioMode(true); 151ccc6b9beSAdrien Destugues settingsMenu->AddItem(fFlowcontrolMenu); 15204434656SAdrien Destugues - PulkoMandy 153*2e6ca31cSMurai Takashi fDatabitsMenu = new BMenu(B_TRANSLATE("Data bits")); 154ccc6b9beSAdrien Destugues fDatabitsMenu->SetRadioMode(true); 155ccc6b9beSAdrien Destugues settingsMenu->AddItem(fDatabitsMenu); 15604434656SAdrien Destugues - PulkoMandy 157*2e6ca31cSMurai Takashi fLineTerminatorMenu = new BMenu(B_TRANSLATE("Line terminator")); 158534d0e61SAdrien Destugues fLineTerminatorMenu->SetRadioMode(true); 159534d0e61SAdrien Destugues settingsMenu->AddItem(fLineTerminatorMenu); 16004434656SAdrien Destugues - PulkoMandy 16104434656SAdrien Destugues - PulkoMandy BMessage* message = new BMessage(kMsgSettings); 16204434656SAdrien Destugues - PulkoMandy message->AddInt32("parity", B_NO_PARITY); 163*2e6ca31cSMurai Takashi BMenuItem* parityNone = 164*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE_COMMENT("None", "Parity"), message); 16504434656SAdrien Destugues - PulkoMandy 16604434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 16704434656SAdrien Destugues - PulkoMandy message->AddInt32("parity", B_ODD_PARITY); 168*2e6ca31cSMurai Takashi BMenuItem* parityOdd = new BMenuItem(B_TRANSLATE_COMMENT("Odd", "Parity"), 169*2e6ca31cSMurai Takashi message); 17004434656SAdrien Destugues - PulkoMandy 17104434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 17204434656SAdrien Destugues - PulkoMandy message->AddInt32("parity", B_EVEN_PARITY); 173*2e6ca31cSMurai Takashi BMenuItem* parityEven = 174*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE_COMMENT("Even", "Parity"), message); 17504434656SAdrien Destugues - PulkoMandy 176ccc6b9beSAdrien Destugues fParityMenu->AddItem(parityNone); 177ccc6b9beSAdrien Destugues fParityMenu->AddItem(parityOdd); 178ccc6b9beSAdrien Destugues fParityMenu->AddItem(parityEven); 179ccc6b9beSAdrien Destugues fParityMenu->SetTargetForItems(be_app); 18004434656SAdrien Destugues - PulkoMandy 18104434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 18204434656SAdrien Destugues - PulkoMandy message->AddInt32("databits", B_DATA_BITS_7); 18304434656SAdrien Destugues - PulkoMandy BMenuItem* data7 = new BMenuItem("7", message); 18404434656SAdrien Destugues - PulkoMandy 18504434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 18604434656SAdrien Destugues - PulkoMandy message->AddInt32("databits", B_DATA_BITS_8); 18704434656SAdrien Destugues - PulkoMandy BMenuItem* data8 = new BMenuItem("8", message); 18804434656SAdrien Destugues - PulkoMandy 189ccc6b9beSAdrien Destugues fDatabitsMenu->AddItem(data7); 190ccc6b9beSAdrien Destugues fDatabitsMenu->AddItem(data8); 191ccc6b9beSAdrien Destugues fDatabitsMenu->SetTargetForItems(be_app); 19204434656SAdrien Destugues - PulkoMandy 19304434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 19404434656SAdrien Destugues - PulkoMandy message->AddInt32("stopbits", B_STOP_BITS_1); 195ccc6b9beSAdrien Destugues BMenuItem* stop1 = new BMenuItem("1", message); 19604434656SAdrien Destugues - PulkoMandy 19704434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 19804434656SAdrien Destugues - PulkoMandy message->AddInt32("stopbits", B_STOP_BITS_2); 199ccc6b9beSAdrien Destugues BMenuItem* stop2 = new BMenuItem("2", message); 20004434656SAdrien Destugues - PulkoMandy 201ccc6b9beSAdrien Destugues fStopbitsMenu->AddItem(stop1); 202ccc6b9beSAdrien Destugues fStopbitsMenu->AddItem(stop2); 203ccc6b9beSAdrien Destugues fStopbitsMenu->SetTargetForItems(be_app); 20404434656SAdrien Destugues - PulkoMandy 20504434656SAdrien Destugues - PulkoMandy // Loop backwards to add fastest rates at top of menu 206bc026197SAlexander von Gluck IV for (int i = sizeof(kBaudrates) / sizeof(kBaudrates[0]); --i >= 0;) 20704434656SAdrien Destugues - PulkoMandy { 20804434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 209e2367275SAdrien Destugues message->AddInt32("baudrate", kBaudrateConstants[i]); 21004434656SAdrien Destugues - PulkoMandy 21104434656SAdrien Destugues - PulkoMandy char buffer[7]; 212ccc6b9beSAdrien Destugues sprintf(buffer, "%d", kBaudrates[i]); 21304434656SAdrien Destugues - PulkoMandy BMenuItem* item = new BMenuItem(buffer, message); 21404434656SAdrien Destugues - PulkoMandy 215ccc6b9beSAdrien Destugues fBaudrateMenu->AddItem(item); 21604434656SAdrien Destugues - PulkoMandy } 21704434656SAdrien Destugues - PulkoMandy 21896e59ccaSAdrien Destugues message = new BMessage(kMsgCustomBaudrate); 219*2e6ca31cSMurai Takashi BMenuItem* custom = 220*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE_COMMENT("custom" B_UTF8_ELLIPSIS, 221*2e6ca31cSMurai Takashi "Baudrate"), message); 22296e59ccaSAdrien Destugues fBaudrateMenu->AddItem(custom); 22396e59ccaSAdrien Destugues 224ccc6b9beSAdrien Destugues fBaudrateMenu->SetTargetForItems(be_app); 22504434656SAdrien Destugues - PulkoMandy 22604434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 22704434656SAdrien Destugues - PulkoMandy message->AddInt32("flowcontrol", B_HARDWARE_CONTROL); 228*2e6ca31cSMurai Takashi BMenuItem* hardware = 229*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE_COMMENT("Hardware", "Flowcontrol"), message); 23004434656SAdrien Destugues - PulkoMandy 23104434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 23204434656SAdrien Destugues - PulkoMandy message->AddInt32("flowcontrol", B_SOFTWARE_CONTROL); 233*2e6ca31cSMurai Takashi BMenuItem* software = 234*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE_COMMENT("Software", "Flowcontrol"), message); 23504434656SAdrien Destugues - PulkoMandy 23604434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 23704434656SAdrien Destugues - PulkoMandy message->AddInt32("flowcontrol", B_HARDWARE_CONTROL | B_SOFTWARE_CONTROL); 238*2e6ca31cSMurai Takashi BMenuItem* both = 239*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE_COMMENT("Both", "Flowcontrol"), message); 24004434656SAdrien Destugues - PulkoMandy 24104434656SAdrien Destugues - PulkoMandy message = new BMessage(kMsgSettings); 24204434656SAdrien Destugues - PulkoMandy message->AddInt32("flowcontrol", 0); 243*2e6ca31cSMurai Takashi BMenuItem* noFlow = 244*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE_COMMENT("None", "Flowcontrol"), message); 24504434656SAdrien Destugues - PulkoMandy 246ccc6b9beSAdrien Destugues fFlowcontrolMenu->AddItem(hardware); 247ccc6b9beSAdrien Destugues fFlowcontrolMenu->AddItem(software); 248ccc6b9beSAdrien Destugues fFlowcontrolMenu->AddItem(both); 249ccc6b9beSAdrien Destugues fFlowcontrolMenu->AddItem(noFlow); 250ccc6b9beSAdrien Destugues fFlowcontrolMenu->SetTargetForItems(be_app); 25104434656SAdrien Destugues - PulkoMandy 252534d0e61SAdrien Destugues message = new BMessage(kMsgSettings); 253534d0e61SAdrien Destugues message->AddString("terminator", "\n"); 254534d0e61SAdrien Destugues BMenuItem* lf = new BMenuItem("LF (\\n)", message); 255534d0e61SAdrien Destugues 256534d0e61SAdrien Destugues message = new BMessage(kMsgSettings); 257534d0e61SAdrien Destugues message->AddString("terminator", "\r"); 258534d0e61SAdrien Destugues BMenuItem* cr = new BMenuItem("CR (\\r)", message); 259534d0e61SAdrien Destugues 260534d0e61SAdrien Destugues message = new BMessage(kMsgSettings); 261534d0e61SAdrien Destugues message->AddString("terminator", "\r\n"); 262534d0e61SAdrien Destugues BMenuItem* crlf = new BMenuItem("CR/LF (\\r\\n)", message); 263534d0e61SAdrien Destugues 264534d0e61SAdrien Destugues fLineTerminatorMenu->AddItem(lf); 265534d0e61SAdrien Destugues fLineTerminatorMenu->AddItem(cr); 266534d0e61SAdrien Destugues fLineTerminatorMenu->AddItem(crlf); 267534d0e61SAdrien Destugues 26804434656SAdrien Destugues - PulkoMandy CenterOnScreen(); 26904434656SAdrien Destugues - PulkoMandy } 27004434656SAdrien Destugues - PulkoMandy 271469e6cd2SAdrien Destugues - PulkoMandy 272469e6cd2SAdrien Destugues - PulkoMandy SerialWindow::~SerialWindow() 273469e6cd2SAdrien Destugues - PulkoMandy { 274469e6cd2SAdrien Destugues - PulkoMandy delete fLogFilePanel; 27583776950SAdrien Destugues delete fSendFilePanel; 276469e6cd2SAdrien Destugues - PulkoMandy } 277469e6cd2SAdrien Destugues - PulkoMandy 27804434656SAdrien Destugues - PulkoMandy 27904434656SAdrien Destugues - PulkoMandy void SerialWindow::MenusBeginning() 28004434656SAdrien Destugues - PulkoMandy { 28104434656SAdrien Destugues - PulkoMandy // remove all items from the menu 282c19e7bb3SUrias McCullough fConnectionMenu->RemoveItems(0, fConnectionMenu->CountItems(), true); 28304434656SAdrien Destugues - PulkoMandy 28404434656SAdrien Destugues - PulkoMandy // fill it with the (updated) serial port list 285dae0a4e0SAdrien Destugues - PulkoMandy BSerialPort serialPort; 286dae0a4e0SAdrien Destugues - PulkoMandy int deviceCount = serialPort.CountDevices(); 287ccc6b9beSAdrien Destugues bool connected = false; 288dae0a4e0SAdrien Destugues - PulkoMandy 289dae0a4e0SAdrien Destugues - PulkoMandy for (int i = 0; i < deviceCount; i++) 290dae0a4e0SAdrien Destugues - PulkoMandy { 291dae0a4e0SAdrien Destugues - PulkoMandy char buffer[256]; 292dae0a4e0SAdrien Destugues - PulkoMandy serialPort.GetDeviceName(i, buffer, 256); 293dae0a4e0SAdrien Destugues - PulkoMandy 294f441fd03SAdrien Destugues - PulkoMandy BMessage* message = new BMessage(kMsgOpenPort); 295f441fd03SAdrien Destugues - PulkoMandy message->AddString("port name", buffer); 296f441fd03SAdrien Destugues - PulkoMandy BMenuItem* portItem = new BMenuItem(buffer, message); 297a2021beeSAdrien Destugues - PulkoMandy portItem->SetTarget(be_app); 29804434656SAdrien Destugues - PulkoMandy 299ccc6b9beSAdrien Destugues const BString& connectedPort = ((SerialApp*)be_app)->GetPort(); 300ccc6b9beSAdrien Destugues 301ccc6b9beSAdrien Destugues if (connectedPort == buffer) { 302ccc6b9beSAdrien Destugues connected = true; 303ccc6b9beSAdrien Destugues portItem->SetMarked(true); 304ccc6b9beSAdrien Destugues } 305ccc6b9beSAdrien Destugues 30604434656SAdrien Destugues - PulkoMandy fConnectionMenu->AddItem(portItem); 307dae0a4e0SAdrien Destugues - PulkoMandy } 308dae0a4e0SAdrien Destugues - PulkoMandy 30904434656SAdrien Destugues - PulkoMandy if (deviceCount > 0) { 31004434656SAdrien Destugues - PulkoMandy fConnectionMenu->AddSeparatorItem(); 311dae0a4e0SAdrien Destugues - PulkoMandy 312*2e6ca31cSMurai Takashi BMenuItem* disconnect = new BMenuItem(B_TRANSLATE("Disconnect"), 31304434656SAdrien Destugues - PulkoMandy new BMessage(kMsgOpenPort), 'Z', B_OPTION_KEY); 314ccc6b9beSAdrien Destugues if (!connected) 315ccc6b9beSAdrien Destugues disconnect->SetEnabled(false); 316d9e93152SAdrien Destugues disconnect->SetTarget(be_app); 31704434656SAdrien Destugues - PulkoMandy fConnectionMenu->AddItem(disconnect); 31804434656SAdrien Destugues - PulkoMandy } else { 319*2e6ca31cSMurai Takashi BMenuItem* noDevices = 320*2e6ca31cSMurai Takashi new BMenuItem(B_TRANSLATE("<no serial port available>"), NULL); 32104434656SAdrien Destugues - PulkoMandy noDevices->SetEnabled(false); 32204434656SAdrien Destugues - PulkoMandy fConnectionMenu->AddItem(noDevices); 323dae0a4e0SAdrien Destugues - PulkoMandy } 324dae0a4e0SAdrien Destugues - PulkoMandy } 325dae0a4e0SAdrien Destugues - PulkoMandy 326b59ed154SAdrien Destugues 327f441fd03SAdrien Destugues - PulkoMandy void SerialWindow::MessageReceived(BMessage* message) 328f441fd03SAdrien Destugues - PulkoMandy { 329f441fd03SAdrien Destugues - PulkoMandy switch (message->what) 330f441fd03SAdrien Destugues - PulkoMandy { 331ce058fa0SAdrien Destugues case kMsgOpenPort: 332ce058fa0SAdrien Destugues { 333ce058fa0SAdrien Destugues BString path; 334ce058fa0SAdrien Destugues bool open = (message->FindString("port name", &path) == B_OK); 335ce058fa0SAdrien Destugues int i = 1; // Skip "log to file", which woeks even when offline. 336ce058fa0SAdrien Destugues BMenuItem* item; 337ce058fa0SAdrien Destugues while((item = fFileMenu->ItemAt(i++))) 338ce058fa0SAdrien Destugues { 339ce058fa0SAdrien Destugues item->SetEnabled(open); 340ce058fa0SAdrien Destugues } 341ce058fa0SAdrien Destugues return; 342ce058fa0SAdrien Destugues } 343f441fd03SAdrien Destugues - PulkoMandy case kMsgDataRead: 344f441fd03SAdrien Destugues - PulkoMandy { 345f441fd03SAdrien Destugues - PulkoMandy const char* bytes; 346f441fd03SAdrien Destugues - PulkoMandy ssize_t length; 347492ac416SAdrien Destugues if (message->FindData("data", B_RAW_TYPE, (const void**)&bytes, 348492ac416SAdrien Destugues &length) == B_OK) 349f441fd03SAdrien Destugues - PulkoMandy fTermView->PushBytes(bytes, length); 350d9e93152SAdrien Destugues return; 351f441fd03SAdrien Destugues - PulkoMandy } 352469e6cd2SAdrien Destugues - PulkoMandy case kMsgLogfile: 353469e6cd2SAdrien Destugues - PulkoMandy { 354469e6cd2SAdrien Destugues - PulkoMandy // Let's lazy init the file panel 355469e6cd2SAdrien Destugues - PulkoMandy if (fLogFilePanel == NULL) { 35683776950SAdrien Destugues fLogFilePanel = new BFilePanel(B_SAVE_PANEL, 357ce058fa0SAdrien Destugues &be_app_messenger, NULL, B_FILE_NODE, false); 358469e6cd2SAdrien Destugues - PulkoMandy fLogFilePanel->SetMessage(message); 359469e6cd2SAdrien Destugues - PulkoMandy } 360469e6cd2SAdrien Destugues - PulkoMandy fLogFilePanel->Show(); 361d9e93152SAdrien Destugues return; 362469e6cd2SAdrien Destugues - PulkoMandy } 36383776950SAdrien Destugues case kMsgSendFile: 36483776950SAdrien Destugues { 36583776950SAdrien Destugues // Let's lazy init the file panel 36683776950SAdrien Destugues if (fSendFilePanel == NULL) { 36783776950SAdrien Destugues fSendFilePanel = new BFilePanel(B_OPEN_PANEL, 36883776950SAdrien Destugues &be_app_messenger, NULL, B_FILE_NODE, false); 36983776950SAdrien Destugues } 37083776950SAdrien Destugues fSendFilePanel->SetMessage(message); 37183776950SAdrien Destugues fSendFilePanel->Show(); 37283776950SAdrien Destugues return; 37383776950SAdrien Destugues } 374ccc6b9beSAdrien Destugues case kMsgSettings: 375ccc6b9beSAdrien Destugues { 376ccc6b9beSAdrien Destugues int32 baudrate; 377ccc6b9beSAdrien Destugues stop_bits stopBits; 378ccc6b9beSAdrien Destugues data_bits dataBits; 379ccc6b9beSAdrien Destugues parity_mode parity; 380ccc6b9beSAdrien Destugues uint32 flowcontrol; 381534d0e61SAdrien Destugues BString terminator; 382ccc6b9beSAdrien Destugues 383b59ed154SAdrien Destugues if (message->FindInt32("databits", (int32*)&dataBits) == B_OK) { 384b59ed154SAdrien Destugues for (int i = 0; i < fDatabitsMenu->CountItems(); i++) { 385ccc6b9beSAdrien Destugues BMenuItem* item = fDatabitsMenu->ItemAt(i); 386ccc6b9beSAdrien Destugues int32 code; 387ccc6b9beSAdrien Destugues item->Message()->FindInt32("databits", &code); 388ccc6b9beSAdrien Destugues 389ccc6b9beSAdrien Destugues if (code == dataBits) 390ccc6b9beSAdrien Destugues item->SetMarked(true); 391ccc6b9beSAdrien Destugues } 392ccc6b9beSAdrien Destugues } 393ccc6b9beSAdrien Destugues 394b59ed154SAdrien Destugues if (message->FindInt32("stopbits", (int32*)&stopBits) == B_OK) { 395b59ed154SAdrien Destugues for (int i = 0; i < fStopbitsMenu->CountItems(); i++) { 396ccc6b9beSAdrien Destugues BMenuItem* item = fStopbitsMenu->ItemAt(i); 397ccc6b9beSAdrien Destugues int32 code; 398ccc6b9beSAdrien Destugues item->Message()->FindInt32("stopbits", &code); 399ccc6b9beSAdrien Destugues 400ccc6b9beSAdrien Destugues if (code == stopBits) 401ccc6b9beSAdrien Destugues item->SetMarked(true); 402ccc6b9beSAdrien Destugues } 403ccc6b9beSAdrien Destugues } 404ccc6b9beSAdrien Destugues 405ccc6b9beSAdrien Destugues if (message->FindInt32("parity", (int32*)&parity) == B_OK) 406ccc6b9beSAdrien Destugues { 407b59ed154SAdrien Destugues for (int i = 0; i < fParityMenu->CountItems(); i++) { 408ccc6b9beSAdrien Destugues BMenuItem* item = fParityMenu->ItemAt(i); 409ccc6b9beSAdrien Destugues int32 code; 410ccc6b9beSAdrien Destugues item->Message()->FindInt32("parity", &code); 411ccc6b9beSAdrien Destugues 412ccc6b9beSAdrien Destugues if (code == parity) 413ccc6b9beSAdrien Destugues item->SetMarked(true); 414ccc6b9beSAdrien Destugues } 415ccc6b9beSAdrien Destugues } 416ccc6b9beSAdrien Destugues 417b59ed154SAdrien Destugues if (message->FindInt32("flowcontrol", (int32*)&flowcontrol) 418b59ed154SAdrien Destugues == B_OK) { 419b59ed154SAdrien Destugues for (int i = 0; i < fFlowcontrolMenu->CountItems(); i++) { 420ccc6b9beSAdrien Destugues BMenuItem* item = fFlowcontrolMenu->ItemAt(i); 421ccc6b9beSAdrien Destugues int32 code; 422ccc6b9beSAdrien Destugues item->Message()->FindInt32("flowcontrol", &code); 423ccc6b9beSAdrien Destugues 424ccc6b9beSAdrien Destugues if (code == (int32)flowcontrol) 425ccc6b9beSAdrien Destugues item->SetMarked(true); 426ccc6b9beSAdrien Destugues } 427ccc6b9beSAdrien Destugues } 428ccc6b9beSAdrien Destugues 429b59ed154SAdrien Destugues if (message->FindInt32("baudrate", &baudrate) == B_OK) { 43096e59ccaSAdrien Destugues int i; 43196e59ccaSAdrien Destugues BMenuItem* item = NULL; 43296e59ccaSAdrien Destugues for (i = 0; i < fBaudrateMenu->CountItems(); i++) { 43396e59ccaSAdrien Destugues item = fBaudrateMenu->ItemAt(i); 43496e59ccaSAdrien Destugues int32 code = 0; 435ccc6b9beSAdrien Destugues item->Message()->FindInt32("baudrate", &code); 436ccc6b9beSAdrien Destugues 43796e59ccaSAdrien Destugues if (baudrate == code) { 438ccc6b9beSAdrien Destugues item->SetMarked(true); 43996e59ccaSAdrien Destugues break; 44096e59ccaSAdrien Destugues } 44196e59ccaSAdrien Destugues } 44296e59ccaSAdrien Destugues 44396e59ccaSAdrien Destugues if (i == fBaudrateMenu->CountItems() && item != NULL) { 44496e59ccaSAdrien Destugues // Rate was not found, mark it as "custom". 44596e59ccaSAdrien Destugues // Since that is the last item in the menu, we still point 44696e59ccaSAdrien Destugues // to it. 44796e59ccaSAdrien Destugues item->SetMarked(true); 44896e59ccaSAdrien Destugues item->Message()->SetInt32("baudrate", baudrate); 449ccc6b9beSAdrien Destugues } 450ccc6b9beSAdrien Destugues } 451ccc6b9beSAdrien Destugues 452534d0e61SAdrien Destugues if (message->FindString("terminator", &terminator) == B_OK) { 453534d0e61SAdrien Destugues fTermView->SetLineTerminator(terminator); 454534d0e61SAdrien Destugues for (int i = 0; i < fLineTerminatorMenu->CountItems(); i++) { 455534d0e61SAdrien Destugues BMenuItem* item = fLineTerminatorMenu->ItemAt(i); 456534d0e61SAdrien Destugues BString code; 457534d0e61SAdrien Destugues item->Message()->FindString("terminator", &code); 458534d0e61SAdrien Destugues 459534d0e61SAdrien Destugues if (terminator == code) 460534d0e61SAdrien Destugues item->SetMarked(true); 461534d0e61SAdrien Destugues } 462534d0e61SAdrien Destugues } 463534d0e61SAdrien Destugues 464d9e93152SAdrien Destugues return; 465ccc6b9beSAdrien Destugues } 4661eb38608SAdrien Destugues case kMsgClear: 4671eb38608SAdrien Destugues { 4681eb38608SAdrien Destugues fTermView->Clear(); 4691eb38608SAdrien Destugues return; 4701eb38608SAdrien Destugues } 471ce058fa0SAdrien Destugues case kMsgProgress: 472ce058fa0SAdrien Destugues { 473ce058fa0SAdrien Destugues // File transfer progress 474ce058fa0SAdrien Destugues int32 pos = message->FindInt32("pos"); 475ce058fa0SAdrien Destugues int32 size = message->FindInt32("size"); 476ce058fa0SAdrien Destugues BString label = message->FindString("info"); 477ce058fa0SAdrien Destugues 478ce058fa0SAdrien Destugues if (pos >= size) { 479ce058fa0SAdrien Destugues if (!fStatusBar->IsHidden()) { 480ce058fa0SAdrien Destugues fStatusBar->Hide(); 481ce058fa0SAdrien Destugues fTermView->ResizeBy(0, fStatusBar->Bounds().Height() - 1); 482ce058fa0SAdrien Destugues } 483ce058fa0SAdrien Destugues } else { 484ce058fa0SAdrien Destugues BString text; 485ce058fa0SAdrien Destugues text.SetToFormat("%" B_PRId32 "/%" B_PRId32, pos, size); 486ce058fa0SAdrien Destugues fStatusBar->SetMaxValue(size); 487ce058fa0SAdrien Destugues fStatusBar->SetTo(pos, label, text); 488ce058fa0SAdrien Destugues if (fStatusBar->IsHidden()) { 489ce058fa0SAdrien Destugues fStatusBar->Show(); 490ce058fa0SAdrien Destugues fTermView->ResizeBy(0, -(fStatusBar->Bounds().Height() - 1)); 491ce058fa0SAdrien Destugues } 492ce058fa0SAdrien Destugues } 493ce058fa0SAdrien Destugues return; 494ce058fa0SAdrien Destugues } 495d9e93152SAdrien Destugues } 496d9e93152SAdrien Destugues 497f441fd03SAdrien Destugues - PulkoMandy BWindow::MessageReceived(message); 498f441fd03SAdrien Destugues - PulkoMandy } 499