// 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); }
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; } } }