Tedd OKANO / MARY_CAMERA
Committer:
okano
Date:
Thu Mar 06 07:28:44 2014 +0000
Revision:
8:23d14d5254d2
Parent:
7:942d8d0a1760
Child:
11:61a025e8ab68
ready function added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 4:cb0ef3fd89c9 1 #ifndef MBED_MARY_CAMERA
okano 4:cb0ef3fd89c9 2 #define MBED_MARY_CAMERA
okano 0:f4584dba3bac 3
okano 7:942d8d0a1760 4 //#define SPI_FREQUENCY 12000000
okano 7:942d8d0a1760 5 #define SPI_FREQUENCY 6000000
okano 0:f4584dba3bac 6
okano 0:f4584dba3bac 7
okano 4:cb0ef3fd89c9 8 /** MARY_CAMERA class
okano 4:cb0ef3fd89c9 9 *
okano 4:cb0ef3fd89c9 10 * MARY_CAMERA driver library
okano 4:cb0ef3fd89c9 11 * This driver has been made to get camera data from MARY CAMERA.
okano 4:cb0ef3fd89c9 12 *
okano 4:cb0ef3fd89c9 13 * Example:
okano 4:cb0ef3fd89c9 14 * @code
okano 4:cb0ef3fd89c9 15 *
okano 4:cb0ef3fd89c9 16 * #include "mbed.h"
okano 4:cb0ef3fd89c9 17 * #include "MARMEX_OB_oled.h"
okano 4:cb0ef3fd89c9 18 * #include "MARY_CAMERA.h"
okano 4:cb0ef3fd89c9 19 *
okano 4:cb0ef3fd89c9 20 * MARMEX_OB_oled oled1( p5, p7, p20, p16, p15 ); // mosi, sclk, cs, rst, power_control -- maple-mini-type-b-slot1
okano 4:cb0ef3fd89c9 21 * MARY_CAMERA camera( p5, p6, p7, p22, p26, p28, p27 ); // mosi, miso, sclk, cs, reset, I2C_SDA, I2C_SCL
okano 4:cb0ef3fd89c9 22 * BusOut led( LED3, LED4 );
okano 4:cb0ef3fd89c9 23 *
okano 4:cb0ef3fd89c9 24 * #define X_OFFSET ((MARY_CAMERA::PIXEL_PER_LINE - MARMEX_OB_oled::WIDTH ) / 2)
okano 4:cb0ef3fd89c9 25 * #define Y_OFFSET ((MARY_CAMERA::LINE_PER_FRAME - MARMEX_OB_oled::HEIGHT) / 2)
okano 4:cb0ef3fd89c9 26 *
okano 4:cb0ef3fd89c9 27 * int main()
okano 4:cb0ef3fd89c9 28 * {
okano 4:cb0ef3fd89c9 29 * led = 0x3;
okano 4:cb0ef3fd89c9 30 *
okano 4:cb0ef3fd89c9 31 * oled1.cls();
okano 4:cb0ef3fd89c9 32 *
okano 4:cb0ef3fd89c9 33 * short buf[ MARMEX_OB_oled::WIDTH ];
okano 4:cb0ef3fd89c9 34 *
okano 4:cb0ef3fd89c9 35 * while ( 1 ) {
okano 4:cb0ef3fd89c9 36 *
okano 4:cb0ef3fd89c9 37 * led = 0x1;
okano 4:cb0ef3fd89c9 38 * camera.open_transfer();
okano 4:cb0ef3fd89c9 39 *
okano 4:cb0ef3fd89c9 40 * for ( int line = 0; line < 128; line++ ) {
okano 4:cb0ef3fd89c9 41 * camera.transfer_a_line( buf, line + Y_OFFSET, X_OFFSET, 128 );
okano 4:cb0ef3fd89c9 42 * oled1.blit565( 0, line, 128, 1, buf );
okano 4:cb0ef3fd89c9 43 * }
okano 4:cb0ef3fd89c9 44 *
okano 4:cb0ef3fd89c9 45 * camera.close_transfer();
okano 4:cb0ef3fd89c9 46 * led = 0x2;
okano 4:cb0ef3fd89c9 47 * }
okano 4:cb0ef3fd89c9 48 * }
okano 4:cb0ef3fd89c9 49 * @endcode
okano 4:cb0ef3fd89c9 50 */
okano 4:cb0ef3fd89c9 51
okano 4:cb0ef3fd89c9 52
okano 0:f4584dba3bac 53 class MARY_CAMERA
okano 0:f4584dba3bac 54 {
okano 0:f4584dba3bac 55 public:
okano 0:f4584dba3bac 56
okano 8:23d14d5254d2 57 /** General parameters for MARY_CAMERA */
okano 4:cb0ef3fd89c9 58 enum {
okano 4:cb0ef3fd89c9 59 PIXEL_PER_LINE = 176, /**< pixels in a line */
okano 4:cb0ef3fd89c9 60 LINE_PER_FRAME = 144, /**< pixels in a line */
okano 4:cb0ef3fd89c9 61 BYTE_PER_PIXEL = 2, /**< bytes per pixel */
okano 4:cb0ef3fd89c9 62 BYTE_PER_LINE = (PIXEL_PER_LINE * BYTE_PER_PIXEL) /**< data size of 1 line */
okano 4:cb0ef3fd89c9 63 };
okano 4:cb0ef3fd89c9 64
okano 8:23d14d5254d2 65 /** General parameters for MARMEX_OB_oled */
okano 8:23d14d5254d2 66 enum {
okano 8:23d14d5254d2 67 NO_ERROR = 0 /**< zero */
okano 8:23d14d5254d2 68 };
okano 8:23d14d5254d2 69
okano 4:cb0ef3fd89c9 70 /** Create a MARY_CAMERA instance connected to specified SPI, DigitalOut and I2C pins
okano 0:f4584dba3bac 71 *
okano 4:cb0ef3fd89c9 72 * @param SPI_mosi SPI-bus MOSI pin
okano 4:cb0ef3fd89c9 73 * @param SPI_miso SPI-bus MISO pin
okano 4:cb0ef3fd89c9 74 * @param SPI_sclk SPI-bus SCLK pin
okano 4:cb0ef3fd89c9 75 * @param SPI_cs SPI-bus Chip Select pin
okano 4:cb0ef3fd89c9 76 * @param cam_reset Camera reset pin
okano 4:cb0ef3fd89c9 77 * @param I2C_sda I2C-bus SDA pin
okano 4:cb0ef3fd89c9 78 * @param I2C_scl I2C-bus SCL pin
okano 0:f4584dba3bac 79 */
okano 0:f4584dba3bac 80
okano 0:f4584dba3bac 81 MARY_CAMERA(
okano 4:cb0ef3fd89c9 82 PinName SPI_mosi,
okano 4:cb0ef3fd89c9 83 PinName SPI_miso,
okano 4:cb0ef3fd89c9 84 PinName SPI_sck,
okano 4:cb0ef3fd89c9 85 PinName SPI_cs,
okano 0:f4584dba3bac 86 PinName cam_reset,
okano 4:cb0ef3fd89c9 87 PinName I2C_sda,
okano 4:cb0ef3fd89c9 88 PinName I2C_scl
okano 0:f4584dba3bac 89 );
okano 4:cb0ef3fd89c9 90
okano 4:cb0ef3fd89c9 91 /** Initialization
okano 4:cb0ef3fd89c9 92 *
okano 4:cb0ef3fd89c9 93 * Performs MARY_CAMERA reset and initializations
okano 4:cb0ef3fd89c9 94 * This function is called from MARY_CAMERA constoructor. So user don't have to call in the user code.
okano 4:cb0ef3fd89c9 95 *
okano 4:cb0ef3fd89c9 96 * This function takes about 2 seconds because there is 99 times I2C access with 20ms interval.
okano 4:cb0ef3fd89c9 97 */
okano 0:f4584dba3bac 98 void init( void );
okano 4:cb0ef3fd89c9 99
okano 8:23d14d5254d2 100 /** Check camera availability
okano 8:23d14d5254d2 101 *
okano 8:23d14d5254d2 102 * Returns last I2C access result
okano 8:23d14d5254d2 103 * This returns non-zero value id the camera initialization failed
okano 8:23d14d5254d2 104 *
okano 8:23d14d5254d2 105 * This function takes about 2 seconds because there is 99 times I2C access with 20ms interval.
okano 8:23d14d5254d2 106 */
okano 8:23d14d5254d2 107 int ready( void );
okano 8:23d14d5254d2 108
okano 4:cb0ef3fd89c9 109 /** Open transfer
okano 4:cb0ef3fd89c9 110 *
okano 4:cb0ef3fd89c9 111 * Let the MARY_CAMERA get ready to transfer the data.
okano 4:cb0ef3fd89c9 112 * When this function is called, the camera will stop updating buffer at end of frame.
okano 8:23d14d5254d2 113 *
okano 8:23d14d5254d2 114 * @return error code in init function (I2C API return value)
okano 4:cb0ef3fd89c9 115 */
okano 0:f4584dba3bac 116 void open_transfer( void );
okano 4:cb0ef3fd89c9 117
okano 4:cb0ef3fd89c9 118 /** Close transfer
okano 4:cb0ef3fd89c9 119 *
okano 4:cb0ef3fd89c9 120 * Letting the MARY_CAMERA to know the data transfer done.
okano 4:cb0ef3fd89c9 121 * This function should be called when the data transfer done to resume the buffer update by camera
okano 4:cb0ef3fd89c9 122 */
okano 0:f4584dba3bac 123 void close_transfer( void );
okano 4:cb0ef3fd89c9 124
okano 4:cb0ef3fd89c9 125 /** Transfer a line
okano 4:cb0ef3fd89c9 126 *
okano 4:cb0ef3fd89c9 127 * Reads 1 line data from MARY_CAMERA
okano 4:cb0ef3fd89c9 128 * This function should be called when the data transfer done to resume the buffer update by camera
okano 4:cb0ef3fd89c9 129 *
okano 4:cb0ef3fd89c9 130 * @param *p pointer to array of short
okano 4:cb0ef3fd89c9 131 * @param line_number to select which line want to read
okano 4:cb0ef3fd89c9 132 * @param x_offset holizontal offset (from left) to start the read
okano 4:cb0ef3fd89c9 133 * @param n_of_pixels pixels to be read
okano 4:cb0ef3fd89c9 134 */
okano 0:f4584dba3bac 135 void transfer_a_line( short *p, int line_number, int x_offset, int n_of_pixels );
okano 0:f4584dba3bac 136
okano 0:f4584dba3bac 137 private:
okano 0:f4584dba3bac 138 int send_spi( char data );
okano 0:f4584dba3bac 139 void write_register( char reg, char value );
okano 0:f4584dba3bac 140 int read_register( char reg );
okano 0:f4584dba3bac 141 void set_address( int address );
okano 0:f4584dba3bac 142
okano 4:cb0ef3fd89c9 143 SPI _spi;
okano 4:cb0ef3fd89c9 144 DigitalOut _cs;
okano 4:cb0ef3fd89c9 145 DigitalOut _reset;
okano 4:cb0ef3fd89c9 146 I2C _i2c;
okano 8:23d14d5254d2 147 int _error_state;
okano 0:f4584dba3bac 148 };
okano 0:f4584dba3bac 149
okano 0:f4584dba3bac 150
okano 0:f4584dba3bac 151
okano 0:f4584dba3bac 152 #endif // MBED_MARY_CAMERA