summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Van Doorn <vandoorn.nick@gmail.com>2017-11-03 10:22:08 -0700
committerNick Van Doorn <vandoorn.nick@gmail.com>2017-11-03 10:22:08 -0700
commitd9cc2c8146a3ef62e33da0ba5bff6e78acc446dd (patch)
tree1e06a7cab8ec0c04b839d31499305bb169f5ba3a
parent5a03ac2d414ee089958ba33bea586407acba4760 (diff)
Implement all methods suported on the VC0706
Most of this is ported directly from the Adafruit repo with some small changes Still lots of magic numbers floating around that I would like to squash but I'm not sure if there is really any point.
-rw-r--r--camera.c200
-rw-r--r--camera.h16
2 files changed, 181 insertions, 35 deletions
diff --git a/camera.c b/camera.c
index 57cd63b..88aa042 100644
--- a/camera.c
+++ b/camera.c
@@ -48,18 +48,18 @@ bool runCommand (Camera *cam, byte cmd, byte args[], int respLen) {
return false;
if (verifyResponse(cam, cmd))
return false;
- else return true;
+ return true;
}
// Reads from the camera and returns how many bytes it read
-int readResponse (Camera *cam, int nBytes, int timeout) {
+int readResponse (Camera *cam, int nBytes, unsigned int timeout) {
int counter = 0;
- int bufferLen = 0;
+ cam->bufferLen = 0;
// read while below timeout and while the buffer
// is still smaller than expected
while(timeout >= counter && cam->bufferLen <= nBytes) {
ssize_t bytesRead = read(cam->fd, &(cam->buff) + cam->bufferLen, 1); // read one byte at a time
- bufferLen++;
+ cam->bufferLen++;
// bytesRead will be 0 or -1 if no data was received
if (bytesRead <= 0) {
delay(1);
@@ -87,6 +87,7 @@ bool cameraFrameBuffCtrl (Camera *cam, byte cmd) {
}
bool takePicture (Camera *cam) {
+ cam->frameptr = 0;
return cameraFrameBuffCtrl(cam, VC0706_STOPCURRENTFRAME);
}
@@ -95,7 +96,174 @@ bool reset (Camera *cam) {
return runCommand(cam, VC0706_RESET, args, 5);
}
-size_t bufferToFile (Camera *cam, char *path) {
+bool TVon (Camera *cam) {
+ byte args[] = { 0x1, 0x1 };
+ return runCommand(cam, VC0706_TVOUT_CTRL, args, 5);
+}
+
+bool TVOff (Camera *cam) {
+ byte args[] = { 0x1, 0x0 };
+ return runCommand(cam, VC0706_TVOUT_CTRL, args, 5);
+}
+
+byte *readPicture (Camera *cam, byte n) {
+ byte args[] = { 0x0C, 0x0, 0x0A,
+ 0, 0, cam->frameptr >> 8, cam->frameptr & 0xFF,
+ 0, 0, 0, n,
+ DELAY >> 8, DELAY & 0xFF };
+ if (!runCommand(cam, VC0706_READ_FBUF, args, 5))
+ return 0;
+ if (readResponse(cam, n + 5, DELAY) == 0)
+ return 0;
+
+ cam->frameptr += n;
+
+ return &(cam->buff[0]);
+}
+
+bool resumeVideo (Camera *cam) {
+ return cameraFrameBuffCtrl(cam, VC0706_RESUMEFRAME);
+}
+uint32_t frameLength (Camera *cam) {
+ byte args[] = { 0x01, 0x00 };
+ if (!runCommand(cam, VC0706_GET_FBUF_LEN, args, 9))
+ return 0;
+
+ uint32_t len;
+ len = cam->buff[5];
+ len <<= 8;
+ len |= cam->buff[6];
+ len <<= 8;
+ len |= cam->buff[7];
+ len <<= 8;
+ len |= cam->buff[8];
+
+ return len;
+}
+
+char *getVersion (Camera *cam) {
+ byte args[] = { 0x01 };
+ sendCommand(cam, VC0706_GEN_VERSION, args);
+ if (!readResponse(cam, BUFF_SIZE, 200))
+ return 0;
+ cam->buff[cam->bufferLen] = 0;
+ return (char*)&(cam->buff);
+}
+
+byte available (Camera *cam) {
+ return cam->bufferLen;
+}
+
+byte getDownsize (Camera *cam) {
+ byte args[] = { 0x0 };
+ if (!runCommand(cam, VC0706_DOWNSIZE_STATUS, args, 6))
+ return -1;
+ return cam->buff[5];
+}
+
+bool setDownsize(Camera *cam, byte newSize) {
+ byte args[] = { 0x01, newSize };
+ return runCommand(cam, VC0706_DOWNSIZE_CTRL, args, 5);
+}
+
+int getImageSize (Camera *cam) {
+ byte args[] = { 0x4, 0x4, 0x1, 0x00, 0x19 };
+ if (!runCommand(cam, VC0706_READ_DATA, args, 6))
+ return -1;
+ return cam->buff[5];
+}
+
+bool setImageSize (Camera *cam, byte x) {
+ byte args[] = { 0x05, 0x04, 0x01, 0x00, 0x19, x };
+ return runCommand(cam, VC0706_WRITE_DATA, args, 5);
+}
+
+bool getMotionDetect (Camera *cam) {
+ byte args[] = { 0x0 };
+ if (!runCommand(cam, VC0706_COMM_MOTION_STATUS, args, 6))
+ return false;
+ return cam->buff[5];
+}
+
+byte getMotionStatus(Camera *cam, byte x) {
+ byte args[] = { 0x01, x };
+ return runCommand(cam, VC0706_MOTION_STATUS, args, 5);
+}
+
+bool motionDetected (Camera *cam) {
+ if (readResponse(cam, 4, 200) != 4)
+ return false;
+ if (!verifyResponse(cam, VC0706_COMM_MOTION_DETECTED))
+ return false;
+ return true;
+}
+
+bool setMotionDetect (Camera *cam, bool flag) {
+ if (!setMotionStatus(cam, VC0706_MOTIONCONTROL, VC0706_UARTMOTION, VC0706_ACTIVATEMOTION))
+ return false;
+ byte args[] = { 0x1, flag };
+ return runCommand(cam, VC0706_MOTION_STATUS, args, 5);
+}
+
+bool setMotionStatus (Camera *cam, byte x, byte d1, byte d2) {
+ byte args[] = { 0x03, x, d1, d2 };
+ return runCommand(cam, VC0706_MOTION_CTRL, args, 5);
+}
+
+byte getCompression (Camera *cam) {
+ byte args[] = { 0x4, 0x1, 0x1, 0x12, 0x04 };
+ runCommand(cam, VC0706_READ_DATA, args, 6);
+ return cam->buff[5];
+}
+
+bool setCompression (Camera *cam, byte c) {
+ byte args[] = { 0x5, 0x1, 0x1, 0x12, 0x04, c };
+ return runCommand(cam, VC0706_WRITE_DATA, args, 5);
+}
+
+bool getPTZ(Camera *cam, uint16_t *w, uint16_t *h, uint16_t *wz, uint16_t *hz, uint16_t *pan, uint16_t *tilt) {
+ byte args[] = {0x0};
+
+ if (!runCommand(cam, VC0706_GET_ZOOM, args, 16))
+ return false;
+ *w = cam->buff[5];
+ *w <<= 8;
+ *w |= cam->buff[6];
+
+ *h = cam->buff[7];
+ *h <<= 8;
+ *h |= cam->buff[8];
+
+ *wz = cam->buff[9];
+ *wz <<= 8;
+ *wz |= cam->buff[10];
+
+ *hz = cam->buff[11];
+ *hz <<= 8;
+ *hz |= cam->buff[12];
+
+ *pan = cam->buff[13];
+ *pan <<= 8;
+ *pan |= cam->buff[14];
+
+ *tilt = cam->buff[15];
+ *tilt <<= 8;
+ *tilt |= cam->buff[16];
+
+ return true;
+}
+
+bool setPTZ(Camera *cam, uint16_t wz, uint16_t hz, uint16_t pan, uint16_t tilt) {
+ byte args[] = {
+ 0x08, wz >> 8, wz,
+ hz >> 8, wz,
+ pan>>8, pan,
+ tilt>>8, tilt
+ };
+ return !runCommand(cam, VC0706_SET_ZOOM, args, 5);
+}
+
+size_t camToFile (Camera *cam, char *path) {
FILE *photo = fopen(path, "w");
if (photo != NULL) {
LE_INFO("File pointer for %s is valid", path);
@@ -108,25 +276,3 @@ size_t bufferToFile (Camera *cam, char *path) {
return -1;
}
}
-
-// TODO implement these
-bool TVon (Camera *cam);
-bool TVOff (Camera *cam);
-byte *readPicture (Camera *cam);
-bool resumeVideo (Camera *cam);
-uint32_t frameLength (Camera *cam);
-char *getVersion (Camera *cam);
-byte available (Camera *cam);
-byte getDownsize (Camera *cam);
-bool setDownsize(Camera *cam, int newSize);
-int getImageSize (Camera *cam);
-bool setImageSize (Camera *cam, int size);
-bool getMotionDetect (Camera *cam);
-byte getMotionStatus(Camera *cam, byte x);
-bool motionDetected (Camera *cam);
-bool setMotionDetect (Camera *cam, bool flag);
-bool setMotionStatus (Camera *cam, byte x, byte d1, byte d2);
-byte getCompression (Camera *cam);
-bool setCompression(Camera *cam, byte c);
-bool getPTZ(Camera *cam, uint16_t *w, uint16_t *h, uint16_t *wz, uint16_t *hz, uint16_t *pan, uint16_t *tilt);
-bool setPTZ(Camera *cam, uint16_t wz, uint16_t hz, uint16_t pan, uint16_t tilt);
diff --git a/camera.h b/camera.h
index f0e0595..6fbb3cc 100644
--- a/camera.h
+++ b/camera.h
@@ -54,33 +54,33 @@ typedef struct {
uint16_t frameptr;
} Camera;
-void delay (unsigned int secs);
+void delay (unsigned int msecs);
int openCameraFd ();
void sendCommand (Camera *cam, byte cmd, byte args[]);
bool runCommand (Camera *cam, byte cmd, byte args[], int respLen);
-int readResponse (Camera *cam, int nBytes, int timeout);
+int readResponse (Camera *cam, int nBytes, unsigned int timeout);
bool verifyResponse (Camera *cam, byte cmd);
bool cameraFrameBuffCtrl (Camera *cam, byte cmd);
bool takePicture (Camera *cam);
-size_t bufferToFile (Camera *cam, char *path);
bool reset (Camera *cam);
bool TVon (Camera *cam);
bool TVOff (Camera *cam);
-byte *readPicture (Camera *cam);
+byte *readPicture (Camera *cam, byte n);
bool resumeVideo (Camera *cam);
uint32_t frameLength (Camera *cam);
char *getVersion (Camera *cam);
byte available (Camera *cam);
byte getDownsize (Camera *cam);
-bool setDownsize(Camera *cam, int newSize);
+bool setDownsize(Camera *cam, byte newSize);
int getImageSize (Camera *cam);
-bool setImageSize (Camera *cam, int size);
+bool setImageSize (Camera *cam, byte x);
bool getMotionDetect (Camera *cam);
byte getMotionStatus(Camera *cam, byte x);
bool motionDetected (Camera *cam);
-bool setMotionDetect (bool flag);
-bool setMotionStatus (byte x, byte d1, byte d2);
+bool setMotionDetect (Camera *cam, bool flag);
+bool setMotionStatus (Camera *cam, byte x, byte d1, byte d2);
byte getCompression (Camera *cam);
bool setCompression(Camera *cam, byte c);
bool getPTZ(Camera *cam, uint16_t *w, uint16_t *h, uint16_t *wz, uint16_t *hz, uint16_t *pan, uint16_t *tilt);
bool setPTZ(Camera *cam, uint16_t wz, uint16_t hz, uint16_t pan, uint16_t tilt);
+size_t camToFile (Camera *cam, char *path);