A test program for CameraC328 library.
Dependencies: mbed CameraC328 SDFileSystem
main.cpp@1:01d23ea0ab41, 2010-09-17 (annotated)
- Committer:
- shintamainjp
- Date:
- Fri Sep 17 11:16:19 2010 +0000
- Revision:
- 1:01d23ea0ab41
- Parent:
- 0:cebbdb54d1cb
Who changed what in which revision?
User | Revision | Line number | New 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 | } |