aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c
diff options
context:
space:
mode:
Diffstat (limited to 'Demos/Host/ClassDriver/StillImageHost/StillImageHost.c')
-rw-r--r--Demos/Host/ClassDriver/StillImageHost/StillImageHost.c147
1 files changed, 73 insertions, 74 deletions
diff --git a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c
index 91c482af8..6dd734401 100644
--- a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c
+++ b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c
@@ -70,80 +70,8 @@ int main(void)
for (;;)
{
- switch (USB_HostState)
- {
- case HOST_STATE_Addressed:
- LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
-
- uint16_t ConfigDescriptorSize;
- uint8_t ConfigDescriptorData[512];
-
- if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
- sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
- {
- puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- if (SI_Host_ConfigurePipes(&DigitalCamera_SI_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != SI_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Still Image Class Device.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Setting Device Configuration.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Still Image Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- puts_P(PSTR("Opening Session...\r\n"));
-
- if (SI_Host_OpenSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
- {
- puts_P(PSTR("Could not open PIMA session.\r\n"));
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Turning off Device...\r\n"));
-
- SI_Host_SendCommand(&DigitalCamera_SI_Interface, 0x1013, 0, NULL);
- if (SI_Host_ReceiveResponse(&DigitalCamera_SI_Interface))
- {
- puts_P(PSTR("Could not turn off device.\r\n"));
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Device Off.\r\n"));
-
- puts_P(PSTR("Closing Session...\r\n"));
-
- if (SI_Host_CloseSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
- {
- puts_P(PSTR("Could not close PIMA session.\r\n"));
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
+ StillImageHost_Task();
+
SI_Host_USBTask(&DigitalCamera_SI_Interface);
USB_USBTask();
}
@@ -168,6 +96,48 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB Still Image device once connected, to manage a
+ * new PIMA session in order to send commands to the attached device.
+ */
+void StillImageHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ puts_P(PSTR("Opening Session...\r\n"));
+
+ if (SI_Host_OpenSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
+ {
+ puts_P(PSTR("Could not open PIMA session.\r\n"));
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ puts_P(PSTR("Turning off Device...\r\n"));
+
+ SI_Host_SendCommand(&DigitalCamera_SI_Interface, 0x1013, 0, NULL);
+ if (SI_Host_ReceiveResponse(&DigitalCamera_SI_Interface))
+ {
+ puts_P(PSTR("Could not turn off device.\r\n"));
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ puts_P(PSTR("Device Off.\r\n"));
+
+ puts_P(PSTR("Closing Session...\r\n"));
+
+ if (SI_Host_CloseSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
+ {
+ puts_P(PSTR("Could not close PIMA session.\r\n"));
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);
+ USB_Host_SetDeviceConfiguration(0);
+}
+
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
* starts the library USB task to begin the enumeration and USB management process.
*/
@@ -191,6 +161,35 @@ void EVENT_USB_Host_DeviceUnattached(void)
*/
void EVENT_USB_Host_DeviceEnumerationComplete(void)
{
+ LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
+
+ uint16_t ConfigDescriptorSize;
+ uint8_t ConfigDescriptorData[512];
+
+ if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
+ sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
+ {
+ puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ if (SI_Host_ConfigurePipes(&DigitalCamera_SI_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != SI_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Still Image Class Device.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Setting Device Configuration.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ puts_P(PSTR("Still Image Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}