Add blocking versions of the CDC Class driver streams, for applications requiring...
authorDean Camera <dean@fourwalledcubicle.com>
Thu, 12 Nov 2009 12:47:15 +0000 (12:47 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Thu, 12 Nov 2009 12:47:15 +0000 (12:47 +0000)
LUFA/Drivers/USB/Class/Device/CDC.c
LUFA/Drivers/USB/Class/Device/CDC.h
LUFA/Drivers/USB/Class/Host/CDC.c
LUFA/Drivers/USB/Class/Host/CDC.h

index c86b970..aafe480 100644 (file)
@@ -240,6 +240,12 @@ void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE*
        fdev_set_udata(Stream, CDCInterfaceInfo);\r
 }\r
 \r
        fdev_set_udata(Stream, CDCInterfaceInfo);\r
 }\r
 \r
+void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* Stream)\r
+{\r
+       *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW);\r
+       fdev_set_udata(Stream, CDCInterfaceInfo);\r
+}\r
+\r
 static int CDC_Device_putchar(char c, FILE* Stream)\r
 {\r
        return CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0;\r
 static int CDC_Device_putchar(char c, FILE* Stream)\r
 {\r
        return CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0;\r
@@ -253,4 +259,15 @@ static int CDC_Device_getchar(FILE* Stream)
        return CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));\r
 }\r
 \r
        return CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));\r
 }\r
 \r
+static int CDC_Device_getchar_Blocking(FILE* Stream)\r
+{\r
+       while (!(CDC_Device_BytesReceived((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))))\r
+       {\r
+               CDC_Device_USBTask((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));\r
+               USB_USBTask();\r
+       }\r
+\r
+       return CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));\r
+}\r
+\r
 #endif\r
 #endif\r
index 857d073..f5a7507 100644 (file)
                        /** Creates a standard characer stream for the given CDC Device instance so that it can be used with all the regular\r
                         *  functions in the avr-libc <stdio.h> library that accept a FILE stream as a destination (e.g. fprintf).\r
                         *\r
                        /** Creates a standard characer stream for the given CDC Device instance so that it can be used with all the regular\r
                         *  functions in the avr-libc <stdio.h> library that accept a FILE stream as a destination (e.g. fprintf).\r
                         *\r
+                        *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single\r
+                        *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may\r
+                        *  be used when the read data is processed byte-per-bye (via getc()) or when the user application will implement its own\r
+                        *  line buffering.\r
+                        *\r
                         *  \note The created stream can be given as stdout if desired to direct the standard output from all <stdio.h> functions\r
                         *        to the given CDC interface.\r
                         *\r
                         *  \note The created stream can be given as stdout if desired to direct the standard output from all <stdio.h> functions\r
                         *        to the given CDC interface.\r
                         *\r
                         */\r
                        void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* Stream);\r
 \r
                         */\r
                        void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* Stream);\r
 \r
+                       /** Identical to CDC_Device_CreateStream(), except that reads are blocking until the calling stream function terminates\r
+                        *  the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications.\r
+                        *\r
+                        *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state\r
+                        *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed\r
+                        */\r
+                       void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* Stream);\r
+\r
        /* Private Interface - For use in library only: */\r
        #if !defined(__DOXYGEN__)\r
                /* Function Prototypes: */\r
                        #if defined(INCLUDE_FROM_CDC_CLASS_DEVICE_C)\r
                                static int CDC_Device_putchar(char c, FILE* Stream);\r
                                static int CDC_Device_getchar(FILE* Stream);\r
        /* Private Interface - For use in library only: */\r
        #if !defined(__DOXYGEN__)\r
                /* Function Prototypes: */\r
                        #if defined(INCLUDE_FROM_CDC_CLASS_DEVICE_C)\r
                                static int CDC_Device_putchar(char c, FILE* Stream);\r
                                static int CDC_Device_getchar(FILE* Stream);\r
+                               static int CDC_Device_getchar_Blocking(FILE* Stream);\r
                                \r
                                void CDC_Device_Event_Stub(void);\r
                                void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)\r
                                \r
                                void CDC_Device_Event_Stub(void);\r
                                void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)\r
index 5467e3d..fcfa86d 100644 (file)
@@ -353,6 +353,17 @@ static int CDC_Host_getchar(FILE* Stream)
        return CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));\r
 }\r
 \r
        return CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));\r
 }\r
 \r
+static int CDC_Host_getchar_Blocking(FILE* Stream)\r
+{\r
+       while (!(CDC_Host_BytesReceived((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream))))\r
+       {\r
+               CDC_Host_USBTask((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));\r
+               USB_USBTask();\r
+       }\r
+\r
+       return CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));\r
+}\r
+\r
 void CDC_Host_Event_Stub(void)\r
 {\r
 \r
 void CDC_Host_Event_Stub(void)\r
 {\r
 \r
index 0ee24be..9b5fb0c 100644 (file)
                         */\r
                        void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream);\r
 \r
                         */\r
                        void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream);\r
 \r
+                       /** Identical to CDC_Host_CreateStream(), except that reads are blocking until the calling stream function terminates\r
+                        *  the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications.\r
+                        *\r
+                        *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state\r
+                        *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed\r
+                        */\r
+                       void CDC_Host_CreateBlockingStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream);\r
+\r
                        /** CDC class driver event for a control line state change on a CDC host interface. This event fires each time the device notifies\r
                         *  the host of a control line state change (containing the virtual serial control line states, such as DCD) and may be hooked in the\r
                         *  user program by declaring a handler function with the same name and parameters listed here. The new control line states\r
                        /** CDC class driver event for a control line state change on a CDC host interface. This event fires each time the device notifies\r
                         *  the host of a control line state change (containing the virtual serial control line states, such as DCD) and may be hooked in the\r
                         *  user program by declaring a handler function with the same name and parameters listed here. The new control line states\r
                        #if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)\r
                                static int CDC_Host_putchar(char c, FILE* Stream);\r
                                static int CDC_Host_getchar(FILE* Stream);\r
                        #if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)\r
                                static int CDC_Host_putchar(char c, FILE* Stream);\r
                                static int CDC_Host_getchar(FILE* Stream);\r
+                               static int CDC_Host_getchar_Blocking(FILE* Stream);\r
 \r
                                void CDC_Host_Event_Stub(void);\r
                                void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)\r
 \r
                                void CDC_Host_Event_Stub(void);\r
                                void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)\r