PrinterHost.c 6.96 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
             LUFA Library
     Copyright (C) Dean Camera, 2009.
              
  dean [at] fourwalledcubicle [dot] com
      www.fourwalledcubicle.com
*/

/*
  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)

  Permission to use, copy, modify, and distribute this software
  and its documentation for any purpose and without fee is hereby
  granted, provided that the above copyright notice appear in all
  copies and that both that the copyright notice and this
  permission notice and warranty disclaimer appear in supporting
  documentation, and that the name of the author not be used in
  advertising or publicity pertaining to distribution of the
  software without specific, written prior permission.

  The author disclaim all warranties with regard to this
  software, including all implied warranties of merchantability
  and fitness.  In no event shall the author be liable for any
  special, indirect or consequential damages or any damages
  whatsoever resulting from loss of use, data or profits, whether
  in an action of contract, negligence or other tortious action,
  arising out of or in connection with the use or performance of
  this software.
*/

/*
	USB Printer host demo application.
	
	** NOT CURRENTLY FUNCTIONAL - DO NOT USE **
*/

#include "PrinterHost.h"


int main(void)
{
	SetupHardware();

	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);

46
	puts_P(PSTR(ESC_FG_CYAN "Printer Host Demo running.\r\n" ESC_FG_WHITE));
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
	
	for (;;)
	{
		USB_Printer_Host();
		USB_USBTask();
	}
}

void SetupHardware(void)
{
	/* Disable watchdog if enabled by bootloader/fuses */
	MCUSR &= ~(1 << WDRF);
	wdt_disable();

	/* Disable clock division */
	clock_prescale_set(clock_div_1);

	/* Hardware Initialization */
	SerialStream_Init(9600, false);
	LEDs_Init();
	USB_Init();
}

void EVENT_USB_DeviceAttached(void)
{
72
	puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
73
74
75
76
77
	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
}

void EVENT_USB_DeviceUnattached(void)
{
78
	puts_P(PSTR(ESC_FG_GREEN "\r\nDevice Unattached.\r\n" ESC_FG_WHITE));
79
80
81
82
83
84
85
	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
}

void EVENT_USB_HostError(uint8_t ErrorCode)
{
	USB_ShutDown();

86
87
	puts_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"));
	printf_P(PSTR(" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
88
89
90
91
92
93
94

	LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
	for(;;);
}

void EVENT_USB_DeviceEnumerationFailed(uint8_t ErrorCode, uint8_t SubErrorCode)
{
95
	puts_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"));
96
	printf_P(PSTR(" -- Error Code %d\r\n"), ErrorCode);
97
	printf_P(PSTR(" -- In State %d\r\n" ESC_FG_WHITE), USB_HostState);
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

	LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
}

void EVENT_USB_DeviceEnumerationComplete(void)
{
	LEDs_SetAllLEDs(LEDMASK_USB_READY);
}

void USB_Printer_Host(void)
{
	uint8_t ErrorCode;

	switch (USB_HostState)
	{
		case HOST_STATE_Addressed:
			puts_P(PSTR("Getting Config Data.\r\n"));
115
116
117
			
			/* Select the control pipe for the request transfer */
			Pipe_SelectPipe(PIPE_CONTROLPIPE);			
118
119
120
121
122
		
			/* Get and process the configuration descriptor data */
			if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
			{
				if (ErrorCode == ControlError)
123
				  puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
124
				else
125
				  puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
126
127
128
129

				printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);
				
				/* Indicate error via status LEDs */
130
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
131
132

				/* Wait until USB device disconnected */
133
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
134
135
				break;
			}
136
137
138
139
				
			/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
			if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
			{
140
141
				puts_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"));
				printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
142
143

				/* Indicate error via status LEDs */
144
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
145
146

				/* Wait until USB device disconnected */
147
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
148
149
				break;
			}
150
151
			
			/* Some printers use alternate settings to determine the communication protocol used - if so, send a SetInterface
152
			 * request to switch to the interface alternate setting with the Bidirectional protocol */
153
154
155
156
157
158
159
160
161
162
163
164
165
			if (PrinterAltSetting)
			{
				USB_ControlRequest = (USB_Request_Header_t)
					{
						bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),
						bRequest:      REQ_SetInterface,
						wValue:        PrinterAltSetting,
						wIndex:        PrinterInterfaceNumber,
						wLength:       0,
					};
					
				if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
				{
166
167
					puts_P(PSTR(ESC_FG_RED "Control Error (Set Interface).\r\n"));
					printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
168
169
170
171
172
173
174
175
176
177

					/* Indicate error via status LEDs */
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);

					/* Wait until USB device disconnected */
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;					
				}
			}
			
178
179
180
181
182
			USB_HostState = HOST_STATE_Configured;
			break;
		case HOST_STATE_Configured:
			puts_P(PSTR("Retrieving Device ID...\r\n"));
		
183
			char DeviceIDString[256];
184
			if ((ErrorCode = Printer_GetDeviceID(DeviceIDString, sizeof(DeviceIDString))) != HOST_SENDCONTROL_Successful)
185
			{
186
187
				puts_P(PSTR(ESC_FG_RED "Control Error (Get DeviceID).\r\n"));
				printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
188

189
				/* Indicate error via status LEDs */
190
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
191
192

				/* Wait until USB device disconnected */
193
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
194
195
				break;
			}
196

197
			printf_P(PSTR("Printer Device ID: %s\r\n"), DeviceIDString);
198
199
200
201
202
203
204
205
206

			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);
		
207
208
			Printer_Data_t TestPageData =
				{
209
210
//					"\033%-12345X\033E LUFA PCL Test Page \033E\033%-12345X",
					"\033@\033i\001\033X\001\060\000\r\nLUFA ESCP/2 Test Page\r\n",
211
212
213
214
					(sizeof(TestPageData.Data) - 1)
				};
		
			printf_P(PSTR("Sending Test Page (%d bytes)...\r\n"), TestPageData.Length);
215

216
			if ((ErrorCode = Printer_SendData(&TestPageData)) != PIPE_RWSTREAM_NoError)
217
			{
218
219
				puts_P(PSTR(ESC_FG_RED "Error Sending Test Page.\r\n"));
				printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
220

221
222
				/* Indicate error via status LEDs */
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
223

224
225
226
227
				/* Wait until USB device disconnected */
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
				break;
			}
228

229
			puts_P(PSTR("Test Page Sent.\r\n"));
230
231
		
			/* Indicate device no longer busy */
232
			LEDs_SetAllLEDs(LEDMASK_USB_READY);
233
234

			USB_HostState = HOST_STATE_WaitForDeviceRemoval;
235
236
237
			break;
	}
}