Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MARY_CAMERA NokiaLCD mbed
main.cpp@30:eaab2c4bbe22, 2014-03-22 (annotated)
- Committer:
- okano
- Date:
- Sat Mar 22 01:50:56 2014 +0000
- Revision:
- 30:eaab2c4bbe22
- Parent:
- 28:ef40d40b5d39
- Child:
- 31:5ab6567aba69
test code
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| okano | 0:1062142e5718 | 1 | #include "mbed.h" |
| okano | 0:1062142e5718 | 2 | #include "MARMEX_OB_oled.h" |
| okano | 4:5e1828a8e238 | 3 | #include "MARY_CAMERA.h" |
| okano | 3:152362acd181 | 4 | |
| okano | 23:8471197d3096 | 5 | #if defined( TARGET_MBED_LPC1768 ) || defined( TARGET_LPC11U24_401 ) || defined( TARGET_LPC11XX ) |
| okano | 4:5e1828a8e238 | 6 | MARMEX_OB_oled oled1( p5, p7, p20, p16, p15 ); // mosi, sclk, cs, rst, power_control -- maple-mini-type-b-slot1 |
| okano | 6:f5b4e088087b | 7 | MARY_CAMERA camera( p5, p6, p7, p22, p26, p28, p27 ); // mosi, miso, sclk, cs, reset, I2C_SDA, I2C_SCL |
| okano | 16:fa1bd83e34b0 | 8 | #endif |
| okano | 16:fa1bd83e34b0 | 9 | |
| okano | 16:fa1bd83e34b0 | 10 | #if defined( TARGET_LPC11U35_401 ) |
| okano | 16:fa1bd83e34b0 | 11 | MARMEX_OB_oled oled1( P0_9, P0_10, P0_16, P0_12, P0_11 ); // mosi, sclk, cs, rst, power_control -- maple-mini-type-b-slot1 |
| okano | 16:fa1bd83e34b0 | 12 | MARY_CAMERA camera( P0_9, P0_8, P0_10, P0_2, P1_15, P0_5, P0_4 ); // mosi, miso, sclk, cs, reset, I2C_SDA, I2C_SCL |
| okano | 16:fa1bd83e34b0 | 13 | #endif |
| okano | 16:fa1bd83e34b0 | 14 | |
| okano | 23:8471197d3096 | 15 | BusOut led( LED4, LED3, LED2, LED1 ); |
| okano | 1:ce27bc7b44d4 | 16 | |
| okano | 26:4e4f954a2e2a | 17 | void test_camera_QCIF_video_with_colorbar( void ); |
| okano | 26:4e4f954a2e2a | 18 | void test_camera_resolution_change( void ); |
| okano | 26:4e4f954a2e2a | 19 | |
| okano | 23:8471197d3096 | 20 | void copy_image_to_oled( void ); |
| okano | 9:68408189efde | 21 | void line_mirroring( short *buf ); |
| okano | 10:3c8fc9569377 | 22 | void save_still_image( char *file_name ); |
| okano | 16:fa1bd83e34b0 | 23 | void oled_test_screen( void ); |
| okano | 28:ef40d40b5d39 | 24 | void capture_to_bmp( void ); |
| okano | 0:1062142e5718 | 25 | |
| okano | 28:ef40d40b5d39 | 26 | //#define SAVE_EACH_SIZES_OF_STILL_IMAGE |
| okano | 28:ef40d40b5d39 | 27 | int read_order_change = 0; |
| okano | 23:8471197d3096 | 28 | |
| okano | 0:1062142e5718 | 29 | int main() |
| okano | 0:1062142e5718 | 30 | { |
| okano | 28:ef40d40b5d39 | 31 | printf( "\r\n\r\nMARY-CAMERA test program\r\n\r\n" ); |
| okano | 28:ef40d40b5d39 | 32 | |
| okano | 6:f5b4e088087b | 33 | led = 0x3; |
| okano | 6:f5b4e088087b | 34 | |
| okano | 1:ce27bc7b44d4 | 35 | oled1.cls(); |
| okano | 16:fa1bd83e34b0 | 36 | oled_test_screen(); |
| okano | 1:ce27bc7b44d4 | 37 | |
| okano | 23:8471197d3096 | 38 | #if defined( TARGET_MBED_LPC1768 ) |
| okano | 23:8471197d3096 | 39 | |
| okano | 26:4e4f954a2e2a | 40 | #ifdef SAVE_EACH_SIZES_OF_STILL_IMAGE |
| okano | 23:8471197d3096 | 41 | led = 0x1; |
| okano | 26:4e4f954a2e2a | 42 | camera.resolution( MARY_CAMERA::QCIF ); |
| okano | 23:8471197d3096 | 43 | save_still_image( "i_qcif.bmp" ); |
| okano | 23:8471197d3096 | 44 | |
| okano | 23:8471197d3096 | 45 | led = 0x2; |
| okano | 26:4e4f954a2e2a | 46 | camera.resolution( MARY_CAMERA::QQVGA ); |
| okano | 23:8471197d3096 | 47 | save_still_image( "i_qqvga.bmp" ); |
| okano | 0:1062142e5718 | 48 | |
| okano | 23:8471197d3096 | 49 | led = 0x4; |
| okano | 26:4e4f954a2e2a | 50 | camera.resolution( MARY_CAMERA::QVGA ); |
| okano | 23:8471197d3096 | 51 | save_still_image( "i_qvga.bmp" ); |
| okano | 23:8471197d3096 | 52 | |
| okano | 23:8471197d3096 | 53 | led = 0x8; |
| okano | 26:4e4f954a2e2a | 54 | camera.resolution( MARY_CAMERA::VGA ); |
| okano | 23:8471197d3096 | 55 | save_still_image( "i_vga.bmp" ); |
| okano | 23:8471197d3096 | 56 | |
| okano | 26:4e4f954a2e2a | 57 | camera.resolution( MARY_CAMERA::QCIF ); |
| okano | 23:8471197d3096 | 58 | #endif |
| okano | 23:8471197d3096 | 59 | |
| okano | 12:6ddd07d59c55 | 60 | #endif |
| okano | 28:ef40d40b5d39 | 61 | printf( " camera operation started\r\n" ); |
| okano | 28:ef40d40b5d39 | 62 | printf( " hit key [c] for saving data into BMP\r\n" ); |
| okano | 28:ef40d40b5d39 | 63 | printf( " hit key [o] to change data reading order\r\n" ); |
| okano | 28:ef40d40b5d39 | 64 | printf( " hit key [1], [2], [3] or [4] to change resolution QCIF, QQVGA, QVGA, VGA\r\n" ); |
| okano | 10:3c8fc9569377 | 65 | |
| okano | 28:ef40d40b5d39 | 66 | test_camera_QCIF_video_with_colorbar(); // doesn't return |
| okano | 28:ef40d40b5d39 | 67 | // test_camera_resolution_change(); // doesn't return |
| okano | 26:4e4f954a2e2a | 68 | } |
| okano | 26:4e4f954a2e2a | 69 | |
| okano | 28:ef40d40b5d39 | 70 | Serial pc(USBTX, USBRX); // tx, rx |
| okano | 26:4e4f954a2e2a | 71 | |
| okano | 26:4e4f954a2e2a | 72 | void test_camera_QCIF_video_with_colorbar( void ) |
| okano | 26:4e4f954a2e2a | 73 | { |
| okano | 0:1062142e5718 | 74 | while ( 1 ) { |
| okano | 28:ef40d40b5d39 | 75 | |
| okano | 28:ef40d40b5d39 | 76 | if ( pc.readable() ) { |
| okano | 28:ef40d40b5d39 | 77 | switch ( pc.getc() ) { |
| okano | 28:ef40d40b5d39 | 78 | case 'c' : |
| okano | 28:ef40d40b5d39 | 79 | capture_to_bmp(); |
| okano | 28:ef40d40b5d39 | 80 | printf( " [c] : capture started\r\n" ); |
| okano | 28:ef40d40b5d39 | 81 | break; |
| okano | 28:ef40d40b5d39 | 82 | case 'o' : |
| okano | 28:ef40d40b5d39 | 83 | read_order_change = read_order_change ? 0 : 1; |
| okano | 28:ef40d40b5d39 | 84 | printf( " [o] read order change : %s\r\n", read_order_change ? "ENABLED" : "DISABLED" ); |
| okano | 28:ef40d40b5d39 | 85 | break; |
| okano | 28:ef40d40b5d39 | 86 | case '1' : |
| okano | 28:ef40d40b5d39 | 87 | printf( " [1] resolution change : QCIF\r\n" ); |
| okano | 30:eaab2c4bbe22 | 88 | camera.init( MARY_CAMERA::QCIF ); |
| okano | 28:ef40d40b5d39 | 89 | break; |
| okano | 28:ef40d40b5d39 | 90 | case '2' : |
| okano | 30:eaab2c4bbe22 | 91 | printf( " [2] resolution change : QQVGA\r\n" ); |
| okano | 30:eaab2c4bbe22 | 92 | camera.init( MARY_CAMERA::QQVGA ); |
| okano | 28:ef40d40b5d39 | 93 | break; |
| okano | 28:ef40d40b5d39 | 94 | case '3' : |
| okano | 30:eaab2c4bbe22 | 95 | printf( " [3] resolution change : QVGA\r\n" ); |
| okano | 30:eaab2c4bbe22 | 96 | camera.init( MARY_CAMERA::QVGA ); |
| okano | 28:ef40d40b5d39 | 97 | break; |
| okano | 28:ef40d40b5d39 | 98 | case '4' : |
| okano | 30:eaab2c4bbe22 | 99 | printf( " [4] resolution change : VGA\r\n" ); |
| okano | 30:eaab2c4bbe22 | 100 | camera.init( MARY_CAMERA::VGA ); |
| okano | 28:ef40d40b5d39 | 101 | break; |
| okano | 28:ef40d40b5d39 | 102 | } |
| okano | 28:ef40d40b5d39 | 103 | } |
| okano | 28:ef40d40b5d39 | 104 | |
| okano | 28:ef40d40b5d39 | 105 | |
| okano | 7:380026dd09fd | 106 | led = 0x1; |
| okano | 23:8471197d3096 | 107 | copy_image_to_oled(); |
| okano | 28:ef40d40b5d39 | 108 | // camera.colorbar( ((count++ >> 2) & 0x1) ? MARY_CAMERA::ON : MARY_CAMERA::OFF ); |
| okano | 26:4e4f954a2e2a | 109 | led = 0x2; |
| okano | 26:4e4f954a2e2a | 110 | } |
| okano | 26:4e4f954a2e2a | 111 | } |
| okano | 24:c74b706c25d6 | 112 | |
| okano | 26:4e4f954a2e2a | 113 | |
| okano | 26:4e4f954a2e2a | 114 | void test_camera_resolution_change( void ) |
| okano | 26:4e4f954a2e2a | 115 | { |
| okano | 26:4e4f954a2e2a | 116 | int count = (3 << 3); |
| okano | 26:4e4f954a2e2a | 117 | int setting; |
| okano | 26:4e4f954a2e2a | 118 | |
| okano | 26:4e4f954a2e2a | 119 | while ( 1 ) { |
| okano | 24:c74b706c25d6 | 120 | |
| okano | 26:4e4f954a2e2a | 121 | if ( !(count & 0x7) ) { |
| okano | 26:4e4f954a2e2a | 122 | setting = (count >> 3) & 0x3; |
| okano | 30:eaab2c4bbe22 | 123 | camera.init( (MARY_CAMERA::CameraResolution)(setting + 1) ); |
| okano | 26:4e4f954a2e2a | 124 | led = 0x1 << setting; |
| okano | 26:4e4f954a2e2a | 125 | } |
| okano | 28:ef40d40b5d39 | 126 | |
| okano | 26:4e4f954a2e2a | 127 | count++; |
| okano | 26:4e4f954a2e2a | 128 | |
| okano | 26:4e4f954a2e2a | 129 | copy_image_to_oled(); |
| okano | 0:1062142e5718 | 130 | } |
| okano | 0:1062142e5718 | 131 | } |
| okano | 6:f5b4e088087b | 132 | |
| okano | 9:68408189efde | 133 | |
| okano | 23:8471197d3096 | 134 | void copy_image_to_oled( void ) |
| okano | 23:8471197d3096 | 135 | { |
| okano | 23:8471197d3096 | 136 | short buf[ MARMEX_OB_oled::WIDTH ]; |
| okano | 23:8471197d3096 | 137 | |
| okano | 23:8471197d3096 | 138 | camera.open_transfer(); |
| okano | 23:8471197d3096 | 139 | |
| okano | 23:8471197d3096 | 140 | for ( int line = 0; line < MARMEX_OB_oled::HEIGHT; line++ ) { |
| okano | 26:4e4f954a2e2a | 141 | camera.transfer_a_line( buf, line + (camera.vertical_size() - (int)MARMEX_OB_oled::HEIGHT) / 2, (camera.horizontal_size() - (int)MARMEX_OB_oled::WIDTH ) / 2, MARMEX_OB_oled::WIDTH ); |
| okano | 23:8471197d3096 | 142 | line_mirroring( buf ); |
| okano | 23:8471197d3096 | 143 | oled1.blit565( 0, line, MARMEX_OB_oled::WIDTH, 1, buf ); |
| okano | 23:8471197d3096 | 144 | } |
| okano | 23:8471197d3096 | 145 | |
| okano | 23:8471197d3096 | 146 | camera.close_transfer(); |
| okano | 23:8471197d3096 | 147 | } |
| okano | 23:8471197d3096 | 148 | |
| okano | 23:8471197d3096 | 149 | |
| okano | 9:68408189efde | 150 | void line_mirroring( short *buf ) |
| okano | 9:68408189efde | 151 | { |
| okano | 9:68408189efde | 152 | short tmp; |
| okano | 9:68408189efde | 153 | |
| okano | 9:68408189efde | 154 | for ( int i = 0; i < (MARMEX_OB_oled::WIDTH / 2); i++ ) { |
| okano | 9:68408189efde | 155 | tmp = buf[ i ]; |
| okano | 9:68408189efde | 156 | buf[ i ] = buf[ (MARMEX_OB_oled::WIDTH - 1) - i ]; |
| okano | 9:68408189efde | 157 | buf[ (MARMEX_OB_oled::WIDTH - 1) - i ] = tmp; |
| okano | 9:68408189efde | 158 | } |
| okano | 10:3c8fc9569377 | 159 | } |
| okano | 10:3c8fc9569377 | 160 | |
| okano | 10:3c8fc9569377 | 161 | |
| okano | 16:fa1bd83e34b0 | 162 | void oled_test_screen( void ) |
| okano | 16:fa1bd83e34b0 | 163 | { |
| okano | 16:fa1bd83e34b0 | 164 | oled1.background( 0x000000 ); |
| okano | 16:fa1bd83e34b0 | 165 | oled1.cls(); |
| okano | 16:fa1bd83e34b0 | 166 | |
| okano | 16:fa1bd83e34b0 | 167 | int colorbar_width = MARMEX_OB_oled::WIDTH / 8; |
| okano | 16:fa1bd83e34b0 | 168 | |
| okano | 16:fa1bd83e34b0 | 169 | for ( int i = 0; i < 8; i++ ) |
| okano | 16:fa1bd83e34b0 | 170 | oled1.fill( colorbar_width * i, 0, colorbar_width, MARMEX_OB_oled::HEIGHT, ((i & 0x4) ? 0xFF0000 : 0x000000) | ((i & 0x2) ? 0x00FF00 : 0x000000) | ((i & 0x1) ? 0x0000FF : 0x000000) ); |
| okano | 16:fa1bd83e34b0 | 171 | |
| okano | 16:fa1bd83e34b0 | 172 | oled1.fill( 50, 50, 64, 64, 0xCCCCCC );; |
| okano | 16:fa1bd83e34b0 | 173 | |
| okano | 16:fa1bd83e34b0 | 174 | oled1.locate( 0, 2 ); |
| okano | 16:fa1bd83e34b0 | 175 | oled1.printf( "MaryCemara test" ); |
| okano | 22:d5e24ab4afb7 | 176 | oled1.locate( 0, 3 ); |
| okano | 22:d5e24ab4afb7 | 177 | oled1.printf( "%s", (MARY_CAMERA::NO_ERROR == camera.ready()) ? "Camera is ready" : "No Camera found" ); |
| okano | 16:fa1bd83e34b0 | 178 | oled1.locate( 0, 4 ); |
| okano | 22:d5e24ab4afb7 | 179 | oled1.printf( "%s", "saving into BMP" ); |
| okano | 23:8471197d3096 | 180 | oled1.locate( 0, 5 ); |
| okano | 23:8471197d3096 | 181 | oled1.printf( "%d", camera.horizontal_size() ); |
| okano | 23:8471197d3096 | 182 | oled1.locate( 0, 6 ); |
| okano | 23:8471197d3096 | 183 | oled1.printf( "%d", camera.vertical_size() ); |
| okano | 23:8471197d3096 | 184 | |
| okano | 16:fa1bd83e34b0 | 185 | |
| okano | 21:a2ac746dd516 | 186 | for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ ) |
| okano | 16:fa1bd83e34b0 | 187 | oled1.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 ); |
| okano | 21:a2ac746dd516 | 188 | } |
| okano | 21:a2ac746dd516 | 189 | |
| okano | 21:a2ac746dd516 | 190 | |
| okano | 10:3c8fc9569377 | 191 | #include "bmp_handler.h" |
| okano | 10:3c8fc9569377 | 192 | |
| okano | 10:3c8fc9569377 | 193 | void save_still_image( char *file_name ) |
| okano | 10:3c8fc9569377 | 194 | { |
| okano | 23:8471197d3096 | 195 | short buf[ camera.horizontal_size() ]; |
| okano | 10:3c8fc9569377 | 196 | |
| okano | 23:8471197d3096 | 197 | if ( open_BMP( file_name, camera.horizontal_size(), camera.vertical_size() ) ) |
| okano | 10:3c8fc9569377 | 198 | return; |
| okano | 10:3c8fc9569377 | 199 | |
| okano | 10:3c8fc9569377 | 200 | camera.open_transfer(); |
| okano | 10:3c8fc9569377 | 201 | |
| okano | 23:8471197d3096 | 202 | for ( int line = (camera.vertical_size() - 1); 0 <= line; line-- ) { |
| okano | 23:8471197d3096 | 203 | camera.transfer_a_line( buf, line, 0, camera.horizontal_size() ); |
| okano | 23:8471197d3096 | 204 | write_BMP( buf, camera.horizontal_size() ); |
| okano | 10:3c8fc9569377 | 205 | } |
| okano | 10:3c8fc9569377 | 206 | camera.close_transfer(); |
| okano | 11:149993faf2be | 207 | |
| okano | 10:3c8fc9569377 | 208 | close_BMP(); |
| okano | 28:ef40d40b5d39 | 209 | } |
| okano | 28:ef40d40b5d39 | 210 | |
| okano | 28:ef40d40b5d39 | 211 | void capture_to_bmp( void ) |
| okano | 28:ef40d40b5d39 | 212 | { |
| okano | 28:ef40d40b5d39 | 213 | short buf[ camera.horizontal_size() ]; |
| okano | 28:ef40d40b5d39 | 214 | camera.open_transfer(); |
| okano | 28:ef40d40b5d39 | 215 | |
| okano | 28:ef40d40b5d39 | 216 | #if 0 |
| okano | 28:ef40d40b5d39 | 217 | for ( int line = 0; line < MARMEX_OB_oled::HEIGHT; line++ ) { |
| okano | 28:ef40d40b5d39 | 218 | camera.transfer_a_line( buf, line + (camera.vertical_size() - (int)MARMEX_OB_oled::HEIGHT) / 2, (camera.horizontal_size() - (int)MARMEX_OB_oled::WIDTH ) / 2, MARMEX_OB_oled::WIDTH ); |
| okano | 28:ef40d40b5d39 | 219 | line_mirroring( buf ); |
| okano | 28:ef40d40b5d39 | 220 | oled1.blit565( 0, line, MARMEX_OB_oled::WIDTH, 1, buf ); |
| okano | 28:ef40d40b5d39 | 221 | } |
| okano | 28:ef40d40b5d39 | 222 | #endif |
| okano | 28:ef40d40b5d39 | 223 | |
| okano | 28:ef40d40b5d39 | 224 | if ( open_BMP( "RGB.bmp", camera.horizontal_size(), camera.vertical_size() ) ) |
| okano | 28:ef40d40b5d39 | 225 | return; |
| okano | 28:ef40d40b5d39 | 226 | |
| okano | 28:ef40d40b5d39 | 227 | for ( int line = (camera.vertical_size() - 1); 0 <= line; line-- ) { |
| okano | 28:ef40d40b5d39 | 228 | camera.transfer_a_line( buf, line, 0, camera.horizontal_size() ); |
| okano | 28:ef40d40b5d39 | 229 | write_BMP( buf, camera.horizontal_size(), 0x7 ); |
| okano | 28:ef40d40b5d39 | 230 | } |
| okano | 28:ef40d40b5d39 | 231 | |
| okano | 28:ef40d40b5d39 | 232 | close_BMP(); |
| okano | 28:ef40d40b5d39 | 233 | |
| okano | 28:ef40d40b5d39 | 234 | #if 0 |
| okano | 28:ef40d40b5d39 | 235 | |
| okano | 28:ef40d40b5d39 | 236 | if ( open_BMP( "R.bmp", camera.horizontal_size(), camera.vertical_size() ) ) |
| okano | 28:ef40d40b5d39 | 237 | return; |
| okano | 28:ef40d40b5d39 | 238 | |
| okano | 28:ef40d40b5d39 | 239 | for ( int line = (camera.vertical_size() - 1); 0 <= line; line-- ) { |
| okano | 28:ef40d40b5d39 | 240 | camera.transfer_a_line( buf, line, 0, camera.horizontal_size() ); |
| okano | 28:ef40d40b5d39 | 241 | write_BMP( buf, camera.horizontal_size(), 0x4 ); |
| okano | 28:ef40d40b5d39 | 242 | } |
| okano | 28:ef40d40b5d39 | 243 | |
| okano | 28:ef40d40b5d39 | 244 | close_BMP(); |
| okano | 28:ef40d40b5d39 | 245 | |
| okano | 28:ef40d40b5d39 | 246 | |
| okano | 28:ef40d40b5d39 | 247 | if ( open_BMP( "G.bmp", camera.horizontal_size(), camera.vertical_size() ) ) |
| okano | 28:ef40d40b5d39 | 248 | return; |
| okano | 28:ef40d40b5d39 | 249 | |
| okano | 28:ef40d40b5d39 | 250 | for ( int line = (camera.vertical_size() - 1); 0 <= line; line-- ) { |
| okano | 28:ef40d40b5d39 | 251 | camera.transfer_a_line( buf, line, 0, camera.horizontal_size() ); |
| okano | 28:ef40d40b5d39 | 252 | write_BMP( buf, camera.horizontal_size(), 0x2 ); |
| okano | 28:ef40d40b5d39 | 253 | } |
| okano | 28:ef40d40b5d39 | 254 | |
| okano | 28:ef40d40b5d39 | 255 | close_BMP(); |
| okano | 28:ef40d40b5d39 | 256 | |
| okano | 28:ef40d40b5d39 | 257 | |
| okano | 28:ef40d40b5d39 | 258 | if ( open_BMP( "B.bmp", camera.horizontal_size(), camera.vertical_size() ) ) |
| okano | 28:ef40d40b5d39 | 259 | return; |
| okano | 28:ef40d40b5d39 | 260 | |
| okano | 28:ef40d40b5d39 | 261 | for ( int line = (camera.vertical_size() - 1); 0 <= line; line-- ) { |
| okano | 28:ef40d40b5d39 | 262 | camera.transfer_a_line( buf, line, 0, camera.horizontal_size() ); |
| okano | 28:ef40d40b5d39 | 263 | write_BMP( buf, camera.horizontal_size(), 0x1 ); |
| okano | 28:ef40d40b5d39 | 264 | } |
| okano | 28:ef40d40b5d39 | 265 | |
| okano | 28:ef40d40b5d39 | 266 | close_BMP(); |
| okano | 28:ef40d40b5d39 | 267 | |
| okano | 28:ef40d40b5d39 | 268 | #endif |
| okano | 28:ef40d40b5d39 | 269 | camera.close_transfer(); |
| okano | 28:ef40d40b5d39 | 270 | } |