text: #ifndef ION_DEVICE_SHARED_USB_INTERFACE_H
  #define ION_DEVICE_SHARED_USB_INTERFACE_H
  
  #include "endpoint0.h"
  #include "request_recipient.h"
  #include "setup_packet.h"
  
  namespace Ion {
  namespace Device {
  namespace USB {
  
  class Interface : public RequestRecipient {
  public:
    Interface(Endpoint0 * ep0) :
      RequestRecipient(ep0)
    {
    }
  protected:
    virtual void setActiveInterfaceAlternative(uint8_t interfaceAlternativeIndex) = 0;
    virtual uint8_t getActiveInterfaceAlternative() = 0;
    bool processSetupInRequest(SetupPacket * request, uint8_t * transferBuffer, uint16_t * transferBufferLength, uint16_t transferBufferMaxLength) override;
  private:
    // USB Standard Interface Request Codes
    enum class Request {
      GetStatus       = 0,
      ClearFeature    = 1,
      SetFeature      = 3,
      GetInterface    = 10,
      SetInterface    = 11,
    };
    bool getStatus(uint8_t * transferBuffer, uint16_t * transferBufferLength, uint16_t transferBufferMaxLength);
    bool getInterface(uint8_t * transferBuffer, uint16_t * transferBufferLength, uint16_t transferBufferMaxLength);
    bool setInterface(SetupPacket * request, uint16_t * transferBufferLength);
    bool clearFeature(uint16_t * transferBufferLength);
    bool setFeature(uint16_t * transferBufferLength);
  };
  
  }
  }
  }
  
  #endif
  