When the data channel assignment is set to both, the all the outputs are sent to both USB and Bluetooth channels. If the channel is currently operating in a mode that supports that kind of output, it will be transmitted. If the channel mode does not support the output, it will be ignored.
Here are some examples of "Both":
- USB in mode 3 (XBox 360) and Bluetooth in mouse and keyboard combo device mode.
- Game controller outputs will go to USB and mouse & keyboard will go to Bluetooth
- This is a good combination for games that don't work well with ViGEmBus or the native Quadstick controller.
- USB in mode 0 and plugged into a wall charger or battery and Bluetooth in mouse and keyboard combo
- USB outputs are idle and mouse & keyboard will go to Bluetooth
- USB in mode 0 and plugged into a PC and Bluetooth not paired to anything
- USB outputs all go to the PC and Bluetooth is idle.
- USB in mode 0 and plugged into a PC and Bluetooth in mouse and keyboard combo
- USB outputs, including mouse & keyboard, all go to the PC and mouse & keyboard also go to the Bluetooth. This could cause double inputs for mouse and keyboard.
The Bluetooth device mode can only be set at power up as part of the Prefs.csv file. It cannot changed in a configuration file Preferences sheet.
Here is the struct for the PS3 controller portion of USB mode 0 (PS3 compatible):
typedef struct {
//BYTE constant; // unknown content
// switches, nibble 0
unsigned int square : 1;
unsigned int X : 1;
unsigned int O : 1;
unsigned int triangle : 1;
// nibble 1
unsigned int L1 : 1;
unsigned int R1 : 1;
unsigned int L2 : 1;
unsigned int R2 : 1;
// nibble 2
unsigned int select : 1;
unsigned int start : 1;
unsigned int L3 : 1;
unsigned int R3 : 1;
// nibble 3
unsigned int PS3 : 1;
unsigned int padding : 3;
unsigned int D_pad : 4;
unsigned int padding2: 4;
// joysticks
uint8_t left_X;
uint8_t left_Y;
uint8_t right_X;
uint8_t right_Y;
// axes alternate report values range 0..255
uint8_t press_D_E;
uint8_t press_D_W;
uint8_t press_D_N;
uint8_t press_D_S;
uint8_t press_triangle;
uint8_t press_O;
uint8_t press_X;
uint8_t press_square;
uint8_t press_L1;
uint8_t press_R1;
uint8_t press_L2;
uint8_t press_R2;
// fixed data
uint16_t AccelerometerX; // 512
uint16_t AccelerometerY; // 416
uint16_t AccelerometerZ; // 512
uint16_t GyrometerX; // 512
} ATTR_PACKED USB_PS3_Report_Data_t;
On a PS3 controller, each button also had an analog value (0-255) for the force applied to the button. Later controllers dropped that feature and few PS3 games used it.