├── .gitignore ├── .gitmodules ├── Config └── LUFAConfig.h ├── Descriptors.c ├── Descriptors.h ├── I2CUSB.c ├── I2CUSB.h ├── LICENSE ├── README.md ├── doxyfile ├── images ├── bsmicro-wii.jpg └── i2c-mega-usb_bb.png ├── makefile ├── twi.c └── twi.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | 54 | *.o 55 | *.d 56 | *.elf 57 | *.hex 58 | *.eep 59 | *.sym 60 | *.bin 61 | *.lss 62 | *.map 63 | *.bak 64 | *.class 65 | Documentation/ 66 | node_modules/ 67 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lufa"] 2 | path = lufa 3 | url = https://github.com/abcminiuser/lufa 4 | -------------------------------------------------------------------------------- /Config/LUFAConfig.h: -------------------------------------------------------------------------------- 1 | /* 2 | LUFA Library 3 | Copyright (C) Dean Camera, 2021. 4 | 5 | dean [at] fourwalledcubicle [dot] com 6 | www.lufa-lib.org 7 | */ 8 | 9 | /* 10 | Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com) 11 | 12 | Permission to use, copy, modify, distribute, and sell this 13 | software and its documentation for any purpose is hereby granted 14 | without fee, provided that the above copyright notice appear in 15 | all copies and that both that the copyright notice and this 16 | permission notice and warranty disclaimer appear in supporting 17 | documentation, and that the name of the author not be used in 18 | advertising or publicity pertaining to distribution of the 19 | software without specific, written prior permission. 20 | 21 | The author disclaims all warranties with regard to this 22 | software, including all implied warranties of merchantability 23 | and fitness. In no event shall the author be liable for any 24 | special, indirect or consequential damages or any damages 25 | whatsoever resulting from loss of use, data or profits, whether 26 | in an action of contract, negligence or other tortious action, 27 | arising out of or in connection with the use or performance of 28 | this software. 29 | */ 30 | 31 | /** \file 32 | * \brief LUFA Library Configuration Header File 33 | * 34 | * This header file is used to configure LUFA's compile time options, 35 | * as an alternative to the compile time constants supplied through 36 | * a makefile. 37 | * 38 | * For information on what each token does, refer to the LUFA 39 | * manual section "Summary of Compile Tokens". 40 | */ 41 | 42 | #ifndef _LUFA_CONFIG_H_ 43 | #define _LUFA_CONFIG_H_ 44 | 45 | #if (ARCH == ARCH_AVR8) 46 | 47 | /* Non-USB Related Configuration Tokens: */ 48 | // #define DISABLE_TERMINAL_CODES 49 | 50 | /* USB Class Driver Related Tokens: */ 51 | // #define HID_HOST_BOOT_PROTOCOL_ONLY 52 | // #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} 53 | // #define HID_USAGE_STACK_DEPTH {Insert Value Here} 54 | // #define HID_MAX_COLLECTIONS {Insert Value Here} 55 | // #define HID_MAX_REPORTITEMS {Insert Value Here} 56 | // #define HID_MAX_REPORT_IDS {Insert Value Here} 57 | // #define NO_CLASS_DRIVER_AUTOFLUSH 58 | 59 | /* General USB Driver Related Tokens: */ 60 | // #define ORDERED_EP_CONFIG 61 | #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) 62 | #define USB_DEVICE_ONLY 63 | // #define USB_HOST_ONLY 64 | // #define USB_STREAM_TIMEOUT_MS {Insert Value Here} 65 | // #define NO_LIMITED_CONTROLLER_CONNECT 66 | // #define NO_SOF_EVENTS 67 | 68 | /* USB Device Mode Driver Related Tokens: */ 69 | // #define USE_RAM_DESCRIPTORS 70 | #define USE_FLASH_DESCRIPTORS 71 | // #define USE_EEPROM_DESCRIPTORS 72 | // #define NO_INTERNAL_SERIAL 73 | #define FIXED_CONTROL_ENDPOINT_SIZE 8 74 | // #define DEVICE_STATE_AS_GPIOR 0 75 | #define FIXED_NUM_CONFIGURATIONS 1 76 | // #define CONTROL_ONLY_DEVICE 77 | // #define INTERRUPT_CONTROL_ENDPOINT 78 | // #define NO_DEVICE_REMOTE_WAKEUP 79 | // #define NO_DEVICE_SELF_POWER 80 | 81 | /* USB Host Mode Driver Related Tokens: */ 82 | // #define HOST_STATE_AS_GPIOR 0 83 | // #define USB_HOST_TIMEOUT_MS {Insert Value Here} 84 | // #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here} 85 | // #define NO_AUTO_VBUS_MANAGEMENT 86 | // #define INVERTED_VBUS_ENABLE_LINE 87 | 88 | #else 89 | 90 | #error Unsupported architecture for this LUFA configuration file. 91 | 92 | #endif 93 | #endif 94 | -------------------------------------------------------------------------------- /Descriptors.c: -------------------------------------------------------------------------------- 1 | /* 2 | LUFA Library 3 | Copyright (C) Dean Camera, 2021. 4 | 5 | dean [at] fourwalledcubicle [dot] com 6 | www.lufa-lib.org 7 | */ 8 | 9 | /* 10 | Copyright 2010 OBinou (obconseil [at] gmail [dot] com) 11 | Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com) 12 | 13 | Permission to use, copy, modify, distribute, and sell this 14 | software and its documentation for any purpose is hereby granted 15 | without fee, provided that the above copyright notice appear in 16 | all copies and that both that the copyright notice and this 17 | permission notice and warranty disclaimer appear in supporting 18 | documentation, and that the name of the author not be used in 19 | advertising or publicity pertaining to distribution of the 20 | software without specific, written prior permission. 21 | 22 | The author disclaims all warranties with regard to this 23 | software, including all implied warranties of merchantability 24 | and fitness. In no event shall the author be liable for any 25 | special, indirect or consequential damages or any damages 26 | whatsoever resulting from loss of use, data or profits, whether 27 | in an action of contract, negligence or other tortious action, 28 | arising out of or in connection with the use or performance of 29 | this software. 30 | */ 31 | 32 | /** \file 33 | * 34 | * USB Device Descriptors, for library use when in USB device mode. Descriptors are special 35 | * computer-readable structures which the host requests upon device enumeration, to determine 36 | * the device's capabilities and functions. 37 | */ 38 | 39 | #include "Descriptors.h" 40 | 41 | /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall 42 | * device characteristics, including the supported USB version, control endpoint size and the 43 | * number of device configurations. The descriptor is read out by the USB host when the enumeration 44 | * process begins. 45 | */ 46 | const USB_Descriptor_Device_t PROGMEM I2CUSB_DeviceDescriptor = 47 | { 48 | .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, 49 | 50 | .USBSpecification = VERSION_BCD(1,1,0), 51 | //.USBSpecification = VERSION_BCD(2,0,0), 52 | .Class = USB_CSCP_VendorSpecificClass, 53 | .SubClass = USB_CSCP_NoDeviceSubclass, 54 | .Protocol = USB_CSCP_NoDeviceProtocol, 55 | 56 | .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, 57 | 58 | .VendorID = 0x1c40, // 0x0403, 59 | .ProductID = 0x0534, // 0xC631, 60 | .ReleaseNumber = VERSION_BCD(1,0,0), 61 | 62 | .ManufacturerStrIndex = STRING_ID_Manufacturer, 63 | .ProductStrIndex = STRING_ID_Product, 64 | .SerialNumStrIndex = STRING_ID_Serial, 65 | 66 | .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS 67 | }; 68 | 69 | /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage 70 | * of the device in one of its supported configurations, including information about any device interfaces 71 | * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting 72 | * a configuration so that the host may correctly communicate with the USB device. 73 | */ 74 | const USB_Descriptor_Configuration_t PROGMEM I2CUSB_ConfigurationDescriptor = 75 | { 76 | .Config = 77 | { 78 | .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, 79 | 80 | .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), 81 | .TotalInterfaces = 1, 82 | 83 | .ConfigurationNumber = 1, 84 | .ConfigurationStrIndex = NO_DESCRIPTOR, 85 | 86 | .ConfigAttributes = USB_CONFIG_ATTR_RESERVED, 87 | 88 | .MaxPowerConsumption = USB_CONFIG_POWER_MA(500) 89 | }, 90 | 91 | .I2CUSBInterface = 92 | { 93 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, 94 | 95 | .InterfaceNumber = INTERFACE_ID_I2CUSB, 96 | .AlternateSetting = 0, 97 | 98 | .TotalEndpoints = 0, 99 | 100 | .Class = USB_CSCP_VendorSpecificClass, 101 | .SubClass = 0x00, 102 | .Protocol = 0x00, 103 | 104 | .InterfaceStrIndex = NO_DESCRIPTOR 105 | }, 106 | }; 107 | 108 | /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests 109 | * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate 110 | * via the language ID table available at USB.org what languages the device supports for its string descriptors. 111 | */ 112 | const USB_Descriptor_String_t PROGMEM I2CUSB_LanguageString = 113 | { 114 | .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, 115 | 116 | .UnicodeString = {LANGUAGE_ID_ENG} 117 | }; 118 | 119 | /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable 120 | * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device 121 | * Descriptor. 122 | */ 123 | const USB_Descriptor_String_t PROGMEM I2CUSB_ManufacturerString = USB_STRING_DESCRIPTOR(L"dungeon.fi"); 124 | 125 | /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, 126 | * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device 127 | * Descriptor. 128 | */ 129 | const USB_Descriptor_String_t PROGMEM I2CUSB_ProductString = USB_STRING_DESCRIPTOR(L"I2C-ATmega-USB"); 130 | 131 | /** Serial number string. This is a Unicode string containing the device's unique serial number, expressed as a 132 | * series of uppercase hexadecimal digits. 133 | */ 134 | const USB_Descriptor_String_t PROGMEM I2CUSB_SerialString = USB_STRING_DESCRIPTOR(L"00001"); 135 | 136 | /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" 137 | * documentation) by the application code so that the address and size of a requested descriptor can be given 138 | * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function 139 | * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the 140 | * USB host. 141 | */ 142 | uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, 143 | const uint16_t wIndex, 144 | const void** const DescriptorAddress) 145 | { 146 | const uint8_t DescriptorType = (wValue >> 8); 147 | const uint8_t DescriptorNumber = (wValue & 0xFF); 148 | 149 | #define DEBUGF(format, args...) printf_P(PSTR(format), ##args) 150 | //printf("CALLBACK_USB_GetDescriptor %x %x \n\r", wValue, wIndex); 151 | 152 | const void* Address = NULL; 153 | uint16_t Size = NO_DESCRIPTOR; 154 | 155 | switch (DescriptorType) 156 | { 157 | case DTYPE_Device: 158 | Address = &I2CUSB_DeviceDescriptor; 159 | Size = sizeof(USB_Descriptor_Device_t); 160 | break; 161 | case DTYPE_Configuration: 162 | Address = &I2CUSB_ConfigurationDescriptor; 163 | Size = sizeof(USB_Descriptor_Configuration_t); 164 | break; 165 | case DTYPE_String: 166 | switch (DescriptorNumber) 167 | { 168 | case STRING_ID_Language: 169 | Address = &I2CUSB_LanguageString; 170 | Size = pgm_read_byte(&I2CUSB_LanguageString.Header.Size); 171 | break; 172 | case STRING_ID_Manufacturer: 173 | Address = &I2CUSB_ManufacturerString; 174 | Size = pgm_read_byte(&I2CUSB_ManufacturerString.Header.Size); 175 | break; 176 | case STRING_ID_Product: 177 | Address = &I2CUSB_ProductString; 178 | Size = pgm_read_byte(&I2CUSB_ProductString.Header.Size); 179 | break; 180 | case STRING_ID_Serial: 181 | Address = &I2CUSB_SerialString; 182 | Size = pgm_read_byte(&I2CUSB_SerialString.Header.Size); 183 | break; 184 | } 185 | 186 | break; 187 | } 188 | 189 | *DescriptorAddress = Address; 190 | return Size; 191 | } 192 | 193 | -------------------------------------------------------------------------------- /Descriptors.h: -------------------------------------------------------------------------------- 1 | /* 2 | LUFA Library 3 | Copyright (C) Dean Camera, 2021. 4 | 5 | dean [at] fourwalledcubicle [dot] com 6 | www.lufa-lib.org 7 | */ 8 | 9 | /* 10 | Copyright 2010 OBinou (obconseil [at] gmail [dot] com) 11 | Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com) 12 | 13 | Permission to use, copy, modify, distribute, and sell this 14 | software and its documentation for any purpose is hereby granted 15 | without fee, provided that the above copyright notice appear in 16 | all copies and that both that the copyright notice and this 17 | permission notice and warranty disclaimer appear in supporting 18 | documentation, and that the name of the author not be used in 19 | advertising or publicity pertaining to distribution of the 20 | software without specific, written prior permission. 21 | 22 | The author disclaims all warranties with regard to this 23 | software, including all implied warranties of merchantability 24 | and fitness. In no event shall the author be liable for any 25 | special, indirect or consequential damages or any damages 26 | whatsoever resulting from loss of use, data or profits, whether 27 | in an action of contract, negligence or other tortious action, 28 | arising out of or in connection with the use or performance of 29 | this software. 30 | */ 31 | 32 | /** \file 33 | * 34 | * Header file for Descriptors.c. 35 | */ 36 | 37 | #ifndef _DESCRIPTORS_H_ 38 | #define _DESCRIPTORS_H_ 39 | 40 | /* Includes: */ 41 | #include 42 | #include 43 | 44 | /* Type Defines: */ 45 | /** Type define for the device configuration descriptor structure. This must be defined in the 46 | * application code, as the configuration descriptor contains several sub-descriptors which 47 | * vary between devices, and which describe the device's usage to the host. 48 | */ 49 | typedef struct 50 | { 51 | USB_Descriptor_Configuration_Header_t Config; 52 | 53 | // I2CUSB Interface 54 | USB_Descriptor_Interface_t I2CUSBInterface; 55 | } USB_Descriptor_Configuration_t; 56 | 57 | /** Enum for the device interface descriptor IDs within the device. Each interface descriptor 58 | * should have a unique ID index associated with it, which can be used to refer to the 59 | * interface from other descriptors. 60 | */ 61 | enum InterfaceDescriptors_t 62 | { 63 | INTERFACE_ID_I2CUSB = 0, /**< I2CUSB interface descriptor ID */ 64 | }; 65 | 66 | /** Enum for the device string descriptor IDs within the device. Each string descriptor should 67 | * have a unique ID index associated with it, which can be used to refer to the string from 68 | * other descriptors. 69 | */ 70 | enum StringDescriptors_t 71 | { 72 | STRING_ID_Language = 0, /**< Supported Languages string descriptor ID (must be zero) */ 73 | STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */ 74 | STRING_ID_Product = 2, /**< Product string ID */ 75 | STRING_ID_Serial = 3, /**< Serial number string ID */ 76 | }; 77 | 78 | /* Function Prototypes: */ 79 | uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, 80 | const uint16_t wIndex, 81 | const void** const DescriptorAddress) 82 | ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); 83 | #endif 84 | 85 | -------------------------------------------------------------------------------- /I2CUSB.c: -------------------------------------------------------------------------------- 1 | /* 2 | I2CUSB.c - USB to I2C interface 3 | Copyright (c) 2022 Jarkko Sonninen. All right reserved. 4 | 5 | This library is free software; you can redistribute it and/or 6 | modify it under the terms of the GNU Lesser General Public 7 | License as published by the Free Software Foundation; either 8 | version 2.1 of the License, or (at your option) any later version. 9 | 10 | This library is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | Lesser General Public License for more details. 14 | 15 | You should have received a copy of the GNU Lesser General Public 16 | License along with this library; if not, write to the Free Software 17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 | */ 19 | 20 | /* 21 | LUFA Library 22 | Copyright (C) Dean Camera, 2021. 23 | 24 | dean [at] fourwalledcubicle [dot] com 25 | www.lufa-lib.org 26 | */ 27 | 28 | /* 29 | Copyright 2010 OBinou (obconseil [at] gmail [dot] com) 30 | Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com) 31 | 32 | Permission to use, copy, modify, distribute, and sell this 33 | software and its documentation for any purpose is hereby granted 34 | without fee, provided that the above copyright notice appear in 35 | all copies and that both that the copyright notice and this 36 | permission notice and warranty disclaimer appear in supporting 37 | documentation, and that the name of the author not be used in 38 | advertising or publicity pertaining to distribution of the 39 | software without specific, written prior permission. 40 | 41 | The author disclaims all warranties with regard to this 42 | software, including all implied warranties of merchantability 43 | and fitness. In no event shall the author be liable for any 44 | special, indirect or consequential damages or any damages 45 | whatsoever resulting from loss of use, data or profits, whether 46 | in an action of contract, negligence or other tortious action, 47 | arising out of or in connection with the use or performance of 48 | this software. 49 | */ 50 | 51 | /** \file 52 | * 53 | * Main source file for the I2C-Mega-USB program. This file contains the main tasks of 54 | * the project and is responsible for the initial application hardware configuration. 55 | */ 56 | 57 | #include "I2CUSB.h" 58 | #include "twi.h" 59 | 60 | #include 61 | 62 | #define TWI_TIMEOUT 1500 // us 63 | 64 | /* Name: main.c 65 | Project: i2c-tiny-usb 66 | Author: Till Harbaum 67 | Tabsize: 4 68 | Copyright: (c) 2005 by Till Harbaum 69 | License: GPL 70 | */ 71 | 72 | /* commands from USB, must e.g. match command ids in kernel driver */ 73 | #define CMD_ECHO 0 74 | #define CMD_GET_FUNC 1 75 | #define CMD_SET_DELAY 2 76 | #define CMD_GET_STATUS 3 77 | 78 | #define CMD_I2C_IO 4 79 | #define CMD_I2C_BEGIN 1 // flag fo I2C_IO 80 | #define CMD_I2C_END 2 // flag fo I2C_IO 81 | 82 | /* linux kernel flags */ 83 | #define I2C_M_TEN 0x10 /* we have a ten bit chip address */ 84 | #define I2C_M_RD 0x01 85 | #define I2C_M_NOSTART 0x4000 86 | #define I2C_M_REV_DIR_ADDR 0x2000 87 | #define I2C_M_IGNORE_NAK 0x1000 88 | #define I2C_M_NO_RD_ACK 0x0800 89 | 90 | /* To determine what functionality is present */ 91 | #define I2C_FUNC_I2C 0x00000001 92 | #define I2C_FUNC_10BIT_ADDR 0x00000002 93 | #define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_{REV_DIR_ADDR,NOSTART,..} */ 94 | #define I2C_FUNC_SMBUS_HWPEC_CALC 0x00000008 /* SMBus 2.0 */ 95 | #define I2C_FUNC_SMBUS_READ_WORD_DATA_PEC 0x00000800 /* SMBus 2.0 */ 96 | #define I2C_FUNC_SMBUS_WRITE_WORD_DATA_PEC 0x00001000 /* SMBus 2.0 */ 97 | #define I2C_FUNC_SMBUS_PROC_CALL_PEC 0x00002000 /* SMBus 2.0 */ 98 | #define I2C_FUNC_SMBUS_BLOCK_PROC_CALL_PEC 0x00004000 /* SMBus 2.0 */ 99 | #define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */ 100 | #define I2C_FUNC_SMBUS_QUICK 0x00010000 101 | #define I2C_FUNC_SMBUS_READ_BYTE 0x00020000 102 | #define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000 103 | #define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000 104 | #define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000 105 | #define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000 106 | #define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000 107 | #define I2C_FUNC_SMBUS_PROC_CALL 0x00800000 108 | #define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000 109 | #define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000 110 | #define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */ 111 | #define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */ 112 | #define I2C_FUNC_SMBUS_READ_I2C_BLOCK_2 0x10000000 /* I2C-like block xfer */ 113 | #define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2 0x20000000 /* w/ 2-byte reg. addr. */ 114 | #define I2C_FUNC_SMBUS_READ_BLOCK_DATA_PEC 0x40000000 /* SMBus 2.0 */ 115 | #define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA_PEC 0x80000000 /* SMBus 2.0 */ 116 | 117 | #define I2C_FUNC_SMBUS_BYTE I2C_FUNC_SMBUS_READ_BYTE | \ 118 | I2C_FUNC_SMBUS_WRITE_BYTE 119 | #define I2C_FUNC_SMBUS_BYTE_DATA I2C_FUNC_SMBUS_READ_BYTE_DATA | \ 120 | I2C_FUNC_SMBUS_WRITE_BYTE_DATA 121 | #define I2C_FUNC_SMBUS_WORD_DATA I2C_FUNC_SMBUS_READ_WORD_DATA | \ 122 | I2C_FUNC_SMBUS_WRITE_WORD_DATA 123 | #define I2C_FUNC_SMBUS_BLOCK_DATA I2C_FUNC_SMBUS_READ_BLOCK_DATA | \ 124 | I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 125 | #define I2C_FUNC_SMBUS_I2C_BLOCK I2C_FUNC_SMBUS_READ_I2C_BLOCK | \ 126 | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 127 | 128 | #define I2C_FUNC_SMBUS_EMUL I2C_FUNC_SMBUS_QUICK | \ 129 | I2C_FUNC_SMBUS_BYTE | \ 130 | I2C_FUNC_SMBUS_BYTE_DATA | \ 131 | I2C_FUNC_SMBUS_WORD_DATA | \ 132 | I2C_FUNC_SMBUS_PROC_CALL | \ 133 | I2C_FUNC_SMBUS_WRITE_BLOCK_DATA | \ 134 | I2C_FUNC_SMBUS_WRITE_BLOCK_DATA_PEC | \ 135 | I2C_FUNC_SMBUS_I2C_BLOCK 136 | 137 | const uint32_t func = I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 138 | 139 | #define STATUS_IDLE 0 140 | #define STATUS_ADDRESS_ACK 1 141 | #define STATUS_ADDRESS_NACK 2 142 | 143 | static unsigned char status = STATUS_IDLE; 144 | 145 | #ifdef ARDUINO_LEONARDO 146 | #define LED_SETUP() DDRC |= (1<<7) 147 | #define L_LED_OFF() PORTC &= ~(1<<7) 148 | #define L_LED_ON() PORTC |= (1<<7) 149 | #define L_LED_TOGGLE() PORTC ^= (1<<7) 150 | #else 151 | // Pro micro RX led reversed 152 | #define LED_SETUP() DDRB |= (1<<0) 153 | #define L_LED_OFF() PORTB |= (1<<0) 154 | #define L_LED_ON() PORTB &= ~(1<<0) 155 | #define L_LED_TOGGLE() PORTB ^= (1<<0) 156 | #endif 157 | 158 | #ifdef DEBUG 159 | #define DEBUGC Serial_SendByte 160 | static void i2c_scan(void); 161 | static void loghex(uint8_t v); 162 | #else 163 | #define DEBUGC(x) 164 | #endif 165 | 166 | static void usb_i2c_io(void); 167 | 168 | /** Main program entry point. This routine contains the overall program flow, including initial 169 | * setup of all components and the main program loop. 170 | */ 171 | int main(void) 172 | { 173 | SetupHardware(); 174 | 175 | GlobalInterruptEnable(); 176 | 177 | for (;;) { 178 | USB_USBTask(); 179 | } 180 | } 181 | 182 | /** Configures the board hardware and chip peripherals for the project's functionality. */ 183 | void SetupHardware(void) 184 | { 185 | #if (ARCH == ARCH_AVR8) 186 | /* Disable watchdog if enabled by bootloader/fuses */ 187 | MCUSR &= ~(1 << WDRF); 188 | wdt_disable(); 189 | 190 | /* Disable clock division */ 191 | clock_prescale_set(clock_div_1); 192 | #endif 193 | 194 | Serial_Init(115200, false); 195 | Serial_SendString("I2C-ATmega-USB version 0.1\r\n"); 196 | 197 | static FILE uart_str; 198 | Serial_CreateStream(&uart_str); 199 | stdout = stdin = &uart_str; 200 | 201 | LED_SETUP(); 202 | 203 | twi_init(); 204 | twi_setTimeoutInMicros(TWI_TIMEOUT, 1); 205 | 206 | #ifdef USE_INTERNAL_PULL_UPS 207 | DDRD &= ~(3); 208 | PORTD |= (3); 209 | #endif 210 | 211 | GlobalInterruptEnable(); 212 | 213 | #ifdef DEBUG 214 | i2c_scan(); 215 | #endif 216 | 217 | /* Hardware Initialization */ 218 | USB_Init(); 219 | 220 | Serial_SendString("READY.\n\r"); 221 | } 222 | 223 | /** Event handler for the library USB Control Request reception event. */ 224 | void EVENT_USB_Device_ControlRequest(void) 225 | { 226 | // All our messages are vendor type 227 | if (!(USB_ControlRequest.bmRequestType & REQTYPE_VENDOR)) { 228 | DEBUGC('#'); 229 | return; 230 | } 231 | L_LED_ON(); 232 | 233 | // Debug printing is too slow and causes usb errors 234 | /* 235 | DEBUGF("bmRequestType:%02x bRequest:%02x wValue:%04x wIndex:%04x wLength:%04x\n\r", 236 | USB_ControlRequest.bmRequestType, USB_ControlRequest.bRequest, 237 | USB_ControlRequest.wValue, USB_ControlRequest.wIndex, 238 | USB_ControlRequest.wLength); 239 | */ 240 | 241 | switch (USB_ControlRequest.bRequest) { 242 | case CMD_ECHO: 243 | Endpoint_ClearSETUP(); 244 | Endpoint_Write_Control_Stream_LE(&USB_ControlRequest.wValue, sizeof(USB_ControlRequest.wValue)); 245 | Endpoint_ClearOUT(); 246 | DEBUGC('E'); 247 | break; 248 | 249 | case CMD_GET_FUNC: 250 | // TODO if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_VENDOR| REQREC_INTERFACE)) 251 | /* Report our capabilities */ 252 | Endpoint_ClearSETUP(); 253 | Endpoint_Write_Control_Stream_LE(&func, sizeof(func)); 254 | Endpoint_ClearOUT(); 255 | DEBUGC('F'); 256 | break; 257 | 258 | case CMD_SET_DELAY: 259 | // TODO if (USB_ControlRequest.bmRequestType & (REQREC_INTERFACE)) 260 | // i2c bit delay, default is 10us -> 100kHz max 261 | Endpoint_ClearSETUP(); 262 | Endpoint_ClearStatusStage(); 263 | twi_setFrequency(1000000 / USB_ControlRequest.wValue); 264 | DEBUGC('D'); 265 | break; 266 | 267 | case CMD_I2C_IO: 268 | case CMD_I2C_IO | CMD_I2C_BEGIN: 269 | case CMD_I2C_IO | CMD_I2C_END: 270 | case CMD_I2C_IO | CMD_I2C_BEGIN | CMD_I2C_END: 271 | usb_i2c_io(); 272 | break; 273 | 274 | case CMD_GET_STATUS: 275 | // TODO if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_VENDOR| REQREC_INTERFACE)) 276 | Endpoint_ClearSETUP(); 277 | Endpoint_Write_Control_Stream_LE(&status, sizeof(status)); 278 | Endpoint_ClearOUT(); 279 | DEBUGC('S'); 280 | DEBUGC('\n'); 281 | DEBUGC('\r'); 282 | break; 283 | 284 | default: 285 | break; 286 | } 287 | 288 | L_LED_OFF(); 289 | } 290 | 291 | static void usb_i2c_io(void) 292 | { 293 | uint8_t cmd = USB_ControlRequest.bRequest; 294 | uint8_t address = USB_ControlRequest.wIndex; 295 | uint8_t is_read = USB_ControlRequest.wValue & I2C_M_RD; 296 | uint8_t size = USB_ControlRequest.wLength; 297 | 298 | static uint8_t buf[64]; 299 | 300 | // Debug printing is too slow and causes usb errors 301 | //DEBUGF("i2c %s at 0x%02x, len = %d\n", (is_read)?"rd":"wr", address, size); 302 | 303 | if (is_read) { 304 | DEBUGC('R'); 305 | DEBUGC('0' + cmd); 306 | DEBUGC('0' + USB_ControlRequest.wValue); 307 | DEBUGC('0' + size); 308 | uint8_t bytes = twi_readFrom(address, buf, size, cmd & CMD_I2C_END); 309 | Endpoint_ClearSETUP(); 310 | if (size) { 311 | // TODO errorhandling 312 | Endpoint_Write_Control_Stream_LE(buf, size); 313 | } 314 | Endpoint_ClearOUT(); 315 | DEBUGC('0' + bytes); 316 | 317 | status = (!size || bytes) ? STATUS_ADDRESS_ACK : STATUS_ADDRESS_NACK; 318 | 319 | } else { 320 | Endpoint_ClearSETUP(); 321 | // TODO errorhandling 322 | Endpoint_Read_Control_Stream_LE(buf, size); 323 | Endpoint_ClearIN(); 324 | 325 | // FIXME heuristics 326 | uint8_t do_wait = (cmd & CMD_I2C_END) && !size; 327 | 328 | uint8_t ret = twi_writeTo(address, buf, size, do_wait, cmd & CMD_I2C_END); 329 | DEBUGC('W'); 330 | DEBUGC('0' + cmd); 331 | DEBUGC('0' + USB_ControlRequest.wValue); 332 | DEBUGC('0' + size); 333 | DEBUGC('0' + ret); 334 | status = (!ret) ? STATUS_ADDRESS_ACK : STATUS_ADDRESS_NACK; 335 | } 336 | } 337 | 338 | #ifdef DEBUG 339 | static void loghex(uint8_t v) { 340 | static char hex[] = "0123456789ABCDEF"; 341 | DEBUGC(hex[v >> 4]); 342 | DEBUGC(hex[v & 0xf]); 343 | } 344 | 345 | static void i2c_scan(void) { 346 | for (int i=0; i < 128; i++) { 347 | if (i < 8) { 348 | printf(" "); 349 | } else { 350 | uint8_t status = twi_writeTo(i, 0, 0, 1, 1); 351 | if (!status) { 352 | printf ("%02x*", i); 353 | } else { 354 | printf("%2x ", status); 355 | } 356 | } 357 | if ((i % 16) == 15) { 358 | printf("\n\r"); 359 | } 360 | } 361 | } 362 | #endif 363 | -------------------------------------------------------------------------------- /I2CUSB.h: -------------------------------------------------------------------------------- 1 | /* 2 | LUFA Library 3 | Copyright (C) Dean Camera, 2021. 4 | 5 | dean [at] fourwalledcubicle [dot] com 6 | www.lufa-lib.org 7 | */ 8 | 9 | /* 10 | Copyright 2010 OBinou (obconseil [at] gmail [dot] com) 11 | Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com) 12 | 13 | Permission to use, copy, modify, distribute, and sell this 14 | software and its documentation for any purpose is hereby granted 15 | without fee, provided that the above copyright notice appear in 16 | all copies and that both that the copyright notice and this 17 | permission notice and warranty disclaimer appear in supporting 18 | documentation, and that the name of the author not be used in 19 | advertising or publicity pertaining to distribution of the 20 | software without specific, written prior permission. 21 | 22 | The author disclaims all warranties with regard to this 23 | software, including all implied warranties of merchantability 24 | and fitness. In no event shall the author be liable for any 25 | special, indirect or consequential damages or any damages 26 | whatsoever resulting from loss of use, data or profits, whether 27 | in an action of contract, negligence or other tortious action, 28 | arising out of or in connection with the use or performance of 29 | this software. 30 | */ 31 | 32 | /** \file 33 | * 34 | * Header file for I2CUSB.c. 35 | */ 36 | 37 | #ifndef _I2CUSB_H_ 38 | #define _I2CUSB_H_ 39 | 40 | /* Includes: */ 41 | #include 42 | #include 43 | #include 44 | #include 45 | 46 | #include "Descriptors.h" 47 | 48 | #include 49 | #include 50 | #include 51 | 52 | /* Function Prototypes: */ 53 | void SetupHardware(void); 54 | 55 | void EVENT_USB_Device_ControlRequest(void); 56 | 57 | #endif 58 | 59 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 2.1, February 1999 3 | 4 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | [This is the first released version of the Lesser GPL. It also counts 10 | as the successor of the GNU Library Public License, version 2, hence 11 | the version number 2.1.] 12 | 13 | Preamble 14 | 15 | The licenses for most software are designed to take away your 16 | freedom to share and change it. By contrast, the GNU General Public 17 | Licenses are intended to guarantee your freedom to share and change 18 | free software--to make sure the software is free for all its users. 19 | 20 | This license, the Lesser General Public License, applies to some 21 | specially designated software packages--typically libraries--of the 22 | Free Software Foundation and other authors who decide to use it. You 23 | can use it too, but we suggest you first think carefully about whether 24 | this license or the ordinary General Public License is the better 25 | strategy to use in any particular case, based on the explanations below. 26 | 27 | When we speak of free software, we are referring to freedom of use, 28 | not price. Our General Public Licenses are designed to make sure that 29 | you have the freedom to distribute copies of free software (and charge 30 | for this service if you wish); that you receive source code or can get 31 | it if you want it; that you can change the software and use pieces of 32 | it in new free programs; and that you are informed that you can do 33 | these things. 34 | 35 | To protect your rights, we need to make restrictions that forbid 36 | distributors to deny you these rights or to ask you to surrender these 37 | rights. These restrictions translate to certain responsibilities for 38 | you if you distribute copies of the library or if you modify it. 39 | 40 | For example, if you distribute copies of the library, whether gratis 41 | or for a fee, you must give the recipients all the rights that we gave 42 | you. You must make sure that they, too, receive or can get the source 43 | code. If you link other code with the library, you must provide 44 | complete object files to the recipients, so that they can relink them 45 | with the library after making changes to the library and recompiling 46 | it. And you must show them these terms so they know their rights. 47 | 48 | We protect your rights with a two-step method: (1) we copyright the 49 | library, and (2) we offer you this license, which gives you legal 50 | permission to copy, distribute and/or modify the library. 51 | 52 | To protect each distributor, we want to make it very clear that 53 | there is no warranty for the free library. Also, if the library is 54 | modified by someone else and passed on, the recipients should know 55 | that what they have is not the original version, so that the original 56 | author's reputation will not be affected by problems that might be 57 | introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of 60 | any free program. We wish to make sure that a company cannot 61 | effectively restrict the users of a free program by obtaining a 62 | restrictive license from a patent holder. Therefore, we insist that 63 | any patent license obtained for a version of the library must be 64 | consistent with the full freedom of use specified in this license. 65 | 66 | Most GNU software, including some libraries, is covered by the 67 | ordinary GNU General Public License. This license, the GNU Lesser 68 | General Public License, applies to certain designated libraries, and 69 | is quite different from the ordinary General Public License. We use 70 | this license for certain libraries in order to permit linking those 71 | libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using 74 | a shared library, the combination of the two is legally speaking a 75 | combined work, a derivative of the original library. The ordinary 76 | General Public License therefore permits such linking only if the 77 | entire combination fits its criteria of freedom. The Lesser General 78 | Public License permits more lax criteria for linking other code with 79 | the library. 80 | 81 | We call this license the "Lesser" General Public License because it 82 | does Less to protect the user's freedom than the ordinary General 83 | Public License. It also provides other free software developers Less 84 | of an advantage over competing non-free programs. These disadvantages 85 | are the reason we use the ordinary General Public License for many 86 | libraries. However, the Lesser license provides advantages in certain 87 | special circumstances. 88 | 89 | For example, on rare occasions, there may be a special need to 90 | encourage the widest possible use of a certain library, so that it becomes 91 | a de-facto standard. To achieve this, non-free programs must be 92 | allowed to use the library. A more frequent case is that a free 93 | library does the same job as widely used non-free libraries. In this 94 | case, there is little to gain by limiting the free library to free 95 | software only, so we use the Lesser General Public License. 96 | 97 | In other cases, permission to use a particular library in non-free 98 | programs enables a greater number of people to use a large body of 99 | free software. For example, permission to use the GNU C Library in 100 | non-free programs enables many more people to use the whole GNU 101 | operating system, as well as its variant, the GNU/Linux operating 102 | system. 103 | 104 | Although the Lesser General Public License is Less protective of the 105 | users' freedom, it does ensure that the user of a program that is 106 | linked with the Library has the freedom and the wherewithal to run 107 | that program using a modified version of the Library. 108 | 109 | The precise terms and conditions for copying, distribution and 110 | modification follow. Pay close attention to the difference between a 111 | "work based on the library" and a "work that uses the library". The 112 | former contains code derived from the library, whereas the latter must 113 | be combined with the library in order to run. 114 | 115 | GNU LESSER GENERAL PUBLIC LICENSE 116 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 117 | 118 | 0. This License Agreement applies to any software library or other 119 | program which contains a notice placed by the copyright holder or 120 | other authorized party saying it may be distributed under the terms of 121 | this Lesser General Public License (also called "this License"). 122 | Each licensee is addressed as "you". 123 | 124 | A "library" means a collection of software functions and/or data 125 | prepared so as to be conveniently linked with application programs 126 | (which use some of those functions and data) to form executables. 127 | 128 | The "Library", below, refers to any such software library or work 129 | which has been distributed under these terms. A "work based on the 130 | Library" means either the Library or any derivative work under 131 | copyright law: that is to say, a work containing the Library or a 132 | portion of it, either verbatim or with modifications and/or translated 133 | straightforwardly into another language. (Hereinafter, translation is 134 | included without limitation in the term "modification".) 135 | 136 | "Source code" for a work means the preferred form of the work for 137 | making modifications to it. For a library, complete source code means 138 | all the source code for all modules it contains, plus any associated 139 | interface definition files, plus the scripts used to control compilation 140 | and installation of the library. 141 | 142 | Activities other than copying, distribution and modification are not 143 | covered by this License; they are outside its scope. The act of 144 | running a program using the Library is not restricted, and output from 145 | such a program is covered only if its contents constitute a work based 146 | on the Library (independent of the use of the Library in a tool for 147 | writing it). Whether that is true depends on what the Library does 148 | and what the program that uses the Library does. 149 | 150 | 1. You may copy and distribute verbatim copies of the Library's 151 | complete source code as you receive it, in any medium, provided that 152 | you conspicuously and appropriately publish on each copy an 153 | appropriate copyright notice and disclaimer of warranty; keep intact 154 | all the notices that refer to this License and to the absence of any 155 | warranty; and distribute a copy of this License along with the 156 | Library. 157 | 158 | You may charge a fee for the physical act of transferring a copy, 159 | and you may at your option offer warranty protection in exchange for a 160 | fee. 161 | 162 | 2. You may modify your copy or copies of the Library or any portion 163 | of it, thus forming a work based on the Library, and copy and 164 | distribute such modifications or work under the terms of Section 1 165 | above, provided that you also meet all of these conditions: 166 | 167 | a) The modified work must itself be a software library. 168 | 169 | b) You must cause the files modified to carry prominent notices 170 | stating that you changed the files and the date of any change. 171 | 172 | c) You must cause the whole of the work to be licensed at no 173 | charge to all third parties under the terms of this License. 174 | 175 | d) If a facility in the modified Library refers to a function or a 176 | table of data to be supplied by an application program that uses 177 | the facility, other than as an argument passed when the facility 178 | is invoked, then you must make a good faith effort to ensure that, 179 | in the event an application does not supply such function or 180 | table, the facility still operates, and performs whatever part of 181 | its purpose remains meaningful. 182 | 183 | (For example, a function in a library to compute square roots has 184 | a purpose that is entirely well-defined independent of the 185 | application. Therefore, Subsection 2d requires that any 186 | application-supplied function or table used by this function must 187 | be optional: if the application does not supply it, the square 188 | root function must still compute square roots.) 189 | 190 | These requirements apply to the modified work as a whole. If 191 | identifiable sections of that work are not derived from the Library, 192 | and can be reasonably considered independent and separate works in 193 | themselves, then this License, and its terms, do not apply to those 194 | sections when you distribute them as separate works. But when you 195 | distribute the same sections as part of a whole which is a work based 196 | on the Library, the distribution of the whole must be on the terms of 197 | this License, whose permissions for other licensees extend to the 198 | entire whole, and thus to each and every part regardless of who wrote 199 | it. 200 | 201 | Thus, it is not the intent of this section to claim rights or contest 202 | your rights to work written entirely by you; rather, the intent is to 203 | exercise the right to control the distribution of derivative or 204 | collective works based on the Library. 205 | 206 | In addition, mere aggregation of another work not based on the Library 207 | with the Library (or with a work based on the Library) on a volume of 208 | a storage or distribution medium does not bring the other work under 209 | the scope of this License. 210 | 211 | 3. You may opt to apply the terms of the ordinary GNU General Public 212 | License instead of this License to a given copy of the Library. To do 213 | this, you must alter all the notices that refer to this License, so 214 | that they refer to the ordinary GNU General Public License, version 2, 215 | instead of to this License. (If a newer version than version 2 of the 216 | ordinary GNU General Public License has appeared, then you can specify 217 | that version instead if you wish.) Do not make any other change in 218 | these notices. 219 | 220 | Once this change is made in a given copy, it is irreversible for 221 | that copy, so the ordinary GNU General Public License applies to all 222 | subsequent copies and derivative works made from that copy. 223 | 224 | This option is useful when you wish to copy part of the code of 225 | the Library into a program that is not a library. 226 | 227 | 4. You may copy and distribute the Library (or a portion or 228 | derivative of it, under Section 2) in object code or executable form 229 | under the terms of Sections 1 and 2 above provided that you accompany 230 | it with the complete corresponding machine-readable source code, which 231 | must be distributed under the terms of Sections 1 and 2 above on a 232 | medium customarily used for software interchange. 233 | 234 | If distribution of object code is made by offering access to copy 235 | from a designated place, then offering equivalent access to copy the 236 | source code from the same place satisfies the requirement to 237 | distribute the source code, even though third parties are not 238 | compelled to copy the source along with the object code. 239 | 240 | 5. A program that contains no derivative of any portion of the 241 | Library, but is designed to work with the Library by being compiled or 242 | linked with it, is called a "work that uses the Library". Such a 243 | work, in isolation, is not a derivative work of the Library, and 244 | therefore falls outside the scope of this License. 245 | 246 | However, linking a "work that uses the Library" with the Library 247 | creates an executable that is a derivative of the Library (because it 248 | contains portions of the Library), rather than a "work that uses the 249 | library". The executable is therefore covered by this License. 250 | Section 6 states terms for distribution of such executables. 251 | 252 | When a "work that uses the Library" uses material from a header file 253 | that is part of the Library, the object code for the work may be a 254 | derivative work of the Library even though the source code is not. 255 | Whether this is true is especially significant if the work can be 256 | linked without the Library, or if the work is itself a library. The 257 | threshold for this to be true is not precisely defined by law. 258 | 259 | If such an object file uses only numerical parameters, data 260 | structure layouts and accessors, and small macros and small inline 261 | functions (ten lines or less in length), then the use of the object 262 | file is unrestricted, regardless of whether it is legally a derivative 263 | work. (Executables containing this object code plus portions of the 264 | Library will still fall under Section 6.) 265 | 266 | Otherwise, if the work is a derivative of the Library, you may 267 | distribute the object code for the work under the terms of Section 6. 268 | Any executables containing that work also fall under Section 6, 269 | whether or not they are linked directly with the Library itself. 270 | 271 | 6. As an exception to the Sections above, you may also combine or 272 | link a "work that uses the Library" with the Library to produce a 273 | work containing portions of the Library, and distribute that work 274 | under terms of your choice, provided that the terms permit 275 | modification of the work for the customer's own use and reverse 276 | engineering for debugging such modifications. 277 | 278 | You must give prominent notice with each copy of the work that the 279 | Library is used in it and that the Library and its use are covered by 280 | this License. You must supply a copy of this License. If the work 281 | during execution displays copyright notices, you must include the 282 | copyright notice for the Library among them, as well as a reference 283 | directing the user to the copy of this License. Also, you must do one 284 | of these things: 285 | 286 | a) Accompany the work with the complete corresponding 287 | machine-readable source code for the Library including whatever 288 | changes were used in the work (which must be distributed under 289 | Sections 1 and 2 above); and, if the work is an executable linked 290 | with the Library, with the complete machine-readable "work that 291 | uses the Library", as object code and/or source code, so that the 292 | user can modify the Library and then relink to produce a modified 293 | executable containing the modified Library. (It is understood 294 | that the user who changes the contents of definitions files in the 295 | Library will not necessarily be able to recompile the application 296 | to use the modified definitions.) 297 | 298 | b) Use a suitable shared library mechanism for linking with the 299 | Library. A suitable mechanism is one that (1) uses at run time a 300 | copy of the library already present on the user's computer system, 301 | rather than copying library functions into the executable, and (2) 302 | will operate properly with a modified version of the library, if 303 | the user installs one, as long as the modified version is 304 | interface-compatible with the version that the work was made with. 305 | 306 | c) Accompany the work with a written offer, valid for at 307 | least three years, to give the same user the materials 308 | specified in Subsection 6a, above, for a charge no more 309 | than the cost of performing this distribution. 310 | 311 | d) If distribution of the work is made by offering access to copy 312 | from a designated place, offer equivalent access to copy the above 313 | specified materials from the same place. 314 | 315 | e) Verify that the user has already received a copy of these 316 | materials or that you have already sent this user a copy. 317 | 318 | For an executable, the required form of the "work that uses the 319 | Library" must include any data and utility programs needed for 320 | reproducing the executable from it. However, as a special exception, 321 | the materials to be distributed need not include anything that is 322 | normally distributed (in either source or binary form) with the major 323 | components (compiler, kernel, and so on) of the operating system on 324 | which the executable runs, unless that component itself accompanies 325 | the executable. 326 | 327 | It may happen that this requirement contradicts the license 328 | restrictions of other proprietary libraries that do not normally 329 | accompany the operating system. Such a contradiction means you cannot 330 | use both them and the Library together in an executable that you 331 | distribute. 332 | 333 | 7. You may place library facilities that are a work based on the 334 | Library side-by-side in a single library together with other library 335 | facilities not covered by this License, and distribute such a combined 336 | library, provided that the separate distribution of the work based on 337 | the Library and of the other library facilities is otherwise 338 | permitted, and provided that you do these two things: 339 | 340 | a) Accompany the combined library with a copy of the same work 341 | based on the Library, uncombined with any other library 342 | facilities. This must be distributed under the terms of the 343 | Sections above. 344 | 345 | b) Give prominent notice with the combined library of the fact 346 | that part of it is a work based on the Library, and explaining 347 | where to find the accompanying uncombined form of the same work. 348 | 349 | 8. You may not copy, modify, sublicense, link with, or distribute 350 | the Library except as expressly provided under this License. Any 351 | attempt otherwise to copy, modify, sublicense, link with, or 352 | distribute the Library is void, and will automatically terminate your 353 | rights under this License. However, parties who have received copies, 354 | or rights, from you under this License will not have their licenses 355 | terminated so long as such parties remain in full compliance. 356 | 357 | 9. You are not required to accept this License, since you have not 358 | signed it. However, nothing else grants you permission to modify or 359 | distribute the Library or its derivative works. These actions are 360 | prohibited by law if you do not accept this License. Therefore, by 361 | modifying or distributing the Library (or any work based on the 362 | Library), you indicate your acceptance of this License to do so, and 363 | all its terms and conditions for copying, distributing or modifying 364 | the Library or works based on it. 365 | 366 | 10. Each time you redistribute the Library (or any work based on the 367 | Library), the recipient automatically receives a license from the 368 | original licensor to copy, distribute, link with or modify the Library 369 | subject to these terms and conditions. You may not impose any further 370 | restrictions on the recipients' exercise of the rights granted herein. 371 | You are not responsible for enforcing compliance by third parties with 372 | this License. 373 | 374 | 11. If, as a consequence of a court judgment or allegation of patent 375 | infringement or for any other reason (not limited to patent issues), 376 | conditions are imposed on you (whether by court order, agreement or 377 | otherwise) that contradict the conditions of this License, they do not 378 | excuse you from the conditions of this License. If you cannot 379 | distribute so as to satisfy simultaneously your obligations under this 380 | License and any other pertinent obligations, then as a consequence you 381 | may not distribute the Library at all. For example, if a patent 382 | license would not permit royalty-free redistribution of the Library by 383 | all those who receive copies directly or indirectly through you, then 384 | the only way you could satisfy both it and this License would be to 385 | refrain entirely from distribution of the Library. 386 | 387 | If any portion of this section is held invalid or unenforceable under any 388 | particular circumstance, the balance of the section is intended to apply, 389 | and the section as a whole is intended to apply in other circumstances. 390 | 391 | It is not the purpose of this section to induce you to infringe any 392 | patents or other property right claims or to contest validity of any 393 | such claims; this section has the sole purpose of protecting the 394 | integrity of the free software distribution system which is 395 | implemented by public license practices. Many people have made 396 | generous contributions to the wide range of software distributed 397 | through that system in reliance on consistent application of that 398 | system; it is up to the author/donor to decide if he or she is willing 399 | to distribute software through any other system and a licensee cannot 400 | impose that choice. 401 | 402 | This section is intended to make thoroughly clear what is believed to 403 | be a consequence of the rest of this License. 404 | 405 | 12. If the distribution and/or use of the Library is restricted in 406 | certain countries either by patents or by copyrighted interfaces, the 407 | original copyright holder who places the Library under this License may add 408 | an explicit geographical distribution limitation excluding those countries, 409 | so that distribution is permitted only in or among countries not thus 410 | excluded. In such case, this License incorporates the limitation as if 411 | written in the body of this License. 412 | 413 | 13. The Free Software Foundation may publish revised and/or new 414 | versions of the Lesser General Public License from time to time. 415 | Such new versions will be similar in spirit to the present version, 416 | but may differ in detail to address new problems or concerns. 417 | 418 | Each version is given a distinguishing version number. If the Library 419 | specifies a version number of this License which applies to it and 420 | "any later version", you have the option of following the terms and 421 | conditions either of that version or of any later version published by 422 | the Free Software Foundation. If the Library does not specify a 423 | license version number, you may choose any version ever published by 424 | the Free Software Foundation. 425 | 426 | 14. If you wish to incorporate parts of the Library into other free 427 | programs whose distribution conditions are incompatible with these, 428 | write to the author to ask for permission. For software which is 429 | copyrighted by the Free Software Foundation, write to the Free 430 | Software Foundation; we sometimes make exceptions for this. Our 431 | decision will be guided by the two goals of preserving the free status 432 | of all derivatives of our free software and of promoting the sharing 433 | and reuse of software generally. 434 | 435 | NO WARRANTY 436 | 437 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 438 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 439 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 440 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY 441 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE 442 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 443 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 444 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 445 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 446 | 447 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN 448 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY 449 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU 450 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 451 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 452 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING 453 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 454 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF 455 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 456 | DAMAGES. 457 | 458 | END OF TERMS AND CONDITIONS 459 | 460 | How to Apply These Terms to Your New Libraries 461 | 462 | If you develop a new library, and you want it to be of the greatest 463 | possible use to the public, we recommend making it free software that 464 | everyone can redistribute and change. You can do so by permitting 465 | redistribution under these terms (or, alternatively, under the terms of the 466 | ordinary General Public License). 467 | 468 | To apply these terms, attach the following notices to the library. It is 469 | safest to attach them to the start of each source file to most effectively 470 | convey the exclusion of warranty; and each file should have at least the 471 | "copyright" line and a pointer to where the full notice is found. 472 | 473 | 474 | Copyright (C) 475 | 476 | This library is free software; you can redistribute it and/or 477 | modify it under the terms of the GNU Lesser General Public 478 | License as published by the Free Software Foundation; either 479 | version 2.1 of the License, or (at your option) any later version. 480 | 481 | This library is distributed in the hope that it will be useful, 482 | but WITHOUT ANY WARRANTY; without even the implied warranty of 483 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 484 | Lesser General Public License for more details. 485 | 486 | You should have received a copy of the GNU Lesser General Public 487 | License along with this library; if not, write to the Free Software 488 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 489 | USA 490 | 491 | Also add information on how to contact you by electronic and paper mail. 492 | 493 | You should also get your employer (if you work as a programmer) or your 494 | school, if any, to sign a "copyright disclaimer" for the library, if 495 | necessary. Here is a sample; alter the names: 496 | 497 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 498 | library `Frob' (a library for tweaking knobs) written by James Random 499 | Hacker. 500 | 501 | , 1 April 1990 502 | Ty Coon, President of Vice 503 | 504 | That's all there is to it! 505 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # I2C-Mega-USB ATmega32U4 clone of the i2c-tiny-usb 2 | ## Cheap and simple I²C to USB interface 3 | 4 | Attach any I2C clients (Wii Nunchuk, thermo sensor, AD converter, display, relay driver, ...) to your PC via USB ... quick, easy and cheap! Drivers for Linux, Windows and MacOS available. 5 | 6 | The i2c-tiny-usb project is an open source/open hardware project. The goal of i2c-tiny-usb is to provide a cheap generic i2c interface to be attached to the USB. It is meant as a replacement for those simple and cheap printer port to I2C adapters. A USB solution has several advantages incl. the built-in power supply and a more future proof interface. Furthermore no cpu intense bitbanging is required on the host side. This USB solution even requires less parts than some printer port solutions. 7 | 8 | I2C-Mega-USB is a compatible clone of Till Harbaum’s i2c-tiny-usb. The firmware has no software in common with Till’s implementation but is compatible with the i2c-tiny-usb driver found in the mainline Linux kernel. As a result it will work out of the box without requiring any special software on the host computer. (Even these texts are shamelessly ripped from i2c-tiny-usb and i2c-star, which is a similar project for STM32) 9 | 10 | I2C-Mega-USB utilizes ATmega32U4 with hardware I2C and USB, which should be better than the original bitbang I2C and software USB. 11 | 12 | ## Hardware setup 13 | 14 | The firmware can be easily ported but has been tested on an ATmega32U4 based breakout board (Arduino Leonardo). 15 | See LUFA documentatation for possible supported boards. 16 | Connections required are: 17 | 18 | - USB to host computer 19 | - I2C bus SDA and I2C bus SCL. Add pull up resistors, if needed (for example 2.2kohm resistors to +Vcc). ATmega has internal pull-ups, but they are often considered too weak. 20 | - [Optional: AVR programmer connected via ICSP connector for uploading the firmware 21 | - [Optional: debug only] TX1: UART TX and RX0: UART RX 22 | 23 | If you use Arduino module with a bootloader, you can upload the firmware once without problems. 24 | After the board boots, the USB Vendor and Product Ids have changed and the serial interface has disappeared. 25 | To program the board second time, push the reset button (connect RST to GND) and quickly use avrdude to program the board. 26 | Another option is to use a separate programmer (for example USBtinyISP). 27 | 28 | ATmega32U4 is often run with 5V voltage, so make sure that your devices can handle it. 29 | However if your board provides 3.3V, you may use the pull-up resistors to get 3.3V for SDA and SCL pins, too. 30 | I am not an electrical engineer, so I cannot say if this won't damage your board. Works for me, though. 31 | 32 | ![Arduino Leonardo wiring](images/i2c-mega-usb_bb.png) 33 | 34 | Here's a "BS Micro ATMEGA32U4" board with pull-up resistors and a connected Wii Nunchuk) 35 | ![BS Micro ATMEGA32U4](images/bsmicro-wii.jpg) 36 | 37 | 38 | ## Install 39 | 40 | - Install avr-gcc compiler toolchain and avrdude. If you have used Arduino IDE, you may have it already (add arduino-x.x.x/hardware/tools/avr/bin/ to PATH). 41 | - Clone this repo: 42 | ``` 43 | git clone https://github.com/kasbert/I2C-Mega-USB 44 | ``` 45 | - Fetch the libraries: 46 | ``` 47 | cd I2C-Mega-USB; git submodule update --init --recursive 48 | ``` 49 | - Build the firmware: 50 | ``` 51 | make 52 | ``` 53 | - Use programmer to install the firmware. 54 | ``` 55 | make avrdude 56 | ``` 57 | 58 | ## Examples 59 | 60 | Note that the ```i2c_dev``` kernel module needs to be loaded before using any of the 61 | ```i2c-tools``` utilities. 62 | 63 | Linux users may find useful to allow normal user to access the i2c device. 64 | 65 | $ echo 'SUBSYSTEMS=="usb" ATTRS{idVendor}=="1c40" ATTRS{idProduct}=="0534" GROUP="dialout" MODE="0660"'| sudo tee /etc/udev/rules.d/99-i2c-tiny-usb.rules 66 | $ sudo systemctl restart udev 67 | 68 | $ i2cdetect -l 69 | ... 70 | i2c-9 i2c i2c-tiny-usb at bus 002 device 007 I2C adapter 71 | 72 | $ i2cdetect -y 9 73 | 74 | # With BMP180 you just might get some data.. 75 | $ i2cset -y 9 0x77 0xf4 0x2e 76 | $ i2cget -y 9 0x77 0xf6 i 3 77 | 0x75 0x7a 0x00 78 | 79 | 80 | To make Linux aware of I2C devices on the bus, use the following command: 81 | 82 | $ echo bmp085 0x77 | sudo tee /sys/class/i2c-adapter/i2c-9/new_device 83 | 84 | $ cat /sys/class/i2c-adapter/i2c-9/9-0077/temp0_input 85 | # BMP085 requires a driver (https://github.com/bsapundzhiev/bmp085) 86 | 87 | Where ```bmp085``` is the name of the kernel driver you want to associate with the 88 | I2C device, ```0x77``` is the I2C device's 7-bit address, and ```i2c-9``` is the bus 89 | number the kernel assigned to the i2c-star adapter (appears as ```i2c-tiny-usb``` 90 | in ```dmesg``` and ```i2cdetect```). 91 | 92 | 93 | ## Credits 94 | * i2c-tiny-usb. [https://github.com/harbaum/I2C-Tiny-USB] 95 | * LUFA - The Lightweight USB Framework for AVRs [https://github.com/abcminiuser/lufa/] 96 | * Arduino Core Two Wire Interface [https://github.com/arduino/ArduinoCore-avr/blob/master/libraries/Wire/src/utility/twi.c] 97 | * i2c-star [https://github.com/daniel-thompson/i2c-star] 98 | -------------------------------------------------------------------------------- /doxyfile: -------------------------------------------------------------------------------- 1 | # Doxyfile 1.9.2 2 | 3 | # This file describes the settings to be used by the documentation system 4 | # doxygen (www.doxygen.org) for a project. 5 | # 6 | # All text after a double hash (##) is considered a comment and is placed in 7 | # front of the TAG it is preceding. 8 | # 9 | # All text after a single hash (#) is considered a comment and will be ignored. 10 | # The format is: 11 | # TAG = value [value, ...] 12 | # For lists, items can also be appended using: 13 | # TAG += value [value, ...] 14 | # Values that contain spaces should be placed between quotes (\" \"). 15 | 16 | #--------------------------------------------------------------------------- 17 | # Project related configuration options 18 | #--------------------------------------------------------------------------- 19 | 20 | # This tag specifies the encoding used for all characters in the configuration 21 | # file that follow. The default is UTF-8 which is also the encoding used for all 22 | # text before the first occurrence of this tag. Doxygen uses libiconv (or the 23 | # iconv built into libc) for the transcoding. See 24 | # https://www.gnu.org/software/libiconv/ for the list of possible encodings. 25 | # The default value is: UTF-8. 26 | 27 | DOXYFILE_ENCODING = UTF-8 28 | 29 | # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by 30 | # double-quotes, unless you are using Doxywizard) that should identify the 31 | # project for which the documentation is generated. This name is used in the 32 | # title of most generated pages and in a few other places. 33 | # The default value is: My Project. 34 | 35 | PROJECT_NAME = "I2CUSB Project" 36 | 37 | # The PROJECT_NUMBER tag can be used to enter a project or revision number. This 38 | # could be handy for archiving the generated documentation or if some version 39 | # control system is used. 40 | 41 | PROJECT_NUMBER = 42 | 43 | # Using the PROJECT_BRIEF tag one can provide an optional one line description 44 | # for a project that appears at the top of each page and should give viewer a 45 | # quick idea about the purpose of the project. Keep the description short. 46 | 47 | PROJECT_BRIEF = 48 | 49 | # With the PROJECT_LOGO tag one can specify a logo or an icon that is included 50 | # in the documentation. The maximum height of the logo should not exceed 55 51 | # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy 52 | # the logo to the output directory. 53 | 54 | PROJECT_LOGO = 55 | 56 | # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path 57 | # into which the generated documentation will be written. If a relative path is 58 | # entered, it will be relative to the location where doxygen was started. If 59 | # left blank the current directory will be used. 60 | 61 | OUTPUT_DIRECTORY = ./Documentation/ 62 | 63 | # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- 64 | # directories (in 2 levels) under the output directory of each output format and 65 | # will distribute the generated files over these directories. Enabling this 66 | # option can be useful when feeding doxygen a huge amount of source files, where 67 | # putting all generated files in the same directory would otherwise causes 68 | # performance problems for the file system. 69 | # The default value is: NO. 70 | 71 | CREATE_SUBDIRS = NO 72 | 73 | # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII 74 | # characters to appear in the names of generated files. If set to NO, non-ASCII 75 | # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode 76 | # U+3044. 77 | # The default value is: NO. 78 | 79 | ALLOW_UNICODE_NAMES = NO 80 | 81 | # The OUTPUT_LANGUAGE tag is used to specify the language in which all 82 | # documentation generated by doxygen is written. Doxygen will use this 83 | # information to generate all constant output in the proper language. 84 | # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, 85 | # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), 86 | # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, 87 | # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), 88 | # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, 89 | # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, 90 | # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, 91 | # Ukrainian and Vietnamese. 92 | # The default value is: English. 93 | 94 | OUTPUT_LANGUAGE = English 95 | 96 | # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member 97 | # descriptions after the members that are listed in the file and class 98 | # documentation (similar to Javadoc). Set to NO to disable this. 99 | # The default value is: YES. 100 | 101 | BRIEF_MEMBER_DESC = YES 102 | 103 | # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief 104 | # description of a member or function before the detailed description 105 | # 106 | # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 107 | # brief descriptions will be completely suppressed. 108 | # The default value is: YES. 109 | 110 | REPEAT_BRIEF = YES 111 | 112 | # This tag implements a quasi-intelligent brief description abbreviator that is 113 | # used to form the text in various listings. Each string in this list, if found 114 | # as the leading text of the brief description, will be stripped from the text 115 | # and the result, after processing the whole list, is used as the annotated 116 | # text. Otherwise, the brief description is used as-is. If left blank, the 117 | # following values are used ($name is automatically replaced with the name of 118 | # the entity):The $name class, The $name widget, The $name file, is, provides, 119 | # specifies, contains, represents, a, an and the. 120 | 121 | ABBREVIATE_BRIEF = "The $name class" \ 122 | "The $name widget" \ 123 | "The $name file" \ 124 | is \ 125 | provides \ 126 | specifies \ 127 | contains \ 128 | represents \ 129 | a \ 130 | an \ 131 | the 132 | 133 | # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 134 | # doxygen will generate a detailed section even if there is only a brief 135 | # description. 136 | # The default value is: NO. 137 | 138 | ALWAYS_DETAILED_SEC = NO 139 | 140 | # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 141 | # inherited members of a class in the documentation of that class as if those 142 | # members were ordinary class members. Constructors, destructors and assignment 143 | # operators of the base classes will not be shown. 144 | # The default value is: NO. 145 | 146 | INLINE_INHERITED_MEMB = NO 147 | 148 | # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path 149 | # before files name in the file list and in the header files. If set to NO the 150 | # shortest path that makes the file name unique will be used 151 | # The default value is: YES. 152 | 153 | FULL_PATH_NAMES = YES 154 | 155 | # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. 156 | # Stripping is only done if one of the specified strings matches the left-hand 157 | # part of the path. The tag can be used to show relative paths in the file list. 158 | # If left blank the directory from which doxygen is run is used as the path to 159 | # strip. 160 | # 161 | # Note that you can specify absolute paths here, but also relative paths, which 162 | # will be relative from the directory where doxygen is started. 163 | # This tag requires that the tag FULL_PATH_NAMES is set to YES. 164 | 165 | STRIP_FROM_PATH = 166 | 167 | # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the 168 | # path mentioned in the documentation of a class, which tells the reader which 169 | # header file to include in order to use a class. If left blank only the name of 170 | # the header file containing the class definition is used. Otherwise one should 171 | # specify the list of include paths that are normally passed to the compiler 172 | # using the -I flag. 173 | 174 | STRIP_FROM_INC_PATH = 175 | 176 | # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but 177 | # less readable) file names. This can be useful is your file systems doesn't 178 | # support long names like on DOS, Mac, or CD-ROM. 179 | # The default value is: NO. 180 | 181 | SHORT_NAMES = YES 182 | 183 | # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the 184 | # first line (until the first dot) of a Javadoc-style comment as the brief 185 | # description. If set to NO, the Javadoc-style will behave just like regular Qt- 186 | # style comments (thus requiring an explicit @brief command for a brief 187 | # description.) 188 | # The default value is: NO. 189 | 190 | JAVADOC_AUTOBRIEF = NO 191 | 192 | # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line 193 | # such as 194 | # /*************** 195 | # as being the beginning of a Javadoc-style comment "banner". If set to NO, the 196 | # Javadoc-style will behave just like regular comments and it will not be 197 | # interpreted by doxygen. 198 | # The default value is: NO. 199 | 200 | JAVADOC_BANNER = NO 201 | 202 | # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first 203 | # line (until the first dot) of a Qt-style comment as the brief description. If 204 | # set to NO, the Qt-style will behave just like regular Qt-style comments (thus 205 | # requiring an explicit \brief command for a brief description.) 206 | # The default value is: NO. 207 | 208 | QT_AUTOBRIEF = NO 209 | 210 | # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a 211 | # multi-line C++ special comment block (i.e. a block of //! or /// comments) as 212 | # a brief description. This used to be the default behavior. The new default is 213 | # to treat a multi-line C++ comment block as a detailed description. Set this 214 | # tag to YES if you prefer the old behavior instead. 215 | # 216 | # Note that setting this tag to YES also means that rational rose comments are 217 | # not recognized any more. 218 | # The default value is: NO. 219 | 220 | MULTILINE_CPP_IS_BRIEF = NO 221 | 222 | # By default Python docstrings are displayed as preformatted text and doxygen's 223 | # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the 224 | # doxygen's special commands can be used and the contents of the docstring 225 | # documentation blocks is shown as doxygen documentation. 226 | # The default value is: YES. 227 | 228 | PYTHON_DOCSTRING = YES 229 | 230 | # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the 231 | # documentation from any documented member that it re-implements. 232 | # The default value is: YES. 233 | 234 | INHERIT_DOCS = YES 235 | 236 | # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new 237 | # page for each member. If set to NO, the documentation of a member will be part 238 | # of the file/class/namespace that contains it. 239 | # The default value is: NO. 240 | 241 | SEPARATE_MEMBER_PAGES = NO 242 | 243 | # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen 244 | # uses this value to replace tabs by spaces in code fragments. 245 | # Minimum value: 1, maximum value: 16, default value: 4. 246 | 247 | TAB_SIZE = 4 248 | 249 | # This tag can be used to specify a number of aliases that act as commands in 250 | # the documentation. An alias has the form: 251 | # name=value 252 | # For example adding 253 | # "sideeffect=@par Side Effects:^^" 254 | # will allow you to put the command \sideeffect (or @sideeffect) in the 255 | # documentation, which will result in a user-defined paragraph with heading 256 | # "Side Effects:". Note that you cannot put \n's in the value part of an alias 257 | # to insert newlines (in the resulting output). You can put ^^ in the value part 258 | # of an alias to insert a newline as if a physical newline was in the original 259 | # file. When you need a literal { or } or , in the value part of an alias you 260 | # have to escape them by means of a backslash (\), this can lead to conflicts 261 | # with the commands \{ and \} for these it is advised to use the version @{ and 262 | # @} or use a double escape (\\{ and \\}) 263 | 264 | ALIASES = 265 | 266 | # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 267 | # only. Doxygen will then generate output that is more tailored for C. For 268 | # instance, some of the names that are used will be different. The list of all 269 | # members will be omitted, etc. 270 | # The default value is: NO. 271 | 272 | OPTIMIZE_OUTPUT_FOR_C = YES 273 | 274 | # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or 275 | # Python sources only. Doxygen will then generate output that is more tailored 276 | # for that language. For instance, namespaces will be presented as packages, 277 | # qualified scopes will look different, etc. 278 | # The default value is: NO. 279 | 280 | OPTIMIZE_OUTPUT_JAVA = NO 281 | 282 | # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 283 | # sources. Doxygen will then generate output that is tailored for Fortran. 284 | # The default value is: NO. 285 | 286 | OPTIMIZE_FOR_FORTRAN = NO 287 | 288 | # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 289 | # sources. Doxygen will then generate output that is tailored for VHDL. 290 | # The default value is: NO. 291 | 292 | OPTIMIZE_OUTPUT_VHDL = NO 293 | 294 | # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice 295 | # sources only. Doxygen will then generate output that is more tailored for that 296 | # language. For instance, namespaces will be presented as modules, types will be 297 | # separated into more groups, etc. 298 | # The default value is: NO. 299 | 300 | OPTIMIZE_OUTPUT_SLICE = NO 301 | 302 | # Doxygen selects the parser to use depending on the extension of the files it 303 | # parses. With this tag you can assign which parser to use for a given 304 | # extension. Doxygen has a built-in mapping, but you can override or extend it 305 | # using this tag. The format is ext=language, where ext is a file extension, and 306 | # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, 307 | # Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, 308 | # VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: 309 | # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser 310 | # tries to guess whether the code is fixed or free formatted code, this is the 311 | # default for Fortran type files). For instance to make doxygen treat .inc files 312 | # as Fortran files (default is PHP), and .f files as C (default is Fortran), 313 | # use: inc=Fortran f=C. 314 | # 315 | # Note: For files without extension you can use no_extension as a placeholder. 316 | # 317 | # Note that for custom extensions you also need to set FILE_PATTERNS otherwise 318 | # the files are not read by doxygen. When specifying no_extension you should add 319 | # * to the FILE_PATTERNS. 320 | # 321 | # Note see also the list of default file extension mappings. 322 | 323 | EXTENSION_MAPPING = 324 | 325 | # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments 326 | # according to the Markdown format, which allows for more readable 327 | # documentation. See https://daringfireball.net/projects/markdown/ for details. 328 | # The output of markdown processing is further processed by doxygen, so you can 329 | # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in 330 | # case of backward compatibilities issues. 331 | # The default value is: YES. 332 | 333 | MARKDOWN_SUPPORT = NO 334 | 335 | # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up 336 | # to that level are automatically included in the table of contents, even if 337 | # they do not have an id attribute. 338 | # Note: This feature currently applies only to Markdown headings. 339 | # Minimum value: 0, maximum value: 99, default value: 5. 340 | # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. 341 | 342 | TOC_INCLUDE_HEADINGS = 5 343 | 344 | # When enabled doxygen tries to link words that correspond to documented 345 | # classes, or namespaces to their corresponding documentation. Such a link can 346 | # be prevented in individual cases by putting a % sign in front of the word or 347 | # globally by setting AUTOLINK_SUPPORT to NO. 348 | # The default value is: YES. 349 | 350 | AUTOLINK_SUPPORT = YES 351 | 352 | # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 353 | # to include (a tag file for) the STL sources as input, then you should set this 354 | # tag to YES in order to let doxygen match functions declarations and 355 | # definitions whose arguments contain STL classes (e.g. func(std::string); 356 | # versus func(std::string) {}). This also make the inheritance and collaboration 357 | # diagrams that involve STL classes more complete and accurate. 358 | # The default value is: NO. 359 | 360 | BUILTIN_STL_SUPPORT = NO 361 | 362 | # If you use Microsoft's C++/CLI language, you should set this option to YES to 363 | # enable parsing support. 364 | # The default value is: NO. 365 | 366 | CPP_CLI_SUPPORT = NO 367 | 368 | # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: 369 | # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen 370 | # will parse them like normal C++ but will assume all classes use public instead 371 | # of private inheritance when no explicit protection keyword is present. 372 | # The default value is: NO. 373 | 374 | SIP_SUPPORT = NO 375 | 376 | # For Microsoft's IDL there are propget and propput attributes to indicate 377 | # getter and setter methods for a property. Setting this option to YES will make 378 | # doxygen to replace the get and set methods by a property in the documentation. 379 | # This will only work if the methods are indeed getting or setting a simple 380 | # type. If this is not the case, or you want to show the methods anyway, you 381 | # should set this option to NO. 382 | # The default value is: YES. 383 | 384 | IDL_PROPERTY_SUPPORT = YES 385 | 386 | # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 387 | # tag is set to YES then doxygen will reuse the documentation of the first 388 | # member in the group (if any) for the other members of the group. By default 389 | # all members of a group must be documented explicitly. 390 | # The default value is: NO. 391 | 392 | DISTRIBUTE_GROUP_DOC = NO 393 | 394 | # If one adds a struct or class to a group and this option is enabled, then also 395 | # any nested class or struct is added to the same group. By default this option 396 | # is disabled and one has to add nested compounds explicitly via \ingroup. 397 | # The default value is: NO. 398 | 399 | GROUP_NESTED_COMPOUNDS = NO 400 | 401 | # Set the SUBGROUPING tag to YES to allow class member groups of the same type 402 | # (for instance a group of public functions) to be put as a subgroup of that 403 | # type (e.g. under the Public Functions section). Set it to NO to prevent 404 | # subgrouping. Alternatively, this can be done per class using the 405 | # \nosubgrouping command. 406 | # The default value is: YES. 407 | 408 | SUBGROUPING = YES 409 | 410 | # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions 411 | # are shown inside the group in which they are included (e.g. using \ingroup) 412 | # instead of on a separate page (for HTML and Man pages) or section (for LaTeX 413 | # and RTF). 414 | # 415 | # Note that this feature does not work in combination with 416 | # SEPARATE_MEMBER_PAGES. 417 | # The default value is: NO. 418 | 419 | INLINE_GROUPED_CLASSES = NO 420 | 421 | # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions 422 | # with only public data fields or simple typedef fields will be shown inline in 423 | # the documentation of the scope in which they are defined (i.e. file, 424 | # namespace, or group documentation), provided this scope is documented. If set 425 | # to NO, structs, classes, and unions are shown on a separate page (for HTML and 426 | # Man pages) or section (for LaTeX and RTF). 427 | # The default value is: NO. 428 | 429 | INLINE_SIMPLE_STRUCTS = NO 430 | 431 | # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or 432 | # enum is documented as struct, union, or enum with the name of the typedef. So 433 | # typedef struct TypeS {} TypeT, will appear in the documentation as a struct 434 | # with name TypeT. When disabled the typedef will appear as a member of a file, 435 | # namespace, or class. And the struct will be named TypeS. This can typically be 436 | # useful for C code in case the coding convention dictates that all compound 437 | # types are typedef'ed and only the typedef is referenced, never the tag name. 438 | # The default value is: NO. 439 | 440 | TYPEDEF_HIDES_STRUCT = NO 441 | 442 | # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This 443 | # cache is used to resolve symbols given their name and scope. Since this can be 444 | # an expensive process and often the same symbol appears multiple times in the 445 | # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small 446 | # doxygen will become slower. If the cache is too large, memory is wasted. The 447 | # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range 448 | # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 449 | # symbols. At the end of a run doxygen will report the cache usage and suggest 450 | # the optimal cache size from a speed point of view. 451 | # Minimum value: 0, maximum value: 9, default value: 0. 452 | 453 | LOOKUP_CACHE_SIZE = 0 454 | 455 | # The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use 456 | # during processing. When set to 0 doxygen will based this on the number of 457 | # cores available in the system. You can set it explicitly to a value larger 458 | # than 0 to get more control over the balance between CPU load and processing 459 | # speed. At this moment only the input processing can be done using multiple 460 | # threads. Since this is still an experimental feature the default is set to 1, 461 | # which effectively disables parallel processing. Please report any issues you 462 | # encounter. Generating dot graphs in parallel is controlled by the 463 | # DOT_NUM_THREADS setting. 464 | # Minimum value: 0, maximum value: 32, default value: 1. 465 | 466 | NUM_PROC_THREADS = 1 467 | 468 | #--------------------------------------------------------------------------- 469 | # Build related configuration options 470 | #--------------------------------------------------------------------------- 471 | 472 | # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in 473 | # documentation are documented, even if no documentation was available. Private 474 | # class members and static file members will be hidden unless the 475 | # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. 476 | # Note: This will also disable the warnings about undocumented members that are 477 | # normally produced when WARNINGS is set to YES. 478 | # The default value is: NO. 479 | 480 | EXTRACT_ALL = YES 481 | 482 | # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will 483 | # be included in the documentation. 484 | # The default value is: NO. 485 | 486 | EXTRACT_PRIVATE = YES 487 | 488 | # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual 489 | # methods of a class will be included in the documentation. 490 | # The default value is: NO. 491 | 492 | EXTRACT_PRIV_VIRTUAL = NO 493 | 494 | # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal 495 | # scope will be included in the documentation. 496 | # The default value is: NO. 497 | 498 | EXTRACT_PACKAGE = NO 499 | 500 | # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be 501 | # included in the documentation. 502 | # The default value is: NO. 503 | 504 | EXTRACT_STATIC = YES 505 | 506 | # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined 507 | # locally in source files will be included in the documentation. If set to NO, 508 | # only classes defined in header files are included. Does not have any effect 509 | # for Java sources. 510 | # The default value is: YES. 511 | 512 | EXTRACT_LOCAL_CLASSES = YES 513 | 514 | # This flag is only useful for Objective-C code. If set to YES, local methods, 515 | # which are defined in the implementation section but not in the interface are 516 | # included in the documentation. If set to NO, only methods in the interface are 517 | # included. 518 | # The default value is: NO. 519 | 520 | EXTRACT_LOCAL_METHODS = NO 521 | 522 | # If this flag is set to YES, the members of anonymous namespaces will be 523 | # extracted and appear in the documentation as a namespace called 524 | # 'anonymous_namespace{file}', where file will be replaced with the base name of 525 | # the file that contains the anonymous namespace. By default anonymous namespace 526 | # are hidden. 527 | # The default value is: NO. 528 | 529 | EXTRACT_ANON_NSPACES = NO 530 | 531 | # If this flag is set to YES, the name of an unnamed parameter in a declaration 532 | # will be determined by the corresponding definition. By default unnamed 533 | # parameters remain unnamed in the output. 534 | # The default value is: YES. 535 | 536 | RESOLVE_UNNAMED_PARAMS = YES 537 | 538 | # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all 539 | # undocumented members inside documented classes or files. If set to NO these 540 | # members will be included in the various overviews, but no documentation 541 | # section is generated. This option has no effect if EXTRACT_ALL is enabled. 542 | # The default value is: NO. 543 | 544 | HIDE_UNDOC_MEMBERS = NO 545 | 546 | # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all 547 | # undocumented classes that are normally visible in the class hierarchy. If set 548 | # to NO, these classes will be included in the various overviews. This option 549 | # has no effect if EXTRACT_ALL is enabled. 550 | # The default value is: NO. 551 | 552 | HIDE_UNDOC_CLASSES = NO 553 | 554 | # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend 555 | # declarations. If set to NO, these declarations will be included in the 556 | # documentation. 557 | # The default value is: NO. 558 | 559 | HIDE_FRIEND_COMPOUNDS = NO 560 | 561 | # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any 562 | # documentation blocks found inside the body of a function. If set to NO, these 563 | # blocks will be appended to the function's detailed documentation block. 564 | # The default value is: NO. 565 | 566 | HIDE_IN_BODY_DOCS = NO 567 | 568 | # The INTERNAL_DOCS tag determines if documentation that is typed after a 569 | # \internal command is included. If the tag is set to NO then the documentation 570 | # will be excluded. Set it to YES to include the internal documentation. 571 | # The default value is: NO. 572 | 573 | INTERNAL_DOCS = NO 574 | 575 | # With the correct setting of option CASE_SENSE_NAMES doxygen will better be 576 | # able to match the capabilities of the underlying filesystem. In case the 577 | # filesystem is case sensitive (i.e. it supports files in the same directory 578 | # whose names only differ in casing), the option must be set to YES to properly 579 | # deal with such files in case they appear in the input. For filesystems that 580 | # are not case sensitive the option should be be set to NO to properly deal with 581 | # output files written for symbols that only differ in casing, such as for two 582 | # classes, one named CLASS and the other named Class, and to also support 583 | # references to files without having to specify the exact matching casing. On 584 | # Windows (including Cygwin) and MacOS, users should typically set this option 585 | # to NO, whereas on Linux or other Unix flavors it should typically be set to 586 | # YES. 587 | # The default value is: system dependent. 588 | 589 | CASE_SENSE_NAMES = NO 590 | 591 | # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with 592 | # their full class and namespace scopes in the documentation. If set to YES, the 593 | # scope will be hidden. 594 | # The default value is: NO. 595 | 596 | HIDE_SCOPE_NAMES = NO 597 | 598 | # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will 599 | # append additional text to a page's title, such as Class Reference. If set to 600 | # YES the compound reference will be hidden. 601 | # The default value is: NO. 602 | 603 | HIDE_COMPOUND_REFERENCE= NO 604 | 605 | # If the SHOW_HEADERFILE tag is set to YES then the documentation for a class 606 | # will show which file needs to be included to use the class. 607 | # The default value is: YES. 608 | 609 | SHOW_HEADERFILE = YES 610 | 611 | # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of 612 | # the files that are included by a file in the documentation of that file. 613 | # The default value is: YES. 614 | 615 | SHOW_INCLUDE_FILES = YES 616 | 617 | # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each 618 | # grouped member an include statement to the documentation, telling the reader 619 | # which file to include in order to use the member. 620 | # The default value is: NO. 621 | 622 | SHOW_GROUPED_MEMB_INC = NO 623 | 624 | # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include 625 | # files with double quotes in the documentation rather than with sharp brackets. 626 | # The default value is: NO. 627 | 628 | FORCE_LOCAL_INCLUDES = NO 629 | 630 | # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the 631 | # documentation for inline members. 632 | # The default value is: YES. 633 | 634 | INLINE_INFO = YES 635 | 636 | # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the 637 | # (detailed) documentation of file and class members alphabetically by member 638 | # name. If set to NO, the members will appear in declaration order. 639 | # The default value is: YES. 640 | 641 | SORT_MEMBER_DOCS = YES 642 | 643 | # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief 644 | # descriptions of file, namespace and class members alphabetically by member 645 | # name. If set to NO, the members will appear in declaration order. Note that 646 | # this will also influence the order of the classes in the class list. 647 | # The default value is: NO. 648 | 649 | SORT_BRIEF_DOCS = NO 650 | 651 | # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the 652 | # (brief and detailed) documentation of class members so that constructors and 653 | # destructors are listed first. If set to NO the constructors will appear in the 654 | # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. 655 | # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief 656 | # member documentation. 657 | # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting 658 | # detailed member documentation. 659 | # The default value is: NO. 660 | 661 | SORT_MEMBERS_CTORS_1ST = NO 662 | 663 | # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy 664 | # of group names into alphabetical order. If set to NO the group names will 665 | # appear in their defined order. 666 | # The default value is: NO. 667 | 668 | SORT_GROUP_NAMES = NO 669 | 670 | # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by 671 | # fully-qualified names, including namespaces. If set to NO, the class list will 672 | # be sorted only by class name, not including the namespace part. 673 | # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 674 | # Note: This option applies only to the class list, not to the alphabetical 675 | # list. 676 | # The default value is: NO. 677 | 678 | SORT_BY_SCOPE_NAME = NO 679 | 680 | # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper 681 | # type resolution of all parameters of a function it will reject a match between 682 | # the prototype and the implementation of a member function even if there is 683 | # only one candidate or it is obvious which candidate to choose by doing a 684 | # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still 685 | # accept a match between prototype and implementation in such cases. 686 | # The default value is: NO. 687 | 688 | STRICT_PROTO_MATCHING = NO 689 | 690 | # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo 691 | # list. This list is created by putting \todo commands in the documentation. 692 | # The default value is: YES. 693 | 694 | GENERATE_TODOLIST = NO 695 | 696 | # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test 697 | # list. This list is created by putting \test commands in the documentation. 698 | # The default value is: YES. 699 | 700 | GENERATE_TESTLIST = NO 701 | 702 | # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug 703 | # list. This list is created by putting \bug commands in the documentation. 704 | # The default value is: YES. 705 | 706 | GENERATE_BUGLIST = NO 707 | 708 | # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) 709 | # the deprecated list. This list is created by putting \deprecated commands in 710 | # the documentation. 711 | # The default value is: YES. 712 | 713 | GENERATE_DEPRECATEDLIST= YES 714 | 715 | # The ENABLED_SECTIONS tag can be used to enable conditional documentation 716 | # sections, marked by \if ... \endif and \cond 717 | # ... \endcond blocks. 718 | 719 | ENABLED_SECTIONS = 720 | 721 | # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the 722 | # initial value of a variable or macro / define can have for it to appear in the 723 | # documentation. If the initializer consists of more lines than specified here 724 | # it will be hidden. Use a value of 0 to hide initializers completely. The 725 | # appearance of the value of individual variables and macros / defines can be 726 | # controlled using \showinitializer or \hideinitializer command in the 727 | # documentation regardless of this setting. 728 | # Minimum value: 0, maximum value: 10000, default value: 30. 729 | 730 | MAX_INITIALIZER_LINES = 30 731 | 732 | # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at 733 | # the bottom of the documentation of classes and structs. If set to YES, the 734 | # list will mention the files that were used to generate the documentation. 735 | # The default value is: YES. 736 | 737 | SHOW_USED_FILES = YES 738 | 739 | # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This 740 | # will remove the Files entry from the Quick Index and from the Folder Tree View 741 | # (if specified). 742 | # The default value is: YES. 743 | 744 | SHOW_FILES = YES 745 | 746 | # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces 747 | # page. This will remove the Namespaces entry from the Quick Index and from the 748 | # Folder Tree View (if specified). 749 | # The default value is: YES. 750 | 751 | SHOW_NAMESPACES = YES 752 | 753 | # The FILE_VERSION_FILTER tag can be used to specify a program or script that 754 | # doxygen should invoke to get the current version for each file (typically from 755 | # the version control system). Doxygen will invoke the program by executing (via 756 | # popen()) the command command input-file, where command is the value of the 757 | # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided 758 | # by doxygen. Whatever the program writes to standard output is used as the file 759 | # version. For an example see the documentation. 760 | 761 | FILE_VERSION_FILTER = 762 | 763 | # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 764 | # by doxygen. The layout file controls the global structure of the generated 765 | # output files in an output format independent way. To create the layout file 766 | # that represents doxygen's defaults, run doxygen with the -l option. You can 767 | # optionally specify a file name after the option, if omitted DoxygenLayout.xml 768 | # will be used as the name of the layout file. See also section "Changing the 769 | # layout of pages" for information. 770 | # 771 | # Note that if you run doxygen from a directory containing a file called 772 | # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE 773 | # tag is left empty. 774 | 775 | LAYOUT_FILE = 776 | 777 | # The CITE_BIB_FILES tag can be used to specify one or more bib files containing 778 | # the reference definitions. This must be a list of .bib files. The .bib 779 | # extension is automatically appended if omitted. This requires the bibtex tool 780 | # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. 781 | # For LaTeX the style of the bibliography can be controlled using 782 | # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the 783 | # search path. See also \cite for info how to create references. 784 | 785 | CITE_BIB_FILES = 786 | 787 | #--------------------------------------------------------------------------- 788 | # Configuration options related to warning and progress messages 789 | #--------------------------------------------------------------------------- 790 | 791 | # The QUIET tag can be used to turn on/off the messages that are generated to 792 | # standard output by doxygen. If QUIET is set to YES this implies that the 793 | # messages are off. 794 | # The default value is: NO. 795 | 796 | QUIET = YES 797 | 798 | # The WARNINGS tag can be used to turn on/off the warning messages that are 799 | # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES 800 | # this implies that the warnings are on. 801 | # 802 | # Tip: Turn warnings on while writing the documentation. 803 | # The default value is: YES. 804 | 805 | WARNINGS = YES 806 | 807 | # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate 808 | # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag 809 | # will automatically be disabled. 810 | # The default value is: YES. 811 | 812 | WARN_IF_UNDOCUMENTED = YES 813 | 814 | # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for 815 | # potential errors in the documentation, such as documenting some parameters in 816 | # a documented function twice, or documenting parameters that don't exist or 817 | # using markup commands wrongly. 818 | # The default value is: YES. 819 | 820 | WARN_IF_DOC_ERROR = YES 821 | 822 | # If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete 823 | # function parameter documentation. If set to NO, doxygen will accept that some 824 | # parameters have no documentation without warning. 825 | # The default value is: YES. 826 | 827 | WARN_IF_INCOMPLETE_DOC = YES 828 | 829 | # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that 830 | # are documented, but have no documentation for their parameters or return 831 | # value. If set to NO, doxygen will only warn about wrong parameter 832 | # documentation, but not about the absence of documentation. If EXTRACT_ALL is 833 | # set to YES then this flag will automatically be disabled. See also 834 | # WARN_IF_INCOMPLETE_DOC 835 | # The default value is: NO. 836 | 837 | WARN_NO_PARAMDOC = YES 838 | 839 | # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when 840 | # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS 841 | # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but 842 | # at the end of the doxygen process doxygen will return with a non-zero status. 843 | # Possible values are: NO, YES and FAIL_ON_WARNINGS. 844 | # The default value is: NO. 845 | 846 | WARN_AS_ERROR = NO 847 | 848 | # The WARN_FORMAT tag determines the format of the warning messages that doxygen 849 | # can produce. The string should contain the $file, $line, and $text tags, which 850 | # will be replaced by the file and line number from which the warning originated 851 | # and the warning text. Optionally the format may contain $version, which will 852 | # be replaced by the version of the file (if it could be obtained via 853 | # FILE_VERSION_FILTER) 854 | # The default value is: $file:$line: $text. 855 | 856 | WARN_FORMAT = "$file:$line: $text" 857 | 858 | # The WARN_LOGFILE tag can be used to specify a file to which warning and error 859 | # messages should be written. If left blank the output is written to standard 860 | # error (stderr). 861 | 862 | WARN_LOGFILE = 863 | 864 | #--------------------------------------------------------------------------- 865 | # Configuration options related to the input files 866 | #--------------------------------------------------------------------------- 867 | 868 | # The INPUT tag is used to specify the files and/or directories that contain 869 | # documented source files. You may enter file names like myfile.cpp or 870 | # directories like /usr/src/myproject. Separate the files or directories with 871 | # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING 872 | # Note: If this tag is empty the current directory is searched. 873 | 874 | INPUT = ./ 875 | 876 | # This tag can be used to specify the character encoding of the source files 877 | # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses 878 | # libiconv (or the iconv built into libc) for the transcoding. See the libiconv 879 | # documentation (see: 880 | # https://www.gnu.org/software/libiconv/) for the list of possible encodings. 881 | # The default value is: UTF-8. 882 | 883 | INPUT_ENCODING = UTF-8 884 | 885 | # If the value of the INPUT tag contains directories, you can use the 886 | # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and 887 | # *.h) to filter out the source-files in the directories. 888 | # 889 | # Note that for custom extensions or not directly supported extensions you also 890 | # need to set EXTENSION_MAPPING for the extension otherwise the files are not 891 | # read by doxygen. 892 | # 893 | # Note the list of default checked file patterns might differ from the list of 894 | # default file extension mappings. 895 | # 896 | # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, 897 | # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, 898 | # *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, 899 | # *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C 900 | # comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, 901 | # *.vhdl, *.ucf, *.qsf and *.ice. 902 | 903 | FILE_PATTERNS = *.h \ 904 | *.c \ 905 | *.txt 906 | 907 | # The RECURSIVE tag can be used to specify whether or not subdirectories should 908 | # be searched for input files as well. 909 | # The default value is: NO. 910 | 911 | RECURSIVE = YES 912 | 913 | # The EXCLUDE tag can be used to specify files and/or directories that should be 914 | # excluded from the INPUT source files. This way you can easily exclude a 915 | # subdirectory from a directory tree whose root is specified with the INPUT tag. 916 | # 917 | # Note that relative paths are relative to the directory from which doxygen is 918 | # run. 919 | 920 | EXCLUDE = Documentation/ 921 | 922 | # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or 923 | # directories that are symbolic links (a Unix file system feature) are excluded 924 | # from the input. 925 | # The default value is: NO. 926 | 927 | EXCLUDE_SYMLINKS = NO 928 | 929 | # If the value of the INPUT tag contains directories, you can use the 930 | # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 931 | # certain files from those directories. 932 | # 933 | # Note that the wildcards are matched against the file with absolute path, so to 934 | # exclude all test directories for example use the pattern */test/* 935 | 936 | EXCLUDE_PATTERNS = 937 | 938 | # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 939 | # (namespaces, classes, functions, etc.) that should be excluded from the 940 | # output. The symbol name can be a fully qualified name, a word, or if the 941 | # wildcard * is used, a substring. Examples: ANamespace, AClass, 942 | # AClass::ANamespace, ANamespace::*Test 943 | # 944 | # Note that the wildcards are matched against the file with absolute path, so to 945 | # exclude all test directories use the pattern */test/* 946 | 947 | EXCLUDE_SYMBOLS = __* \ 948 | INCLUDE_FROM_* 949 | 950 | # The EXAMPLE_PATH tag can be used to specify one or more files or directories 951 | # that contain example code fragments that are included (see the \include 952 | # command). 953 | 954 | EXAMPLE_PATH = 955 | 956 | # If the value of the EXAMPLE_PATH tag contains directories, you can use the 957 | # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and 958 | # *.h) to filter out the source-files in the directories. If left blank all 959 | # files are included. 960 | 961 | EXAMPLE_PATTERNS = * 962 | 963 | # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 964 | # searched for input files to be used with the \include or \dontinclude commands 965 | # irrespective of the value of the RECURSIVE tag. 966 | # The default value is: NO. 967 | 968 | EXAMPLE_RECURSIVE = NO 969 | 970 | # The IMAGE_PATH tag can be used to specify one or more files or directories 971 | # that contain images that are to be included in the documentation (see the 972 | # \image command). 973 | 974 | IMAGE_PATH = 975 | 976 | # The INPUT_FILTER tag can be used to specify a program that doxygen should 977 | # invoke to filter for each input file. Doxygen will invoke the filter program 978 | # by executing (via popen()) the command: 979 | # 980 | # 981 | # 982 | # where is the value of the INPUT_FILTER tag, and is the 983 | # name of an input file. Doxygen will then use the output that the filter 984 | # program writes to standard output. If FILTER_PATTERNS is specified, this tag 985 | # will be ignored. 986 | # 987 | # Note that the filter must not add or remove lines; it is applied before the 988 | # code is scanned, but not when the output code is generated. If lines are added 989 | # or removed, the anchors will not be placed correctly. 990 | # 991 | # Note that for custom extensions or not directly supported extensions you also 992 | # need to set EXTENSION_MAPPING for the extension otherwise the files are not 993 | # properly processed by doxygen. 994 | 995 | INPUT_FILTER = 996 | 997 | # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 998 | # basis. Doxygen will compare the file name with each pattern and apply the 999 | # filter if there is a match. The filters are a list of the form: pattern=filter 1000 | # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how 1001 | # filters are used. If the FILTER_PATTERNS tag is empty or if none of the 1002 | # patterns match the file name, INPUT_FILTER is applied. 1003 | # 1004 | # Note that for custom extensions or not directly supported extensions you also 1005 | # need to set EXTENSION_MAPPING for the extension otherwise the files are not 1006 | # properly processed by doxygen. 1007 | 1008 | FILTER_PATTERNS = 1009 | 1010 | # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 1011 | # INPUT_FILTER) will also be used to filter the input files that are used for 1012 | # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). 1013 | # The default value is: NO. 1014 | 1015 | FILTER_SOURCE_FILES = NO 1016 | 1017 | # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file 1018 | # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and 1019 | # it is also possible to disable source filtering for a specific pattern using 1020 | # *.ext= (so without naming a filter). 1021 | # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. 1022 | 1023 | FILTER_SOURCE_PATTERNS = 1024 | 1025 | # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that 1026 | # is part of the input, its contents will be placed on the main page 1027 | # (index.html). This can be useful if you have a project on for instance GitHub 1028 | # and want to reuse the introduction page also for the doxygen output. 1029 | 1030 | USE_MDFILE_AS_MAINPAGE = 1031 | 1032 | #--------------------------------------------------------------------------- 1033 | # Configuration options related to source browsing 1034 | #--------------------------------------------------------------------------- 1035 | 1036 | # If the SOURCE_BROWSER tag is set to YES then a list of source files will be 1037 | # generated. Documented entities will be cross-referenced with these sources. 1038 | # 1039 | # Note: To get rid of all source code in the generated output, make sure that 1040 | # also VERBATIM_HEADERS is set to NO. 1041 | # The default value is: NO. 1042 | 1043 | SOURCE_BROWSER = NO 1044 | 1045 | # Setting the INLINE_SOURCES tag to YES will include the body of functions, 1046 | # classes and enums directly into the documentation. 1047 | # The default value is: NO. 1048 | 1049 | INLINE_SOURCES = NO 1050 | 1051 | # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any 1052 | # special comment blocks from generated source code fragments. Normal C, C++ and 1053 | # Fortran comments will always remain visible. 1054 | # The default value is: YES. 1055 | 1056 | STRIP_CODE_COMMENTS = YES 1057 | 1058 | # If the REFERENCED_BY_RELATION tag is set to YES then for each documented 1059 | # entity all documented functions referencing it will be listed. 1060 | # The default value is: NO. 1061 | 1062 | REFERENCED_BY_RELATION = NO 1063 | 1064 | # If the REFERENCES_RELATION tag is set to YES then for each documented function 1065 | # all documented entities called/used by that function will be listed. 1066 | # The default value is: NO. 1067 | 1068 | REFERENCES_RELATION = NO 1069 | 1070 | # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set 1071 | # to YES then the hyperlinks from functions in REFERENCES_RELATION and 1072 | # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will 1073 | # link to the documentation. 1074 | # The default value is: YES. 1075 | 1076 | REFERENCES_LINK_SOURCE = NO 1077 | 1078 | # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the 1079 | # source code will show a tooltip with additional information such as prototype, 1080 | # brief description and links to the definition and documentation. Since this 1081 | # will make the HTML file larger and loading of large files a bit slower, you 1082 | # can opt to disable this feature. 1083 | # The default value is: YES. 1084 | # This tag requires that the tag SOURCE_BROWSER is set to YES. 1085 | 1086 | SOURCE_TOOLTIPS = YES 1087 | 1088 | # If the USE_HTAGS tag is set to YES then the references to source code will 1089 | # point to the HTML generated by the htags(1) tool instead of doxygen built-in 1090 | # source browser. The htags tool is part of GNU's global source tagging system 1091 | # (see https://www.gnu.org/software/global/global.html). You will need version 1092 | # 4.8.6 or higher. 1093 | # 1094 | # To use it do the following: 1095 | # - Install the latest version of global 1096 | # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file 1097 | # - Make sure the INPUT points to the root of the source tree 1098 | # - Run doxygen as normal 1099 | # 1100 | # Doxygen will invoke htags (and that will in turn invoke gtags), so these 1101 | # tools must be available from the command line (i.e. in the search path). 1102 | # 1103 | # The result: instead of the source browser generated by doxygen, the links to 1104 | # source code will now point to the output of htags. 1105 | # The default value is: NO. 1106 | # This tag requires that the tag SOURCE_BROWSER is set to YES. 1107 | 1108 | USE_HTAGS = NO 1109 | 1110 | # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a 1111 | # verbatim copy of the header file for each class for which an include is 1112 | # specified. Set to NO to disable this. 1113 | # See also: Section \class. 1114 | # The default value is: YES. 1115 | 1116 | VERBATIM_HEADERS = NO 1117 | 1118 | # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the 1119 | # clang parser (see: 1120 | # http://clang.llvm.org/) for more accurate parsing at the cost of reduced 1121 | # performance. This can be particularly helpful with template rich C++ code for 1122 | # which doxygen's built-in parser lacks the necessary type information. 1123 | # Note: The availability of this option depends on whether or not doxygen was 1124 | # generated with the -Duse_libclang=ON option for CMake. 1125 | # The default value is: NO. 1126 | 1127 | CLANG_ASSISTED_PARSING = NO 1128 | 1129 | # If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS 1130 | # tag is set to YES then doxygen will add the directory of each input to the 1131 | # include path. 1132 | # The default value is: YES. 1133 | # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. 1134 | 1135 | CLANG_ADD_INC_PATHS = YES 1136 | 1137 | # If clang assisted parsing is enabled you can provide the compiler with command 1138 | # line options that you would normally use when invoking the compiler. Note that 1139 | # the include paths will already be set by doxygen for the files and directories 1140 | # specified with INPUT and INCLUDE_PATH. 1141 | # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. 1142 | 1143 | CLANG_OPTIONS = 1144 | 1145 | # If clang assisted parsing is enabled you can provide the clang parser with the 1146 | # path to the directory containing a file called compile_commands.json. This 1147 | # file is the compilation database (see: 1148 | # http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the 1149 | # options used when the source files were built. This is equivalent to 1150 | # specifying the -p option to a clang tool, such as clang-check. These options 1151 | # will then be passed to the parser. Any options specified with CLANG_OPTIONS 1152 | # will be added as well. 1153 | # Note: The availability of this option depends on whether or not doxygen was 1154 | # generated with the -Duse_libclang=ON option for CMake. 1155 | 1156 | CLANG_DATABASE_PATH = 1157 | 1158 | #--------------------------------------------------------------------------- 1159 | # Configuration options related to the alphabetical class index 1160 | #--------------------------------------------------------------------------- 1161 | 1162 | # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all 1163 | # compounds will be generated. Enable this if the project contains a lot of 1164 | # classes, structs, unions or interfaces. 1165 | # The default value is: YES. 1166 | 1167 | ALPHABETICAL_INDEX = YES 1168 | 1169 | # In case all classes in a project start with a common prefix, all classes will 1170 | # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag 1171 | # can be used to specify a prefix (or a list of prefixes) that should be ignored 1172 | # while generating the index headers. 1173 | # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. 1174 | 1175 | IGNORE_PREFIX = 1176 | 1177 | #--------------------------------------------------------------------------- 1178 | # Configuration options related to the HTML output 1179 | #--------------------------------------------------------------------------- 1180 | 1181 | # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output 1182 | # The default value is: YES. 1183 | 1184 | GENERATE_HTML = YES 1185 | 1186 | # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a 1187 | # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of 1188 | # it. 1189 | # The default directory is: html. 1190 | # This tag requires that the tag GENERATE_HTML is set to YES. 1191 | 1192 | HTML_OUTPUT = html 1193 | 1194 | # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each 1195 | # generated HTML page (for example: .htm, .php, .asp). 1196 | # The default value is: .html. 1197 | # This tag requires that the tag GENERATE_HTML is set to YES. 1198 | 1199 | HTML_FILE_EXTENSION = .html 1200 | 1201 | # The HTML_HEADER tag can be used to specify a user-defined HTML header file for 1202 | # each generated HTML page. If the tag is left blank doxygen will generate a 1203 | # standard header. 1204 | # 1205 | # To get valid HTML the header file that includes any scripts and style sheets 1206 | # that doxygen needs, which is dependent on the configuration options used (e.g. 1207 | # the setting GENERATE_TREEVIEW). It is highly recommended to start with a 1208 | # default header using 1209 | # doxygen -w html new_header.html new_footer.html new_stylesheet.css 1210 | # YourConfigFile 1211 | # and then modify the file new_header.html. See also section "Doxygen usage" 1212 | # for information on how to generate the default header that doxygen normally 1213 | # uses. 1214 | # Note: The header is subject to change so you typically have to regenerate the 1215 | # default header when upgrading to a newer version of doxygen. For a description 1216 | # of the possible markers and block names see the documentation. 1217 | # This tag requires that the tag GENERATE_HTML is set to YES. 1218 | 1219 | HTML_HEADER = 1220 | 1221 | # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each 1222 | # generated HTML page. If the tag is left blank doxygen will generate a standard 1223 | # footer. See HTML_HEADER for more information on how to generate a default 1224 | # footer and what special commands can be used inside the footer. See also 1225 | # section "Doxygen usage" for information on how to generate the default footer 1226 | # that doxygen normally uses. 1227 | # This tag requires that the tag GENERATE_HTML is set to YES. 1228 | 1229 | HTML_FOOTER = 1230 | 1231 | # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style 1232 | # sheet that is used by each HTML page. It can be used to fine-tune the look of 1233 | # the HTML output. If left blank doxygen will generate a default style sheet. 1234 | # See also section "Doxygen usage" for information on how to generate the style 1235 | # sheet that doxygen normally uses. 1236 | # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as 1237 | # it is more robust and this tag (HTML_STYLESHEET) will in the future become 1238 | # obsolete. 1239 | # This tag requires that the tag GENERATE_HTML is set to YES. 1240 | 1241 | HTML_STYLESHEET = 1242 | 1243 | # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined 1244 | # cascading style sheets that are included after the standard style sheets 1245 | # created by doxygen. Using this option one can overrule certain style aspects. 1246 | # This is preferred over using HTML_STYLESHEET since it does not replace the 1247 | # standard style sheet and is therefore more robust against future updates. 1248 | # Doxygen will copy the style sheet files to the output directory. 1249 | # Note: The order of the extra style sheet files is of importance (e.g. the last 1250 | # style sheet in the list overrules the setting of the previous ones in the 1251 | # list). For an example see the documentation. 1252 | # This tag requires that the tag GENERATE_HTML is set to YES. 1253 | 1254 | HTML_EXTRA_STYLESHEET = 1255 | 1256 | # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or 1257 | # other source files which should be copied to the HTML output directory. Note 1258 | # that these files will be copied to the base HTML output directory. Use the 1259 | # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 1260 | # files. In the HTML_STYLESHEET file, use the file name only. Also note that the 1261 | # files will be copied as-is; there are no commands or markers available. 1262 | # This tag requires that the tag GENERATE_HTML is set to YES. 1263 | 1264 | HTML_EXTRA_FILES = 1265 | 1266 | # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen 1267 | # will adjust the colors in the style sheet and background images according to 1268 | # this color. Hue is specified as an angle on a color-wheel, see 1269 | # https://en.wikipedia.org/wiki/Hue for more information. For instance the value 1270 | # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 1271 | # purple, and 360 is red again. 1272 | # Minimum value: 0, maximum value: 359, default value: 220. 1273 | # This tag requires that the tag GENERATE_HTML is set to YES. 1274 | 1275 | HTML_COLORSTYLE_HUE = 220 1276 | 1277 | # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors 1278 | # in the HTML output. For a value of 0 the output will use gray-scales only. A 1279 | # value of 255 will produce the most vivid colors. 1280 | # Minimum value: 0, maximum value: 255, default value: 100. 1281 | # This tag requires that the tag GENERATE_HTML is set to YES. 1282 | 1283 | HTML_COLORSTYLE_SAT = 100 1284 | 1285 | # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the 1286 | # luminance component of the colors in the HTML output. Values below 100 1287 | # gradually make the output lighter, whereas values above 100 make the output 1288 | # darker. The value divided by 100 is the actual gamma applied, so 80 represents 1289 | # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not 1290 | # change the gamma. 1291 | # Minimum value: 40, maximum value: 240, default value: 80. 1292 | # This tag requires that the tag GENERATE_HTML is set to YES. 1293 | 1294 | HTML_COLORSTYLE_GAMMA = 80 1295 | 1296 | # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 1297 | # page will contain the date and time when the page was generated. Setting this 1298 | # to YES can help to show when doxygen was last run and thus if the 1299 | # documentation is up to date. 1300 | # The default value is: NO. 1301 | # This tag requires that the tag GENERATE_HTML is set to YES. 1302 | 1303 | HTML_TIMESTAMP = NO 1304 | 1305 | # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML 1306 | # documentation will contain a main index with vertical navigation menus that 1307 | # are dynamically created via JavaScript. If disabled, the navigation index will 1308 | # consists of multiple levels of tabs that are statically embedded in every HTML 1309 | # page. Disable this option to support browsers that do not have JavaScript, 1310 | # like the Qt help browser. 1311 | # The default value is: YES. 1312 | # This tag requires that the tag GENERATE_HTML is set to YES. 1313 | 1314 | HTML_DYNAMIC_MENUS = YES 1315 | 1316 | # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 1317 | # documentation will contain sections that can be hidden and shown after the 1318 | # page has loaded. 1319 | # The default value is: NO. 1320 | # This tag requires that the tag GENERATE_HTML is set to YES. 1321 | 1322 | HTML_DYNAMIC_SECTIONS = YES 1323 | 1324 | # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries 1325 | # shown in the various tree structured indices initially; the user can expand 1326 | # and collapse entries dynamically later on. Doxygen will expand the tree to 1327 | # such a level that at most the specified number of entries are visible (unless 1328 | # a fully collapsed tree already exceeds this amount). So setting the number of 1329 | # entries 1 will produce a full collapsed tree by default. 0 is a special value 1330 | # representing an infinite number of entries and will result in a full expanded 1331 | # tree by default. 1332 | # Minimum value: 0, maximum value: 9999, default value: 100. 1333 | # This tag requires that the tag GENERATE_HTML is set to YES. 1334 | 1335 | HTML_INDEX_NUM_ENTRIES = 100 1336 | 1337 | # If the GENERATE_DOCSET tag is set to YES, additional index files will be 1338 | # generated that can be used as input for Apple's Xcode 3 integrated development 1339 | # environment (see: 1340 | # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To 1341 | # create a documentation set, doxygen will generate a Makefile in the HTML 1342 | # output directory. Running make will produce the docset in that directory and 1343 | # running make install will install the docset in 1344 | # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at 1345 | # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy 1346 | # genXcode/_index.html for more information. 1347 | # The default value is: NO. 1348 | # This tag requires that the tag GENERATE_HTML is set to YES. 1349 | 1350 | GENERATE_DOCSET = NO 1351 | 1352 | # This tag determines the name of the docset feed. A documentation feed provides 1353 | # an umbrella under which multiple documentation sets from a single provider 1354 | # (such as a company or product suite) can be grouped. 1355 | # The default value is: Doxygen generated docs. 1356 | # This tag requires that the tag GENERATE_DOCSET is set to YES. 1357 | 1358 | DOCSET_FEEDNAME = "Doxygen generated docs" 1359 | 1360 | # This tag specifies a string that should uniquely identify the documentation 1361 | # set bundle. This should be a reverse domain-name style string, e.g. 1362 | # com.mycompany.MyDocSet. Doxygen will append .docset to the name. 1363 | # The default value is: org.doxygen.Project. 1364 | # This tag requires that the tag GENERATE_DOCSET is set to YES. 1365 | 1366 | DOCSET_BUNDLE_ID = org.doxygen.Project 1367 | 1368 | # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify 1369 | # the documentation publisher. This should be a reverse domain-name style 1370 | # string, e.g. com.mycompany.MyDocSet.documentation. 1371 | # The default value is: org.doxygen.Publisher. 1372 | # This tag requires that the tag GENERATE_DOCSET is set to YES. 1373 | 1374 | DOCSET_PUBLISHER_ID = org.doxygen.Publisher 1375 | 1376 | # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. 1377 | # The default value is: Publisher. 1378 | # This tag requires that the tag GENERATE_DOCSET is set to YES. 1379 | 1380 | DOCSET_PUBLISHER_NAME = Publisher 1381 | 1382 | # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three 1383 | # additional HTML index files: index.hhp, index.hhc, and index.hhk. The 1384 | # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop 1385 | # on Windows. In the beginning of 2021 Microsoft took the original page, with 1386 | # a.o. the download links, offline the HTML help workshop was already many years 1387 | # in maintenance mode). You can download the HTML help workshop from the web 1388 | # archives at Installation executable (see: 1389 | # http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo 1390 | # ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). 1391 | # 1392 | # The HTML Help Workshop contains a compiler that can convert all HTML output 1393 | # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML 1394 | # files are now used as the Windows 98 help format, and will replace the old 1395 | # Windows help format (.hlp) on all Windows platforms in the future. Compressed 1396 | # HTML files also contain an index, a table of contents, and you can search for 1397 | # words in the documentation. The HTML workshop also contains a viewer for 1398 | # compressed HTML files. 1399 | # The default value is: NO. 1400 | # This tag requires that the tag GENERATE_HTML is set to YES. 1401 | 1402 | GENERATE_HTMLHELP = NO 1403 | 1404 | # The CHM_FILE tag can be used to specify the file name of the resulting .chm 1405 | # file. You can add a path in front of the file if the result should not be 1406 | # written to the html output directory. 1407 | # This tag requires that the tag GENERATE_HTMLHELP is set to YES. 1408 | 1409 | CHM_FILE = 1410 | 1411 | # The HHC_LOCATION tag can be used to specify the location (absolute path 1412 | # including file name) of the HTML help compiler (hhc.exe). If non-empty, 1413 | # doxygen will try to run the HTML help compiler on the generated index.hhp. 1414 | # The file has to be specified with full path. 1415 | # This tag requires that the tag GENERATE_HTMLHELP is set to YES. 1416 | 1417 | HHC_LOCATION = 1418 | 1419 | # The GENERATE_CHI flag controls if a separate .chi index file is generated 1420 | # (YES) or that it should be included in the main .chm file (NO). 1421 | # The default value is: NO. 1422 | # This tag requires that the tag GENERATE_HTMLHELP is set to YES. 1423 | 1424 | GENERATE_CHI = NO 1425 | 1426 | # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) 1427 | # and project file content. 1428 | # This tag requires that the tag GENERATE_HTMLHELP is set to YES. 1429 | 1430 | CHM_INDEX_ENCODING = 1431 | 1432 | # The BINARY_TOC flag controls whether a binary table of contents is generated 1433 | # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it 1434 | # enables the Previous and Next buttons. 1435 | # The default value is: NO. 1436 | # This tag requires that the tag GENERATE_HTMLHELP is set to YES. 1437 | 1438 | BINARY_TOC = NO 1439 | 1440 | # The TOC_EXPAND flag can be set to YES to add extra items for group members to 1441 | # the table of contents of the HTML help documentation and to the tree view. 1442 | # The default value is: NO. 1443 | # This tag requires that the tag GENERATE_HTMLHELP is set to YES. 1444 | 1445 | TOC_EXPAND = YES 1446 | 1447 | # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 1448 | # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that 1449 | # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help 1450 | # (.qch) of the generated HTML documentation. 1451 | # The default value is: NO. 1452 | # This tag requires that the tag GENERATE_HTML is set to YES. 1453 | 1454 | GENERATE_QHP = NO 1455 | 1456 | # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify 1457 | # the file name of the resulting .qch file. The path specified is relative to 1458 | # the HTML output folder. 1459 | # This tag requires that the tag GENERATE_QHP is set to YES. 1460 | 1461 | QCH_FILE = 1462 | 1463 | # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help 1464 | # Project output. For more information please see Qt Help Project / Namespace 1465 | # (see: 1466 | # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). 1467 | # The default value is: org.doxygen.Project. 1468 | # This tag requires that the tag GENERATE_QHP is set to YES. 1469 | 1470 | QHP_NAMESPACE = org.doxygen.Project 1471 | 1472 | # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt 1473 | # Help Project output. For more information please see Qt Help Project / Virtual 1474 | # Folders (see: 1475 | # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). 1476 | # The default value is: doc. 1477 | # This tag requires that the tag GENERATE_QHP is set to YES. 1478 | 1479 | QHP_VIRTUAL_FOLDER = doc 1480 | 1481 | # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom 1482 | # filter to add. For more information please see Qt Help Project / Custom 1483 | # Filters (see: 1484 | # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). 1485 | # This tag requires that the tag GENERATE_QHP is set to YES. 1486 | 1487 | QHP_CUST_FILTER_NAME = 1488 | 1489 | # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the 1490 | # custom filter to add. For more information please see Qt Help Project / Custom 1491 | # Filters (see: 1492 | # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). 1493 | # This tag requires that the tag GENERATE_QHP is set to YES. 1494 | 1495 | QHP_CUST_FILTER_ATTRS = 1496 | 1497 | # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 1498 | # project's filter section matches. Qt Help Project / Filter Attributes (see: 1499 | # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). 1500 | # This tag requires that the tag GENERATE_QHP is set to YES. 1501 | 1502 | QHP_SECT_FILTER_ATTRS = 1503 | 1504 | # The QHG_LOCATION tag can be used to specify the location (absolute path 1505 | # including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to 1506 | # run qhelpgenerator on the generated .qhp file. 1507 | # This tag requires that the tag GENERATE_QHP is set to YES. 1508 | 1509 | QHG_LOCATION = 1510 | 1511 | # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be 1512 | # generated, together with the HTML files, they form an Eclipse help plugin. To 1513 | # install this plugin and make it available under the help contents menu in 1514 | # Eclipse, the contents of the directory containing the HTML and XML files needs 1515 | # to be copied into the plugins directory of eclipse. The name of the directory 1516 | # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. 1517 | # After copying Eclipse needs to be restarted before the help appears. 1518 | # The default value is: NO. 1519 | # This tag requires that the tag GENERATE_HTML is set to YES. 1520 | 1521 | GENERATE_ECLIPSEHELP = NO 1522 | 1523 | # A unique identifier for the Eclipse help plugin. When installing the plugin 1524 | # the directory name containing the HTML and XML files should also have this 1525 | # name. Each documentation set should have its own identifier. 1526 | # The default value is: org.doxygen.Project. 1527 | # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. 1528 | 1529 | ECLIPSE_DOC_ID = org.doxygen.Project 1530 | 1531 | # If you want full control over the layout of the generated HTML pages it might 1532 | # be necessary to disable the index and replace it with your own. The 1533 | # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top 1534 | # of each HTML page. A value of NO enables the index and the value YES disables 1535 | # it. Since the tabs in the index contain the same information as the navigation 1536 | # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. 1537 | # The default value is: NO. 1538 | # This tag requires that the tag GENERATE_HTML is set to YES. 1539 | 1540 | DISABLE_INDEX = YES 1541 | 1542 | # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 1543 | # structure should be generated to display hierarchical information. If the tag 1544 | # value is set to YES, a side panel will be generated containing a tree-like 1545 | # index structure (just like the one that is generated for HTML Help). For this 1546 | # to work a browser that supports JavaScript, DHTML, CSS and frames is required 1547 | # (i.e. any modern browser). Windows users are probably better off using the 1548 | # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can 1549 | # further fine tune the look of the index (see "Fine-tuning the output"). As an 1550 | # example, the default style sheet generated by doxygen has an example that 1551 | # shows how to put an image at the root of the tree instead of the PROJECT_NAME. 1552 | # Since the tree basically has the same information as the tab index, you could 1553 | # consider setting DISABLE_INDEX to YES when enabling this option. 1554 | # The default value is: NO. 1555 | # This tag requires that the tag GENERATE_HTML is set to YES. 1556 | 1557 | GENERATE_TREEVIEW = YES 1558 | 1559 | # When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the 1560 | # FULL_SIDEBAR option determines if the side bar is limited to only the treeview 1561 | # area (value NO) or if it should extend to the full height of the window (value 1562 | # YES). Setting this to YES gives a layout similar to 1563 | # https://docs.readthedocs.io with more room for contents, but less room for the 1564 | # project logo, title, and description. If either GENERATOR_TREEVIEW or 1565 | # DISABLE_INDEX is set to NO, this option has no effect. 1566 | # The default value is: NO. 1567 | # This tag requires that the tag GENERATE_HTML is set to YES. 1568 | 1569 | FULL_SIDEBAR = NO 1570 | 1571 | # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that 1572 | # doxygen will group on one line in the generated HTML documentation. 1573 | # 1574 | # Note that a value of 0 will completely suppress the enum values from appearing 1575 | # in the overview section. 1576 | # Minimum value: 0, maximum value: 20, default value: 4. 1577 | # This tag requires that the tag GENERATE_HTML is set to YES. 1578 | 1579 | ENUM_VALUES_PER_LINE = 1 1580 | 1581 | # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used 1582 | # to set the initial width (in pixels) of the frame in which the tree is shown. 1583 | # Minimum value: 0, maximum value: 1500, default value: 250. 1584 | # This tag requires that the tag GENERATE_HTML is set to YES. 1585 | 1586 | TREEVIEW_WIDTH = 250 1587 | 1588 | # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to 1589 | # external symbols imported via tag files in a separate window. 1590 | # The default value is: NO. 1591 | # This tag requires that the tag GENERATE_HTML is set to YES. 1592 | 1593 | EXT_LINKS_IN_WINDOW = NO 1594 | 1595 | # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg 1596 | # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see 1597 | # https://inkscape.org) to generate formulas as SVG images instead of PNGs for 1598 | # the HTML output. These images will generally look nicer at scaled resolutions. 1599 | # Possible values are: png (the default) and svg (looks nicer but requires the 1600 | # pdf2svg or inkscape tool). 1601 | # The default value is: png. 1602 | # This tag requires that the tag GENERATE_HTML is set to YES. 1603 | 1604 | HTML_FORMULA_FORMAT = png 1605 | 1606 | # Use this tag to change the font size of LaTeX formulas included as images in 1607 | # the HTML documentation. When you change the font size after a successful 1608 | # doxygen run you need to manually remove any form_*.png images from the HTML 1609 | # output directory to force them to be regenerated. 1610 | # Minimum value: 8, maximum value: 50, default value: 10. 1611 | # This tag requires that the tag GENERATE_HTML is set to YES. 1612 | 1613 | FORMULA_FONTSIZE = 10 1614 | 1615 | # Use the FORMULA_TRANSPARENT tag to determine whether or not the images 1616 | # generated for formulas are transparent PNGs. Transparent PNGs are not 1617 | # supported properly for IE 6.0, but are supported on all modern browsers. 1618 | # 1619 | # Note that when changing this option you need to delete any form_*.png files in 1620 | # the HTML output directory before the changes have effect. 1621 | # The default value is: YES. 1622 | # This tag requires that the tag GENERATE_HTML is set to YES. 1623 | 1624 | FORMULA_TRANSPARENT = YES 1625 | 1626 | # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands 1627 | # to create new LaTeX commands to be used in formulas as building blocks. See 1628 | # the section "Including formulas" for details. 1629 | 1630 | FORMULA_MACROFILE = 1631 | 1632 | # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see 1633 | # https://www.mathjax.org) which uses client side JavaScript for the rendering 1634 | # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX 1635 | # installed or if you want to formulas look prettier in the HTML output. When 1636 | # enabled you may also need to install MathJax separately and configure the path 1637 | # to it using the MATHJAX_RELPATH option. 1638 | # The default value is: NO. 1639 | # This tag requires that the tag GENERATE_HTML is set to YES. 1640 | 1641 | USE_MATHJAX = NO 1642 | 1643 | # With MATHJAX_VERSION it is possible to specify the MathJax version to be used. 1644 | # Note that the different versions of MathJax have different requirements with 1645 | # regards to the different settings, so it is possible that also other MathJax 1646 | # settings have to be changed when switching between the different MathJax 1647 | # versions. 1648 | # Possible values are: MathJax_2 and MathJax_3. 1649 | # The default value is: MathJax_2. 1650 | # This tag requires that the tag USE_MATHJAX is set to YES. 1651 | 1652 | MATHJAX_VERSION = MathJax_2 1653 | 1654 | # When MathJax is enabled you can set the default output format to be used for 1655 | # the MathJax output. For more details about the output format see MathJax 1656 | # version 2 (see: 1657 | # http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 1658 | # (see: 1659 | # http://docs.mathjax.org/en/latest/web/components/output.html). 1660 | # Possible values are: HTML-CSS (which is slower, but has the best 1661 | # compatibility. This is the name for Mathjax version 2, for MathJax version 3 1662 | # this will be translated into chtml), NativeMML (i.e. MathML. Only supported 1663 | # for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This 1664 | # is the name for Mathjax version 3, for MathJax version 2 this will be 1665 | # translated into HTML-CSS) and SVG. 1666 | # The default value is: HTML-CSS. 1667 | # This tag requires that the tag USE_MATHJAX is set to YES. 1668 | 1669 | MATHJAX_FORMAT = HTML-CSS 1670 | 1671 | # When MathJax is enabled you need to specify the location relative to the HTML 1672 | # output directory using the MATHJAX_RELPATH option. The destination directory 1673 | # should contain the MathJax.js script. For instance, if the mathjax directory 1674 | # is located at the same level as the HTML output directory, then 1675 | # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax 1676 | # Content Delivery Network so you can quickly see the result without installing 1677 | # MathJax. However, it is strongly recommended to install a local copy of 1678 | # MathJax from https://www.mathjax.org before deployment. The default value is: 1679 | # - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 1680 | # - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 1681 | # This tag requires that the tag USE_MATHJAX is set to YES. 1682 | 1683 | MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest 1684 | 1685 | # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax 1686 | # extension names that should be enabled during MathJax rendering. For example 1687 | # for MathJax version 2 (see 1688 | # https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): 1689 | # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols 1690 | # For example for MathJax version 3 (see 1691 | # http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): 1692 | # MATHJAX_EXTENSIONS = ams 1693 | # This tag requires that the tag USE_MATHJAX is set to YES. 1694 | 1695 | MATHJAX_EXTENSIONS = 1696 | 1697 | # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces 1698 | # of code that will be used on startup of the MathJax code. See the MathJax site 1699 | # (see: 1700 | # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an 1701 | # example see the documentation. 1702 | # This tag requires that the tag USE_MATHJAX is set to YES. 1703 | 1704 | MATHJAX_CODEFILE = 1705 | 1706 | # When the SEARCHENGINE tag is enabled doxygen will generate a search box for 1707 | # the HTML output. The underlying search engine uses javascript and DHTML and 1708 | # should work on any modern browser. Note that when using HTML help 1709 | # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) 1710 | # there is already a search function so this one should typically be disabled. 1711 | # For large projects the javascript based search engine can be slow, then 1712 | # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to 1713 | # search using the keyboard; to jump to the search box use + S 1714 | # (what the is depends on the OS and browser, but it is typically 1715 | # , /