MARMEX_VB test application program. This application works on "mbed NXP LPC1768" only. This application expects to have the MARMEX_VB module on a "MAPLE mini type-B (MARM03-BASE)" baseboard (slot2) with MARMEX_OB module (on slot1)
Dependencies: MARMEX_VB NokiaLCD mbed
main.cpp
00001 /** Test program for MARMEX_VB Camera control library 00002 * 00003 * @version 0.4 00004 * @date 20-Jun-2014 00005 * 00006 * Released under the Apache License, Version 2.0 : http://mbed.org/handbook/Apache-Licence 00007 * 00008 * Test program for MARMEX_VB Camera control library 00009 * 00010 * ** This program runs on mbed_NXP_LPC1768 only ** 00011 */ 00012 00013 00014 #include "mbed.h" 00015 #include "MARMEX_OB_oled.h" 00016 #include "MARMEX_VB.h" 00017 #include "bmp_handler.h" 00018 00019 // Baseboard type selection 00020 #define BASEBOARD_MAPLE_MINI_TYPE_B 00021 //#define BASEBOARD_MAPLE_ORIGINAL 00022 00023 #ifdef BASEBOARD_MAPLE_MINI_TYPE_B 00024 MARMEX_OB_oled oled1( p5, p7, p20, p16, p15 ); 00025 // mosi, sclk, cs, rst, power_control -- maple-mini-type-b-board-slot1 00026 MARMEX_VB camera( p5, p6, p7, p22, p26, p28, p27 ); 00027 // mosi, miso, sclk, cs, reset, sda, scl -- maple-mini-type-b-board-slot2 00028 #endif 00029 00030 #ifdef BASEBOARD_MAPLE_ORIGINAL 00031 MARMEX_OB_oled oled1( p5, p7, p8, p30, p11 ); 00032 // mosi, sclk, cs, rst, power_control -- maple-board-slot1 00033 MARMEX_VB camera( p5, p6, p7, p26, p17, p28, p27 ); 00034 // mosi, miso, sclk, cs, reset, sda, scl -- maple-board-slot2 00035 #endif 00036 00037 BusOut led( LED4, LED3, LED2, LED1 ); 00038 Timer timer; 00039 Timer looptimer; 00040 00041 00042 void test_camera( void ); 00043 void test_camera_resolution_change( void ); 00044 00045 void copy_image_from_camera_to_oled( void ); 00046 void copy_image_from_camera_to_oled_small( void ); 00047 void copy_image_from_camera_to_oled_interlaced( void ); 00048 void line_mirroring( short *buf ); 00049 void save_still_image( char *file_name ); 00050 void oled_test_screen( void ); 00051 void capture_to_bmp( void ); 00052 00053 //#define SAVE_EACH_SIZES_OF_STILL_IMAGE 00054 00055 alpha_param ap; 00056 00057 00058 int main() 00059 { 00060 printf( "\r\n\r\nMARY-CAMERA test program\r\n\r\n" ); 00061 00062 read_alpha_BMP( "alpha.bmp", &ap ); 00063 00064 00065 led = 0x3; 00066 00067 oled1.cls(); 00068 oled_test_screen(); 00069 oled1.cls(); 00070 00071 #ifdef SAVE_EACH_SIZES_OF_STILL_IMAGE 00072 led = 0x1; 00073 camera.resolution( MARMEX_VB::QCIF ); 00074 save_still_image( "i_qcif.bmp" ); 00075 00076 led = 0x2; 00077 camera.resolution( MARMEX_VB::QQVGA ); 00078 save_still_image( "i_qqvga.bmp" ); 00079 00080 led = 0x4; 00081 camera.resolution( MARMEX_VB::QVGA ); 00082 save_still_image( "i_qvga.bmp" ); 00083 00084 led = 0x8; 00085 camera.resolution( MARMEX_VB::VGA ); 00086 save_still_image( "i_vga.bmp" ); 00087 00088 camera.resolution( MARMEX_VB::QCIF ); 00089 #endif 00090 00091 printf( " camera operation started\r\n" ); 00092 printf( " hit key [c] for saving data into BMP (for blue-mbed only)\r\n" ); 00093 printf( " hit key [o] to change data reading order\r\n" ); 00094 printf( " hit key [i] to toggle interlace mode\r\n" ); 00095 printf( " hit key [1], [2], [3] or [4] to change resolution QCIF, QQVGA, QVGA, VGA\r\n" ); 00096 00097 looptimer.start(); 00098 00099 timer.start(); // timer for measureing frame rate 00100 test_camera(); // this function doesn't return 00101 } 00102 00103 #if defined( TARGET_MBED_LPC1768 ) 00104 Serial pc(USBTX, USBRX); // tx, rx 00105 #endif 00106 00107 int disp = 1; 00108 00109 00110 void test_camera( void ) 00111 { 00112 int interlace = 1; 00113 int frame_count = 0; 00114 00115 float t; 00116 00117 while ( 1 ) { 00118 00119 #ifdef TARGET_MBED_LPC1768 00120 if ( pc.readable() ) { 00121 switch ( pc.getc() ) { 00122 case 'c' : 00123 capture_to_bmp(); 00124 printf( " [c] : capture started\r\n" ); 00125 break; 00126 case 'o' : 00127 printf( " [o] read order change : %s\r\n", camera.read_order_change() ? "ENABLED" : "DISABLED" ); 00128 break; 00129 case 'i' : 00130 interlace = !interlace; 00131 printf( " [i] : interlace setting : %s\r\n", interlace ? "ENABLED" : "DISABLED" ); 00132 /* FALL THROUGH */ 00133 case 'f' : 00134 if ( frame_count ) { 00135 timer.stop(); 00136 t = timer.read(); 00137 printf( " [f] : %s rate : %5.3f\r\n", interlace ? "field" : "frame", (float)frame_count / t ); 00138 frame_count = 0; 00139 timer.reset(); 00140 timer.start(); 00141 } else { 00142 printf( " [f] : no frame drawn yet. try again later\r\n" ); 00143 } 00144 break; 00145 case '1' : 00146 printf( " [1] resolution change : QCIF\r\n" ); 00147 camera.init( MARMEX_VB::QCIF ); 00148 break; 00149 case '2' : 00150 printf( " [2] resolution change : QQVGA\r\n" ); 00151 camera.init( MARMEX_VB::QQVGA ); 00152 break; 00153 case '3' : 00154 printf( " [3] resolution change : QVGA\r\n" ); 00155 camera.init( MARMEX_VB::QVGA ); 00156 break; 00157 case '4' : 00158 printf( " [4] resolution change : VGA\r\n" ); 00159 camera.init( MARMEX_VB::VGA ); 00160 break; 00161 } 00162 } 00163 #endif 00164 00165 led = 0x1; 00166 00167 if ( interlace ) 00168 copy_image_from_camera_to_oled_interlaced(); 00169 else 00170 copy_image_from_camera_to_oled(); 00171 00172 // camera.colorbar( ((count++ >> 2) & 0x1) ? MARMEX_VB::ON : MARMEX_VB::OFF ); 00173 00174 #if 0 00175 #define SCREEN_TOP 9 00176 00177 t = looptimer.read(); 00178 looptimer.reset(); 00179 oled1.locate( 0, 0 ); 00180 oled1.printf( " %.2f %s/s", 1.0 / t, interlace ? "field" : "frame" ); 00181 #else 00182 #define SCREEN_TOP 0 00183 #endif 00184 led = 0x2; 00185 00186 frame_count++; 00187 } 00188 } 00189 00190 00191 void test_camera_resolution_change( void ) 00192 { 00193 int count = (3 << 3); 00194 int setting; 00195 00196 while ( 1 ) { 00197 00198 if ( !(count & 0x7) ) { 00199 setting = (count >> 3) & 0x3; 00200 camera.init( (MARMEX_VB::CameraResolution)(setting + 1) ); 00201 led = 0x1 << setting; 00202 } 00203 00204 count++; 00205 00206 copy_image_from_camera_to_oled(); 00207 } 00208 } 00209 00210 00211 void alpha( int line_num, short *bf, int offset_x, int offset_y, alpha_param *app ) 00212 { 00213 short r, g, b; 00214 int y_pos; 00215 00216 if ( (line_num < offset_y) || (offset_y + app->v) <= line_num || (app->buffer == NULL) ) 00217 return; 00218 00219 bf += offset_x; 00220 y_pos = ((app->v - (line_num - offset_y + 1)) * (app->h * app->byte_per_pixel)); 00221 00222 for ( int i = 0; i < 60; i++ ) { 00223 r = ((*bf >> 1) & 0x0F) + (*(app->buffer + i * 3 + 0 + y_pos ) >> 4); 00224 g = ((*bf >> 6) & 0x1F) + (*(app->buffer + i * 3 + 1 + y_pos ) >> 3); 00225 b = ((*bf >> 12) & 0x0F) + (*(app->buffer + i * 3 + 2 + y_pos ) >> 4); 00226 00227 *bf++ = (b << 11) | (g << 5) | (r << 0); 00228 } 00229 } 00230 00231 void copy_image_from_camera_to_oled( void ) 00232 { 00233 short buf[ MARMEX_OB_oled::WIDTH ]; // array size should be multiple of 8 for "mbed LPC1768" optimization 00234 static int count = 0; 00235 00236 camera.open_transfer(); 00237 00238 for ( int line = SCREEN_TOP; line < MARMEX_OB_oled::HEIGHT; line++ ) { 00239 camera.read_a_line( buf, line + (camera.get_vertical_size() - (int)MARMEX_OB_oled::HEIGHT) / 2, (camera.get_horizontal_size() - (int)MARMEX_OB_oled::WIDTH ) / 2, MARMEX_OB_oled::WIDTH ); 00240 line_mirroring( buf ); 00241 alpha( line, buf, ((count >> 4) & 1) ? 60 : 8, ((count >> 4) & 1) ^ ((count >> 3) & 1) ? ((int)MARMEX_OB_oled::HEIGHT - (ap.v + 4)) : 4 + SCREEN_TOP, &ap ); 00242 oled1.blit565( 0, line, MARMEX_OB_oled::WIDTH, 1, buf ); 00243 } 00244 00245 count++; 00246 camera.close_transfer(); 00247 } 00248 00249 00250 void copy_image_from_camera_to_oled_interlaced( void ) 00251 { 00252 short buf[ MARMEX_OB_oled::WIDTH ]; 00253 static int count = 0; 00254 00255 camera.open_transfer(); 00256 00257 for ( int line = ((count++) & 1) + SCREEN_TOP; line < MARMEX_OB_oled::HEIGHT; line += 2 ) { 00258 camera.read_a_line( buf, line + (camera.get_vertical_size() - (int)MARMEX_OB_oled::HEIGHT) / 2, (camera.get_horizontal_size() - (int)MARMEX_OB_oled::WIDTH ) / 2, MARMEX_OB_oled::WIDTH ); 00259 line_mirroring( buf ); 00260 alpha( line, buf, ((count >> 4) & 1) ? 60 : 8, ((count >> 4) & 1) ^ ((count >> 3) & 1) ? ((int)MARMEX_OB_oled::HEIGHT - (ap.v + 4)) : 4 + SCREEN_TOP, &ap ); 00261 oled1.blit565( 0, line, MARMEX_OB_oled::WIDTH, 1, buf ); 00262 } 00263 00264 camera.close_transfer(); 00265 } 00266 00267 00268 void copy_image_from_camera_to_oled_small( void ) 00269 { 00270 short buf[ 64 ]; 00271 static int count = 0; 00272 00273 camera.open_transfer(); 00274 00275 for ( int line = 0; line < 64; line++ ) { 00276 camera.read_a_line( buf, line, 0, 64 ); 00277 oled1.blit565( 0, line, 64, 1, buf ); 00278 } 00279 00280 count++; 00281 camera.close_transfer(); 00282 } 00283 00284 00285 void line_mirroring( short *buf ) 00286 { 00287 short tmp; 00288 00289 for ( int i = 0; i < (MARMEX_OB_oled::WIDTH / 2); i++ ) { 00290 tmp = buf[ i ]; 00291 buf[ i ] = buf[ (MARMEX_OB_oled::WIDTH - 1) - i ]; 00292 buf[ (MARMEX_OB_oled::WIDTH - 1) - i ] = tmp; 00293 } 00294 } 00295 00296 00297 void oled_test_screen( void ) 00298 { 00299 oled1.background( 0x000000 ); 00300 oled1.cls(); 00301 00302 int colorbar_width = MARMEX_OB_oled::WIDTH / 8; 00303 00304 for ( int i = 0; i < 8; i++ ) 00305 oled1.fill( colorbar_width * i, 0, colorbar_width, MARMEX_OB_oled::HEIGHT, ((i & 0x4) ? 0xFF0000 : 0x000000) | ((i & 0x2) ? 0x00FF00 : 0x000000) | ((i & 0x1) ? 0x0000FF : 0x000000) ); 00306 00307 oled1.fill( 50, 50, 64, 64, 0xCCCCCC );; 00308 00309 oled1.locate( 0, 2 ); 00310 oled1.printf( "MaryCemara test" ); 00311 oled1.locate( 0, 3 ); 00312 oled1.printf( "%s", (MARMEX_VB::NO_ERROR == camera.ready()) ? "Camera is ready" : "No Camera found" ); 00313 oled1.locate( 0, 4 ); 00314 //oled1.printf( "%s", "saving into BMP" ); 00315 oled1.locate( 0, 5 ); 00316 oled1.printf( "%d", camera.get_horizontal_size() ); 00317 oled1.locate( 0, 6 ); 00318 oled1.printf( "%d", camera.get_vertical_size() ); 00319 00320 for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ ) 00321 oled1.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 ); 00322 } 00323 00324 00325 #include "bmp_handler.h" 00326 00327 void save_still_image( char *file_name ) 00328 { 00329 short buf[ camera.get_horizontal_size() ]; 00330 00331 if ( open_BMP( file_name, camera.get_horizontal_size(), camera.get_vertical_size() ) ) 00332 return; 00333 00334 camera.open_transfer(); 00335 00336 for ( int line = (camera.get_vertical_size() - 1); 0 <= line; line-- ) { 00337 camera.read_a_line( buf, line, 0, camera.get_horizontal_size() ); 00338 write_BMP( buf, camera.get_horizontal_size() ); 00339 } 00340 camera.close_transfer(); 00341 00342 close_BMP(); 00343 } 00344 00345 void capture_to_bmp( void ) 00346 { 00347 short buf[ camera.get_horizontal_size() ]; 00348 camera.open_transfer(); 00349 00350 if ( open_BMP( "RGB.bmp", camera.get_horizontal_size(), camera.get_vertical_size() ) ) 00351 return; 00352 00353 for ( int line = (camera.get_vertical_size() - 1); 0 <= line; line-- ) { 00354 camera.read_a_line( buf, line, 0, camera.get_horizontal_size() ); 00355 // write_BMP( buf, camera.get_horizontal_size(), 0x7 ); 00356 write_BMP( buf, camera.get_horizontal_size() ); 00357 } 00358 00359 close_BMP(); 00360 00361 #if 0 00362 00363 if ( open_BMP( "R.bmp", camera.get_horizontal_size(), camera.get_vertical_size() ) ) 00364 return; 00365 00366 for ( int line = (camera.get_vertical_size() - 1); 0 <= line; line-- ) { 00367 camera.read_a_line( buf, line, 0, camera.get_horizontal_size() ); 00368 write_BMP( buf, camera.get_horizontal_size(), 0x4 ); 00369 } 00370 00371 close_BMP(); 00372 00373 00374 if ( open_BMP( "G.bmp", camera.get_horizontal_size(), camera.get_vertical_size() ) ) 00375 return; 00376 00377 for ( int line = (camera.get_vertical_size() - 1); 0 <= line; line-- ) { 00378 camera.read_a_line( buf, line, 0, camera.get_horizontal_size() ); 00379 write_BMP( buf, camera.get_horizontal_size(), 0x2 ); 00380 } 00381 00382 close_BMP(); 00383 00384 00385 if ( open_BMP( "B.bmp", camera.get_horizontal_size(), camera.get_vertical_size() ) ) 00386 return; 00387 00388 for ( int line = (camera.get_vertical_size() - 1); 0 <= line; line-- ) { 00389 camera.read_a_line( buf, line, 0, camera.get_horizontal_size() ); 00390 write_BMP( buf, camera.get_horizontal_size(), 0x1 ); 00391 } 00392 00393 close_BMP(); 00394 00395 #endif 00396 camera.close_transfer(); 00397 }
Generated on Tue Jul 12 2022 22:52:27 by 1.7.2