1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
|
/*
* Copyright (C) 2014-2018 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/
#pragma once
#ifndef C_API_ADDONINSTANCE_PERIPHERAL_H
#define C_API_ADDONINSTANCE_PERIPHERAL_H
#include "../addon_base.h"
/* indicates a joystick has no preference for port number */
#define NO_PORT_REQUESTED (-1)
/* joystick's driver button/hat/axis index is unknown */
#define DRIVER_INDEX_UNKNOWN (-1)
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_General_PERIPHERAL_ERROR enum PERIPHERAL_ERROR
/// @ingroup cpp_kodi_addon_peripheral_Defs_General
/// @brief **Peripheral add-on error codes**\n
/// Used as return values on most peripheral related functions.
///
/// In this way, a peripheral instance signals errors in its processing and,
/// under certain conditions, allows Kodi to make corrections.
///
///@{
typedef enum PERIPHERAL_ERROR
{
/// @brief __0__ : No error occurred
PERIPHERAL_NO_ERROR = 0,
/// @brief __-1__ : An unknown error occurred
PERIPHERAL_ERROR_UNKNOWN = -1,
/// @brief __-2__ : The command failed
PERIPHERAL_ERROR_FAILED = -2,
/// @brief __-3__ : The parameters of the method are invalid for this operation
PERIPHERAL_ERROR_INVALID_PARAMETERS = -3,
/// @brief __-4__ : The method that the frontend called is not implemented
PERIPHERAL_ERROR_NOT_IMPLEMENTED = -4,
/// @brief __-5__ : No peripherals are connected
PERIPHERAL_ERROR_NOT_CONNECTED = -5,
/// @brief __-6__ : Peripherals are connected, but command was interrupted
PERIPHERAL_ERROR_CONNECTION_FAILED = -6,
} PERIPHERAL_ERROR;
///@}
//----------------------------------------------------------------------------
// @name Peripheral types
//{
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Peripheral_PERIPHERAL_TYPE enum PERIPHERAL_TYPE
/// @ingroup cpp_kodi_addon_peripheral_Defs_Peripheral
/// @brief **Peripheral types**\n
/// Types used to identify wanted peripheral.
///@{
typedef enum PERIPHERAL_TYPE
{
/// @brief Type declared as unknown.
PERIPHERAL_TYPE_UNKNOWN,
/// @brief Type declared as joystick.
PERIPHERAL_TYPE_JOYSTICK,
/// @brief Type declared as keyboard.
PERIPHERAL_TYPE_KEYBOARD,
} PERIPHERAL_TYPE;
///@}
//----------------------------------------------------------------------------
/*!
* @brief Information shared between peripherals
*/
typedef struct PERIPHERAL_INFO
{
PERIPHERAL_TYPE type; /*!< type of peripheral */
char* name; /*!< name of peripheral */
uint16_t vendor_id; /*!< vendor ID of peripheral, 0x0000 if unknown */
uint16_t product_id; /*!< product ID of peripheral, 0x0000 if unknown */
unsigned int index; /*!< the order in which the add-on identified this peripheral */
} ATTRIBUTE_PACKED PERIPHERAL_INFO;
/*!
* @brief Peripheral add-on capabilities.
*/
typedef struct PERIPHERAL_CAPABILITIES
{
bool provides_joysticks; /*!< true if the add-on provides joysticks */
bool provides_joystick_rumble;
bool provides_joystick_power_off;
bool provides_buttonmaps; /*!< true if the add-on provides button maps */
} ATTRIBUTE_PACKED PERIPHERAL_CAPABILITIES;
//}
// @name Event types
//{
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Event_PERIPHERAL_EVENT_TYPE enum PERIPHERAL_EVENT_TYPE
/// @ingroup cpp_kodi_addon_peripheral_Defs_Event
/// @brief **Event types**\n
/// Types of events that can be sent and received.
///@{
typedef enum PERIPHERAL_EVENT_TYPE
{
/// @brief unknown event
PERIPHERAL_EVENT_TYPE_NONE,
/// @brief state changed for joystick driver button
PERIPHERAL_EVENT_TYPE_DRIVER_BUTTON,
/// @brief state changed for joystick driver hat
PERIPHERAL_EVENT_TYPE_DRIVER_HAT,
/// @brief state changed for joystick driver axis
PERIPHERAL_EVENT_TYPE_DRIVER_AXIS,
/// @brief set the state for joystick rumble motor
PERIPHERAL_EVENT_TYPE_SET_MOTOR,
} PERIPHERAL_EVENT_TYPE;
///@}
//----------------------------------------------------------------------------
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Event_JOYSTICK_STATE_BUTTON enum JOYSTICK_STATE_BUTTON
/// @ingroup cpp_kodi_addon_peripheral_Defs_Event
/// @brief **State button**\n
/// States a button can have
///@{
typedef enum JOYSTICK_STATE_BUTTON
{
/// @brief button is released
JOYSTICK_STATE_BUTTON_UNPRESSED = 0x0,
/// @brief button is pressed
JOYSTICK_STATE_BUTTON_PRESSED = 0x1,
} JOYSTICK_STATE_BUTTON;
///@}
//----------------------------------------------------------------------------
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Event_JOYSTICK_STATE_HAT enum JOYSTICK_STATE_HAT
/// @ingroup cpp_kodi_addon_peripheral_Defs_Event
/// @brief **State hat**\n
/// States a D-pad (also called a hat) can have
///@{
typedef enum JOYSTICK_STATE_HAT
{
/// @brief no directions are pressed
JOYSTICK_STATE_HAT_UNPRESSED = 0x0,
/// @brief only left is pressed
JOYSTICK_STATE_HAT_LEFT = 0x1,
/// @brief only right is pressed
JOYSTICK_STATE_HAT_RIGHT = 0x2,
/// @brief only up is pressed
JOYSTICK_STATE_HAT_UP = 0x4,
/// @brief only down is pressed
JOYSTICK_STATE_HAT_DOWN = 0x8,
/// @brief left and up is pressed
JOYSTICK_STATE_HAT_LEFT_UP = JOYSTICK_STATE_HAT_LEFT | JOYSTICK_STATE_HAT_UP,
/// @brief left and down is pressed
JOYSTICK_STATE_HAT_LEFT_DOWN = JOYSTICK_STATE_HAT_LEFT | JOYSTICK_STATE_HAT_DOWN,
/// @brief right and up is pressed
JOYSTICK_STATE_HAT_RIGHT_UP = JOYSTICK_STATE_HAT_RIGHT | JOYSTICK_STATE_HAT_UP,
/// @brief right and down is pressed
JOYSTICK_STATE_HAT_RIGHT_DOWN = JOYSTICK_STATE_HAT_RIGHT | JOYSTICK_STATE_HAT_DOWN,
} JOYSTICK_STATE_HAT;
///@}
//----------------------------------------------------------------------------
//============================================================================
/// @ingroup cpp_kodi_addon_peripheral_Defs_Event
/// @brief Axis value in the closed interval [-1.0, 1.0]
///
/// The axis state uses the XInput coordinate system:
/// - Negative values signify down or to the left
/// - Positive values signify up or to the right
///
typedef float JOYSTICK_STATE_AXIS;
//----------------------------------------------------------------------------
//============================================================================
/// @ingroup cpp_kodi_addon_peripheral_Defs_Event
/// @brief Motor value in the closed interval [0.0, 1.0]
typedef float JOYSTICK_STATE_MOTOR;
//----------------------------------------------------------------------------
/*!
* @brief Event information
*/
typedef struct PERIPHERAL_EVENT
{
/*! @brief Index of the peripheral handling/receiving the event */
unsigned int peripheral_index;
/*! @brief Type of the event used to determine which enum field to access below */
PERIPHERAL_EVENT_TYPE type;
/*! @brief The index of the event source */
unsigned int driver_index;
JOYSTICK_STATE_BUTTON driver_button_state;
JOYSTICK_STATE_HAT driver_hat_state;
JOYSTICK_STATE_AXIS driver_axis_state;
JOYSTICK_STATE_MOTOR motor_state;
} ATTRIBUTE_PACKED PERIPHERAL_EVENT;
//}
// @name Joystick types
//{
/*!
* @brief Info specific to joystick peripherals
*/
typedef struct JOYSTICK_INFO
{
PERIPHERAL_INFO peripheral; /*!< @brief peripheral info for this joystick */
char* provider; /*!< @brief name of the driver or interface providing the joystick */
int requested_port; /*!< @brief requested port number (such as for 360 controllers), or NO_PORT_REQUESTED */
unsigned int button_count; /*!< @brief number of buttons reported by the driver */
unsigned int hat_count; /*!< @brief number of hats reported by the driver */
unsigned int axis_count; /*!< @brief number of axes reported by the driver */
unsigned int motor_count; /*!< @brief number of motors reported by the driver */
bool supports_poweroff; /*!< @brief whether the joystick supports being powered off */
} ATTRIBUTE_PACKED JOYSTICK_INFO;
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_PRIMITIVE_TYPE enum JOYSTICK_DRIVER_PRIMITIVE_TYPE
/// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick
/// @brief **Driver primitive type**\n
/// Driver input primitives
///
/// Mapping lower-level driver values to higher-level controller features is
/// non-injective; two triggers can share a single axis.
///
/// To handle this, driver values are subdivided into "primitives" that map
/// injectively to higher-level features.
///
///@{
typedef enum JOYSTICK_DRIVER_PRIMITIVE_TYPE
{
/// @brief Driver input primitive type unknown
JOYSTICK_DRIVER_PRIMITIVE_TYPE_UNKNOWN,
/// @brief Driver input primitive type button
JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON,
/// @brief Driver input primitive type hat direction
JOYSTICK_DRIVER_PRIMITIVE_TYPE_HAT_DIRECTION,
/// @brief Driver input primitive type semiaxis
JOYSTICK_DRIVER_PRIMITIVE_TYPE_SEMIAXIS,
/// @brief Driver input primitive type motor
JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR,
/// @brief Driver input primitive type key
JOYSTICK_DRIVER_PRIMITIVE_TYPE_KEY,
/// @brief Driver input primitive type mouse button
JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOUSE_BUTTON,
/// @brief Driver input primitive type relative pointer direction
JOYSTICK_DRIVER_PRIMITIVE_TYPE_RELPOINTER_DIRECTION,
} JOYSTICK_DRIVER_PRIMITIVE_TYPE;
///@}
//----------------------------------------------------------------------------
/*!
* @brief Button primitive
*/
typedef struct JOYSTICK_DRIVER_BUTTON
{
int index;
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_BUTTON;
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_HAT_DIRECTION enum JOYSTICK_DRIVER_HAT_DIRECTION
/// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick
/// @brief **Driver direction**\n
/// Hat direction.
///@{
typedef enum JOYSTICK_DRIVER_HAT_DIRECTION
{
/// @brief Driver hat unknown
JOYSTICK_DRIVER_HAT_UNKNOWN,
/// @brief Driver hat left
JOYSTICK_DRIVER_HAT_LEFT,
/// @brief Driver hat right
JOYSTICK_DRIVER_HAT_RIGHT,
/// @brief Driver hat up
JOYSTICK_DRIVER_HAT_UP,
/// @brief Driver hat down
JOYSTICK_DRIVER_HAT_DOWN,
} JOYSTICK_DRIVER_HAT_DIRECTION;
///@}
//----------------------------------------------------------------------------
/*!
* @brief Hat direction primitive
*/
typedef struct JOYSTICK_DRIVER_HAT
{
int index;
JOYSTICK_DRIVER_HAT_DIRECTION direction;
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_HAT;
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_SEMIAXIS_DIRECTION enum JOYSTICK_DRIVER_SEMIAXIS_DIRECTION
/// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick
/// @brief **Driver direction**\n
/// Semiaxis direction.
///@{
typedef enum JOYSTICK_DRIVER_SEMIAXIS_DIRECTION
{
/// @brief negative half of the axis
JOYSTICK_DRIVER_SEMIAXIS_NEGATIVE = -1,
/// @brief unknown direction
JOYSTICK_DRIVER_SEMIAXIS_UNKNOWN = 0,
/// @brief positive half of the axis
JOYSTICK_DRIVER_SEMIAXIS_POSITIVE = 1,
} JOYSTICK_DRIVER_SEMIAXIS_DIRECTION;
///@}
//----------------------------------------------------------------------------
/*!
* @brief Semiaxis primitive
*/
typedef struct JOYSTICK_DRIVER_SEMIAXIS
{
int index;
int center;
JOYSTICK_DRIVER_SEMIAXIS_DIRECTION direction;
unsigned int range;
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_SEMIAXIS;
/*!
* @brief Motor primitive
*/
typedef struct JOYSTICK_DRIVER_MOTOR
{
int index;
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_MOTOR;
/*!
* @brief Keyboard key primitive
*/
typedef struct JOYSTICK_DRIVER_KEY
{
char keycode[16];
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_KEY;
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_MOUSE_INDEX enum JOYSTICK_DRIVER_MOUSE_INDEX
/// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick
/// @brief **Buttons**\n
/// Mouse buttons.
///@{
typedef enum JOYSTICK_DRIVER_MOUSE_INDEX
{
/// @brief Mouse index unknown
JOYSTICK_DRIVER_MOUSE_INDEX_UNKNOWN,
/// @brief Mouse index left
JOYSTICK_DRIVER_MOUSE_INDEX_LEFT,
/// @brief Mouse index right
JOYSTICK_DRIVER_MOUSE_INDEX_RIGHT,
/// @brief Mouse index middle
JOYSTICK_DRIVER_MOUSE_INDEX_MIDDLE,
/// @brief Mouse index button 4
JOYSTICK_DRIVER_MOUSE_INDEX_BUTTON4,
/// @brief Mouse index button 5
JOYSTICK_DRIVER_MOUSE_INDEX_BUTTON5,
/// @brief Mouse index wheel up
JOYSTICK_DRIVER_MOUSE_INDEX_WHEEL_UP,
/// @brief Mouse index wheel down
JOYSTICK_DRIVER_MOUSE_INDEX_WHEEL_DOWN,
/// @brief Mouse index horizontal wheel left
JOYSTICK_DRIVER_MOUSE_INDEX_HORIZ_WHEEL_LEFT,
/// @brief Mouse index horizontal wheel right
JOYSTICK_DRIVER_MOUSE_INDEX_HORIZ_WHEEL_RIGHT,
} JOYSTICK_DRIVER_MOUSE_INDEX;
///@}
//----------------------------------------------------------------------------
/*!
* @brief Mouse button primitive
*/
typedef struct JOYSTICK_DRIVER_MOUSE_BUTTON
{
JOYSTICK_DRIVER_MOUSE_INDEX button;
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_MOUSE_BUTTON;
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_RELPOINTER_DIRECTION enum JOYSTICK_DRIVER_RELPOINTER_DIRECTION
/// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick
/// @brief **Pointer direction**\n
/// Relative pointer direction
///@{
typedef enum JOYSTICK_DRIVER_RELPOINTER_DIRECTION
{
/// @brief Relative pointer direction unknown
JOYSTICK_DRIVER_RELPOINTER_UNKNOWN,
/// @brief Relative pointer direction left
JOYSTICK_DRIVER_RELPOINTER_LEFT,
/// @brief Relative pointer direction right
JOYSTICK_DRIVER_RELPOINTER_RIGHT,
/// @brief Relative pointer direction up
JOYSTICK_DRIVER_RELPOINTER_UP,
/// @brief Relative pointer direction down
JOYSTICK_DRIVER_RELPOINTER_DOWN,
} JOYSTICK_DRIVER_RELPOINTER_DIRECTION;
///@}
//----------------------------------------------------------------------------
/*!
* @brief Relative pointer direction primitive
*/
typedef struct JOYSTICK_DRIVER_RELPOINTER
{
JOYSTICK_DRIVER_RELPOINTER_DIRECTION direction;
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_RELPOINTER;
/*!
* @brief Driver primitive struct
*/
typedef struct JOYSTICK_DRIVER_PRIMITIVE
{
JOYSTICK_DRIVER_PRIMITIVE_TYPE type;
union
{
struct JOYSTICK_DRIVER_BUTTON button;
struct JOYSTICK_DRIVER_HAT hat;
struct JOYSTICK_DRIVER_SEMIAXIS semiaxis;
struct JOYSTICK_DRIVER_MOTOR motor;
struct JOYSTICK_DRIVER_KEY key;
struct JOYSTICK_DRIVER_MOUSE_BUTTON mouse;
struct JOYSTICK_DRIVER_RELPOINTER relpointer;
};
} ATTRIBUTE_PACKED JOYSTICK_DRIVER_PRIMITIVE;
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_FEATURE_TYPE enum JOYSTICK_FEATURE_TYPE
/// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick
/// @brief **Feature type**\n
/// Controller feature.
///
/// Controller features are an abstraction over driver values. Each feature
/// maps to one or more driver primitives.
///
///@{
typedef enum JOYSTICK_FEATURE_TYPE
{
/// @brief Unknown type
JOYSTICK_FEATURE_TYPE_UNKNOWN,
/// @brief Type scalar
JOYSTICK_FEATURE_TYPE_SCALAR,
/// @brief Type analog stick
JOYSTICK_FEATURE_TYPE_ANALOG_STICK,
/// @brief Type accelerometer
JOYSTICK_FEATURE_TYPE_ACCELEROMETER,
/// @brief Type motor
JOYSTICK_FEATURE_TYPE_MOTOR,
/// @brief Type relative pointer
JOYSTICK_FEATURE_TYPE_RELPOINTER,
/// @brief Type absolut pointer
JOYSTICK_FEATURE_TYPE_ABSPOINTER,
/// @brief Type wheel
JOYSTICK_FEATURE_TYPE_WHEEL,
/// @brief Type throttle
JOYSTICK_FEATURE_TYPE_THROTTLE,
/// @brief Type key
JOYSTICK_FEATURE_TYPE_KEY,
} JOYSTICK_FEATURE_TYPE;
///@}
//----------------------------------------------------------------------------
//============================================================================
/// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_FEATURE_PRIMITIVE enum JOYSTICK_FEATURE_PRIMITIVE
/// @ingroup cpp_kodi_addon_peripheral_Defs_Joystick
/// @brief **Feature primitives**\n
/// Indices used to access a feature's driver primitives.
///
///@{
typedef enum JOYSTICK_FEATURE_PRIMITIVE
{
/// @brief Scalar feature (a button, hat direction or semiaxis)
JOYSTICK_SCALAR_PRIMITIVE = 0,
/// @brief Analog stick up
JOYSTICK_ANALOG_STICK_UP = 0,
/// @brief Analog stick down
JOYSTICK_ANALOG_STICK_DOWN = 1,
/// @brief Analog stick right
JOYSTICK_ANALOG_STICK_RIGHT = 2,
/// @brief Analog stick left
JOYSTICK_ANALOG_STICK_LEFT = 3,
/// @brief Accelerometer X
JOYSTICK_ACCELEROMETER_POSITIVE_X = 0,
/// @brief Accelerometer Y
JOYSTICK_ACCELEROMETER_POSITIVE_Y = 1,
/// @brief Accelerometer Z
JOYSTICK_ACCELEROMETER_POSITIVE_Z = 2,
/// @brief Motor
JOYSTICK_MOTOR_PRIMITIVE = 0,
/// @brief Wheel left
JOYSTICK_WHEEL_LEFT = 0,
/// @brief Wheel right
JOYSTICK_WHEEL_RIGHT = 1,
/// @brief Throttle up
JOYSTICK_THROTTLE_UP = 0,
/// @brief Throttle down
JOYSTICK_THROTTLE_DOWN = 1,
/// @brief Key
JOYSTICK_KEY_PRIMITIVE = 0,
/// @brief Mouse button
JOYSTICK_MOUSE_BUTTON = 0,
/// @brief Relative pointer direction up
JOYSTICK_RELPOINTER_UP = 0,
/// @brief Relative pointer direction down
JOYSTICK_RELPOINTER_DOWN = 1,
/// @brief Relative pointer direction right
JOYSTICK_RELPOINTER_RIGHT = 2,
/// @brief Relative pointer direction left
JOYSTICK_RELPOINTER_LEFT = 3,
/// @brief Maximum number of primitives
JOYSTICK_PRIMITIVE_MAX = 4,
} JOYSTICK_FEATURE_PRIMITIVE;
///@}
//----------------------------------------------------------------------------
/*!
* @brief Mapping between higher-level controller feature and its driver primitives
*/
typedef struct JOYSTICK_FEATURE
{
char* name;
JOYSTICK_FEATURE_TYPE type;
struct JOYSTICK_DRIVER_PRIMITIVE primitives[JOYSTICK_PRIMITIVE_MAX];
} ATTRIBUTE_PACKED JOYSTICK_FEATURE;
//}
typedef struct AddonProps_Peripheral
{
const char* user_path; /*!< @brief path to the user profile */
const char* addon_path; /*!< @brief path to this add-on */
} ATTRIBUTE_PACKED AddonProps_Peripheral;
struct AddonInstance_Peripheral;
typedef struct AddonToKodiFuncTable_Peripheral
{
KODI_HANDLE kodiInstance;
void (*trigger_scan)(void* kodiInstance);
void (*refresh_button_maps)(void* kodiInstance,
const char* device_name,
const char* controller_id);
unsigned int (*feature_count)(void* kodiInstance,
const char* controller_id,
JOYSTICK_FEATURE_TYPE type);
JOYSTICK_FEATURE_TYPE(*feature_type)
(void* kodiInstance, const char* controller_id, const char* feature_name);
} AddonToKodiFuncTable_Peripheral;
//! @todo Mouse, light gun, multitouch
typedef struct KodiToAddonFuncTable_Peripheral
{
KODI_HANDLE addonInstance;
void(__cdecl* get_capabilities)(const struct AddonInstance_Peripheral* addonInstance,
struct PERIPHERAL_CAPABILITIES* capabilities);
PERIPHERAL_ERROR(__cdecl* perform_device_scan)
(const struct AddonInstance_Peripheral* addonInstance,
unsigned int* peripheral_count,
struct PERIPHERAL_INFO** scan_results);
void(__cdecl* free_scan_results)(const struct AddonInstance_Peripheral* addonInstance,
unsigned int peripheral_count,
struct PERIPHERAL_INFO* scan_results);
PERIPHERAL_ERROR(__cdecl* get_events)
(const struct AddonInstance_Peripheral* addonInstance,
unsigned int* event_count,
struct PERIPHERAL_EVENT** events);
void(__cdecl* free_events)(const struct AddonInstance_Peripheral* addonInstance,
unsigned int event_count,
struct PERIPHERAL_EVENT* events);
bool(__cdecl* send_event)(const struct AddonInstance_Peripheral* addonInstance,
const struct PERIPHERAL_EVENT* event);
/// @name Joystick operations
///{
PERIPHERAL_ERROR(__cdecl* get_joystick_info)
(const struct AddonInstance_Peripheral* addonInstance,
unsigned int index,
struct JOYSTICK_INFO* info);
void(__cdecl* free_joystick_info)(const struct AddonInstance_Peripheral* addonInstance,
struct JOYSTICK_INFO* info);
PERIPHERAL_ERROR(__cdecl* get_features)
(const struct AddonInstance_Peripheral* addonInstance,
const struct JOYSTICK_INFO* joystick,
const char* controller_id,
unsigned int* feature_count,
struct JOYSTICK_FEATURE** features);
void(__cdecl* free_features)(const struct AddonInstance_Peripheral* addonInstance,
unsigned int feature_count,
struct JOYSTICK_FEATURE* features);
PERIPHERAL_ERROR(__cdecl* map_features)
(const struct AddonInstance_Peripheral* addonInstance,
const struct JOYSTICK_INFO* joystick,
const char* controller_id,
unsigned int feature_count,
const struct JOYSTICK_FEATURE* features);
PERIPHERAL_ERROR(__cdecl* get_ignored_primitives)
(const struct AddonInstance_Peripheral* addonInstance,
const struct JOYSTICK_INFO* joystick,
unsigned int* feature_count,
struct JOYSTICK_DRIVER_PRIMITIVE** primitives);
void(__cdecl* free_primitives)(const struct AddonInstance_Peripheral* addonInstance,
unsigned int,
struct JOYSTICK_DRIVER_PRIMITIVE* primitives);
PERIPHERAL_ERROR(__cdecl* set_ignored_primitives)
(const struct AddonInstance_Peripheral* addonInstance,
const struct JOYSTICK_INFO* joystick,
unsigned int primitive_count,
const struct JOYSTICK_DRIVER_PRIMITIVE* primitives);
void(__cdecl* save_button_map)(const struct AddonInstance_Peripheral* addonInstance,
const struct JOYSTICK_INFO* joystick);
void(__cdecl* revert_button_map)(const struct AddonInstance_Peripheral* addonInstance,
const struct JOYSTICK_INFO* joystick);
void(__cdecl* reset_button_map)(const struct AddonInstance_Peripheral* addonInstance,
const struct JOYSTICK_INFO* joystick,
const char* controller_id);
void(__cdecl* power_off_joystick)(const struct AddonInstance_Peripheral* addonInstance,
unsigned int index);
///}
} KodiToAddonFuncTable_Peripheral;
typedef struct AddonInstance_Peripheral
{
struct AddonProps_Peripheral* props;
struct AddonToKodiFuncTable_Peripheral* toKodi;
struct KodiToAddonFuncTable_Peripheral* toAddon;
} AddonInstance_Peripheral;
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
#endif /* !C_API_ADDONINSTANCE_PERIPHERAL_H */
|