test
Dependents: HEPTA_assembly template HEPTA_GS
CameraC1098.cpp@1:d16a4c3a272a, 2017-07-19 (annotated)
- Committer:
- hepta2ume
- Date:
- Wed Jul 19 09:07:30 2017 +0000
- Revision:
- 1:d16a4c3a272a
- Parent:
- 0:5a6468b4164d
hepta_cam
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunifu | 0:5a6468b4164d | 1 | #include "CameraC1098.h" |
hepta2ume | 1:d16a4c3a272a | 2 | static FILE *fp_jpeg; |
sunifu | 0:5a6468b4164d | 3 | #define WAITIDLE waitIdle |
sunifu | 0:5a6468b4164d | 4 | #define SENDFUNC sendBytes |
sunifu | 0:5a6468b4164d | 5 | #define RECVFUNC recvBytes |
sunifu | 0:5a6468b4164d | 6 | #define WAITFUNC waitRecv |
hepta2ume | 1:d16a4c3a272a | 7 | int num=0; |
sunifu | 0:5a6468b4164d | 8 | /** |
sunifu | 0:5a6468b4164d | 9 | * Constructor. |
sunifu | 0:5a6468b4164d | 10 | * |
sunifu | 0:5a6468b4164d | 11 | * @param tx A pin for transmit. |
sunifu | 0:5a6468b4164d | 12 | * @param rx A pin for receive. |
sunifu | 0:5a6468b4164d | 13 | * @param baud Baud rate. (Default is Baud14400.) |
sunifu | 0:5a6468b4164d | 14 | */ |
hepta2ume | 1:d16a4c3a272a | 15 | CameraC1098::CameraC1098(PinName tx, PinName rx, int baud) : serial(tx, rx) |
hepta2ume | 1:d16a4c3a272a | 16 | { |
sunifu | 0:5a6468b4164d | 17 | serial.baud(baud); |
sunifu | 0:5a6468b4164d | 18 | } |
sunifu | 0:5a6468b4164d | 19 | |
sunifu | 0:5a6468b4164d | 20 | /** |
sunifu | 0:5a6468b4164d | 21 | * Destructor. |
sunifu | 0:5a6468b4164d | 22 | */ |
hepta2ume | 1:d16a4c3a272a | 23 | CameraC1098::~CameraC1098() |
hepta2ume | 1:d16a4c3a272a | 24 | { |
sunifu | 0:5a6468b4164d | 25 | } |
sunifu | 0:5a6468b4164d | 26 | |
sunifu | 0:5a6468b4164d | 27 | /** |
sunifu | 0:5a6468b4164d | 28 | * Make a sync. for baud rate. |
sunifu | 0:5a6468b4164d | 29 | */ |
hepta2ume | 1:d16a4c3a272a | 30 | CameraC1098::ErrorNumber CameraC1098::sync() |
hepta2ume | 1:d16a4c3a272a | 31 | { |
sunifu | 0:5a6468b4164d | 32 | for (int i = 0; i < SYNCMAX; i++) { |
sunifu | 0:5a6468b4164d | 33 | if (NoError == sendSync()) { |
sunifu | 0:5a6468b4164d | 34 | if (NoError == recvAckOrNck()) { |
sunifu | 0:5a6468b4164d | 35 | if (NoError == recvSync()) { |
sunifu | 0:5a6468b4164d | 36 | if (NoError == sendAck(0x0D, 0x00)) { |
sunifu | 0:5a6468b4164d | 37 | /* |
sunifu | 0:5a6468b4164d | 38 | * After synchronization, the camera needs a little time for AEC and AGC to be stable. |
sunifu | 0:5a6468b4164d | 39 | * Users should wait for 1-2 seconds before capturing the first picture. |
sunifu | 0:5a6468b4164d | 40 | */ |
sunifu | 0:5a6468b4164d | 41 | wait(2.0); |
sunifu | 0:5a6468b4164d | 42 | return NoError; |
sunifu | 0:5a6468b4164d | 43 | } |
sunifu | 0:5a6468b4164d | 44 | } |
sunifu | 0:5a6468b4164d | 45 | } |
sunifu | 0:5a6468b4164d | 46 | } |
sunifu | 0:5a6468b4164d | 47 | wait_ms(50); |
sunifu | 0:5a6468b4164d | 48 | } |
sunifu | 0:5a6468b4164d | 49 | return UnexpectedReply; |
sunifu | 0:5a6468b4164d | 50 | } |
sunifu | 0:5a6468b4164d | 51 | |
sunifu | 0:5a6468b4164d | 52 | /** |
sunifu | 0:5a6468b4164d | 53 | * Initialize. |
sunifu | 0:5a6468b4164d | 54 | * |
sunifu | 0:5a6468b4164d | 55 | * @param baud Camera Interface Speed. |
sunifu | 0:5a6468b4164d | 56 | * @param jr JPEG resolution. |
sunifu | 0:5a6468b4164d | 57 | */ |
hepta2ume | 1:d16a4c3a272a | 58 | CameraC1098::ErrorNumber CameraC1098::init(Baud baud,JpegResolution jr) |
hepta2ume | 1:d16a4c3a272a | 59 | { |
sunifu | 0:5a6468b4164d | 60 | int i ; |
sunifu | 0:5a6468b4164d | 61 | ErrorNumber en; |
sunifu | 0:5a6468b4164d | 62 | WAITIDLE(); |
sunifu | 0:5a6468b4164d | 63 | setmbedBaud((Baud)(0x07)) ; |
hepta2ume | 1:d16a4c3a272a | 64 | |
sunifu | 0:5a6468b4164d | 65 | for ( i = 1 ; i < 7 ; i++ ) { |
sunifu | 0:5a6468b4164d | 66 | if ( NoError == sendSync() ) { |
hepta2ume | 1:d16a4c3a272a | 67 | if ( NoError == recvAckOrNck() ) { |
sunifu | 0:5a6468b4164d | 68 | if ( NoError == recvSync() ) { |
sunifu | 0:5a6468b4164d | 69 | if ( NoError == sendAck(0x0D, 0x00) ) { |
sunifu | 0:5a6468b4164d | 70 | en = sendInitial(baud,jr); |
sunifu | 0:5a6468b4164d | 71 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 72 | return en; |
hepta2ume | 1:d16a4c3a272a | 73 | } |
sunifu | 0:5a6468b4164d | 74 | en = recvAckOrNck(); |
sunifu | 0:5a6468b4164d | 75 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 76 | return en; |
hepta2ume | 1:d16a4c3a272a | 77 | } |
sunifu | 0:5a6468b4164d | 78 | wait_ms(50) ; |
hepta2ume | 1:d16a4c3a272a | 79 | setmbedBaud(baud); |
hepta2ume | 1:d16a4c3a272a | 80 | //wait_ms(50) ; |
sunifu | 0:5a6468b4164d | 81 | static bool alreadySetupPackageSize = false; |
sunifu | 0:5a6468b4164d | 82 | if (!alreadySetupPackageSize) { |
sunifu | 0:5a6468b4164d | 83 | en = sendSetPackageSize(packageSize); |
sunifu | 0:5a6468b4164d | 84 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 85 | return en; |
sunifu | 0:5a6468b4164d | 86 | } |
sunifu | 0:5a6468b4164d | 87 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 88 | en = recvAckOrNck(); |
sunifu | 0:5a6468b4164d | 89 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 90 | return en; |
sunifu | 0:5a6468b4164d | 91 | } |
sunifu | 0:5a6468b4164d | 92 | alreadySetupPackageSize = true; |
sunifu | 0:5a6468b4164d | 93 | } |
hepta2ume | 1:d16a4c3a272a | 94 | |
sunifu | 0:5a6468b4164d | 95 | wait(2.0); |
hepta2ume | 1:d16a4c3a272a | 96 | return (ErrorNumber)NoError; |
hepta2ume | 1:d16a4c3a272a | 97 | /* |
hepta2ume | 1:d16a4c3a272a | 98 | * After synchronization, the camera needs a little time for AEC and AGC to be stable. |
hepta2ume | 1:d16a4c3a272a | 99 | * Users should wait for 1-2 seconds before capturing the first picture. |
hepta2ume | 1:d16a4c3a272a | 100 | */ |
sunifu | 0:5a6468b4164d | 101 | } |
hepta2ume | 1:d16a4c3a272a | 102 | } |
hepta2ume | 1:d16a4c3a272a | 103 | } else { |
hepta2ume | 1:d16a4c3a272a | 104 | setmbedBaud((Baud)(i+1)) ; |
sunifu | 0:5a6468b4164d | 105 | } |
sunifu | 0:5a6468b4164d | 106 | } |
hepta2ume | 1:d16a4c3a272a | 107 | wait_ms(50); |
hepta2ume | 1:d16a4c3a272a | 108 | } |
sunifu | 0:5a6468b4164d | 109 | return UnexpectedReply; |
sunifu | 0:5a6468b4164d | 110 | } |
sunifu | 0:5a6468b4164d | 111 | |
sunifu | 0:5a6468b4164d | 112 | |
sunifu | 0:5a6468b4164d | 113 | /** |
sunifu | 0:5a6468b4164d | 114 | * Get JPEG snapshot picture. |
sunifu | 0:5a6468b4164d | 115 | * |
sunifu | 0:5a6468b4164d | 116 | * @param func A pointer to a callback function. |
sunifu | 0:5a6468b4164d | 117 | * You can block this function until saving the image datas. |
sunifu | 0:5a6468b4164d | 118 | * @return Status of the error. |
sunifu | 0:5a6468b4164d | 119 | */ |
hepta2ume | 1:d16a4c3a272a | 120 | CameraC1098::ErrorNumber CameraC1098::getJpegSnapshotPicture() |
hepta2ume | 1:d16a4c3a272a | 121 | { |
hepta2ume | 1:d16a4c3a272a | 122 | WAITIDLE(); |
hepta2ume | 1:d16a4c3a272a | 123 | ErrorNumber en; |
hepta2ume | 1:d16a4c3a272a | 124 | |
hepta2ume | 1:d16a4c3a272a | 125 | |
hepta2ume | 1:d16a4c3a272a | 126 | en = sendSnapshot(); |
hepta2ume | 1:d16a4c3a272a | 127 | if (NoError != en) { |
hepta2ume | 1:d16a4c3a272a | 128 | return en; |
hepta2ume | 1:d16a4c3a272a | 129 | } |
hepta2ume | 1:d16a4c3a272a | 130 | WAITFUNC(); |
hepta2ume | 1:d16a4c3a272a | 131 | en = recvAckOrNck(); |
hepta2ume | 1:d16a4c3a272a | 132 | if (NoError != en) { |
hepta2ume | 1:d16a4c3a272a | 133 | return en; |
hepta2ume | 1:d16a4c3a272a | 134 | } |
hepta2ume | 1:d16a4c3a272a | 135 | |
hepta2ume | 1:d16a4c3a272a | 136 | en = sendGetPicture(); |
hepta2ume | 1:d16a4c3a272a | 137 | if (NoError != en) { |
hepta2ume | 1:d16a4c3a272a | 138 | return en; |
hepta2ume | 1:d16a4c3a272a | 139 | } |
hepta2ume | 1:d16a4c3a272a | 140 | WAITFUNC(); |
hepta2ume | 1:d16a4c3a272a | 141 | en = recvAckOrNck(); |
hepta2ume | 1:d16a4c3a272a | 142 | if (NoError != en) { |
hepta2ume | 1:d16a4c3a272a | 143 | return en; |
hepta2ume | 1:d16a4c3a272a | 144 | } |
hepta2ume | 1:d16a4c3a272a | 145 | |
hepta2ume | 1:d16a4c3a272a | 146 | /* |
hepta2ume | 1:d16a4c3a272a | 147 | * Data : snapshot picture |
hepta2ume | 1:d16a4c3a272a | 148 | */ |
hepta2ume | 1:d16a4c3a272a | 149 | uint32_t length = 0; |
hepta2ume | 1:d16a4c3a272a | 150 | WAITFUNC(); |
hepta2ume | 1:d16a4c3a272a | 151 | en = recvData(&length); |
hepta2ume | 1:d16a4c3a272a | 152 | if (NoError != en) { |
hepta2ume | 1:d16a4c3a272a | 153 | return en; |
hepta2ume | 1:d16a4c3a272a | 154 | } |
hepta2ume | 1:d16a4c3a272a | 155 | en = sendAck(0x00, 0); |
hepta2ume | 1:d16a4c3a272a | 156 | if (NoError != en) { |
hepta2ume | 1:d16a4c3a272a | 157 | return en; |
hepta2ume | 1:d16a4c3a272a | 158 | } |
hepta2ume | 1:d16a4c3a272a | 159 | |
hepta2ume | 1:d16a4c3a272a | 160 | char databuf[packageSize - 6]; |
hepta2ume | 1:d16a4c3a272a | 161 | uint16_t pkg_total = length / (packageSize - 6); |
hepta2ume | 1:d16a4c3a272a | 162 | for (int i = 0; i <= (int)pkg_total; i++) { |
hepta2ume | 1:d16a4c3a272a | 163 | uint16_t checksum = 0; |
hepta2ume | 1:d16a4c3a272a | 164 | // ID. |
hepta2ume | 1:d16a4c3a272a | 165 | char idbuf[2]; |
hepta2ume | 1:d16a4c3a272a | 166 | WAITFUNC(); |
hepta2ume | 1:d16a4c3a272a | 167 | if (!RECVFUNC(idbuf, sizeof(idbuf))) { |
hepta2ume | 1:d16a4c3a272a | 168 | return (ErrorNumber)UnexpectedReply; |
hepta2ume | 1:d16a4c3a272a | 169 | } |
hepta2ume | 1:d16a4c3a272a | 170 | checksum += idbuf[0]; |
hepta2ume | 1:d16a4c3a272a | 171 | checksum += idbuf[1]; |
hepta2ume | 1:d16a4c3a272a | 172 | uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0); |
hepta2ume | 1:d16a4c3a272a | 173 | if (id != i) { |
hepta2ume | 1:d16a4c3a272a | 174 | return (ErrorNumber)UnexpectedReply; |
hepta2ume | 1:d16a4c3a272a | 175 | } |
hepta2ume | 1:d16a4c3a272a | 176 | |
hepta2ume | 1:d16a4c3a272a | 177 | // Size of the data. |
hepta2ume | 1:d16a4c3a272a | 178 | char dsbuf[2]; |
hepta2ume | 1:d16a4c3a272a | 179 | WAITFUNC(); |
hepta2ume | 1:d16a4c3a272a | 180 | if (!RECVFUNC(dsbuf, sizeof(dsbuf))) { |
hepta2ume | 1:d16a4c3a272a | 181 | return (ErrorNumber)UnexpectedReply; |
hepta2ume | 1:d16a4c3a272a | 182 | } |
hepta2ume | 1:d16a4c3a272a | 183 | |
hepta2ume | 1:d16a4c3a272a | 184 | // Received the data. |
hepta2ume | 1:d16a4c3a272a | 185 | checksum += dsbuf[0]; |
hepta2ume | 1:d16a4c3a272a | 186 | checksum += dsbuf[1]; |
hepta2ume | 1:d16a4c3a272a | 187 | uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0); |
hepta2ume | 1:d16a4c3a272a | 188 | WAITFUNC(); |
hepta2ume | 1:d16a4c3a272a | 189 | if (!RECVFUNC(&databuf[0], ds)) { |
hepta2ume | 1:d16a4c3a272a | 190 | return (ErrorNumber)UnexpectedReply; |
hepta2ume | 1:d16a4c3a272a | 191 | } |
hepta2ume | 1:d16a4c3a272a | 192 | for (int j = 0; j < ds; j++) { |
hepta2ume | 1:d16a4c3a272a | 193 | checksum += databuf[j]; |
hepta2ume | 1:d16a4c3a272a | 194 | } |
hepta2ume | 1:d16a4c3a272a | 195 | |
hepta2ume | 1:d16a4c3a272a | 196 | // Verify code. |
hepta2ume | 1:d16a4c3a272a | 197 | char vcbuf[2]; |
hepta2ume | 1:d16a4c3a272a | 198 | WAITFUNC(); |
hepta2ume | 1:d16a4c3a272a | 199 | if (!RECVFUNC(vcbuf, sizeof(vcbuf))) { |
hepta2ume | 1:d16a4c3a272a | 200 | return (ErrorNumber)UnexpectedReply; |
hepta2ume | 1:d16a4c3a272a | 201 | } |
hepta2ume | 1:d16a4c3a272a | 202 | uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0); |
hepta2ume | 1:d16a4c3a272a | 203 | if (vc != (checksum & 0xff)) { |
hepta2ume | 1:d16a4c3a272a | 204 | return (ErrorNumber)UnexpectedReply; |
hepta2ume | 1:d16a4c3a272a | 205 | } |
hepta2ume | 1:d16a4c3a272a | 206 | |
hepta2ume | 1:d16a4c3a272a | 207 | /* |
hepta2ume | 1:d16a4c3a272a | 208 | * Call a call back function. |
hepta2ume | 1:d16a4c3a272a | 209 | * You can block this function while working. |
hepta2ume | 1:d16a4c3a272a | 210 | */ |
hepta2ume | 1:d16a4c3a272a | 211 | size_t siz = ds; |
hepta2ume | 1:d16a4c3a272a | 212 | for (int ii = 0; ii < (int)siz; ii++) { |
hepta2ume | 1:d16a4c3a272a | 213 | fprintf(fp_jpeg, "%c", databuf[ii]); |
hepta2ume | 1:d16a4c3a272a | 214 | } |
hepta2ume | 1:d16a4c3a272a | 215 | /* |
hepta2ume | 1:d16a4c3a272a | 216 | * We should wait for camera working before reply a ACK. |
hepta2ume | 1:d16a4c3a272a | 217 | */ |
hepta2ume | 1:d16a4c3a272a | 218 | wait_ms(100); |
hepta2ume | 1:d16a4c3a272a | 219 | en = sendAck(0x00, 1 + i); |
hepta2ume | 1:d16a4c3a272a | 220 | if (NoError != en) { |
hepta2ume | 1:d16a4c3a272a | 221 | return en; |
hepta2ume | 1:d16a4c3a272a | 222 | } |
hepta2ume | 1:d16a4c3a272a | 223 | } |
hepta2ume | 1:d16a4c3a272a | 224 | |
hepta2ume | 1:d16a4c3a272a | 225 | return (ErrorNumber)NoError; |
hepta2ume | 1:d16a4c3a272a | 226 | } |
hepta2ume | 1:d16a4c3a272a | 227 | |
hepta2ume | 1:d16a4c3a272a | 228 | CameraC1098::ErrorNumber CameraC1098::getJpegSnapshotPicture_data() |
hepta2ume | 1:d16a4c3a272a | 229 | { |
sunifu | 0:5a6468b4164d | 230 | WAITIDLE(); |
sunifu | 0:5a6468b4164d | 231 | ErrorNumber en; |
sunifu | 0:5a6468b4164d | 232 | |
sunifu | 0:5a6468b4164d | 233 | |
sunifu | 0:5a6468b4164d | 234 | en = sendSnapshot(); |
sunifu | 0:5a6468b4164d | 235 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 236 | return en; |
sunifu | 0:5a6468b4164d | 237 | } |
sunifu | 0:5a6468b4164d | 238 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 239 | en = recvAckOrNck(); |
sunifu | 0:5a6468b4164d | 240 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 241 | return en; |
sunifu | 0:5a6468b4164d | 242 | } |
sunifu | 0:5a6468b4164d | 243 | |
sunifu | 0:5a6468b4164d | 244 | en = sendGetPicture(); |
sunifu | 0:5a6468b4164d | 245 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 246 | return en; |
sunifu | 0:5a6468b4164d | 247 | } |
sunifu | 0:5a6468b4164d | 248 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 249 | en = recvAckOrNck(); |
sunifu | 0:5a6468b4164d | 250 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 251 | return en; |
sunifu | 0:5a6468b4164d | 252 | } |
sunifu | 0:5a6468b4164d | 253 | |
sunifu | 0:5a6468b4164d | 254 | /* |
sunifu | 0:5a6468b4164d | 255 | * Data : snapshot picture |
sunifu | 0:5a6468b4164d | 256 | */ |
sunifu | 0:5a6468b4164d | 257 | uint32_t length = 0; |
sunifu | 0:5a6468b4164d | 258 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 259 | en = recvData(&length); |
sunifu | 0:5a6468b4164d | 260 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 261 | return en; |
sunifu | 0:5a6468b4164d | 262 | } |
sunifu | 0:5a6468b4164d | 263 | en = sendAck(0x00, 0); |
sunifu | 0:5a6468b4164d | 264 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 265 | return en; |
sunifu | 0:5a6468b4164d | 266 | } |
sunifu | 0:5a6468b4164d | 267 | |
sunifu | 0:5a6468b4164d | 268 | char databuf[packageSize - 6]; |
sunifu | 0:5a6468b4164d | 269 | uint16_t pkg_total = length / (packageSize - 6); |
sunifu | 0:5a6468b4164d | 270 | for (int i = 0; i <= (int)pkg_total; i++) { |
sunifu | 0:5a6468b4164d | 271 | uint16_t checksum = 0; |
sunifu | 0:5a6468b4164d | 272 | // ID. |
sunifu | 0:5a6468b4164d | 273 | char idbuf[2]; |
sunifu | 0:5a6468b4164d | 274 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 275 | if (!RECVFUNC(idbuf, sizeof(idbuf))) { |
sunifu | 0:5a6468b4164d | 276 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 277 | } |
sunifu | 0:5a6468b4164d | 278 | checksum += idbuf[0]; |
sunifu | 0:5a6468b4164d | 279 | checksum += idbuf[1]; |
sunifu | 0:5a6468b4164d | 280 | uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0); |
sunifu | 0:5a6468b4164d | 281 | if (id != i) { |
sunifu | 0:5a6468b4164d | 282 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 283 | } |
sunifu | 0:5a6468b4164d | 284 | |
sunifu | 0:5a6468b4164d | 285 | // Size of the data. |
sunifu | 0:5a6468b4164d | 286 | char dsbuf[2]; |
sunifu | 0:5a6468b4164d | 287 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 288 | if (!RECVFUNC(dsbuf, sizeof(dsbuf))) { |
sunifu | 0:5a6468b4164d | 289 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 290 | } |
sunifu | 0:5a6468b4164d | 291 | |
sunifu | 0:5a6468b4164d | 292 | // Received the data. |
sunifu | 0:5a6468b4164d | 293 | checksum += dsbuf[0]; |
sunifu | 0:5a6468b4164d | 294 | checksum += dsbuf[1]; |
sunifu | 0:5a6468b4164d | 295 | uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0); |
sunifu | 0:5a6468b4164d | 296 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 297 | if (!RECVFUNC(&databuf[0], ds)) { |
sunifu | 0:5a6468b4164d | 298 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 299 | } |
sunifu | 0:5a6468b4164d | 300 | for (int j = 0; j < ds; j++) { |
sunifu | 0:5a6468b4164d | 301 | checksum += databuf[j]; |
sunifu | 0:5a6468b4164d | 302 | } |
sunifu | 0:5a6468b4164d | 303 | |
sunifu | 0:5a6468b4164d | 304 | // Verify code. |
sunifu | 0:5a6468b4164d | 305 | char vcbuf[2]; |
sunifu | 0:5a6468b4164d | 306 | WAITFUNC(); |
sunifu | 0:5a6468b4164d | 307 | if (!RECVFUNC(vcbuf, sizeof(vcbuf))) { |
sunifu | 0:5a6468b4164d | 308 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 309 | } |
sunifu | 0:5a6468b4164d | 310 | uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0); |
sunifu | 0:5a6468b4164d | 311 | if (vc != (checksum & 0xff)) { |
sunifu | 0:5a6468b4164d | 312 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 313 | } |
sunifu | 0:5a6468b4164d | 314 | |
sunifu | 0:5a6468b4164d | 315 | /* |
sunifu | 0:5a6468b4164d | 316 | * Call a call back function. |
sunifu | 0:5a6468b4164d | 317 | * You can block this function while working. |
sunifu | 0:5a6468b4164d | 318 | */ |
hepta2ume | 1:d16a4c3a272a | 319 | size_t siz = ds; |
hepta2ume | 1:d16a4c3a272a | 320 | for (int ii = 0; ii < (int)siz; ii++) { |
hepta2ume | 1:d16a4c3a272a | 321 | fprintf(fp_jpeg, "%02X ", databuf[ii]); |
hepta2ume | 1:d16a4c3a272a | 322 | if(++num%16==0) fprintf(fp_jpeg,"\r\n"); |
hepta2ume | 1:d16a4c3a272a | 323 | } |
sunifu | 0:5a6468b4164d | 324 | /* |
sunifu | 0:5a6468b4164d | 325 | * We should wait for camera working before reply a ACK. |
sunifu | 0:5a6468b4164d | 326 | */ |
sunifu | 0:5a6468b4164d | 327 | wait_ms(100); |
sunifu | 0:5a6468b4164d | 328 | en = sendAck(0x00, 1 + i); |
sunifu | 0:5a6468b4164d | 329 | if (NoError != en) { |
sunifu | 0:5a6468b4164d | 330 | return en; |
sunifu | 0:5a6468b4164d | 331 | } |
sunifu | 0:5a6468b4164d | 332 | } |
sunifu | 0:5a6468b4164d | 333 | |
sunifu | 0:5a6468b4164d | 334 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 335 | } |
sunifu | 0:5a6468b4164d | 336 | |
hepta2ume | 1:d16a4c3a272a | 337 | CameraC1098::ErrorNumber CameraC1098::sendInitial(Baud baud, JpegResolution jr) |
hepta2ume | 1:d16a4c3a272a | 338 | { |
hepta2ume | 1:d16a4c3a272a | 339 | char send[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 340 | |
sunifu | 0:5a6468b4164d | 341 | send[0] = 0xAA; |
sunifu | 0:5a6468b4164d | 342 | send[1] = 0x01; |
sunifu | 0:5a6468b4164d | 343 | send[2] = (char)baud; |
sunifu | 0:5a6468b4164d | 344 | send[3] = 0x07; |
sunifu | 0:5a6468b4164d | 345 | send[4] = 0x00; |
sunifu | 0:5a6468b4164d | 346 | send[5] = (char)jr; |
sunifu | 0:5a6468b4164d | 347 | |
sunifu | 0:5a6468b4164d | 348 | if (!SENDFUNC(send, sizeof(send))) { |
sunifu | 0:5a6468b4164d | 349 | return (ErrorNumber)SendRegisterTimeout; |
sunifu | 0:5a6468b4164d | 350 | } |
sunifu | 0:5a6468b4164d | 351 | |
sunifu | 0:5a6468b4164d | 352 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 353 | } |
sunifu | 0:5a6468b4164d | 354 | |
hepta2ume | 1:d16a4c3a272a | 355 | CameraC1098::ErrorNumber CameraC1098::sendGetPicture(void) |
hepta2ume | 1:d16a4c3a272a | 356 | { |
sunifu | 0:5a6468b4164d | 357 | char send[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 358 | |
sunifu | 0:5a6468b4164d | 359 | send[0] = 0xAA; |
sunifu | 0:5a6468b4164d | 360 | send[1] = 0x04; |
sunifu | 0:5a6468b4164d | 361 | send[2] = 0x01; |
sunifu | 0:5a6468b4164d | 362 | send[3] = 0x00; |
sunifu | 0:5a6468b4164d | 363 | send[4] = 0x00; |
sunifu | 0:5a6468b4164d | 364 | send[5] = 0x00; |
sunifu | 0:5a6468b4164d | 365 | |
sunifu | 0:5a6468b4164d | 366 | if (!SENDFUNC(send, sizeof(send))) { |
sunifu | 0:5a6468b4164d | 367 | return (ErrorNumber)SendRegisterTimeout; |
sunifu | 0:5a6468b4164d | 368 | } |
sunifu | 0:5a6468b4164d | 369 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 370 | } |
sunifu | 0:5a6468b4164d | 371 | |
hepta2ume | 1:d16a4c3a272a | 372 | CameraC1098::ErrorNumber CameraC1098::sendSnapshot(void) |
hepta2ume | 1:d16a4c3a272a | 373 | { |
sunifu | 0:5a6468b4164d | 374 | char send[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 375 | send[0] = 0xAA; |
sunifu | 0:5a6468b4164d | 376 | send[1] = 0x05; |
sunifu | 0:5a6468b4164d | 377 | send[2] = 0x00; |
sunifu | 0:5a6468b4164d | 378 | send[3] = 0x00; |
sunifu | 0:5a6468b4164d | 379 | send[4] = 0x00; |
sunifu | 0:5a6468b4164d | 380 | send[5] = 0x00; |
sunifu | 0:5a6468b4164d | 381 | |
sunifu | 0:5a6468b4164d | 382 | if (!SENDFUNC(send, sizeof(send))) { |
sunifu | 0:5a6468b4164d | 383 | return (ErrorNumber)SendRegisterTimeout; |
sunifu | 0:5a6468b4164d | 384 | } |
sunifu | 0:5a6468b4164d | 385 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 386 | } |
sunifu | 0:5a6468b4164d | 387 | |
hepta2ume | 1:d16a4c3a272a | 388 | CameraC1098::ErrorNumber CameraC1098::sendSetPackageSize(uint16_t packageSize) |
hepta2ume | 1:d16a4c3a272a | 389 | { |
sunifu | 0:5a6468b4164d | 390 | char send[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 391 | send[0] = 0xAA; |
sunifu | 0:5a6468b4164d | 392 | send[1] = 0x06; |
sunifu | 0:5a6468b4164d | 393 | send[2] = 0x08; |
sunifu | 0:5a6468b4164d | 394 | send[3] = (packageSize >> 0) & 0xff; |
sunifu | 0:5a6468b4164d | 395 | send[4] = (packageSize >> 8) & 0xff; |
sunifu | 0:5a6468b4164d | 396 | send[5] = 0x00; |
sunifu | 0:5a6468b4164d | 397 | |
sunifu | 0:5a6468b4164d | 398 | if (!SENDFUNC(send, sizeof(send))) { |
sunifu | 0:5a6468b4164d | 399 | return (ErrorNumber)SendRegisterTimeout; |
sunifu | 0:5a6468b4164d | 400 | } |
sunifu | 0:5a6468b4164d | 401 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 402 | } |
sunifu | 0:5a6468b4164d | 403 | |
hepta2ume | 1:d16a4c3a272a | 404 | void CameraC1098::setmbedBaud(Baud baud) |
hepta2ume | 1:d16a4c3a272a | 405 | { |
hepta2ume | 1:d16a4c3a272a | 406 | switch((int)baud) { |
hepta2ume | 1:d16a4c3a272a | 407 | case 0x02: |
hepta2ume | 1:d16a4c3a272a | 408 | serial._baud(460800); |
hepta2ume | 1:d16a4c3a272a | 409 | break; |
hepta2ume | 1:d16a4c3a272a | 410 | case 0x03: |
hepta2ume | 1:d16a4c3a272a | 411 | serial._baud(230400); |
hepta2ume | 1:d16a4c3a272a | 412 | break; |
hepta2ume | 1:d16a4c3a272a | 413 | case 0x04: |
hepta2ume | 1:d16a4c3a272a | 414 | serial._baud(115200); |
hepta2ume | 1:d16a4c3a272a | 415 | break; |
hepta2ume | 1:d16a4c3a272a | 416 | case 0x05: |
hepta2ume | 1:d16a4c3a272a | 417 | serial._baud(57600); |
hepta2ume | 1:d16a4c3a272a | 418 | break; |
hepta2ume | 1:d16a4c3a272a | 419 | case 0x06: |
hepta2ume | 1:d16a4c3a272a | 420 | serial._baud((int)28800); |
hepta2ume | 1:d16a4c3a272a | 421 | break; |
hepta2ume | 1:d16a4c3a272a | 422 | case 0x07: |
hepta2ume | 1:d16a4c3a272a | 423 | serial._baud(14400); |
hepta2ume | 1:d16a4c3a272a | 424 | break; |
hepta2ume | 1:d16a4c3a272a | 425 | default: |
hepta2ume | 1:d16a4c3a272a | 426 | serial._baud(14400); |
sunifu | 0:5a6468b4164d | 427 | } |
sunifu | 0:5a6468b4164d | 428 | } |
sunifu | 0:5a6468b4164d | 429 | |
sunifu | 0:5a6468b4164d | 430 | |
hepta2ume | 1:d16a4c3a272a | 431 | CameraC1098::ErrorNumber CameraC1098::sendReset(ResetType specialReset) |
hepta2ume | 1:d16a4c3a272a | 432 | { |
sunifu | 0:5a6468b4164d | 433 | char send[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 434 | send[0] = 0xAA; |
sunifu | 0:5a6468b4164d | 435 | send[1] = 0x08; |
sunifu | 0:5a6468b4164d | 436 | send[2] = 0x00; |
sunifu | 0:5a6468b4164d | 437 | send[3] = 0x00; |
sunifu | 0:5a6468b4164d | 438 | send[4] = 0x00; |
sunifu | 0:5a6468b4164d | 439 | send[5] = specialReset; |
sunifu | 0:5a6468b4164d | 440 | /* |
sunifu | 0:5a6468b4164d | 441 | * Special reset : If the parameter is 0xFF, the command is a special Reset command and the firmware responds to it immediately. |
sunifu | 0:5a6468b4164d | 442 | */ |
sunifu | 0:5a6468b4164d | 443 | |
sunifu | 0:5a6468b4164d | 444 | if (!SENDFUNC(send, sizeof(send))) { |
sunifu | 0:5a6468b4164d | 445 | return (ErrorNumber)SendRegisterTimeout; |
sunifu | 0:5a6468b4164d | 446 | } |
sunifu | 0:5a6468b4164d | 447 | |
sunifu | 0:5a6468b4164d | 448 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 449 | } |
sunifu | 0:5a6468b4164d | 450 | |
sunifu | 0:5a6468b4164d | 451 | |
hepta2ume | 1:d16a4c3a272a | 452 | CameraC1098::ErrorNumber CameraC1098::recvData(uint32_t *length) |
hepta2ume | 1:d16a4c3a272a | 453 | { |
sunifu | 0:5a6468b4164d | 454 | char recv[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 455 | if (!RECVFUNC(recv, sizeof(recv))) { |
sunifu | 0:5a6468b4164d | 456 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 457 | } |
sunifu | 0:5a6468b4164d | 458 | if ((0xAA != recv[0]) || (0x0A != recv[1])) { |
sunifu | 0:5a6468b4164d | 459 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 460 | } |
sunifu | 0:5a6468b4164d | 461 | recv[2] = (char)0x01; |
sunifu | 0:5a6468b4164d | 462 | *length = (recv[5] << 16) | (recv[4] << 8) | (recv[3] << 0); |
sunifu | 0:5a6468b4164d | 463 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 464 | } |
sunifu | 0:5a6468b4164d | 465 | |
hepta2ume | 1:d16a4c3a272a | 466 | CameraC1098::ErrorNumber CameraC1098::sendSync() |
hepta2ume | 1:d16a4c3a272a | 467 | { |
sunifu | 0:5a6468b4164d | 468 | char send[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 469 | send[0] = 0xAA; |
sunifu | 0:5a6468b4164d | 470 | send[1] = 0x0D; |
sunifu | 0:5a6468b4164d | 471 | send[2] = 0x00; |
sunifu | 0:5a6468b4164d | 472 | send[3] = 0x00; |
sunifu | 0:5a6468b4164d | 473 | send[4] = 0x00; |
sunifu | 0:5a6468b4164d | 474 | send[5] = 0x00; |
hepta2ume | 1:d16a4c3a272a | 475 | |
hepta2ume | 1:d16a4c3a272a | 476 | |
sunifu | 0:5a6468b4164d | 477 | if (!SENDFUNC(send, sizeof(send))) { |
sunifu | 0:5a6468b4164d | 478 | return (ErrorNumber)SendRegisterTimeout; |
sunifu | 0:5a6468b4164d | 479 | } |
sunifu | 0:5a6468b4164d | 480 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 481 | } |
sunifu | 0:5a6468b4164d | 482 | |
hepta2ume | 1:d16a4c3a272a | 483 | CameraC1098::ErrorNumber CameraC1098::recvSync() |
hepta2ume | 1:d16a4c3a272a | 484 | { |
sunifu | 0:5a6468b4164d | 485 | char recv[COMMAND_LENGTH]; |
hepta2ume | 1:d16a4c3a272a | 486 | |
sunifu | 0:5a6468b4164d | 487 | if (!RECVFUNC(recv, sizeof(recv))) { |
sunifu | 0:5a6468b4164d | 488 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 489 | } |
sunifu | 0:5a6468b4164d | 490 | if ((0xAA != recv[0]) || (0x0D != recv[1])) { |
sunifu | 0:5a6468b4164d | 491 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 492 | } |
sunifu | 0:5a6468b4164d | 493 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 494 | } |
sunifu | 0:5a6468b4164d | 495 | |
sunifu | 0:5a6468b4164d | 496 | /** |
sunifu | 0:5a6468b4164d | 497 | * Send ACK. |
sunifu | 0:5a6468b4164d | 498 | * |
sunifu | 0:5a6468b4164d | 499 | * @param commandId The command with that ID is acknowledged by this command. |
sunifu | 0:5a6468b4164d | 500 | * @param packageId For acknowledging Data command, these two bytes represent the requested package ID. While for acknowledging other commands, these two bytes are set to 00h. |
sunifu | 0:5a6468b4164d | 501 | */ |
hepta2ume | 1:d16a4c3a272a | 502 | CameraC1098::ErrorNumber CameraC1098::sendAck(uint8_t commandId, uint16_t packageId) |
hepta2ume | 1:d16a4c3a272a | 503 | { |
sunifu | 0:5a6468b4164d | 504 | char send[COMMAND_LENGTH]; |
sunifu | 0:5a6468b4164d | 505 | |
sunifu | 0:5a6468b4164d | 506 | send[0] = 0xAA; |
sunifu | 0:5a6468b4164d | 507 | send[1] = 0x0E; |
sunifu | 0:5a6468b4164d | 508 | send[2] = commandId; |
sunifu | 0:5a6468b4164d | 509 | send[3] = 0x00; // ACK counter is not used. |
sunifu | 0:5a6468b4164d | 510 | send[4] = (packageId >> 0) & 0xff; |
sunifu | 0:5a6468b4164d | 511 | send[5] = (packageId >> 8) & 0xff; |
sunifu | 0:5a6468b4164d | 512 | if (!SENDFUNC(send, sizeof(send))) { |
sunifu | 0:5a6468b4164d | 513 | return (ErrorNumber)SendRegisterTimeout; |
sunifu | 0:5a6468b4164d | 514 | } |
sunifu | 0:5a6468b4164d | 515 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 516 | } |
sunifu | 0:5a6468b4164d | 517 | |
sunifu | 0:5a6468b4164d | 518 | /** |
sunifu | 0:5a6468b4164d | 519 | * Receive ACK or NCK. |
sunifu | 0:5a6468b4164d | 520 | * |
sunifu | 0:5a6468b4164d | 521 | * @return Error number. |
sunifu | 0:5a6468b4164d | 522 | */ |
hepta2ume | 1:d16a4c3a272a | 523 | CameraC1098::ErrorNumber CameraC1098::recvAckOrNck() |
hepta2ume | 1:d16a4c3a272a | 524 | { |
sunifu | 0:5a6468b4164d | 525 | char recv[COMMAND_LENGTH]; |
hepta2ume | 1:d16a4c3a272a | 526 | |
sunifu | 0:5a6468b4164d | 527 | if (!RECVFUNC(recv, sizeof(recv))) { |
sunifu | 0:5a6468b4164d | 528 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 529 | } |
sunifu | 0:5a6468b4164d | 530 | if ((0xAA == recv[0]) && (0x0E == recv[1])) { |
sunifu | 0:5a6468b4164d | 531 | return (ErrorNumber)NoError; |
sunifu | 0:5a6468b4164d | 532 | } |
sunifu | 0:5a6468b4164d | 533 | if ((0xAA == recv[0]) && (0x0F == recv[1]) && (0x00 == recv[2])) { |
sunifu | 0:5a6468b4164d | 534 | return (ErrorNumber)NoError; |
hepta2ume | 1:d16a4c3a272a | 535 | } |
sunifu | 0:5a6468b4164d | 536 | if ((0xAA == recv[0]) && (0x0F == recv[1])) { |
sunifu | 0:5a6468b4164d | 537 | return (ErrorNumber)recv[4]; |
sunifu | 0:5a6468b4164d | 538 | } |
sunifu | 0:5a6468b4164d | 539 | return (ErrorNumber)UnexpectedReply; |
sunifu | 0:5a6468b4164d | 540 | } |
sunifu | 0:5a6468b4164d | 541 | |
sunifu | 0:5a6468b4164d | 542 | /** |
sunifu | 0:5a6468b4164d | 543 | * Send bytes to camera module. |
sunifu | 0:5a6468b4164d | 544 | * |
sunifu | 0:5a6468b4164d | 545 | * @param buf Pointer to the data buffer. |
sunifu | 0:5a6468b4164d | 546 | * @param len Length of the data buffer. |
sunifu | 0:5a6468b4164d | 547 | * |
sunifu | 0:5a6468b4164d | 548 | * @return True if the data sended. |
sunifu | 0:5a6468b4164d | 549 | */ |
hepta2ume | 1:d16a4c3a272a | 550 | bool CameraC1098::sendBytes(char *buf, size_t len, int timeout_us) |
hepta2ume | 1:d16a4c3a272a | 551 | { |
sunifu | 0:5a6468b4164d | 552 | for (uint32_t i = 0; i < (uint32_t)len; i++) { |
sunifu | 0:5a6468b4164d | 553 | int cnt = 0; |
sunifu | 0:5a6468b4164d | 554 | while (!serial.writeable()) { |
sunifu | 0:5a6468b4164d | 555 | wait_us(1); |
sunifu | 0:5a6468b4164d | 556 | cnt++; |
sunifu | 0:5a6468b4164d | 557 | if (timeout_us < cnt) { |
sunifu | 0:5a6468b4164d | 558 | return false; |
sunifu | 0:5a6468b4164d | 559 | } |
sunifu | 0:5a6468b4164d | 560 | } |
sunifu | 0:5a6468b4164d | 561 | serial.putc(buf[i]); |
sunifu | 0:5a6468b4164d | 562 | } |
sunifu | 0:5a6468b4164d | 563 | return true; |
sunifu | 0:5a6468b4164d | 564 | } |
sunifu | 0:5a6468b4164d | 565 | |
sunifu | 0:5a6468b4164d | 566 | /** |
sunifu | 0:5a6468b4164d | 567 | * Receive bytes from camera module. |
sunifu | 0:5a6468b4164d | 568 | * |
sunifu | 0:5a6468b4164d | 569 | * @param buf Pointer to the data buffer. |
sunifu | 0:5a6468b4164d | 570 | * @param len Length of the data buffer. |
sunifu | 0:5a6468b4164d | 571 | * |
sunifu | 0:5a6468b4164d | 572 | * @return True if the data received. |
sunifu | 0:5a6468b4164d | 573 | */ |
hepta2ume | 1:d16a4c3a272a | 574 | bool CameraC1098::recvBytes(char *buf, size_t len, int timeout_us) |
hepta2ume | 1:d16a4c3a272a | 575 | { |
sunifu | 0:5a6468b4164d | 576 | for (uint32_t i = 0; i < (uint32_t)len; i++) { |
sunifu | 0:5a6468b4164d | 577 | int cnt = 0; |
sunifu | 0:5a6468b4164d | 578 | while (!serial.readable()) { |
sunifu | 0:5a6468b4164d | 579 | wait_us(1); |
sunifu | 0:5a6468b4164d | 580 | cnt++; |
sunifu | 0:5a6468b4164d | 581 | if (timeout_us < cnt) { |
sunifu | 0:5a6468b4164d | 582 | return false; |
sunifu | 0:5a6468b4164d | 583 | } |
sunifu | 0:5a6468b4164d | 584 | } |
sunifu | 0:5a6468b4164d | 585 | buf[i] = serial.getc(); |
sunifu | 0:5a6468b4164d | 586 | } |
sunifu | 0:5a6468b4164d | 587 | return true; |
sunifu | 0:5a6468b4164d | 588 | } |
sunifu | 0:5a6468b4164d | 589 | |
sunifu | 0:5a6468b4164d | 590 | /** |
sunifu | 0:5a6468b4164d | 591 | * Wait received. |
sunifu | 0:5a6468b4164d | 592 | * |
sunifu | 0:5a6468b4164d | 593 | * @return True if the data received. |
sunifu | 0:5a6468b4164d | 594 | */ |
hepta2ume | 1:d16a4c3a272a | 595 | bool CameraC1098::waitRecv() |
hepta2ume | 1:d16a4c3a272a | 596 | { |
sunifu | 0:5a6468b4164d | 597 | while (!serial.readable()) { |
sunifu | 0:5a6468b4164d | 598 | } |
sunifu | 0:5a6468b4164d | 599 | return true; |
sunifu | 0:5a6468b4164d | 600 | } |
sunifu | 0:5a6468b4164d | 601 | |
sunifu | 0:5a6468b4164d | 602 | /** |
sunifu | 0:5a6468b4164d | 603 | * Wait idle state. |
sunifu | 0:5a6468b4164d | 604 | */ |
hepta2ume | 1:d16a4c3a272a | 605 | bool CameraC1098::waitIdle() |
hepta2ume | 1:d16a4c3a272a | 606 | { |
sunifu | 0:5a6468b4164d | 607 | while (serial.readable()) { |
sunifu | 0:5a6468b4164d | 608 | serial.getc(); |
sunifu | 0:5a6468b4164d | 609 | } |
sunifu | 0:5a6468b4164d | 610 | return true; |
sunifu | 0:5a6468b4164d | 611 | } |
hepta2ume | 1:d16a4c3a272a | 612 | |
hepta2ume | 1:d16a4c3a272a | 613 | void CameraC1098::Sync(void) |
hepta2ume | 1:d16a4c3a272a | 614 | { |
hepta2ume | 1:d16a4c3a272a | 615 | CameraC1098::ErrorNumber err = CameraC1098::NoError; |
hepta2ume | 1:d16a4c3a272a | 616 | setmbedBaud(CameraC1098::Baud14400); |
hepta2ume | 1:d16a4c3a272a | 617 | err = sync(); |
hepta2ume | 1:d16a4c3a272a | 618 | setmbedBaud(CameraC1098::Baud115200); |
hepta2ume | 1:d16a4c3a272a | 619 | if (CameraC1098::NoError == err) { |
hepta2ume | 1:d16a4c3a272a | 620 | printf("[ OK ] : CameraC1098::sync\r\n"); |
hepta2ume | 1:d16a4c3a272a | 621 | } else { |
hepta2ume | 1:d16a4c3a272a | 622 | printf("[FAIL] : CameraC1098::sync (Error=%02X)\r\n", (int)err); |
hepta2ume | 1:d16a4c3a272a | 623 | } |
hepta2ume | 1:d16a4c3a272a | 624 | } |
hepta2ume | 1:d16a4c3a272a | 625 | |
hepta2ume | 1:d16a4c3a272a | 626 | void CameraC1098::test_jpeg_snapshot_picture(void) |
hepta2ume | 1:d16a4c3a272a | 627 | { |
hepta2ume | 1:d16a4c3a272a | 628 | CameraC1098::ErrorNumber err = CameraC1098::NoError; |
hepta2ume | 1:d16a4c3a272a | 629 | for (int i = 0; i < CAPTURE_FRAMES; i++) { |
hepta2ume | 1:d16a4c3a272a | 630 | char fname[64]; |
hepta2ume | 1:d16a4c3a272a | 631 | snprintf(fname, sizeof(fname), "/fs/test%d.jpg", i); |
hepta2ume | 1:d16a4c3a272a | 632 | fp_jpeg = fopen(fname, "w"); |
hepta2ume | 1:d16a4c3a272a | 633 | |
hepta2ume | 1:d16a4c3a272a | 634 | err = getJpegSnapshotPicture(); |
hepta2ume | 1:d16a4c3a272a | 635 | |
hepta2ume | 1:d16a4c3a272a | 636 | if (CameraC1098::NoError == err) { |
hepta2ume | 1:d16a4c3a272a | 637 | printf("[ OK ] : CameraC1098::getJpegSnapshotPicture\r\n"); |
hepta2ume | 1:d16a4c3a272a | 638 | } else { |
hepta2ume | 1:d16a4c3a272a | 639 | printf("[FAIL] : CameraC1098::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err); |
hepta2ume | 1:d16a4c3a272a | 640 | } |
hepta2ume | 1:d16a4c3a272a | 641 | fclose(fp_jpeg); |
hepta2ume | 1:d16a4c3a272a | 642 | } |
hepta2ume | 1:d16a4c3a272a | 643 | } |
hepta2ume | 1:d16a4c3a272a | 644 | |
hepta2ume | 1:d16a4c3a272a | 645 | void CameraC1098::test_jpeg_snapshot_data(void) |
hepta2ume | 1:d16a4c3a272a | 646 | { |
hepta2ume | 1:d16a4c3a272a | 647 | CameraC1098::ErrorNumber err = CameraC1098::NoError; |
hepta2ume | 1:d16a4c3a272a | 648 | for (int i = 0; i < CAPTURE_FRAMES; i++) { |
hepta2ume | 1:d16a4c3a272a | 649 | char fname[64]; |
hepta2ume | 1:d16a4c3a272a | 650 | snprintf(fname, sizeof(fname), "/fs/test%d.txt", i); |
hepta2ume | 1:d16a4c3a272a | 651 | fp_jpeg = fopen(fname, "w"); |
hepta2ume | 1:d16a4c3a272a | 652 | |
hepta2ume | 1:d16a4c3a272a | 653 | err = getJpegSnapshotPicture_data(); |
hepta2ume | 1:d16a4c3a272a | 654 | |
hepta2ume | 1:d16a4c3a272a | 655 | if (CameraC1098::NoError == err) { |
hepta2ume | 1:d16a4c3a272a | 656 | printf("[ OK ] : CameraC1098::getJpegSnapshotPicture\r\n"); |
hepta2ume | 1:d16a4c3a272a | 657 | } else { |
hepta2ume | 1:d16a4c3a272a | 658 | printf("[FAIL] : CameraC1098::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err); |
hepta2ume | 1:d16a4c3a272a | 659 | } |
hepta2ume | 1:d16a4c3a272a | 660 | fclose(fp_jpeg); |
hepta2ume | 1:d16a4c3a272a | 661 | } |
hepta2ume | 1:d16a4c3a272a | 662 | } |
hepta2ume | 1:d16a4c3a272a | 663 | |
hepta2ume | 1:d16a4c3a272a | 664 | void CameraC1098::initialize(Baud baud,JpegResolution jr) |
hepta2ume | 1:d16a4c3a272a | 665 | { |
hepta2ume | 1:d16a4c3a272a | 666 | CameraC1098::ErrorNumber err = CameraC1098::NoError;//ErrorNumber define |
hepta2ume | 1:d16a4c3a272a | 667 | err = init(baud, jr);// |
hepta2ume | 1:d16a4c3a272a | 668 | |
hepta2ume | 1:d16a4c3a272a | 669 | if (CameraC1098::NoError == err) { |
hepta2ume | 1:d16a4c3a272a | 670 | printf("[ OK ] : CameraC1098::init\r\n"); |
hepta2ume | 1:d16a4c3a272a | 671 | } else { |
hepta2ume | 1:d16a4c3a272a | 672 | printf("[FAIL] : CameraC1098::init (Error=%02X)\r\n", (int)err); |
hepta2ume | 1:d16a4c3a272a | 673 | } |
hepta2ume | 1:d16a4c3a272a | 674 | |
hepta2ume | 1:d16a4c3a272a | 675 | } |