Beispiel #1
0
// Get a frame from the camera device
void getFrames(int noFrames, int minNoFrames, int* fd, int* imgCaptureType,
			   int cqual, int fps, int bufferSize)
{
	struct v4l2_buffer 			buf;
	struct buffer* 				bufs;
	struct v4l2_requestbuffers 	reqbuf = getReqBufs(noFrames, minNoFrames, fd);
	unsigned int 				n_buffers, i, ctr = 0;
    bool 						started = FALSE, streamOn = false;
    struct lstnode* cNode = allocate(bufferSize);
    pthread_mutex_t* mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
    pthread_mutex_init(mutex, NULL);
	struct imgDetails det = getFrameFormat(fd); // get video format details
	bufs = (struct buffer*)calloc(reqbuf.count, sizeof(*bufs)); // alloc buffers
	// If allocation fails
	if (bufs == NULL) exitWithError("Could not allocate buffers.");
	// Map the memory in kernel space to user space to access video efficiently
	for (n_buffers = 0; n_buffers < reqbuf.count; n_buffers++)
	{
		mapBuffer(reqbuf, n_buffers, buf, bufs, fd);
	}
	// Queue the request struct to v4l2 to retrieve the video data mem location
	for(i = 0; i < reqbuf.count; i++)	queueBuffer(i, buf, fd);
	streamOn = turnOnCamera(fd, streamOn, imgCaptureType); // turn on camera
    while(true) //forever
    {
		if(!started) // if the write data thread has not yet been started
		{
			started = TRUE;
			createThread(cNode, mutex);
		}
		for(i = 0; i < reqbuf.count; i++) // for each frame returned
		{
			usleep(fps); // maintain steady frame rate
			pthread_mutex_lock(mutex); // lock pointers
			createImage(buf, bufs, i, cNode, fd, det, cqual);
			cNode = cNode->next; // work with the next node in the list
			printf("|%d|\n", ctr++);
			pthread_mutex_unlock(mutex); // release locks
			queueBuffer(i, buf, fd); // queue up a new buffer
		}
    }
    for (i = 0; i < reqbuf.count; ++i) // unmap memory
    {
    	munmap(bufs[i].start, bufs[i].length);
    }
    free(mutex);
    free(cNode);
    free(bufs);
}
Beispiel #2
0
int main()
{
	Initialize();
	_delay_ms(100);
	setUpCamera();
	_delay_ms(100);

//Set current Mode (temporary)

	nextMode = CAPTURE;	

	sei ();
	while(1)
	{
		switch (nextMode)
		{
			case IDLE:
				///Don't do anything, just chill
				break;
			case CAPTURE:
				///Turn on camera if necessary
				if (cameraOn == 0)
				{
					turnOnCamera();
				}
				break;
			case SENDING:
				//SEND DATA CALL HERE
				sendLineBuffer();
				break;
			case STEPPING:
				//Enable stepper motor timer here
				break;
		}
	}
}