PrinterCommands.c 5.38 KB
Newer Older
1
2
/*
             LUFA Library
Dean Camera's avatar
Dean Camera committed
3
     Copyright (C) Dean Camera, 2010.
4
5
6
7
8
9
              
  dean [at] fourwalledcubicle [dot] com
      www.fourwalledcubicle.com
*/

/*
Dean Camera's avatar
Dean Camera committed
10
  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
11

12
13
14
15
16
17
18
  Permission to use, copy, modify, distribute, and sell this 
  software and its documentation for any purpose is hereby granted
  without fee, 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 
19
20
21
22
23
24
25
26
27
28
29
30
  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.
*/

31
32
/** \file
 *
33
 *  Printer Device commands, to send/receive data to and from an attached USB
34
35
36
 *  printer, and to send and receive Printer Class control requests.
 */

37
38
#include "PrinterCommands.h"

39
40
41
/** Sends the given data directly to the printer via the data endpoints, for the sending of print commands in printer
 *  languages accepted by the attached printer (e.g. PCL).
 *
42
43
 *  \param[in] PrinterCommands  Pointer to the data to send to the attached printer
 *  \param[in] CommandSize  Size of the data to send to the attached printer
44
45
46
 *
 *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
 */
47
uint8_t Printer_SendData(void* PrinterCommands, uint16_t CommandSize)
48
49
50
51
52
53
{
	uint8_t ErrorCode;

	Pipe_SelectPipe(PRINTER_DATA_OUT_PIPE);
	Pipe_Unfreeze();
	
54
	if ((ErrorCode = Pipe_Write_Stream_LE(PrinterCommands, CommandSize)) != PIPE_RWSTREAM_NoError)
55
56
57
	  return ErrorCode;

	Pipe_ClearOUT();
58
59
60
61
62
	while (!(Pipe_IsOUTReady()))
	{
		if (USB_HostState == HOST_STATE_Unattached)
		  return PIPE_RWSTREAM_DeviceDisconnected;
	}
63
64
65
66
67
68
69
70
71
72
73
74
75
76
	
	Pipe_Freeze();

	return PIPE_RWSTREAM_NoError;
}

/** Issues a Printer class Get Device ID command to the attached device, to retrieve the device ID string (which indicates
 *  the accepted printer languages, the printer's model and other pertinent information).
 *
 *  \param[out] DeviceIDString Pointer to the destination where the returned string should be stored
 *  \param[in] BufferSize  Size in bytes of the allocated buffer for the returned Device ID string
 *
 *  \return A value from the USB_Host_SendControlErrorCodes_t enum
 */
77
uint8_t Printer_GetDeviceID(char* DeviceIDString, uint16_t BufferSize)
78
{
79
	uint8_t  ErrorCode = HOST_SENDCONTROL_Successful;
80
	uint16_t DeviceIDStringLength = 0;
81
82
83

	USB_ControlRequest = (USB_Request_Header_t)
		{
84
85
86
87
88
			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
			.bRequest      = REQ_GetDeviceID,
			.wValue        = 0,
			.wIndex        = 0,
			.wLength       = sizeof(DeviceIDStringLength),
89
		};
90
91
		
	Pipe_SelectPipe(PIPE_CONTROLPIPE);
92

93
	if ((ErrorCode = USB_Host_SendControlRequest(&DeviceIDStringLength)) != HOST_SENDCONTROL_Successful)
94
	  return ErrorCode;
95
96
97
98
99
100
	  
	if (!(DeviceIDStringLength))
	{
		DeviceIDString[0] = 0x00;
		return HOST_SENDCONTROL_Successful;
	}
101
	
102
	DeviceIDStringLength = SwapEndian_16(DeviceIDStringLength);
103

104
105
	if (DeviceIDStringLength > BufferSize)
	  DeviceIDStringLength = BufferSize;
106

107
	USB_ControlRequest.wLength = DeviceIDStringLength;
108
109
110
	
	if ((ErrorCode = USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful)
	  return ErrorCode;
111
112
113
114
115
	  
	/* Move string back two characters to remove the string length value from the start of the array */
	memmove(&DeviceIDString[0], &DeviceIDString[2], DeviceIDStringLength - 2);

	DeviceIDString[DeviceIDStringLength - 2] = 0x00;
116
117
118
119
	
	return HOST_SENDCONTROL_Successful;
}

120
121
122
123
124
125
126
/** Issues a Printer class Get Port Status command to the attached device, to retrieve the current status flags of the
 *  printer.
 *
 *  \param[out] PortStatus  Pointer to the destination where the printer's status flag values should be stored
 *
 *  \return A value from the USB_Host_SendControlErrorCodes_t enum
 */
127
128
129
130
131
uint8_t Printer_GetPortStatus(uint8_t* PortStatus)
{
	USB_ControlRequest = (USB_Request_Header_t)
		{
			bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
132
			bRequest:      REQ_GetPortStatus,
133
134
135
136
137
			wValue:        0,
			wIndex:        0,
			wLength:       sizeof(uint8_t),
		};

138
139
	Pipe_SelectPipe(PIPE_CONTROLPIPE);

140
141
142
	return USB_Host_SendControlRequest(PortStatus);
}

143
144
145
146
147
/** Issues a Printer class Soft Reset command to the attached device, to reset the printer ready for new input without
 *  physically cycling the printer's power.
 *
 *  \return A value from the USB_Host_SendControlErrorCodes_t enum
 */
148
149
150
151
uint8_t Printer_SoftReset(void)
{
	USB_ControlRequest = (USB_Request_Header_t)
		{
152
153
154
155
156
			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
			.bRequest      = REQ_SoftReset,
			.wValue        = 0,
			.wIndex        = 0,
			.wLength       = 0,
157
158
		};

159
160
	Pipe_SelectPipe(PIPE_CONTROLPIPE);

161
162
	return USB_Host_SendControlRequest(NULL);
}
163