Add L2 and R2

This commit is contained in:
Florian Märkl 2019-07-05 10:22:24 +02:00
commit 00a4870714
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
5 changed files with 57 additions and 7 deletions

View file

@ -49,6 +49,13 @@ typedef enum chiaki_controller_button_t
#define CHIAKI_CONTROLLER_BUTTONS_COUNT 16
typedef enum chiaki_controller_analog_button_t
{
// must not overlap with ChiakiControllerButton
CHIAKI_CONTROLLER_ANALOG_BUTTON_L2 = (1 << 16),
CHIAKI_CONTROLLER_ANALOG_BUTTON_R2 = (1 << 17)
} ChiakiControllerAnalogButton;
typedef struct chiaki_controller_state_t
{
/**
@ -70,6 +77,8 @@ CHIAKI_EXPORT void chiaki_controller_state_set_idle(ChiakiControllerState *state
static inline bool chiaki_controller_state_equals(ChiakiControllerState *a, ChiakiControllerState *b)
{
return a->buttons == b->buttons
&& a->l2_state == b->l2_state
&& a->r2_state == b->r2_state
&& a->left_x == b->left_x
&& a->left_y == b->left_y
&& a->right_x == b->right_x

View file

@ -53,9 +53,10 @@ typedef struct chiaki_feedback_history_event_t
} ChiakiFeedbackHistoryEvent;
/**
* @param button ChiakiControllerButton or ChiakiControllerAnalogButton
* @param state 0x0 for not pressed, 0xff for pressed, intermediate values for analog triggers
*/
CHIAKI_EXPORT ChiakiErrorCode chiaki_feedback_history_event_set_button(ChiakiFeedbackHistoryEvent *event, ChiakiControllerButton button, uint8_t state);
CHIAKI_EXPORT ChiakiErrorCode chiaki_feedback_history_event_set_button(ChiakiFeedbackHistoryEvent *event, uint64_t button, uint8_t state);
/**
* Ring buffer of ChiakiFeedbackHistoryEvent

View file

@ -46,7 +46,7 @@ CHIAKI_EXPORT void chiaki_feedback_state_format(uint8_t *buf, ChiakiFeedbackStat
*((uint16_t *)(buf + 0x17)) = htons((uint16_t)state->right_y);
}
CHIAKI_EXPORT ChiakiErrorCode chiaki_feedback_history_event_set_button(ChiakiFeedbackHistoryEvent *event, ChiakiControllerButton button, uint8_t state)
CHIAKI_EXPORT ChiakiErrorCode chiaki_feedback_history_event_set_button(ChiakiFeedbackHistoryEvent *event, uint64_t button, uint8_t state)
{
// some buttons use a third byte for the state, some don't
event->buf[0] = 0x80;
@ -60,10 +60,10 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_feedback_history_event_set_button(ChiakiFee
event->buf[1] = 0x89;
break;
case CHIAKI_CONTROLLER_BUTTON_BOX:
event->buf[1] = 0x8a;
event->buf[1] = 0x8b;
break;
case CHIAKI_CONTROLLER_BUTTON_PYRAMID:
event->buf[1] = 0x8b;
event->buf[1] = 0x8a;
break;
case CHIAKI_CONTROLLER_BUTTON_DPAD_LEFT:
event->buf[1] = 0x82;
@ -83,6 +83,12 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_feedback_history_event_set_button(ChiakiFee
case CHIAKI_CONTROLLER_BUTTON_R1:
event->buf[1] = 0x85;
break;
case CHIAKI_CONTROLLER_ANALOG_BUTTON_L2:
event->buf[1] = 0x86;
break;
case CHIAKI_CONTROLLER_ANALOG_BUTTON_R2:
event->buf[1] = 0x87;
break;
case CHIAKI_CONTROLLER_BUTTON_L3:
event->buf[1] = state ? 0xaf : 0x8f;
return CHIAKI_ERR_SUCCESS;

View file

@ -116,15 +116,19 @@ static void feedback_sender_send_state(ChiakiFeedbackSender *feedback_sender)
static bool controller_state_equals_for_feedback_history(ChiakiControllerState *a, ChiakiControllerState *b)
{
return a->buttons == b->buttons;
return a->buttons == b->buttons
&& a->l2_state == b->l2_state
&& a->r2_state == b->r2_state;
}
static void feedback_sender_send_history(ChiakiFeedbackSender *feedback_sender)
{
// TODO: Is it legal to have more than one new event per packet?
size_t new_events_count = 0;
uint64_t buttons_prev = feedback_sender->controller_state_prev.buttons;
uint64_t buttons_now = feedback_sender->controller_state.buttons;
ChiakiControllerState *state_prev = &feedback_sender->controller_state_prev;
ChiakiControllerState *state_now = &feedback_sender->controller_state;
uint64_t buttons_prev = state_prev->buttons;
uint64_t buttons_now = state_now->buttons;
for(uint8_t i=0; i<CHIAKI_CONTROLLER_BUTTONS_COUNT; i++)
{
uint64_t button_id = 1 << i;
@ -144,6 +148,32 @@ static void feedback_sender_send_history(ChiakiFeedbackSender *feedback_sender)
}
}
if(state_prev->l2_state != state_now->l2_state)
{
ChiakiFeedbackHistoryEvent event;
ChiakiErrorCode err = chiaki_feedback_history_event_set_button(&event, CHIAKI_CONTROLLER_ANALOG_BUTTON_L2, state_now->l2_state);
if(err == CHIAKI_ERR_SUCCESS)
{
chiaki_feedback_history_buffer_push(&feedback_sender->history_buf, &event);
new_events_count++;
}
else
CHIAKI_LOGE(feedback_sender->log, "Feedback Sender failed to format button history event for L2\n");
}
if(state_prev->r2_state != state_now->r2_state)
{
ChiakiFeedbackHistoryEvent event;
ChiakiErrorCode err = chiaki_feedback_history_event_set_button(&event, CHIAKI_CONTROLLER_ANALOG_BUTTON_R2, state_now->r2_state);
if(err == CHIAKI_ERR_SUCCESS)
{
chiaki_feedback_history_buffer_push(&feedback_sender->history_buf, &event);
new_events_count++;
}
else
CHIAKI_LOGE(feedback_sender->log, "Feedback Sender failed to format button history event for R2\n");
}
if(!new_events_count) // TODO: also send on timeout sometimes?
return;