Jelajahi Sumber

Add InputDevice::connected()

Daniele Bartolini 10 tahun lalu
induk
melakukan
f3b08db3a1

+ 14 - 1
src/core/os_event_queue.h

@@ -73,11 +73,13 @@ struct OsJoypadEvent
 	enum Enum
 	{
 		BUTTON,
-		AXIS
+		AXIS,
+		CONNECTED
 	};
 
 	OsJoypadEvent::Enum type;
 	uint8_t index;
+	bool connected;
 	uint8_t button;
 	bool pressed;
 	float x;
@@ -196,6 +198,17 @@ struct OsEventQueue
 		push_event(ev);
 	}
 
+	void push_joypad_event(uint8_t i, bool connected)
+	{
+		OsEvent ev;
+		ev.type = OsEvent::JOYPAD;
+		ev.joypad.type = OsJoypadEvent::CONNECTED;
+		ev.joypad.index = i;
+		ev.joypad.connected = connected;
+
+		push_event(ev);
+	}
+
 	void push_joypad_event(uint8_t i, uint8_t button, bool pressed)
 	{
 		OsEvent ev;

+ 10 - 0
src/input/input_device.cpp

@@ -15,6 +15,11 @@ const char* InputDevice::name() const
 	return _name;
 }
 
+bool InputDevice::connected() const
+{
+	return _connected;
+}
+
 uint8_t InputDevice::num_buttons() const
 {
 	return _num_buttons;
@@ -53,6 +58,11 @@ Vector3 InputDevice::axis(uint8_t i) const
 	return _axis[i];
 }
 
+void InputDevice::set_connected(bool connected)
+{
+	_connected = connected;
+}
+
 void InputDevice::set_button_state(uint8_t i, bool state)
 {
 	CE_ASSERT(i < _num_buttons, "Index out of bounds");

+ 6 - 0
src/input/input_device.h

@@ -16,6 +16,9 @@ struct InputDevice
 	/// Returns the name of the input device.
 	const char* name() const;
 
+	/// Returns whether the input device is connected and functioning.
+	bool connected() const;
+
 	/// Returns the number of buttons of the input device.
 	uint8_t num_buttons() const;
 
@@ -37,12 +40,15 @@ struct InputDevice
 	/// Returns the value of the axis @a i.
 	Vector3 axis(uint8_t i) const;
 
+	void set_connected(bool connected);
+
 	void set_button_state(uint8_t i, bool state);
 
 	void set_axis(uint8_t i, const Vector3& value);
 
 	void update();
 
+	bool _connected;
 	uint8_t _num_buttons;
 	uint8_t _num_axes;
 	uint8_t _last_button;

+ 5 - 0
src/input/input_manager.cpp

@@ -23,6 +23,10 @@ InputManager::InputManager()
 
 	for (uint8_t i = 0; i < CROWN_MAX_JOYPADS; ++i)
 		_joypad[i] = create_input_device("Joypad", JoypadButton::COUNT, JoypadAxis::COUNT);
+
+	_keyboard->set_connected(true);
+	_mouse->set_connected(true);
+	_touch->set_connected(true);
 }
 
 InputManager::~InputManager()
@@ -45,6 +49,7 @@ InputDevice* InputManager::create_input_device(const char* name, uint8_t num_but
 
 	InputDevice* id = (InputDevice*)default_allocator().allocate(size);
 
+	id->_connected = false;
 	id->_num_buttons = num_buttons;
 	id->_num_axes = num_axes;
 	id->_last_button = 0;

+ 21 - 0
src/lua/lua_input.cpp

@@ -19,6 +19,13 @@ static int input_device_name(lua_State* L, InputDevice& id)
 	return 1;
 }
 
+static int input_device_connected(lua_State* L, InputDevice& id)
+{
+	LuaStack stack(L);
+	stack.push_bool(id.connected());
+	return 1;
+}
+
 static int input_device_num_buttons(lua_State* L, InputDevice& id)
 {
 	LuaStack stack(L);
@@ -83,6 +90,7 @@ static int input_device_axis(lua_State* L, InputDevice& id)
 	{ return input_device_##name(L, *device()->input_manager()->joypad(index)); }
 
 KEYBOARD(name)
+KEYBOARD(connected)
 KEYBOARD(num_buttons)
 KEYBOARD(num_axes)
 KEYBOARD(pressed)
@@ -92,6 +100,7 @@ KEYBOARD(any_released)
 // KEYBOARD(axis) // Keyboard has no axis
 
 MOUSE(name)
+MOUSE(connected)
 MOUSE(num_buttons)
 MOUSE(num_axes)
 MOUSE(pressed)
@@ -101,6 +110,7 @@ MOUSE(any_released)
 MOUSE(axis)
 
 TOUCH(name)
+TOUCH(connected)
 TOUCH(num_buttons)
 TOUCH(num_axes)
 TOUCH(pressed)
@@ -110,6 +120,7 @@ TOUCH(any_released)
 TOUCH(axis)
 
 JOYPAD(0, name)
+JOYPAD(0, connected)
 JOYPAD(0, num_buttons)
 JOYPAD(0, num_axes)
 JOYPAD(0, pressed)
@@ -119,6 +130,7 @@ JOYPAD(0, any_released)
 JOYPAD(0, axis)
 
 JOYPAD(1, name)
+JOYPAD(1, connected)
 JOYPAD(1, num_buttons)
 JOYPAD(1, num_axes)
 JOYPAD(1, pressed)
@@ -128,6 +140,7 @@ JOYPAD(1, any_released)
 JOYPAD(1, axis)
 
 JOYPAD(2, name)
+JOYPAD(2, connected)
 JOYPAD(2, num_buttons)
 JOYPAD(2, num_axes)
 JOYPAD(2, pressed)
@@ -137,6 +150,7 @@ JOYPAD(2, any_released)
 JOYPAD(2, axis)
 
 JOYPAD(3, name)
+JOYPAD(3, connected)
 JOYPAD(3, num_buttons)
 JOYPAD(3, num_axes)
 JOYPAD(3, pressed)
@@ -148,6 +162,7 @@ JOYPAD(3, axis)
 void load_input(LuaEnvironment& env)
 {
 	env.load_module_function("Keyboard", "name",         KEYBOARD_FN(name));
+	env.load_module_function("Keyboard", "connected",    KEYBOARD_FN(connected));
 	env.load_module_function("Keyboard", "num_buttons",  KEYBOARD_FN(num_buttons));
 	env.load_module_function("Keyboard", "num_axes",     KEYBOARD_FN(num_axes));
 	env.load_module_function("Keyboard", "pressed",      KEYBOARD_FN(pressed));
@@ -236,6 +251,7 @@ void load_input(LuaEnvironment& env)
 	env.load_module_enum("Keyboard", "Z",         KeyboardButton::Z);
 
 	env.load_module_function("Mouse", "name",         MOUSE_FN(name));
+	env.load_module_function("Mouse", "connected",    MOUSE_FN(connected));
 	env.load_module_function("Mouse", "num_buttons",  MOUSE_FN(num_buttons));
 	env.load_module_function("Mouse", "num_axes",     MOUSE_FN(num_axes));
 	env.load_module_function("Mouse", "pressed",      MOUSE_FN(pressed));
@@ -249,6 +265,7 @@ void load_input(LuaEnvironment& env)
 	env.load_module_enum("Mouse", "RIGHT",  MouseButton::RIGHT);
 
 	env.load_module_function("Touch", "name",         TOUCH_FN(name));
+	env.load_module_function("Touch", "connected",    TOUCH_FN(connected));
 	env.load_module_function("Touch", "num_buttons",  TOUCH_FN(num_buttons));
 	env.load_module_function("Touch", "num_axes",     TOUCH_FN(num_axes));
 	env.load_module_function("Touch", "pressed",      TOUCH_FN(pressed));
@@ -258,6 +275,7 @@ void load_input(LuaEnvironment& env)
 	env.load_module_function("Touch", "axis",         TOUCH_FN(axis));
 
 	env.load_module_function("Pad1", "name",         JOYPAD_FN(0, name));
+	env.load_module_function("Pad1", "connected",    JOYPAD_FN(0, connected));
 	env.load_module_function("Pad1", "num_buttons",  JOYPAD_FN(0, num_buttons));
 	env.load_module_function("Pad1", "num_axes",     JOYPAD_FN(0, num_axes));
 	env.load_module_function("Pad1", "pressed",      JOYPAD_FN(0, pressed));
@@ -267,6 +285,7 @@ void load_input(LuaEnvironment& env)
 	env.load_module_function("Pad1", "axis",         JOYPAD_FN(0, axis));
 
 	env.load_module_function("Pad2", "name",         JOYPAD_FN(1, name));
+	env.load_module_function("Pad2", "connected",    JOYPAD_FN(1, connected));
 	env.load_module_function("Pad2", "num_buttons",  JOYPAD_FN(1, num_buttons));
 	env.load_module_function("Pad2", "num_axes",     JOYPAD_FN(1, num_axes));
 	env.load_module_function("Pad2", "pressed",      JOYPAD_FN(1, pressed));
@@ -276,6 +295,7 @@ void load_input(LuaEnvironment& env)
 	env.load_module_function("Pad2", "axis",         JOYPAD_FN(1, axis));
 
 	env.load_module_function("Pad3", "name",         JOYPAD_FN(2, name));
+	env.load_module_function("Pad3", "connected",    JOYPAD_FN(2, connected));
 	env.load_module_function("Pad3", "num_buttons",  JOYPAD_FN(2, num_buttons));
 	env.load_module_function("Pad3", "num_axes",     JOYPAD_FN(2, num_axes));
 	env.load_module_function("Pad3", "pressed",      JOYPAD_FN(2, pressed));
@@ -285,6 +305,7 @@ void load_input(LuaEnvironment& env)
 	env.load_module_function("Pad3", "axis",         JOYPAD_FN(2, axis));
 
 	env.load_module_function("Pad4", "name",         JOYPAD_FN(3, name));
+	env.load_module_function("Pad4", "connected",    JOYPAD_FN(3, connected));
 	env.load_module_function("Pad4", "num_buttons",  JOYPAD_FN(3, num_buttons));
 	env.load_module_function("Pad4", "num_axes",     JOYPAD_FN(3, num_axes));
 	env.load_module_function("Pad4", "pressed",      JOYPAD_FN(3, pressed));

+ 3 - 0
src/main/main.cpp

@@ -75,6 +75,9 @@ bool process_events()
 				const OsJoypadEvent& ev = event.joypad;
 				switch (ev.type)
 				{
+					case OsJoypadEvent::CONNECTED:
+						im->joypad(ev.index)->set_connected(ev.connected);
+						break;
 					case OsJoypadEvent::BUTTON:
 						im->joypad(ev.index)->set_button_state(ev.button, ev.pressed);
 						break;