xref: /haiku/src/apps/serialconnect/SerialWindow.cpp (revision 2e6ca31c5a5985bb35a9f25145f2e2303746426e)
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