Add additional support files for the new low level AudioInputHost and AudioOutputHost...
[pub/USBasp.git] / Demos / Host / LowLevel / StillImageHost / StillImageHost.c
index 686eb5f..f174f53 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2011.
+
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
-  Permission to use, copy, modify, distribute, and sell this 
+  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 
+  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 
+  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
@@ -67,9 +67,12 @@ void SetupHardware(void)
        CLKPR = 0;
 
        /* Hardware Initialization */
-       SerialStream_Init(9600, false);
+       Serial_Init(9600, false);
        LEDs_Init();
        USB_Init();
+
+       /* Create a stdio stream for the serial port for stdin and stdout */
+       Serial_CreateStream(NULL);
 }
 
 /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
@@ -101,7 +104,7 @@ void EVENT_USB_Host_DeviceEnumerationComplete(void)
 /** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
 void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
 {
-       USB_ShutDown();
+       USB_Disable();
 
        printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
                                 " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
@@ -113,13 +116,14 @@ void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
 /** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
  *  enumerating an attached USB device.
  */
-void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode)
+void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
+                                            const uint8_t SubErrorCode)
 {
        printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
                                 " -- Error Code %d\r\n"
                                 " -- Sub Error Code %d\r\n"
                                 " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
-       
+
        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 }
 
@@ -134,7 +138,7 @@ void StillImage_Task(void)
        {
                case HOST_STATE_Addressed:
                        puts_P(PSTR("Getting Config Data.\r\n"));
-               
+
                        /* Get and process the configuration descriptor data */
                        if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
                        {
@@ -144,7 +148,7 @@ void StillImage_Task(void)
                                  puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
 
                                printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
-                               
+
                                /* Indicate error via status LEDs */
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
@@ -166,52 +170,52 @@ void StillImage_Task(void)
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
-                               
+
                        puts_P(PSTR("Still Image Device Enumerated.\r\n"));
                        USB_HostState = HOST_STATE_Configured;
                        break;
                case HOST_STATE_Configured:
                        /* Indicate device busy via the status LEDs */
                        LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
-                       
+
                        puts_P(PSTR("Retrieving Device Info...\r\n"));
-                       
+
                        PIMA_SendBlock = (PIMA_Container_t)
                                {
                                        .DataLength    = PIMA_COMMAND_SIZE(0),
-                                       .Type          = CType_CommandBlock,
+                                       .Type          = PIMA_CONTAINER_CommandBlock,
                                        .Code          = PIMA_OPERATION_GETDEVICEINFO,
                                        .TransactionID = 0x00000000,
                                        .Params        = {},
                                };
-                       
+
                        /* Send the GETDEVICEINFO block */
                        SImage_SendBlockHeader();
-                       
+
                        /* Receive the response data block */
                        if ((ErrorCode = SImage_ReceiveBlockHeader()) != PIPE_RWSTREAM_NoError)
                        {
                                ShowCommandError(ErrorCode, false);
-                               
+
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
-                       
+
                        /* Calculate the size of the returned device info data structure */
                        uint16_t DeviceInfoSize = (PIMA_ReceivedBlock.DataLength - PIMA_COMMAND_SIZE(0));
-                       
+
                        /* Create a buffer large enough to hold the entire device info */
                        uint8_t DeviceInfo[DeviceInfoSize];
 
                        /* Read in the data block data (containing device info) */
                        SImage_ReadData(DeviceInfo, DeviceInfoSize);
-                       
+
                        /* Once all the data has been read, the pipe must be cleared before the response can be sent */
                        Pipe_ClearIN();
-                       
+
                        /* Create a pointer for walking through the info dataset */
                        uint8_t* DeviceInfoPos = DeviceInfo;
-                       
+
                        /* Skip over the data before the unicode device information strings */
                        DeviceInfoPos +=  8;                                          // Skip to VendorExtensionDesc String
                        DeviceInfoPos += (1 + UNICODE_STRING_LENGTH(*DeviceInfoPos)); // Skip over VendorExtensionDesc String
@@ -221,7 +225,7 @@ void StillImage_Task(void)
                        DeviceInfoPos += (4 + (*(uint32_t*)DeviceInfoPos << 1));      // Skip over Supported Device Properties Array
                        DeviceInfoPos += (4 + (*(uint32_t*)DeviceInfoPos << 1));      // Skip over Capture Formats Array
                        DeviceInfoPos += (4 + (*(uint32_t*)DeviceInfoPos << 1));      // Skip over Image Formats Array
-                       
+
                        /* Extract and convert the Manufacturer Unicode string to ASCII and print it through the USART */
                        char Manufacturer[*DeviceInfoPos];
                        UnicodeToASCII(DeviceInfoPos, Manufacturer);
@@ -245,48 +249,48 @@ void StillImage_Task(void)
                        if ((ErrorCode = SImage_ReceiveBlockHeader()) != PIPE_RWSTREAM_NoError)
                        {
                                ShowCommandError(ErrorCode, false);
-                               
+
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
-                       
+
                        /* Verify that the command completed successfully */
-                       if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
+                       if ((PIMA_ReceivedBlock.Type != PIMA_CONTAINER_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
                        {
                                ShowCommandError(PIMA_ReceivedBlock.Code, true);
-                               
+
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
-                       
+
                        puts_P(PSTR("Opening Session...\r\n"));
-                       
+
                        PIMA_SendBlock = (PIMA_Container_t)
                                {
                                        .DataLength    = PIMA_COMMAND_SIZE(1),
-                                       .Type          = CType_CommandBlock,
+                                       .Type          = PIMA_CONTAINER_CommandBlock,
                                        .Code          = PIMA_OPERATION_OPENSESSION,
                                        .TransactionID = 0x00000000,
                                        .Params        = {0x00000001},
                                };
-                       
+
                        /* Send the OPENSESSION block, open a session with an ID of 0x0001 */
                        SImage_SendBlockHeader();
-                       
+
                        /* Receive the response block from the device */
                        if ((ErrorCode = SImage_ReceiveBlockHeader()) != PIPE_RWSTREAM_NoError)
                        {
                                ShowCommandError(ErrorCode, false);
-                               
+
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
-                       
+
                        /* Verify that the command completed successfully */
-                       if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
+                       if ((PIMA_ReceivedBlock.Type != PIMA_CONTAINER_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
                        {
                                ShowCommandError(PIMA_ReceivedBlock.Code, true);
-                               
+
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
@@ -296,29 +300,29 @@ void StillImage_Task(void)
                        PIMA_SendBlock = (PIMA_Container_t)
                                {
                                        .DataLength    = PIMA_COMMAND_SIZE(1),
-                                       .Type          = CType_CommandBlock,
+                                       .Type          = PIMA_CONTAINER_CommandBlock,
                                        .Code          = PIMA_OPERATION_CLOSESESSION,
                                        .TransactionID = 0x00000001,
                                        .Params        = {0x00000001},
                                };
-                       
+
                        /* Send the CLOSESESSION block, close the session with an ID of 0x0001 */
                        SImage_SendBlockHeader();
-                       
+
                        /* Receive the response block from the device */
                        if ((ErrorCode = SImage_ReceiveBlockHeader()) != PIPE_RWSTREAM_NoError)
                        {
                                ShowCommandError(ErrorCode, false);
-                               
+
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
 
                        /* Verify that the command completed successfully */
-                       if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
+                       if ((PIMA_ReceivedBlock.Type != PIMA_CONTAINER_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
                        {
                                ShowCommandError(PIMA_ReceivedBlock.Code, true);
-                               
+
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
@@ -327,7 +331,7 @@ void StillImage_Task(void)
 
                        /* Indicate device no longer busy */
                        LEDs_SetAllLEDs(LEDMASK_USB_READY);
-                       
+
                        USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                        break;
        }
@@ -339,21 +343,22 @@ void StillImage_Task(void)
  *  \param[in] UnicodeString  Pointer to a Unicode encoded input string
  *  \param[out] Buffer        Pointer to a buffer where the converted ASCII string should be stored
  */
-void UnicodeToASCII(uint8_t* UnicodeString, char* Buffer)
+void UnicodeToASCII(uint8_t* UnicodeString,
+                    char* Buffer)
 {
        /* Get the number of characters in the string, skip to the start of the string data */
        uint8_t CharactersRemaining = *(UnicodeString++);
-       
+
        /* Loop through the entire unicode string */
        while (CharactersRemaining--)
        {
                /* Load in the next unicode character (only the lower byte, as only Unicode coded ASCII is supported) */
                *(Buffer++) = *UnicodeString;
-               
+
                /* Jump to the next unicode character */
                UnicodeString += 2;
        }
-       
+
        /* Null terminate the string */
        *Buffer = 0;
 }
@@ -363,13 +368,15 @@ void UnicodeToASCII(uint8_t* UnicodeString, char* Buffer)
  *  \param[in] ErrorCode          Error code of the function which failed to complete successfully
  *  \param[in] ResponseCodeError  Indicates if the error is due to a command failed indication from the device, or a communication failure
  */
-void ShowCommandError(uint8_t ErrorCode, bool ResponseCodeError)
+void ShowCommandError(uint8_t ErrorCode,
+                      bool ResponseCodeError)
 {
        char* FailureType = ((ResponseCodeError) ? PSTR("Response Code != OK") : PSTR("Transaction Fail"));
 
        printf_P(PSTR(ESC_FG_RED "Command Error (%S).\r\n"
                                 " -- Error Code %d\r\n" ESC_FG_WHITE), FailureType, ErrorCode);
-                       
+
        /* Indicate error via status LEDs */
        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 }
+