エレキジャック Web版 マイコン・カーを製作してみよう<21> マイコンカー制御プログラムです。http://www.eleki-jack.com/arm/2012/10/21.html  このプログラムは次回の記事でアップされるパソコン用プログラムを使ってマイコンカーを制御するプログラムです。マイコンカーとパソコンの通信はXbeeを使っています。

Dependencies:   TextLCD mbed

Committer:
sunifu
Date:
Thu Oct 11 14:11:54 2012 +0000
Revision:
7:1a0580ace499
ver1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sunifu 7:1a0580ace499 1 /**
sunifu 7:1a0580ace499 2 * C1098-SS device driver class (Version 1.0)
sunifu 7:1a0580ace499 3 * Reference documents: C1098-SS User Manual v1.0 2012.4.1
sunifu 7:1a0580ace499 4 *
sunifu 7:1a0580ace499 5 * CameraC328Library
sunifu 7:1a0580ace499 6 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
sunifu 7:1a0580ace499 7 * http://shinta.main.jp/
sunifu 7:1a0580ace499 8 *
sunifu 7:1a0580ace499 9 * CameraC1098-SS Library
sunifu 7:1a0580ace499 10 * Copyright (C) 2012 Tadao Iida
sunifu 7:1a0580ace499 11 */
sunifu 7:1a0580ace499 12
sunifu 7:1a0580ace499 13 #include "CameraC1098.h"
sunifu 7:1a0580ace499 14
sunifu 7:1a0580ace499 15 #define WAITIDLE waitIdle
sunifu 7:1a0580ace499 16 #define SENDFUNC sendBytes
sunifu 7:1a0580ace499 17 #define RECVFUNC recvBytes
sunifu 7:1a0580ace499 18 #define WAITFUNC waitRecv
sunifu 7:1a0580ace499 19
sunifu 7:1a0580ace499 20 /**
sunifu 7:1a0580ace499 21 * Constructor.
sunifu 7:1a0580ace499 22 *
sunifu 7:1a0580ace499 23 * @param tx A pin for transmit.
sunifu 7:1a0580ace499 24 * @param rx A pin for receive.
sunifu 7:1a0580ace499 25 * @param baud Baud rate. (Default is Baud14400.)
sunifu 7:1a0580ace499 26 */
sunifu 7:1a0580ace499 27 CameraC1098::CameraC1098(PinName tx, PinName rx, int baud) : serial(tx, rx) {
sunifu 7:1a0580ace499 28 serial.baud(baud);
sunifu 7:1a0580ace499 29 }
sunifu 7:1a0580ace499 30
sunifu 7:1a0580ace499 31 /**
sunifu 7:1a0580ace499 32 * Destructor.
sunifu 7:1a0580ace499 33 */
sunifu 7:1a0580ace499 34 CameraC1098::~CameraC1098() {
sunifu 7:1a0580ace499 35 }
sunifu 7:1a0580ace499 36
sunifu 7:1a0580ace499 37 /**
sunifu 7:1a0580ace499 38 * Make a sync. for baud rate.
sunifu 7:1a0580ace499 39 */
sunifu 7:1a0580ace499 40 CameraC1098::ErrorNumber CameraC1098::sync() {
sunifu 7:1a0580ace499 41 for (int i = 0; i < SYNCMAX; i++) {
sunifu 7:1a0580ace499 42 if (NoError == sendSync()) {
sunifu 7:1a0580ace499 43 if (NoError == recvAckOrNck()) {
sunifu 7:1a0580ace499 44 if (NoError == recvSync()) {
sunifu 7:1a0580ace499 45 if (NoError == sendAck(0x0D, 0x00)) {
sunifu 7:1a0580ace499 46 /*
sunifu 7:1a0580ace499 47 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
sunifu 7:1a0580ace499 48 * Users should wait for 1-2 seconds before capturing the first picture.
sunifu 7:1a0580ace499 49 */
sunifu 7:1a0580ace499 50 wait(2.0);
sunifu 7:1a0580ace499 51 return NoError;
sunifu 7:1a0580ace499 52 }
sunifu 7:1a0580ace499 53 }
sunifu 7:1a0580ace499 54 }
sunifu 7:1a0580ace499 55 }
sunifu 7:1a0580ace499 56 wait_ms(50);
sunifu 7:1a0580ace499 57 }
sunifu 7:1a0580ace499 58 return UnexpectedReply;
sunifu 7:1a0580ace499 59 }
sunifu 7:1a0580ace499 60
sunifu 7:1a0580ace499 61 /**
sunifu 7:1a0580ace499 62 * Initialize.
sunifu 7:1a0580ace499 63 *
sunifu 7:1a0580ace499 64 * @param baud Camera Interface Speed.
sunifu 7:1a0580ace499 65 * @param jr JPEG resolution.
sunifu 7:1a0580ace499 66 */
sunifu 7:1a0580ace499 67 CameraC1098::ErrorNumber CameraC1098::init(Baud baud,JpegResolution jr) {
sunifu 7:1a0580ace499 68 int i ;
sunifu 7:1a0580ace499 69 ErrorNumber en;
sunifu 7:1a0580ace499 70 WAITIDLE();
sunifu 7:1a0580ace499 71 setmbedBaud((Baud)(0x07)) ;
sunifu 7:1a0580ace499 72
sunifu 7:1a0580ace499 73 for ( i = 1 ; i < 7 ; i++ ) {
sunifu 7:1a0580ace499 74 if ( NoError == sendSync() ) {
sunifu 7:1a0580ace499 75 if ( NoError == recvAckOrNck() ){
sunifu 7:1a0580ace499 76 if ( NoError == recvSync() ) {
sunifu 7:1a0580ace499 77 if ( NoError == sendAck(0x0D, 0x00) ) {
sunifu 7:1a0580ace499 78 en = sendInitial(baud,jr);
sunifu 7:1a0580ace499 79 if (NoError != en) {
sunifu 7:1a0580ace499 80 return en;
sunifu 7:1a0580ace499 81 }
sunifu 7:1a0580ace499 82 en = recvAckOrNck();
sunifu 7:1a0580ace499 83 if (NoError != en) {
sunifu 7:1a0580ace499 84 return en;
sunifu 7:1a0580ace499 85 }
sunifu 7:1a0580ace499 86 wait_ms(50) ;
sunifu 7:1a0580ace499 87 setmbedBaud(baud);
sunifu 7:1a0580ace499 88 //wait_ms(50) ;
sunifu 7:1a0580ace499 89 static bool alreadySetupPackageSize = false;
sunifu 7:1a0580ace499 90 if (!alreadySetupPackageSize) {
sunifu 7:1a0580ace499 91 en = sendSetPackageSize(packageSize);
sunifu 7:1a0580ace499 92 if (NoError != en) {
sunifu 7:1a0580ace499 93 return en;
sunifu 7:1a0580ace499 94 }
sunifu 7:1a0580ace499 95 WAITFUNC();
sunifu 7:1a0580ace499 96 en = recvAckOrNck();
sunifu 7:1a0580ace499 97 if (NoError != en) {
sunifu 7:1a0580ace499 98 return en;
sunifu 7:1a0580ace499 99 }
sunifu 7:1a0580ace499 100 alreadySetupPackageSize = true;
sunifu 7:1a0580ace499 101 }
sunifu 7:1a0580ace499 102
sunifu 7:1a0580ace499 103 wait(2.0);
sunifu 7:1a0580ace499 104 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 105 /*
sunifu 7:1a0580ace499 106 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
sunifu 7:1a0580ace499 107 * Users should wait for 1-2 seconds before capturing the first picture.
sunifu 7:1a0580ace499 108 */
sunifu 7:1a0580ace499 109 }
sunifu 7:1a0580ace499 110 }
sunifu 7:1a0580ace499 111 }else{
sunifu 7:1a0580ace499 112 setmbedBaud((Baud)(i+1)) ;
sunifu 7:1a0580ace499 113 }
sunifu 7:1a0580ace499 114 }
sunifu 7:1a0580ace499 115 wait_ms(50);
sunifu 7:1a0580ace499 116 }
sunifu 7:1a0580ace499 117 return UnexpectedReply;
sunifu 7:1a0580ace499 118 }
sunifu 7:1a0580ace499 119
sunifu 7:1a0580ace499 120
sunifu 7:1a0580ace499 121 /**
sunifu 7:1a0580ace499 122 * Get JPEG snapshot picture.
sunifu 7:1a0580ace499 123 *
sunifu 7:1a0580ace499 124 * @param func A pointer to a callback function.
sunifu 7:1a0580ace499 125 * You can block this function until saving the image datas.
sunifu 7:1a0580ace499 126 * @return Status of the error.
sunifu 7:1a0580ace499 127 */
sunifu 7:1a0580ace499 128 CameraC1098::ErrorNumber CameraC1098::getJpegSnapshotPicture(void(*func)(char *buf, size_t siz)) {
sunifu 7:1a0580ace499 129 WAITIDLE();
sunifu 7:1a0580ace499 130 ErrorNumber en;
sunifu 7:1a0580ace499 131
sunifu 7:1a0580ace499 132
sunifu 7:1a0580ace499 133 en = sendSnapshot();
sunifu 7:1a0580ace499 134 if (NoError != en) {
sunifu 7:1a0580ace499 135 return en;
sunifu 7:1a0580ace499 136 }
sunifu 7:1a0580ace499 137 WAITFUNC();
sunifu 7:1a0580ace499 138 en = recvAckOrNck();
sunifu 7:1a0580ace499 139 if (NoError != en) {
sunifu 7:1a0580ace499 140 return en;
sunifu 7:1a0580ace499 141 }
sunifu 7:1a0580ace499 142
sunifu 7:1a0580ace499 143 en = sendGetPicture();
sunifu 7:1a0580ace499 144 if (NoError != en) {
sunifu 7:1a0580ace499 145 return en;
sunifu 7:1a0580ace499 146 }
sunifu 7:1a0580ace499 147 WAITFUNC();
sunifu 7:1a0580ace499 148 en = recvAckOrNck();
sunifu 7:1a0580ace499 149 if (NoError != en) {
sunifu 7:1a0580ace499 150 return en;
sunifu 7:1a0580ace499 151 }
sunifu 7:1a0580ace499 152
sunifu 7:1a0580ace499 153 /*
sunifu 7:1a0580ace499 154 * Data : snapshot picture
sunifu 7:1a0580ace499 155 */
sunifu 7:1a0580ace499 156 uint32_t length = 0;
sunifu 7:1a0580ace499 157 WAITFUNC();
sunifu 7:1a0580ace499 158 en = recvData(&length);
sunifu 7:1a0580ace499 159 if (NoError != en) {
sunifu 7:1a0580ace499 160 return en;
sunifu 7:1a0580ace499 161 }
sunifu 7:1a0580ace499 162 en = sendAck(0x00, 0);
sunifu 7:1a0580ace499 163 if (NoError != en) {
sunifu 7:1a0580ace499 164 return en;
sunifu 7:1a0580ace499 165 }
sunifu 7:1a0580ace499 166
sunifu 7:1a0580ace499 167 char databuf[packageSize - 6];
sunifu 7:1a0580ace499 168 uint16_t pkg_total = length / (packageSize - 6);
sunifu 7:1a0580ace499 169 for (int i = 0; i <= (int)pkg_total; i++) {
sunifu 7:1a0580ace499 170 uint16_t checksum = 0;
sunifu 7:1a0580ace499 171 // ID.
sunifu 7:1a0580ace499 172 char idbuf[2];
sunifu 7:1a0580ace499 173 WAITFUNC();
sunifu 7:1a0580ace499 174 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
sunifu 7:1a0580ace499 175 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 176 }
sunifu 7:1a0580ace499 177 checksum += idbuf[0];
sunifu 7:1a0580ace499 178 checksum += idbuf[1];
sunifu 7:1a0580ace499 179 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
sunifu 7:1a0580ace499 180 if (id != i) {
sunifu 7:1a0580ace499 181 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 182 }
sunifu 7:1a0580ace499 183
sunifu 7:1a0580ace499 184 // Size of the data.
sunifu 7:1a0580ace499 185 char dsbuf[2];
sunifu 7:1a0580ace499 186 WAITFUNC();
sunifu 7:1a0580ace499 187 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
sunifu 7:1a0580ace499 188 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 189 }
sunifu 7:1a0580ace499 190
sunifu 7:1a0580ace499 191 // Received the data.
sunifu 7:1a0580ace499 192 checksum += dsbuf[0];
sunifu 7:1a0580ace499 193 checksum += dsbuf[1];
sunifu 7:1a0580ace499 194 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
sunifu 7:1a0580ace499 195 WAITFUNC();
sunifu 7:1a0580ace499 196 if (!RECVFUNC(&databuf[0], ds)) {
sunifu 7:1a0580ace499 197 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 198 }
sunifu 7:1a0580ace499 199 for (int j = 0; j < ds; j++) {
sunifu 7:1a0580ace499 200 checksum += databuf[j];
sunifu 7:1a0580ace499 201 }
sunifu 7:1a0580ace499 202
sunifu 7:1a0580ace499 203 // Verify code.
sunifu 7:1a0580ace499 204 char vcbuf[2];
sunifu 7:1a0580ace499 205 WAITFUNC();
sunifu 7:1a0580ace499 206 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
sunifu 7:1a0580ace499 207 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 208 }
sunifu 7:1a0580ace499 209 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
sunifu 7:1a0580ace499 210 if (vc != (checksum & 0xff)) {
sunifu 7:1a0580ace499 211 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 212 }
sunifu 7:1a0580ace499 213
sunifu 7:1a0580ace499 214 /*
sunifu 7:1a0580ace499 215 * Call a call back function.
sunifu 7:1a0580ace499 216 * You can block this function while working.
sunifu 7:1a0580ace499 217 */
sunifu 7:1a0580ace499 218 func(databuf, ds);
sunifu 7:1a0580ace499 219
sunifu 7:1a0580ace499 220 /*
sunifu 7:1a0580ace499 221 * We should wait for camera working before reply a ACK.
sunifu 7:1a0580ace499 222 */
sunifu 7:1a0580ace499 223 wait_ms(100);
sunifu 7:1a0580ace499 224 en = sendAck(0x00, 1 + i);
sunifu 7:1a0580ace499 225 if (NoError != en) {
sunifu 7:1a0580ace499 226 return en;
sunifu 7:1a0580ace499 227 }
sunifu 7:1a0580ace499 228 }
sunifu 7:1a0580ace499 229
sunifu 7:1a0580ace499 230 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 231 }
sunifu 7:1a0580ace499 232
sunifu 7:1a0580ace499 233
sunifu 7:1a0580ace499 234
sunifu 7:1a0580ace499 235 CameraC1098::ErrorNumber CameraC1098::sendInitial(Baud baud, JpegResolution jr) {
sunifu 7:1a0580ace499 236 char send[COMMAND_LENGTH];
sunifu 7:1a0580ace499 237
sunifu 7:1a0580ace499 238 send[0] = 0xAA;
sunifu 7:1a0580ace499 239 send[1] = 0x01;
sunifu 7:1a0580ace499 240 send[2] = (char)baud;
sunifu 7:1a0580ace499 241 send[3] = 0x07;
sunifu 7:1a0580ace499 242 send[4] = 0x00;
sunifu 7:1a0580ace499 243 send[5] = (char)jr;
sunifu 7:1a0580ace499 244
sunifu 7:1a0580ace499 245 if (!SENDFUNC(send, sizeof(send))) {
sunifu 7:1a0580ace499 246 return (ErrorNumber)SendRegisterTimeout;
sunifu 7:1a0580ace499 247 }
sunifu 7:1a0580ace499 248
sunifu 7:1a0580ace499 249 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 250 }
sunifu 7:1a0580ace499 251
sunifu 7:1a0580ace499 252 CameraC1098::ErrorNumber CameraC1098::sendGetPicture(void) {
sunifu 7:1a0580ace499 253 char send[COMMAND_LENGTH];
sunifu 7:1a0580ace499 254
sunifu 7:1a0580ace499 255 send[0] = 0xAA;
sunifu 7:1a0580ace499 256 send[1] = 0x04;
sunifu 7:1a0580ace499 257 send[2] = 0x01;
sunifu 7:1a0580ace499 258 send[3] = 0x00;
sunifu 7:1a0580ace499 259 send[4] = 0x00;
sunifu 7:1a0580ace499 260 send[5] = 0x00;
sunifu 7:1a0580ace499 261
sunifu 7:1a0580ace499 262 if (!SENDFUNC(send, sizeof(send))) {
sunifu 7:1a0580ace499 263 return (ErrorNumber)SendRegisterTimeout;
sunifu 7:1a0580ace499 264 }
sunifu 7:1a0580ace499 265 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 266 }
sunifu 7:1a0580ace499 267
sunifu 7:1a0580ace499 268 CameraC1098::ErrorNumber CameraC1098::sendSnapshot(void) {
sunifu 7:1a0580ace499 269 char send[COMMAND_LENGTH];
sunifu 7:1a0580ace499 270 send[0] = 0xAA;
sunifu 7:1a0580ace499 271 send[1] = 0x05;
sunifu 7:1a0580ace499 272 send[2] = 0x00;
sunifu 7:1a0580ace499 273 send[3] = 0x00;
sunifu 7:1a0580ace499 274 send[4] = 0x00;
sunifu 7:1a0580ace499 275 send[5] = 0x00;
sunifu 7:1a0580ace499 276
sunifu 7:1a0580ace499 277 if (!SENDFUNC(send, sizeof(send))) {
sunifu 7:1a0580ace499 278 return (ErrorNumber)SendRegisterTimeout;
sunifu 7:1a0580ace499 279 }
sunifu 7:1a0580ace499 280 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 281 }
sunifu 7:1a0580ace499 282
sunifu 7:1a0580ace499 283 CameraC1098::ErrorNumber CameraC1098::sendSetPackageSize(uint16_t packageSize) {
sunifu 7:1a0580ace499 284 char send[COMMAND_LENGTH];
sunifu 7:1a0580ace499 285 send[0] = 0xAA;
sunifu 7:1a0580ace499 286 send[1] = 0x06;
sunifu 7:1a0580ace499 287 send[2] = 0x08;
sunifu 7:1a0580ace499 288 send[3] = (packageSize >> 0) & 0xff;
sunifu 7:1a0580ace499 289 send[4] = (packageSize >> 8) & 0xff;
sunifu 7:1a0580ace499 290 send[5] = 0x00;
sunifu 7:1a0580ace499 291
sunifu 7:1a0580ace499 292 if (!SENDFUNC(send, sizeof(send))) {
sunifu 7:1a0580ace499 293 return (ErrorNumber)SendRegisterTimeout;
sunifu 7:1a0580ace499 294 }
sunifu 7:1a0580ace499 295 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 296 }
sunifu 7:1a0580ace499 297
sunifu 7:1a0580ace499 298 void CameraC1098::setmbedBaud(Baud baud){
sunifu 7:1a0580ace499 299 switch((int)baud){
sunifu 7:1a0580ace499 300 case 2:
sunifu 7:1a0580ace499 301 serial._baud(460800);
sunifu 7:1a0580ace499 302 break;
sunifu 7:1a0580ace499 303 case 3:
sunifu 7:1a0580ace499 304 serial._baud(230400);
sunifu 7:1a0580ace499 305 break;
sunifu 7:1a0580ace499 306 case 4:
sunifu 7:1a0580ace499 307 serial._baud(115200);
sunifu 7:1a0580ace499 308 break;
sunifu 7:1a0580ace499 309 case 5:
sunifu 7:1a0580ace499 310 serial._baud(57600);
sunifu 7:1a0580ace499 311 break;
sunifu 7:1a0580ace499 312 case 6:
sunifu 7:1a0580ace499 313 serial._baud((int)28800);
sunifu 7:1a0580ace499 314 break;
sunifu 7:1a0580ace499 315 case 7:
sunifu 7:1a0580ace499 316 serial._baud(14400);
sunifu 7:1a0580ace499 317 break;
sunifu 7:1a0580ace499 318 default:
sunifu 7:1a0580ace499 319 serial._baud(14400);
sunifu 7:1a0580ace499 320 }
sunifu 7:1a0580ace499 321 }
sunifu 7:1a0580ace499 322
sunifu 7:1a0580ace499 323
sunifu 7:1a0580ace499 324 CameraC1098::ErrorNumber CameraC1098::sendReset(ResetType specialReset) {
sunifu 7:1a0580ace499 325 char send[COMMAND_LENGTH];
sunifu 7:1a0580ace499 326 send[0] = 0xAA;
sunifu 7:1a0580ace499 327 send[1] = 0x08;
sunifu 7:1a0580ace499 328 send[2] = 0x00;
sunifu 7:1a0580ace499 329 send[3] = 0x00;
sunifu 7:1a0580ace499 330 send[4] = 0x00;
sunifu 7:1a0580ace499 331 send[5] = specialReset;
sunifu 7:1a0580ace499 332 /*
sunifu 7:1a0580ace499 333 * Special reset : If the parameter is 0xFF, the command is a special Reset command and the firmware responds to it immediately.
sunifu 7:1a0580ace499 334 */
sunifu 7:1a0580ace499 335
sunifu 7:1a0580ace499 336 if (!SENDFUNC(send, sizeof(send))) {
sunifu 7:1a0580ace499 337 return (ErrorNumber)SendRegisterTimeout;
sunifu 7:1a0580ace499 338 }
sunifu 7:1a0580ace499 339
sunifu 7:1a0580ace499 340 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 341 }
sunifu 7:1a0580ace499 342
sunifu 7:1a0580ace499 343
sunifu 7:1a0580ace499 344 CameraC1098::ErrorNumber CameraC1098::recvData(uint32_t *length) {
sunifu 7:1a0580ace499 345 char recv[COMMAND_LENGTH];
sunifu 7:1a0580ace499 346 if (!RECVFUNC(recv, sizeof(recv))) {
sunifu 7:1a0580ace499 347 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 348 }
sunifu 7:1a0580ace499 349 if ((0xAA != recv[0]) || (0x0A != recv[1])) {
sunifu 7:1a0580ace499 350 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 351 }
sunifu 7:1a0580ace499 352 recv[2] = (char)0x01;
sunifu 7:1a0580ace499 353 *length = (recv[5] << 16) | (recv[4] << 8) | (recv[3] << 0);
sunifu 7:1a0580ace499 354 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 355 }
sunifu 7:1a0580ace499 356
sunifu 7:1a0580ace499 357 CameraC1098::ErrorNumber CameraC1098::sendSync() {
sunifu 7:1a0580ace499 358 char send[COMMAND_LENGTH];
sunifu 7:1a0580ace499 359 send[0] = 0xAA;
sunifu 7:1a0580ace499 360 send[1] = 0x0D;
sunifu 7:1a0580ace499 361 send[2] = 0x00;
sunifu 7:1a0580ace499 362 send[3] = 0x00;
sunifu 7:1a0580ace499 363 send[4] = 0x00;
sunifu 7:1a0580ace499 364 send[5] = 0x00;
sunifu 7:1a0580ace499 365
sunifu 7:1a0580ace499 366
sunifu 7:1a0580ace499 367 if (!SENDFUNC(send, sizeof(send))) {
sunifu 7:1a0580ace499 368 return (ErrorNumber)SendRegisterTimeout;
sunifu 7:1a0580ace499 369 }
sunifu 7:1a0580ace499 370 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 371 }
sunifu 7:1a0580ace499 372
sunifu 7:1a0580ace499 373 CameraC1098::ErrorNumber CameraC1098::recvSync() {
sunifu 7:1a0580ace499 374 char recv[COMMAND_LENGTH];
sunifu 7:1a0580ace499 375
sunifu 7:1a0580ace499 376 if (!RECVFUNC(recv, sizeof(recv))) {
sunifu 7:1a0580ace499 377 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 378 }
sunifu 7:1a0580ace499 379 if ((0xAA != recv[0]) || (0x0D != recv[1])) {
sunifu 7:1a0580ace499 380 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 381 }
sunifu 7:1a0580ace499 382 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 383 }
sunifu 7:1a0580ace499 384
sunifu 7:1a0580ace499 385 /**
sunifu 7:1a0580ace499 386 * Send ACK.
sunifu 7:1a0580ace499 387 *
sunifu 7:1a0580ace499 388 * @param commandId The command with that ID is acknowledged by this command.
sunifu 7:1a0580ace499 389 * @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 7:1a0580ace499 390 */
sunifu 7:1a0580ace499 391 CameraC1098::ErrorNumber CameraC1098::sendAck(uint8_t commandId, uint16_t packageId) {
sunifu 7:1a0580ace499 392 char send[COMMAND_LENGTH];
sunifu 7:1a0580ace499 393
sunifu 7:1a0580ace499 394 send[0] = 0xAA;
sunifu 7:1a0580ace499 395 send[1] = 0x0E;
sunifu 7:1a0580ace499 396 send[2] = commandId;
sunifu 7:1a0580ace499 397 send[3] = 0x00; // ACK counter is not used.
sunifu 7:1a0580ace499 398 send[4] = (packageId >> 0) & 0xff;
sunifu 7:1a0580ace499 399 send[5] = (packageId >> 8) & 0xff;
sunifu 7:1a0580ace499 400 if (!SENDFUNC(send, sizeof(send))) {
sunifu 7:1a0580ace499 401 return (ErrorNumber)SendRegisterTimeout;
sunifu 7:1a0580ace499 402 }
sunifu 7:1a0580ace499 403 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 404 }
sunifu 7:1a0580ace499 405
sunifu 7:1a0580ace499 406 /**
sunifu 7:1a0580ace499 407 * Receive ACK or NCK.
sunifu 7:1a0580ace499 408 *
sunifu 7:1a0580ace499 409 * @return Error number.
sunifu 7:1a0580ace499 410 */
sunifu 7:1a0580ace499 411 CameraC1098::ErrorNumber CameraC1098::recvAckOrNck() {
sunifu 7:1a0580ace499 412 char recv[COMMAND_LENGTH];
sunifu 7:1a0580ace499 413
sunifu 7:1a0580ace499 414 if (!RECVFUNC(recv, sizeof(recv))) {
sunifu 7:1a0580ace499 415 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 416 }
sunifu 7:1a0580ace499 417 if ((0xAA == recv[0]) && (0x0E == recv[1])) {
sunifu 7:1a0580ace499 418 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 419 }
sunifu 7:1a0580ace499 420 if ((0xAA == recv[0]) && (0x0F == recv[1]) && (0x00 == recv[2])) {
sunifu 7:1a0580ace499 421 return (ErrorNumber)NoError;
sunifu 7:1a0580ace499 422 }
sunifu 7:1a0580ace499 423 if ((0xAA == recv[0]) && (0x0F == recv[1])) {
sunifu 7:1a0580ace499 424 return (ErrorNumber)recv[4];
sunifu 7:1a0580ace499 425 }
sunifu 7:1a0580ace499 426 return (ErrorNumber)UnexpectedReply;
sunifu 7:1a0580ace499 427 }
sunifu 7:1a0580ace499 428
sunifu 7:1a0580ace499 429 /**
sunifu 7:1a0580ace499 430 * Send bytes to camera module.
sunifu 7:1a0580ace499 431 *
sunifu 7:1a0580ace499 432 * @param buf Pointer to the data buffer.
sunifu 7:1a0580ace499 433 * @param len Length of the data buffer.
sunifu 7:1a0580ace499 434 *
sunifu 7:1a0580ace499 435 * @return True if the data sended.
sunifu 7:1a0580ace499 436 */
sunifu 7:1a0580ace499 437 bool CameraC1098::sendBytes(char *buf, size_t len, int timeout_us) {
sunifu 7:1a0580ace499 438 for (uint32_t i = 0; i < (uint32_t)len; i++) {
sunifu 7:1a0580ace499 439 int cnt = 0;
sunifu 7:1a0580ace499 440 while (!serial.writeable()) {
sunifu 7:1a0580ace499 441 wait_us(1);
sunifu 7:1a0580ace499 442 cnt++;
sunifu 7:1a0580ace499 443 if (timeout_us < cnt) {
sunifu 7:1a0580ace499 444 return false;
sunifu 7:1a0580ace499 445 }
sunifu 7:1a0580ace499 446 }
sunifu 7:1a0580ace499 447 serial.putc(buf[i]);
sunifu 7:1a0580ace499 448 }
sunifu 7:1a0580ace499 449 return true;
sunifu 7:1a0580ace499 450 }
sunifu 7:1a0580ace499 451
sunifu 7:1a0580ace499 452 /**
sunifu 7:1a0580ace499 453 * Receive bytes from camera module.
sunifu 7:1a0580ace499 454 *
sunifu 7:1a0580ace499 455 * @param buf Pointer to the data buffer.
sunifu 7:1a0580ace499 456 * @param len Length of the data buffer.
sunifu 7:1a0580ace499 457 *
sunifu 7:1a0580ace499 458 * @return True if the data received.
sunifu 7:1a0580ace499 459 */
sunifu 7:1a0580ace499 460 bool CameraC1098::recvBytes(char *buf, size_t len, int timeout_us) {
sunifu 7:1a0580ace499 461 for (uint32_t i = 0; i < (uint32_t)len; i++) {
sunifu 7:1a0580ace499 462 int cnt = 0;
sunifu 7:1a0580ace499 463 while (!serial.readable()) {
sunifu 7:1a0580ace499 464 wait_us(1);
sunifu 7:1a0580ace499 465 cnt++;
sunifu 7:1a0580ace499 466 if (timeout_us < cnt) {
sunifu 7:1a0580ace499 467 return false;
sunifu 7:1a0580ace499 468 }
sunifu 7:1a0580ace499 469 }
sunifu 7:1a0580ace499 470 buf[i] = serial.getc();
sunifu 7:1a0580ace499 471 }
sunifu 7:1a0580ace499 472 return true;
sunifu 7:1a0580ace499 473 }
sunifu 7:1a0580ace499 474
sunifu 7:1a0580ace499 475 /**
sunifu 7:1a0580ace499 476 * Wait received.
sunifu 7:1a0580ace499 477 *
sunifu 7:1a0580ace499 478 * @return True if the data received.
sunifu 7:1a0580ace499 479 */
sunifu 7:1a0580ace499 480 bool CameraC1098::waitRecv() {
sunifu 7:1a0580ace499 481 while (!serial.readable()) {
sunifu 7:1a0580ace499 482 }
sunifu 7:1a0580ace499 483 return true;
sunifu 7:1a0580ace499 484 }
sunifu 7:1a0580ace499 485
sunifu 7:1a0580ace499 486 /**
sunifu 7:1a0580ace499 487 * Wait idle state.
sunifu 7:1a0580ace499 488 */
sunifu 7:1a0580ace499 489 bool CameraC1098::waitIdle() {
sunifu 7:1a0580ace499 490 while (serial.readable()) {
sunifu 7:1a0580ace499 491 serial.getc();
sunifu 7:1a0580ace499 492 }
sunifu 7:1a0580ace499 493 return true;
sunifu 7:1a0580ace499 494 }