Tedd OKANO / Mbed 2 deprecated MARY_CAMERA_Hello

Dependencies:   MARY_CAMERA NokiaLCD mbed

Revision:
3:152362acd181
Parent:
2:2e03fc4f485b
Child:
4:5e1828a8e238
diff -r 2e03fc4f485b -r 152362acd181 main.cpp
--- a/main.cpp	Fri Feb 14 08:33:14 2014 +0000
+++ b/main.cpp	Fri Feb 14 09:49:02 2014 +0000
@@ -1,20 +1,3 @@
-/** A sample app of MARMEX_OB OLED screen drawing library
- *
- *  @author  Tedd
- *  @version 0.5
- *  @date    07-Apr-2011
- *
- *  Released under the MIT License: http://mbed.org/license/mit
- *
- *  MARMEX_OB_oled OLED screen drawing library for mbed
- *  This code has been written based on sample code and advises
- *    from Ochiai-san (Marutsu-Elec). Thank you!
- *
- *  To build this code, "NokiaLCD" and "mbed" libraries are needed to be imported in a project.
- *     NokiaLCD library :  http://mbed.org/users/simon/libraries/NokiaLCD/
- */
-
-
 #include "mbed.h"
 #include "MARMEX_OB_oled.h"
 
@@ -72,15 +55,15 @@
         i2c.stop();
         wait_ms( 20 );
     }
-    
-    
+
+
     camspi.format(8);
     camspi.frequency( 1000000 );
     vsync   = 0;
 
 }
 
-int send_camspi2( char data )
+int send_spi( char data )
 {
     int     tmp;
 
@@ -91,41 +74,51 @@
     return ( tmp );
 }
 
-#define     PREPARE     0x1
-#define     DONE        0x0
+
+#define     COMMAND_WRITE                   0x00
+#define     COMMAND_READ                    0x80
+#define     COMMAND_ADDR_INCREMENT          0x20
 
-void transfer_control( int flag )
+#define     MEMORY_ADDR_LOW__REGISTER       0x0
+#define     MEMORY_ADDR_MID__REGISTER       0x1
+#define     MEMORY_ADDR_HIGH_REGISTER       0x2
+#define     CAMERA_DATA_REGISTER            0x8
+#define     CONTROL_DATA_REGISTER           0x3
+#define     STATUS_REGISTER                 0x4
+
+#define     CONTROL__PAUSE_BUFFER_UPDATE    0x01
+#define     CONTROL__RESUME_BUFFER_UPDATE   0x00
+
+void write_register( char reg, char value )
 {
-    send_camspi2( 0x03 );
-    send_camspi2( flag );          //  1 for PREPARE, 0 for DONE
-    vsync   = flag ? 0 : 1;     //  0 for PREPARE, 1 for DONE
-    send_camspi2( 0x84 );
+    send_spi( COMMAND_WRITE | reg );
+    send_spi( value );
+}
 
-    while ( (send_camspi2( 0x84 ) ^ flag) & 0x1 ); //  wait until LSB becomes '1'(for PREPARE) or '0'(for done)
-        
+int read_register( char reg )
+{
+//    printf( "0x%02X\r\n", COMMAND_READ | reg | ((reg == CAMERA_DATA_REGISTER) ? COMMAND_ADDR_INCREMENT : 0x00) );
+    
+    return ( send_spi( COMMAND_READ | reg | ((reg == CAMERA_DATA_REGISTER) ? COMMAND_ADDR_INCREMENT : 0x00) ) );
+//    return ( send_spi( COMMAND_READ | reg ) );
 }
 
 void open_transfer( void )
 {
-//    transfer_control( PREPARE );
+    write_register( CONTROL_DATA_REGISTER, CONTROL__PAUSE_BUFFER_UPDATE );
 
-    send_camspi2( 0x03 );
-    send_camspi2( 1 );
     vsync   = 0;
-    send_camspi2( 0x84 );
 
-    while ( (send_camspi2( 0x84 ) & 0x1) == 0 );
+    read_register( STATUS_REGISTER );
+    while ( !(read_register( STATUS_REGISTER ) & 0x1) ); //  wait until LSB becomes '1'
 }
 
 void close_transfer( void )
 {
-//    transfer_control( DONE );
+    write_register( CONTROL_DATA_REGISTER, CONTROL__RESUME_BUFFER_UPDATE );
 
-    send_camspi2( 0x03 );
-    send_camspi2( 0 );
-    send_camspi2( 0x84 );
-
-    while ( (send_camspi2( 0x84 ) & 0x1) );
+    read_register( STATUS_REGISTER );
+    while ( read_register( STATUS_REGISTER ) & 0x1 ); //  wait until LSB becomes '0'
 
     vsync   = 1;
 }
@@ -133,12 +126,9 @@
 
 void set_address( int address )
 {
-    send_camspi2( 0x00 );
-    send_camspi2( (address >> 0) & 0xFF );
-    send_camspi2( 0x01 );
-    send_camspi2( (address >> 8) & 0xFF );
-    send_camspi2( 0x02 );
-    send_camspi2( (address >> 16) & 0xFF );
+    write_register( MEMORY_ADDR_LOW__REGISTER, (address >>  0) & 0xFF );
+    write_register( MEMORY_ADDR_MID__REGISTER, (address >>  8) & 0xFF );
+    write_register( MEMORY_ADDR_HIGH_REGISTER, (address >> 16) & 0xFF );
 }
 
 #define     PIXEL_PER_LINE  176
@@ -148,11 +138,12 @@
 
 void transfer_a_line( short *p, int line_number, int x_offset, int n_of_pixels )
 {
-//    set_address( line_number * BYTE_PER_LINE + x_offset * BYTE_PER_PIXEL );
-    set_address( line_number * BYTE_PER_LINE );
-send_camspi2( 0xA8 );
+    set_address( line_number * BYTE_PER_LINE + x_offset * BYTE_PER_PIXEL );
+ 
+    read_register( CAMERA_DATA_REGISTER );
+
     for( int x = 0; x < n_of_pixels; x++ )
-        *p++    = (send_camspi2( 0xA8 ) << 8) | (send_camspi2( 0xA8 ) << 0);
+        *p++    = (read_register( CAMERA_DATA_REGISTER ) << 8) | (read_register( CAMERA_DATA_REGISTER ) << 0);
 }
 
 
@@ -161,85 +152,19 @@
 
 int main()
 {
-    short   buf[ 128 ];
-
     oled1.cls();
 
-    short   p[3][ 128 ]    = { { 0xF800 }, {0x07E0}, { 0x001F } };
-
-    for ( int i = 0; i < 128; i++ )
-        p[ 0 ][ i ]   = 0xF800;
-    for ( int i = 0; i < 128; i++ )
-        p[ 1 ][ i ]   = 0x07E0;
-    for ( int i = 0; i < 128; i++ )
-        p[ 2 ][ i ]   = 0x001F;
-
-    int count   = 0;
-#if 0
-    while ( 1 ) {
-        for ( int i = 0; i < 128; i++ ) {
-            oled1.blit565( 0, i, 128, 1, p[ count % 3 ] );
-        }
-        count++;
-        
-        if ( count == 3 )
-            break;
-    }
-#endif
-
+    short   buf[ 128 ];
     init();
 
     while ( 1 ) {
-
         open_transfer();
-        printf( "transfer ready\r\n" );
 
-        for ( int line = 0 + Y_OFFSET; line < 128 + Y_OFFSET; line++  ) {
-            transfer_a_line( buf, line, X_OFFSET, 128 );
-           
+        for ( int line = 0; line < 128; line++  ) {
+            transfer_a_line( buf, line + Y_OFFSET, X_OFFSET, 128 );
             oled1.blit565( 0, line, 128, 1, buf );
         }
 
         close_transfer();
-        printf( "loop done\r\n" );
-
     }
-
-#if 0
-    oled1.background( 0x000000 );
-    oled1.cls();
-
-    int colorbar_width  = MARMEX_OB_oled::WIDTH / 8;
-
-    for ( int i = 0; i < 8; i++ )
-        oled1.fill( colorbar_width * i, 0, colorbar_width, MARMEX_OB_oled::HEIGHT, ((i & 0x4) ? 0xFF0000 : 0x000000) | ((i & 0x2) ? 0x00FF00 : 0x000000) | ((i & 0x1) ? 0x0000FF : 0x000000) );
-
-    oled1.fill(  50,  50,  64,  64, 0xCCCCCC );;
-
-    oled1.locate( 0, 3 );
-    oled1.printf( "Hello World!" );
-    oled1.locate( 0, 4 );
-    oled1.printf( "camspi = %s", MERMEX_OB_camspi_MODE_STR );
-
-    for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ ) {
-        oled1.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 );
-    }
-
-    short   p[3][ 128 ]    = { { 0xF800 }, {0x07E0}, { 0x001F } };
-
-    for ( int i = 0; i < 128; i++ )
-        p[ 0 ][ i ]   = 0xF800;
-    for ( int i = 0; i < 128; i++ )
-        p[ 1 ][ i ]   = 0x07E0;
-    for ( int i = 0; i < 128; i++ )
-        p[ 2 ][ i ]   = 0x001F;
-
-    int count   = 0;
-    while ( 1 ) {
-        for ( int i = 0; i < 128; i++ ) {
-            oled1.blit565( 0, i, 128, 1, p[ count % 3 ] );
-        }
-        count++;
-    }
-#endif
 }