mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 18:57:07 -07:00
Add L2 and R2
This commit is contained in:
parent
e37ac7bc77
commit
00a4870714
5 changed files with 57 additions and 7 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue