CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Committer:
shintamainjp
Date:
Wed Oct 13 10:42:48 2010 +0000
Revision:
14:640f564075af
First version.

Who changed what in which revision?

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