Fix warning about possible string truncation in the TempDataLogger project.
[pub/USBasp.git] / Demos / Host / LowLevel / StillImageHost / Lib / StillImageCommands.c
index 5304509..6d53901 100644 (file)
@@ -1,24 +1,24 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2018.
+
   dean [at] fourwalledcubicle [dot] com
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2018  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
   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
   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.
 
   software without specific, written prior permission.
 
-  The author disclaim all warranties with regard to this
+  The author disclaims 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
   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
@@ -55,10 +55,10 @@ void SImage_SendBlockHeader(void)
        Pipe_Unfreeze();
 
        /* Write the PIMA block to the data OUT pipe */
        Pipe_Unfreeze();
 
        /* Write the PIMA block to the data OUT pipe */
-       Pipe_Write_Stream_LE(&PIMA_SendBlock, PIMA_COMMAND_SIZE(0));
-       
+       Pipe_Write_Stream_LE(&PIMA_SendBlock, PIMA_COMMAND_SIZE(0), NULL);
+
        /* If the block type is a command, send its parameters (if any) */
        /* If the block type is a command, send its parameters (if any) */
-       if (PIMA_SendBlock.Type == CType_CommandBlock)
+       if (PIMA_SendBlock.Type == PIMA_CONTAINER_CommandBlock)
        {
                /* Determine the size of the parameters in the block via the data length attribute */
                uint8_t ParamBytes = (PIMA_SendBlock.DataLength - PIMA_COMMAND_SIZE(0));
        {
                /* Determine the size of the parameters in the block via the data length attribute */
                uint8_t ParamBytes = (PIMA_SendBlock.DataLength - PIMA_COMMAND_SIZE(0));
@@ -67,13 +67,13 @@ void SImage_SendBlockHeader(void)
                if (ParamBytes)
                {
                        /* Write the PIMA parameters to the data OUT pipe */
                if (ParamBytes)
                {
                        /* Write the PIMA parameters to the data OUT pipe */
-                       Pipe_Write_Stream_LE(&PIMA_SendBlock.Params, ParamBytes);
+                       Pipe_Write_Stream_LE(&PIMA_SendBlock.Params, ParamBytes, NULL);
                }
                }
-               
+
                /* Send the PIMA command block to the attached device */
                Pipe_ClearOUT();
        }
                /* Send the PIMA command block to the attached device */
                Pipe_ClearOUT();
        }
-                                       
+
        /* Freeze pipe after use */
        Pipe_Freeze();
 }
        /* Freeze pipe after use */
        Pipe_Freeze();
 }
@@ -89,16 +89,16 @@ uint8_t SImage_ReceiveEventHeader(void)
        /* Unfreeze the events pipe */
        Pipe_SelectPipe(SIMAGE_EVENTS_PIPE);
        Pipe_Unfreeze();
        /* Unfreeze the events pipe */
        Pipe_SelectPipe(SIMAGE_EVENTS_PIPE);
        Pipe_Unfreeze();
-       
+
        /* Read in the event data into the global structure */
        /* Read in the event data into the global structure */
-       ErrorCode = Pipe_Read_Stream_LE(&PIMA_EventBlock, sizeof(PIMA_EventBlock));
-       
+       ErrorCode = Pipe_Read_Stream_LE(&PIMA_EventBlock, sizeof(PIMA_EventBlock), NULL);
+
        /* Clear the pipe after read complete to prepare for next event */
        Pipe_ClearIN();
        /* Clear the pipe after read complete to prepare for next event */
        Pipe_ClearIN();
-       
+
        /* Freeze the event pipe again after use */
        Pipe_Freeze();
        /* Freeze the event pipe again after use */
        Pipe_Freeze();
-       
+
        return ErrorCode;
 }
 
        return ErrorCode;
 }
 
@@ -108,30 +108,30 @@ uint8_t SImage_ReceiveEventHeader(void)
  */
 uint8_t SImage_ReceiveBlockHeader(void)
 {
  */
 uint8_t SImage_ReceiveBlockHeader(void)
 {
-       uint16_t TimeoutMSRem = COMMAND_DATA_TIMEOUT_MS;
+       uint16_t TimeoutMSRem        = COMMAND_DATA_TIMEOUT_MS;
+       uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
 
        /* Unfreeze the data IN pipe */
        Pipe_SelectPipe(SIMAGE_DATA_IN_PIPE);
        Pipe_Unfreeze();
 
        /* Unfreeze the data IN pipe */
        Pipe_SelectPipe(SIMAGE_DATA_IN_PIPE);
        Pipe_Unfreeze();
-       
+
        /* Wait until data received on the IN pipe */
        /* Wait until data received on the IN pipe */
-       while (!(Pipe_IsReadWriteAllowed()))
+       while (!(Pipe_IsINReceived()))
        {
        {
+               uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
                /* Check to see if a new frame has been issued (1ms elapsed) */
                /* Check to see if a new frame has been issued (1ms elapsed) */
-               if (USB_INT_HasOccurred(USB_INT_HSOFI))
+               if (CurrentFrameNumber != PreviousFrameNumber)
                {
                {
-                       /* Clear the flag and decrement the timeout period counter */
-                       USB_INT_Clear(USB_INT_HSOFI);
+                       /* Save the new frame number and decrement the timeout period */
+                       PreviousFrameNumber = CurrentFrameNumber;
                        TimeoutMSRem--;
 
                        /* Check to see if the timeout period for the command has elapsed */
                        if (!(TimeoutMSRem))
                        TimeoutMSRem--;
 
                        /* Check to see if the timeout period for the command has elapsed */
                        if (!(TimeoutMSRem))
-                       {
-                               /* Return error code */
-                               return PIPE_RWSTREAM_Timeout;
-                       }
+                         return PIPE_RWSTREAM_Timeout;
                }
                }
-               
+
                Pipe_Freeze();
                Pipe_SelectPipe(SIMAGE_DATA_OUT_PIPE);
                Pipe_Unfreeze();
                Pipe_Freeze();
                Pipe_SelectPipe(SIMAGE_DATA_OUT_PIPE);
                Pipe_Unfreeze();
@@ -140,7 +140,7 @@ uint8_t SImage_ReceiveBlockHeader(void)
                if (Pipe_IsStalled())
                {
                        /* Clear the stall condition on the OUT pipe */
                if (Pipe_IsStalled())
                {
                        /* Clear the stall condition on the OUT pipe */
-                       USB_Host_ClearPipeStall(SIMAGE_DATA_OUT_PIPE);
+                       USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
 
                        /* Return error code and break out of the loop */
                        return PIPE_RWSTREAM_PipeStalled;
 
                        /* Return error code and break out of the loop */
                        return PIPE_RWSTREAM_PipeStalled;
@@ -154,22 +154,22 @@ uint8_t SImage_ReceiveBlockHeader(void)
                if (Pipe_IsStalled())
                {
                        /* Clear the stall condition on the IN pipe */
                if (Pipe_IsStalled())
                {
                        /* Clear the stall condition on the IN pipe */
-                       USB_Host_ClearPipeStall(SIMAGE_DATA_IN_PIPE);
+                       USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
 
                        /* Return error code */
                        return PIPE_RWSTREAM_PipeStalled;
                }
 
                        /* Return error code */
                        return PIPE_RWSTREAM_PipeStalled;
                }
-                 
+
                /* Check to see if the device was disconnected, if so exit function */
                if (USB_HostState == HOST_STATE_Unattached)
                  return PIPE_RWSTREAM_DeviceDisconnected;
        }
                /* Check to see if the device was disconnected, if so exit function */
                if (USB_HostState == HOST_STATE_Unattached)
                  return PIPE_RWSTREAM_DeviceDisconnected;
        }
-               
+
        /* Load in the response from the attached device */
        /* Load in the response from the attached device */
-       Pipe_Read_Stream_LE(&PIMA_ReceivedBlock, PIMA_COMMAND_SIZE(0));
-       
+       Pipe_Read_Stream_LE(&PIMA_ReceivedBlock, PIMA_COMMAND_SIZE(0), NULL);
+
        /* Check if the returned block type is a response block */
        /* Check if the returned block type is a response block */
-       if (PIMA_ReceivedBlock.Type == CType_ResponseBlock)
+       if (PIMA_ReceivedBlock.Type == PIMA_CONTAINER_ResponseBlock)
        {
                /* Determine the size of the parameters in the block via the data length attribute */
                uint8_t ParamBytes = (PIMA_ReceivedBlock.DataLength - PIMA_COMMAND_SIZE(0));
        {
                /* Determine the size of the parameters in the block via the data length attribute */
                uint8_t ParamBytes = (PIMA_ReceivedBlock.DataLength - PIMA_COMMAND_SIZE(0));
@@ -178,16 +178,16 @@ uint8_t SImage_ReceiveBlockHeader(void)
                if (ParamBytes)
                {
                        /* Read the PIMA parameters from the data IN pipe */
                if (ParamBytes)
                {
                        /* Read the PIMA parameters from the data IN pipe */
-                       Pipe_Read_Stream_LE(&PIMA_ReceivedBlock.Params, ParamBytes);
+                       Pipe_Read_Stream_LE(&PIMA_ReceivedBlock.Params, ParamBytes, NULL);
                }
                }
-               
+
                /* Clear pipe bank after use */
                Pipe_ClearIN();
        }
                /* Clear pipe bank after use */
                Pipe_ClearIN();
        }
-       
+
        /* Freeze the IN pipe after use */
        Pipe_Freeze();
        /* Freeze the IN pipe after use */
        Pipe_Freeze();
-       
+
        return PIPE_RWSTREAM_NoError;
 }
 
        return PIPE_RWSTREAM_NoError;
 }
 
@@ -198,34 +198,36 @@ uint8_t SImage_ReceiveBlockHeader(void)
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
-uint8_t SImage_SendData(void* const Buffer, const uint16_t Bytes)
+uint8_t SImage_SendData(void* const Buffer,
+                        const uint16_t Bytes)
 {
        uint8_t ErrorCode;
 
        /* Unfreeze the data OUT pipe */
        Pipe_SelectPipe(SIMAGE_DATA_OUT_PIPE);
        Pipe_Unfreeze();
 {
        uint8_t ErrorCode;
 
        /* Unfreeze the data OUT pipe */
        Pipe_SelectPipe(SIMAGE_DATA_OUT_PIPE);
        Pipe_Unfreeze();
-       
+
        /* Write the data contents to the pipe */
        /* Write the data contents to the pipe */
-       ErrorCode = Pipe_Write_Stream_LE(Buffer, Bytes);
+       ErrorCode = Pipe_Write_Stream_LE(Buffer, Bytes, NULL);
 
        /* Send the last packet to the attached device */
        Pipe_ClearOUT();
 
        /* Freeze the pipe again after use */
        Pipe_Freeze();
 
        /* Send the last packet to the attached device */
        Pipe_ClearOUT();
 
        /* Freeze the pipe again after use */
        Pipe_Freeze();
-       
+
        return ErrorCode;
 }
 
        return ErrorCode;
 }
 
-/** Function to receive the given data to the device, after a response block has been received.
+/** Function to receive the given data from the device, after a response block has been received.
  *
  *  \param[out] Buffer  Destination data buffer to put read bytes from the device
  *  \param[in] Bytes    Number of bytes to receive
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
  *
  *  \param[out] Buffer  Destination data buffer to put read bytes from the device
  *  \param[in] Bytes    Number of bytes to receive
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
-uint8_t SImage_ReadData(void* const Buffer, const uint16_t Bytes)
+uint8_t SImage_ReadData(void* const Buffer,
+                        const uint16_t Bytes)
 {
        uint8_t ErrorCode;
 
 {
        uint8_t ErrorCode;
 
@@ -234,17 +236,17 @@ uint8_t SImage_ReadData(void* const Buffer, const uint16_t Bytes)
        Pipe_Unfreeze();
 
        /* Read in the data into the buffer */
        Pipe_Unfreeze();
 
        /* Read in the data into the buffer */
-       ErrorCode = Pipe_Read_Stream_LE(Buffer, Bytes);
+       ErrorCode = Pipe_Read_Stream_LE(Buffer, Bytes, NULL);
 
        /* Freeze the pipe again after use */
        Pipe_Freeze();
 
        /* Freeze the pipe again after use */
        Pipe_Freeze();
-       
+
        return ErrorCode;
 }
 
 /** Function to test if a PIMA event block is waiting to be read in from the attached device.
  *
        return ErrorCode;
 }
 
 /** Function to test if a PIMA event block is waiting to be read in from the attached device.
  *
- *  \return True if an event is waiting to be read in from the device, false otherwise
+ *  \return True if an event is waiting to be read in from the device, \c false otherwise
  */
 bool SImage_IsEventReceived(void)
 {
  */
 bool SImage_IsEventReceived(void)
 {
@@ -253,13 +255,14 @@ bool SImage_IsEventReceived(void)
        /* Unfreeze the Event pipe */
        Pipe_SelectPipe(SIMAGE_EVENTS_PIPE);
        Pipe_Unfreeze();
        /* Unfreeze the Event pipe */
        Pipe_SelectPipe(SIMAGE_EVENTS_PIPE);
        Pipe_Unfreeze();
-       
+
        /* If the pipe contains data, an event has been received */
        if (Pipe_BytesInPipe())
          IsEventReceived = true;
        /* If the pipe contains data, an event has been received */
        if (Pipe_BytesInPipe())
          IsEventReceived = true;
-       
+
        /* Freeze the pipe after use */
        Pipe_Freeze();
        /* Freeze the pipe after use */
        Pipe_Freeze();
-       
+
        return IsEventReceived;
 }
        return IsEventReceived;
 }
+