A test program for CameraC328 library.

Dependencies:   mbed CameraC328 SDFileSystem

Committer:
shintamainjp
Date:
Fri Sep 17 11:16:19 2010 +0000
Revision:
1:01d23ea0ab41
Parent:
0:cebbdb54d1cb

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:cebbdb54d1cb 1 /**
shintamainjp 0:cebbdb54d1cb 2 * Test program.
shintamainjp 0:cebbdb54d1cb 3 *
shintamainjp 0:cebbdb54d1cb 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:cebbdb54d1cb 5 * http://shinta.main.jp/
shintamainjp 0:cebbdb54d1cb 6 */
shintamainjp 0:cebbdb54d1cb 7
shintamainjp 1:01d23ea0ab41 8 /*
shintamainjp 1:01d23ea0ab41 9 * Include files.
shintamainjp 1:01d23ea0ab41 10 */
shintamainjp 1:01d23ea0ab41 11
shintamainjp 0:cebbdb54d1cb 12 #include "mbed.h"
shintamainjp 0:cebbdb54d1cb 13 #include "CameraC328.h"
shintamainjp 1:01d23ea0ab41 14 #include "SDFileSystem.h"
shintamainjp 0:cebbdb54d1cb 15
shintamainjp 1:01d23ea0ab41 16 /*
shintamainjp 1:01d23ea0ab41 17 * Definitions.
shintamainjp 1:01d23ea0ab41 18 */
shintamainjp 1:01d23ea0ab41 19 #define USE_JPEG_HIGH_RESOLUTION 1
shintamainjp 1:01d23ea0ab41 20 #define USE_SD_CARD 0
shintamainjp 0:cebbdb54d1cb 21
shintamainjp 1:01d23ea0ab41 22 /*
shintamainjp 1:01d23ea0ab41 23 * Variables.
shintamainjp 1:01d23ea0ab41 24 */
shintamainjp 1:01d23ea0ab41 25 static const int CAPTURE_FRAMES = 5;
shintamainjp 1:01d23ea0ab41 26 static const int RAWIMG_X = 80;
shintamainjp 1:01d23ea0ab41 27 static const int RAWIMG_Y = 60;
shintamainjp 1:01d23ea0ab41 28 static char buf[RAWIMG_X * RAWIMG_Y * 2];
shintamainjp 1:01d23ea0ab41 29 static FILE *fp_jpeg;
shintamainjp 1:01d23ea0ab41 30
shintamainjp 1:01d23ea0ab41 31 /*
shintamainjp 1:01d23ea0ab41 32 * Modules.
shintamainjp 1:01d23ea0ab41 33 */
shintamainjp 1:01d23ea0ab41 34 #if USE_SD_CARD
shintamainjp 1:01d23ea0ab41 35 SDFileSystem sd(p5, p6, p7, p8, "fs");
shintamainjp 1:01d23ea0ab41 36 #else
shintamainjp 1:01d23ea0ab41 37 LocalFileSystem fs("fs");
shintamainjp 1:01d23ea0ab41 38 #endif
shintamainjp 0:cebbdb54d1cb 39 CameraC328 camera(p9, p10, CameraC328::Baud19200);
shintamainjp 0:cebbdb54d1cb 40
shintamainjp 1:01d23ea0ab41 41 /**
shintamainjp 1:01d23ea0ab41 42 * A callback function for uncompressed images.
shintamainjp 1:01d23ea0ab41 43 * Please do NOT block this callback function.
shintamainjp 1:01d23ea0ab41 44 * Because the camera module transmit image datas continuously.
shintamainjp 1:01d23ea0ab41 45 *
shintamainjp 1:01d23ea0ab41 46 * @param done a done number of packets.
shintamainjp 1:01d23ea0ab41 47 * @param total a total number of packets.
shintamainjp 1:01d23ea0ab41 48 * @param c received data.
shintamainjp 1:01d23ea0ab41 49 */
shintamainjp 0:cebbdb54d1cb 50 void uncompressed_callback(size_t done, size_t total, char c) {
shintamainjp 0:cebbdb54d1cb 51 buf[done - 1] = c;
shintamainjp 0:cebbdb54d1cb 52 }
shintamainjp 0:cebbdb54d1cb 53
shintamainjp 1:01d23ea0ab41 54 /**
shintamainjp 1:01d23ea0ab41 55 * A callback function for jpeg images.
shintamainjp 1:01d23ea0ab41 56 * You can block this function until saving the image datas.
shintamainjp 1:01d23ea0ab41 57 *
shintamainjp 1:01d23ea0ab41 58 * @param buf A pointer to the image buffer.
shintamainjp 1:01d23ea0ab41 59 * @param siz A size of the image buffer.
shintamainjp 1:01d23ea0ab41 60 */
shintamainjp 0:cebbdb54d1cb 61 void jpeg_callback(char *buf, size_t siz) {
shintamainjp 0:cebbdb54d1cb 62 for (int i = 0; i < (int)siz; i++) {
shintamainjp 0:cebbdb54d1cb 63 fprintf(fp_jpeg, "%c", buf[i]);
shintamainjp 0:cebbdb54d1cb 64 }
shintamainjp 0:cebbdb54d1cb 65 }
shintamainjp 0:cebbdb54d1cb 66
shintamainjp 1:01d23ea0ab41 67 /**
shintamainjp 1:01d23ea0ab41 68 * Synchronizing.
shintamainjp 1:01d23ea0ab41 69 */
shintamainjp 0:cebbdb54d1cb 70 void sync(void) {
shintamainjp 0:cebbdb54d1cb 71 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 0:cebbdb54d1cb 72
shintamainjp 0:cebbdb54d1cb 73 err = camera.sync();
shintamainjp 0:cebbdb54d1cb 74 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 75 printf("[ OK ] : CameraC328::sync\n");
shintamainjp 0:cebbdb54d1cb 76 } else {
shintamainjp 0:cebbdb54d1cb 77 printf("[FAIL] : CameraC328::sync (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 78 }
shintamainjp 0:cebbdb54d1cb 79 }
shintamainjp 0:cebbdb54d1cb 80
shintamainjp 1:01d23ea0ab41 81 /**
shintamainjp 1:01d23ea0ab41 82 * A test function for uncompressed snapshot picture.
shintamainjp 1:01d23ea0ab41 83 */
shintamainjp 0:cebbdb54d1cb 84 void test_uncompressed_snapshot_picture(void) {
shintamainjp 0:cebbdb54d1cb 85 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 0:cebbdb54d1cb 86
shintamainjp 1:01d23ea0ab41 87 err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution160x128);
shintamainjp 0:cebbdb54d1cb 88 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 89 printf("[ OK ] : CameraC328::init\n");
shintamainjp 0:cebbdb54d1cb 90 } else {
shintamainjp 0:cebbdb54d1cb 91 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 92 }
shintamainjp 0:cebbdb54d1cb 93
shintamainjp 1:01d23ea0ab41 94 for (int i = 0; i < CAPTURE_FRAMES; i++) {
shintamainjp 0:cebbdb54d1cb 95 err = camera.getUncompressedSnapshotPicture(uncompressed_callback);
shintamainjp 0:cebbdb54d1cb 96 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 97 printf("[ OK ] : CameraC328::getUncompressedSnapshotPicture\n");
shintamainjp 0:cebbdb54d1cb 98 } else {
shintamainjp 0:cebbdb54d1cb 99 printf("[FAIL] : CameraC328::getUncompressedSnapshotPicture (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 100 }
shintamainjp 0:cebbdb54d1cb 101
shintamainjp 0:cebbdb54d1cb 102 char fname[64];
shintamainjp 0:cebbdb54d1cb 103 snprintf(fname, sizeof(fname), "/fs/ucss%04d.ppm", i);
shintamainjp 0:cebbdb54d1cb 104 FILE *fp = fopen(fname, "w");
shintamainjp 0:cebbdb54d1cb 105 fprintf(fp, "P3\n");
shintamainjp 1:01d23ea0ab41 106 fprintf(fp, "%d %d\n", RAWIMG_X, RAWIMG_Y);
shintamainjp 0:cebbdb54d1cb 107 fprintf(fp, "%d\n", 255);
shintamainjp 1:01d23ea0ab41 108 for (int y = 0; y < RAWIMG_Y; y++) {
shintamainjp 1:01d23ea0ab41 109 for (int x = 0; x < RAWIMG_X; x++) {
shintamainjp 1:01d23ea0ab41 110 int adrofs = y * (RAWIMG_X * 2) + (x * 2);
shintamainjp 0:cebbdb54d1cb 111 uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0);
shintamainjp 0:cebbdb54d1cb 112 uint8_t r = ((dat >> 11) & 0x1f) << 3;
shintamainjp 0:cebbdb54d1cb 113 uint8_t g = ((dat >> 5) & 0x3f) << 2;
shintamainjp 0:cebbdb54d1cb 114 uint8_t b = ((dat >> 0) & 0x1f) << 3;
shintamainjp 0:cebbdb54d1cb 115 fprintf(fp,"%d %d %d\n", r, g, b);
shintamainjp 0:cebbdb54d1cb 116 }
shintamainjp 0:cebbdb54d1cb 117 }
shintamainjp 0:cebbdb54d1cb 118 fclose(fp);
shintamainjp 0:cebbdb54d1cb 119 }
shintamainjp 0:cebbdb54d1cb 120 }
shintamainjp 0:cebbdb54d1cb 121
shintamainjp 1:01d23ea0ab41 122 /**
shintamainjp 1:01d23ea0ab41 123 * A test function for uncompressed preview picture.
shintamainjp 1:01d23ea0ab41 124 */
shintamainjp 0:cebbdb54d1cb 125 void test_uncompressed_preview_picture(void) {
shintamainjp 0:cebbdb54d1cb 126 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 0:cebbdb54d1cb 127
shintamainjp 1:01d23ea0ab41 128 err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution160x128);
shintamainjp 0:cebbdb54d1cb 129 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 130 printf("[ OK ] : CameraC328::init\n");
shintamainjp 0:cebbdb54d1cb 131 } else {
shintamainjp 0:cebbdb54d1cb 132 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 133 }
shintamainjp 0:cebbdb54d1cb 134
shintamainjp 1:01d23ea0ab41 135 for (int i = 0; i < CAPTURE_FRAMES; i++) {
shintamainjp 0:cebbdb54d1cb 136 err = camera.getUncompressedPreviewPicture(uncompressed_callback);
shintamainjp 0:cebbdb54d1cb 137 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 138 printf("[ OK ] : CameraC328::getUncompressedPreviewPicture\n");
shintamainjp 0:cebbdb54d1cb 139 } else {
shintamainjp 0:cebbdb54d1cb 140 printf("[FAIL] : CameraC328::getUncompressedPreviewPicture (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 141 }
shintamainjp 0:cebbdb54d1cb 142
shintamainjp 0:cebbdb54d1cb 143 char fname[64];
shintamainjp 0:cebbdb54d1cb 144 snprintf(fname, sizeof(fname), "/fs/ucpv%04d.ppm", i);
shintamainjp 0:cebbdb54d1cb 145 FILE *fp = fopen(fname, "w");
shintamainjp 0:cebbdb54d1cb 146 fprintf(fp, "P3\n");
shintamainjp 1:01d23ea0ab41 147 fprintf(fp, "%d %d\n", RAWIMG_X, RAWIMG_Y);
shintamainjp 0:cebbdb54d1cb 148 fprintf(fp, "%d\n", 255);
shintamainjp 1:01d23ea0ab41 149 for (int y = 0; y < RAWIMG_Y; y++) {
shintamainjp 1:01d23ea0ab41 150 for (int x = 0; x < RAWIMG_X; x++) {
shintamainjp 1:01d23ea0ab41 151 int adrofs = y * (RAWIMG_X * 2) + (x * 2);
shintamainjp 0:cebbdb54d1cb 152 uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0);
shintamainjp 0:cebbdb54d1cb 153 uint8_t r = ((dat >> 11) & 0x1f) << 3;
shintamainjp 0:cebbdb54d1cb 154 uint8_t g = ((dat >> 5) & 0x3f) << 2;
shintamainjp 0:cebbdb54d1cb 155 uint8_t b = ((dat >> 0) & 0x1f) << 3;
shintamainjp 0:cebbdb54d1cb 156 fprintf(fp,"%d %d %d\n", r, g, b);
shintamainjp 0:cebbdb54d1cb 157 }
shintamainjp 0:cebbdb54d1cb 158 }
shintamainjp 0:cebbdb54d1cb 159 fclose(fp);
shintamainjp 0:cebbdb54d1cb 160 }
shintamainjp 0:cebbdb54d1cb 161 }
shintamainjp 0:cebbdb54d1cb 162
shintamainjp 1:01d23ea0ab41 163 /**
shintamainjp 1:01d23ea0ab41 164 * A test function for jpeg snapshot picture.
shintamainjp 1:01d23ea0ab41 165 */
shintamainjp 0:cebbdb54d1cb 166 void test_jpeg_snapshot_picture(void) {
shintamainjp 0:cebbdb54d1cb 167 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 0:cebbdb54d1cb 168
shintamainjp 1:01d23ea0ab41 169 #if USE_JPEG_HIGH_RESOLUTION
shintamainjp 0:cebbdb54d1cb 170 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
shintamainjp 1:01d23ea0ab41 171 #else
shintamainjp 1:01d23ea0ab41 172 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution320x240);
shintamainjp 1:01d23ea0ab41 173 #endif
shintamainjp 0:cebbdb54d1cb 174 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 175 printf("[ OK ] : CameraC328::init\n");
shintamainjp 0:cebbdb54d1cb 176 } else {
shintamainjp 0:cebbdb54d1cb 177 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 178 }
shintamainjp 0:cebbdb54d1cb 179
shintamainjp 1:01d23ea0ab41 180 for (int i = 0; i < CAPTURE_FRAMES; i++) {
shintamainjp 0:cebbdb54d1cb 181 char fname[64];
shintamainjp 0:cebbdb54d1cb 182 snprintf(fname, sizeof(fname), "/fs/jpss%04d.jpg", i);
shintamainjp 0:cebbdb54d1cb 183 fp_jpeg = fopen(fname, "w");
shintamainjp 0:cebbdb54d1cb 184
shintamainjp 0:cebbdb54d1cb 185 err = camera.getJpegSnapshotPicture(jpeg_callback);
shintamainjp 0:cebbdb54d1cb 186 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 187 printf("[ OK ] : CameraC328::getJpegSnapshotPicture\n");
shintamainjp 0:cebbdb54d1cb 188 } else {
shintamainjp 0:cebbdb54d1cb 189 printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 190 }
shintamainjp 0:cebbdb54d1cb 191
shintamainjp 0:cebbdb54d1cb 192 fclose(fp_jpeg);
shintamainjp 0:cebbdb54d1cb 193 }
shintamainjp 0:cebbdb54d1cb 194 }
shintamainjp 0:cebbdb54d1cb 195
shintamainjp 1:01d23ea0ab41 196 /**
shintamainjp 1:01d23ea0ab41 197 * A test function for jpeg preview picture.
shintamainjp 1:01d23ea0ab41 198 */
shintamainjp 0:cebbdb54d1cb 199 void test_jpeg_preview_picture(void) {
shintamainjp 0:cebbdb54d1cb 200 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 0:cebbdb54d1cb 201
shintamainjp 1:01d23ea0ab41 202 #if USE_JPEG_HIGH_RESOLUTION
shintamainjp 0:cebbdb54d1cb 203 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
shintamainjp 1:01d23ea0ab41 204 #else
shintamainjp 1:01d23ea0ab41 205 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution320x240);
shintamainjp 1:01d23ea0ab41 206 #endif
shintamainjp 0:cebbdb54d1cb 207 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 208 printf("[ OK ] : CameraC328::init\n");
shintamainjp 0:cebbdb54d1cb 209 } else {
shintamainjp 0:cebbdb54d1cb 210 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 211 }
shintamainjp 0:cebbdb54d1cb 212
shintamainjp 1:01d23ea0ab41 213 for (int i = 0; i < CAPTURE_FRAMES; i++) {
shintamainjp 0:cebbdb54d1cb 214 char fname[64];
shintamainjp 0:cebbdb54d1cb 215 snprintf(fname, sizeof(fname), "/fs/jppv%04d.jpg", i);
shintamainjp 0:cebbdb54d1cb 216 fp_jpeg = fopen(fname, "w");
shintamainjp 0:cebbdb54d1cb 217
shintamainjp 0:cebbdb54d1cb 218 err = camera.getJpegPreviewPicture(jpeg_callback);
shintamainjp 0:cebbdb54d1cb 219 if (CameraC328::NoError == err) {
shintamainjp 0:cebbdb54d1cb 220 printf("[ OK ] : CameraC328::getJpegPreviewPicture\n");
shintamainjp 0:cebbdb54d1cb 221 } else {
shintamainjp 0:cebbdb54d1cb 222 printf("[FAIL] : CameraC328::getJpegPreviewPicture (Error=%02X)\n", (int)err);
shintamainjp 0:cebbdb54d1cb 223 }
shintamainjp 0:cebbdb54d1cb 224
shintamainjp 0:cebbdb54d1cb 225 fclose(fp_jpeg);
shintamainjp 0:cebbdb54d1cb 226 }
shintamainjp 0:cebbdb54d1cb 227 }
shintamainjp 0:cebbdb54d1cb 228
shintamainjp 1:01d23ea0ab41 229 /**
shintamainjp 1:01d23ea0ab41 230 * A entry point.
shintamainjp 1:01d23ea0ab41 231 */
shintamainjp 0:cebbdb54d1cb 232 int main() {
shintamainjp 0:cebbdb54d1cb 233 printf("\n");
shintamainjp 0:cebbdb54d1cb 234 printf("==========\n");
shintamainjp 0:cebbdb54d1cb 235 printf("CameraC328\n");
shintamainjp 0:cebbdb54d1cb 236 printf("==========\n");
shintamainjp 0:cebbdb54d1cb 237
shintamainjp 0:cebbdb54d1cb 238 sync();
shintamainjp 0:cebbdb54d1cb 239 test_uncompressed_snapshot_picture();
shintamainjp 0:cebbdb54d1cb 240 test_uncompressed_preview_picture();
shintamainjp 0:cebbdb54d1cb 241 test_jpeg_preview_picture();
shintamainjp 0:cebbdb54d1cb 242 test_jpeg_snapshot_picture();
shintamainjp 0:cebbdb54d1cb 243
shintamainjp 0:cebbdb54d1cb 244 return 0;
shintamainjp 0:cebbdb54d1cb 245 }