CQ出版 Interface記事用サンプル。 トラ技カメラ+FIFOからデータを得て、 エリア判定後、デバイスに保存

Dependencies:   SDFileSystem mbed

Committer:
TETSUYA
Date:
Tue Oct 01 01:55:39 2013 +0000
Revision:
3:8d5594ce5b00
Parent:
2:3aed552f3385
Child:
4:ed062dc75c52
SDFileSystem????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TETSUYA 0:1648bb4e70e5 1 /*
TETSUYA 0:1648bb4e70e5 2 Toragi-CCD-Cam OV7670andFIFO sample use driver
TETSUYA 0:1648bb4e70e5 3
TETSUYA 0:1648bb4e70e5 4 Sadaei Osakabe ( http://mbed.org/users/diasea/ )
TETSUYA 0:1648bb4e70e5 5 http://mbed.org/users/diasea/code/OV7670_with_AL422B_Color_Size_test/
TETSUYA 0:1648bb4e70e5 6
TETSUYA 3:8d5594ce5b00 7 SDFileSystem
TETSUYA 3:8d5594ce5b00 8 http://mbed.org/users/mbed_official/code/SDFileSystem/docs/tip/
TETSUYA 3:8d5594ce5b00 9
TETSUYA 3:8d5594ce5b00 10 mbed_debug.h
TETSUYA 3:8d5594ce5b00 11 https://github.com/adamgreen/SmoothieTest/blob/master/mbed/src/capi/mbed_debug.h
TETSUYA 0:1648bb4e70e5 12 */
TETSUYA 3:8d5594ce5b00 13 #include "mbed.h"
TETSUYA 3:8d5594ce5b00 14 #include "SDFileSystem.h"
TETSUYA 1:c822ea77c7b2 15 #include <string.h>
TETSUYA 1:c822ea77c7b2 16 #include <math.h>
TETSUYA 0:1648bb4e70e5 17 #include <algorithm>
TETSUYA 0:1648bb4e70e5 18 #include "ov7670.h"
TETSUYA 0:1648bb4e70e5 19
TETSUYA 2:3aed552f3385 20
TETSUYA 0:1648bb4e70e5 21 #define QQVGA
TETSUYA 0:1648bb4e70e5 22 #ifdef QQVGA
TETSUYA 0:1648bb4e70e5 23 # define SIZEX (160)
TETSUYA 0:1648bb4e70e5 24 # define SIZEY (120)
TETSUYA 0:1648bb4e70e5 25 #else
TETSUYA 0:1648bb4e70e5 26 # define SIZEX (320)
TETSUYA 0:1648bb4e70e5 27 # define SIZEY (240)
TETSUYA 0:1648bb4e70e5 28 #endif
TETSUYA 0:1648bb4e70e5 29
TETSUYA 3:8d5594ce5b00 30 int create_header(FILE *fp, int width, int height) ;
TETSUYA 3:8d5594ce5b00 31
TETSUYA 3:8d5594ce5b00 32 #define FILEHEADERSIZE 14 //ファイルヘッダのサイズ
TETSUYA 3:8d5594ce5b00 33 #define INFOHEADERSIZE 40 //情報ヘッダのサイズ
TETSUYA 3:8d5594ce5b00 34 #define HEADERSIZE (FILEHEADERSIZE+INFOHEADERSIZE)
TETSUYA 3:8d5594ce5b00 35
TETSUYA 3:8d5594ce5b00 36
TETSUYA 0:1648bb4e70e5 37 OV7670 camera(
TETSUYA 0:1648bb4e70e5 38 p28,p27, // SDA,SCL(I2C / SCCB)
TETSUYA 0:1648bb4e70e5 39 p25,p26,p29, // VSYNC,HREF,WEN(FIFO)
TETSUYA 0:1648bb4e70e5 40 p24,p23,p22,p21,p20,p19,p18,p17, // D7-D0
TETSUYA 0:1648bb4e70e5 41 p5,p6,p7) ; // RRST,OE,RCLK
TETSUYA 0:1648bb4e70e5 42
TETSUYA 3:8d5594ce5b00 43
TETSUYA 0:1648bb4e70e5 44
TETSUYA 3:8d5594ce5b00 45 SDFileSystem sd(p11, p12, p13, p14, "sd"); // mosi, miso, sclk, cs
TETSUYA 0:1648bb4e70e5 46
TETSUYA 0:1648bb4e70e5 47 LocalFileSystem local("local");
TETSUYA 2:3aed552f3385 48 BusOut myleds(LED1, LED2, LED3, LED4);
TETSUYA 2:3aed552f3385 49
TETSUYA 0:1648bb4e70e5 50 Serial pc(USBTX,USBRX) ;
TETSUYA 0:1648bb4e70e5 51
TETSUYA 0:1648bb4e70e5 52 int sizex = 0;
TETSUYA 0:1648bb4e70e5 53 int sizey = 0;
TETSUYA 3:8d5594ce5b00 54 int FileNo = 0;
TETSUYA 0:1648bb4e70e5 55
TETSUYA 1:c822ea77c7b2 56 #define AREA_X 32
TETSUYA 1:c822ea77c7b2 57 #define AREA_Y 24
TETSUYA 2:3aed552f3385 58 #define AREA_DIV_X 5
TETSUYA 2:3aed552f3385 59 #define AREA_DIV_Y 5
TETSUYA 2:3aed552f3385 60 //#define AREA_THRESH 12000
TETSUYA 3:8d5594ce5b00 61 #define AREA_THRESH 5000
TETSUYA 2:3aed552f3385 62
TETSUYA 1:c822ea77c7b2 63
TETSUYA 3:8d5594ce5b00 64 char canvas[SIZEX][SIZEY] ; //18.5KB [0]gray [1]Median
TETSUYA 3:8d5594ce5b00 65 signed short AreaDiff[2][AREA_DIV_X][AREA_DIV_Y]; // 5x5 Area = 32x24dot Each Block
TETSUYA 1:c822ea77c7b2 66 int face_bank = 0;
TETSUYA 2:3aed552f3385 67 int Dbmode = 0;
TETSUYA 3:8d5594ce5b00 68 void MedianFilter(void);
TETSUYA 3:8d5594ce5b00 69 void SaveBMP(void);
TETSUYA 3:8d5594ce5b00 70 void SearchNewFileNo();
TETSUYA 1:c822ea77c7b2 71
TETSUYA 0:1648bb4e70e5 72
TETSUYA 0:1648bb4e70e5 73 int main() {
TETSUYA 0:1648bb4e70e5 74 char color_format = 0;
TETSUYA 0:1648bb4e70e5 75 char c;
TETSUYA 1:c822ea77c7b2 76 int d1,d2 ;
TETSUYA 0:1648bb4e70e5 77 int mx, pixel , i;
TETSUYA 1:c822ea77c7b2 78 int pixc, pixelg;
TETSUYA 1:c822ea77c7b2 79 int sort[3];
TETSUYA 1:c822ea77c7b2 80 int ay = 0;
TETSUYA 3:8d5594ce5b00 81 char UseMedian = 0;
TETSUYA 1:c822ea77c7b2 82
TETSUYA 1:c822ea77c7b2 83 memset( AreaDiff, '\0', sizeof(AreaDiff));
TETSUYA 1:c822ea77c7b2 84
TETSUYA 0:1648bb4e70e5 85 pc.baud(115200);
TETSUYA 0:1648bb4e70e5 86 RESJMP:
TETSUYA 0:1648bb4e70e5 87 //pc.printf("Camera resetting..\r\n");
TETSUYA 0:1648bb4e70e5 88 camera.Reset();
TETSUYA 0:1648bb4e70e5 89
TETSUYA 0:1648bb4e70e5 90 //pc.printf("Before Init...\r\n");
TETSUYA 0:1648bb4e70e5 91 //camera.PrintRegister();
TETSUYA 0:1648bb4e70e5 92 switch( color_format ){
TETSUYA 0:1648bb4e70e5 93 case '1':
TETSUYA 0:1648bb4e70e5 94 camera.InitRGB444();
TETSUYA 0:1648bb4e70e5 95 break;
TETSUYA 0:1648bb4e70e5 96 case '2':
TETSUYA 0:1648bb4e70e5 97 camera.InitRGB555();
TETSUYA 0:1648bb4e70e5 98 break;
TETSUYA 0:1648bb4e70e5 99 default:
TETSUYA 0:1648bb4e70e5 100 camera.InitRGB565();
TETSUYA 0:1648bb4e70e5 101 break;
TETSUYA 0:1648bb4e70e5 102 }
TETSUYA 0:1648bb4e70e5 103
TETSUYA 0:1648bb4e70e5 104 //sizex = 160;
TETSUYA 0:1648bb4e70e5 105 //sizey = 120;
TETSUYA 0:1648bb4e70e5 106 camera.InitQQVGA();
TETSUYA 0:1648bb4e70e5 107
TETSUYA 0:1648bb4e70e5 108 camera.InitForFIFOWriteReset();
TETSUYA 0:1648bb4e70e5 109 camera.InitDefaultReg(true, true); // flipv/flipH
TETSUYA 0:1648bb4e70e5 110
TETSUYA 0:1648bb4e70e5 111 //pc.printf("After Init...\r\n");
TETSUYA 0:1648bb4e70e5 112 //camera.PrintRegister();
TETSUYA 3:8d5594ce5b00 113 SearchNewFileNo();
TETSUYA 3:8d5594ce5b00 114
TETSUYA 0:1648bb4e70e5 115
TETSUYA 0:1648bb4e70e5 116 // CAPTURE and SEND LOOP
TETSUYA 0:1648bb4e70e5 117 while(1)
TETSUYA 0:1648bb4e70e5 118 {
TETSUYA 1:c822ea77c7b2 119 memset( &AreaDiff[face_bank], '\0', sizeof(AreaDiff[face_bank]));
TETSUYA 2:3aed552f3385 120 if ( Dbmode ){
TETSUYA 2:3aed552f3385 121 pc.printf("Hit Any Key to send RGBx160x120 Capture Data.\r\n") ;
TETSUYA 2:3aed552f3385 122 while(!pc.readable()) ;
TETSUYA 2:3aed552f3385 123 c = pc.getc() ;
TETSUYA 2:3aed552f3385 124 if (( c == '1' )|| ( c == '2' )||( c == '3' )){
TETSUYA 2:3aed552f3385 125 color_format = c;
TETSUYA 2:3aed552f3385 126 goto RESJMP;
TETSUYA 2:3aed552f3385 127 }else if (( c == 'd' )|| ( c == 'D' )){
TETSUYA 2:3aed552f3385 128 Dbmode = 0; // GO FreeRun
TETSUYA 2:3aed552f3385 129 continue;
TETSUYA 3:8d5594ce5b00 130 }else if ( ( c== 'm')||( c== 'M')) {
TETSUYA 3:8d5594ce5b00 131 UseMedian = 1;
TETSUYA 3:8d5594ce5b00 132 continue;
TETSUYA 3:8d5594ce5b00 133 }else if ( ( c== 'n')||( c== 'N')) {
TETSUYA 3:8d5594ce5b00 134 UseMedian = 0;
TETSUYA 3:8d5594ce5b00 135 continue;
TETSUYA 3:8d5594ce5b00 136 }else if ( ( c== 's')||( c== 'S')) {
TETSUYA 3:8d5594ce5b00 137 SaveBMP();
TETSUYA 3:8d5594ce5b00 138 continue;
TETSUYA 2:3aed552f3385 139 }
TETSUYA 2:3aed552f3385 140 }else{
TETSUYA 2:3aed552f3385 141 if ( pc.readable()) {
TETSUYA 2:3aed552f3385 142 c = pc.getc() ;
TETSUYA 2:3aed552f3385 143 if (( c == 'd' )|| ( c == 'D' )){
TETSUYA 2:3aed552f3385 144 Dbmode = 1; // GO DEBUGmode
TETSUYA 2:3aed552f3385 145 continue;
TETSUYA 3:8d5594ce5b00 146 }else if ( ( c== 'm')||( c== 'M')) {
TETSUYA 3:8d5594ce5b00 147 UseMedian = 1;
TETSUYA 3:8d5594ce5b00 148 continue;
TETSUYA 3:8d5594ce5b00 149 }else if ( ( c== 'n')||( c== 'N')) {
TETSUYA 3:8d5594ce5b00 150 UseMedian = 0;
TETSUYA 3:8d5594ce5b00 151 continue;
TETSUYA 2:3aed552f3385 152 }
TETSUYA 2:3aed552f3385 153 }
TETSUYA 2:3aed552f3385 154 pc.printf(" \r\n") ;
TETSUYA 0:1648bb4e70e5 155 }
TETSUYA 0:1648bb4e70e5 156 camera.CaptureNext(); // sample start!
TETSUYA 0:1648bb4e70e5 157 while(camera.CaptureDone() == false);
TETSUYA 0:1648bb4e70e5 158 camera.ReadStart();
TETSUYA 0:1648bb4e70e5 159 pixc = 0;
TETSUYA 1:c822ea77c7b2 160 ay = 0;
TETSUYA 0:1648bb4e70e5 161 for (int y = 0;y < SIZEY;y++) {
TETSUYA 1:c822ea77c7b2 162 ay = y / AREA_Y;
TETSUYA 0:1648bb4e70e5 163 for (int x = 0;x < SIZEX;x++) {
TETSUYA 0:1648bb4e70e5 164 d1 = camera.ReadOneByte() ; // upper nibble is XXX , lower nibble is B
TETSUYA 0:1648bb4e70e5 165 d2 = camera.ReadOneByte() ; // upper nibble is G , lower nibble is R
TETSUYA 0:1648bb4e70e5 166 pixel = ((unsigned int)d2 << 8) + ((unsigned int)d1 & 0xff);
TETSUYA 1:c822ea77c7b2 167
TETSUYA 1:c822ea77c7b2 168 // Make GrayScale
TETSUYA 1:c822ea77c7b2 169 // make 6bit Code on Each Color
TETSUYA 1:c822ea77c7b2 170 sort[0] = ((pixel >> 11) & 0x1f)<<1; // r
TETSUYA 1:c822ea77c7b2 171 sort[1] = ((pixel >> 5) & 0x3f); // g
TETSUYA 1:c822ea77c7b2 172 sort[2] = ((pixel ) & 0x1f)<<1; // b
TETSUYA 1:c822ea77c7b2 173
TETSUYA 1:c822ea77c7b2 174 int max = 0, min = 0xffff;
TETSUYA 1:c822ea77c7b2 175 for (int i=0;i<3;i++){
TETSUYA 1:c822ea77c7b2 176 if (sort[i] > max) max = sort[i];
TETSUYA 1:c822ea77c7b2 177 if (sort[i] < min) min = sort[i];
TETSUYA 1:c822ea77c7b2 178 }
TETSUYA 1:c822ea77c7b2 179 int gray = ((max + min) / 2) ;
TETSUYA 1:c822ea77c7b2 180
TETSUYA 1:c822ea77c7b2 181 pixelg = ((gray>>1)<<11) + (gray<<5) + (gray>>1);
TETSUYA 1:c822ea77c7b2 182 pixel = pixelg;
TETSUYA 2:3aed552f3385 183 canvas[x][y] = (char)( gray ) & 0x3f; // 6bit gray scale
TETSUYA 1:c822ea77c7b2 184
TETSUYA 1:c822ea77c7b2 185 // Make Difference AreaData
TETSUYA 2:3aed552f3385 186 //AreaDiff[face_bank][x/AREA_X][ay] += ( gray << 2 ); // 8bit scaler!
TETSUYA 2:3aed552f3385 187 AreaDiff[face_bank][x/AREA_X][ay] += ( gray ); // 6bit scaler!
TETSUYA 1:c822ea77c7b2 188
TETSUYA 2:3aed552f3385 189 if ( Dbmode ){
TETSUYA 2:3aed552f3385 190 // send <CRLF> and Count on each 16dot.
TETSUYA 2:3aed552f3385 191 if ( !(x%16) ){
TETSUYA 2:3aed552f3385 192 pc.printf("\r\n%04x: ",pixc ) ;
TETSUYA 2:3aed552f3385 193 pixc +=16;
TETSUYA 2:3aed552f3385 194 }
TETSUYA 2:3aed552f3385 195 pc.printf("%04x ",pixel) ;
TETSUYA 0:1648bb4e70e5 196 }
TETSUYA 0:1648bb4e70e5 197 }
TETSUYA 0:1648bb4e70e5 198 }
TETSUYA 0:1648bb4e70e5 199 camera.ReadStop();
TETSUYA 3:8d5594ce5b00 200 /*
TETSUYA 3:8d5594ce5b00 201 if ( UseMedian ){
TETSUYA 3:8d5594ce5b00 202 MedianFilter();
TETSUYA 3:8d5594ce5b00 203 }
TETSUYA 3:8d5594ce5b00 204 */
TETSUYA 1:c822ea77c7b2 205
TETSUYA 1:c822ea77c7b2 206 // Difference Check!!
TETSUYA 1:c822ea77c7b2 207 pc.printf("\r\n" ) ;
TETSUYA 2:3aed552f3385 208
TETSUYA 2:3aed552f3385 209 int err_c=0;
TETSUYA 1:c822ea77c7b2 210 int backArea = ( face_bank + 1 )&0x01;
TETSUYA 2:3aed552f3385 211 for (int y = 0; y < AREA_DIV_Y; y++) {
TETSUYA 2:3aed552f3385 212 if ( Dbmode ) pc.printf("Diff: " ) ;
TETSUYA 2:3aed552f3385 213
TETSUYA 2:3aed552f3385 214 for (int x = 0; x < AREA_DIV_X; x++) {
TETSUYA 1:c822ea77c7b2 215 int dif = abs( AreaDiff[backArea][x][y] - AreaDiff[face_bank][x][y] );
TETSUYA 2:3aed552f3385 216 if (dif >= AREA_THRESH) {
TETSUYA 2:3aed552f3385 217 err_c++; // Error Count
TETSUYA 2:3aed552f3385 218
TETSUYA 3:8d5594ce5b00 219 if ( Dbmode ) pc.printf("X%6d " , dif) ;
TETSUYA 1:c822ea77c7b2 220 }else{
TETSUYA 3:8d5594ce5b00 221 if ( Dbmode ) pc.printf("O%6d " , dif) ;
TETSUYA 1:c822ea77c7b2 222 }
TETSUYA 1:c822ea77c7b2 223 }
TETSUYA 2:3aed552f3385 224 if ( Dbmode ) {
TETSUYA 3:8d5594ce5b00 225 pc.printf(" " ) ;
TETSUYA 2:3aed552f3385 226 pc.printf(" \r\n" ) ;
TETSUYA 2:3aed552f3385 227 }
TETSUYA 1:c822ea77c7b2 228 }
TETSUYA 2:3aed552f3385 229 int led_s =0;
TETSUYA 2:3aed552f3385 230 switch ( err_c ){
TETSUYA 2:3aed552f3385 231 case 1:
TETSUYA 2:3aed552f3385 232 led_s =1;
TETSUYA 2:3aed552f3385 233 break;
TETSUYA 2:3aed552f3385 234 case 2:
TETSUYA 2:3aed552f3385 235 led_s =3;
TETSUYA 2:3aed552f3385 236 break;
TETSUYA 2:3aed552f3385 237 case 3:
TETSUYA 2:3aed552f3385 238 led_s =7;
TETSUYA 2:3aed552f3385 239 break;
TETSUYA 2:3aed552f3385 240 default:
TETSUYA 2:3aed552f3385 241 if ( err_c >= 3) {
TETSUYA 2:3aed552f3385 242 led_s =7;
TETSUYA 2:3aed552f3385 243 }else{
TETSUYA 2:3aed552f3385 244 led_s =0;
TETSUYA 2:3aed552f3385 245 }
TETSUYA 2:3aed552f3385 246 break;
TETSUYA 2:3aed552f3385 247 }
TETSUYA 2:3aed552f3385 248
TETSUYA 2:3aed552f3385 249 led_s |= ( face_bank )? 0x08 : 0x00 ;
TETSUYA 2:3aed552f3385 250 myleds = led_s ;
TETSUYA 2:3aed552f3385 251 if ( err_c >= 3 ){
TETSUYA 2:3aed552f3385 252 //pc.printf("\r\n") ;
TETSUYA 3:8d5594ce5b00 253 if ( Dbmode ){
TETSUYA 3:8d5594ce5b00 254 pixc = 0;
TETSUYA 3:8d5594ce5b00 255 for (int y = 0;y < SIZEY;y++) {
TETSUYA 3:8d5594ce5b00 256 for (int x = 0;x < SIZEX;x++) {
TETSUYA 3:8d5594ce5b00 257 char gray = 0;
TETSUYA 3:8d5594ce5b00 258 gray = canvas[x][y];
TETSUYA 3:8d5594ce5b00 259 pixel = ((gray>>1)<<11) + (gray<<5) + (gray>>1);
TETSUYA 3:8d5594ce5b00 260
TETSUYA 3:8d5594ce5b00 261 // send <CRLF> and Count on each 16dot.
TETSUYA 3:8d5594ce5b00 262 if ( !(x%16) ){
TETSUYA 3:8d5594ce5b00 263 pc.printf("\r\n%04x: ",pixc ) ;
TETSUYA 3:8d5594ce5b00 264 pixc +=16;
TETSUYA 3:8d5594ce5b00 265 }
TETSUYA 3:8d5594ce5b00 266 pc.printf("%04x ",pixel) ;
TETSUYA 2:3aed552f3385 267 }
TETSUYA 2:3aed552f3385 268 }
TETSUYA 2:3aed552f3385 269 }
TETSUYA 3:8d5594ce5b00 270 SaveBMP();
TETSUYA 3:8d5594ce5b00 271
TETSUYA 2:3aed552f3385 272 }
TETSUYA 2:3aed552f3385 273 face_bank++;
TETSUYA 2:3aed552f3385 274 face_bank&=0x01;
TETSUYA 2:3aed552f3385 275
TETSUYA 2:3aed552f3385 276
TETSUYA 2:3aed552f3385 277 //pc.printf("\r\n") ;
TETSUYA 2:3aed552f3385 278 }
TETSUYA 2:3aed552f3385 279 }
TETSUYA 2:3aed552f3385 280
TETSUYA 3:8d5594ce5b00 281 void MedianFilter(void)
TETSUYA 3:8d5594ce5b00 282 {
TETSUYA 3:8d5594ce5b00 283 int sortM[9] = { 0 };
TETSUYA 3:8d5594ce5b00 284 int p;
TETSUYA 3:8d5594ce5b00 285 int ay;
TETSUYA 2:3aed552f3385 286
TETSUYA 3:8d5594ce5b00 287 // Median Filter
TETSUYA 3:8d5594ce5b00 288 memset( &AreaDiff[face_bank], '\0', sizeof(AreaDiff[face_bank]));
TETSUYA 3:8d5594ce5b00 289 ay = 0;
TETSUYA 3:8d5594ce5b00 290 for (int y = 1;y < SIZEY-1;y++) {
TETSUYA 3:8d5594ce5b00 291 for (int x = 1;x < SIZEX-1;x++) {
TETSUYA 3:8d5594ce5b00 292 p=0;
TETSUYA 1:c822ea77c7b2 293
TETSUYA 3:8d5594ce5b00 294 // Get Around Pixels
TETSUYA 3:8d5594ce5b00 295 for (int k = -1; k < 2; k++) {
TETSUYA 3:8d5594ce5b00 296 for (int j = -1; j < 2; j++) {
TETSUYA 3:8d5594ce5b00 297 sortM[p++] = canvas[x+j][y+k]; //grayscale data
TETSUYA 1:c822ea77c7b2 298 }
TETSUYA 3:8d5594ce5b00 299 }
TETSUYA 3:8d5594ce5b00 300 // sort now...
TETSUYA 3:8d5594ce5b00 301 for (int k = 0; k < 8; k++){
TETSUYA 3:8d5594ce5b00 302 for (int j = 8; j > k; j--) {
TETSUYA 3:8d5594ce5b00 303 if (sortM[j] < sortM[j - 1]) {
TETSUYA 3:8d5594ce5b00 304 int dmy = sortM[j];
TETSUYA 3:8d5594ce5b00 305 sortM[j] = sortM[j - 1];
TETSUYA 3:8d5594ce5b00 306 sortM[j - 1] = dmy;
TETSUYA 1:c822ea77c7b2 307 }
TETSUYA 1:c822ea77c7b2 308 }
TETSUYA 3:8d5594ce5b00 309 }
TETSUYA 1:c822ea77c7b2 310
TETSUYA 3:8d5594ce5b00 311 canvas[x][y] = sortM[4]; // Center Data!
TETSUYA 3:8d5594ce5b00 312 AreaDiff[face_bank][x/AREA_X][ay] += ( canvas[x][y] ); // 6bit scaler!
TETSUYA 3:8d5594ce5b00 313 }
TETSUYA 3:8d5594ce5b00 314 }
TETSUYA 3:8d5594ce5b00 315 }
TETSUYA 3:8d5594ce5b00 316
TETSUYA 3:8d5594ce5b00 317 //char *filebase = "/local/Bmap";
TETSUYA 3:8d5594ce5b00 318 char *filebase = "/sd/Bmap";
TETSUYA 3:8d5594ce5b00 319
TETSUYA 3:8d5594ce5b00 320 void SearchNewFileNo()
TETSUYA 3:8d5594ce5b00 321 {
TETSUYA 3:8d5594ce5b00 322 FILE *fp;
TETSUYA 3:8d5594ce5b00 323 char filename[30] ;
TETSUYA 3:8d5594ce5b00 324 while( 1 ){
TETSUYA 3:8d5594ce5b00 325 sprintf( filename, "%s%04d.bmp", filebase , FileNo);
TETSUYA 3:8d5594ce5b00 326 if((fp = fopen(filename, "rb")) == NULL){
TETSUYA 3:8d5594ce5b00 327 pc.printf("%s is not Exist.", filename);
TETSUYA 3:8d5594ce5b00 328 return ;
TETSUYA 3:8d5594ce5b00 329 }else{
TETSUYA 3:8d5594ce5b00 330 pc.printf("%s is Exist. Increment no...", filename);
TETSUYA 3:8d5594ce5b00 331 fclose(fp);
TETSUYA 3:8d5594ce5b00 332 FileNo++;
TETSUYA 1:c822ea77c7b2 333 }
TETSUYA 3:8d5594ce5b00 334 }
TETSUYA 3:8d5594ce5b00 335
TETSUYA 3:8d5594ce5b00 336
TETSUYA 3:8d5594ce5b00 337
TETSUYA 3:8d5594ce5b00 338 }
TETSUYA 3:8d5594ce5b00 339
TETSUYA 3:8d5594ce5b00 340 void SaveBMP(void)
TETSUYA 3:8d5594ce5b00 341 {
TETSUYA 3:8d5594ce5b00 342 unsigned char gray8;
TETSUYA 3:8d5594ce5b00 343 unsigned char bmp_line_data[SIZEX*3]; //画像1行分のRGB情報を格納する
TETSUYA 3:8d5594ce5b00 344 int back ;
TETSUYA 3:8d5594ce5b00 345 FILE *fp;
TETSUYA 3:8d5594ce5b00 346 char filename[30] ;
TETSUYA 1:c822ea77c7b2 347
TETSUYA 3:8d5594ce5b00 348 sprintf( filename, "%s%04d.bmp", filebase , FileNo);
TETSUYA 3:8d5594ce5b00 349 FileNo++;
TETSUYA 3:8d5594ce5b00 350 back = myleds;
TETSUYA 3:8d5594ce5b00 351
TETSUYA 3:8d5594ce5b00 352 myleds = 0xff;
TETSUYA 3:8d5594ce5b00 353 if((fp = fopen(filename, "wb")) == NULL){
TETSUYA 3:8d5594ce5b00 354 pc.printf("Error: %s could not open.", filename);
TETSUYA 3:8d5594ce5b00 355 return ;
TETSUYA 3:8d5594ce5b00 356 }
TETSUYA 0:1648bb4e70e5 357
TETSUYA 3:8d5594ce5b00 358 // Make BITMAPHEADER to FileHead.
TETSUYA 3:8d5594ce5b00 359 create_header(fp, SIZEX, SIZEY);
TETSUYA 3:8d5594ce5b00 360
TETSUYA 3:8d5594ce5b00 361 for (int y=0; y<SIZEY; y++) {
TETSUYA 3:8d5594ce5b00 362 for (int x=0; x<SIZEX; x++) {
TETSUYA 3:8d5594ce5b00 363 // RGB888
TETSUYA 3:8d5594ce5b00 364 gray8 = (unsigned char)(canvas[x][y] << 2); //grayscale data 6bit
TETSUYA 0:1648bb4e70e5 365
TETSUYA 3:8d5594ce5b00 366 bmp_line_data[x*3] = (unsigned char)gray8; // b
TETSUYA 3:8d5594ce5b00 367 bmp_line_data[x*3 + 1] = (unsigned char)gray8; // g
TETSUYA 3:8d5594ce5b00 368 bmp_line_data[x*3 + 2] = (unsigned char)gray8; // r
TETSUYA 3:8d5594ce5b00 369 }
TETSUYA 3:8d5594ce5b00 370 fwrite(bmp_line_data, sizeof(unsigned char), sizeof(bmp_line_data), fp);
TETSUYA 3:8d5594ce5b00 371 }
TETSUYA 3:8d5594ce5b00 372 fclose(fp);
TETSUYA 3:8d5594ce5b00 373
TETSUYA 3:8d5594ce5b00 374 myleds = back ;
TETSUYA 3:8d5594ce5b00 375 }
TETSUYA 3:8d5594ce5b00 376
TETSUYA 0:1648bb4e70e5 377
TETSUYA 0:1648bb4e70e5 378 int create_header(FILE *fp, int width, int height) {
TETSUYA 0:1648bb4e70e5 379 int real_width;
TETSUYA 0:1648bb4e70e5 380 unsigned char header_buf[HEADERSIZE]; //ヘッダを格納する
TETSUYA 0:1648bb4e70e5 381 unsigned int file_size;
TETSUYA 0:1648bb4e70e5 382 unsigned int offset_to_data;
TETSUYA 0:1648bb4e70e5 383 unsigned long info_header_size;
TETSUYA 0:1648bb4e70e5 384 unsigned int planes;
TETSUYA 0:1648bb4e70e5 385 unsigned int color;
TETSUYA 0:1648bb4e70e5 386 unsigned long compress;
TETSUYA 0:1648bb4e70e5 387 unsigned long data_size;
TETSUYA 0:1648bb4e70e5 388 long xppm;
TETSUYA 0:1648bb4e70e5 389 long yppm;
TETSUYA 0:1648bb4e70e5 390
TETSUYA 0:1648bb4e70e5 391 real_width = width*3 + width%4;
TETSUYA 0:1648bb4e70e5 392
TETSUYA 0:1648bb4e70e5 393 //ここからヘッダ作成
TETSUYA 0:1648bb4e70e5 394 file_size = height * real_width + HEADERSIZE;
TETSUYA 0:1648bb4e70e5 395 offset_to_data = HEADERSIZE;
TETSUYA 0:1648bb4e70e5 396 info_header_size = INFOHEADERSIZE;
TETSUYA 0:1648bb4e70e5 397 planes = 1;
TETSUYA 0:1648bb4e70e5 398 color = 24;
TETSUYA 0:1648bb4e70e5 399 compress = 0;
TETSUYA 0:1648bb4e70e5 400 data_size = height * real_width;
TETSUYA 0:1648bb4e70e5 401 xppm = 1;
TETSUYA 0:1648bb4e70e5 402 yppm = 1;
TETSUYA 0:1648bb4e70e5 403
TETSUYA 0:1648bb4e70e5 404 header_buf[0] = 'B';
TETSUYA 0:1648bb4e70e5 405 header_buf[1] = 'M';
TETSUYA 0:1648bb4e70e5 406 memcpy(header_buf + 2, &file_size, sizeof(file_size));
TETSUYA 0:1648bb4e70e5 407 header_buf[6] = 0;
TETSUYA 0:1648bb4e70e5 408 header_buf[7] = 0;
TETSUYA 0:1648bb4e70e5 409 header_buf[8] = 0;
TETSUYA 0:1648bb4e70e5 410 header_buf[9] = 0;
TETSUYA 0:1648bb4e70e5 411 memcpy(header_buf + 10, &offset_to_data, sizeof(offset_to_data));
TETSUYA 0:1648bb4e70e5 412 memcpy(header_buf + 14, &info_header_size, sizeof(info_header_size));
TETSUYA 0:1648bb4e70e5 413 memcpy(header_buf + 18, &width, sizeof(width));
TETSUYA 0:1648bb4e70e5 414 height = height * -1; // データ格納順が逆なので、高さをマイナスとしている
TETSUYA 0:1648bb4e70e5 415 memcpy(header_buf + 22, &height, sizeof(height));
TETSUYA 0:1648bb4e70e5 416 memcpy(header_buf + 26, &planes, sizeof(planes));
TETSUYA 0:1648bb4e70e5 417 memcpy(header_buf + 28, &color, sizeof(color));
TETSUYA 0:1648bb4e70e5 418 memcpy(header_buf + 30, &compress, sizeof(compress));
TETSUYA 0:1648bb4e70e5 419 memcpy(header_buf + 34, &data_size, sizeof(data_size));
TETSUYA 0:1648bb4e70e5 420 memcpy(header_buf + 38, &xppm, sizeof(xppm));
TETSUYA 0:1648bb4e70e5 421 memcpy(header_buf + 42, &yppm, sizeof(yppm));
TETSUYA 0:1648bb4e70e5 422 header_buf[46] = 0;
TETSUYA 0:1648bb4e70e5 423 header_buf[47] = 0;
TETSUYA 0:1648bb4e70e5 424 header_buf[48] = 0;
TETSUYA 0:1648bb4e70e5 425 header_buf[49] = 0;
TETSUYA 0:1648bb4e70e5 426 header_buf[50] = 0;
TETSUYA 0:1648bb4e70e5 427 header_buf[51] = 0;
TETSUYA 0:1648bb4e70e5 428 header_buf[52] = 0;
TETSUYA 0:1648bb4e70e5 429 header_buf[53] = 0;
TETSUYA 0:1648bb4e70e5 430
TETSUYA 0:1648bb4e70e5 431 //ヘッダの書き込み
TETSUYA 0:1648bb4e70e5 432 fwrite(header_buf, sizeof(unsigned char), HEADERSIZE, fp);
TETSUYA 0:1648bb4e70e5 433
TETSUYA 0:1648bb4e70e5 434 return 0;
TETSUYA 0:1648bb4e70e5 435 }
TETSUYA 3:8d5594ce5b00 436