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