シカケコンテスト2015で発表した「水分補給お知らせペットボトルホルダー」

Dependencies:   MPR121 NokiaLCD SDFileSystem mbed-rtos mbed wave_player

Committer:
mia_0032
Date:
Fri Jul 10 09:19:15 2015 +0000
Revision:
0:01f630b61d0f
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mia_0032 0:01f630b61d0f 1 /** MARMEX_OB OLED screen drawing library
mia_0032 0:01f630b61d0f 2 *
mia_0032 0:01f630b61d0f 3 * @class MARMEX_OB_oled
mia_0032 0:01f630b61d0f 4 * @author tedd
mia_0032 0:01f630b61d0f 5 * @version 0.51
mia_0032 0:01f630b61d0f 6 * @date 08-Apr-2011
mia_0032 0:01f630b61d0f 7 *
mia_0032 0:01f630b61d0f 8 * Released under the MIT License: http://mbed.org/license/mit
mia_0032 0:01f630b61d0f 9 *
mia_0032 0:01f630b61d0f 10 * MARMEX_OB_oled OLED screen drawing library for mbed
mia_0032 0:01f630b61d0f 11 * This code has been written based on sample code and advises
mia_0032 0:01f630b61d0f 12 * from Ochiai-san (Marutsu-Elec). Thank you!
mia_0032 0:01f630b61d0f 13 *
mia_0032 0:01f630b61d0f 14 * SPI mode:
mia_0032 0:01f630b61d0f 15 * 9bit or 8bit SPI mode can be selected by disabling/enabling "#define MARMEX_OB_SPI_8BIT_MODE".
mia_0032 0:01f630b61d0f 16 * See source code in this (MARMEX_OB_oled.h) file.
mia_0032 0:01f630b61d0f 17 */
mia_0032 0:01f630b61d0f 18
mia_0032 0:01f630b61d0f 19 #ifndef MBED_MARMEX_OB_OLED
mia_0032 0:01f630b61d0f 20 #define MBED_MARMEX_OB_OLED
mia_0032 0:01f630b61d0f 21
mia_0032 0:01f630b61d0f 22 #include "mbed.h"
mia_0032 0:01f630b61d0f 23 #include "NokiaLCD.h"
mia_0032 0:01f630b61d0f 24
mia_0032 0:01f630b61d0f 25 /** @def MARMEX_OB_SPI_8BIT_MODE
mia_0032 0:01f630b61d0f 26 *
mia_0032 0:01f630b61d0f 27 * MARMEX_OB_oled_oled OLED screen SPI access length setting
mia_0032 0:01f630b61d0f 28 * Enabling "MARMEX_OB_SPI_8BIT_MODE" makes 9bit SPI access by 8bit * 2 times.
mia_0032 0:01f630b61d0f 29 * This may be useful if other 8bit access SPI device on same SPI bus.
mia_0032 0:01f630b61d0f 30 *
mia_0032 0:01f630b61d0f 31 * If disabled (just coment out the "#define MARMEX_OB_SPI_8BIT_MODE"), SPI access willbe done by 9 bit format.
mia_0032 0:01f630b61d0f 32 */
mia_0032 0:01f630b61d0f 33 //#define MARMEX_OB_SPI_8BIT_MODE
mia_0032 0:01f630b61d0f 34
mia_0032 0:01f630b61d0f 35 /** MARMEX_OB_oled OLED screen drawing class
mia_0032 0:01f630b61d0f 36 *
mia_0032 0:01f630b61d0f 37 * This is a driver code for MARMEX_OB_oled board OLED screen.
mia_0032 0:01f630b61d0f 38 * This class inherits NokiaLCD class of mbed.org.
mia_0032 0:01f630b61d0f 39 * To use this class, import the NokiaLCD class from here..
mia_0032 0:01f630b61d0f 40 * http://mbed.org/users/simon/libraries/NokiaLCD/
mia_0032 0:01f630b61d0f 41 *
mia_0032 0:01f630b61d0f 42 * Example:
mia_0032 0:01f630b61d0f 43 * @code
mia_0032 0:01f630b61d0f 44 * #include "mbed.h"
mia_0032 0:01f630b61d0f 45 * #include "MARMEX_OB_oled.h"
mia_0032 0:01f630b61d0f 46 *
mia_0032 0:01f630b61d0f 47 * // oled1 is for MARMEX_OB_oled board on MAPLE slot 1
mia_0032 0:01f630b61d0f 48 * // oled1 is for MARMEX_OB_oled board on MAPLE slot 2
mia_0032 0:01f630b61d0f 49 *
mia_0032 0:01f630b61d0f 50 * MARMEX_OB_oled oled1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control
mia_0032 0:01f630b61d0f 51 * //MARMEX_OB_oled oled2( p5, p7, p26, p21, p17 ); // mosi, sclk, cs, rst, power_control
mia_0032 0:01f630b61d0f 52 *
mia_0032 0:01f630b61d0f 53 *
mia_0032 0:01f630b61d0f 54 * int main() {
mia_0032 0:01f630b61d0f 55 * oled1.background( 0x000000 );
mia_0032 0:01f630b61d0f 56 * oled1.cls();
mia_0032 0:01f630b61d0f 57 *
mia_0032 0:01f630b61d0f 58 * int colorbar_width = MARMEX_OB_oled::WIDTH / 8;
mia_0032 0:01f630b61d0f 59 *
mia_0032 0:01f630b61d0f 60 * for ( int i = 0; i < 8; i++ )
mia_0032 0:01f630b61d0f 61 * oled1.fill( colorbar_width * i, 0, colorbar_width, MARMEX_OB_oled::HEIGHT, ((i & 0x4) ? 0xFF0000 : 0x000000) | ((i & 0x2) ? 0x00FF00 : 0x000000) | ((i & 0x1) ? 0x0000FF : 0x000000) );
mia_0032 0:01f630b61d0f 62 *
mia_0032 0:01f630b61d0f 63 * oled1.fill( 50, 50, 64, 64, 0xCCCCCC );;
mia_0032 0:01f630b61d0f 64 *
mia_0032 0:01f630b61d0f 65 * oled1.locate( 0, 3 );
mia_0032 0:01f630b61d0f 66 * oled1.printf( "Hello World!" );
mia_0032 0:01f630b61d0f 67 * oled1.locate( 0, 4 );
mia_0032 0:01f630b61d0f 68 * oled1.printf( "SPI = %s", MERMEX_OB_SPI_MODE_STR );
mia_0032 0:01f630b61d0f 69 *
mia_0032 0:01f630b61d0f 70 * for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ ) {
mia_0032 0:01f630b61d0f 71 * oled1.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 );
mia_0032 0:01f630b61d0f 72 * }
mia_0032 0:01f630b61d0f 73 * } * @endcode
mia_0032 0:01f630b61d0f 74 */
mia_0032 0:01f630b61d0f 75
mia_0032 0:01f630b61d0f 76 class MARMEX_OB_oled : public NokiaLCD {
mia_0032 0:01f630b61d0f 77
mia_0032 0:01f630b61d0f 78 public:
mia_0032 0:01f630b61d0f 79
mia_0032 0:01f630b61d0f 80 /** General parameters for MARMEX_OB_oled */
mia_0032 0:01f630b61d0f 81 enum {
mia_0032 0:01f630b61d0f 82 ROWS = 15, /**< # of rows (lines) for displaying characters */
mia_0032 0:01f630b61d0f 83 COLS = 16, /**< # of columns (width) for displaying characters */
mia_0032 0:01f630b61d0f 84 WIDTH = 128, /**< screen width [pixels] */
mia_0032 0:01f630b61d0f 85 HEIGHT = 128, /**< screen height [pixels] */
mia_0032 0:01f630b61d0f 86 SPI_FREQUENCY = 16000000 /**< SPI (sclk) SPI_FREQUENCY */
mia_0032 0:01f630b61d0f 87 };
mia_0032 0:01f630b61d0f 88
mia_0032 0:01f630b61d0f 89 /** Constants for power() function */
mia_0032 0:01f630b61d0f 90 enum {
mia_0032 0:01f630b61d0f 91 OFF = 0, /**< : to turning-OFF */
mia_0032 0:01f630b61d0f 92 ON /**< : to turning-ON */
mia_0032 0:01f630b61d0f 93 };
mia_0032 0:01f630b61d0f 94
mia_0032 0:01f630b61d0f 95 /** Create a MARMEX_OB_oled object connected to specified SPI and DigitalOut pins
mia_0032 0:01f630b61d0f 96 *
mia_0032 0:01f630b61d0f 97 * @param mosi SPI-MOSI pin (for MAPLE board, use p5)
mia_0032 0:01f630b61d0f 98 * @param sclk SPI-SCLK pin (for MAPLE board, use p8)
mia_0032 0:01f630b61d0f 99 * @param cs chip select signal (for MAPLE board, use p8(slot1), p26(slot2))
mia_0032 0:01f630b61d0f 100 * @param rst reset signal (for MAPLE board, use p30(slot1), p21(slot2))
mia_0032 0:01f630b61d0f 101 * @param power_pin backlight power control signal (for MAPLE board, use p11(slot1), p17(slot2))
mia_0032 0:01f630b61d0f 102 *
mia_0032 0:01f630b61d0f 103 * Example of MARMEX_OB_oled on MAPLE board:
mia_0032 0:01f630b61d0f 104 * @code
mia_0032 0:01f630b61d0f 105 * #include "mbed.h"
mia_0032 0:01f630b61d0f 106 * #include "MARMEX_OB_oled.h"
mia_0032 0:01f630b61d0f 107 *
mia_0032 0:01f630b61d0f 108 * MARMEX_OB_oled oled_on_maple_slot1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control
mia_0032 0:01f630b61d0f 109 * MARMEX_OB_oled oled_on_maple_slot2( p5, p7, p26, p21, p17 ); // mosi, sclk, cs, rst, power_control
mia_0032 0:01f630b61d0f 110 * ...
mia_0032 0:01f630b61d0f 111 * ..
mia_0032 0:01f630b61d0f 112 * @endcode
mia_0032 0:01f630b61d0f 113 */
mia_0032 0:01f630b61d0f 114
mia_0032 0:01f630b61d0f 115 MARMEX_OB_oled( PinName mosi, PinName sclk, PinName cs, PinName rst, PinName power_pin ) : NokiaLCD( mosi, sclk, cs, rst, NokiaLCD::LCD6100 ), _power_pin( power_pin ) {
mia_0032 0:01f630b61d0f 116 power( ON );
mia_0032 0:01f630b61d0f 117 reset();
mia_0032 0:01f630b61d0f 118 }
mia_0032 0:01f630b61d0f 119
mia_0032 0:01f630b61d0f 120 #if DOXYGEN_ONLY
mia_0032 0:01f630b61d0f 121 /** Write a character to the LCD
mia_0032 0:01f630b61d0f 122 *
mia_0032 0:01f630b61d0f 123 * @param c The character to write to the display
mia_0032 0:01f630b61d0f 124 */
mia_0032 0:01f630b61d0f 125 int putc( int c );
mia_0032 0:01f630b61d0f 126
mia_0032 0:01f630b61d0f 127 /** Write a formated string to the LCD
mia_0032 0:01f630b61d0f 128 *
mia_0032 0:01f630b61d0f 129 * @param format A printf-style format string, followed by the
mia_0032 0:01f630b61d0f 130 * variables to use in formating the string.
mia_0032 0:01f630b61d0f 131 *
mia_0032 0:01f630b61d0f 132 * !!! 16th character in the string will be disappeared
mia_0032 0:01f630b61d0f 133 * !!! This problem is due to difference of screen size NokiaLCD library and its internal mechanism...
mia_0032 0:01f630b61d0f 134 */
mia_0032 0:01f630b61d0f 135 int printf( const char* format, ... );
mia_0032 0:01f630b61d0f 136
mia_0032 0:01f630b61d0f 137 /** Set the foreground colour
mia_0032 0:01f630b61d0f 138 *
mia_0032 0:01f630b61d0f 139 * @param c 24-bit colour
mia_0032 0:01f630b61d0f 140 */
mia_0032 0:01f630b61d0f 141 void foreground(int c);
mia_0032 0:01f630b61d0f 142
mia_0032 0:01f630b61d0f 143 /** Set the background colour
mia_0032 0:01f630b61d0f 144 *
mia_0032 0:01f630b61d0f 145 * @param c 24-bit colour
mia_0032 0:01f630b61d0f 146 */
mia_0032 0:01f630b61d0f 147 void background(int c);
mia_0032 0:01f630b61d0f 148
mia_0032 0:01f630b61d0f 149 #endif
mia_0032 0:01f630b61d0f 150
mia_0032 0:01f630b61d0f 151 /** reset MARMEX_OB_oled
mia_0032 0:01f630b61d0f 152 *
mia_0032 0:01f630b61d0f 153 * Executes hardware reset and initialize.
mia_0032 0:01f630b61d0f 154 * See MARMEX_OB_oled manual for the initialization sequence and values
mia_0032 0:01f630b61d0f 155 * For gamma correction table, using math function to make the code simple
mia_0032 0:01f630b61d0f 156 */
mia_0032 0:01f630b61d0f 157
mia_0032 0:01f630b61d0f 158 void reset( void ) {
mia_0032 0:01f630b61d0f 159
mia_0032 0:01f630b61d0f 160 #define GAMMA_LUT_SIZE 63
mia_0032 0:01f630b61d0f 161 unsigned char gamma_LUT[ GAMMA_LUT_SIZE ];
mia_0032 0:01f630b61d0f 162
mia_0032 0:01f630b61d0f 163 for ( int i = 0; i < GAMMA_LUT_SIZE; i++ )
mia_0032 0:01f630b61d0f 164 gamma_LUT[ i ] = (unsigned char)(powf( ((float)i / 62.0), (1.0 / 0.58) ) * 178.0 + 2.0);
mia_0032 0:01f630b61d0f 165
mia_0032 0:01f630b61d0f 166 // setup the SPI interface and bring display out of reset
mia_0032 0:01f630b61d0f 167 _cs = 1;
mia_0032 0:01f630b61d0f 168 _rst = 0;
mia_0032 0:01f630b61d0f 169 #ifdef MARMEX_OB_SPI_8BIT_MODE
mia_0032 0:01f630b61d0f 170 _spi.format( 8 );
mia_0032 0:01f630b61d0f 171 #else
mia_0032 0:01f630b61d0f 172 _spi.format( 9 );
mia_0032 0:01f630b61d0f 173 #endif
mia_0032 0:01f630b61d0f 174
mia_0032 0:01f630b61d0f 175 _spi.frequency( SPI_FREQUENCY );
mia_0032 0:01f630b61d0f 176 wait_ms( 1 );
mia_0032 0:01f630b61d0f 177 _rst = 1;
mia_0032 0:01f630b61d0f 178 wait_ms( 1 );
mia_0032 0:01f630b61d0f 179
mia_0032 0:01f630b61d0f 180 _cs = 0;
mia_0032 0:01f630b61d0f 181
mia_0032 0:01f630b61d0f 182 command( SET_DISPLAY_MODE_ALL_OFF );
mia_0032 0:01f630b61d0f 183 command( SET_COMMAND_LOCK );
mia_0032 0:01f630b61d0f 184 data( 0x12 );
mia_0032 0:01f630b61d0f 185
mia_0032 0:01f630b61d0f 186 command( SET_COMMAND_LOCK );
mia_0032 0:01f630b61d0f 187 data( 0xb1 );
mia_0032 0:01f630b61d0f 188
mia_0032 0:01f630b61d0f 189 command( SET_SLEEP_MODE_ON );
mia_0032 0:01f630b61d0f 190
mia_0032 0:01f630b61d0f 191 command( FRONT_CLOCK_DRIVER_OSC_FREQ );
mia_0032 0:01f630b61d0f 192 data( 0xF1 );
mia_0032 0:01f630b61d0f 193
mia_0032 0:01f630b61d0f 194 command( SET_MUX_RATIO );
mia_0032 0:01f630b61d0f 195 data( 0x7F );
mia_0032 0:01f630b61d0f 196
mia_0032 0:01f630b61d0f 197 command( SET_DISPAY_OFFSET );
mia_0032 0:01f630b61d0f 198 data( 0x00 );
mia_0032 0:01f630b61d0f 199
mia_0032 0:01f630b61d0f 200 command( SET_DISPAY_START_LINE );
mia_0032 0:01f630b61d0f 201 data( 0x00 );
mia_0032 0:01f630b61d0f 202
mia_0032 0:01f630b61d0f 203 command( SET_REMAP_COLOR_DEPTH );
mia_0032 0:01f630b61d0f 204 data( 0x74 );
mia_0032 0:01f630b61d0f 205
mia_0032 0:01f630b61d0f 206 command( SET_GPIO );
mia_0032 0:01f630b61d0f 207 data( 0x00);
mia_0032 0:01f630b61d0f 208
mia_0032 0:01f630b61d0f 209 command( FUNCTION_SELECTION );
mia_0032 0:01f630b61d0f 210 data( 0x01 );
mia_0032 0:01f630b61d0f 211
mia_0032 0:01f630b61d0f 212 command( SET_SEGMENT_LOW_VOLTAGE );
mia_0032 0:01f630b61d0f 213 data( 0xA0 );
mia_0032 0:01f630b61d0f 214 data( 0xB5 );
mia_0032 0:01f630b61d0f 215 data( 0x55 );
mia_0032 0:01f630b61d0f 216
mia_0032 0:01f630b61d0f 217 command( SET_CONTRAST_CURRENT_FOR_COLOR_ABC );
mia_0032 0:01f630b61d0f 218 data( 0xC8 );
mia_0032 0:01f630b61d0f 219 data( 0x80 );
mia_0032 0:01f630b61d0f 220 data( 0xC8 );
mia_0032 0:01f630b61d0f 221
mia_0032 0:01f630b61d0f 222 command( MASTER_CONTRAST_CURRENT_CONTROL );
mia_0032 0:01f630b61d0f 223 data( 0x0F );
mia_0032 0:01f630b61d0f 224
mia_0032 0:01f630b61d0f 225 command( LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH );
mia_0032 0:01f630b61d0f 226 for ( int i = 0; i < GAMMA_LUT_SIZE; i++ )
mia_0032 0:01f630b61d0f 227 data( gamma_LUT[ i ] );
mia_0032 0:01f630b61d0f 228
mia_0032 0:01f630b61d0f 229 command( SET_RESET_PRECHARGE_PERIOD );
mia_0032 0:01f630b61d0f 230 data( 0x32 );
mia_0032 0:01f630b61d0f 231
mia_0032 0:01f630b61d0f 232 command( ENHANCE_DRIVING_SCHEME_CAPABILITY );
mia_0032 0:01f630b61d0f 233 data( 0x04 );
mia_0032 0:01f630b61d0f 234 data( 0x00 );
mia_0032 0:01f630b61d0f 235 data( 0x00 );
mia_0032 0:01f630b61d0f 236
mia_0032 0:01f630b61d0f 237 command( SET_PRECHARGE_VOLTAGE );
mia_0032 0:01f630b61d0f 238 data( 0x17 );
mia_0032 0:01f630b61d0f 239
mia_0032 0:01f630b61d0f 240 command( SET_SECOND_PRECHARGE_VOLTAGE );
mia_0032 0:01f630b61d0f 241 data( 0x01 );
mia_0032 0:01f630b61d0f 242
mia_0032 0:01f630b61d0f 243 command( SET_VCOMH_VOLTAGE );
mia_0032 0:01f630b61d0f 244 data( 0x05 );
mia_0032 0:01f630b61d0f 245
mia_0032 0:01f630b61d0f 246 command( SET_DISPLAY_MODE_RESET );
mia_0032 0:01f630b61d0f 247
mia_0032 0:01f630b61d0f 248 #if 0
mia_0032 0:01f630b61d0f 249 command( SET_COLUMN_ADDRESS );
mia_0032 0:01f630b61d0f 250 data( 0x00 );
mia_0032 0:01f630b61d0f 251 data( 0x7F );
mia_0032 0:01f630b61d0f 252
mia_0032 0:01f630b61d0f 253 command( SET_ROW_ADDRESS );
mia_0032 0:01f630b61d0f 254 data( 0x00 );
mia_0032 0:01f630b61d0f 255 data( 0x7F);
mia_0032 0:01f630b61d0f 256
mia_0032 0:01f630b61d0f 257 command( WRITE_RAM_COMMAND );
mia_0032 0:01f630b61d0f 258 for ( int i = 0; i < WIDTH * HEIGHT; i++ )
mia_0032 0:01f630b61d0f 259 data( 0x00 );
mia_0032 0:01f630b61d0f 260 #endif
mia_0032 0:01f630b61d0f 261 _cs = 1;
mia_0032 0:01f630b61d0f 262
mia_0032 0:01f630b61d0f 263 cls();
mia_0032 0:01f630b61d0f 264 wait_ms( 200 );
mia_0032 0:01f630b61d0f 265
mia_0032 0:01f630b61d0f 266 command( SET_SLEEP_MODE_OFF );
mia_0032 0:01f630b61d0f 267 }
mia_0032 0:01f630b61d0f 268
mia_0032 0:01f630b61d0f 269 /** Clear the screen and locate to 0,0 */
mia_0032 0:01f630b61d0f 270
mia_0032 0:01f630b61d0f 271 void cls( void ) {
mia_0032 0:01f630b61d0f 272 fill( 0, 0, WIDTH , HEIGHT, _background );
mia_0032 0:01f630b61d0f 273 _row = 0;
mia_0032 0:01f630b61d0f 274 _column = 0;
mia_0032 0:01f630b61d0f 275 }
mia_0032 0:01f630b61d0f 276
mia_0032 0:01f630b61d0f 277 /** Set a pixel on te screen
mia_0032 0:01f630b61d0f 278 *
mia_0032 0:01f630b61d0f 279 * @param x horizontal position from left
mia_0032 0:01f630b61d0f 280 * @param y vertical position from top
mia_0032 0:01f630b61d0f 281 * @param colour 24-bit colour in format 0x00RRGGBB
mia_0032 0:01f630b61d0f 282 */
mia_0032 0:01f630b61d0f 283
mia_0032 0:01f630b61d0f 284 virtual void pixel( int x, int y, int colour ) {
mia_0032 0:01f630b61d0f 285 _cs = 0;
mia_0032 0:01f630b61d0f 286 _window( x, y, 1, 1 );
mia_0032 0:01f630b61d0f 287 _putp( colour );
mia_0032 0:01f630b61d0f 288 _cs = 1;
mia_0032 0:01f630b61d0f 289 }
mia_0032 0:01f630b61d0f 290
mia_0032 0:01f630b61d0f 291 /** Fill an area of the screen
mia_0032 0:01f630b61d0f 292 *
mia_0032 0:01f630b61d0f 293 * @param x horizontal position from left
mia_0032 0:01f630b61d0f 294 * @param y vertical position from top
mia_0032 0:01f630b61d0f 295 * @param width width in pixels
mia_0032 0:01f630b61d0f 296 * @param height height in pixels
mia_0032 0:01f630b61d0f 297 * @param colour 24-bit colour in format 0x00RRGGBB
mia_0032 0:01f630b61d0f 298 */
mia_0032 0:01f630b61d0f 299
mia_0032 0:01f630b61d0f 300 void fill( int x, int y, int width, int height, int colour ) {
mia_0032 0:01f630b61d0f 301 _cs = 0;
mia_0032 0:01f630b61d0f 302 _window( x, y, width, height );
mia_0032 0:01f630b61d0f 303
mia_0032 0:01f630b61d0f 304 for (int i = 0; i < width * height; i++ ) {
mia_0032 0:01f630b61d0f 305 _putp( colour );
mia_0032 0:01f630b61d0f 306 }
mia_0032 0:01f630b61d0f 307
mia_0032 0:01f630b61d0f 308 _window( 0, 0, WIDTH, HEIGHT );
mia_0032 0:01f630b61d0f 309 _cs = 1;
mia_0032 0:01f630b61d0f 310 }
mia_0032 0:01f630b61d0f 311
mia_0032 0:01f630b61d0f 312 void blit( int x, int y, int width, int height, const int* colour ) {
mia_0032 0:01f630b61d0f 313 _cs = 0;
mia_0032 0:01f630b61d0f 314 _window( x, y, width, height );
mia_0032 0:01f630b61d0f 315
mia_0032 0:01f630b61d0f 316 for (int i = 0; i < width * height; i++ ) {
mia_0032 0:01f630b61d0f 317 _putp( colour[i] );
mia_0032 0:01f630b61d0f 318 }
mia_0032 0:01f630b61d0f 319 _window( 0, 0, WIDTH, HEIGHT );
mia_0032 0:01f630b61d0f 320 _cs = 1;
mia_0032 0:01f630b61d0f 321 }
mia_0032 0:01f630b61d0f 322
mia_0032 0:01f630b61d0f 323 void bitblit( int x, int y, int width, int height, const char* bitstream ) {
mia_0032 0:01f630b61d0f 324 _cs = 0;
mia_0032 0:01f630b61d0f 325 _window( x, y, width, height );
mia_0032 0:01f630b61d0f 326
mia_0032 0:01f630b61d0f 327 for (int i = 0; i < height * width; i++ ) {
mia_0032 0:01f630b61d0f 328 int byte = i / 8;
mia_0032 0:01f630b61d0f 329 int bit = i % 8;
mia_0032 0:01f630b61d0f 330 int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background;
mia_0032 0:01f630b61d0f 331 _putp( colour );
mia_0032 0:01f630b61d0f 332 }
mia_0032 0:01f630b61d0f 333 _window( 0, 0, _width, _height );
mia_0032 0:01f630b61d0f 334 _cs = 1;
mia_0032 0:01f630b61d0f 335 }
mia_0032 0:01f630b61d0f 336
mia_0032 0:01f630b61d0f 337 /** Screen width
mia_0032 0:01f630b61d0f 338 *
mia_0032 0:01f630b61d0f 339 * @return screen width [pixel]
mia_0032 0:01f630b61d0f 340 */
mia_0032 0:01f630b61d0f 341 int width() {
mia_0032 0:01f630b61d0f 342 return WIDTH;
mia_0032 0:01f630b61d0f 343 }
mia_0032 0:01f630b61d0f 344
mia_0032 0:01f630b61d0f 345 /** Screen height
mia_0032 0:01f630b61d0f 346 *
mia_0032 0:01f630b61d0f 347 * @return screen height [pixel]
mia_0032 0:01f630b61d0f 348 */
mia_0032 0:01f630b61d0f 349 int height() {
mia_0032 0:01f630b61d0f 350 return HEIGHT;
mia_0032 0:01f630b61d0f 351 }
mia_0032 0:01f630b61d0f 352 /** Columns
mia_0032 0:01f630b61d0f 353 *
mia_0032 0:01f630b61d0f 354 * @return screen columns
mia_0032 0:01f630b61d0f 355 */
mia_0032 0:01f630b61d0f 356 int columns() {
mia_0032 0:01f630b61d0f 357 return COLS;
mia_0032 0:01f630b61d0f 358 }
mia_0032 0:01f630b61d0f 359
mia_0032 0:01f630b61d0f 360 /** Rows
mia_0032 0:01f630b61d0f 361 *
mia_0032 0:01f630b61d0f 362 * @return screen rows
mia_0032 0:01f630b61d0f 363 */
mia_0032 0:01f630b61d0f 364 int rows() {
mia_0032 0:01f630b61d0f 365 return ROWS;
mia_0032 0:01f630b61d0f 366 }
mia_0032 0:01f630b61d0f 367
mia_0032 0:01f630b61d0f 368 /** Power switch for OLED backlight
mia_0032 0:01f630b61d0f 369 *
mia_0032 0:01f630b61d0f 370 * @param sw argument can be MARMEX_OB_oled::ON or MARMEX_OB_oled::OFF
mia_0032 0:01f630b61d0f 371 */
mia_0032 0:01f630b61d0f 372
mia_0032 0:01f630b61d0f 373 void power( unsigned char sw ) {
mia_0032 0:01f630b61d0f 374 _power_pin = sw;
mia_0032 0:01f630b61d0f 375 }
mia_0032 0:01f630b61d0f 376
mia_0032 0:01f630b61d0f 377 private:
mia_0032 0:01f630b61d0f 378 /** Command list for the OLED controller */
mia_0032 0:01f630b61d0f 379 enum {
mia_0032 0:01f630b61d0f 380 SET_DISPLAY_MODE_ALL_OFF = 0xA4,
mia_0032 0:01f630b61d0f 381 SET_COMMAND_LOCK = 0xFD,
mia_0032 0:01f630b61d0f 382 SET_SLEEP_MODE_ON = 0xAE,
mia_0032 0:01f630b61d0f 383 FRONT_CLOCK_DRIVER_OSC_FREQ = 0xB3,
mia_0032 0:01f630b61d0f 384 SET_MUX_RATIO = 0xCA,
mia_0032 0:01f630b61d0f 385 SET_DISPAY_OFFSET = 0xA2,
mia_0032 0:01f630b61d0f 386 SET_DISPAY_START_LINE = 0xA1,
mia_0032 0:01f630b61d0f 387 SET_REMAP_COLOR_DEPTH = 0xA0,
mia_0032 0:01f630b61d0f 388 SET_GPIO = 0xB5,
mia_0032 0:01f630b61d0f 389 FUNCTION_SELECTION = 0xAB,
mia_0032 0:01f630b61d0f 390 SET_SEGMENT_LOW_VOLTAGE = 0xB4,
mia_0032 0:01f630b61d0f 391 SET_CONTRAST_CURRENT_FOR_COLOR_ABC = 0xC1,
mia_0032 0:01f630b61d0f 392 MASTER_CONTRAST_CURRENT_CONTROL = 0xC7,
mia_0032 0:01f630b61d0f 393 LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH = 0xB8,
mia_0032 0:01f630b61d0f 394 SET_RESET_PRECHARGE_PERIOD = 0xB1,
mia_0032 0:01f630b61d0f 395 ENHANCE_DRIVING_SCHEME_CAPABILITY = 0xB2,
mia_0032 0:01f630b61d0f 396 SET_PRECHARGE_VOLTAGE = 0xBB,
mia_0032 0:01f630b61d0f 397 SET_SECOND_PRECHARGE_VOLTAGE = 0xB6,
mia_0032 0:01f630b61d0f 398 SET_VCOMH_VOLTAGE = 0xBE,
mia_0032 0:01f630b61d0f 399 SET_DISPLAY_MODE_RESET = 0xA6,
mia_0032 0:01f630b61d0f 400 SET_COLUMN_ADDRESS = 0x15,
mia_0032 0:01f630b61d0f 401 SET_ROW_ADDRESS = 0x75,
mia_0032 0:01f630b61d0f 402 WRITE_RAM_COMMAND = 0x5C,
mia_0032 0:01f630b61d0f 403 SET_SLEEP_MODE_OFF = 0xAF
mia_0032 0:01f630b61d0f 404 };
mia_0032 0:01f630b61d0f 405
mia_0032 0:01f630b61d0f 406 #ifdef MARMEX_OB_SPI_8BIT_MODE
mia_0032 0:01f630b61d0f 407 void command( int value ) {
mia_0032 0:01f630b61d0f 408 int tmp = value & 0x00ff;
mia_0032 0:01f630b61d0f 409 _cs = 0;
mia_0032 0:01f630b61d0f 410 _spi.write( tmp >> 1 );
mia_0032 0:01f630b61d0f 411 _spi.write( tmp << 7 );
mia_0032 0:01f630b61d0f 412 _cs = 1;
mia_0032 0:01f630b61d0f 413 }
mia_0032 0:01f630b61d0f 414
mia_0032 0:01f630b61d0f 415 void data( int value ) {
mia_0032 0:01f630b61d0f 416 int tmp = value & 0x00ff;
mia_0032 0:01f630b61d0f 417 tmp |= 0x0100;
mia_0032 0:01f630b61d0f 418 _cs = 0;
mia_0032 0:01f630b61d0f 419 _spi.write( tmp >> 1 );
mia_0032 0:01f630b61d0f 420 _spi.write( tmp << 7 );
mia_0032 0:01f630b61d0f 421 _cs = 1;
mia_0032 0:01f630b61d0f 422 }
mia_0032 0:01f630b61d0f 423 #else
mia_0032 0:01f630b61d0f 424 void command( int value ) {
mia_0032 0:01f630b61d0f 425 _cs = 0;
mia_0032 0:01f630b61d0f 426 _spi.write( value & 0xFF );
mia_0032 0:01f630b61d0f 427 _cs = 1;
mia_0032 0:01f630b61d0f 428 }
mia_0032 0:01f630b61d0f 429
mia_0032 0:01f630b61d0f 430 void data(int value) {
mia_0032 0:01f630b61d0f 431 _cs = 0;
mia_0032 0:01f630b61d0f 432 _spi.write( value | 0x100 );
mia_0032 0:01f630b61d0f 433 _cs = 1;
mia_0032 0:01f630b61d0f 434 }
mia_0032 0:01f630b61d0f 435 #endif
mia_0032 0:01f630b61d0f 436
mia_0032 0:01f630b61d0f 437 virtual void _window( int x, int y, int width, int height ) {
mia_0032 0:01f630b61d0f 438 int x1 = x + 0;
mia_0032 0:01f630b61d0f 439 int y1 = y + 0;
mia_0032 0:01f630b61d0f 440 int x2 = x1 + width - 1;
mia_0032 0:01f630b61d0f 441 int y2 = y1 + height - 1;
mia_0032 0:01f630b61d0f 442
mia_0032 0:01f630b61d0f 443 command( SET_COLUMN_ADDRESS );
mia_0032 0:01f630b61d0f 444 data( x1 );
mia_0032 0:01f630b61d0f 445 data( x2 );
mia_0032 0:01f630b61d0f 446 command( SET_ROW_ADDRESS );
mia_0032 0:01f630b61d0f 447 data( y1 );
mia_0032 0:01f630b61d0f 448 data( y2 );
mia_0032 0:01f630b61d0f 449 command( WRITE_RAM_COMMAND );
mia_0032 0:01f630b61d0f 450 }
mia_0032 0:01f630b61d0f 451
mia_0032 0:01f630b61d0f 452 void window( int x, int y, int width, int height ) {
mia_0032 0:01f630b61d0f 453 _cs = 0;
mia_0032 0:01f630b61d0f 454 _window( x, y, width, height );
mia_0032 0:01f630b61d0f 455 _cs = 1;
mia_0032 0:01f630b61d0f 456 }
mia_0032 0:01f630b61d0f 457
mia_0032 0:01f630b61d0f 458 virtual void _putp( int colour ) {
mia_0032 0:01f630b61d0f 459 int cnv = 0;
mia_0032 0:01f630b61d0f 460
mia_0032 0:01f630b61d0f 461 cnv = (colour >> 8) & 0xf800;
mia_0032 0:01f630b61d0f 462 cnv |= (colour >> 5) & 0x07e0;
mia_0032 0:01f630b61d0f 463 cnv |= (colour >> 3) & 0x001f;
mia_0032 0:01f630b61d0f 464
mia_0032 0:01f630b61d0f 465 data( cnv >> 8);
mia_0032 0:01f630b61d0f 466 data( cnv );
mia_0032 0:01f630b61d0f 467 }
mia_0032 0:01f630b61d0f 468
mia_0032 0:01f630b61d0f 469 DigitalOut _power_pin;
mia_0032 0:01f630b61d0f 470 }
mia_0032 0:01f630b61d0f 471 ;
mia_0032 0:01f630b61d0f 472
mia_0032 0:01f630b61d0f 473 #ifdef MARMEX_OB_SPI_8BIT_MODE
mia_0032 0:01f630b61d0f 474 #define MERMEX_OB_SPI_MODE_STR "8bit mode"
mia_0032 0:01f630b61d0f 475 #else
mia_0032 0:01f630b61d0f 476 #define MERMEX_OB_SPI_MODE_STR "9bit mode"
mia_0032 0:01f630b61d0f 477 #endif
mia_0032 0:01f630b61d0f 478 #endif // MBED_MARMEX_OB_OLED
mia_0032 0:01f630b61d0f 479
mia_0032 0:01f630b61d0f 480 /*
mia_0032 0:01f630b61d0f 481 * history:
mia_0032 0:01f630b61d0f 482 * 0.5 (2011-Apr-07) : initial published version
mia_0032 0:01f630b61d0f 483 * 0.51 (2011-Apr-08) : a. "virtual" had been added on "_putp()" function definition to surpress warning when compiling (is this correct way?)
mia_0032 0:01f630b61d0f 484 * b. sample code (for Doxygen) is changed from new "main.cpp (ver 0.51)"
mia_0032 0:01f630b61d0f 485 */