Add Progmem Variant to CDC_Device_Send
authorStefan Hellermann <stefan@the2masters.de>
Sat, 28 Feb 2015 11:05:41 +0000 (12:05 +0100)
committerStefan Hellermann <stefan@the2masters.de>
Sat, 28 Feb 2015 11:30:04 +0000 (12:30 +0100)
LUFA/Drivers/USB/Class/Device/CDCClassDevice.c
LUFA/Drivers/USB/Class/Device/CDCClassDevice.h

index f4e74cf..62536f9 100644 (file)
@@ -155,6 +155,16 @@ uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo
        return Endpoint_Write_Stream_LE(String, strlen(String), NULL);
 }
 
+uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                              const char* const String)
+{
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+         return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+       return Endpoint_Write_PStream_LE(String, strlen_P(String), NULL);
+}
+
 uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
                             const void* const Buffer,
                             const uint16_t Length)
@@ -166,6 +176,17 @@ uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
        return Endpoint_Write_Stream_LE(Buffer, Length, NULL);
 }
 
+uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                            const void* const Buffer,
+                            const uint16_t Length)
+{
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+         return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+       return Endpoint_Write_PStream_LE(Buffer, Length, NULL);
+}
+
 uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
                             const uint8_t Data)
 {
index 05c0fdd..acc33f1 100644 (file)
                                                    const void* const Buffer,
                                                    const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
 
+                       /** Sends a given data buffer from PROGMEM space to the attached USB host, if connected. If a host is not connected when the
+                        *  function is called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint
+                        *  bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows
+                        *  for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+                        *
+                        *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+                        *       the call will fail.
+                        *
+                        *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+                        *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device.
+                        *  \param[in]     Length            Length of the data to send to the host.
+                        *
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+                        */
+                       uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                                                   const void* const Buffer,
+                                                   const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
                        /** Sends a given null terminated string to the attached USB host, if connected. If a host is not connected when
                         *  the function is called, the string is discarded. Bytes will be queued for transmission to the host until either
                         *  the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to
                        uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
                                                      const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
 
+                       /** Sends a given null terminated string from PROGMEM space to the attached USB host, if connected. If a host is not connected
+                        *  when the function is called, the string is discarded. Bytes will be queued for transmission to the host until either
+                        *  the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to
+                        *  the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+                        *
+                        *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+                        *       the call will fail.
+                        *
+                        *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+                        *  \param[in]     String            Pointer to the null terminated string to send to the host.
+                        *
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+                        */
+                       uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                                                     const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
                        /** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the
                         *  byte is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the
                         *  \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be