1//
2// StickIt
3// File: jwindow.cpp
4// Joystick window.
5// Sampel code used in "Getting a Grip on BJoystick" by Eric Shepherd
6//
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11#include <OS.h>
12
13#include <Application.h>
14#include <Joystick.h>
15#include <String.h>
16#include <StringView.h>
17#include <Box.h>
18#include <ListView.h>
19#include <ScrollView.h>
20#include <ListItem.h>
21
22#define SPACE 10
23
24#include "JoystickWindow.h"
25
26#define SELECTED  'sele'
27#define INVOKE    'invo'
28
29#include "StickItWindow.h"
30
31StickItWindow::StickItWindow(BRect frame)
32	: BWindow(frame, "StickIt", B_TITLED_WINDOW, 0)
33{
34	frame = Bounds();
35	frame.InsetBy(5, 5);
36	BBox* box = new BBox(frame, NULL, B_FOLLOW_ALL_SIDES);
37
38
39	// Allocate object
40	BView* view = new BView(Bounds(), "", B_FOLLOW_ALL_SIDES, 0);
41	view->SetViewColor(216, 216, 216);
42	view->SetLowColor(216, 216, 216);
43
44	BRect rectString = BRect(frame.left, frame.top-10, frame.right -30, 30);
45	BStringView* stringview1 = new BStringView(rectString,"StringView1",
46		"This list, lists action that StickIt makes.");
47
48	BRect rect = BRect(rectString.left, rectString.bottom + SPACE,
49		rectString.right, rectString.bottom + SPACE + 200);
50	fListView1 = new BListView(rect,"ListView1");
51
52	rectString = BRect(rect.left, rect.bottom + SPACE, rect.right,
53		rect.bottom + SPACE + 15);
54	BStringView* stringview2 = new BStringView(rectString,"StringView2",
55		"Choose Joystick below if any exists");
56
57	rect = BRect(rectString.left, rectString.bottom + SPACE, rectString.right,
58		Bounds().bottom -20);
59	fListView2 = new BListView(rect,"ListView2");
60	fListView2->SetSelectionMessage(new BMessage(SELECTED));
61	fListView2->SetInvocationMessage(new BMessage(INVOKE));
62
63
64	// Adding object
65	box->AddChild(new BScrollView("fListView1", fListView1,
66		B_FOLLOW_LEFT_RIGHT, 0, false, true));
67
68	box->AddChild(new BScrollView("fListView2", fListView2,
69		B_FOLLOW_ALL_SIDES, 0, false, true));
70
71	box->AddChild(stringview1);
72	box->AddChild(stringview2);
73	view->AddChild(box);
74	AddChild(view);
75
76	fJoystick = new BJoystick;
77	PickJoystick(fJoystick);
78}
79
80
81bool
82StickItWindow::QuitRequested(void) {
83	be_app->PostMessage(B_QUIT_REQUESTED);
84	return true;
85}
86
87
88void
89StickItWindow::MessageReceived(BMessage *message)
90{
91//	message->PrintToStream();
92	switch(message->what)
93	{
94		case INVOKE:
95		case SELECTED:
96		{
97			int32 id = fListView2->CurrentSelection();
98			BString temp1;
99			if (id > -1) {
100				char devName[B_OS_NAME_LENGTH];
101				status_t err = fJoystick->GetDeviceName(id, devName);
102				if (err == B_OK) {
103					temp1 << "BJoystick::GetDeviceName(), id = " << id
104						<< ", name = " << devName;
105					temp1 = AddToList(fListView1, temp1.String());
106					BJoystick *joystick = new BJoystick();
107					err = joystick->Open(devName);
108					if (err != B_ERROR) {
109						temp1 = AddToList(fListView1, "BJoystick::Open()");
110						temp1 = AddToList(fListView1, "BJoystick::Open()");
111						if (joystick->IsCalibrationEnabled())
112							temp1 = AddToList(fListView1,
113								"BJoystick::IsCalibrationEnabled() - True");
114						else
115							temp1 = AddToList(fListView1,
116								"BJoystick::IsCalibrationEnabled() - False");
117						JoystickWindow *window = new(std::nothrow)
118							JoystickWindow(devName, joystick,
119							BRect(50, 50, 405, 350));
120						if (window != NULL)
121							window->Show();
122					} else
123						AddToList(fListView1,
124							"No controller connected on that port. Try again.");
125				} else
126					AddToList(fListView1, "Can't use that stick.  Try again.");
127			}
128		break;
129		}
130		default:
131			BWindow::MessageReceived(message);
132			break;
133	}
134}
135
136
137BString
138StickItWindow::AddToList(BListView *bl, const char * str)
139{
140	bl->AddItem(new BStringItem(str));
141	return BString ("");
142}
143
144
145// PickJoystick
146// Present a list of all game controllers and let the user choose the one to
147// use.  This will configure the "stick" object for that controller.
148void
149StickItWindow::PickJoystick(BJoystick *stick)
150{
151	int32 numDevices = stick->CountDevices();
152	BString temp1("BJoystick::CountDevices()");
153	temp1 << ", Num = " << numDevices;
154	temp1 = AddToList(fListView1, temp1.String());
155	status_t err = B_ERROR;
156	if (numDevices) {
157		temp1 << "There are " << numDevices
158			<< " Joysticks device types available";
159		temp1 = AddToList(fListView1, temp1.String());
160		for (int32 i = 0; i < numDevices; i++) {
161			char devName[B_OS_NAME_LENGTH];
162			err = stick->GetDeviceName(i, devName);
163			temp1 << "BJoystick::GetDeviceName(), id = " << i << ", name = "
164				<< devName;
165			temp1 = AddToList(fListView1, temp1.String());
166			if (err == B_OK) {
167				err = stick->Open(devName);
168				temp1 = AddToList(fListView1, "BJoystick::Open()");
169				int32 count = stick->CountSticks();
170				temp1 << "BJoystick::CountSticks(), number of sticks = "
171					<< count;
172				temp1 = AddToList(fListView1, temp1.String());
173
174				count = stick->CountAxes();
175				temp1 << "BJoystick::CountAxes(), number of Axes = "
176					<< count;
177				temp1 = AddToList(fListView1, temp1.String());
178
179				count = stick->CountButtons();
180				temp1 << "BJoystick::CountButtons(), number of Buttons = "
181					<< count;
182				temp1 = AddToList(fListView1, temp1.String());
183
184				count = stick->CountHats();
185				temp1 << "BJoystick::CountHats(), number of Hats = "
186					<< count;
187				temp1 = AddToList(fListView1, temp1.String());
188
189				count = stick->CountDevices();
190				temp1 << "BJoystick::CountDevices(), number of Devices = "
191					<< count;
192				temp1 = AddToList(fListView1, temp1.String());
193
194				if (err != B_ERROR) {
195					BString name;
196					err = stick->GetControllerModule(&name);
197					temp1 << "BJoystick::GetControllerModule(), name = "
198						<< name;
199					temp1 = AddToList(fListView1, temp1.String());
200
201					if (name == "Legacy") {
202						bool b = stick->EnterEnhancedMode();
203						if (b) {
204							temp1 << "BJoystick::EnterEnhancedMode(), OK";
205							temp1 = AddToList(fListView1, temp1.String());
206						} else {
207							temp1 << "BJoystick::EnterEnhancedMode(), Not OK";
208							temp1 = AddToList(fListView1, temp1.String());
209						}
210					}
211
212					err = stick->GetControllerName(&name);
213					temp1 << "BJoystick::GetControllerName(), name = " << name;
214					temp1 = AddToList(fListView1, temp1.String());
215					if (err == B_OK) {
216						stick->Close();
217						temp1 = AddToList(fListView1, "BJoystick::Close()");
218						temp1 << i+1 << " " << name.String();
219						temp1 = AddToList(fListView2, temp1.String());
220					} else {
221						temp1 << "Error = " << strerror(err);
222						temp1 = AddToList(fListView1, temp1.String());
223						temp1 << "*** Can't get name of controller "
224							<< devName;
225						temp1 = AddToList(fListView1, temp1.String());
226					}
227				} else {
228					temp1 << "Error = " << strerror(err) << "err nr = " << err;
229					temp1 = AddToList(fListView1, temp1.String());
230					temp1 << "No controller on " << devName;
231					temp1 = AddToList(fListView1, temp1.String());
232				}
233			} else {
234				temp1 << "Error = " << strerror(err);
235				temp1 = AddToList(fListView1, temp1.String());
236				temp1 << "*** Error while reading controller list.";
237				temp1 = AddToList(fListView1, temp1.String());
238			}
239		}
240	} else {
241		temp1 << "Error = " << strerror(err);
242		temp1 = AddToList(fListView1, temp1.String());
243		temp1 = AddToList(fListView1, "*** No game ports detected.");
244	}
245}
246