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

This is the library test program.
The program can test features of the library (refer to MARMEX-VB's API document) and can save captured data into BMP file.

Warning!

This test program can run on "mbed NXP LPC1768" only.

/media/uploads/nxpfan/dsc_0506_-1-.jpg
Picture : sample of test program operation
The modules of MARMEX-VB and MARMEX-OB are set on the "MAPLE mini type-B (MARM03-BASE)" baseboard.
The image data from camera is mirrored and alpha graphics added by software.

Revision:
7:125538c50c22
Parent:
6:b61b876d50a8
Child:
8:86aae677a68b
--- a/main.cpp	Wed Jun 18 06:44:44 2014 +0000
+++ b/main.cpp	Thu Jun 19 12:21:50 2014 +0000
@@ -1,7 +1,7 @@
 /** Test program for MARMEX_VB Camera control library
  *
- *  @version 0.2
- *  @date    10-Jun-2014
+ *  @version 0.3
+ *  @date    19-Jun-2014
  *
  *  Released under the Apache License, Version 2.0 : http://mbed.org/handbook/Apache-Licence
  *
@@ -36,6 +36,8 @@
 
 BusOut          led( LED4, LED3, LED2, LED1 );
 Timer           timer;
+Timer           looptimer;
+
 
 void test_camera( void );
 void test_camera_resolution_change( void );
@@ -64,6 +66,7 @@
 
     oled1.cls();
     oled_test_screen();
+    oled1.cls();
 
 #ifdef  SAVE_EACH_SIZES_OF_STILL_IMAGE
     led    = 0x1;
@@ -91,21 +94,29 @@
     printf( "    hit key [i] to toggle interlace mode\r\n" );
     printf( "    hit key [1], [2], [3] or [4] to change resolution QCIF, QQVGA, QVGA, VGA\r\n" );
 
+    looptimer.start();
+
     timer.start();  //  timer for measureing frame rate
     test_camera();  //  this function doesn't return
 }
 
-#if defined( TARGET_MBED_LPC1768 ) || defined( TARGET_LPC11U24_401 )
+#if defined( TARGET_MBED_LPC1768 )
 Serial      pc(USBTX, USBRX);    // tx, rx
 #endif
 
+int     disp  = 1;
+
 
 void test_camera( void )
 {
-    int     interlace   = 0;
-    int     frame_count = 0;
+    int     interlace           = 1;
+    int     frame_count         = 0;
+
+    float   t;
 
     while ( 1 ) {
+
+#ifdef TARGET_MBED_LPC1768
         if ( pc.readable() ) {
             switch ( pc.getc() ) {
                 case 'c' :
@@ -122,7 +133,7 @@
                 case 'f' :
                     if ( frame_count ) {
                         timer.stop();
-                        float   t   = timer.read();
+                        t   = timer.read();
                         printf( "  [f] : %s rate : %5.3f\r\n", interlace ? "field" : "frame", (float)frame_count / t );
                         frame_count = 0;
                         timer.reset();
@@ -149,6 +160,7 @@
                     break;
             }
         }
+#endif
 
         led    = 0x1;
 
@@ -159,6 +171,11 @@
 
 //        camera.colorbar( ((count++ >> 2) & 0x1) ? MARMEX_VB::ON : MARMEX_VB::OFF );
 
+        t   = looptimer.read();
+        looptimer.reset();
+        oled1.locate( 0, 0 );
+        oled1.printf( " %.2f %s/s", 1.0 / t, interlace ? "field" : "frame" );
+
         led    = 0x2;
 
         frame_count++;
@@ -207,6 +224,10 @@
 }
 
 
+#define OPTIMIZATION_ENABLED
+#define SCREEN_TOP  9
+
+#ifdef  OPTIMIZATION_ENABLED
 void copy_image_from_camera_to_oled( void )
 {
     short   buf[ MARMEX_OB_oled::WIDTH ];   //  array size should be multiple of 8 for "mbed LPC1768" optimization
@@ -214,10 +235,47 @@
 
     camera.open_transfer();
 
-    for ( int line = 0; line < MARMEX_OB_oled::HEIGHT; line++  ) {
+    for ( int line = SCREEN_TOP; line < MARMEX_OB_oled::HEIGHT; line++  ) {
+        camera.read_a_line_SPI_FIFO_READ( 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 );
+        line_mirroring( buf );
+        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 );
+        oled1.blit565_SPI_FIFO_WRITE( 0, line, MARMEX_OB_oled::WIDTH, 1, buf );
+    }
+
+    count++;
+    camera.close_transfer();
+}
+
+
+void copy_image_from_camera_to_oled_interlaced( void )
+{
+    short       buf[ MARMEX_OB_oled::WIDTH ];
+    static int  count   = 0;
+
+    camera.open_transfer();
+
+    for ( int line = ((count++) & 1) + SCREEN_TOP; line < MARMEX_OB_oled::HEIGHT; line += 2 ) {
+        camera.read_a_line_SPI_FIFO_READ( 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 );
+        line_mirroring( buf );
+        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 );
+        oled1.blit565_SPI_FIFO_WRITE( 0, line, MARMEX_OB_oled::WIDTH, 1, buf );
+    }
+
+    camera.close_transfer();
+}
+
+#else
+void copy_image_from_camera_to_oled( void )
+{
+    short   buf[ MARMEX_OB_oled::WIDTH ];   //  array size should be multiple of 8 for "mbed LPC1768" optimization
+    static int  count   = 0;
+
+    camera.open_transfer();
+
+    for ( int line = SCREEN_TOP; line < MARMEX_OB_oled::HEIGHT; line++  ) {
         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 );
         line_mirroring( buf );
-        alpha( line, buf, ((count >> 4) & 1) ? 60 : 8, ((count >> 4) & 1) ^ ((count >> 3) & 1) ? ((int)MARMEX_OB_oled::HEIGHT - (ap.v + 4)) : 4, &ap );
+        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 );
         oled1.blit565( 0, line, MARMEX_OB_oled::WIDTH, 1, buf );
     }
 
@@ -226,6 +284,24 @@
 }
 
 
+void copy_image_from_camera_to_oled_interlaced( void )
+{
+    short       buf[ MARMEX_OB_oled::WIDTH ];
+    static int  count   = 0;
+
+    camera.open_transfer();
+
+    for ( int line = ((count++) & 1) + SCREEN_TOP; line < MARMEX_OB_oled::HEIGHT; line += 2 ) {
+        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 );
+        line_mirroring( buf );
+        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 );
+        oled1.blit565( 0, line, MARMEX_OB_oled::WIDTH, 1, buf );
+    }
+
+    camera.close_transfer();
+}
+#endif
+
 void copy_image_from_camera_to_oled_small( void )
 {
     short   buf[ 64 ];
@@ -243,25 +319,6 @@
 }
 
 
-void copy_image_from_camera_to_oled_interlaced( void )
-{
-    short       buf[ MARMEX_OB_oled::WIDTH ];
-    static int  count   = 0;
-
-    camera.open_transfer();
-
-    for ( int line = (count++) & 1; line < MARMEX_OB_oled::HEIGHT; line += 2 ) {
-        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 );
-        line_mirroring( buf );
-        alpha( line, buf, ((count >> 4) & 1) ? 60 : 8, ((count >> 4) & 1) ^ ((count >> 3) & 1) ? ((int)MARMEX_OB_oled::HEIGHT - (ap.v + 4)) : 4, &ap );
-        oled1.blit565( 0, line, MARMEX_OB_oled::WIDTH, 1, buf );
-    }
-
-    camera.close_transfer();
-}
-
-
-
 void line_mirroring( short *buf )
 {
     short   tmp;
@@ -297,7 +354,6 @@
     oled1.locate( 0, 6 );
     oled1.printf( "%d", camera.get_vertical_size() );
 
-
     for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ )
         oled1.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 );
 }