CameraC328
Dependents: CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more
main.cpp@4:ad06342d4b84, 2010-06-29 (annotated)
- Committer:
- shintamainjp
- Date:
- Tue Jun 29 22:55:35 2010 +0000
- Revision:
- 4:ad06342d4b84
- Parent:
- 3:6d3150d4396a
- Child:
- 6:4749dd1acdd1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shintamainjp | 3:6d3150d4396a | 1 | /** |
shintamainjp | 4:ad06342d4b84 | 2 | * C328-7640 device driver class (Version 0.0.2) |
shintamainjp | 3:6d3150d4396a | 3 | * Reference documents: C328-7640 User Manual v3.0 2004.8.19 |
shintamainjp | 3:6d3150d4396a | 4 | * |
shintamainjp | 3:6d3150d4396a | 5 | * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems) |
shintamainjp | 3:6d3150d4396a | 6 | * http://shinta.main.jp/ |
shintamainjp | 3:6d3150d4396a | 7 | */ |
shintamainjp | 3:6d3150d4396a | 8 | |
shintamainjp | 3:6d3150d4396a | 9 | #include "mbed.h" |
shintamainjp | 3:6d3150d4396a | 10 | #include "CameraC328.h" |
shintamainjp | 3:6d3150d4396a | 11 | |
shintamainjp | 3:6d3150d4396a | 12 | DigitalOut myled1(LED1); |
shintamainjp | 3:6d3150d4396a | 13 | DigitalOut myled2(LED2); |
shintamainjp | 3:6d3150d4396a | 14 | CameraC328 camera(p9, p10, CameraC328::Baud57600); |
shintamainjp | 3:6d3150d4396a | 15 | Serial serial(USBTX, USBRX); |
shintamainjp | 3:6d3150d4396a | 16 | LocalFileSystem fs ("fs"); |
shintamainjp | 3:6d3150d4396a | 17 | const int IMG_X = 80; |
shintamainjp | 3:6d3150d4396a | 18 | const int IMG_Y = 60; |
shintamainjp | 3:6d3150d4396a | 19 | char buf[IMG_X * IMG_Y * 2]; |
shintamainjp | 4:ad06342d4b84 | 20 | FILE *fp_jpeg; |
shintamainjp | 3:6d3150d4396a | 21 | |
shintamainjp | 4:ad06342d4b84 | 22 | void uncompressed_callback(size_t done, size_t total, char c) { |
shintamainjp | 3:6d3150d4396a | 23 | buf[done - 1] = c; |
shintamainjp | 3:6d3150d4396a | 24 | } |
shintamainjp | 3:6d3150d4396a | 25 | |
shintamainjp | 4:ad06342d4b84 | 26 | void jpeg_callback(char *buf, size_t siz) { |
shintamainjp | 4:ad06342d4b84 | 27 | for (int i = 0; i < (int)siz; i++) { |
shintamainjp | 4:ad06342d4b84 | 28 | fprintf(fp_jpeg, "%c", buf[i]); |
shintamainjp | 4:ad06342d4b84 | 29 | } |
shintamainjp | 4:ad06342d4b84 | 30 | } |
shintamainjp | 4:ad06342d4b84 | 31 | |
shintamainjp | 3:6d3150d4396a | 32 | void sync(void) { |
shintamainjp | 3:6d3150d4396a | 33 | CameraC328::ErrorNumber err = CameraC328::NoError; |
shintamainjp | 3:6d3150d4396a | 34 | |
shintamainjp | 3:6d3150d4396a | 35 | err = camera.sync(); |
shintamainjp | 3:6d3150d4396a | 36 | if (CameraC328::NoError == err) { |
shintamainjp | 3:6d3150d4396a | 37 | serial.printf("[ OK ] : CameraC328::sync\n"); |
shintamainjp | 3:6d3150d4396a | 38 | } else { |
shintamainjp | 3:6d3150d4396a | 39 | serial.printf("[FAIL] : CameraC328::sync (Error=%02X)\n", (int)err); |
shintamainjp | 3:6d3150d4396a | 40 | } |
shintamainjp | 3:6d3150d4396a | 41 | } |
shintamainjp | 3:6d3150d4396a | 42 | |
shintamainjp | 3:6d3150d4396a | 43 | void test_uncompressed_snapshot_picture(void) { |
shintamainjp | 3:6d3150d4396a | 44 | CameraC328::ErrorNumber err = CameraC328::NoError; |
shintamainjp | 3:6d3150d4396a | 45 | |
shintamainjp | 3:6d3150d4396a | 46 | err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64); |
shintamainjp | 3:6d3150d4396a | 47 | if (CameraC328::NoError == err) { |
shintamainjp | 3:6d3150d4396a | 48 | serial.printf("[ OK ] : CameraC328::init\n"); |
shintamainjp | 3:6d3150d4396a | 49 | } else { |
shintamainjp | 3:6d3150d4396a | 50 | serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err); |
shintamainjp | 3:6d3150d4396a | 51 | } |
shintamainjp | 3:6d3150d4396a | 52 | |
shintamainjp | 3:6d3150d4396a | 53 | for (int i = 0; i < 10; i++) { |
shintamainjp | 4:ad06342d4b84 | 54 | err = camera.getUncompressedSnapshotPicture(uncompressed_callback); |
shintamainjp | 3:6d3150d4396a | 55 | if (CameraC328::NoError == err) { |
shintamainjp | 3:6d3150d4396a | 56 | serial.printf("[ OK ] : CameraC328::getUncompressedSnapshotPicture\n"); |
shintamainjp | 3:6d3150d4396a | 57 | } else { |
shintamainjp | 3:6d3150d4396a | 58 | serial.printf("[FAIL] : CameraC328::getUncompressedSnapshotPicture (Error=%02X)\n", (int)err); |
shintamainjp | 3:6d3150d4396a | 59 | } |
shintamainjp | 3:6d3150d4396a | 60 | |
shintamainjp | 3:6d3150d4396a | 61 | char fname[64]; |
shintamainjp | 3:6d3150d4396a | 62 | snprintf(fname, sizeof(fname), "/fs/ucss%04d.ppm", i); |
shintamainjp | 3:6d3150d4396a | 63 | FILE *fp = fopen(fname, "w"); |
shintamainjp | 3:6d3150d4396a | 64 | fprintf(fp, "P3\n"); |
shintamainjp | 3:6d3150d4396a | 65 | fprintf(fp, "%d %d\n", IMG_X, IMG_Y); |
shintamainjp | 3:6d3150d4396a | 66 | fprintf(fp, "%d\n", 255); |
shintamainjp | 3:6d3150d4396a | 67 | for (int y = 0; y < IMG_Y; y++) { |
shintamainjp | 3:6d3150d4396a | 68 | for (int x = 0; x < IMG_X; x++) { |
shintamainjp | 3:6d3150d4396a | 69 | int adrofs = y * (IMG_X * 2) + (x * 2); |
shintamainjp | 3:6d3150d4396a | 70 | uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0); |
shintamainjp | 3:6d3150d4396a | 71 | uint8_t r = ((dat >> 11) & 0x1f) << 3; |
shintamainjp | 3:6d3150d4396a | 72 | uint8_t g = ((dat >> 5) & 0x3f) << 2; |
shintamainjp | 3:6d3150d4396a | 73 | uint8_t b = ((dat >> 0) & 0x1f) << 3; |
shintamainjp | 3:6d3150d4396a | 74 | fprintf(fp,"%d %d %d\n", r, g, b); |
shintamainjp | 3:6d3150d4396a | 75 | } |
shintamainjp | 3:6d3150d4396a | 76 | } |
shintamainjp | 3:6d3150d4396a | 77 | fclose(fp); |
shintamainjp | 3:6d3150d4396a | 78 | } |
shintamainjp | 3:6d3150d4396a | 79 | } |
shintamainjp | 3:6d3150d4396a | 80 | |
shintamainjp | 3:6d3150d4396a | 81 | void test_uncompressed_preview_picture(void) { |
shintamainjp | 3:6d3150d4396a | 82 | CameraC328::ErrorNumber err = CameraC328::NoError; |
shintamainjp | 3:6d3150d4396a | 83 | |
shintamainjp | 3:6d3150d4396a | 84 | err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64); |
shintamainjp | 3:6d3150d4396a | 85 | if (CameraC328::NoError == err) { |
shintamainjp | 3:6d3150d4396a | 86 | serial.printf("[ OK ] : CameraC328::init\n"); |
shintamainjp | 3:6d3150d4396a | 87 | } else { |
shintamainjp | 3:6d3150d4396a | 88 | serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err); |
shintamainjp | 3:6d3150d4396a | 89 | } |
shintamainjp | 3:6d3150d4396a | 90 | |
shintamainjp | 3:6d3150d4396a | 91 | for (int i = 0; i < 10; i++) { |
shintamainjp | 4:ad06342d4b84 | 92 | err = camera.getUncompressedPreviewPicture(uncompressed_callback); |
shintamainjp | 3:6d3150d4396a | 93 | if (CameraC328::NoError == err) { |
shintamainjp | 3:6d3150d4396a | 94 | serial.printf("[ OK ] : CameraC328::getUncompressedPreviewPicture\n"); |
shintamainjp | 3:6d3150d4396a | 95 | } else { |
shintamainjp | 3:6d3150d4396a | 96 | serial.printf("[FAIL] : CameraC328::getUncompressedPreviewPicture (Error=%02X)\n", (int)err); |
shintamainjp | 3:6d3150d4396a | 97 | } |
shintamainjp | 3:6d3150d4396a | 98 | |
shintamainjp | 3:6d3150d4396a | 99 | char fname[64]; |
shintamainjp | 3:6d3150d4396a | 100 | snprintf(fname, sizeof(fname), "/fs/ucpv%04d.ppm", i); |
shintamainjp | 3:6d3150d4396a | 101 | FILE *fp = fopen(fname, "w"); |
shintamainjp | 3:6d3150d4396a | 102 | fprintf(fp, "P3\n"); |
shintamainjp | 3:6d3150d4396a | 103 | fprintf(fp, "%d %d\n", IMG_X, IMG_Y); |
shintamainjp | 3:6d3150d4396a | 104 | fprintf(fp, "%d\n", 255); |
shintamainjp | 3:6d3150d4396a | 105 | for (int y = 0; y < IMG_Y; y++) { |
shintamainjp | 3:6d3150d4396a | 106 | for (int x = 0; x < IMG_X; x++) { |
shintamainjp | 3:6d3150d4396a | 107 | int adrofs = y * (IMG_X * 2) + (x * 2); |
shintamainjp | 3:6d3150d4396a | 108 | uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0); |
shintamainjp | 3:6d3150d4396a | 109 | uint8_t r = ((dat >> 11) & 0x1f) << 3; |
shintamainjp | 3:6d3150d4396a | 110 | uint8_t g = ((dat >> 5) & 0x3f) << 2; |
shintamainjp | 3:6d3150d4396a | 111 | uint8_t b = ((dat >> 0) & 0x1f) << 3; |
shintamainjp | 3:6d3150d4396a | 112 | fprintf(fp,"%d %d %d\n", r, g, b); |
shintamainjp | 3:6d3150d4396a | 113 | } |
shintamainjp | 3:6d3150d4396a | 114 | } |
shintamainjp | 3:6d3150d4396a | 115 | fclose(fp); |
shintamainjp | 3:6d3150d4396a | 116 | } |
shintamainjp | 3:6d3150d4396a | 117 | } |
shintamainjp | 3:6d3150d4396a | 118 | |
shintamainjp | 4:ad06342d4b84 | 119 | void test_jpeg_snapshot_picture(void) { |
shintamainjp | 4:ad06342d4b84 | 120 | CameraC328::ErrorNumber err = CameraC328::NoError; |
shintamainjp | 4:ad06342d4b84 | 121 | |
shintamainjp | 4:ad06342d4b84 | 122 | err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480); |
shintamainjp | 4:ad06342d4b84 | 123 | if (CameraC328::NoError == err) { |
shintamainjp | 4:ad06342d4b84 | 124 | serial.printf("[ OK ] : CameraC328::init\n"); |
shintamainjp | 4:ad06342d4b84 | 125 | } else { |
shintamainjp | 4:ad06342d4b84 | 126 | serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err); |
shintamainjp | 4:ad06342d4b84 | 127 | } |
shintamainjp | 4:ad06342d4b84 | 128 | |
shintamainjp | 4:ad06342d4b84 | 129 | for (int i = 0; i < 10; i++) { |
shintamainjp | 4:ad06342d4b84 | 130 | char fname[64]; |
shintamainjp | 4:ad06342d4b84 | 131 | snprintf(fname, sizeof(fname), "/fs/jpss%04d.jpg", i); |
shintamainjp | 4:ad06342d4b84 | 132 | fp_jpeg = fopen(fname, "w"); |
shintamainjp | 4:ad06342d4b84 | 133 | |
shintamainjp | 4:ad06342d4b84 | 134 | err = camera.getJpegSnapshotPicture(jpeg_callback); |
shintamainjp | 4:ad06342d4b84 | 135 | if (CameraC328::NoError == err) { |
shintamainjp | 4:ad06342d4b84 | 136 | serial.printf("[ OK ] : CameraC328::getJpegSnapshotPicture\n"); |
shintamainjp | 4:ad06342d4b84 | 137 | } else { |
shintamainjp | 4:ad06342d4b84 | 138 | serial.printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\n", (int)err); |
shintamainjp | 4:ad06342d4b84 | 139 | } |
shintamainjp | 4:ad06342d4b84 | 140 | |
shintamainjp | 4:ad06342d4b84 | 141 | fclose(fp_jpeg); |
shintamainjp | 4:ad06342d4b84 | 142 | } |
shintamainjp | 4:ad06342d4b84 | 143 | } |
shintamainjp | 4:ad06342d4b84 | 144 | |
shintamainjp | 4:ad06342d4b84 | 145 | void test_jpeg_preview_picture(void) { |
shintamainjp | 4:ad06342d4b84 | 146 | CameraC328::ErrorNumber err = CameraC328::NoError; |
shintamainjp | 4:ad06342d4b84 | 147 | |
shintamainjp | 4:ad06342d4b84 | 148 | err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480); |
shintamainjp | 4:ad06342d4b84 | 149 | if (CameraC328::NoError == err) { |
shintamainjp | 4:ad06342d4b84 | 150 | serial.printf("[ OK ] : CameraC328::init\n"); |
shintamainjp | 4:ad06342d4b84 | 151 | } else { |
shintamainjp | 4:ad06342d4b84 | 152 | serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err); |
shintamainjp | 4:ad06342d4b84 | 153 | } |
shintamainjp | 4:ad06342d4b84 | 154 | |
shintamainjp | 4:ad06342d4b84 | 155 | for (int i = 0; i < 10; i++) { |
shintamainjp | 4:ad06342d4b84 | 156 | char fname[64]; |
shintamainjp | 4:ad06342d4b84 | 157 | snprintf(fname, sizeof(fname), "/fs/jppv%04d.jpg", i); |
shintamainjp | 4:ad06342d4b84 | 158 | fp_jpeg = fopen(fname, "w"); |
shintamainjp | 4:ad06342d4b84 | 159 | |
shintamainjp | 4:ad06342d4b84 | 160 | err = camera.getJpegPreviewPicture(jpeg_callback); |
shintamainjp | 4:ad06342d4b84 | 161 | if (CameraC328::NoError == err) { |
shintamainjp | 4:ad06342d4b84 | 162 | serial.printf("[ OK ] : CameraC328::getJpegPreviewPicture\n"); |
shintamainjp | 4:ad06342d4b84 | 163 | } else { |
shintamainjp | 4:ad06342d4b84 | 164 | serial.printf("[FAIL] : CameraC328::getJpegPreviewPicture (Error=%02X)\n", (int)err); |
shintamainjp | 4:ad06342d4b84 | 165 | } |
shintamainjp | 4:ad06342d4b84 | 166 | |
shintamainjp | 4:ad06342d4b84 | 167 | fclose(fp_jpeg); |
shintamainjp | 4:ad06342d4b84 | 168 | } |
shintamainjp | 4:ad06342d4b84 | 169 | } |
shintamainjp | 4:ad06342d4b84 | 170 | |
shintamainjp | 3:6d3150d4396a | 171 | int main() { |
shintamainjp | 3:6d3150d4396a | 172 | serial.baud(19200); |
shintamainjp | 3:6d3150d4396a | 173 | serial.printf("\n"); |
shintamainjp | 3:6d3150d4396a | 174 | serial.printf("==========\n"); |
shintamainjp | 3:6d3150d4396a | 175 | serial.printf("CameraC328\n"); |
shintamainjp | 3:6d3150d4396a | 176 | serial.printf("==========\n"); |
shintamainjp | 3:6d3150d4396a | 177 | |
shintamainjp | 3:6d3150d4396a | 178 | sync(); |
shintamainjp | 4:ad06342d4b84 | 179 | #if 0 |
shintamainjp | 3:6d3150d4396a | 180 | test_uncompressed_snapshot_picture(); |
shintamainjp | 3:6d3150d4396a | 181 | test_uncompressed_preview_picture(); |
shintamainjp | 4:ad06342d4b84 | 182 | #endif |
shintamainjp | 4:ad06342d4b84 | 183 | test_jpeg_preview_picture(); |
shintamainjp | 4:ad06342d4b84 | 184 | test_jpeg_snapshot_picture(); |
shintamainjp | 3:6d3150d4396a | 185 | |
shintamainjp | 3:6d3150d4396a | 186 | while (1) { |
shintamainjp | 3:6d3150d4396a | 187 | myled1 = 1; |
shintamainjp | 3:6d3150d4396a | 188 | wait(0.2); |
shintamainjp | 3:6d3150d4396a | 189 | myled1 = 0; |
shintamainjp | 3:6d3150d4396a | 190 | wait(0.2); |
shintamainjp | 3:6d3150d4396a | 191 | myled2 = 1; |
shintamainjp | 3:6d3150d4396a | 192 | wait(0.2); |
shintamainjp | 3:6d3150d4396a | 193 | myled2 = 0; |
shintamainjp | 3:6d3150d4396a | 194 | wait(0.2); |
shintamainjp | 3:6d3150d4396a | 195 | } |
shintamainjp | 3:6d3150d4396a | 196 | } |