Added new CONCAT() and CONCAT_EXPANDED() convenience macros.
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 6 Apr 2013 22:07:54 +0000 (22:07 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 6 Apr 2013 22:07:54 +0000 (22:07 +0000)
LUFA/Common/Common.h
LUFA/DoxygenPages/ChangeLog.txt
LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h
LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h
LUFA/Drivers/Board/Dataflash.h
LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h
LUFA/Drivers/USB/Class/Common/HIDReportData.h
LUFA/Drivers/USB/Core/USBTask.h

index 9bfe1f3..c0a7112 100644 (file)
                        #include <math.h>
 
                        // === TODO: Find abstracted way to handle these ===
                        #include <math.h>
 
                        // === TODO: Find abstracted way to handle these ===
-                       #define PROGMEM                  
+                       #define PROGMEM
                        #define pgm_read_byte(x)         *x
                        #define memcmp_P(...)            memcmp(__VA_ARGS__)
                        #define memcpy_P(...)            memcpy(__VA_ARGS__)
                        #define pgm_read_byte(x)         *x
                        #define memcmp_P(...)            memcmp(__VA_ARGS__)
                        #define memcpy_P(...)            memcpy(__VA_ARGS__)
                         *  \attention This macro should only be used with operands that do not have side effects from being evaluated
                         *             multiple times.
                         *
                         *  \attention This macro should only be used with operands that do not have side effects from being evaluated
                         *             multiple times.
                         *
-                        *  \param[in] x  First value to compare
-                        *  \param[in] y  First value to compare
+                        *  \param[in] x  First value to compare.
+                        *  \param[in] y  First value to compare.
                         *
                         *  \return The smaller of the two input parameters
                         */
                         *
                         *  \return The smaller of the two input parameters
                         */
                                #define STRINGIFY_EXPANDED(x)   STRINGIFY(x)
                        #endif
 
                                #define STRINGIFY_EXPANDED(x)   STRINGIFY(x)
                        #endif
 
+                       #if !defined(CONCAT) || defined(__DOXYGEN__)
+                               /** Concatenates the given input into a single token, via the C Preprocessor.
+                                *
+                                *  \param[in] x  First item to concatenate.
+                                *  \param[in] y  Second item to concatenate.
+                                *
+                                *  \return Concatenated version of the input.
+                                */
+                               #define CONCAT(x, y)            x ## y
+
+                               /** CConcatenates the given input into a single token after macro expansion, via the C Preprocessor.
+                                *
+                                *  \param[in] x  First item to concatenate.
+                                *  \param[in] y  Second item to concatenate.
+                                *
+                                *  \return Concatenated version of the expanded input.
+                                */
+                               #define CONCAT_EXPANDED(x, y)   CONCAT(x, y)
+                       #endif
+
                        #if !defined(ISR) || defined(__DOXYGEN__)
                                /** Macro for the definition of interrupt service routines, so that the compiler can insert the required
                                 *  prologue and epilogue code to properly manage the interrupt routine without affecting the main thread's
                        #if !defined(ISR) || defined(__DOXYGEN__)
                                /** Macro for the definition of interrupt service routines, so that the compiler can insert the required
                                 *  prologue and epilogue code to properly manage the interrupt routine without affecting the main thread's
index ffe1bd0..e94b788 100644 (file)
@@ -12,6 +12,7 @@
   *   - Added new Printer class bootloader
   *   - Added new Mass Storage class bootloader
   *   - Added additional MIDI command definitions to the MIDI class driver (thanks to Daniel Dreibrodt)
   *   - Added new Printer class bootloader
   *   - Added new Mass Storage class bootloader
   *   - Added additional MIDI command definitions to the MIDI class driver (thanks to Daniel Dreibrodt)
+  *   - Added new CONCAT() and CONCAT_EXPANDED() convenience macros
   *
   *  <b>Changed:</b>
   *  - Core:
   *
   *  <b>Changed:</b>
   *  - Core:
index d2dec83..602c16f 100644 (file)
  *
  *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
  */
  *
  *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
  */
+
 /** \ingroup Group_Buttons
  *  \defgroup Group_Buttons_MICROPENDOUS_3 MICROPENDOUS_3
  *  \brief Board specific Button driver header for the Micropendous 3 (https://code.google.com/p/micropendous/wiki/Micropendous3).
  *
  *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
  */
 /** \ingroup Group_Buttons
  *  \defgroup Group_Buttons_MICROPENDOUS_3 MICROPENDOUS_3
  *  \brief Board specific Button driver header for the Micropendous 3 (https://code.google.com/p/micropendous/wiki/Micropendous3).
  *
  *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
  */
+
 /** \ingroup Group_Buttons
  *  \defgroup Group_Buttons_MICROPENDOUS_4 MICROPENDOUS_4
  *  \brief Board specific Button driver header for the Micropendous 4 (https://code.google.com/p/micropendous/wiki/Micropendous4).
 /** \ingroup Group_Buttons
  *  \defgroup Group_Buttons_MICROPENDOUS_4 MICROPENDOUS_4
  *  \brief Board specific Button driver header for the Micropendous 4 (https://code.google.com/p/micropendous/wiki/Micropendous4).
                        #define _BOARD_BUTTON1_MASK             (1 << 2)
                        #define _BOARD_BUTTON_PORTLETTER        E
                #endif
                        #define _BOARD_BUTTON1_MASK             (1 << 2)
                        #define _BOARD_BUTTON_PORTLETTER        E
                #endif
-               
-               #define _BOARD_BUTTON_CONCAT2(Reg, Letter)  Reg ## Letter
-               #define _BOARD_BUTTON_CONCAT(Reg, Letter)   _BOARD_BUTTON_CONCAT2(Reg, Letter)
 
 
-               #define _BOARD_BUTTON_PORT                 _BOARD_BUTTON_CONCAT(PORT, _BOARD_BUTTON_PORTLETTER)
-               #define _BOARD_BUTTON_PIN                  _BOARD_BUTTON_CONCAT(PIN,  _BOARD_BUTTON_PORTLETTER)
-               #define _BOARD_BUTTON_DDR                  _BOARD_BUTTON_CONCAT(DDR,  _BOARD_BUTTON_PORTLETTER)
+               #define _BOARD_BUTTON_PORT                  CONCAT_EXPANDED(PORT, _BOARD_BUTTON_PORTLETTER)
+               #define _BOARD_BUTTON_PIN                   CONCAT_EXPANDED(PIN,  _BOARD_BUTTON_PORTLETTER)
+               #define _BOARD_BUTTON_DDR                   CONCAT_EXPANDED(DDR,  _BOARD_BUTTON_PORTLETTER)
        #endif
 
        /* Public Interface - May be used in end-application: */
                /* Macros: */
                        /** Button mask for the first button on the board. */
        #endif
 
        /* Public Interface - May be used in end-application: */
                /* Macros: */
                        /** Button mask for the first button on the board. */
-                       #define BUTTONS_BUTTON1                _BOARD_BUTTON1_MASK
+                       #define BUTTONS_BUTTON1     _BOARD_BUTTON1_MASK
 
                /* Inline Functions: */
                #if !defined(__DOXYGEN__)
 
                /* Inline Functions: */
                #if !defined(__DOXYGEN__)
index d87817f..53311bd 100644 (file)
                        #define _BOARD_LED_PORTLETTER           B
                #endif
 
                        #define _BOARD_LED_PORTLETTER           B
                #endif
 
-               #define _BOARD_LED_CONCAT2(Reg, Letter)     Reg ## Letter
-               #define _BOARD_LED_CONCAT(Reg, Letter)      _BOARD_LED_CONCAT2(Reg, Letter)
-
-               #define _BOARD_LED_PORT                     _BOARD_LED_CONCAT(PORT, _BOARD_LED_PORTLETTER)
-               #define _BOARD_LED_PIN                      _BOARD_LED_CONCAT(PIN,  _BOARD_LED_PORTLETTER)
-               #define _BOARD_LED_DDR                      _BOARD_LED_CONCAT(DDR,  _BOARD_LED_PORTLETTER)
+               #define _BOARD_LED_PORT                     CONCAT_EXPANDED(PORT, _BOARD_LED_PORTLETTER)
+               #define _BOARD_LED_PIN                      CONCAT_EXPANDED(PIN,  _BOARD_LED_PORTLETTER)
+               #define _BOARD_LED_DDR                      CONCAT_EXPANDED(DDR,  _BOARD_LED_PORTLETTER)
        #endif
 
        /* Public Interface - May be used in end-application: */
        #endif
 
        /* Public Interface - May be used in end-application: */
index e05c4e7..cc4aa2e 100644 (file)
  *      SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING |
  *               SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
  *      Dataflash_Init();
  *      SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING |
  *               SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
  *      Dataflash_Init();
- *      
+ *
  *      uint8_t WriteBuffer[DATAFLASH_PAGE_SIZE];
  *      uint8_t ReadBuffer[DATAFLASH_PAGE_SIZE];
  *      uint8_t WriteBuffer[DATAFLASH_PAGE_SIZE];
  *      uint8_t ReadBuffer[DATAFLASH_PAGE_SIZE];
- *      
+ *
  *      // Fill page write buffer with a repeating pattern
  *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
  *        WriteBuffer[i] = (i & 0xFF);
  *      // Fill page write buffer with a repeating pattern
  *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
  *        WriteBuffer[i] = (i & 0xFF);
- *      
+ *
  *      // Must select the chip of interest first before operating on it
  *      Dataflash_SelectChip(DATAFLASH_CHIP1);
  *      // Must select the chip of interest first before operating on it
  *      Dataflash_SelectChip(DATAFLASH_CHIP1);
- *      
+ *
  *      // Write to the Dataflash's first internal memory buffer
  *      printf("Writing data to first dataflash buffer:\r\n");
  *      Dataflash_SendByte(DF_CMD_BUFF1WRITE);
  *      Dataflash_SendAddressBytes(0, 0);
  *      // Write to the Dataflash's first internal memory buffer
  *      printf("Writing data to first dataflash buffer:\r\n");
  *      Dataflash_SendByte(DF_CMD_BUFF1WRITE);
  *      Dataflash_SendAddressBytes(0, 0);
- *      
+ *
  *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
  *        Dataflash_SendByte(WriteBuffer[i]);
  *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
  *        Dataflash_SendByte(WriteBuffer[i]);
- *      
+ *
  *      // Commit the Dataflash's first memory buffer to the non-volatile FLASH memory
  *      printf("Committing page to non-volatile memory page index 5:\r\n");
  *      Dataflash_SendByte(DF_CMD_BUFF1TOMAINMEMWITHERASE);
  *      Dataflash_SendAddressBytes(5, 0);
  *      Dataflash_WaitWhileBusy();
  *      // Commit the Dataflash's first memory buffer to the non-volatile FLASH memory
  *      printf("Committing page to non-volatile memory page index 5:\r\n");
  *      Dataflash_SendByte(DF_CMD_BUFF1TOMAINMEMWITHERASE);
  *      Dataflash_SendAddressBytes(5, 0);
  *      Dataflash_WaitWhileBusy();
- *      
+ *
  *      // Read the page from non-volatile FLASH memory into the Dataflash's second memory buffer
  *      printf("Reading data into second dataflash buffer:\r\n");
  *      Dataflash_SendByte(DF_CMD_MAINMEMTOBUFF2);
  *      Dataflash_SendAddressBytes(5, 0);
  *      Dataflash_WaitWhileBusy();
  *      // Read the page from non-volatile FLASH memory into the Dataflash's second memory buffer
  *      printf("Reading data into second dataflash buffer:\r\n");
  *      Dataflash_SendByte(DF_CMD_MAINMEMTOBUFF2);
  *      Dataflash_SendAddressBytes(5, 0);
  *      Dataflash_WaitWhileBusy();
- *      
+ *
  *      // Read the Dataflash's second internal memory buffer
  *      Dataflash_SendByte(DF_CMD_BUFF2READ);
  *      Dataflash_SendAddressBytes(0, 0);
  *      // Read the Dataflash's second internal memory buffer
  *      Dataflash_SendByte(DF_CMD_BUFF2READ);
  *      Dataflash_SendAddressBytes(0, 0);
- *      
+ *
  *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
  *        ReadBuffer[i] = Dataflash_ReceiveByte();
  *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
  *        ReadBuffer[i] = Dataflash_ReceiveByte();
- *      
+ *
  *      // Deselect the chip after use
  *      Dataflash_DeselectChip();
  *  \endcode
  *      // Deselect the chip after use
  *      Dataflash_DeselectChip();
  *  \endcode
 
        /* Public Interface - May be used in end-application: */
                /* Macros: */
 
        /* Public Interface - May be used in end-application: */
                /* Macros: */
-                       #if !defined(__DOXYGEN__)
-                               #define __GET_DATAFLASH_MASK2(x, y) x ## y
-                               #define __GET_DATAFLASH_MASK(x)     __GET_DATAFLASH_MASK2(DATAFLASH_CHIP,x)
-                       #endif
-
                        /** Retrieves the Dataflash chip select mask for the given Dataflash chip index.
                         *
                        /** Retrieves the Dataflash chip select mask for the given Dataflash chip index.
                         *
-                        *  \param[in] index  Index of the dataflash chip mask to retrieve
+                        *  \attention This macro will only work correctly on chip index numbers that are compile-time
+                        *             constants defined by the preprocessor.
+                        *
+                        *  \param[in] index  Index of the dataflash chip mask to retrieve.
                         *
                         *  \return Mask for the given Dataflash chip's /CS pin
                         */
                         *
                         *  \return Mask for the given Dataflash chip's /CS pin
                         */
-                       #define DATAFLASH_CHIP_MASK(index)      __GET_DATAFLASH_MASK(index)
+                       #define DATAFLASH_CHIP_MASK(index)      CONCAT_EXPANDED(DATAFLASH_CHIP, index)
 
                /* Inline Functions: */
                        /** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
 
                /* Inline Functions: */
                        /** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
index 1c3b60a..02abbc7 100644 (file)
                        #error The ADC peripheral driver is not currently available for your selected microcontroller model.
                #endif
 
                        #error The ADC peripheral driver is not currently available for your selected microcontroller model.
                #endif
 
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Macros: */
-                       #define _ADC_GET_MUX_MASK2(y)           ADC_CHANNEL ## y
-                       #define _ADC_GET_MUX_MASK(y)            _ADC_GET_MUX_MASK2(y)
-       #endif
-
        /* Public Interface - May be used in end-application: */
                /* Macros: */
                        /** \name ADC Reference Configuration Masks */
        /* Public Interface - May be used in end-application: */
                /* Macros: */
                        /** \name ADC Reference Configuration Masks */
                         *
                         *  \param[in] Channel  Index of the ADC channel whose MUX mask is to be retrieved.
                         */
                         *
                         *  \param[in] Channel  Index of the ADC channel whose MUX mask is to be retrieved.
                         */
-                       #define ADC_GET_CHANNEL_MASK(Channel)   _ADC_GET_MUX_MASK(Channel)
+                       #define ADC_GET_CHANNEL_MASK(Channel)   CONCAT_EXPANDED(ADC_CHANNEL, Channel)
                        //@}
 
                /* Inline Functions: */
                        //@}
 
                /* Inline Functions: */
index 0d9a521..b5825a9 100644 (file)
                        #define HID_RI_DATA_BITS_8                      0x01
                        #define HID_RI_DATA_BITS_16                     0x02
                        #define HID_RI_DATA_BITS_32                     0x03
                        #define HID_RI_DATA_BITS_8                      0x01
                        #define HID_RI_DATA_BITS_16                     0x02
                        #define HID_RI_DATA_BITS_32                     0x03
-                       #define HID_RI_DATA_BITS(DataBits)              HID_RI_DATA_BITS_ ## DataBits
+                       #define HID_RI_DATA_BITS(DataBits)              CONCAT_EXPANDED(HID_RI_DATA_BITS_, DataBits)
 
                        #define _HID_RI_ENCODE_0(Data)
                        #define _HID_RI_ENCODE_8(Data)                  , (Data & 0xFF)
                        #define _HID_RI_ENCODE_16(Data)                 _HID_RI_ENCODE_8(Data)  _HID_RI_ENCODE_8(Data >> 8)
                        #define _HID_RI_ENCODE_32(Data)                 _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16)
 
                        #define _HID_RI_ENCODE_0(Data)
                        #define _HID_RI_ENCODE_8(Data)                  , (Data & 0xFF)
                        #define _HID_RI_ENCODE_16(Data)                 _HID_RI_ENCODE_8(Data)  _HID_RI_ENCODE_8(Data >> 8)
                        #define _HID_RI_ENCODE_32(Data)                 _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16)
-                       #define _HID_RI_ENCODE(DataBits, ...)           _HID_RI_ENCODE_ ## DataBits(__VA_ARGS__)
+                       #define _HID_RI_ENCODE(DataBits, ...)           CONCAT_EXPANDED(_HID_RI_ENCODE_, DataBits(__VA_ARGS__))
 
                        #define _HID_RI_ENTRY(Type, Tag, DataBits, ...) (Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__))
        #endif
 
                        #define _HID_RI_ENTRY(Type, Tag, DataBits, ...) (Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__))
        #endif
index 88971e7..9d7b7e5 100644 (file)
                                         */
                                        extern volatile uint8_t USB_HostState;
                                #else
                                         */
                                        extern volatile uint8_t USB_HostState;
                                #else
-                                       #define _GET_HOST_GPIOR_NAME2(y) GPIOR ## y
-                                       #define _GET_HOST_GPIOR_NAME(x)  _GET_HOST_GPIOR_NAME2(x)
-                                       #define USB_HostState            _GET_HOST_GPIOR_NAME(HOST_STATE_AS_GPIOR)
+                                       #define USB_HostState            CONCAT_EXPANDED(GPIOR, HOST_STATE_AS_GPIOR)
                                #endif
                        #endif
 
                                #endif
                        #endif
 
                                         */
                                        extern volatile uint8_t USB_DeviceState;
                                #else
                                         */
                                        extern volatile uint8_t USB_DeviceState;
                                #else
-                                       #define _GET_DEVICE_GPIOR_NAME2(y) GPIOR ## y
-                                       #define _GET_DEVICE_GPIOR_NAME(x)  _GET_DEVICE_GPIOR_NAME2(x)
-                                       #define USB_DeviceState            _GET_DEVICE_GPIOR_NAME(DEVICE_STATE_AS_GPIOR)
+                                       #define USB_DeviceState            CONCAT_EXPANDED(GPIOR, DEVICE_STATE_AS_GPIOR)
                                #endif
                        #endif
 
                                #endif
                        #endif