summaryrefslogtreecommitdiff
path: root/camera.c
diff options
context:
space:
mode:
Diffstat (limited to 'camera.c')
-rw-r--r--camera.c113
1 files changed, 57 insertions, 56 deletions
diff --git a/camera.c b/camera.c
index a50bc36..b838500 100644
--- a/camera.c
+++ b/camera.c
@@ -1,55 +1,48 @@
#include "legato.h"
#include "interfaces.h"
#include "camera.h"
-#include <time.h>
COMPONENT_INIT { }
-// Used to wait for the serial port
-void delay (unsigned int msecs) {
- unsigned int secs = msecs / 1000;
- unsigned int retTime = time(0) + secs;
- while (time(0) < retTime);
+// File descriptor is returned in the fd pointer
+le_result_t openCameraFd (char *path, int *fd, tty_Speed_t baud, int nBytes, int timeout) {
+ *fd = le_tty_Open(path, O_RDWR);
+ le_result_t baudRes = le_tty_SetBaudRate(*fd, baud);
+ le_result_t rawRes = le_tty_SetRaw(*fd, nBytes, timeout);
+ return baudRes == LE_OK && rawRes == LE_OK ? LE_OK : LE_FAULT;
}
-// Returns a file descriptor that can be used to
-// talk to the camera
-int openCameraFd (int nBytes, int timeout) {
- int fd = le_tty_Open(SERIAL_PATH, O_RDWR);
- le_tty_SetBaudRate(fd, LE_TTY_SPEED_38400);
- le_tty_SetRaw(fd, nBytes, timeout);
- return fd;
-}
-
-// Send a command to the camera serial port
-void sendCommand (Camera *cam, uint8_t cmd, uint8_t args[]) {
- uint8_t nArgs = sizeof(args);
+ssize_t sendCommand (Camera *cam, uint8_t cmd, uint8_t args[], unsigned int nArgs) {
+ LE_INFO("sizeof args: %d", nArgs);
uint8_t toWrite[100] = { VC0706_PREFIX, cam->serialNum, cmd };
int start = 3;
int end = nArgs + start;
for (int i = start; i < end; i++) {
toWrite[i] = args[i - start];
};
- write(cam->fd, &toWrite[0], end);
+ return write(cam->fd, &toWrite[0], end);
}
-// Run a command
-bool runCommand (Camera *cam, uint8_t cmd, uint8_t args[], int respLen, bool flushFlag) {
+bool runCommand (Camera *cam, uint8_t cmd, uint8_t args[], unsigned int nArgs, int respLen, bool flushFlag) {
// flush out the buffer
- if (flushFlag) readResponse(cam, 100, 10);
- sendCommand(cam, cmd, args);
- if (readResponse(cam, respLen, TIMEOUT) != respLen)
+ if (flushFlag) {
+ cam->bufferLen = 0;
+ fsync(cam->fd);
+ }
+ sendCommand(cam, cmd, args, nArgs);
+ if (readResponse(cam, respLen, CAM_TIMEOUT) != respLen)
return false;
- if (verifyResponse(cam, cmd))
+ if (!verifyResponse(cam, cmd))
return false;
return true;
}
-bool runCommandFlush (Camera *cam, uint8_t cmd, uint8_t args[], int respLen) {
- return runCommand (cam, cmd, args, respLen, true);
+bool runCommandFlush (Camera *cam, uint8_t cmd, uint8_t args[], unsigned int nArgs, int respLen) {
+ return runCommand (cam, cmd, args, nArgs, respLen, true);
}
// Reads from the camera and returns how many bytes it read
+// TODO kill off un-needed timeout
uint8_t readResponse (Camera *cam, unsigned int nBytes, unsigned int timeout) {
cam->bufferLen = 0;
uint8_t *buffPtr = &(cam->buff[0]);
@@ -64,13 +57,17 @@ uint8_t readResponse (Camera *cam, unsigned int nBytes, unsigned int timeout) {
void printBuffer (Camera *cam) {
LE_INFO("Printing cam buffer");
for(int i = 0; i < NUM_ARRAY_MEMBERS(cam->buff); i++) {
- LE_INFO("0x%d", cam->buff[i]);
+ LE_INFO("buff[%d]=%d", i, cam->buff[i]);
}
}
bool verifyResponse (Camera *cam, uint8_t cmd) {
// If any of these are not equal than
// the command failed
+ LE_INFO("buff[0] correct? %d", cam->buff[0] == VC0706_RESP_PREFIX);
+ LE_INFO("buff[1] correct? %d", cam->buff[1] == cam->serialNum);
+ LE_INFO("buff[2] correct? %d", cam->buff[2] == cmd);
+ LE_INFO("buff[3] correct? %d", cam->buff[3] == 0x0);
return
cam->buff[0] == VC0706_RESP_PREFIX &&
cam->buff[1] == cam->serialNum &&
@@ -80,7 +77,7 @@ bool verifyResponse (Camera *cam, uint8_t cmd) {
bool cameraFrameBuffCtrl (Camera *cam, uint8_t cmd) {
uint8_t args[] = { 0x1, cmd };
- return runCommandFlush(cam, VC0706_FBUF_CTRL, args, 5);
+ return runCommandFlush(cam, VC0706_FBUF_CTRL, args, sizeof(args), 5);
}
bool takePicture (Camera *cam) {
@@ -90,27 +87,28 @@ bool takePicture (Camera *cam) {
bool reset (Camera *cam) {
uint8_t args[] = { 0x0 };
- return runCommandFlush(cam, VC0706_RESET, args, 5);
+ return runCommandFlush(cam, VC0706_RESET, args, sizeof(args), 5);
}
bool TVon (Camera *cam) {
uint8_t args[] = { 0x1, 0x1 };
- return runCommandFlush(cam, VC0706_TVOUT_CTRL, args, 5);
+ return runCommandFlush(cam, VC0706_TVOUT_CTRL, args, sizeof(args), 5);
}
bool TVOff (Camera *cam) {
uint8_t args[] = { 0x1, 0x0 };
- return runCommandFlush(cam, VC0706_TVOUT_CTRL, args, 5);
+ return runCommandFlush(cam, VC0706_TVOUT_CTRL, args, sizeof(args), 5);
}
-uint8_t *readPicture (Camera *cam, uint8_t n) {
+uint8_t* readPicture (Camera *cam, uint8_t n) {
uint8_t 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, false)) // don't flush
+ CAM_DELAY >> 8, CAM_DELAY & 0xFF };
+ LE_INFO("Got dat frameptr: %d", cam->frameptr);
+ if (!runCommand(cam, VC0706_READ_FBUF, args, sizeof(args), 5, false)) // don't flush
return 0;
- if (readResponse(cam, n + 5, DELAY) == 0)
+ if (readResponse(cam, n + 5, CAM_DELAY) == 0)
return 0;
cam->frameptr += n;
@@ -125,7 +123,7 @@ bool resumeVideo (Camera *cam) {
uint32_t frameLength (Camera *cam) {
uint8_t args[] = { 0x01, 0x00 };
// return 0 if this fails
- if (!runCommandFlush(cam, VC0706_GET_FBUF_LEN, args, 9))
+ if (!runCommandFlush(cam, VC0706_GET_FBUF_LEN, args, sizeof(args), 9))
return 0;
uint32_t len;
@@ -140,10 +138,10 @@ uint32_t frameLength (Camera *cam) {
return len;
}
-char *getVersion (Camera *cam) {
+char* getVersion (Camera *cam) {
uint8_t args[] = { 0x01 };
- sendCommand(cam, VC0706_GEN_VERSION, args);
- if (!readResponse(cam, BUFF_SIZE, 200)) {
+ sendCommand(cam, VC0706_GEN_VERSION, args, sizeof(args));
+ if (!readResponse(cam, CAM_BUFF_SIZE, 200)) {
LE_INFO("Failed to get version, returning empty string");
return 0;
}
@@ -157,38 +155,38 @@ uint8_t available (Camera *cam) {
uint8_t getDownsize (Camera *cam) {
uint8_t args[] = { 0x0 };
- if (!runCommandFlush(cam, VC0706_DOWNSIZE_STATUS, args, 6))
+ if (!runCommandFlush(cam, VC0706_DOWNSIZE_STATUS, args, sizeof(args), 6))
return -1;
return cam->buff[5];
}
bool setDownsize (Camera *cam, uint8_t newSize) {
uint8_t args[] = { 0x01, newSize };
- return runCommandFlush(cam, VC0706_DOWNSIZE_CTRL, args, 5);
+ return runCommandFlush(cam, VC0706_DOWNSIZE_CTRL, args, sizeof(args), 5);
}
uint8_t getImageSize (Camera *cam) {
uint8_t args[] = { 0x4, 0x4, 0x1, 0x00, 0x19 };
- if (!runCommandFlush(cam, VC0706_READ_DATA, args, 6))
+ if (!runCommandFlush(cam, VC0706_READ_DATA, args, sizeof(args), 6))
return -1;
return cam->buff[5];
}
bool setImageSize (Camera *cam, uint8_t x) {
uint8_t args[] = { 0x05, 0x04, 0x01, 0x00, 0x19, x };
- return runCommandFlush(cam, VC0706_WRITE_DATA, args, 5);
+ return runCommandFlush(cam, VC0706_WRITE_DATA, args, sizeof(args), 5);
}
bool getMotionDetect (Camera *cam) {
uint8_t args[] = { 0x0 };
- if (!runCommandFlush(cam, VC0706_COMM_MOTION_STATUS, args, 6))
+ if (!runCommandFlush(cam, VC0706_COMM_MOTION_STATUS, args, sizeof(args), 6))
return false;
return cam->buff[5];
}
uint8_t getMotionStatus(Camera *cam, uint8_t x) {
uint8_t args[] = { 0x01, x };
- return runCommandFlush(cam, VC0706_MOTION_STATUS, args, 5);
+ return runCommandFlush(cam, VC0706_MOTION_STATUS, args, sizeof(args), 5);
}
bool motionDetected (Camera *cam) {
@@ -203,29 +201,29 @@ bool setMotionDetect (Camera *cam, bool flag) {
if (!setMotionStatus(cam, VC0706_MOTIONCONTROL, VC0706_UARTMOTION, VC0706_ACTIVATEMOTION))
return false;
uint8_t args[] = { 0x1, flag };
- return runCommandFlush(cam, VC0706_MOTION_STATUS, args, 5);
+ return runCommandFlush(cam, VC0706_MOTION_STATUS, args, sizeof(args), 5);
}
bool setMotionStatus (Camera *cam, uint8_t x, uint8_t d1, uint8_t d2) {
uint8_t args[] = { 0x03, x, d1, d2 };
- return runCommandFlush(cam, VC0706_MOTION_CTRL, args, 5);
+ return runCommandFlush(cam, VC0706_MOTION_CTRL, args, sizeof(args), 5);
}
uint8_t getCompression (Camera *cam) {
uint8_t args[] = { 0x4, 0x1, 0x1, 0x12, 0x04 };
- runCommandFlush(cam, VC0706_READ_DATA, args, 6);
+ runCommandFlush(cam, VC0706_READ_DATA, args, sizeof(args), 6);
return cam->buff[5];
}
bool setCompression (Camera *cam, uint8_t c) {
uint8_t args[] = { 0x5, 0x1, 0x1, 0x12, 0x04, c };
- return runCommandFlush(cam, VC0706_WRITE_DATA, args, 5);
+ return runCommandFlush(cam, VC0706_WRITE_DATA, args, sizeof(args), 5);
}
bool getPTZ(Camera *cam, uint16_t *w, uint16_t *h, uint16_t *wz, uint16_t *hz, uint16_t *pan, uint16_t *tilt) {
uint8_t args[] ={ 0x0 };
- if (!runCommandFlush(cam, VC0706_GET_ZOOM, args, 16))
+ if (!runCommandFlush(cam, VC0706_GET_ZOOM, args, sizeof(args), 16))
return false;
*w = cam->buff[5];
*w <<= 8;
@@ -254,14 +252,14 @@ bool getPTZ(Camera *cam, uint16_t *w, uint16_t *h, uint16_t *wz, uint16_t *hz, u
return true;
}
-bool setPTZ(Camera *cam, 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) {
uint8_t args[] = {
0x08, wz >> 8, wz,
hz >> 8, wz,
- pan>>8, pan,
- tilt>>8, tilt
+ pan >> 8, pan,
+ tilt >> 8, tilt
};
- return !runCommandFlush(cam, VC0706_SET_ZOOM, args, 5);
+ return !runCommandFlush(cam, VC0706_SET_ZOOM, args, sizeof(args), 5);
}
bool snapshotToFile (Camera *cam, char *path, uint8_t imgSize) {
@@ -278,10 +276,13 @@ bool snapshotToFile (Camera *cam, char *path, uint8_t imgSize) {
if (filePtr != NULL) {
LE_INFO("Got valid file pointer");
int jpgLen = frameLength(cam);
+ LE_INFO("jpgLen: %d", jpgLen);
while (jpgLen > 0) {
uint8_t *buff;
- uint8_t bytesToRead = 32 < jpgLen ? jpgLen : 32;
+ uint8_t bytesToRead = 32 < jpgLen ? 32 : jpgLen;
+ LE_INFO("jpgLen: %d, bytesToRead: %d", jpgLen, bytesToRead);
buff = readPicture(cam, bytesToRead);
+ LE_INFO("Made it past a photo data read");
fwrite(buff, sizeof(*buff), bytesToRead, filePtr);
jpgLen -= bytesToRead;
}