/*****************************************************************************
 * Copyright (c) 2019, Nsing Technologies Pte. Ltd.
 *
 * All rights reserved.
 * ****************************************************************************
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Nations' name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ****************************************************************************/

/**
 * @file usb_desc.c
 * @author Nations
 * @version v1.0.1
 *
 * @copyright Copyright (c) 2019, Nsing Technologies Pte. Ltd. All rights reserved.
 */
/* Includes ------------------------------------------------------------------*/
#include "usb_lib.h"
#include "usb_desc.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/* USB Standard Device Descriptor */
const uint8_t Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
    {
        0x12,                       /*bLength */
        USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
        0x00,                       /*bcdUSB */
        0x02,
        0x00, /*bDeviceClass*/
        0x00, /*bDeviceSubClass*/
        0x00, /*bDeviceProtocol*/
        0x40, /*bMaxPacketSize 64*/
        0xF5, /*idVendor (0x19F5)*/
        0x19,
        0x10, /*idProduct = 0x5710*/
        0x57,
        0x00, /*bcdDevice rel. 2.00*/
        0x02,
        1,   /*Index of string descriptor describing manufacturer */
        2,   /*Index of string descriptor describing product*/
        3,   /*Index of string descriptor describing the device serial number */
        0x01 /*bNumConfigurations*/
}; /* Joystick_DeviceDescriptor */

/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
    {
        0x09,                              /* bLength: Configuration Descriptor size */
        USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
        JOYSTICK_SIZ_CONFIG_DESC,          /* wTotalLength: Bytes returned */
        0x00,
        0x01, /*bNumInterfaces: 1 interface*/
        0x01, /*bConfigurationValue: Configuration value*/
        0x00, /*iConfiguration: Index of string descriptor describing
                                 the configuration*/
        0xE0, /*bmAttributes: Self powered */
        0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/

        /************** Descriptor of Joystick Mouse interface ****************/
        /* 09 */
        0x09,                          /*bLength: Interface Descriptor size*/
        USB_INTERFACE_DESCRIPTOR_TYPE, /*bDescriptorType: Interface descriptor type*/
        0x00,                          /*bInterfaceNumber: Number of Interface*/
        0x00,                          /*bAlternateSetting: Alternate setting*/
        0x01,                          /*bNumEndpoints*/
        0x03,                          /*bInterfaceClass: HID*/
        0x01,                          /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
        0x02,                          /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
        0,                             /*iInterface: Index of string descriptor*/
        /******************** Descriptor of Joystick Mouse HID ********************/
        /* 18 */
        0x09,                /*bLength: HID Descriptor size*/
        HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
        0x00,                /*bcdHID: HID Class Spec release number*/
        0x01,
        0x00,                     /*bCountryCode: Hardware target country*/
        0x01,                     /*bNumDescriptors: Number of HID class descriptors to follow*/
        0x22,                     /*bDescriptorType*/
        JOYSTICK_SIZ_REPORT_DESC, /*wItemLength: Total length of Report descriptor*/
        0x00,
        /******************** Descriptor of Joystick Mouse endpoint ********************/
        /* 27 */
        0x07,                         /*bLength: Endpoint Descriptor size*/
        USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

        0x81, /*bEndpointAddress: Endpoint Address (IN)*/
        0x03, /*bmAttributes: Interrupt endpoint*/
        0x04, /*wMaxPacketSize: 4 Byte max */
        0x00,
        0x20, /*bInterval: Polling Interval (32 ms)*/
        /* 34 */
}; /* MOUSE_ConfigDescriptor */
const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
    {
        0x05, /*Usage Page(Generic Desktop)*/
        0x01,
        0x09, /*Usage(Mouse)*/
        0x02,
        0xA1, /*Collection(Logical)*/
        0x01,
        0x09, /*Usage(Pointer)*/
        0x01,
        /* 8 */
        0xA1, /*Collection(Linked)*/
        0x00,
        0x05, /*Usage Page(Buttons)*/
        0x09,
        0x19, /*Usage Minimum(1)*/
        0x01,
        0x29, /*Usage Maximum(3)*/
        0x03,
        /* 16 */
        0x15, /*Logical Minimum(0)*/
        0x00,
        0x25, /*Logical Maximum(1)*/
        0x01,
        0x95, /*Report Count(3)*/
        0x03,
        0x75, /*Report Size(1)*/
        0x01,
        /* 24 */
        0x81, /*Input(Variable)*/
        0x02,
        0x95, /*Report Count(1)*/
        0x01,
        0x75, /*Report Size(5)*/
        0x05,
        0x81, /*Input(Constant,Array)*/
        0x01,
        /* 32 */
        0x05, /*Usage Page(Generic Desktop)*/
        0x01,
        0x09, /*Usage(X axis)*/
        0x30,
        0x09, /*Usage(Y axis)*/
        0x31,
        0x09, /*Usage(Wheel)*/
        0x38,
        /* 40 */
        0x15, /*Logical Minimum(-127)*/
        0x81,
        0x25, /*Logical Maximum(127)*/
        0x7F,
        0x75, /*Report Size(8)*/
        0x08,
        0x95, /*Report Count(3)*/
        0x03,
        /* 48 */
        0x81, /*Input(Variable, Relative)*/
        0x06,
        0xC0, /*End Collection*/
        0x09,
        0x3c,
        0x05,
        0xff,
        0x09,
        /* 56 */
        0x01,
        0x15,
        0x00,
        0x25,
        0x01,
        0x75,
        0x01,
        0x95,
        /* 64 */
        0x02,
        0xb1,
        0x22,
        0x75,
        0x06,
        0x95,
        0x01,
        0xb1,
        /* 72 */
        0x01,
        0xc0}; /* Joystick_ReportDescriptor */

/* USB String Descriptors (optional) */
const uint8_t Joystick_StringLangID[JOYSTICK_SIZ_STRING_LANGID] =
    {
        JOYSTICK_SIZ_STRING_LANGID,
        USB_STRING_DESCRIPTOR_TYPE,
        0x09,
        0x04}; /* LangID = 0x0409: U.S. English */

const uint8_t Joystick_StringVendor[JOYSTICK_SIZ_STRING_VENDOR] =
    {
        JOYSTICK_SIZ_STRING_VENDOR, /* Size of Vendor string */
        USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/
        /* Manufacturer: "NATIONS" */
        'N', 0, 'A', 0, 'T', 0, 'I', 0, 'O', 0, 'N', 0, 'S', 0};

const uint8_t Joystick_StringProduct[JOYSTICK_SIZ_STRING_PRODUCT] =
    {
        JOYSTICK_SIZ_STRING_PRODUCT, /* bLength */
        USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType */
        'N', 0, '3', 0, '2', 0, 'G', 0, '4', 0, '5', 0, 'x', 0, ' ', 0, 'J', 0,
        'o', 0, 'y', 0, 's', 0, 't', 0, 'i', 0, 'c', 0, 'k', 0};
uint8_t Joystick_StringSerial[JOYSTICK_SIZ_STRING_SERIAL] =
    {
        JOYSTICK_SIZ_STRING_SERIAL, /* bLength */
        USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
        'N', 0, '3', 0, '2', 0, 'G', 0, '4', 0, '5', 0, 'x', 0};
