Datasheet
if(AndroidAppIsWriteComplete(device_handle, &errorCode, &size) == TRUE)
{
writeInProgress = FALSE;
if(errorCode != USB_SUCCESS)
{
//Error
DEBUG_ERROR("Error trying to complete write");
}
}
}
if((buttonsNeedUpdate == TRUE) && (writeInProgress == FALSE))
{
response_packet.command = COMMAND_UPDATE_PUSHBUTTONS;
response_packet.data = pushButtonValues;
errorCode = AndroidAppWrite(device_handle,(BYTE*)&response_packet, 2);
if( errorCode != USB_SUCCESS )
{
DEBUG_ERROR("Error trying to send button update");
}
else
{
buttonsNeedUpdate = FALSE;
writeInProgress = TRUE;
}
}
}
4.2.6 Receiving Data
Receiving data from the Android device is very similar to sending data. There are two functions that are used:
AndroidAppIsReadComplete ( see page 22)()
and
AndroidAppRead ( see page 24)()
.
The
AndroidAppRead ( see page 24)()
function is used to start a read request from the Android device. In the
situation where the Android device is the USB peripheral, this will initiate an IN request on the bus. If the Android device
doesn't have any information it will respond with NAKs. One key thing to know about the read function is that the buffer
passed to the read function must always be able to receive at least one packets worth of USB data. For full-speed USB
devices this is 64 bytes.
The
AndroidAppIsReadComplete ( see page 22)()
function is used to determine if a read request was completed.
The read request will terminate if a couple of conditions occur. The first is if the total number of bytes requested has been
read. The second is if a packet with less than the maximum packet length is received. This typically indicates that fewer
bytes than requested are available and that no more packets are immediately pending. While this is true for most cases, it
may not be true for every case. If the target application is one of those exceptions, keep in mind that you may have to call
the read function multiple times in order to receive a complete transmission from the applications perspective. Remember
from the Keeping the Stack Running ( see page 18) section that the
USBTasks()
function needs to be called in order to
keep the stack running. This means that you shouldn't loop on the
AndroidAppIsReadComplete ( see page 22)()
function. Instead use either a state machine or booleans to indicate what you need to do.
while(1)
{
//Keep the stack running
USBTasks();
//Do some extra stuff here
if(readInProgress == FALSE)
{
errorCode = AndroidAppRead(device_handle,
(BYTE*)&command_packet,
(DWORD)sizeof(ACCESSORY_APP_PACKET));
//If the device is attached, then lets wait for a command from the application
Microchip's Accessory Framework for Android(tm) 20
20
4