void capture_task (void *data) { int ret; // We need to disable interrupts during capture so we do not // interfere with taking a photo extint_disable (extint1); while ( tcm8230_frame_ready_p ()) continue; while (! tcm8230_frame_ready_p ()) continue; ret = tcm8230_capture (image, sizeof(image), 200); if (ret < 0) // Capturing failed *comms_data[CD_PHOTO_READY-ARRAY_OFFSET] = 0; else { *comms_data[CD_PHOTO_READY-ARRAY_OFFSET] = 1; kernelTaskBlocked (CAPTURE_TASK); // Reblock capture task kernelTaskReady (PHOTO_READY_FLASH_TASK); // Indicate a photo is available } extint_enable (extint1); }
int main (void) { led_t leds[LEDS_NUM]; usb_cdc_t usb_cdc; int i; /* Initialise LEDs. */ for (i = 0; i < LEDS_NUM; i++) leds[i] = led_init (&leds_cfg[i]); led_set (leds[0], 0); led_set (leds[1], 0); led_set (leds[2], 0); usb_cdc = usb_cdc_init (); sys_redirect_stdin ((void *)usb_cdc_read, usb_cdc); sys_redirect_stdout ((void *)usb_cdc_write, usb_cdc); sys_redirect_stderr ((void *)usb_cdc_write, usb_cdc); tcm8230_init (&cfg); /* Wait until USB configured. */ while (! usb_cdc_update ()) continue; led_set (leds[0], 1); while (1) { int32_t ret; led_set (leds[1], 1); while ( tcm8230_frame_ready_p ()) continue; led_set (leds[1], 0); while (! tcm8230_frame_ready_p ()) continue; led_set (leds[1], 1); ret = tcm8230_capture (image, sizeof(image), 200); if (usb_cdc_update ()) { led_set (leds[0], 1); led_set (leds[2], 1); if (ret < 0) fprintf (stderr, "TCM8230 error: %d\r\n", (int)ret); else image_dump(image, SQCIF_HEIGHT, SQCIF_WIDTH); led_set (leds[2], 0); } else { /* USB disconnected. */ led_set (leds[0], 0); } } }