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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }