CameraC328
Dependents: CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more
main.cpp@14:640f564075af, 2010-10-13 (annotated)
- Committer:
- shintamainjp
- Date:
- Wed Oct 13 10:42:48 2010 +0000
- Revision:
- 14:640f564075af
First version.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |