Skip to content

Commit 70ae07b

Browse files
authored
Merge pull request #2252 from rsolorzanomsft/hid-lighting
Add HID Lighting and Illumination functionality
2 parents d37d25d + a3d9eb4 commit 70ae07b

File tree

2 files changed

+238
-30
lines changed

2 files changed

+238
-30
lines changed

src/class/hid/hid.h

+66-30
Original file line numberDiff line numberDiff line change
@@ -697,32 +697,33 @@ enum {
697697

698698
/// HID Usage Table - Table 1: Usage Page Summary
699699
enum {
700-
HID_USAGE_PAGE_DESKTOP = 0x01,
701-
HID_USAGE_PAGE_SIMULATE = 0x02,
702-
HID_USAGE_PAGE_VIRTUAL_REALITY = 0x03,
703-
HID_USAGE_PAGE_SPORT = 0x04,
704-
HID_USAGE_PAGE_GAME = 0x05,
705-
HID_USAGE_PAGE_GENERIC_DEVICE = 0x06,
706-
HID_USAGE_PAGE_KEYBOARD = 0x07,
707-
HID_USAGE_PAGE_LED = 0x08,
708-
HID_USAGE_PAGE_BUTTON = 0x09,
709-
HID_USAGE_PAGE_ORDINAL = 0x0a,
710-
HID_USAGE_PAGE_TELEPHONY = 0x0b,
711-
HID_USAGE_PAGE_CONSUMER = 0x0c,
712-
HID_USAGE_PAGE_DIGITIZER = 0x0d,
713-
HID_USAGE_PAGE_PID = 0x0f,
714-
HID_USAGE_PAGE_UNICODE = 0x10,
715-
HID_USAGE_PAGE_ALPHA_DISPLAY = 0x14,
716-
HID_USAGE_PAGE_MEDICAL = 0x40,
717-
HID_USAGE_PAGE_MONITOR = 0x80, //0x80 - 0x83
718-
HID_USAGE_PAGE_POWER = 0x84, // 0x084 - 0x87
719-
HID_USAGE_PAGE_BARCODE_SCANNER = 0x8c,
720-
HID_USAGE_PAGE_SCALE = 0x8d,
721-
HID_USAGE_PAGE_MSR = 0x8e,
722-
HID_USAGE_PAGE_CAMERA = 0x90,
723-
HID_USAGE_PAGE_ARCADE = 0x91,
724-
HID_USAGE_PAGE_FIDO = 0xF1D0, // FIDO alliance HID usage page
725-
HID_USAGE_PAGE_VENDOR = 0xFF00 // 0xFF00 - 0xFFFF
700+
HID_USAGE_PAGE_DESKTOP = 0x01,
701+
HID_USAGE_PAGE_SIMULATE = 0x02,
702+
HID_USAGE_PAGE_VIRTUAL_REALITY = 0x03,
703+
HID_USAGE_PAGE_SPORT = 0x04,
704+
HID_USAGE_PAGE_GAME = 0x05,
705+
HID_USAGE_PAGE_GENERIC_DEVICE = 0x06,
706+
HID_USAGE_PAGE_KEYBOARD = 0x07,
707+
HID_USAGE_PAGE_LED = 0x08,
708+
HID_USAGE_PAGE_BUTTON = 0x09,
709+
HID_USAGE_PAGE_ORDINAL = 0x0a,
710+
HID_USAGE_PAGE_TELEPHONY = 0x0b,
711+
HID_USAGE_PAGE_CONSUMER = 0x0c,
712+
HID_USAGE_PAGE_DIGITIZER = 0x0d,
713+
HID_USAGE_PAGE_PID = 0x0f,
714+
HID_USAGE_PAGE_UNICODE = 0x10,
715+
HID_USAGE_PAGE_ALPHA_DISPLAY = 0x14,
716+
HID_USAGE_PAGE_MEDICAL = 0x40,
717+
HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION = 0x59,
718+
HID_USAGE_PAGE_MONITOR = 0x80, //0x80 - 0x83
719+
HID_USAGE_PAGE_POWER = 0x84, // 0x084 - 0x87
720+
HID_USAGE_PAGE_BARCODE_SCANNER = 0x8c,
721+
HID_USAGE_PAGE_SCALE = 0x8d,
722+
HID_USAGE_PAGE_MSR = 0x8e,
723+
HID_USAGE_PAGE_CAMERA = 0x90,
724+
HID_USAGE_PAGE_ARCADE = 0x91,
725+
HID_USAGE_PAGE_FIDO = 0xF1D0, // FIDO alliance HID usage page
726+
HID_USAGE_PAGE_VENDOR = 0xFF00 // 0xFF00 - 0xFFFF
726727
};
727728

728729
/// HID Usage Table - Table 6: Generic Desktop Page
@@ -801,8 +802,7 @@ enum {
801802

802803
/// HID Usage Table: Consumer Page (0x0C)
803804
/// Only contains controls that supported by Windows (whole list is too long)
804-
enum
805-
{
805+
enum {
806806
// Generic Control
807807
HID_USAGE_CONSUMER_CONTROL = 0x0001,
808808

@@ -858,9 +858,45 @@ enum
858858
HID_USAGE_CONSUMER_AC_PAN = 0x0238,
859859
};
860860

861+
/// HID Usage Table - Lighting And Illumination Page (0x59)
862+
enum {
863+
HID_USAGE_LIGHTING_LAMP_ARRAY = 0x01,
864+
HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT = 0x02,
865+
HID_USAGE_LIGHTING_LAMP_COUNT = 0x03,
866+
HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS = 0x04,
867+
HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS = 0x05,
868+
HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS = 0x06,
869+
HID_USAGE_LIGHTING_LAMP_ARRAY_KIND = 0x07,
870+
HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS = 0x08,
871+
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT = 0x20,
872+
HID_USAGE_LIGHTING_LAMP_ID = 0x21,
873+
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT = 0x22,
874+
HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS = 0x23,
875+
HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS = 0x24,
876+
HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS = 0x25,
877+
HID_USAGE_LIGHTING_LAMP_PURPOSES = 0x26,
878+
HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS = 0x27,
879+
HID_USAGE_LIGHTING_RED_LEVEL_COUNT = 0x28,
880+
HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT = 0x29,
881+
HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT = 0x2A,
882+
HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT = 0x2B,
883+
HID_USAGE_LIGHTING_IS_PROGRAMMABLE = 0x2C,
884+
HID_USAGE_LIGHTING_INPUT_BINDING = 0x2D,
885+
HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT = 0x50,
886+
HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL = 0x51,
887+
HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL = 0x52,
888+
HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL = 0x53,
889+
HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL = 0x54,
890+
HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS = 0x55,
891+
HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT = 0x60,
892+
HID_USAGE_LIGHTING_LAMP_ID_START = 0x61,
893+
HID_USAGE_LIGHTING_LAMP_ID_END = 0x62,
894+
HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT = 0x70,
895+
HID_USAGE_LIGHTING_AUTONOMOUS_MODE = 0x71,
896+
};
897+
861898
/// HID Usage Table: FIDO Alliance Page (0xF1D0)
862-
enum
863-
{
899+
enum {
864900
HID_USAGE_FIDO_U2FHID = 0x01, // U2FHID usage for top-level collection
865901
HID_USAGE_FIDO_DATA_IN = 0x20, // Raw IN data report
866902
HID_USAGE_FIDO_DATA_OUT = 0x21 // Raw OUT data report

src/class/hid/hid_device.h

+172
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,178 @@ static inline bool tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y
463463
HID_OUTPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
464464
HID_COLLECTION_END \
465465

466+
// HID Lighting and Illumination Report Descriptor Template
467+
// - 1st parameter is report id (required)
468+
// Creates 6 report ids for lighting HID usages in the following order:
469+
// report_id+0: HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT
470+
// report_id+1: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT
471+
// report_id+2: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT
472+
// report_id+3: HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT
473+
// report_id+4: HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT
474+
// report_id+5: HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT
475+
#define TUD_HID_REPORT_DESC_LIGHTING(report_id) \
476+
HID_USAGE_PAGE ( HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION ),\
477+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY ),\
478+
HID_COLLECTION ( HID_COLLECTION_APPLICATION ),\
479+
/* Lamp Array Attributes Report */ \
480+
HID_REPORT_ID (report_id ) \
481+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT ),\
482+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
483+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
484+
HID_LOGICAL_MIN ( 0 ),\
485+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
486+
HID_REPORT_SIZE ( 16 ),\
487+
HID_REPORT_COUNT ( 1 ),\
488+
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
489+
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS ),\
490+
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS ),\
491+
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS ),\
492+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_KIND ),\
493+
HID_USAGE ( HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS ),\
494+
HID_LOGICAL_MIN ( 0 ),\
495+
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
496+
HID_REPORT_SIZE ( 32 ),\
497+
HID_REPORT_COUNT ( 5 ),\
498+
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
499+
HID_COLLECTION_END ,\
500+
/* Lamp Attributes Request Report */ \
501+
HID_REPORT_ID ( report_id + 1 ) \
502+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT ),\
503+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
504+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
505+
HID_LOGICAL_MIN ( 0 ),\
506+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
507+
HID_REPORT_SIZE ( 16 ),\
508+
HID_REPORT_COUNT ( 1 ),\
509+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
510+
HID_COLLECTION_END ,\
511+
/* Lamp Attributes Response Report */ \
512+
HID_REPORT_ID ( report_id + 2 ) \
513+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT ),\
514+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
515+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
516+
HID_LOGICAL_MIN ( 0 ),\
517+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
518+
HID_REPORT_SIZE ( 16 ),\
519+
HID_REPORT_COUNT ( 1 ),\
520+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
521+
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS ),\
522+
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS ),\
523+
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS ),\
524+
HID_USAGE ( HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS ),\
525+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_PURPOSES ),\
526+
HID_LOGICAL_MIN ( 0 ),\
527+
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
528+
HID_REPORT_SIZE ( 32 ),\
529+
HID_REPORT_COUNT ( 5 ),\
530+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
531+
HID_USAGE ( HID_USAGE_LIGHTING_RED_LEVEL_COUNT ),\
532+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT ),\
533+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT ),\
534+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT ),\
535+
HID_USAGE ( HID_USAGE_LIGHTING_IS_PROGRAMMABLE ),\
536+
HID_USAGE ( HID_USAGE_LIGHTING_INPUT_BINDING ),\
537+
HID_LOGICAL_MIN ( 0 ),\
538+
HID_LOGICAL_MAX_N ( 255, 2 ),\
539+
HID_REPORT_SIZE ( 8 ),\
540+
HID_REPORT_COUNT ( 6 ),\
541+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
542+
HID_COLLECTION_END ,\
543+
/* Lamp Multi-Update Report */ \
544+
HID_REPORT_ID ( report_id + 3 ) \
545+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT ),\
546+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
547+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
548+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
549+
HID_LOGICAL_MIN ( 0 ),\
550+
HID_LOGICAL_MAX ( 8 ),\
551+
HID_REPORT_SIZE ( 8 ),\
552+
HID_REPORT_COUNT ( 2 ),\
553+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
554+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
555+
HID_LOGICAL_MIN ( 0 ),\
556+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
557+
HID_REPORT_SIZE ( 16 ),\
558+
HID_REPORT_COUNT ( 8 ),\
559+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
560+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
561+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
562+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
563+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
564+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
565+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
566+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
567+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
568+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
569+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
570+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
571+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
572+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
573+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
574+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
575+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
576+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
577+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
578+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
579+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
580+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
581+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
582+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
583+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
584+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
585+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
586+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
587+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
588+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
589+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
590+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
591+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
592+
HID_LOGICAL_MIN ( 0 ),\
593+
HID_LOGICAL_MAX_N ( 255, 2 ),\
594+
HID_REPORT_SIZE ( 8 ),\
595+
HID_REPORT_COUNT ( 32 ),\
596+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
597+
HID_COLLECTION_END ,\
598+
/* Lamp Range Update Report */ \
599+
HID_REPORT_ID ( report_id + 4 ) \
600+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT ),\
601+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
602+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
603+
HID_LOGICAL_MIN ( 0 ),\
604+
HID_LOGICAL_MAX ( 8 ),\
605+
HID_REPORT_SIZE ( 8 ),\
606+
HID_REPORT_COUNT ( 1 ),\
607+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
608+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_START ),\
609+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_END ),\
610+
HID_LOGICAL_MIN ( 0 ),\
611+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
612+
HID_REPORT_SIZE ( 16 ),\
613+
HID_REPORT_COUNT ( 2 ),\
614+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
615+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
616+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
617+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
618+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
619+
HID_LOGICAL_MIN ( 0 ),\
620+
HID_LOGICAL_MAX_N ( 255, 2 ),\
621+
HID_REPORT_SIZE ( 8 ),\
622+
HID_REPORT_COUNT ( 4 ),\
623+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
624+
HID_COLLECTION_END ,\
625+
/* Lamp Array Control Report */ \
626+
HID_REPORT_ID ( report_id + 5 ) \
627+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT ),\
628+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
629+
HID_USAGE ( HID_USAGE_LIGHTING_AUTONOMOUS_MODE ),\
630+
HID_LOGICAL_MIN ( 0 ),\
631+
HID_LOGICAL_MAX ( 1 ),\
632+
HID_REPORT_SIZE ( 8 ),\
633+
HID_REPORT_COUNT ( 1 ),\
634+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
635+
HID_COLLECTION_END ,\
636+
HID_COLLECTION_END \
637+
466638
//--------------------------------------------------------------------+
467639
// Internal Class Driver API
468640
//--------------------------------------------------------------------+

0 commit comments

Comments
 (0)