Colin Stearns
/
qcControl
QC Control software
Fork of dgps by
camera.cpp@6:434d20e99e49, 2014-02-21 (annotated)
- Committer:
- dylanembed123
- Date:
- Fri Feb 21 15:15:25 2014 +0000
- Revision:
- 6:434d20e99e49
- Parent:
- 2:f480097b329d
Camera takes an image and sends it back to the USB.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dylanembed123 | 6:434d20e99e49 | 1 | /*************************************************** |
dylanembed123 | 6:434d20e99e49 | 2 | This is a library for the Adafruit TTL JPEG Camera (VC0706 chipset) |
dylanembed123 | 6:434d20e99e49 | 3 | |
dylanembed123 | 6:434d20e99e49 | 4 | Pick one up today in the adafruit shop! |
dylanembed123 | 6:434d20e99e49 | 5 | ------> http://www.adafruit.com/products/397 |
dylanembed123 | 6:434d20e99e49 | 6 | |
dylanembed123 | 6:434d20e99e49 | 7 | These displays use Serial to communicate, 2 pins are required to interface |
dylanembed123 | 6:434d20e99e49 | 8 | |
dylanembed123 | 6:434d20e99e49 | 9 | Adafruit invests time and resources providing this open source code, |
dylanembed123 | 6:434d20e99e49 | 10 | please support Adafruit and open-source hardware by purchasing |
dylanembed123 | 6:434d20e99e49 | 11 | products from Adafruit! |
dylanembed123 | 6:434d20e99e49 | 12 | |
dylanembed123 | 6:434d20e99e49 | 13 | Written by Limor Fried/Ladyada for Adafruit Industries. |
dylanembed123 | 6:434d20e99e49 | 14 | BSD license, all text above must be included in any redistribution |
dylanembed123 | 6:434d20e99e49 | 15 | ****************************************************/ |
dylanembed123 | 6:434d20e99e49 | 16 | |
dylanembed123 | 6:434d20e99e49 | 17 | |
dylanembed123 | 6:434d20e99e49 | 18 | #include "camera.h" |
dylanembed123 | 6:434d20e99e49 | 19 | |
dylanembed123 | 6:434d20e99e49 | 20 | Serial* Camera::camera=NULL; |
dylanembed123 | 6:434d20e99e49 | 21 | uint8_t Camera::serialNum=0; |
dylanembed123 | 6:434d20e99e49 | 22 | |
dylanembed123 | 6:434d20e99e49 | 23 | Serial& Camera::getSerial(){ |
dylanembed123 | 6:434d20e99e49 | 24 | if(camera==NULL){ |
dylanembed123 | 6:434d20e99e49 | 25 | // Init Camera |
dylanembed123 | 6:434d20e99e49 | 26 | camera=new Serial(CAMERAPINTX,CAMERAPINRX); |
dylanembed123 | 6:434d20e99e49 | 27 | camera->baud(CAMERABAUD); |
dylanembed123 | 6:434d20e99e49 | 28 | serialNum=0; |
dylanembed123 | 6:434d20e99e49 | 29 | Camera temp; |
dylanembed123 | 6:434d20e99e49 | 30 | temp.reset(); |
dylanembed123 | 6:434d20e99e49 | 31 | } |
dylanembed123 | 6:434d20e99e49 | 32 | return *camera; |
dylanembed123 | 6:434d20e99e49 | 33 | } |
dylanembed123 | 6:434d20e99e49 | 34 | |
dylanembed123 | 6:434d20e99e49 | 35 | bool Camera::reset() { |
dylanembed123 | 6:434d20e99e49 | 36 | uint8_t args[] = {0x0}; |
dylanembed123 | 6:434d20e99e49 | 37 | return runCommand(VC0706_RESET, args, 1, 5); |
dylanembed123 | 6:434d20e99e49 | 38 | } |
dylanembed123 | 6:434d20e99e49 | 39 | |
dylanembed123 | 6:434d20e99e49 | 40 | /* |
dylanembed123 | 6:434d20e99e49 | 41 | // Initialization code used by all constructor types |
dylanembed123 | 6:434d20e99e49 | 42 | void Camera::common_init(void) { |
dylanembed123 | 6:434d20e99e49 | 43 | swSerial = NULL; |
dylanembed123 | 6:434d20e99e49 | 44 | hwSerial = NULL; |
dylanembed123 | 6:434d20e99e49 | 45 | frameptr = 0; |
dylanembed123 | 6:434d20e99e49 | 46 | bufferLen = 0; |
dylanembed123 | 6:434d20e99e49 | 47 | serialNum = 0; |
dylanembed123 | 6:434d20e99e49 | 48 | } |
dylanembed123 | 6:434d20e99e49 | 49 | |
dylanembed123 | 6:434d20e99e49 | 50 | // Constructor when using SoftwareSerial or NewSoftSerial |
dylanembed123 | 6:434d20e99e49 | 51 | #if ARDUINO >= 100 |
dylanembed123 | 6:434d20e99e49 | 52 | Camera::Camera(SoftwareSerial *ser) { |
dylanembed123 | 6:434d20e99e49 | 53 | #else |
dylanembed123 | 6:434d20e99e49 | 54 | Camera::Camera(NewSoftSerial *ser) { |
dylanembed123 | 6:434d20e99e49 | 55 | #endif |
dylanembed123 | 6:434d20e99e49 | 56 | common_init(); // Set everything to common state, then... |
dylanembed123 | 6:434d20e99e49 | 57 | swSerial = ser; // ...override swSerial with value passed. |
dylanembed123 | 6:434d20e99e49 | 58 | } |
dylanembed123 | 6:434d20e99e49 | 59 | |
dylanembed123 | 6:434d20e99e49 | 60 | // Constructor when using HardwareSerial |
dylanembed123 | 6:434d20e99e49 | 61 | Camera::Camera(HardwareSerial *ser) { |
dylanembed123 | 6:434d20e99e49 | 62 | common_init(); // Set everything to common state, then... |
dylanembed123 | 6:434d20e99e49 | 63 | hwSerial = ser; // ...override hwSerial with value passed. |
dylanembed123 | 6:434d20e99e49 | 64 | } |
dylanembed123 | 6:434d20e99e49 | 65 | |
dylanembed123 | 6:434d20e99e49 | 66 | boolean Camera::begin(uint16_t baud) { |
dylanembed123 | 6:434d20e99e49 | 67 | if(swSerial) swSerial->begin(baud); |
dylanembed123 | 6:434d20e99e49 | 68 | else hwSerial->begin(baud); |
dylanembed123 | 6:434d20e99e49 | 69 | return reset(); |
dylanembed123 | 6:434d20e99e49 | 70 | } |
dylanembed123 | 6:434d20e99e49 | 71 | |
dylanembed123 | 6:434d20e99e49 | 72 | |
dylanembed123 | 6:434d20e99e49 | 73 | boolean Camera::motionDetected() { |
dylanembed123 | 6:434d20e99e49 | 74 | if (readResponse(4, 200) != 4) { |
dylanembed123 | 6:434d20e99e49 | 75 | return false; |
dylanembed123 | 6:434d20e99e49 | 76 | } |
dylanembed123 | 6:434d20e99e49 | 77 | if (! verifyResponse(VC0706_COMM_MOTION_DETECTED)) |
dylanembed123 | 6:434d20e99e49 | 78 | return false; |
dylanembed123 | 6:434d20e99e49 | 79 | |
dylanembed123 | 6:434d20e99e49 | 80 | return true; |
dylanembed123 | 6:434d20e99e49 | 81 | } |
dylanembed123 | 6:434d20e99e49 | 82 | |
dylanembed123 | 6:434d20e99e49 | 83 | |
dylanembed123 | 6:434d20e99e49 | 84 | uint8_t Camera::setMotionStatus(uint8_t x, uint8_t d1, uint8_t d2) { |
dylanembed123 | 6:434d20e99e49 | 85 | uint8_t args[] = {0x03, x, d1, d2}; |
dylanembed123 | 6:434d20e99e49 | 86 | |
dylanembed123 | 6:434d20e99e49 | 87 | return runCommand(VC0706_MOTION_CTRL, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 88 | } |
dylanembed123 | 6:434d20e99e49 | 89 | |
dylanembed123 | 6:434d20e99e49 | 90 | |
dylanembed123 | 6:434d20e99e49 | 91 | uint8_t Camera::getMotionStatus(uint8_t x) { |
dylanembed123 | 6:434d20e99e49 | 92 | uint8_t args[] = {0x01, x}; |
dylanembed123 | 6:434d20e99e49 | 93 | |
dylanembed123 | 6:434d20e99e49 | 94 | return runCommand(VC0706_MOTION_STATUS, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 95 | } |
dylanembed123 | 6:434d20e99e49 | 96 | |
dylanembed123 | 6:434d20e99e49 | 97 | |
dylanembed123 | 6:434d20e99e49 | 98 | boolean Camera::setMotionDetect(boolean flag) { |
dylanembed123 | 6:434d20e99e49 | 99 | if (! setMotionStatus(VC0706_MOTIONCONTROL, |
dylanembed123 | 6:434d20e99e49 | 100 | VC0706_UARTMOTION, VC0706_ACTIVATEMOTION)) |
dylanembed123 | 6:434d20e99e49 | 101 | return false; |
dylanembed123 | 6:434d20e99e49 | 102 | |
dylanembed123 | 6:434d20e99e49 | 103 | uint8_t args[] = {0x01, flag}; |
dylanembed123 | 6:434d20e99e49 | 104 | |
dylanembed123 | 6:434d20e99e49 | 105 | runCommand(VC0706_COMM_MOTION_CTRL, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 106 | } |
dylanembed123 | 6:434d20e99e49 | 107 | |
dylanembed123 | 6:434d20e99e49 | 108 | |
dylanembed123 | 6:434d20e99e49 | 109 | |
dylanembed123 | 6:434d20e99e49 | 110 | boolean Camera::getMotionDetect(void) { |
dylanembed123 | 6:434d20e99e49 | 111 | uint8_t args[] = {0x0}; |
dylanembed123 | 6:434d20e99e49 | 112 | |
dylanembed123 | 6:434d20e99e49 | 113 | if (! runCommand(VC0706_COMM_MOTION_STATUS, args, 1, 6)) |
dylanembed123 | 6:434d20e99e49 | 114 | return false; |
dylanembed123 | 6:434d20e99e49 | 115 | |
dylanembed123 | 6:434d20e99e49 | 116 | return camerabuff[5]; |
dylanembed123 | 6:434d20e99e49 | 117 | } |
dylanembed123 | 6:434d20e99e49 | 118 | */ |
dylanembed123 | 6:434d20e99e49 | 119 | uint8_t Camera::getImageSize() { |
dylanembed123 | 6:434d20e99e49 | 120 | uint8_t args[] = {0x4, 0x4, 0x1, 0x00, 0x19}; |
dylanembed123 | 6:434d20e99e49 | 121 | if (! runCommand(VC0706_READ_DATA, args, sizeof(args), 6)) |
dylanembed123 | 6:434d20e99e49 | 122 | return 0xFF; |
dylanembed123 | 6:434d20e99e49 | 123 | |
dylanembed123 | 6:434d20e99e49 | 124 | return camerabuff[5]; |
dylanembed123 | 6:434d20e99e49 | 125 | } |
dylanembed123 | 6:434d20e99e49 | 126 | |
dylanembed123 | 6:434d20e99e49 | 127 | bool Camera::setImageSize(uint8_t x) { |
dylanembed123 | 6:434d20e99e49 | 128 | uint8_t args[] = {0x05, 0x04, 0x01, 0x00, 0x19, x}; |
dylanembed123 | 6:434d20e99e49 | 129 | return runCommand(VC0706_WRITE_DATA, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 130 | } |
dylanembed123 | 6:434d20e99e49 | 131 | /* |
dylanembed123 | 6:434d20e99e49 | 132 | // downsize image control |
dylanembed123 | 6:434d20e99e49 | 133 | |
dylanembed123 | 6:434d20e99e49 | 134 | uint8_t Camera::getDownsize(void) { |
dylanembed123 | 6:434d20e99e49 | 135 | uint8_t args[] = {0x0}; |
dylanembed123 | 6:434d20e99e49 | 136 | if (! runCommand(VC0706_DOWNSIZE_STATUS, args, 1, 6)) |
dylanembed123 | 6:434d20e99e49 | 137 | return -1; |
dylanembed123 | 6:434d20e99e49 | 138 | |
dylanembed123 | 6:434d20e99e49 | 139 | return camerabuff[5]; |
dylanembed123 | 6:434d20e99e49 | 140 | } |
dylanembed123 | 6:434d20e99e49 | 141 | |
dylanembed123 | 6:434d20e99e49 | 142 | boolean Camera::setDownsize(uint8_t newsize) { |
dylanembed123 | 6:434d20e99e49 | 143 | uint8_t args[] = {0x01, newsize}; |
dylanembed123 | 6:434d20e99e49 | 144 | |
dylanembed123 | 6:434d20e99e49 | 145 | return runCommand(VC0706_DOWNSIZE_CTRL, args, 2, 5); |
dylanembed123 | 6:434d20e99e49 | 146 | } |
dylanembed123 | 6:434d20e99e49 | 147 | |
dylanembed123 | 6:434d20e99e49 | 148 | // other high level commands |
dylanembed123 | 6:434d20e99e49 | 149 | */ |
dylanembed123 | 6:434d20e99e49 | 150 | char * Camera::getVersion(void) { |
dylanembed123 | 6:434d20e99e49 | 151 | uint8_t args[] = {0x01}; |
dylanembed123 | 6:434d20e99e49 | 152 | |
dylanembed123 | 6:434d20e99e49 | 153 | sendCommand(VC0706_GEN_VERSION, args, 1); |
dylanembed123 | 6:434d20e99e49 | 154 | // get reply |
dylanembed123 | 6:434d20e99e49 | 155 | if (!readResponse(CAMERABUFFSIZ, 200)){ |
dylanembed123 | 6:434d20e99e49 | 156 | return 0; |
dylanembed123 | 6:434d20e99e49 | 157 | } |
dylanembed123 | 6:434d20e99e49 | 158 | camerabuff[bufferLen] = 0; // end it! |
dylanembed123 | 6:434d20e99e49 | 159 | return (char *)camerabuff; // return it! |
dylanembed123 | 6:434d20e99e49 | 160 | } |
dylanembed123 | 6:434d20e99e49 | 161 | /* |
dylanembed123 | 6:434d20e99e49 | 162 | |
dylanembed123 | 6:434d20e99e49 | 163 | // high level photo comamnds |
dylanembed123 | 6:434d20e99e49 | 164 | |
dylanembed123 | 6:434d20e99e49 | 165 | void Camera::OSD(uint8_t x, uint8_t y, char *str) { |
dylanembed123 | 6:434d20e99e49 | 166 | if (strlen(str) > 14) { str[13] = 0; } |
dylanembed123 | 6:434d20e99e49 | 167 | |
dylanembed123 | 6:434d20e99e49 | 168 | uint8_t args[17] = {strlen(str), strlen(str)-1, (y & 0xF) | ((x & 0x3) << 4)}; |
dylanembed123 | 6:434d20e99e49 | 169 | |
dylanembed123 | 6:434d20e99e49 | 170 | for (uint8_t i=0; i<strlen(str); i++) { |
dylanembed123 | 6:434d20e99e49 | 171 | char c = str[i]; |
dylanembed123 | 6:434d20e99e49 | 172 | if ((c >= '0') && (c <= '9')) { |
dylanembed123 | 6:434d20e99e49 | 173 | str[i] -= '0'; |
dylanembed123 | 6:434d20e99e49 | 174 | } else if ((c >= 'A') && (c <= 'Z')) { |
dylanembed123 | 6:434d20e99e49 | 175 | str[i] -= 'A'; |
dylanembed123 | 6:434d20e99e49 | 176 | str[i] += 10; |
dylanembed123 | 6:434d20e99e49 | 177 | } else if ((c >= 'a') && (c <= 'z')) { |
dylanembed123 | 6:434d20e99e49 | 178 | str[i] -= 'a'; |
dylanembed123 | 6:434d20e99e49 | 179 | str[i] += 36; |
dylanembed123 | 6:434d20e99e49 | 180 | } |
dylanembed123 | 6:434d20e99e49 | 181 | |
dylanembed123 | 6:434d20e99e49 | 182 | args[3+i] = str[i]; |
dylanembed123 | 6:434d20e99e49 | 183 | } |
dylanembed123 | 6:434d20e99e49 | 184 | |
dylanembed123 | 6:434d20e99e49 | 185 | runCommand(VC0706_OSD_ADD_CHAR, args, strlen(str)+3, 5); |
dylanembed123 | 6:434d20e99e49 | 186 | printBuff(); |
dylanembed123 | 6:434d20e99e49 | 187 | } |
dylanembed123 | 6:434d20e99e49 | 188 | |
dylanembed123 | 6:434d20e99e49 | 189 | boolean Camera::setCompression(uint8_t c) { |
dylanembed123 | 6:434d20e99e49 | 190 | uint8_t args[] = {0x5, 0x1, 0x1, 0x12, 0x04, c}; |
dylanembed123 | 6:434d20e99e49 | 191 | return runCommand(VC0706_WRITE_DATA, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 192 | } |
dylanembed123 | 6:434d20e99e49 | 193 | |
dylanembed123 | 6:434d20e99e49 | 194 | uint8_t Camera::getCompression(void) { |
dylanembed123 | 6:434d20e99e49 | 195 | uint8_t args[] = {0x4, 0x1, 0x1, 0x12, 0x04}; |
dylanembed123 | 6:434d20e99e49 | 196 | runCommand(VC0706_READ_DATA, args, sizeof(args), 6); |
dylanembed123 | 6:434d20e99e49 | 197 | printBuff(); |
dylanembed123 | 6:434d20e99e49 | 198 | return camerabuff[5]; |
dylanembed123 | 6:434d20e99e49 | 199 | } |
dylanembed123 | 6:434d20e99e49 | 200 | |
dylanembed123 | 6:434d20e99e49 | 201 | boolean Camera::setPTZ(uint16_t wz, uint16_t hz, uint16_t pan, uint16_t tilt) { |
dylanembed123 | 6:434d20e99e49 | 202 | uint8_t args[] = {0x08, wz >> 8, wz, |
dylanembed123 | 6:434d20e99e49 | 203 | hz >> 8, wz, |
dylanembed123 | 6:434d20e99e49 | 204 | pan>>8, pan, |
dylanembed123 | 6:434d20e99e49 | 205 | tilt>>8, tilt}; |
dylanembed123 | 6:434d20e99e49 | 206 | |
dylanembed123 | 6:434d20e99e49 | 207 | return (! runCommand(VC0706_SET_ZOOM, args, sizeof(args), 5)); |
dylanembed123 | 6:434d20e99e49 | 208 | } |
dylanembed123 | 6:434d20e99e49 | 209 | |
dylanembed123 | 6:434d20e99e49 | 210 | |
dylanembed123 | 6:434d20e99e49 | 211 | boolean Camera::getPTZ(uint16_t &w, uint16_t &h, uint16_t &wz, uint16_t &hz, uint16_t &pan, uint16_t &tilt) { |
dylanembed123 | 6:434d20e99e49 | 212 | uint8_t args[] = {0x0}; |
dylanembed123 | 6:434d20e99e49 | 213 | |
dylanembed123 | 6:434d20e99e49 | 214 | if (! runCommand(VC0706_GET_ZOOM, args, sizeof(args), 16)) |
dylanembed123 | 6:434d20e99e49 | 215 | return false; |
dylanembed123 | 6:434d20e99e49 | 216 | printBuff(); |
dylanembed123 | 6:434d20e99e49 | 217 | |
dylanembed123 | 6:434d20e99e49 | 218 | w = camerabuff[5]; |
dylanembed123 | 6:434d20e99e49 | 219 | w <<= 8; |
dylanembed123 | 6:434d20e99e49 | 220 | w |= camerabuff[6]; |
dylanembed123 | 6:434d20e99e49 | 221 | |
dylanembed123 | 6:434d20e99e49 | 222 | h = camerabuff[7]; |
dylanembed123 | 6:434d20e99e49 | 223 | h <<= 8; |
dylanembed123 | 6:434d20e99e49 | 224 | h |= camerabuff[8]; |
dylanembed123 | 6:434d20e99e49 | 225 | |
dylanembed123 | 6:434d20e99e49 | 226 | wz = camerabuff[9]; |
dylanembed123 | 6:434d20e99e49 | 227 | wz <<= 8; |
dylanembed123 | 6:434d20e99e49 | 228 | wz |= camerabuff[10]; |
dylanembed123 | 6:434d20e99e49 | 229 | |
dylanembed123 | 6:434d20e99e49 | 230 | hz = camerabuff[11]; |
dylanembed123 | 6:434d20e99e49 | 231 | hz <<= 8; |
dylanembed123 | 6:434d20e99e49 | 232 | hz |= camerabuff[12]; |
dylanembed123 | 6:434d20e99e49 | 233 | |
dylanembed123 | 6:434d20e99e49 | 234 | pan = camerabuff[13]; |
dylanembed123 | 6:434d20e99e49 | 235 | pan <<= 8; |
dylanembed123 | 6:434d20e99e49 | 236 | pan |= camerabuff[14]; |
dylanembed123 | 6:434d20e99e49 | 237 | |
dylanembed123 | 6:434d20e99e49 | 238 | tilt = camerabuff[15]; |
dylanembed123 | 6:434d20e99e49 | 239 | tilt <<= 8; |
dylanembed123 | 6:434d20e99e49 | 240 | tilt |= camerabuff[16]; |
dylanembed123 | 6:434d20e99e49 | 241 | |
dylanembed123 | 6:434d20e99e49 | 242 | return true; |
dylanembed123 | 6:434d20e99e49 | 243 | } |
dylanembed123 | 6:434d20e99e49 | 244 | |
dylanembed123 | 6:434d20e99e49 | 245 | */ |
dylanembed123 | 6:434d20e99e49 | 246 | bool Camera::takePicture() { |
dylanembed123 | 6:434d20e99e49 | 247 | frameptr = 0; |
dylanembed123 | 6:434d20e99e49 | 248 | return cameraFrameBuffCtrl(VC0706_STOPCURRENTFRAME); |
dylanembed123 | 6:434d20e99e49 | 249 | } |
dylanembed123 | 6:434d20e99e49 | 250 | /* |
dylanembed123 | 6:434d20e99e49 | 251 | boolean Camera::resumeVideo() { |
dylanembed123 | 6:434d20e99e49 | 252 | return cameraFrameBuffCtrl(VC0706_RESUMEFRAME); |
dylanembed123 | 6:434d20e99e49 | 253 | } |
dylanembed123 | 6:434d20e99e49 | 254 | |
dylanembed123 | 6:434d20e99e49 | 255 | boolean Camera::TVon() { |
dylanembed123 | 6:434d20e99e49 | 256 | uint8_t args[] = {0x1, 0x1}; |
dylanembed123 | 6:434d20e99e49 | 257 | return runCommand(VC0706_TVOUT_CTRL, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 258 | } |
dylanembed123 | 6:434d20e99e49 | 259 | boolean Camera::TVoff() { |
dylanembed123 | 6:434d20e99e49 | 260 | uint8_t args[] = {0x1, 0x0}; |
dylanembed123 | 6:434d20e99e49 | 261 | return runCommand(VC0706_TVOUT_CTRL, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 262 | } |
dylanembed123 | 6:434d20e99e49 | 263 | */ |
dylanembed123 | 6:434d20e99e49 | 264 | bool Camera::cameraFrameBuffCtrl(uint8_t command) { |
dylanembed123 | 6:434d20e99e49 | 265 | uint8_t args[] = {0x1, command}; |
dylanembed123 | 6:434d20e99e49 | 266 | return runCommand(VC0706_FBUF_CTRL, args, sizeof(args), 5); |
dylanembed123 | 6:434d20e99e49 | 267 | } |
dylanembed123 | 6:434d20e99e49 | 268 | |
dylanembed123 | 6:434d20e99e49 | 269 | uint32_t Camera::frameLength(void) { |
dylanembed123 | 6:434d20e99e49 | 270 | uint8_t args[] = {0x01, 0x00}; |
dylanembed123 | 6:434d20e99e49 | 271 | if (!runCommand(VC0706_GET_FBUF_LEN, args, sizeof(args), 9)) |
dylanembed123 | 6:434d20e99e49 | 272 | return 0; |
dylanembed123 | 6:434d20e99e49 | 273 | |
dylanembed123 | 6:434d20e99e49 | 274 | uint32_t len; |
dylanembed123 | 6:434d20e99e49 | 275 | len = camerabuff[5]; |
dylanembed123 | 6:434d20e99e49 | 276 | len <<= 8; |
dylanembed123 | 6:434d20e99e49 | 277 | len |= camerabuff[6]; |
dylanembed123 | 6:434d20e99e49 | 278 | len <<= 8; |
dylanembed123 | 6:434d20e99e49 | 279 | len |= camerabuff[7]; |
dylanembed123 | 6:434d20e99e49 | 280 | len <<= 8; |
dylanembed123 | 6:434d20e99e49 | 281 | len |= camerabuff[8]; |
dylanembed123 | 6:434d20e99e49 | 282 | |
dylanembed123 | 6:434d20e99e49 | 283 | return len; |
dylanembed123 | 6:434d20e99e49 | 284 | } |
dylanembed123 | 6:434d20e99e49 | 285 | /* |
dylanembed123 | 6:434d20e99e49 | 286 | |
dylanembed123 | 6:434d20e99e49 | 287 | uint8_t Camera::available(void) { |
dylanembed123 | 6:434d20e99e49 | 288 | return bufferLen; |
dylanembed123 | 6:434d20e99e49 | 289 | } |
dylanembed123 | 6:434d20e99e49 | 290 | |
dylanembed123 | 6:434d20e99e49 | 291 | */ |
dylanembed123 | 6:434d20e99e49 | 292 | uint8_t * Camera::readPicture(uint8_t n,uint8_t* outSize) { |
dylanembed123 | 6:434d20e99e49 | 293 | uint8_t args[] = {0x0C, 0x0, 0x0A, |
dylanembed123 | 6:434d20e99e49 | 294 | 0, 0, frameptr >> 8, frameptr & 0xFF, |
dylanembed123 | 6:434d20e99e49 | 295 | 0, 0, 0, n, |
dylanembed123 | 6:434d20e99e49 | 296 | CAMERADELAY >> 8, CAMERADELAY & 0xFF}; |
dylanembed123 | 6:434d20e99e49 | 297 | |
dylanembed123 | 6:434d20e99e49 | 298 | if (! runCommand(VC0706_READ_FBUF, args, sizeof(args), 5, false)) |
dylanembed123 | 6:434d20e99e49 | 299 | return 0; |
dylanembed123 | 6:434d20e99e49 | 300 | |
dylanembed123 | 6:434d20e99e49 | 301 | |
dylanembed123 | 6:434d20e99e49 | 302 | // read into the buffer PACKETLEN! |
dylanembed123 | 6:434d20e99e49 | 303 | int outputSize=readResponse(n+5, CAMERADELAY)-5; |
dylanembed123 | 6:434d20e99e49 | 304 | if (outputSize == 0) |
dylanembed123 | 6:434d20e99e49 | 305 | return 0; |
dylanembed123 | 6:434d20e99e49 | 306 | if(outSize!=NULL)*outSize=outputSize; |
dylanembed123 | 6:434d20e99e49 | 307 | |
dylanembed123 | 6:434d20e99e49 | 308 | frameptr += outputSize; |
dylanembed123 | 6:434d20e99e49 | 309 | |
dylanembed123 | 6:434d20e99e49 | 310 | return camerabuff; |
dylanembed123 | 6:434d20e99e49 | 311 | } |
dylanembed123 | 6:434d20e99e49 | 312 | |
dylanembed123 | 6:434d20e99e49 | 313 | |
dylanembed123 | 6:434d20e99e49 | 314 | // |
dylanembed123 | 6:434d20e99e49 | 315 | // Low level commands |
dylanembed123 | 6:434d20e99e49 | 316 | // |
dylanembed123 | 6:434d20e99e49 | 317 | |
dylanembed123 | 6:434d20e99e49 | 318 | bool Camera::runCommand(uint8_t cmd, uint8_t *args, uint8_t argn, uint8_t resplen, bool flushflag) { |
dylanembed123 | 6:434d20e99e49 | 319 | // flush out anything in the buffer? |
dylanembed123 | 6:434d20e99e49 | 320 | if (flushflag) { |
dylanembed123 | 6:434d20e99e49 | 321 | readResponse(100, 10); |
dylanembed123 | 6:434d20e99e49 | 322 | } |
dylanembed123 | 6:434d20e99e49 | 323 | |
dylanembed123 | 6:434d20e99e49 | 324 | sendCommand(cmd, args, argn); |
dylanembed123 | 6:434d20e99e49 | 325 | if (readResponse(resplen, 200) != resplen) |
dylanembed123 | 6:434d20e99e49 | 326 | return false; |
dylanembed123 | 6:434d20e99e49 | 327 | if (! verifyResponse(cmd)) |
dylanembed123 | 6:434d20e99e49 | 328 | return false; |
dylanembed123 | 6:434d20e99e49 | 329 | return true; |
dylanembed123 | 6:434d20e99e49 | 330 | } |
dylanembed123 | 6:434d20e99e49 | 331 | |
dylanembed123 | 6:434d20e99e49 | 332 | |
dylanembed123 | 6:434d20e99e49 | 333 | void Camera::sendCommand(uint8_t cmd, uint8_t args[], uint8_t argn) { |
dylanembed123 | 6:434d20e99e49 | 334 | getSerial().putc(0x56); |
dylanembed123 | 6:434d20e99e49 | 335 | getSerial().putc(serialNum); |
dylanembed123 | 6:434d20e99e49 | 336 | getSerial().putc(cmd); |
dylanembed123 | 6:434d20e99e49 | 337 | |
dylanembed123 | 6:434d20e99e49 | 338 | for (uint8_t i=0; i<argn; i++) { |
dylanembed123 | 6:434d20e99e49 | 339 | getSerial().putc(args[i]); |
dylanembed123 | 6:434d20e99e49 | 340 | } |
dylanembed123 | 6:434d20e99e49 | 341 | } |
dylanembed123 | 6:434d20e99e49 | 342 | |
dylanembed123 | 6:434d20e99e49 | 343 | uint8_t Camera::readResponse(uint8_t numbytes, uint8_t timeout) { |
dylanembed123 | 6:434d20e99e49 | 344 | uint8_t counter = 0; |
dylanembed123 | 6:434d20e99e49 | 345 | bufferLen = 0; |
dylanembed123 | 6:434d20e99e49 | 346 | |
dylanembed123 | 6:434d20e99e49 | 347 | while ((timeout != counter) && (bufferLen != numbytes)){ |
dylanembed123 | 6:434d20e99e49 | 348 | int avail = getSerial().readable(); |
dylanembed123 | 6:434d20e99e49 | 349 | if (avail <= 0) { |
dylanembed123 | 6:434d20e99e49 | 350 | wait_ms(1); |
dylanembed123 | 6:434d20e99e49 | 351 | counter++; |
dylanembed123 | 6:434d20e99e49 | 352 | continue; |
dylanembed123 | 6:434d20e99e49 | 353 | } |
dylanembed123 | 6:434d20e99e49 | 354 | counter = 0; |
dylanembed123 | 6:434d20e99e49 | 355 | // there's a byte! |
dylanembed123 | 6:434d20e99e49 | 356 | camerabuff[bufferLen++] = getSerial().getc(); |
dylanembed123 | 6:434d20e99e49 | 357 | } |
dylanembed123 | 6:434d20e99e49 | 358 | return bufferLen; |
dylanembed123 | 6:434d20e99e49 | 359 | } |
dylanembed123 | 6:434d20e99e49 | 360 | |
dylanembed123 | 6:434d20e99e49 | 361 | bool Camera::verifyResponse(uint8_t command) { |
dylanembed123 | 6:434d20e99e49 | 362 | if ((camerabuff[0] != 0x76) || |
dylanembed123 | 6:434d20e99e49 | 363 | (camerabuff[1] != serialNum) || |
dylanembed123 | 6:434d20e99e49 | 364 | (camerabuff[2] != command) || |
dylanembed123 | 6:434d20e99e49 | 365 | (camerabuff[3] != 0x0)) |
dylanembed123 | 6:434d20e99e49 | 366 | return false; |
dylanembed123 | 6:434d20e99e49 | 367 | return true; |
dylanembed123 | 6:434d20e99e49 | 368 | |
dylanembed123 | 6:434d20e99e49 | 369 | } |
dylanembed123 | 6:434d20e99e49 | 370 | |
dylanembed123 | 6:434d20e99e49 | 371 | void Camera::printBuff() { |
dylanembed123 | 6:434d20e99e49 | 372 | } |