⛏️ index : haiku.git

/*
 * Copyright 2008-2011 Michael Lotz <mmlr@mlotz.ch>
 * Distributed under the terms of the MIT license.
 */
#ifndef USB_JOYSTICK_PROTOCOL_HANDLER_H
#define USB_JOYSTICK_PROTOCOL_HANDLER_H


#include <InterfaceDefs.h>

#include "ProtocolHandler.h"

#include <joystick_driver.h>
#include <lock.h>


class HIDCollection;
class HIDReportItem;


class JoystickProtocolHandler : public ProtocolHandler {
public:
									JoystickProtocolHandler(HIDReport &report);
	virtual							~JoystickProtocolHandler();

	static	void					AddHandlers(HIDDevice &device,
										HIDCollection &collection,
										ProtocolHandler *&handlerList);

	virtual	status_t				Open(uint32 flags, uint32 *cookie);
	virtual	status_t				Close(uint32 *cookie);

	virtual	status_t				Read(uint32 *cookie, off_t position,
										void *buffer, size_t *numBytes);
	virtual	status_t				Write(uint32 *cookie, off_t position,
										const void *buffer, size_t *numBytes);

	virtual	status_t				Control(uint32 *cookie, uint32 op,
										void *buffer, size_t length);

private:
	static	int32					_UpdateThread(void *data);
			status_t				_Update();

			HIDReport &				fReport;

			uint32					fAxisCount;
			HIDReportItem **		fAxis;
			uint32					fHatCount;
			HIDReportItem **		fHats;
			uint32					fButtonCount;
			uint32					fMaxButton;
			HIDReportItem **		fButtons;

			joystick_module_info 	fJoystickModuleInfo;
			variable_joystick		fCurrentValues;

			uint32					fOpenCount;
			mutex					fUpdateLock;
			thread_id				fUpdateThread;
};

#endif // USB_JOYSTICK_PROTOCOL_HANDLER_H