Magstripe Project: Ensure that empty tracks still print out a newline seperator so that the host always knows what track data is being sent.
Updates to PrinterHost demo to include some PCL test data plus fixes to the GetDeviceID routine.
This commit is contained in:
		
							parent
							
								
									d6543dee0d
								
							
						
					
					
						commit
						b243c2b80b
					
				
					 6 changed files with 83 additions and 51 deletions
				
			
		| 
						 | 
				
			
			@ -32,7 +32,8 @@
 | 
			
		|||
 | 
			
		||||
uint8_t Printer_GetDeviceID(Device_ID_String_t* DeviceIDString)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t ErrorCode = HOST_SENDCONTROL_Successful;
 | 
			
		||||
	uint8_t  ErrorCode = HOST_SENDCONTROL_Successful;
 | 
			
		||||
	uint16_t DeviceIDStringLength;
 | 
			
		||||
 | 
			
		||||
	USB_ControlRequest = (USB_Request_Header_t)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -40,19 +41,24 @@ uint8_t Printer_GetDeviceID(Device_ID_String_t* DeviceIDString)
 | 
			
		|||
			bRequest:      GET_DEVICE_ID,
 | 
			
		||||
			wValue:        0,
 | 
			
		||||
			wIndex:        0,
 | 
			
		||||
			wLength:       sizeof(DeviceIDString),
 | 
			
		||||
			wLength:       sizeof(DeviceIDString->Length),
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	if ((ErrorCode == USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful)
 | 
			
		||||
	if ((ErrorCode = USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful)
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
	  
 | 
			
		||||
	DeviceIDString->Length = SwapEndian_16(DeviceIDString->Length);
 | 
			
		||||
	
 | 
			
		||||
	DeviceIDStringLength = SwapEndian_16(DeviceIDString->Length);
 | 
			
		||||
 | 
			
		||||
	/* Protect against overflow for the null terminator if the string length is equal to or larger than the buffer */
 | 
			
		||||
	if (DeviceIDString->Length >= sizeof(DeviceIDString->String))
 | 
			
		||||
	  DeviceIDString->Length = sizeof(DeviceIDString->String) - 1;
 | 
			
		||||
	if (DeviceIDStringLength >= sizeof(DeviceIDString->String))
 | 
			
		||||
	  DeviceIDStringLength = sizeof(DeviceIDString->String) - 1;
 | 
			
		||||
 | 
			
		||||
	USB_ControlRequest.wLength = DeviceIDStringLength;
 | 
			
		||||
	
 | 
			
		||||
	DeviceIDString->String[DeviceIDString->Length] = 0x00;
 | 
			
		||||
	if ((ErrorCode = USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful)
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
	
 | 
			
		||||
	DeviceIDString->String[DeviceIDStringLength] = 0x00;
 | 
			
		||||
	
 | 
			
		||||
	return HOST_SENDCONTROL_Successful;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,7 +130,7 @@ void USB_Printer_Host(void)
 | 
			
		|||
				printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);
 | 
			
		||||
				
 | 
			
		||||
				/* Indicate error via status LEDs */
 | 
			
		||||
				LEDs_SetAllLEDs(LEDS_LED1);
 | 
			
		||||
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
			
		||||
 | 
			
		||||
				/* Wait until USB device disconnected */
 | 
			
		||||
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
			
		||||
| 
						 | 
				
			
			@ -144,7 +144,7 @@ void USB_Printer_Host(void)
 | 
			
		|||
				printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);
 | 
			
		||||
 | 
			
		||||
				/* Indicate error via status LEDs */
 | 
			
		||||
				LEDs_SetAllLEDs(LEDS_LED1);
 | 
			
		||||
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
			
		||||
 | 
			
		||||
				/* Wait until USB device disconnected */
 | 
			
		||||
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
			
		||||
| 
						 | 
				
			
			@ -154,23 +154,18 @@ void USB_Printer_Host(void)
 | 
			
		|||
			USB_HostState = HOST_STATE_Configured;
 | 
			
		||||
			break;
 | 
			
		||||
		case HOST_STATE_Configured:
 | 
			
		||||
			puts_P(PSTR("Printer Enumerated.\r\n"));
 | 
			
		||||
			
 | 
			
		||||
			USB_HostState = HOST_STATE_Ready;
 | 
			
		||||
			break;
 | 
			
		||||
		case HOST_STATE_Ready:
 | 
			
		||||
			/* Indicate device busy via the status LEDs */
 | 
			
		||||
			LEDs_SetAllLEDs(LEDS_LED3 | LEDS_LED4);
 | 
			
		||||
		
 | 
			
		||||
			printf_P(PSTR("Printer Protocol: %d\r\n"), PrinterProtocol);
 | 
			
		||||
		
 | 
			
		||||
			puts_P(PSTR("Retrieving Device ID...\r\n"));
 | 
			
		||||
		
 | 
			
		||||
			Device_ID_String_t DeviceIDString;
 | 
			
		||||
			if (Printer_GetDeviceID(&DeviceIDString) != HOST_SENDCONTROL_Successful)
 | 
			
		||||
			if ((ErrorCode = Printer_GetDeviceID(&DeviceIDString)) != HOST_SENDCONTROL_Successful)
 | 
			
		||||
			{
 | 
			
		||||
				puts_P(PSTR("Control Error (Get DeviceID).\r\n"));
 | 
			
		||||
				printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);
 | 
			
		||||
 | 
			
		||||
				/* Indicate error via status LEDs */
 | 
			
		||||
				LEDs_SetAllLEDs(LEDS_LED1);
 | 
			
		||||
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
			
		||||
 | 
			
		||||
				/* Wait until USB device disconnected */
 | 
			
		||||
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
			
		||||
| 
						 | 
				
			
			@ -178,9 +173,42 @@ void USB_Printer_Host(void)
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			printf_P(PSTR("Printer Device ID: %s\r\n"), DeviceIDString.String);
 | 
			
		||||
 | 
			
		||||
			puts_P(PSTR("Printer Enumerated.\r\n"));
 | 
			
		||||
					
 | 
			
		||||
			USB_HostState = HOST_STATE_Ready;
 | 
			
		||||
			break;
 | 
			
		||||
		case HOST_STATE_Ready:
 | 
			
		||||
			/* Indicate device busy via the status LEDs */
 | 
			
		||||
			LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
 | 
			
		||||
		
 | 
			
		||||
            //--------------------------------------------------------------
 | 
			
		||||
			#define TEST_TEXT_PAGE "\033%-12345X\033E LUFA PCL Test Page \033E\033%-12345X"
 | 
			
		||||
 | 
			
		||||
			Pipe_SelectPipe(PRINTER_DATA_OUT_PIPE);
 | 
			
		||||
            Pipe_Unfreeze();
 | 
			
		||||
			
 | 
			
		||||
			puts_P(PSTR("Waiting for Printer to Become Ready...\r\n"));
 | 
			
		||||
			
 | 
			
		||||
			while (!(Pipe_IsReadWriteAllowed()));
 | 
			
		||||
 | 
			
		||||
			uint8_t strSize = sizeof(TEST_TEXT_PAGE)-1;
 | 
			
		||||
 | 
			
		||||
			printf_P(PSTR("Printer Write Allowed, sending complete page (%d bytes)...\r\n"), strSize);
 | 
			
		||||
				
 | 
			
		||||
			Pipe_Write_Stream_LE(TEST_TEXT_PAGE, strSize);
 | 
			
		||||
            Pipe_ClearOUT();
 | 
			
		||||
 | 
			
		||||
			puts_P(PSTR("Page sent to printer.\r\n"));
 | 
			
		||||
 | 
			
		||||
			while (!(Pipe_IsReadWriteAllowed()));
 | 
			
		||||
            Pipe_Freeze();				
 | 
			
		||||
 | 
			
		||||
			puts_P(PSTR("Pipe Frozen.\r\n"));
 | 
			
		||||
            //--------------------------------------------------------------
 | 
			
		||||
		
 | 
			
		||||
			/* Indicate device no longer busy */
 | 
			
		||||
			LEDs_SetAllLEDs(LEDS_LED4);
 | 
			
		||||
			LEDs_SetAllLEDs(LEDMASK_USB_READY);
 | 
			
		||||
 | 
			
		||||
			USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
			
		||||
			break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,9 @@
 | 
			
		|||
		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
 | 
			
		||||
		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3)
 | 
			
		||||
	
 | 
			
		||||
		/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
 | 
			
		||||
		#define LEDMASK_USB_BUSY         (LEDS_LED2)
 | 
			
		||||
 | 
			
		||||
	/* External Variables: */
 | 
			
		||||
		extern uint8_t PrinterProtocol;
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,7 +60,7 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
# MCU name
 | 
			
		||||
MCU = at90usb1287
 | 
			
		||||
MCU = at90usb647
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Target board (see library "Board Types" documentation, USER or blank for projects not requiring
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue