mirror of https://github.com/nirenjan/libx52.git
Add C++ wrapper to libx52
This change adds a C++ libx52 object class, and an associated object-oriented model in which to program the X52 joystick. This is added in an attempt to simplify future integration with SWIG and other languages.feature/cpp-library
parent
1d51429f10
commit
82b861e001
|
@ -7,6 +7,7 @@
|
|||
AC_INIT([x52pro-linux], [0.2.0-0], [nirenjan@gmail.com])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CC
|
||||
AM_PROG_AR
|
||||
AM_PATH_PYTHON([2.6])
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
lib_LTLIBRARIES = libx52.la
|
||||
lib_LTLIBRARIES = libx52.la libx52c++.la
|
||||
|
||||
# Core libx52 library
|
||||
# This library handles the USB communication between the host and the X52
|
||||
|
@ -15,9 +15,12 @@ libx52_la_SOURCES = x52_control.c x52_core.c x52_date_time.c x52_mfd_led.c \
|
|||
libx52_la_CFLAGS = @LIBUSB_CFLAGS@
|
||||
libx52_la_LDFLAGS = -version-info 3:0:1 @LIBUSB_LIBS@
|
||||
|
||||
libx52c___la_SOURCES = x52_class.cpp
|
||||
libx52c___la_LIBADD = libx52.la
|
||||
|
||||
# Header files that need to be copied
|
||||
x52includedir = $(includedir)/x52pro
|
||||
x52include_HEADERS = libx52.h
|
||||
x52include_HEADERS = libx52.h libx52.hpp
|
||||
|
||||
# Extra files that need to be in the distribution
|
||||
EXTRA_DIST = libx52.h x52_commands.h x52_common.h README.md
|
||||
EXTRA_DIST = libx52.h libx52.hpp x52_commands.h x52_common.h README.md
|
||||
|
|
|
@ -0,0 +1,272 @@
|
|||
/*
|
||||
* Saitek X52 Pro MFD & LED driver
|
||||
*
|
||||
* Copyright (C) 2012-2018 Nirenjan Krishnan (nirenjan@nirenjan.org)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation, version 2.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LIBX52CLASS_H
|
||||
#define LIBX52CLASS_H
|
||||
|
||||
#include "libx52.h"
|
||||
|
||||
/**
|
||||
* @brief libx52 class
|
||||
*/
|
||||
class libx52 {
|
||||
private:
|
||||
libx52_device *dev;
|
||||
int errcode;
|
||||
|
||||
public:
|
||||
/** Constructor for libx52 class */
|
||||
libx52();
|
||||
|
||||
/** Destructor for libx52 class */
|
||||
~libx52();
|
||||
|
||||
/**
|
||||
* @brief Set the text on an MFD line
|
||||
*
|
||||
* The Multifunction display (MFD) supports 3 lines of up to 16 characters.
|
||||
* This function will set the text into the internal data structures.
|
||||
*
|
||||
* \p text must be a pointer to an array of bytes, each byte represents a
|
||||
* code point on the MFD's internal character map. \p length is the length
|
||||
* of this array.
|
||||
*
|
||||
* \p line must be \b 0, \b 1, or \b 2 and refers to the first, second or
|
||||
* third line of the MFD respectively.
|
||||
*
|
||||
* @par Limitations
|
||||
* This function can only store a maximum of 16 characters per line. Any
|
||||
* additional characters are silently discarded.
|
||||
*
|
||||
* @param[in] line Line to be updated (0, 1 or 2)
|
||||
* @param[in] text Pointer to the text string. The text must be mapped
|
||||
* to the code page of the X52 display.
|
||||
* @param[in] length Length of the text to display
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if either \p x52
|
||||
* is invalid, or \p line is outside the accepted range.
|
||||
*/
|
||||
int set_text(uint8_t line, const char *text, uint8_t length);
|
||||
|
||||
/**
|
||||
* @brief Set the LED state
|
||||
*
|
||||
* The X52 pro has several LEDs that can be individually controlled. This
|
||||
* function allows you to set the state of each LED in the internal data
|
||||
* structures.
|
||||
*
|
||||
* Note that the LEDs referred to by \ref LIBX52_LED_FIRE and \ref
|
||||
* LIBX52_LED_THROTTLE support only the states \ref LIBX52_LED_STATE_OFF
|
||||
* and \ref LIBX52_LED_STATE_ON. The remaining LEDs support all the states
|
||||
* with the exception of \ref LIBX52_LED_STATE_ON.
|
||||
*
|
||||
* @param[in] led LED identifier (refer \ref libx52_led_id)
|
||||
* @param[in] state State of the LED (refer \ref libx52_led_state)
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if the \p x52
|
||||
* parameter is not valid, and \ref LIBX52_ERROR_NOT_SUPPORTED if the \p
|
||||
* led and \p state combination is not a supported one. The API also
|
||||
* returns \ref LIBX52_ERROR_NOT_SUPPORTED if the probed joystick is not an
|
||||
* X52 Pro, but the non-Pro X52 variant.
|
||||
*/
|
||||
int set_led_state(libx52_led_id led, libx52_led_state state);
|
||||
|
||||
/**
|
||||
* @brief Set the clock
|
||||
*
|
||||
* This function sets the primary clock's date and time with the specified
|
||||
* Unix time value. \p time can be obtained from \c time(2). \p local
|
||||
* controls whether the primary clock displays local time or GMT.
|
||||
*
|
||||
* If this function is called again within the same minute as calculated by
|
||||
* \c localtime(3) or \c gmtime(3), it will return \ref
|
||||
* LIBX52_ERROR_TRY_AGAIN, as it does not require any updates to be written
|
||||
* to the joystick. However, if the call changes the timezone from local
|
||||
* time to GMT or vice-versa, then the function will return 0, since it
|
||||
* requires a write to the device to update the clock with the new
|
||||
* timezone.
|
||||
*
|
||||
* The secondary and tertiary clocks are driven off the primary clock and
|
||||
* set using \ref libx52_set_clock_timezone.
|
||||
*
|
||||
* @param[in] time Time value from \c time(3)
|
||||
* @param[in] local 0 for GM time, non-zero for localtime
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_TRY_AGAIN if no change from
|
||||
* previous time, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not valid.
|
||||
*/
|
||||
int set_clock(time_t time, int local);
|
||||
|
||||
/**
|
||||
* @brief Set the timezone for the secondary and tertiary clocks.
|
||||
*
|
||||
* The X52 Pro has a total of 3 clock displays. The secondary and tertiary
|
||||
* clocks are controlled as an offset from the primary clock in minutes.
|
||||
* However, for convenience, the X52 library calculates this offset
|
||||
* internally and only requires you to set the timezone as the number of
|
||||
* minutes offset from GMT. \p offset is limited to +/- 1440 minutes, and
|
||||
* any offset outside this range will result in a return value of \ref
|
||||
* LIBX52_ERROR_OUT_OF_RANGE
|
||||
*
|
||||
* @param[in] clock \ref libx52_clock_id, cannot be \ref
|
||||
* LIBX52_CLOCK_1
|
||||
* @param[in] offset Offset in minutes from GMT (east is positive, west
|
||||
* is negative)
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is
|
||||
* invalid, \ref LIBX52_ERROR_NOT_SUPPORTED if \p clock is \ref
|
||||
* LIBX52_CLOCK_1, \ref LIBX52_ERROR_OUT_OF_RANGE if \p offset is more than
|
||||
* +/- 24 hours.
|
||||
*/
|
||||
int set_clock_timezone(libx52_clock_id clock, int offset);
|
||||
|
||||
/**
|
||||
* @brief Set whether the clock is displayed in 12 hour or 24 hour format.
|
||||
*
|
||||
* The clocks on the X52 Pro MFD are all displayed as HH:MM, but can be set
|
||||
* to display it in 12-hour (AM/PM) or 24-hour format. The default format
|
||||
* if not specified is 12-hour.
|
||||
*
|
||||
* @par Limitations
|
||||
* The hardware has a limitation that it cannot display 12:00 am in 12 hour
|
||||
* mode - instead it will display as 00:00 am
|
||||
*
|
||||
* @param[in] clock \ref libx52_clock_id
|
||||
* @param[in] format \ref libx52_clock_format
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid, or if either of \p clock or \p format are outside their
|
||||
* respective ranges.
|
||||
*/
|
||||
int set_clock_format(libx52_clock_id clock, libx52_clock_format format);
|
||||
|
||||
/**
|
||||
* @brief Set the hour and minute on clock 1
|
||||
*
|
||||
* This is a raw API which can be used for manual control if the user
|
||||
* so desires, however, it will not update the timezone or the date
|
||||
* values.
|
||||
*
|
||||
* @param[in] hour Hour to display
|
||||
* @param[in] minute Minute to display
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int set_time(uint8_t hour, uint8_t minute);
|
||||
|
||||
/**
|
||||
* @brief Set the date
|
||||
*
|
||||
* This is a raw API which can be used for manual control if the user
|
||||
* so desires, however, it will not update the timezone or the time values.
|
||||
*
|
||||
* @param[in] dd Day to display
|
||||
* @param[in] mm Month to display
|
||||
* @param[in] yy Year to display
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int set_date(uint8_t dd, uint8_t mm, uint8_t yy);
|
||||
|
||||
/**
|
||||
* @brief Set the date format for the MFD date display
|
||||
*
|
||||
* If not set, the date format defaults to DD-MM-YY
|
||||
*
|
||||
* @param[in] format \ref libx52_date_format
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int set_date_format(libx52_date_format format);
|
||||
|
||||
/**
|
||||
* @brief Set the MFD or LED brightness
|
||||
*
|
||||
* The brightness of the MFD display and the button LEDs can be controlled
|
||||
* individually. \p brightness should be a value between 0 and 128. While
|
||||
* the library does not fail on values higher than 128, the effect may not
|
||||
* be what is intended.
|
||||
*
|
||||
* @param[in] mfd 0 for LED brightness, 1 for MFD brightness
|
||||
* @param[in] brightness Brightness level to set
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid.
|
||||
*/
|
||||
int set_brightness(uint8_t mfd, uint16_t brightness);
|
||||
|
||||
/**
|
||||
* @brief Set the state of the shift indicator
|
||||
*
|
||||
* The X52 Pro MFD has a single shift indicator that indicates when the
|
||||
* "shift" button is pressed.
|
||||
*
|
||||
* @param[in] state 0 for off, 1 for on
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int set_shift(uint8_t state);
|
||||
|
||||
/**
|
||||
* @brief Set the blinking state
|
||||
*
|
||||
* The X52 Pro has a "blink" state where it blinks the clutch and hat LEDs.
|
||||
*
|
||||
* @param[in] state 0 for off, 1 for on
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int set_blink(uint8_t state);
|
||||
|
||||
/**
|
||||
* @brief Update the X52
|
||||
*
|
||||
* All the libx52_set functions only set the internal data structures, but
|
||||
* do not actually write anything to the joystick. This function writes the
|
||||
* saved data to the joystick and updates the internal data structures as
|
||||
* necessary.
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_USB_FAILURE on failure
|
||||
*/
|
||||
int update();
|
||||
|
||||
/**
|
||||
* @brief Write a raw vendor control packet
|
||||
*
|
||||
* This function sends the control packet immediately to the hardware,
|
||||
* without having to wait for a call to \ref libx52_update.
|
||||
*
|
||||
* This can be used to debug issues seen on the hardware, however, it is \b
|
||||
* NOT recommended for use by end users, as it can potentially damage the
|
||||
* hardware.
|
||||
*
|
||||
* @param[in] index wIndex in the USB packet
|
||||
* @param[in] value wValue in the USB packet
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_USB_FAILURE on failure
|
||||
*/
|
||||
int vendor_command(uint16_t index, uint16_t value);
|
||||
|
||||
/**
|
||||
* @brief Return a string representation of the error code
|
||||
*
|
||||
* @returns Pointer to a NULL terminated string describing the error.
|
||||
* Returned pointer must not be freed.
|
||||
*/
|
||||
char * strerror();
|
||||
};
|
||||
|
||||
#endif /* !defined LIBX52CLASS_H */
|
|
@ -0,0 +1,334 @@
|
|||
/*
|
||||
* Saitek X52 Pro MFD & LED driver
|
||||
*
|
||||
* Copyright (C) 2012-2018 Nirenjan Krishnan (nirenjan@nirenjan.org)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation, version 2.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdexcept>
|
||||
#include "libx52.hpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/** Constructor for libx52 class */
|
||||
libx52::libx52()
|
||||
{
|
||||
dev = NULL;
|
||||
libx52_device *tmpdev = NULL;
|
||||
|
||||
errcode = libx52_init(&tmpdev);
|
||||
|
||||
if (errcode != LIBX52_SUCCESS) {
|
||||
throw std::runtime_error(libx52_strerror((libx52_error_code)errcode));
|
||||
}
|
||||
|
||||
dev = tmpdev;
|
||||
}
|
||||
|
||||
/** Destructor for libx52 class */
|
||||
libx52::~libx52()
|
||||
{
|
||||
if (dev) {
|
||||
libx52_exit(dev);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the text on an MFD line
|
||||
*
|
||||
* The Multifunction display (MFD) supports 3 lines of up to 16 characters.
|
||||
* This function will set the text into the internal data structures.
|
||||
*
|
||||
* \p text must be a pointer to an array of bytes, each byte represents a
|
||||
* code point on the MFD's internal character map. \p length is the length
|
||||
* of this array.
|
||||
*
|
||||
* \p line must be \b 0, \b 1, or \b 2 and refers to the first, second or
|
||||
* third line of the MFD respectively.
|
||||
*
|
||||
* @par Limitations
|
||||
* This function can only store a maximum of 16 characters per line. Any
|
||||
* additional characters are silently discarded.
|
||||
*
|
||||
* @param[in] line Line to be updated (0, 1 or 2)
|
||||
* @param[in] text Pointer to the text string. The text must be mapped
|
||||
* to the code page of the X52 display.
|
||||
* @param[in] length Length of the text to display
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if either \p x52
|
||||
* is invalid, or \p line is outside the accepted range.
|
||||
*/
|
||||
int libx52::set_text(uint8_t line, const char *text, uint8_t length)
|
||||
{
|
||||
errcode = libx52_set_text(dev, line, text, length);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the LED state
|
||||
*
|
||||
* The X52 pro has several LEDs that can be individually controlled. This
|
||||
* function allows you to set the state of each LED in the internal data
|
||||
* structures.
|
||||
*
|
||||
* Note that the LEDs referred to by \ref LIBX52_LED_FIRE and \ref
|
||||
* LIBX52_LED_THROTTLE support only the states \ref LIBX52_LED_STATE_OFF
|
||||
* and \ref LIBX52_LED_STATE_ON. The remaining LEDs support all the states
|
||||
* with the exception of \ref LIBX52_LED_STATE_ON.
|
||||
*
|
||||
* @param[in] led LED identifier (refer \ref libx52_led_id)
|
||||
* @param[in] state State of the LED (refer \ref libx52_led_state)
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if the \p x52
|
||||
* parameter is not valid, and \ref LIBX52_ERROR_NOT_SUPPORTED if the \p
|
||||
* led and \p state combination is not a supported one. The API also
|
||||
* returns \ref LIBX52_ERROR_NOT_SUPPORTED if the probed joystick is not an
|
||||
* X52 Pro, but the non-Pro X52 variant.
|
||||
*/
|
||||
int libx52::set_led_state(libx52_led_id led, libx52_led_state state)
|
||||
{
|
||||
errcode = libx52_set_led_state(dev, led, state);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the clock
|
||||
*
|
||||
* This function sets the primary clock's date and time with the specified
|
||||
* Unix time value. \p time can be obtained from \c time(2). \p local
|
||||
* controls whether the primary clock displays local time or GMT.
|
||||
*
|
||||
* If this function is called again within the same minute as calculated by
|
||||
* \c localtime(3) or \c gmtime(3), it will return \ref
|
||||
* LIBX52_ERROR_TRY_AGAIN, as it does not require any updates to be written
|
||||
* to the joystick. However, if the call changes the timezone from local
|
||||
* time to GMT or vice-versa, then the function will return 0, since it
|
||||
* requires a write to the device to update the clock with the new
|
||||
* timezone.
|
||||
*
|
||||
* The secondary and tertiary clocks are driven off the primary clock and
|
||||
* set using \ref libx52_set_clock_timezone.
|
||||
*
|
||||
* @param[in] time Time value from \c time(3)
|
||||
* @param[in] local 0 for GM time, non-zero for localtime
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_TRY_AGAIN if no change from
|
||||
* previous time, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not valid.
|
||||
*/
|
||||
int libx52::set_clock(time_t time, int local)
|
||||
{
|
||||
errcode = libx52_set_clock(dev, time, local);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the timezone for the secondary and tertiary clocks.
|
||||
*
|
||||
* The X52 Pro has a total of 3 clock displays. The secondary and tertiary
|
||||
* clocks are controlled as an offset from the primary clock in minutes.
|
||||
* However, for convenience, the X52 library calculates this offset
|
||||
* internally and only requires you to set the timezone as the number of
|
||||
* minutes offset from GMT. \p offset is limited to +/- 1440 minutes, and
|
||||
* any offset outside this range will result in a return value of \ref
|
||||
* LIBX52_ERROR_OUT_OF_RANGE
|
||||
*
|
||||
* @param[in] clock \ref libx52_clock_id, cannot be \ref
|
||||
* LIBX52_CLOCK_1
|
||||
* @param[in] offset Offset in minutes from GMT (east is positive, west
|
||||
* is negative)
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is
|
||||
* invalid, \ref LIBX52_ERROR_NOT_SUPPORTED if \p clock is \ref
|
||||
* LIBX52_CLOCK_1, \ref LIBX52_ERROR_OUT_OF_RANGE if \p offset is more than
|
||||
* +/- 24 hours.
|
||||
*/
|
||||
int libx52::set_clock_timezone(libx52_clock_id clock, int offset)
|
||||
{
|
||||
errcode = libx52_set_clock_timezone(dev, clock, offset);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set whether the clock is displayed in 12 hour or 24 hour format.
|
||||
*
|
||||
* The clocks on the X52 Pro MFD are all displayed as HH:MM, but can be set
|
||||
* to display it in 12-hour (AM/PM) or 24-hour format. The default format
|
||||
* if not specified is 12-hour.
|
||||
*
|
||||
* @par Limitations
|
||||
* The hardware has a limitation that it cannot display 12:00 am in 12 hour
|
||||
* mode - instead it will display as 00:00 am
|
||||
*
|
||||
* @param[in] clock \ref libx52_clock_id
|
||||
* @param[in] format \ref libx52_clock_format
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid, or if either of \p clock or \p format are outside their
|
||||
* respective ranges.
|
||||
*/
|
||||
int libx52::set_clock_format(libx52_clock_id clock, libx52_clock_format format)
|
||||
{
|
||||
errcode = libx52_set_clock_format(dev, clock, format);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the hour and minute on clock 1
|
||||
*
|
||||
* This is a raw API which can be used for manual control if the user
|
||||
* so desires, however, it will not update the timezone or the date
|
||||
* values.
|
||||
*
|
||||
* @param[in] hour Hour to display
|
||||
* @param[in] minute Minute to display
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int libx52::set_time(uint8_t hour, uint8_t minute)
|
||||
{
|
||||
errcode = libx52_set_time(dev, hour, minute);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the date
|
||||
*
|
||||
* This is a raw API which can be used for manual control if the user
|
||||
* so desires, however, it will not update the timezone or the time values.
|
||||
*
|
||||
* @param[in] dd Day to display
|
||||
* @param[in] mm Month to display
|
||||
* @param[in] yy Year to display
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int libx52::set_date(uint8_t dd, uint8_t mm, uint8_t yy)
|
||||
{
|
||||
errcode = libx52_set_date(dev, dd, mm, yy);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the date format for the MFD date display
|
||||
*
|
||||
* If not set, the date format defaults to DD-MM-YY
|
||||
*
|
||||
* @param[in] format \ref libx52_date_format
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int libx52::set_date_format(libx52_date_format format)
|
||||
{
|
||||
errcode = libx52_set_date_format(dev, format);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the MFD or LED brightness
|
||||
*
|
||||
* The brightness of the MFD display and the button LEDs can be controlled
|
||||
* individually. \p brightness should be a value between 0 and 128. While
|
||||
* the library does not fail on values higher than 128, the effect may not
|
||||
* be what is intended.
|
||||
*
|
||||
* @param[in] mfd 0 for LED brightness, 1 for MFD brightness
|
||||
* @param[in] brightness Brightness level to set
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid.
|
||||
*/
|
||||
int libx52::set_brightness(uint8_t mfd, uint16_t brightness)
|
||||
{
|
||||
errcode = libx52_set_brightness(dev, mfd, brightness);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the state of the shift indicator
|
||||
*
|
||||
* The X52 Pro MFD has a single shift indicator that indicates when the
|
||||
* "shift" button is pressed.
|
||||
*
|
||||
* @param[in] state 0 for off, 1 for on
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int libx52::set_shift(uint8_t state)
|
||||
{
|
||||
errcode = libx52_set_shift(dev, state);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the blinking state
|
||||
*
|
||||
* The X52 Pro has a "blink" state where it blinks the clutch and hat LEDs.
|
||||
*
|
||||
* @param[in] state 0 for off, 1 for on
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_INVALID_PARAM if \p x52 is not
|
||||
* valid
|
||||
*/
|
||||
int libx52::set_blink(uint8_t state)
|
||||
{
|
||||
errcode = libx52_set_blink(dev, state);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Update the X52
|
||||
*
|
||||
* All the libx52_set functions only set the internal data structures, but
|
||||
* do not actually write anything to the joystick. This function writes the
|
||||
* saved data to the joystick and updates the internal data structures as
|
||||
* necessary.
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_USB_FAILURE on failure
|
||||
*/
|
||||
int libx52::update()
|
||||
{
|
||||
errcode = libx52_update(dev);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Write a raw vendor control packet
|
||||
*
|
||||
* This function sends the control packet immediately to the hardware,
|
||||
* without having to wait for a call to \ref libx52_update.
|
||||
*
|
||||
* This can be used to debug issues seen on the hardware, however, it is \b
|
||||
* NOT recommended for use by end users, as it can potentially damage the
|
||||
* hardware.
|
||||
*
|
||||
* @param[in] index wIndex in the USB packet
|
||||
* @param[in] value wValue in the USB packet
|
||||
*
|
||||
* @returns 0 on success, \ref LIBX52_ERROR_USB_FAILURE on failure
|
||||
*/
|
||||
int libx52::vendor_command(uint16_t index, uint16_t value)
|
||||
{
|
||||
errcode = libx52_vendor_command(dev, index, value);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return a string representation of the error code
|
||||
*
|
||||
* @param[in] error Error code returned by libx52 function
|
||||
*
|
||||
* @returns Pointer to a NULL terminated string describing the error.
|
||||
* Returned pointer must not be freed.
|
||||
*/
|
||||
char * libx52::strerror()
|
||||
{
|
||||
return libx52_strerror((libx52_error_code)errcode);
|
||||
}
|
Loading…
Reference in New Issue