cansat_B 2019 / Mbed 2 deprecated camera-pic-xbee

Dependencies:   mbed JPEGCamera

Committer:
saeichi
Date:
Mon Nov 25 08:19:58 2019 +0000
Revision:
0:581241ed8da9
camera-pic-xbee;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
saeichi 0:581241ed8da9 1 /* Arduino JPEGCamera Library
saeichi 0:581241ed8da9 2 * Copyright 2010 SparkFun Electronic
saeichi 0:581241ed8da9 3 * Written by Ryan Owens
saeichi 0:581241ed8da9 4 * Modified by arms22
saeichi 0:581241ed8da9 5 * Ported to mbed by yamaguch
saeichi 0:581241ed8da9 6 */
saeichi 0:581241ed8da9 7
saeichi 0:581241ed8da9 8 #include "JPEGCamera.h"
saeichi 0:581241ed8da9 9
saeichi 0:581241ed8da9 10 #define min(x, y) ((x) < (y)) ? (x) : (y)
saeichi 0:581241ed8da9 11
saeichi 0:581241ed8da9 12 const int RESPONSE_TIMEOUT = 500;
saeichi 0:581241ed8da9 13 const int DATA_TIMEOUT = 1000;
saeichi 0:581241ed8da9 14
saeichi 0:581241ed8da9 15 JPEGCamera::JPEGCamera(PinName tx, PinName rx) : Serial(tx, rx) {
saeichi 0:581241ed8da9 16 printf("AA\r\n");
saeichi 0:581241ed8da9 17 baud(38400);
saeichi 0:581241ed8da9 18 state = READY;
saeichi 0:581241ed8da9 19 }
saeichi 0:581241ed8da9 20
saeichi 0:581241ed8da9 21 bool JPEGCamera::setPictureSize(JPEGCamera::PictureSize size, bool doReset) {
saeichi 0:581241ed8da9 22 char buf[9] = {0x56, 0x00, 0x31, 0x05, 0x04, 0x01, 0x00, 0x19, (char) size};
saeichi 0:581241ed8da9 23 int ret = sendReceive(buf, sizeof buf, 5);
saeichi 0:581241ed8da9 24
saeichi 0:581241ed8da9 25 if (ret == 5 && buf[0] == 0x76) {
saeichi 0:581241ed8da9 26 if (doReset)
saeichi 0:581241ed8da9 27 reset();
saeichi 0:581241ed8da9 28 return true;
saeichi 0:581241ed8da9 29 } else
saeichi 0:581241ed8da9 30 return false;
saeichi 0:581241ed8da9 31 }
saeichi 0:581241ed8da9 32
saeichi 0:581241ed8da9 33 bool JPEGCamera::isReady() {
saeichi 0:581241ed8da9 34 return state == READY;
saeichi 0:581241ed8da9 35 }
saeichi 0:581241ed8da9 36
saeichi 0:581241ed8da9 37 bool JPEGCamera::isProcessing() {
saeichi 0:581241ed8da9 38 return state == PROCESSING;
saeichi 0:581241ed8da9 39 }
saeichi 0:581241ed8da9 40
saeichi 0:581241ed8da9 41 bool JPEGCamera::takePicture(char *filename) {
saeichi 0:581241ed8da9 42 if (state == READY) {
saeichi 0:581241ed8da9 43 fp = fopen(filename, "wb");
saeichi 0:581241ed8da9 44 if (fp != 0) {
saeichi 0:581241ed8da9 45 if (takePicture()) {
saeichi 0:581241ed8da9 46 imageSize = getImageSize();
saeichi 0:581241ed8da9 47 address = 0;
saeichi 0:581241ed8da9 48 state = PROCESSING;
saeichi 0:581241ed8da9 49 } else {
saeichi 0:581241ed8da9 50 fclose(fp);
saeichi 0:581241ed8da9 51 printf("takePicture(%s) failed", filename);
saeichi 0:581241ed8da9 52 state = ERROR;
saeichi 0:581241ed8da9 53 }
saeichi 0:581241ed8da9 54 } else {
saeichi 0:581241ed8da9 55 printf("fopen() failed");
saeichi 0:581241ed8da9 56 state = ERROR;
saeichi 0:581241ed8da9 57 }
saeichi 0:581241ed8da9 58 }
saeichi 0:581241ed8da9 59 return state != ERROR;
saeichi 0:581241ed8da9 60 }
saeichi 0:581241ed8da9 61
saeichi 0:581241ed8da9 62 bool JPEGCamera::processPicture() {
saeichi 0:581241ed8da9 63 if (state == PROCESSING) {
saeichi 0:581241ed8da9 64 if (address < imageSize) {
saeichi 0:581241ed8da9 65 char data[1024];
saeichi 0:581241ed8da9 66 int size = readData(data, min(sizeof(data), imageSize - address), address);
saeichi 0:581241ed8da9 67 int ret = fwrite(data, size, 1, fp);
saeichi 0:581241ed8da9 68 if (ret > 0)
saeichi 0:581241ed8da9 69 address += size;
saeichi 0:581241ed8da9 70 if (ret == 0 || address >= imageSize) {
saeichi 0:581241ed8da9 71 stopPictures();
saeichi 0:581241ed8da9 72 fclose(fp);
saeichi 0:581241ed8da9 73 wait(0.1); // ????
saeichi 0:581241ed8da9 74 state = ret > 0 ? READY : ERROR;
saeichi 0:581241ed8da9 75 }
saeichi 0:581241ed8da9 76 }
saeichi 0:581241ed8da9 77 }
saeichi 0:581241ed8da9 78
saeichi 0:581241ed8da9 79 return state == PROCESSING || state == READY;
saeichi 0:581241ed8da9 80 }
saeichi 0:581241ed8da9 81
saeichi 0:581241ed8da9 82 bool JPEGCamera::reset() {
saeichi 0:581241ed8da9 83 char buf[4] = {0x56, 0x00, 0x26, 0x00};
saeichi 0:581241ed8da9 84 int ret = sendReceive(buf, sizeof buf, 4);
saeichi 0:581241ed8da9 85 if (ret == 4 && buf[0] == 0x76) {
saeichi 0:581241ed8da9 86 wait(4.0);
saeichi 0:581241ed8da9 87 state = READY;
saeichi 0:581241ed8da9 88 } else {
saeichi 0:581241ed8da9 89 state = ERROR;
saeichi 0:581241ed8da9 90 }
saeichi 0:581241ed8da9 91 return state == READY;
saeichi 0:581241ed8da9 92 }
saeichi 0:581241ed8da9 93
saeichi 0:581241ed8da9 94 bool JPEGCamera::takePicture() {
saeichi 0:581241ed8da9 95 char buf[5] = {0x56, 0x00, 0x36, 0x01, 0x00};
saeichi 0:581241ed8da9 96 int ret = sendReceive(buf, sizeof buf, 5);
saeichi 0:581241ed8da9 97
saeichi 0:581241ed8da9 98 return ret == 5 && buf[0] == 0x76;
saeichi 0:581241ed8da9 99 }
saeichi 0:581241ed8da9 100
saeichi 0:581241ed8da9 101 bool JPEGCamera::stopPictures() {
saeichi 0:581241ed8da9 102 char buf[5] = {0x56, 0x00, 0x36, 0x01, 0x03};
saeichi 0:581241ed8da9 103 int ret = sendReceive(buf, sizeof buf, 5);
saeichi 0:581241ed8da9 104
saeichi 0:581241ed8da9 105 return ret == 4 && buf[0] == 0x76;
saeichi 0:581241ed8da9 106 }
saeichi 0:581241ed8da9 107
saeichi 0:581241ed8da9 108 int JPEGCamera::getImageSize() {
saeichi 0:581241ed8da9 109 char buf[9] = {0x56, 0x00, 0x34, 0x01, 0x00};
saeichi 0:581241ed8da9 110 int ret = sendReceive(buf, sizeof buf, 9);
saeichi 0:581241ed8da9 111
saeichi 0:581241ed8da9 112 //The size is in the last 2 characters of the response.
saeichi 0:581241ed8da9 113 return (ret == 9 && buf[0] == 0x76) ? (buf[7] << 8 | buf[8]) : 0;
saeichi 0:581241ed8da9 114 }
saeichi 0:581241ed8da9 115
saeichi 0:581241ed8da9 116 int JPEGCamera::readData(char *dataBuf, int size, int address) {
saeichi 0:581241ed8da9 117 char buf[16] = {0x56, 0x00, 0x32, 0x0C, 0x00, 0x0A, 0x00, 0x00,
saeichi 0:581241ed8da9 118 address >> 8, address & 255, 0x00, 0x00, size >> 8, size & 255, 0x00, 0x0A
saeichi 0:581241ed8da9 119 };
saeichi 0:581241ed8da9 120 int ret = sendReceive(buf, sizeof buf, 5);
saeichi 0:581241ed8da9 121
saeichi 0:581241ed8da9 122 return (ret == 5 && buf[0] == 0x76) ? receive(dataBuf, size, DATA_TIMEOUT) : 0;
saeichi 0:581241ed8da9 123 }
saeichi 0:581241ed8da9 124
saeichi 0:581241ed8da9 125 int JPEGCamera::sendReceive(char *buf, int sendSize, int receiveSize) {
saeichi 0:581241ed8da9 126 while (readable()) getc();
saeichi 0:581241ed8da9 127
saeichi 0:581241ed8da9 128 for (int i = 0; i < sendSize; i++) putc(buf[i]);
saeichi 0:581241ed8da9 129
saeichi 0:581241ed8da9 130 return receive(buf, receiveSize, RESPONSE_TIMEOUT);
saeichi 0:581241ed8da9 131 }
saeichi 0:581241ed8da9 132
saeichi 0:581241ed8da9 133 int JPEGCamera::receive(char *buf, int size, int timeout) {
saeichi 0:581241ed8da9 134 timer.start();
saeichi 0:581241ed8da9 135 timer.reset();
saeichi 0:581241ed8da9 136
saeichi 0:581241ed8da9 137 int i = 0;
saeichi 0:581241ed8da9 138 while (i < size && timer.read_ms() < timeout) {
saeichi 0:581241ed8da9 139 if (readable())
saeichi 0:581241ed8da9 140 buf[i++] = getc();
saeichi 0:581241ed8da9 141 }
saeichi 0:581241ed8da9 142
saeichi 0:581241ed8da9 143 return i;
saeichi 0:581241ed8da9 144 }