Hexiwear OLED

Dependents:   Hexi

Fork of Hexi_OLED_SSD1351 by Hexiwear

Committer:
khuang
Date:
Fri Aug 26 15:21:54 2016 +0000
Revision:
3:4121d3cd9f60
Parent:
2:fc06b5b5bf6a
Child:
4:38086393d75b
Test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khuang 2:fc06b5b5bf6a 1 /**
khuang 2:fc06b5b5bf6a 2 * \file Hexi_OLED_SSD1351.cpp
khuang 2:fc06b5b5bf6a 3 * \version 1.00
khuang 2:fc06b5b5bf6a 4 * \brief this file contains OLED driver functionality for
khuang 2:fc06b5b5bf6a 5 * drawing images and text
khuang 2:fc06b5b5bf6a 6 *
khuang 2:fc06b5b5bf6a 7 * Redistribution and use in source and binary forms, with or without modification,
khuang 2:fc06b5b5bf6a 8 * are permitted provided that the following conditions are met:
khuang 2:fc06b5b5bf6a 9 *
khuang 2:fc06b5b5bf6a 10 * Redistributions of source code must retain the above copyright notice, this list
khuang 2:fc06b5b5bf6a 11 * of conditions and the following disclaimer.
khuang 2:fc06b5b5bf6a 12 *
khuang 2:fc06b5b5bf6a 13 * Redistributions in binary form must reproduce the above copyright notice, this
khuang 2:fc06b5b5bf6a 14 * list of conditions and the following disclaimer in the documentation and/or
khuang 2:fc06b5b5bf6a 15 * other materials provided with the distribution.
khuang 2:fc06b5b5bf6a 16 *
khuang 2:fc06b5b5bf6a 17 * Neither the name of NXP, nor the names of its
khuang 2:fc06b5b5bf6a 18 * contributors may be used to endorse or promote products derived from this
khuang 2:fc06b5b5bf6a 19 * software without specific prior written permission.
khuang 2:fc06b5b5bf6a 20 *
khuang 2:fc06b5b5bf6a 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
khuang 2:fc06b5b5bf6a 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
khuang 2:fc06b5b5bf6a 23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
khuang 2:fc06b5b5bf6a 24 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
khuang 2:fc06b5b5bf6a 25 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
khuang 2:fc06b5b5bf6a 26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
khuang 2:fc06b5b5bf6a 27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
khuang 2:fc06b5b5bf6a 28 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
khuang 2:fc06b5b5bf6a 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
khuang 2:fc06b5b5bf6a 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
khuang 2:fc06b5b5bf6a 31 *
khuang 2:fc06b5b5bf6a 32 * visit: http://www.mikroe.com and http://www.nxp.com
khuang 2:fc06b5b5bf6a 33 *
khuang 2:fc06b5b5bf6a 34 * get support at: http://www.mikroe.com/forum and https://community.nxp.com
khuang 2:fc06b5b5bf6a 35 *
khuang 2:fc06b5b5bf6a 36 * Project HEXIWEAR, 2015
khuang 2:fc06b5b5bf6a 37 */
khuang 2:fc06b5b5bf6a 38
khuang 1:3b5be0ee5f0c 39 #include "OLED_types.h"
khuang 1:3b5be0ee5f0c 40 #include "OLED_info.h"
khuang 1:3b5be0ee5f0c 41 #include "mbed.h"
khuang 1:3b5be0ee5f0c 42 #include "Hexi_OLED_SSD1351.h"
khuang 1:3b5be0ee5f0c 43 #include "OLED_fonts.h"
khuang 2:fc06b5b5bf6a 44
khuang 2:fc06b5b5bf6a 45 const init_cmd_t seq[] = {
khuang 2:fc06b5b5bf6a 46 OLED_CMD_SET_CMD_LOCK, CMD_BYTE,
khuang 2:fc06b5b5bf6a 47 OLED_UNLOCK, DATA_BYTE,
khuang 2:fc06b5b5bf6a 48 OLED_CMD_SET_CMD_LOCK, CMD_BYTE,
khuang 2:fc06b5b5bf6a 49 OLED_ACC_TO_CMD_YES, DATA_BYTE,
khuang 2:fc06b5b5bf6a 50 OLED_CMD_DISPLAYOFF, CMD_BYTE,
khuang 2:fc06b5b5bf6a 51 OLED_CMD_SET_OSC_FREQ_AND_CLOCKDIV, CMD_BYTE,
khuang 2:fc06b5b5bf6a 52 0xF1, DATA_BYTE,
khuang 2:fc06b5b5bf6a 53 OLED_CMD_SET_MUX_RATIO, CMD_BYTE,
khuang 2:fc06b5b5bf6a 54 0x5F, DATA_BYTE,
khuang 2:fc06b5b5bf6a 55 OLED_CMD_SET_REMAP, CMD_BYTE,
khuang 2:fc06b5b5bf6a 56 OLED_REMAP_SETTINGS, DATA_BYTE,
khuang 2:fc06b5b5bf6a 57 OLED_CMD_SET_COLUMN, CMD_BYTE,
khuang 2:fc06b5b5bf6a 58 0x00, DATA_BYTE,
khuang 2:fc06b5b5bf6a 59 0x5F, DATA_BYTE,
khuang 2:fc06b5b5bf6a 60 OLED_CMD_SET_ROW, CMD_BYTE,
khuang 2:fc06b5b5bf6a 61 0x00, DATA_BYTE,
khuang 2:fc06b5b5bf6a 62 0x5F, DATA_BYTE,
khuang 2:fc06b5b5bf6a 63 OLED_CMD_STARTLINE, CMD_BYTE,
khuang 2:fc06b5b5bf6a 64 0x80, DATA_BYTE,
khuang 2:fc06b5b5bf6a 65 OLED_CMD_DISPLAYOFFSET, CMD_BYTE,
khuang 2:fc06b5b5bf6a 66 0x60, DATA_BYTE,
khuang 2:fc06b5b5bf6a 67 OLED_CMD_PRECHARGE, CMD_BYTE,
khuang 2:fc06b5b5bf6a 68 0x32, CMD_BYTE,
khuang 2:fc06b5b5bf6a 69 OLED_CMD_VCOMH, CMD_BYTE,
khuang 2:fc06b5b5bf6a 70 0x05, CMD_BYTE,
khuang 2:fc06b5b5bf6a 71 OLED_CMD_NORMALDISPLAY, CMD_BYTE,
khuang 2:fc06b5b5bf6a 72 OLED_CMD_CONTRASTABC, CMD_BYTE,
khuang 2:fc06b5b5bf6a 73 0x8A, DATA_BYTE,
khuang 2:fc06b5b5bf6a 74 0x51, DATA_BYTE,
khuang 2:fc06b5b5bf6a 75 0x8A, DATA_BYTE,
khuang 2:fc06b5b5bf6a 76 OLED_CMD_CONTRASTMASTER, CMD_BYTE,
khuang 2:fc06b5b5bf6a 77 0xCF, DATA_BYTE,
khuang 2:fc06b5b5bf6a 78 OLED_CMD_SETVSL, CMD_BYTE,
khuang 2:fc06b5b5bf6a 79 0xA0, DATA_BYTE,
khuang 2:fc06b5b5bf6a 80 0xB5, DATA_BYTE,
khuang 2:fc06b5b5bf6a 81 0x55, DATA_BYTE,
khuang 2:fc06b5b5bf6a 82 OLED_CMD_PRECHARGE2, CMD_BYTE,
khuang 2:fc06b5b5bf6a 83 0x01, DATA_BYTE,
khuang 2:fc06b5b5bf6a 84 OLED_CMD_DISPLAYON, CMD_BYTE
khuang 2:fc06b5b5bf6a 85 };
khuang 1:3b5be0ee5f0c 86
khuang 1:3b5be0ee5f0c 87
khuang 1:3b5be0ee5f0c 88
khuang 1:3b5be0ee5f0c 89 SSD1351::SSD1351(PinName mosiPin,PinName sclkPin,PinName pwrPin, PinName csPin,PinName rstPin, PinName dcPin): spi(mosiPin,NC,sclkPin) , power(pwrPin), cs(csPin),rst(rstPin),dc(dcPin)
khuang 1:3b5be0ee5f0c 90 {
khuang 1:3b5be0ee5f0c 91
khuang 1:3b5be0ee5f0c 92 spi.frequency(8000000);
khuang 1:3b5be0ee5f0c 93
khuang 1:3b5be0ee5f0c 94
khuang 1:3b5be0ee5f0c 95 dc =0;
khuang 1:3b5be0ee5f0c 96 PowerOFF();
khuang 1:3b5be0ee5f0c 97 wait_ms(1);
khuang 1:3b5be0ee5f0c 98 rst = 0 ;
khuang 1:3b5be0ee5f0c 99 wait_ms(1);
khuang 1:3b5be0ee5f0c 100 rst = 1 ;
khuang 1:3b5be0ee5f0c 101 wait_ms(1);
khuang 1:3b5be0ee5f0c 102 PowerON();
khuang 1:3b5be0ee5f0c 103
khuang 1:3b5be0ee5f0c 104 isFontInitialized = 0 ;
khuang 1:3b5be0ee5f0c 105 currentChar_width = 0,
khuang 1:3b5be0ee5f0c 106 currentChar_height = 0;
khuang 1:3b5be0ee5f0c 107 colorMask = COLOR_WHITE;
khuang 1:3b5be0ee5f0c 108
khuang 1:3b5be0ee5f0c 109 oled_text_properties.alignParam = OLED_TEXT_ALIGN_CENTER;
khuang 1:3b5be0ee5f0c 110 oled_text_properties.background = NULL;
khuang 3:4121d3cd9f60 111 oled_text_properties.font = OpenSans_10x15_Regular;
khuang 1:3b5be0ee5f0c 112 oled_text_properties.fontColor = COLOR_RED;
khuang 1:3b5be0ee5f0c 113
khuang 1:3b5be0ee5f0c 114 oled_dynamic_area.areaBuffer = NULL;
khuang 1:3b5be0ee5f0c 115 oled_dynamic_area.height = 0;
khuang 1:3b5be0ee5f0c 116 oled_dynamic_area.width = 0;
khuang 1:3b5be0ee5f0c 117 oled_dynamic_area.xCrd = 0;
khuang 1:3b5be0ee5f0c 118 oled_dynamic_area.yCrd = 0;
khuang 1:3b5be0ee5f0c 119
khuang 1:3b5be0ee5f0c 120
khuang 1:3b5be0ee5f0c 121
khuang 1:3b5be0ee5f0c 122 for (int i=0;i<39;i++)
khuang 1:3b5be0ee5f0c 123 {
khuang 2:fc06b5b5bf6a 124 SendCmd(seq[i].cmd, seq[i].type);
khuang 1:3b5be0ee5f0c 125 }
khuang 1:3b5be0ee5f0c 126
khuang 1:3b5be0ee5f0c 127
khuang 1:3b5be0ee5f0c 128
khuang 1:3b5be0ee5f0c 129 }
khuang 1:3b5be0ee5f0c 130
khuang 1:3b5be0ee5f0c 131
khuang 1:3b5be0ee5f0c 132 SSD1351::~SSD1351(void)
khuang 1:3b5be0ee5f0c 133 {
khuang 1:3b5be0ee5f0c 134
khuang 1:3b5be0ee5f0c 135 //Run Free and zero pointers.
khuang 1:3b5be0ee5f0c 136 }
khuang 1:3b5be0ee5f0c 137
khuang 1:3b5be0ee5f0c 138
khuang 1:3b5be0ee5f0c 139
khuang 1:3b5be0ee5f0c 140
khuang 1:3b5be0ee5f0c 141 void SSD1351::SendCmd(uint32_t cmd,
khuang 1:3b5be0ee5f0c 142 uint8_t isFirst)
khuang 1:3b5be0ee5f0c 143 {
khuang 1:3b5be0ee5f0c 144
khuang 1:3b5be0ee5f0c 145
khuang 1:3b5be0ee5f0c 146
khuang 1:3b5be0ee5f0c 147 uint8_t
khuang 1:3b5be0ee5f0c 148 txSize = 1,
khuang 1:3b5be0ee5f0c 149 txBuf[4];
khuang 1:3b5be0ee5f0c 150
khuang 1:3b5be0ee5f0c 151 memcpy((void*)txBuf, (void*)&cmd, txSize );
khuang 1:3b5be0ee5f0c 152
khuang 1:3b5be0ee5f0c 153 if (isFirst )
khuang 1:3b5be0ee5f0c 154 {
khuang 1:3b5be0ee5f0c 155 dc = 0;
khuang 1:3b5be0ee5f0c 156 }
khuang 1:3b5be0ee5f0c 157 else
khuang 1:3b5be0ee5f0c 158 {
khuang 1:3b5be0ee5f0c 159 dc = 1;
khuang 1:3b5be0ee5f0c 160 }
khuang 1:3b5be0ee5f0c 161
khuang 1:3b5be0ee5f0c 162 cs = 0;
khuang 1:3b5be0ee5f0c 163 spi.write(*txBuf);
khuang 1:3b5be0ee5f0c 164 cs = 1;
khuang 1:3b5be0ee5f0c 165
khuang 1:3b5be0ee5f0c 166 }
khuang 1:3b5be0ee5f0c 167
khuang 1:3b5be0ee5f0c 168
khuang 1:3b5be0ee5f0c 169
khuang 1:3b5be0ee5f0c 170 void SSD1351::SendData ( const uint8_t* dataToSend,
khuang 1:3b5be0ee5f0c 171 uint32_t dataSize)
khuang 1:3b5be0ee5f0c 172
khuang 1:3b5be0ee5f0c 173 {
khuang 1:3b5be0ee5f0c 174
khuang 1:3b5be0ee5f0c 175
khuang 1:3b5be0ee5f0c 176 uint16_t* arrayPtr = (uint16_t*)dataToSend;
khuang 1:3b5be0ee5f0c 177
khuang 1:3b5be0ee5f0c 178 for( uint32_t i = 0; i < dataSize/2; i++ )
khuang 1:3b5be0ee5f0c 179 {
khuang 1:3b5be0ee5f0c 180 arrayPtr[i] &= colorMask;
khuang 1:3b5be0ee5f0c 181 }
khuang 1:3b5be0ee5f0c 182
khuang 1:3b5be0ee5f0c 183
khuang 2:fc06b5b5bf6a 184 this->SendCmd( OLED_CMD_WRITERAM, CMD_BYTE );
khuang 1:3b5be0ee5f0c 185
khuang 1:3b5be0ee5f0c 186
khuang 1:3b5be0ee5f0c 187 // sending data -> set DC pin
khuang 1:3b5be0ee5f0c 188
khuang 1:3b5be0ee5f0c 189 dc = 1;
khuang 1:3b5be0ee5f0c 190 cs = 0 ;
khuang 1:3b5be0ee5f0c 191
khuang 1:3b5be0ee5f0c 192
khuang 1:3b5be0ee5f0c 193 const uint8_t*
khuang 1:3b5be0ee5f0c 194 // traversing pointer
khuang 1:3b5be0ee5f0c 195 bufPtr = dataToSend;
khuang 1:3b5be0ee5f0c 196
khuang 1:3b5be0ee5f0c 197
khuang 1:3b5be0ee5f0c 198 for ( uint32_t i = 0; i < dataSize; i++)
khuang 1:3b5be0ee5f0c 199 {
khuang 1:3b5be0ee5f0c 200 spi.write(*bufPtr);
khuang 1:3b5be0ee5f0c 201 bufPtr += 1;
khuang 1:3b5be0ee5f0c 202 }
khuang 1:3b5be0ee5f0c 203
khuang 1:3b5be0ee5f0c 204
khuang 1:3b5be0ee5f0c 205 cs = 1;
khuang 1:3b5be0ee5f0c 206
khuang 1:3b5be0ee5f0c 207 }
khuang 1:3b5be0ee5f0c 208
khuang 1:3b5be0ee5f0c 209
khuang 1:3b5be0ee5f0c 210 oled_status_t SSD1351::DrawBox (
khuang 1:3b5be0ee5f0c 211 uint16_t xCrd,
khuang 1:3b5be0ee5f0c 212 uint16_t yCrd,
khuang 1:3b5be0ee5f0c 213 uint16_t width,
khuang 1:3b5be0ee5f0c 214 uint16_t height,
khuang 1:3b5be0ee5f0c 215 uint16_t color
khuang 1:3b5be0ee5f0c 216 )
khuang 1:3b5be0ee5f0c 217 {
khuang 1:3b5be0ee5f0c 218
khuang 1:3b5be0ee5f0c 219 oled_status_t status;
khuang 1:3b5be0ee5f0c 220 oled_dynamic_area_t boxArea;
khuang 1:3b5be0ee5f0c 221
khuang 1:3b5be0ee5f0c 222 boxArea.xCrd = xCrd;
khuang 1:3b5be0ee5f0c 223 boxArea.yCrd = yCrd;
khuang 1:3b5be0ee5f0c 224 boxArea.width = width;
khuang 1:3b5be0ee5f0c 225 boxArea.height = height;
khuang 1:3b5be0ee5f0c 226
khuang 1:3b5be0ee5f0c 227 uint32_t
khuang 1:3b5be0ee5f0c 228 boxSize = width*height;
khuang 1:3b5be0ee5f0c 229
khuang 1:3b5be0ee5f0c 230 SetDynamicArea( &boxArea );
khuang 1:3b5be0ee5f0c 231
khuang 1:3b5be0ee5f0c 232 // helper pointer
khuang 1:3b5be0ee5f0c 233 uint8_t*
khuang 1:3b5be0ee5f0c 234 boxBuf = (uint8_t*)oled_dynamic_area.areaBuffer;
khuang 1:3b5be0ee5f0c 235
khuang 1:3b5be0ee5f0c 236 if ( NULL == boxBuf )
khuang 1:3b5be0ee5f0c 237 {
khuang 1:3b5be0ee5f0c 238
khuang 1:3b5be0ee5f0c 239 return OLED_STATUS_ERROR;
khuang 1:3b5be0ee5f0c 240 }
khuang 1:3b5be0ee5f0c 241
khuang 1:3b5be0ee5f0c 242 // check the bounds
khuang 1:3b5be0ee5f0c 243 if AreCoordsNotValid( xCrd, yCrd, width, height )
khuang 1:3b5be0ee5f0c 244 {
khuang 1:3b5be0ee5f0c 245 status = OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 246 }
khuang 1:3b5be0ee5f0c 247
khuang 1:3b5be0ee5f0c 248 else
khuang 1:3b5be0ee5f0c 249 {
khuang 1:3b5be0ee5f0c 250 /** fill the buffer with color */
khuang 1:3b5be0ee5f0c 251
khuang 1:3b5be0ee5f0c 252 for ( uint16_t i = 0; i < boxSize; i++ )
khuang 1:3b5be0ee5f0c 253 {
khuang 1:3b5be0ee5f0c 254 boxBuf[ 2*i ] = color >> 8;
khuang 1:3b5be0ee5f0c 255 boxBuf[ 2*i + 1 ] = color;
khuang 1:3b5be0ee5f0c 256 }
khuang 1:3b5be0ee5f0c 257
khuang 1:3b5be0ee5f0c 258 /** set the locations */
khuang 1:3b5be0ee5f0c 259
khuang 1:3b5be0ee5f0c 260 // adjust for the offset
khuang 1:3b5be0ee5f0c 261 OLED_AdjustColumnOffset(xCrd);
khuang 1:3b5be0ee5f0c 262 OLED_AdjustRowOffset(yCrd);
khuang 1:3b5be0ee5f0c 263
khuang 2:fc06b5b5bf6a 264 SendCmd( OLED_CMD_SET_COLUMN, CMD_BYTE);
khuang 2:fc06b5b5bf6a 265 SendCmd( xCrd, DATA_BYTE );
khuang 2:fc06b5b5bf6a 266 SendCmd( xCrd + (width-1), DATA_BYTE );
khuang 2:fc06b5b5bf6a 267 SendCmd( OLED_CMD_SET_ROW, CMD_BYTE );
khuang 2:fc06b5b5bf6a 268 SendCmd( yCrd, DATA_BYTE );
khuang 2:fc06b5b5bf6a 269 SendCmd( yCrd + (height-1), DATA_BYTE );
khuang 1:3b5be0ee5f0c 270
khuang 1:3b5be0ee5f0c 271
khuang 1:3b5be0ee5f0c 272 // fill the GRAM
khuang 1:3b5be0ee5f0c 273 SendData( (uint8_t*)boxBuf, boxSize*OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 274
khuang 1:3b5be0ee5f0c 275 DestroyDynamicArea();
khuang 1:3b5be0ee5f0c 276
khuang 1:3b5be0ee5f0c 277 }
khuang 1:3b5be0ee5f0c 278
khuang 1:3b5be0ee5f0c 279 return status;
khuang 1:3b5be0ee5f0c 280 }
khuang 1:3b5be0ee5f0c 281
khuang 1:3b5be0ee5f0c 282 /**
khuang 1:3b5be0ee5f0c 283 * fill the entire screen
khuang 1:3b5be0ee5f0c 284 * @param color color to fill with
khuang 1:3b5be0ee5f0c 285 * @return status flag
khuang 1:3b5be0ee5f0c 286 */
khuang 1:3b5be0ee5f0c 287 void SSD1351::FillScreen( uint16_t color )
khuang 1:3b5be0ee5f0c 288 {
khuang 1:3b5be0ee5f0c 289 /** fill the screen buffer with color */
khuang 1:3b5be0ee5f0c 290 for ( uint16_t i = 0; i < ( OLED_SCREEN_WIDTH * OLED_SCREEN_HEIGHT ); i++ )
khuang 1:3b5be0ee5f0c 291 {
khuang 1:3b5be0ee5f0c 292 screenBuf[ 2*i ] = color >> 8;
khuang 1:3b5be0ee5f0c 293 screenBuf[ 2*i + 1 ] = color;
khuang 1:3b5be0ee5f0c 294 }
khuang 1:3b5be0ee5f0c 295
khuang 1:3b5be0ee5f0c 296 /** set the locations */
khuang 1:3b5be0ee5f0c 297 SetBorders( 0, 0, OLED_SCREEN_WIDTH, OLED_SCREEN_HEIGHT );
khuang 1:3b5be0ee5f0c 298
khuang 1:3b5be0ee5f0c 299 /** fill GRAM */
khuang 1:3b5be0ee5f0c 300 SendData( (uint8_t*)screenBuf, OLED_SCREEN_WIDTH * OLED_SCREEN_HEIGHT * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 301
khuang 1:3b5be0ee5f0c 302 }
khuang 1:3b5be0ee5f0c 303
khuang 1:3b5be0ee5f0c 304
khuang 1:3b5be0ee5f0c 305
khuang 1:3b5be0ee5f0c 306 oled_status_t SSD1351::DrawPixel (
khuang 1:3b5be0ee5f0c 307 int16_t xCrd,
khuang 1:3b5be0ee5f0c 308 int16_t yCrd,
khuang 1:3b5be0ee5f0c 309 uint16_t color
khuang 1:3b5be0ee5f0c 310 )
khuang 1:3b5be0ee5f0c 311 {
khuang 1:3b5be0ee5f0c 312 // check the bounds
khuang 1:3b5be0ee5f0c 313 if AreCoordsNotValid( xCrd, yCrd, 1, 1 )
khuang 1:3b5be0ee5f0c 314 {
khuang 1:3b5be0ee5f0c 315 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 316 }
khuang 1:3b5be0ee5f0c 317
khuang 1:3b5be0ee5f0c 318 else
khuang 1:3b5be0ee5f0c 319 {
khuang 1:3b5be0ee5f0c 320 // set directions
khuang 1:3b5be0ee5f0c 321 SetBorders( xCrd, yCrd, OLED_SCREEN_WIDTH, OLED_SCREEN_HEIGHT);
khuang 1:3b5be0ee5f0c 322
khuang 1:3b5be0ee5f0c 323 uint16_t
khuang 1:3b5be0ee5f0c 324 // swap bytes
khuang 1:3b5be0ee5f0c 325 dot = color;
khuang 1:3b5be0ee5f0c 326
khuang 1:3b5be0ee5f0c 327 OLED_SwapMe(dot);
khuang 1:3b5be0ee5f0c 328
khuang 1:3b5be0ee5f0c 329 // fill the GRAM
khuang 1:3b5be0ee5f0c 330 SendData( (uint8_t*)&dot, 2 );
khuang 1:3b5be0ee5f0c 331
khuang 1:3b5be0ee5f0c 332 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 333 }
khuang 1:3b5be0ee5f0c 334 }
khuang 1:3b5be0ee5f0c 335
khuang 1:3b5be0ee5f0c 336
khuang 1:3b5be0ee5f0c 337 oled_status_t SSD1351::DrawScreen (
khuang 1:3b5be0ee5f0c 338 const uint8_t* image,
khuang 1:3b5be0ee5f0c 339 uint8_t xCrd,
khuang 1:3b5be0ee5f0c 340 uint8_t yCrd,
khuang 1:3b5be0ee5f0c 341 uint8_t width,
khuang 1:3b5be0ee5f0c 342 uint8_t height,
khuang 1:3b5be0ee5f0c 343 oled_transition_t transition
khuang 1:3b5be0ee5f0c 344 )
khuang 1:3b5be0ee5f0c 345 {
khuang 1:3b5be0ee5f0c 346 oled_status_t
khuang 1:3b5be0ee5f0c 347 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 348
khuang 1:3b5be0ee5f0c 349 if AreCoordsNotValid( xCrd, yCrd, width, height )
khuang 1:3b5be0ee5f0c 350 {
khuang 1:3b5be0ee5f0c 351 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 352 }
khuang 1:3b5be0ee5f0c 353
khuang 1:3b5be0ee5f0c 354 switch ( transition )
khuang 1:3b5be0ee5f0c 355 {
khuang 1:3b5be0ee5f0c 356 case OLED_TRANSITION_NONE: {
khuang 1:3b5be0ee5f0c 357 /** set the locations */
khuang 1:3b5be0ee5f0c 358 SetBorders( xCrd, yCrd, width, height);
khuang 1:3b5be0ee5f0c 359
khuang 1:3b5be0ee5f0c 360 // fill the GRAM
khuang 1:3b5be0ee5f0c 361 SendData( (const uint8_t*)image, width * height * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 362 break;
khuang 1:3b5be0ee5f0c 363 }
khuang 1:3b5be0ee5f0c 364
khuang 1:3b5be0ee5f0c 365 case OLED_TRANSITION_TOP_DOWN: {
khuang 1:3b5be0ee5f0c 366 TopDown( image, xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 367 break;
khuang 1:3b5be0ee5f0c 368 }
khuang 1:3b5be0ee5f0c 369
khuang 1:3b5be0ee5f0c 370 case OLED_TRANSITION_DOWN_TOP: {
khuang 1:3b5be0ee5f0c 371 DownTop( image, xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 372 break;
khuang 1:3b5be0ee5f0c 373 }
khuang 1:3b5be0ee5f0c 374
khuang 1:3b5be0ee5f0c 375 case OLED_TRANSITION_LEFT_RIGHT: {
khuang 1:3b5be0ee5f0c 376 LeftRight( image, xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 377 break;
khuang 1:3b5be0ee5f0c 378 }
khuang 1:3b5be0ee5f0c 379
khuang 1:3b5be0ee5f0c 380 case OLED_TRANSITION_RIGHT_LEFT: {
khuang 1:3b5be0ee5f0c 381 RightLeft( image, xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 382 break;
khuang 1:3b5be0ee5f0c 383 }
khuang 1:3b5be0ee5f0c 384
khuang 1:3b5be0ee5f0c 385 default: {}
khuang 1:3b5be0ee5f0c 386 }
khuang 1:3b5be0ee5f0c 387
khuang 1:3b5be0ee5f0c 388 return status;
khuang 1:3b5be0ee5f0c 389 }
khuang 1:3b5be0ee5f0c 390
khuang 1:3b5be0ee5f0c 391
khuang 1:3b5be0ee5f0c 392 oled_status_t SSD1351::SetFont(
khuang 1:3b5be0ee5f0c 393 const uint8_t* newFont,
khuang 1:3b5be0ee5f0c 394 uint16_t newColor
khuang 1:3b5be0ee5f0c 395 )
khuang 1:3b5be0ee5f0c 396 {
khuang 1:3b5be0ee5f0c 397 /** save the new values in intern variables */
khuang 1:3b5be0ee5f0c 398
khuang 1:3b5be0ee5f0c 399 selectedFont = newFont;
khuang 1:3b5be0ee5f0c 400 // selectedFont_firstChar = newFont[2] + (newFont[3] << 8);
khuang 1:3b5be0ee5f0c 401 selectedFont_firstChar = newFont[2] | ( (uint16_t)newFont[3] << 8 );
khuang 1:3b5be0ee5f0c 402 // selectedFont_lastChar = newFont[4] + (newFont[5] << 8);
khuang 1:3b5be0ee5f0c 403 selectedFont_lastChar = newFont[4] | ( (uint16_t)newFont[5] << 8 );
khuang 1:3b5be0ee5f0c 404 selectedFont_height = newFont[6];
khuang 1:3b5be0ee5f0c 405 selectedFont_color = newColor;
khuang 1:3b5be0ee5f0c 406
khuang 1:3b5be0ee5f0c 407 OLED_SwapMe( selectedFont_color );
khuang 1:3b5be0ee5f0c 408
khuang 1:3b5be0ee5f0c 409 isFontInitialized = 1;
khuang 1:3b5be0ee5f0c 410 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 411 }
khuang 1:3b5be0ee5f0c 412
khuang 1:3b5be0ee5f0c 413
khuang 1:3b5be0ee5f0c 414 void SSD1351::SetDynamicArea(oled_dynamic_area_t *dynamic_area)
khuang 1:3b5be0ee5f0c 415 {
khuang 1:3b5be0ee5f0c 416
khuang 1:3b5be0ee5f0c 417 if( NULL == oled_dynamic_area.areaBuffer )
khuang 1:3b5be0ee5f0c 418 {
khuang 1:3b5be0ee5f0c 419 oled_dynamic_area.areaBuffer = (oled_pixel_t)AllocateDynamicArea( dynamic_area->width * dynamic_area->height );
khuang 1:3b5be0ee5f0c 420 }
khuang 1:3b5be0ee5f0c 421 else if(
khuang 1:3b5be0ee5f0c 422 ( dynamic_area->height != oled_dynamic_area.height ) ||
khuang 1:3b5be0ee5f0c 423 ( dynamic_area->width != oled_dynamic_area.width )
khuang 1:3b5be0ee5f0c 424 )
khuang 1:3b5be0ee5f0c 425 {
khuang 1:3b5be0ee5f0c 426 DestroyDynamicArea();
khuang 1:3b5be0ee5f0c 427 oled_dynamic_area.areaBuffer = (oled_pixel_t)AllocateDynamicArea( dynamic_area->width * dynamic_area->height );
khuang 1:3b5be0ee5f0c 428 }
khuang 1:3b5be0ee5f0c 429
khuang 1:3b5be0ee5f0c 430 oled_dynamic_area.xCrd = dynamic_area->xCrd;
khuang 1:3b5be0ee5f0c 431 oled_dynamic_area.yCrd = dynamic_area->yCrd;
khuang 1:3b5be0ee5f0c 432 oled_dynamic_area.width = dynamic_area->width;
khuang 1:3b5be0ee5f0c 433 oled_dynamic_area.height = dynamic_area->height;
khuang 1:3b5be0ee5f0c 434 }
khuang 1:3b5be0ee5f0c 435
khuang 1:3b5be0ee5f0c 436
khuang 1:3b5be0ee5f0c 437 void SSD1351::DestroyDynamicArea()
khuang 1:3b5be0ee5f0c 438 {
khuang 1:3b5be0ee5f0c 439 if ( NULL != oled_dynamic_area.areaBuffer )
khuang 1:3b5be0ee5f0c 440 {
khuang 1:3b5be0ee5f0c 441 DestroyDynamicArea( oled_dynamic_area.areaBuffer );
khuang 1:3b5be0ee5f0c 442 oled_dynamic_area.areaBuffer = NULL;
khuang 1:3b5be0ee5f0c 443 }
khuang 1:3b5be0ee5f0c 444 }
khuang 1:3b5be0ee5f0c 445
khuang 1:3b5be0ee5f0c 446
khuang 1:3b5be0ee5f0c 447 void SSD1351::SetTextProperties(oled_text_properties_t *textProperties)
khuang 1:3b5be0ee5f0c 448 {
khuang 1:3b5be0ee5f0c 449 oled_text_properties.font = textProperties->font;
khuang 1:3b5be0ee5f0c 450 oled_text_properties.fontColor = textProperties->fontColor;
khuang 1:3b5be0ee5f0c 451 oled_text_properties.alignParam = textProperties->alignParam;
khuang 1:3b5be0ee5f0c 452 oled_text_properties.background = textProperties->background;
khuang 1:3b5be0ee5f0c 453
khuang 1:3b5be0ee5f0c 454 SetFont( oled_text_properties.font, oled_text_properties.fontColor );
khuang 1:3b5be0ee5f0c 455 }
khuang 1:3b5be0ee5f0c 456
khuang 1:3b5be0ee5f0c 457
khuang 1:3b5be0ee5f0c 458
khuang 1:3b5be0ee5f0c 459
khuang 1:3b5be0ee5f0c 460 uint8_t SSD1351::GetTextWidth(const uint8_t* text)
khuang 1:3b5be0ee5f0c 461 {
khuang 1:3b5be0ee5f0c 462 uint8_t chrCnt = 0;
khuang 1:3b5be0ee5f0c 463 uint8_t text_width = 0;
khuang 1:3b5be0ee5f0c 464
khuang 1:3b5be0ee5f0c 465 while ( 0 != text[chrCnt] )
khuang 1:3b5be0ee5f0c 466 {
khuang 1:3b5be0ee5f0c 467 text_width += *( selectedFont + 8 + (uint16_t)( ( text[chrCnt++] - selectedFont_firstChar ) << 2 ) );
khuang 1:3b5be0ee5f0c 468 // make 1px space between chars
khuang 1:3b5be0ee5f0c 469 text_width++;
khuang 1:3b5be0ee5f0c 470 }
khuang 1:3b5be0ee5f0c 471 // remove the final space
khuang 1:3b5be0ee5f0c 472 text_width--;
khuang 1:3b5be0ee5f0c 473
khuang 1:3b5be0ee5f0c 474 return text_width;
khuang 1:3b5be0ee5f0c 475 }
khuang 1:3b5be0ee5f0c 476
khuang 1:3b5be0ee5f0c 477
khuang 1:3b5be0ee5f0c 478
khuang 1:3b5be0ee5f0c 479 uint8_t SSD1351::CharCount(uint8_t width, const uint8_t* font, const uint8_t* text, uint8_t length)
khuang 1:3b5be0ee5f0c 480 {
khuang 1:3b5be0ee5f0c 481 uint8_t chrCnt = 0;
khuang 1:3b5be0ee5f0c 482 uint8_t text_width = 0;
khuang 1:3b5be0ee5f0c 483 uint16_t firstChar;
khuang 1:3b5be0ee5f0c 484
khuang 1:3b5be0ee5f0c 485 firstChar = font[2] | ( (uint16_t)font[3] << 8 );
khuang 1:3b5be0ee5f0c 486
khuang 1:3b5be0ee5f0c 487 while ( chrCnt < length )
khuang 1:3b5be0ee5f0c 488 {
khuang 1:3b5be0ee5f0c 489 text_width += *( font + 8 + (uint16_t)( ( text[chrCnt++] - firstChar ) << 2 ) );
khuang 1:3b5be0ee5f0c 490 if(text_width > width)
khuang 1:3b5be0ee5f0c 491 {
khuang 1:3b5be0ee5f0c 492 chrCnt--;
khuang 1:3b5be0ee5f0c 493 break;
khuang 1:3b5be0ee5f0c 494 }
khuang 1:3b5be0ee5f0c 495 // make 1px space between chars
khuang 1:3b5be0ee5f0c 496 text_width++;
khuang 1:3b5be0ee5f0c 497 }
khuang 1:3b5be0ee5f0c 498
khuang 1:3b5be0ee5f0c 499 return chrCnt;
khuang 1:3b5be0ee5f0c 500 }
khuang 1:3b5be0ee5f0c 501
khuang 1:3b5be0ee5f0c 502
khuang 1:3b5be0ee5f0c 503
khuang 1:3b5be0ee5f0c 504
khuang 1:3b5be0ee5f0c 505 oled_status_t SSD1351::AddText( const uint8_t* text,uint8_t xCrd, uint8_t yCrd )
khuang 1:3b5be0ee5f0c 506 {
khuang 1:3b5be0ee5f0c 507 uint16_t
khuang 1:3b5be0ee5f0c 508 chrCnt = 0;
khuang 1:3b5be0ee5f0c 509 oled_pixel_t
khuang 1:3b5be0ee5f0c 510 chrBuf = NULL;
khuang 1:3b5be0ee5f0c 511
khuang 1:3b5be0ee5f0c 512 uint8_t
khuang 1:3b5be0ee5f0c 513 currentChar_x = 0,
khuang 1:3b5be0ee5f0c 514 currentChar_y = 0;
khuang 1:3b5be0ee5f0c 515
khuang 1:3b5be0ee5f0c 516 uint8_t
khuang 1:3b5be0ee5f0c 517 text_height = 0,
khuang 1:3b5be0ee5f0c 518 text_width = 0;
khuang 1:3b5be0ee5f0c 519
khuang 1:3b5be0ee5f0c 520 text_width = GetTextWidth(text);
khuang 1:3b5be0ee5f0c 521
khuang 1:3b5be0ee5f0c 522 /**
khuang 1:3b5be0ee5f0c 523 * set default values, if necessary
khuang 1:3b5be0ee5f0c 524 */
khuang 1:3b5be0ee5f0c 525
khuang 1:3b5be0ee5f0c 526 text_height = selectedFont_height;
khuang 1:3b5be0ee5f0c 527 oled_dynamic_area_t textArea;
khuang 1:3b5be0ee5f0c 528
khuang 1:3b5be0ee5f0c 529
khuang 1:3b5be0ee5f0c 530 textArea.width = text_width;
khuang 1:3b5be0ee5f0c 531 textArea.height = text_height;
khuang 1:3b5be0ee5f0c 532 textArea.xCrd = xCrd;
khuang 1:3b5be0ee5f0c 533 textArea.yCrd = yCrd;
khuang 1:3b5be0ee5f0c 534 SetDynamicArea(&textArea);
khuang 1:3b5be0ee5f0c 535
khuang 1:3b5be0ee5f0c 536
khuang 1:3b5be0ee5f0c 537 currentChar_y = ( oled_dynamic_area.height - text_height ) >> 1;
khuang 1:3b5be0ee5f0c 538
khuang 1:3b5be0ee5f0c 539 switch ( oled_text_properties.alignParam & OLED_TEXT_HALIGN_MASK )
khuang 1:3b5be0ee5f0c 540 {
khuang 1:3b5be0ee5f0c 541 case OLED_TEXT_ALIGN_LEFT:
khuang 1:3b5be0ee5f0c 542 {
khuang 1:3b5be0ee5f0c 543 currentChar_x = 0;
khuang 1:3b5be0ee5f0c 544 break;
khuang 1:3b5be0ee5f0c 545 }
khuang 1:3b5be0ee5f0c 546
khuang 1:3b5be0ee5f0c 547 case OLED_TEXT_ALIGN_RIGHT:
khuang 1:3b5be0ee5f0c 548 {
khuang 1:3b5be0ee5f0c 549 currentChar_x = ( oled_dynamic_area.width - text_width );
khuang 1:3b5be0ee5f0c 550 break;
khuang 1:3b5be0ee5f0c 551 }
khuang 1:3b5be0ee5f0c 552
khuang 1:3b5be0ee5f0c 553 case OLED_TEXT_ALIGN_CENTER:
khuang 1:3b5be0ee5f0c 554 {
khuang 1:3b5be0ee5f0c 555 currentChar_x += ( oled_dynamic_area.width - text_width ) >> 1 ;
khuang 1:3b5be0ee5f0c 556 break;
khuang 1:3b5be0ee5f0c 557 }
khuang 1:3b5be0ee5f0c 558
khuang 1:3b5be0ee5f0c 559 case OLED_TEXT_ALIGN_NONE:
khuang 1:3b5be0ee5f0c 560 {
khuang 1:3b5be0ee5f0c 561 break;
khuang 1:3b5be0ee5f0c 562 }
khuang 1:3b5be0ee5f0c 563
khuang 1:3b5be0ee5f0c 564 default: {}
khuang 1:3b5be0ee5f0c 565 }
khuang 1:3b5be0ee5f0c 566
khuang 1:3b5be0ee5f0c 567 if ( CreateTextBackground() != OLED_STATUS_SUCCESS )
khuang 1:3b5be0ee5f0c 568 {
khuang 1:3b5be0ee5f0c 569 return OLED_STATUS_ERROR;
khuang 1:3b5be0ee5f0c 570 }
khuang 1:3b5be0ee5f0c 571
khuang 1:3b5be0ee5f0c 572 /**
khuang 1:3b5be0ee5f0c 573 * write the characters into designated space, one by one
khuang 1:3b5be0ee5f0c 574 */
khuang 1:3b5be0ee5f0c 575
khuang 1:3b5be0ee5f0c 576 chrCnt = 0;
khuang 1:3b5be0ee5f0c 577 while ( 0 != text[chrCnt] )
khuang 1:3b5be0ee5f0c 578 {
khuang 1:3b5be0ee5f0c 579 WriteCharToBuf( text[chrCnt++], &chrBuf );
khuang 1:3b5be0ee5f0c 580
khuang 1:3b5be0ee5f0c 581 if ( NULL == chrBuf )
khuang 1:3b5be0ee5f0c 582 {
khuang 1:3b5be0ee5f0c 583 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 584 }
khuang 1:3b5be0ee5f0c 585
khuang 1:3b5be0ee5f0c 586 else
khuang 1:3b5be0ee5f0c 587 {
khuang 1:3b5be0ee5f0c 588 if (
khuang 1:3b5be0ee5f0c 589 ( ( currentChar_x + currentChar_width ) > oled_dynamic_area.width )
khuang 1:3b5be0ee5f0c 590 || ( ( currentChar_y + currentChar_height ) > oled_dynamic_area.height )
khuang 1:3b5be0ee5f0c 591 )
khuang 1:3b5be0ee5f0c 592 {
khuang 1:3b5be0ee5f0c 593 DestroyDynamicArea( chrBuf );
khuang 1:3b5be0ee5f0c 594 chrBuf = NULL;
khuang 1:3b5be0ee5f0c 595 return OLED_STATUS_ERROR;
khuang 1:3b5be0ee5f0c 596 }
khuang 1:3b5be0ee5f0c 597
khuang 1:3b5be0ee5f0c 598 // copy data
khuang 1:3b5be0ee5f0c 599 oled_pixel_t
khuang 1:3b5be0ee5f0c 600 copyAddr = oled_dynamic_area.areaBuffer + ( currentChar_y * oled_dynamic_area.width + currentChar_x );
khuang 1:3b5be0ee5f0c 601
khuang 1:3b5be0ee5f0c 602 AddCharToTextArea( chrBuf, currentChar_width, currentChar_height, copyAddr, oled_dynamic_area.width );
khuang 1:3b5be0ee5f0c 603
khuang 1:3b5be0ee5f0c 604 currentChar_x += ( currentChar_width+1 );
khuang 1:3b5be0ee5f0c 605 currentChar_y += 0;
khuang 1:3b5be0ee5f0c 606
khuang 1:3b5be0ee5f0c 607 DestroyDynamicArea( chrBuf );
khuang 1:3b5be0ee5f0c 608 chrBuf = NULL;
khuang 1:3b5be0ee5f0c 609 }
khuang 1:3b5be0ee5f0c 610 }
khuang 1:3b5be0ee5f0c 611
khuang 1:3b5be0ee5f0c 612 UpdateBuffer(
khuang 1:3b5be0ee5f0c 613 oled_dynamic_area.xCrd,
khuang 1:3b5be0ee5f0c 614 oled_dynamic_area.yCrd,
khuang 1:3b5be0ee5f0c 615 oled_dynamic_area.width,
khuang 1:3b5be0ee5f0c 616 oled_dynamic_area.height,
khuang 1:3b5be0ee5f0c 617 (const uint8_t*)oled_dynamic_area.areaBuffer
khuang 1:3b5be0ee5f0c 618 );
khuang 1:3b5be0ee5f0c 619
khuang 1:3b5be0ee5f0c 620 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 621 }
khuang 1:3b5be0ee5f0c 622
khuang 1:3b5be0ee5f0c 623
khuang 1:3b5be0ee5f0c 624 oled_status_t SSD1351::AddText( const uint8_t* text)
khuang 1:3b5be0ee5f0c 625 {
khuang 1:3b5be0ee5f0c 626 uint16_t
khuang 1:3b5be0ee5f0c 627 chrCnt = 0;
khuang 1:3b5be0ee5f0c 628 oled_pixel_t
khuang 1:3b5be0ee5f0c 629 chrBuf = NULL;
khuang 1:3b5be0ee5f0c 630
khuang 1:3b5be0ee5f0c 631 uint8_t
khuang 1:3b5be0ee5f0c 632 currentChar_x = 0,
khuang 1:3b5be0ee5f0c 633 currentChar_y = 0;
khuang 1:3b5be0ee5f0c 634
khuang 1:3b5be0ee5f0c 635 uint8_t
khuang 1:3b5be0ee5f0c 636 text_height = 0,
khuang 1:3b5be0ee5f0c 637 text_width = 0;
khuang 1:3b5be0ee5f0c 638
khuang 1:3b5be0ee5f0c 639 text_width = GetTextWidth(text);
khuang 1:3b5be0ee5f0c 640
khuang 1:3b5be0ee5f0c 641 /**
khuang 1:3b5be0ee5f0c 642 * set default values, if necessary
khuang 1:3b5be0ee5f0c 643 */
khuang 1:3b5be0ee5f0c 644
khuang 1:3b5be0ee5f0c 645 text_height = selectedFont_height;
khuang 1:3b5be0ee5f0c 646
khuang 1:3b5be0ee5f0c 647
khuang 1:3b5be0ee5f0c 648 if (( oled_dynamic_area.width < text_width )||( oled_dynamic_area.height < text_height ))
khuang 1:3b5be0ee5f0c 649 {
khuang 1:3b5be0ee5f0c 650 oled_dynamic_area_t textArea;
khuang 1:3b5be0ee5f0c 651 textArea.width = text_width;
khuang 1:3b5be0ee5f0c 652 textArea.height = text_height;
khuang 1:3b5be0ee5f0c 653 SetDynamicArea(&textArea);
khuang 1:3b5be0ee5f0c 654 }
khuang 1:3b5be0ee5f0c 655
khuang 1:3b5be0ee5f0c 656 currentChar_y = ( oled_dynamic_area.height - text_height ) >> 1;
khuang 1:3b5be0ee5f0c 657
khuang 1:3b5be0ee5f0c 658 switch ( oled_text_properties.alignParam & OLED_TEXT_HALIGN_MASK )
khuang 1:3b5be0ee5f0c 659 {
khuang 1:3b5be0ee5f0c 660 case OLED_TEXT_ALIGN_LEFT:
khuang 1:3b5be0ee5f0c 661 {
khuang 1:3b5be0ee5f0c 662 currentChar_x = 0;
khuang 1:3b5be0ee5f0c 663 break;
khuang 1:3b5be0ee5f0c 664 }
khuang 1:3b5be0ee5f0c 665
khuang 1:3b5be0ee5f0c 666 case OLED_TEXT_ALIGN_RIGHT:
khuang 1:3b5be0ee5f0c 667 {
khuang 1:3b5be0ee5f0c 668 currentChar_x = ( oled_dynamic_area.width - text_width );
khuang 1:3b5be0ee5f0c 669 break;
khuang 1:3b5be0ee5f0c 670 }
khuang 1:3b5be0ee5f0c 671
khuang 1:3b5be0ee5f0c 672 case OLED_TEXT_ALIGN_CENTER:
khuang 1:3b5be0ee5f0c 673 {
khuang 1:3b5be0ee5f0c 674 currentChar_x += ( oled_dynamic_area.width - text_width ) >> 1 ;
khuang 1:3b5be0ee5f0c 675 break;
khuang 1:3b5be0ee5f0c 676 }
khuang 1:3b5be0ee5f0c 677
khuang 1:3b5be0ee5f0c 678 case OLED_TEXT_ALIGN_NONE:
khuang 1:3b5be0ee5f0c 679 {
khuang 1:3b5be0ee5f0c 680 break;
khuang 1:3b5be0ee5f0c 681 }
khuang 1:3b5be0ee5f0c 682
khuang 1:3b5be0ee5f0c 683 default: {}
khuang 1:3b5be0ee5f0c 684 }
khuang 1:3b5be0ee5f0c 685
khuang 1:3b5be0ee5f0c 686 if ( CreateTextBackground() != OLED_STATUS_SUCCESS )
khuang 1:3b5be0ee5f0c 687 {
khuang 1:3b5be0ee5f0c 688 return OLED_STATUS_ERROR;
khuang 1:3b5be0ee5f0c 689 }
khuang 1:3b5be0ee5f0c 690
khuang 1:3b5be0ee5f0c 691 /**
khuang 1:3b5be0ee5f0c 692 * write the characters into designated space, one by one
khuang 1:3b5be0ee5f0c 693 */
khuang 1:3b5be0ee5f0c 694
khuang 1:3b5be0ee5f0c 695 chrCnt = 0;
khuang 1:3b5be0ee5f0c 696 while ( 0 != text[chrCnt] )
khuang 1:3b5be0ee5f0c 697 {
khuang 1:3b5be0ee5f0c 698 WriteCharToBuf( text[chrCnt++], &chrBuf );
khuang 1:3b5be0ee5f0c 699
khuang 1:3b5be0ee5f0c 700 if ( NULL == chrBuf )
khuang 1:3b5be0ee5f0c 701 {
khuang 1:3b5be0ee5f0c 702 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 703 }
khuang 1:3b5be0ee5f0c 704
khuang 1:3b5be0ee5f0c 705 else
khuang 1:3b5be0ee5f0c 706 {
khuang 1:3b5be0ee5f0c 707 if (
khuang 1:3b5be0ee5f0c 708 ( ( currentChar_x + currentChar_width ) > oled_dynamic_area.width )
khuang 1:3b5be0ee5f0c 709 || ( ( currentChar_y + currentChar_height ) > oled_dynamic_area.height )
khuang 1:3b5be0ee5f0c 710 )
khuang 1:3b5be0ee5f0c 711 {
khuang 1:3b5be0ee5f0c 712 DestroyDynamicArea( chrBuf );
khuang 1:3b5be0ee5f0c 713 chrBuf = NULL;
khuang 1:3b5be0ee5f0c 714 return OLED_STATUS_ERROR;
khuang 1:3b5be0ee5f0c 715 }
khuang 1:3b5be0ee5f0c 716
khuang 1:3b5be0ee5f0c 717 // copy data
khuang 1:3b5be0ee5f0c 718 oled_pixel_t
khuang 1:3b5be0ee5f0c 719 copyAddr = oled_dynamic_area.areaBuffer + ( currentChar_y * oled_dynamic_area.width + currentChar_x );
khuang 1:3b5be0ee5f0c 720
khuang 1:3b5be0ee5f0c 721 AddCharToTextArea( chrBuf, currentChar_width, currentChar_height, copyAddr, oled_dynamic_area.width );
khuang 1:3b5be0ee5f0c 722
khuang 1:3b5be0ee5f0c 723 currentChar_x += ( currentChar_width+1 );
khuang 1:3b5be0ee5f0c 724 currentChar_y += 0;
khuang 1:3b5be0ee5f0c 725
khuang 1:3b5be0ee5f0c 726 DestroyDynamicArea( chrBuf );
khuang 1:3b5be0ee5f0c 727 chrBuf = NULL;
khuang 1:3b5be0ee5f0c 728 }
khuang 1:3b5be0ee5f0c 729 }
khuang 1:3b5be0ee5f0c 730
khuang 1:3b5be0ee5f0c 731 UpdateBuffer(
khuang 1:3b5be0ee5f0c 732 oled_dynamic_area.xCrd,
khuang 1:3b5be0ee5f0c 733 oled_dynamic_area.yCrd,
khuang 1:3b5be0ee5f0c 734 oled_dynamic_area.width,
khuang 1:3b5be0ee5f0c 735 oled_dynamic_area.height,
khuang 1:3b5be0ee5f0c 736 (const uint8_t*)oled_dynamic_area.areaBuffer
khuang 1:3b5be0ee5f0c 737 );
khuang 1:3b5be0ee5f0c 738
khuang 1:3b5be0ee5f0c 739 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 740 }
khuang 1:3b5be0ee5f0c 741
khuang 1:3b5be0ee5f0c 742
khuang 1:3b5be0ee5f0c 743
khuang 1:3b5be0ee5f0c 744 oled_status_t SSD1351::DrawText( const uint8_t* text)
khuang 1:3b5be0ee5f0c 745 {
khuang 1:3b5be0ee5f0c 746
khuang 1:3b5be0ee5f0c 747 if ( NULL == text )
khuang 1:3b5be0ee5f0c 748 {
khuang 1:3b5be0ee5f0c 749 return OLED_STATUS_ERROR;
khuang 1:3b5be0ee5f0c 750 }
khuang 1:3b5be0ee5f0c 751
khuang 1:3b5be0ee5f0c 752 AddText(text);
khuang 1:3b5be0ee5f0c 753 // set the locations
khuang 1:3b5be0ee5f0c 754 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
khuang 1:3b5be0ee5f0c 755 // fill the GRAM
khuang 1:3b5be0ee5f0c 756 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 757
khuang 1:3b5be0ee5f0c 758 // free( currentTextAreaImage );
khuang 1:3b5be0ee5f0c 759 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 760 }
khuang 1:3b5be0ee5f0c 761
khuang 1:3b5be0ee5f0c 762
khuang 1:3b5be0ee5f0c 763 void SSD1351::GetImageDimensions(uint8_t *width, uint8_t *height, const uint8_t* image)
khuang 1:3b5be0ee5f0c 764 {
khuang 1:3b5be0ee5f0c 765 *height = image[2] + (image[3] << 8);
khuang 1:3b5be0ee5f0c 766 *width = image[4] + (image[5] << 8);
khuang 1:3b5be0ee5f0c 767 }
khuang 1:3b5be0ee5f0c 768
khuang 1:3b5be0ee5f0c 769
khuang 1:3b5be0ee5f0c 770 oled_status_t SSD1351::AddImage ( const uint8_t* image )
khuang 1:3b5be0ee5f0c 771 {
khuang 1:3b5be0ee5f0c 772 oled_status_t
khuang 1:3b5be0ee5f0c 773 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 774
khuang 1:3b5be0ee5f0c 775 // check the bounds
khuang 1:3b5be0ee5f0c 776 if AreCoordsNotValid( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height )
khuang 1:3b5be0ee5f0c 777 {
khuang 1:3b5be0ee5f0c 778 status = OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 779 }
khuang 1:3b5be0ee5f0c 780
khuang 1:3b5be0ee5f0c 781 else
khuang 1:3b5be0ee5f0c 782 {
khuang 1:3b5be0ee5f0c 783 Swap( (oled_pixel_t)oled_dynamic_area.areaBuffer, BMP_SkipHeader(image), oled_dynamic_area.width*oled_dynamic_area.height );
khuang 1:3b5be0ee5f0c 784
khuang 1:3b5be0ee5f0c 785 // update the main screen buffer
khuang 1:3b5be0ee5f0c 786 UpdateBuffer( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height, (const uint8_t *)oled_dynamic_area.areaBuffer );
khuang 1:3b5be0ee5f0c 787 }
khuang 1:3b5be0ee5f0c 788
khuang 1:3b5be0ee5f0c 789 return status;
khuang 1:3b5be0ee5f0c 790 }
khuang 1:3b5be0ee5f0c 791
khuang 1:3b5be0ee5f0c 792
khuang 1:3b5be0ee5f0c 793 oled_status_t SSD1351::AddImage ( const uint8_t* image, uint8_t xCrd, uint8_t yCrd )
khuang 1:3b5be0ee5f0c 794 {
khuang 1:3b5be0ee5f0c 795 oled_status_t
khuang 1:3b5be0ee5f0c 796 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 797
khuang 1:3b5be0ee5f0c 798 oled_dynamic_area_t image_dynamicArea;
khuang 1:3b5be0ee5f0c 799
khuang 1:3b5be0ee5f0c 800 image_dynamicArea.xCrd = xCrd;
khuang 1:3b5be0ee5f0c 801 image_dynamicArea.yCrd = yCrd;
khuang 1:3b5be0ee5f0c 802
khuang 1:3b5be0ee5f0c 803 GetImageDimensions(&image_dynamicArea.width, &image_dynamicArea.height, image);
khuang 1:3b5be0ee5f0c 804 SetDynamicArea(&image_dynamicArea);
khuang 1:3b5be0ee5f0c 805
khuang 1:3b5be0ee5f0c 806 // check the bounds
khuang 1:3b5be0ee5f0c 807 if AreCoordsNotValid( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height )
khuang 1:3b5be0ee5f0c 808 {
khuang 1:3b5be0ee5f0c 809 status = OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 810 }
khuang 1:3b5be0ee5f0c 811
khuang 1:3b5be0ee5f0c 812 else
khuang 1:3b5be0ee5f0c 813 {
khuang 1:3b5be0ee5f0c 814 Swap( (oled_pixel_t)oled_dynamic_area.areaBuffer, BMP_SkipHeader(image), oled_dynamic_area.width*oled_dynamic_area.height );
khuang 1:3b5be0ee5f0c 815
khuang 1:3b5be0ee5f0c 816 // update the main screen buffer
khuang 1:3b5be0ee5f0c 817 UpdateBuffer( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height, (const uint8_t *)oled_dynamic_area.areaBuffer );
khuang 1:3b5be0ee5f0c 818 }
khuang 1:3b5be0ee5f0c 819
khuang 1:3b5be0ee5f0c 820 return status;
khuang 1:3b5be0ee5f0c 821 }
khuang 1:3b5be0ee5f0c 822
khuang 1:3b5be0ee5f0c 823
khuang 1:3b5be0ee5f0c 824
khuang 1:3b5be0ee5f0c 825 oled_status_t SSD1351::DrawImage ( const uint8_t* image )
khuang 1:3b5be0ee5f0c 826 {
khuang 1:3b5be0ee5f0c 827
khuang 1:3b5be0ee5f0c 828 oled_status_t
khuang 1:3b5be0ee5f0c 829 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 830
khuang 1:3b5be0ee5f0c 831 status = AddImage( image );
khuang 1:3b5be0ee5f0c 832
khuang 1:3b5be0ee5f0c 833 // set the locations
khuang 1:3b5be0ee5f0c 834 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
khuang 1:3b5be0ee5f0c 835
khuang 1:3b5be0ee5f0c 836 // fill the GRAM
khuang 1:3b5be0ee5f0c 837 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 838
khuang 1:3b5be0ee5f0c 839
khuang 1:3b5be0ee5f0c 840 return status;
khuang 1:3b5be0ee5f0c 841 }
khuang 1:3b5be0ee5f0c 842
khuang 1:3b5be0ee5f0c 843 oled_status_t SSD1351::DrawImage ( const uint8_t* image, uint8_t xCrd, uint8_t yCrd )
khuang 1:3b5be0ee5f0c 844 {
khuang 1:3b5be0ee5f0c 845
khuang 1:3b5be0ee5f0c 846 oled_status_t
khuang 1:3b5be0ee5f0c 847 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 848
khuang 1:3b5be0ee5f0c 849 status = AddImage( image,xCrd,yCrd);
khuang 1:3b5be0ee5f0c 850
khuang 1:3b5be0ee5f0c 851 // set the locations
khuang 1:3b5be0ee5f0c 852 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
khuang 1:3b5be0ee5f0c 853
khuang 1:3b5be0ee5f0c 854 // fill the GRAM
khuang 1:3b5be0ee5f0c 855 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 856
khuang 1:3b5be0ee5f0c 857
khuang 1:3b5be0ee5f0c 858 return status;
khuang 1:3b5be0ee5f0c 859 }
khuang 1:3b5be0ee5f0c 860
khuang 1:3b5be0ee5f0c 861
khuang 1:3b5be0ee5f0c 862
khuang 1:3b5be0ee5f0c 863 void SSD1351::DimScreenON()
khuang 1:3b5be0ee5f0c 864 {
khuang 1:3b5be0ee5f0c 865 for ( int i = 0; i < 16; i++ )
khuang 1:3b5be0ee5f0c 866 {
khuang 2:fc06b5b5bf6a 867 SendCmd( OLED_CMD_CONTRASTMASTER, CMD_BYTE );
khuang 2:fc06b5b5bf6a 868 SendCmd( 0xC0 | (0xF-i), DATA_BYTE );
khuang 1:3b5be0ee5f0c 869 wait_ms(20);
khuang 1:3b5be0ee5f0c 870 //OSA_TimeDelay( 20 );
khuang 1:3b5be0ee5f0c 871 }
khuang 1:3b5be0ee5f0c 872 }
khuang 1:3b5be0ee5f0c 873
khuang 1:3b5be0ee5f0c 874
khuang 1:3b5be0ee5f0c 875 void SSD1351::DimScreenOFF()
khuang 1:3b5be0ee5f0c 876 {
khuang 2:fc06b5b5bf6a 877 SendCmd( OLED_CMD_CONTRASTMASTER, CMD_BYTE );
khuang 2:fc06b5b5bf6a 878 SendCmd( 0xC0 | 0xF, DATA_BYTE );
khuang 1:3b5be0ee5f0c 879 }
khuang 1:3b5be0ee5f0c 880
khuang 1:3b5be0ee5f0c 881
khuang 1:3b5be0ee5f0c 882
khuang 1:3b5be0ee5f0c 883 void SSD1351::Swap(
khuang 1:3b5be0ee5f0c 884 oled_pixel_t imgDst,
khuang 1:3b5be0ee5f0c 885 const uint8_t* imgSrc,
khuang 1:3b5be0ee5f0c 886 uint16_t imgSize
khuang 1:3b5be0ee5f0c 887 )
khuang 1:3b5be0ee5f0c 888 {
khuang 1:3b5be0ee5f0c 889 for ( int var = 0; var < imgSize; var++ )
khuang 1:3b5be0ee5f0c 890 {
khuang 1:3b5be0ee5f0c 891 *imgDst = *imgSrc << 8;
khuang 1:3b5be0ee5f0c 892 imgSrc++;
khuang 1:3b5be0ee5f0c 893 *imgDst |= *imgSrc;
khuang 1:3b5be0ee5f0c 894 imgDst++;
khuang 1:3b5be0ee5f0c 895 imgSrc++;
khuang 1:3b5be0ee5f0c 896 }
khuang 1:3b5be0ee5f0c 897 }
khuang 1:3b5be0ee5f0c 898
khuang 1:3b5be0ee5f0c 899
khuang 1:3b5be0ee5f0c 900 void SSD1351::PowerON()
khuang 1:3b5be0ee5f0c 901 {
khuang 1:3b5be0ee5f0c 902 power = 1;
khuang 1:3b5be0ee5f0c 903 }
khuang 1:3b5be0ee5f0c 904
khuang 1:3b5be0ee5f0c 905 void SSD1351::PowerOFF()
khuang 1:3b5be0ee5f0c 906 {
khuang 1:3b5be0ee5f0c 907 power = 0;
khuang 1:3b5be0ee5f0c 908 }
khuang 1:3b5be0ee5f0c 909
khuang 1:3b5be0ee5f0c 910
khuang 1:3b5be0ee5f0c 911
khuang 1:3b5be0ee5f0c 912 //Formerly Known as GuiDriver_UpdateScreen
khuang 1:3b5be0ee5f0c 913 void SSD1351::UpdateBuffer (
khuang 1:3b5be0ee5f0c 914 uint8_t xCrd,
khuang 1:3b5be0ee5f0c 915 uint8_t yCrd,
khuang 1:3b5be0ee5f0c 916 uint8_t width,
khuang 1:3b5be0ee5f0c 917 uint8_t height,
khuang 1:3b5be0ee5f0c 918 const uint8_t* image
khuang 1:3b5be0ee5f0c 919 )
khuang 1:3b5be0ee5f0c 920 {
khuang 1:3b5be0ee5f0c 921 // copy data
khuang 1:3b5be0ee5f0c 922 oled_pixel_t
khuang 1:3b5be0ee5f0c 923 copyAddr = (oled_pixel_t)screenBuf + ( yCrd*OLED_SCREEN_WIDTH + xCrd );
khuang 1:3b5be0ee5f0c 924
khuang 1:3b5be0ee5f0c 925 for ( uint8_t i = 0; i < height; i++ )
khuang 1:3b5be0ee5f0c 926 {
khuang 1:3b5be0ee5f0c 927 memcpy( (void*)copyAddr, (void*)image, width*OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 928 copyAddr += OLED_SCREEN_WIDTH;
khuang 1:3b5be0ee5f0c 929 image += width*OLED_BYTES_PER_PIXEL;
khuang 1:3b5be0ee5f0c 930 }
khuang 1:3b5be0ee5f0c 931 }
khuang 1:3b5be0ee5f0c 932
khuang 3:4121d3cd9f60 933
khuang 3:4121d3cd9f60 934 oled_status_t SSD1351::Label ( const uint8_t* text,uint8_t xCrd, uint8_t yCrd )
khuang 3:4121d3cd9f60 935 {
khuang 3:4121d3cd9f60 936
khuang 3:4121d3cd9f60 937 if ( NULL == text )
khuang 3:4121d3cd9f60 938 {
khuang 3:4121d3cd9f60 939 return OLED_STATUS_ERROR;
khuang 3:4121d3cd9f60 940 }
khuang 3:4121d3cd9f60 941
khuang 3:4121d3cd9f60 942 AddText(text,xCrd,yCrd);
khuang 3:4121d3cd9f60 943
khuang 3:4121d3cd9f60 944 // set the locations
khuang 3:4121d3cd9f60 945 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
khuang 3:4121d3cd9f60 946
khuang 3:4121d3cd9f60 947 // fill the GRAM
khuang 3:4121d3cd9f60 948 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
khuang 3:4121d3cd9f60 949
khuang 3:4121d3cd9f60 950 // free( currentTextAreaImage );
khuang 3:4121d3cd9f60 951 return OLED_STATUS_SUCCESS;
khuang 3:4121d3cd9f60 952 }
khuang 3:4121d3cd9f60 953
khuang 3:4121d3cd9f60 954
khuang 3:4121d3cd9f60 955 oled_status_t SSD1351::TextBox(const uint8_t* text,uint8_t xCrd, uint8_t yCrd,uint8_t width,uint8_t height)
khuang 3:4121d3cd9f60 956 {
khuang 3:4121d3cd9f60 957
khuang 3:4121d3cd9f60 958 if ( NULL == text )
khuang 3:4121d3cd9f60 959 {
khuang 3:4121d3cd9f60 960 return OLED_STATUS_ERROR;
khuang 3:4121d3cd9f60 961 }
khuang 3:4121d3cd9f60 962
khuang 3:4121d3cd9f60 963 oled_dynamic_area_t textArea;
khuang 3:4121d3cd9f60 964 textArea.width = width;
khuang 3:4121d3cd9f60 965 textArea.height = height;
khuang 3:4121d3cd9f60 966 textArea.xCrd = xCrd;
khuang 3:4121d3cd9f60 967 textArea.yCrd = yCrd;
khuang 3:4121d3cd9f60 968
khuang 3:4121d3cd9f60 969 SetDynamicArea(&textArea);
khuang 3:4121d3cd9f60 970 DrawText(text);
khuang 3:4121d3cd9f60 971
khuang 3:4121d3cd9f60 972 return OLED_STATUS_SUCCESS;
khuang 3:4121d3cd9f60 973
khuang 3:4121d3cd9f60 974 }
khuang 3:4121d3cd9f60 975
khuang 3:4121d3cd9f60 976
khuang 1:3b5be0ee5f0c 977 /* Internal Functions */
khuang 1:3b5be0ee5f0c 978
khuang 1:3b5be0ee5f0c 979 /**
khuang 1:3b5be0ee5f0c 980 * [transpose description]
khuang 1:3b5be0ee5f0c 981 * @param transImage Transposed Image
khuang 1:3b5be0ee5f0c 982 * @param image Source Image
khuang 1:3b5be0ee5f0c 983 * @param width Width to Transpose
khuang 1:3b5be0ee5f0c 984 * @param height Height to Transpose
khuang 1:3b5be0ee5f0c 985 */
khuang 1:3b5be0ee5f0c 986 void SSD1351::Transpose(
khuang 1:3b5be0ee5f0c 987 oled_pixel_t transImage,
khuang 1:3b5be0ee5f0c 988 const oled_pixel_t image,
khuang 1:3b5be0ee5f0c 989 uint8_t width,
khuang 1:3b5be0ee5f0c 990 uint8_t height
khuang 1:3b5be0ee5f0c 991 )
khuang 1:3b5be0ee5f0c 992 {
khuang 1:3b5be0ee5f0c 993 for ( uint8_t i = 0; i < height; i++ )
khuang 1:3b5be0ee5f0c 994 {
khuang 1:3b5be0ee5f0c 995 for ( uint8_t j = 0; j < width ; j++ )
khuang 1:3b5be0ee5f0c 996 {
khuang 1:3b5be0ee5f0c 997 transImage[ j*height + i ] = image[ i*width + j ];
khuang 1:3b5be0ee5f0c 998 }
khuang 1:3b5be0ee5f0c 999 }
khuang 1:3b5be0ee5f0c 1000 }
khuang 1:3b5be0ee5f0c 1001
khuang 1:3b5be0ee5f0c 1002
khuang 1:3b5be0ee5f0c 1003
khuang 1:3b5be0ee5f0c 1004 /**
khuang 1:3b5be0ee5f0c 1005 * TopDown Transition Effect for Image
khuang 1:3b5be0ee5f0c 1006 * @param image image to be transitioned
khuang 1:3b5be0ee5f0c 1007 * @param xCrd x coordinate of image
khuang 1:3b5be0ee5f0c 1008 * @param yCrd y coordinate of image
khuang 1:3b5be0ee5f0c 1009 * @param width width of image
khuang 1:3b5be0ee5f0c 1010 * @param height height of image
khuang 1:3b5be0ee5f0c 1011 * @return status flag
khuang 1:3b5be0ee5f0c 1012 */
khuang 1:3b5be0ee5f0c 1013 oled_status_t SSD1351::TopDown(
khuang 1:3b5be0ee5f0c 1014 const uint8_t* image,
khuang 1:3b5be0ee5f0c 1015 uint8_t xCrd,
khuang 1:3b5be0ee5f0c 1016 uint8_t yCrd,
khuang 1:3b5be0ee5f0c 1017 uint8_t width,
khuang 1:3b5be0ee5f0c 1018 uint8_t height
khuang 1:3b5be0ee5f0c 1019 )
khuang 1:3b5be0ee5f0c 1020 {
khuang 1:3b5be0ee5f0c 1021 uint16_t
khuang 1:3b5be0ee5f0c 1022 transStep = OLED_TRANSITION_STEP;
khuang 1:3b5be0ee5f0c 1023
khuang 1:3b5be0ee5f0c 1024 uint16_t
khuang 1:3b5be0ee5f0c 1025 partImgSize = width*transStep;
khuang 1:3b5be0ee5f0c 1026
khuang 1:3b5be0ee5f0c 1027 oled_status_t
khuang 1:3b5be0ee5f0c 1028 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 1029
khuang 1:3b5be0ee5f0c 1030 uint8_t*
khuang 1:3b5be0ee5f0c 1031 partImgPtr = (uint8_t*)image + ( height - transStep ) * ( width * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1032
khuang 1:3b5be0ee5f0c 1033 /**
khuang 1:3b5be0ee5f0c 1034 * set locations
khuang 1:3b5be0ee5f0c 1035 */
khuang 1:3b5be0ee5f0c 1036
khuang 1:3b5be0ee5f0c 1037 while (1)
khuang 1:3b5be0ee5f0c 1038 {
khuang 1:3b5be0ee5f0c 1039 SetBorders( xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 1040
khuang 1:3b5be0ee5f0c 1041 if ( partImgSize > width*height )
khuang 1:3b5be0ee5f0c 1042 {
khuang 1:3b5be0ee5f0c 1043 SendData( (const uint8_t*)image, width*height*OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1044 break;
khuang 1:3b5be0ee5f0c 1045 }
khuang 1:3b5be0ee5f0c 1046 else
khuang 1:3b5be0ee5f0c 1047 {
khuang 1:3b5be0ee5f0c 1048 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1049 }
khuang 1:3b5be0ee5f0c 1050
khuang 1:3b5be0ee5f0c 1051
khuang 1:3b5be0ee5f0c 1052 /**
khuang 1:3b5be0ee5f0c 1053 * update variables
khuang 1:3b5be0ee5f0c 1054 */
khuang 1:3b5be0ee5f0c 1055
khuang 1:3b5be0ee5f0c 1056 partImgPtr -= ( width * transStep ) * OLED_BYTES_PER_PIXEL;
khuang 1:3b5be0ee5f0c 1057 partImgSize += ( width * transStep );
khuang 1:3b5be0ee5f0c 1058 transStep++;
khuang 1:3b5be0ee5f0c 1059 }
khuang 1:3b5be0ee5f0c 1060
khuang 1:3b5be0ee5f0c 1061 return status;
khuang 1:3b5be0ee5f0c 1062 }
khuang 1:3b5be0ee5f0c 1063
khuang 1:3b5be0ee5f0c 1064 /**
khuang 1:3b5be0ee5f0c 1065 * DownTop Transition Effect for Image
khuang 1:3b5be0ee5f0c 1066 * @param image image to be transitioned
khuang 1:3b5be0ee5f0c 1067 * @param xCrd x coordinate of image
khuang 1:3b5be0ee5f0c 1068 * @param yCrd y coordinate of image
khuang 1:3b5be0ee5f0c 1069 * @param width width of image
khuang 1:3b5be0ee5f0c 1070 * @param height height of image
khuang 1:3b5be0ee5f0c 1071 * @return status flag
khuang 1:3b5be0ee5f0c 1072 */
khuang 1:3b5be0ee5f0c 1073
khuang 1:3b5be0ee5f0c 1074 oled_status_t SSD1351::DownTop(
khuang 1:3b5be0ee5f0c 1075 const uint8_t* image,
khuang 1:3b5be0ee5f0c 1076 uint8_t xCrd,
khuang 1:3b5be0ee5f0c 1077 uint8_t yCrd,
khuang 1:3b5be0ee5f0c 1078 uint8_t width,
khuang 1:3b5be0ee5f0c 1079 uint8_t height
khuang 1:3b5be0ee5f0c 1080 )
khuang 1:3b5be0ee5f0c 1081 {
khuang 1:3b5be0ee5f0c 1082 uint16_t
khuang 1:3b5be0ee5f0c 1083 transStep = OLED_TRANSITION_STEP;
khuang 1:3b5be0ee5f0c 1084
khuang 1:3b5be0ee5f0c 1085 uint16_t
khuang 1:3b5be0ee5f0c 1086 partImgSize = width*transStep;
khuang 1:3b5be0ee5f0c 1087
khuang 1:3b5be0ee5f0c 1088 oled_status_t
khuang 1:3b5be0ee5f0c 1089 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 1090
khuang 1:3b5be0ee5f0c 1091 uint8_t*
khuang 1:3b5be0ee5f0c 1092 partImgPtr = (uint8_t*)image;
khuang 1:3b5be0ee5f0c 1093
khuang 1:3b5be0ee5f0c 1094 uint8_t
khuang 1:3b5be0ee5f0c 1095 yCrd_moving = ( yCrd + height ) - 1;
khuang 1:3b5be0ee5f0c 1096
khuang 1:3b5be0ee5f0c 1097 /**
khuang 1:3b5be0ee5f0c 1098 * set locations
khuang 1:3b5be0ee5f0c 1099 */
khuang 1:3b5be0ee5f0c 1100
khuang 1:3b5be0ee5f0c 1101 while (1)
khuang 1:3b5be0ee5f0c 1102 {
khuang 1:3b5be0ee5f0c 1103 if (
khuang 1:3b5be0ee5f0c 1104 ( partImgSize > OLED_SCREEN_SIZE )
khuang 1:3b5be0ee5f0c 1105 || ( yCrd_moving < yCrd )
khuang 1:3b5be0ee5f0c 1106 )
khuang 1:3b5be0ee5f0c 1107 {
khuang 1:3b5be0ee5f0c 1108 // draw full image
khuang 1:3b5be0ee5f0c 1109 SetBorders( xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 1110 SendData( (const uint8_t*)image, width * height * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1111 break;
khuang 1:3b5be0ee5f0c 1112 }
khuang 1:3b5be0ee5f0c 1113
khuang 1:3b5be0ee5f0c 1114 else
khuang 1:3b5be0ee5f0c 1115 {
khuang 1:3b5be0ee5f0c 1116 SetBorders( xCrd, yCrd_moving, width, ( yCrd + height ) - yCrd_moving );
khuang 1:3b5be0ee5f0c 1117 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1118 }
khuang 1:3b5be0ee5f0c 1119
khuang 1:3b5be0ee5f0c 1120 /**
khuang 1:3b5be0ee5f0c 1121 * update variables
khuang 1:3b5be0ee5f0c 1122 */
khuang 1:3b5be0ee5f0c 1123
khuang 1:3b5be0ee5f0c 1124 yCrd_moving -= transStep;
khuang 1:3b5be0ee5f0c 1125 partImgSize += ( width * transStep );
khuang 1:3b5be0ee5f0c 1126 transStep++;
khuang 1:3b5be0ee5f0c 1127 }
khuang 1:3b5be0ee5f0c 1128
khuang 1:3b5be0ee5f0c 1129 return status;
khuang 1:3b5be0ee5f0c 1130 }
khuang 1:3b5be0ee5f0c 1131
khuang 1:3b5be0ee5f0c 1132
khuang 1:3b5be0ee5f0c 1133 /**
khuang 1:3b5be0ee5f0c 1134 * LeftRight Transition Effect for Image
khuang 1:3b5be0ee5f0c 1135 * @param image image to be transitioned
khuang 1:3b5be0ee5f0c 1136 * @param xCrd x coordinate of image
khuang 1:3b5be0ee5f0c 1137 * @param yCrd y coordinate of image
khuang 1:3b5be0ee5f0c 1138 * @param width width of image
khuang 1:3b5be0ee5f0c 1139 * @param height height of image
khuang 1:3b5be0ee5f0c 1140 * @return status flag
khuang 1:3b5be0ee5f0c 1141 */
khuang 1:3b5be0ee5f0c 1142
khuang 1:3b5be0ee5f0c 1143 oled_status_t SSD1351::LeftRight(
khuang 1:3b5be0ee5f0c 1144 const uint8_t* image,
khuang 1:3b5be0ee5f0c 1145 uint8_t xCrd,
khuang 1:3b5be0ee5f0c 1146 uint8_t yCrd,
khuang 1:3b5be0ee5f0c 1147 uint8_t width,
khuang 1:3b5be0ee5f0c 1148 uint8_t height
khuang 1:3b5be0ee5f0c 1149 )
khuang 1:3b5be0ee5f0c 1150 {
khuang 1:3b5be0ee5f0c 1151 oled_status_t
khuang 1:3b5be0ee5f0c 1152 status = OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 1153
khuang 1:3b5be0ee5f0c 1154 oled_dynamic_area_t
khuang 1:3b5be0ee5f0c 1155 transImageArea =
khuang 1:3b5be0ee5f0c 1156 {
khuang 1:3b5be0ee5f0c 1157 .xCrd = 0,
khuang 1:3b5be0ee5f0c 1158 .yCrd = 0,
khuang 1:3b5be0ee5f0c 1159
khuang 1:3b5be0ee5f0c 1160 .width = 96,
khuang 1:3b5be0ee5f0c 1161 .height= 96
khuang 1:3b5be0ee5f0c 1162 };
khuang 1:3b5be0ee5f0c 1163
khuang 1:3b5be0ee5f0c 1164 SetDynamicArea( &transImageArea );
khuang 1:3b5be0ee5f0c 1165
khuang 1:3b5be0ee5f0c 1166 // helper pointer
khuang 1:3b5be0ee5f0c 1167 oled_pixel_t
khuang 1:3b5be0ee5f0c 1168 transImage = (oled_pixel_t)oled_dynamic_area.areaBuffer;
khuang 1:3b5be0ee5f0c 1169
khuang 1:3b5be0ee5f0c 1170 if ( NULL == transImage )
khuang 1:3b5be0ee5f0c 1171 {
khuang 1:3b5be0ee5f0c 1172 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 1173 }
khuang 1:3b5be0ee5f0c 1174
khuang 1:3b5be0ee5f0c 1175 Transpose( (oled_pixel_t)transImage, (const oled_pixel_t)image, width, height );
khuang 1:3b5be0ee5f0c 1176
khuang 2:fc06b5b5bf6a 1177 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
khuang 2:fc06b5b5bf6a 1178 SendCmd( OLED_REMAP_SETTINGS | REMAP_VERTICAL_INCREMENT, DATA_BYTE );
khuang 1:3b5be0ee5f0c 1179
khuang 1:3b5be0ee5f0c 1180 uint16_t
khuang 1:3b5be0ee5f0c 1181 transStep = OLED_TRANSITION_STEP;
khuang 1:3b5be0ee5f0c 1182
khuang 1:3b5be0ee5f0c 1183 uint16_t
khuang 1:3b5be0ee5f0c 1184 partImgSize = height*transStep;
khuang 1:3b5be0ee5f0c 1185
khuang 1:3b5be0ee5f0c 1186 uint8_t*
khuang 1:3b5be0ee5f0c 1187 partImgPtr = (uint8_t*)transImage + ( width - transStep ) * ( height * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1188
khuang 1:3b5be0ee5f0c 1189 /**
khuang 1:3b5be0ee5f0c 1190 * set locations
khuang 1:3b5be0ee5f0c 1191 */
khuang 1:3b5be0ee5f0c 1192
khuang 1:3b5be0ee5f0c 1193 while (1)
khuang 1:3b5be0ee5f0c 1194 {
khuang 1:3b5be0ee5f0c 1195 SetBorders( xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 1196
khuang 1:3b5be0ee5f0c 1197 if ( partImgSize > width*height )
khuang 1:3b5be0ee5f0c 1198 {
khuang 1:3b5be0ee5f0c 1199 SendData((const uint8_t*)transImage, width * height * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1200 break;
khuang 1:3b5be0ee5f0c 1201 }
khuang 1:3b5be0ee5f0c 1202 else
khuang 1:3b5be0ee5f0c 1203 {
khuang 1:3b5be0ee5f0c 1204 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1205 }
khuang 1:3b5be0ee5f0c 1206
khuang 1:3b5be0ee5f0c 1207
khuang 1:3b5be0ee5f0c 1208 partImgPtr -= ( transStep * height ) * OLED_BYTES_PER_PIXEL;
khuang 1:3b5be0ee5f0c 1209 partImgSize += ( transStep * height );
khuang 1:3b5be0ee5f0c 1210 transStep++;
khuang 1:3b5be0ee5f0c 1211
khuang 1:3b5be0ee5f0c 1212 }
khuang 1:3b5be0ee5f0c 1213
khuang 2:fc06b5b5bf6a 1214 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
khuang 2:fc06b5b5bf6a 1215 SendCmd( OLED_REMAP_SETTINGS, DATA_BYTE );
khuang 1:3b5be0ee5f0c 1216
khuang 1:3b5be0ee5f0c 1217 DestroyDynamicArea();
khuang 1:3b5be0ee5f0c 1218 return status;
khuang 1:3b5be0ee5f0c 1219 }
khuang 1:3b5be0ee5f0c 1220
khuang 1:3b5be0ee5f0c 1221
khuang 1:3b5be0ee5f0c 1222 /**
khuang 1:3b5be0ee5f0c 1223 * RightLeft Transition Effect for Image
khuang 1:3b5be0ee5f0c 1224 * @param image image to be transitioned
khuang 1:3b5be0ee5f0c 1225 * @param xCrd x coordinate of image
khuang 1:3b5be0ee5f0c 1226 * @param yCrd y coordinate of image
khuang 1:3b5be0ee5f0c 1227 * @param width width of image
khuang 1:3b5be0ee5f0c 1228 * @param height height of image
khuang 1:3b5be0ee5f0c 1229 * @return status flag
khuang 1:3b5be0ee5f0c 1230 */
khuang 1:3b5be0ee5f0c 1231 oled_status_t SSD1351::RightLeft(
khuang 1:3b5be0ee5f0c 1232 const uint8_t* image,
khuang 1:3b5be0ee5f0c 1233 uint8_t xCrd,
khuang 1:3b5be0ee5f0c 1234 uint8_t yCrd,
khuang 1:3b5be0ee5f0c 1235 uint8_t width,
khuang 1:3b5be0ee5f0c 1236 uint8_t height
khuang 1:3b5be0ee5f0c 1237 )
khuang 1:3b5be0ee5f0c 1238 {
khuang 1:3b5be0ee5f0c 1239 oled_dynamic_area_t
khuang 1:3b5be0ee5f0c 1240 transImageArea =
khuang 1:3b5be0ee5f0c 1241 {
khuang 1:3b5be0ee5f0c 1242 .xCrd = 0,
khuang 1:3b5be0ee5f0c 1243 .yCrd = 0,
khuang 1:3b5be0ee5f0c 1244
khuang 1:3b5be0ee5f0c 1245 .width = 96,
khuang 1:3b5be0ee5f0c 1246 .height= 96
khuang 1:3b5be0ee5f0c 1247 };
khuang 1:3b5be0ee5f0c 1248
khuang 1:3b5be0ee5f0c 1249 SetDynamicArea( &transImageArea );
khuang 1:3b5be0ee5f0c 1250
khuang 1:3b5be0ee5f0c 1251 // helper pointer
khuang 1:3b5be0ee5f0c 1252 oled_pixel_t
khuang 1:3b5be0ee5f0c 1253 transImage = oled_dynamic_area.areaBuffer;
khuang 1:3b5be0ee5f0c 1254
khuang 1:3b5be0ee5f0c 1255 if ( NULL == transImage )
khuang 1:3b5be0ee5f0c 1256 {
khuang 1:3b5be0ee5f0c 1257 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 1258 }
khuang 1:3b5be0ee5f0c 1259
khuang 1:3b5be0ee5f0c 1260 Transpose( (oled_pixel_t)transImage, (const oled_pixel_t)image, width, height );
khuang 1:3b5be0ee5f0c 1261
khuang 2:fc06b5b5bf6a 1262 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
khuang 2:fc06b5b5bf6a 1263 SendCmd( OLED_REMAP_SETTINGS | REMAP_VERTICAL_INCREMENT, DATA_BYTE );
khuang 1:3b5be0ee5f0c 1264
khuang 1:3b5be0ee5f0c 1265
khuang 1:3b5be0ee5f0c 1266 uint16_t
khuang 1:3b5be0ee5f0c 1267 transStep = OLED_TRANSITION_STEP;
khuang 1:3b5be0ee5f0c 1268
khuang 1:3b5be0ee5f0c 1269 uint16_t
khuang 1:3b5be0ee5f0c 1270 partImgSize = height * transStep;
khuang 1:3b5be0ee5f0c 1271
khuang 1:3b5be0ee5f0c 1272 uint8_t*
khuang 1:3b5be0ee5f0c 1273 partImgPtr = (uint8_t*)transImage;
khuang 1:3b5be0ee5f0c 1274
khuang 1:3b5be0ee5f0c 1275 uint8_t
khuang 1:3b5be0ee5f0c 1276 xCrd_moving = ( xCrd + width ) - 1;
khuang 1:3b5be0ee5f0c 1277
khuang 1:3b5be0ee5f0c 1278 /** set locations */
khuang 1:3b5be0ee5f0c 1279
khuang 1:3b5be0ee5f0c 1280 while (1)
khuang 1:3b5be0ee5f0c 1281 {
khuang 1:3b5be0ee5f0c 1282 if (( partImgSize > width*height )|| ( xCrd_moving < xCrd ))
khuang 1:3b5be0ee5f0c 1283 {
khuang 1:3b5be0ee5f0c 1284 SetBorders( xCrd, yCrd, width, height );
khuang 1:3b5be0ee5f0c 1285 SendData( (const uint8_t*)transImage, height * width * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1286 break;
khuang 1:3b5be0ee5f0c 1287 }
khuang 1:3b5be0ee5f0c 1288 else
khuang 1:3b5be0ee5f0c 1289 {
khuang 1:3b5be0ee5f0c 1290 SetBorders( xCrd_moving, yCrd, ( xCrd + width ) - xCrd_moving, height );
khuang 1:3b5be0ee5f0c 1291 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1292 }
khuang 1:3b5be0ee5f0c 1293
khuang 1:3b5be0ee5f0c 1294 /** update variables*/
khuang 1:3b5be0ee5f0c 1295
khuang 1:3b5be0ee5f0c 1296 xCrd_moving -= transStep;
khuang 1:3b5be0ee5f0c 1297 partImgSize += ( height * transStep );
khuang 1:3b5be0ee5f0c 1298 transStep++;
khuang 1:3b5be0ee5f0c 1299 }
khuang 1:3b5be0ee5f0c 1300
khuang 2:fc06b5b5bf6a 1301 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
khuang 2:fc06b5b5bf6a 1302 SendCmd( OLED_REMAP_SETTINGS, DATA_BYTE );
khuang 1:3b5be0ee5f0c 1303
khuang 1:3b5be0ee5f0c 1304 DestroyDynamicArea();
khuang 1:3b5be0ee5f0c 1305
khuang 1:3b5be0ee5f0c 1306 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 1307 }
khuang 1:3b5be0ee5f0c 1308
khuang 1:3b5be0ee5f0c 1309
khuang 1:3b5be0ee5f0c 1310 /**
khuang 1:3b5be0ee5f0c 1311 * [setDirection description]
khuang 1:3b5be0ee5f0c 1312 * @param self [description]
khuang 1:3b5be0ee5f0c 1313 * @param xCrd [description]
khuang 1:3b5be0ee5f0c 1314 * @param yCrd [description]
khuang 1:3b5be0ee5f0c 1315 * @return [description]
khuang 1:3b5be0ee5f0c 1316 */
khuang 1:3b5be0ee5f0c 1317 void SSD1351::SetBorders(
khuang 1:3b5be0ee5f0c 1318 uint8_t xCrd,
khuang 1:3b5be0ee5f0c 1319 uint8_t yCrd,
khuang 1:3b5be0ee5f0c 1320 uint8_t width,
khuang 1:3b5be0ee5f0c 1321 uint8_t height
khuang 1:3b5be0ee5f0c 1322 )
khuang 1:3b5be0ee5f0c 1323 {
khuang 1:3b5be0ee5f0c 1324
khuang 1:3b5be0ee5f0c 1325 // adjust for the offset
khuang 1:3b5be0ee5f0c 1326 OLED_AdjustColumnOffset(xCrd);
khuang 1:3b5be0ee5f0c 1327 OLED_AdjustRowOffset(yCrd);
khuang 1:3b5be0ee5f0c 1328
khuang 2:fc06b5b5bf6a 1329 SendCmd( OLED_CMD_SET_COLUMN, CMD_BYTE );
khuang 2:fc06b5b5bf6a 1330 SendCmd( xCrd, DATA_BYTE );
khuang 2:fc06b5b5bf6a 1331 SendCmd( xCrd + (width-1), DATA_BYTE );
khuang 2:fc06b5b5bf6a 1332 SendCmd( OLED_CMD_SET_ROW, CMD_BYTE );
khuang 2:fc06b5b5bf6a 1333 SendCmd( yCrd, DATA_BYTE );
khuang 2:fc06b5b5bf6a 1334 SendCmd( yCrd + (height-1), DATA_BYTE );
khuang 1:3b5be0ee5f0c 1335
khuang 1:3b5be0ee5f0c 1336 }
khuang 1:3b5be0ee5f0c 1337
khuang 1:3b5be0ee5f0c 1338 /**
khuang 1:3b5be0ee5f0c 1339 * create the buffer for a partial image
khuang 1:3b5be0ee5f0c 1340 * @param imgBuf [description]
khuang 1:3b5be0ee5f0c 1341 * @param width [description]
khuang 1:3b5be0ee5f0c 1342 * @param height [description]
khuang 1:3b5be0ee5f0c 1343 * @return [description]
khuang 1:3b5be0ee5f0c 1344 */
khuang 1:3b5be0ee5f0c 1345 oled_status_t SSD1351::CreateTextBackground()
khuang 1:3b5be0ee5f0c 1346 {
khuang 1:3b5be0ee5f0c 1347 uint8_t
khuang 1:3b5be0ee5f0c 1348 xCrd = oled_dynamic_area.xCrd,
khuang 1:3b5be0ee5f0c 1349 yCrd = oled_dynamic_area.yCrd,
khuang 1:3b5be0ee5f0c 1350 width = oled_dynamic_area.width,
khuang 1:3b5be0ee5f0c 1351 height = oled_dynamic_area.height;
khuang 1:3b5be0ee5f0c 1352
khuang 1:3b5be0ee5f0c 1353 oled_pixel_t
khuang 1:3b5be0ee5f0c 1354 imgBuf = oled_dynamic_area.areaBuffer,
khuang 1:3b5be0ee5f0c 1355 copyAddr;
khuang 1:3b5be0ee5f0c 1356
khuang 1:3b5be0ee5f0c 1357 const uint8_t*
khuang 1:3b5be0ee5f0c 1358 background = oled_text_properties.background;
khuang 1:3b5be0ee5f0c 1359
khuang 1:3b5be0ee5f0c 1360 /** copy data */
khuang 1:3b5be0ee5f0c 1361
khuang 1:3b5be0ee5f0c 1362 if (
khuang 1:3b5be0ee5f0c 1363 ( NULL == imgBuf )
khuang 1:3b5be0ee5f0c 1364 || ( ( xCrd + width ) > OLED_SCREEN_WIDTH )
khuang 1:3b5be0ee5f0c 1365 || ( ( yCrd + height ) > OLED_SCREEN_HEIGHT )
khuang 1:3b5be0ee5f0c 1366 )
khuang 1:3b5be0ee5f0c 1367 {
khuang 1:3b5be0ee5f0c 1368 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 1369 }
khuang 1:3b5be0ee5f0c 1370
khuang 1:3b5be0ee5f0c 1371 if ( NULL == background )
khuang 1:3b5be0ee5f0c 1372 {
khuang 1:3b5be0ee5f0c 1373 for ( uint8_t i = 0; i < height; i++ )
khuang 1:3b5be0ee5f0c 1374 {
khuang 1:3b5be0ee5f0c 1375 memset( (void*)imgBuf, 0, width*OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1376 imgBuf += width;
khuang 1:3b5be0ee5f0c 1377 }
khuang 1:3b5be0ee5f0c 1378 }
khuang 1:3b5be0ee5f0c 1379
khuang 1:3b5be0ee5f0c 1380 else
khuang 1:3b5be0ee5f0c 1381 {
khuang 1:3b5be0ee5f0c 1382 copyAddr = (oled_pixel_t)( BMP_SkipHeader( background ) ) + ( yCrd*OLED_SCREEN_WIDTH + xCrd );
khuang 1:3b5be0ee5f0c 1383 for ( uint8_t i = 0; i < height; i++ )
khuang 1:3b5be0ee5f0c 1384 {
khuang 1:3b5be0ee5f0c 1385 Swap( (oled_pixel_t)imgBuf, (const uint8_t*)copyAddr, width );
khuang 1:3b5be0ee5f0c 1386 imgBuf += width;
khuang 1:3b5be0ee5f0c 1387 copyAddr += OLED_SCREEN_WIDTH;
khuang 1:3b5be0ee5f0c 1388 }
khuang 1:3b5be0ee5f0c 1389 }
khuang 1:3b5be0ee5f0c 1390
khuang 1:3b5be0ee5f0c 1391 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 1392 }
khuang 1:3b5be0ee5f0c 1393
khuang 1:3b5be0ee5f0c 1394
khuang 1:3b5be0ee5f0c 1395 /**
khuang 1:3b5be0ee5f0c 1396 * Write the character to Buffer
khuang 1:3b5be0ee5f0c 1397 * @param charToWrite character to be written
khuang 1:3b5be0ee5f0c 1398 * @param chrBuf given pointer for buffer for the character
khuang 1:3b5be0ee5f0c 1399 */
khuang 1:3b5be0ee5f0c 1400 void SSD1351::WriteCharToBuf(
khuang 1:3b5be0ee5f0c 1401 uint16_t charToWrite,
khuang 1:3b5be0ee5f0c 1402 oled_pixel_t* chrBuf
khuang 1:3b5be0ee5f0c 1403 )
khuang 1:3b5be0ee5f0c 1404 {
khuang 1:3b5be0ee5f0c 1405 uint8_t
khuang 1:3b5be0ee5f0c 1406 foo = 0,
khuang 1:3b5be0ee5f0c 1407 mask;
khuang 1:3b5be0ee5f0c 1408
khuang 1:3b5be0ee5f0c 1409 const uint8_t*
khuang 1:3b5be0ee5f0c 1410 pChTable = selectedFont + 8 + (uint16_t)( ( charToWrite - selectedFont_firstChar ) << 2 );
khuang 1:3b5be0ee5f0c 1411
khuang 1:3b5be0ee5f0c 1412 currentChar_width = *pChTable,
khuang 1:3b5be0ee5f0c 1413 currentChar_height = selectedFont_height;
khuang 1:3b5be0ee5f0c 1414
khuang 1:3b5be0ee5f0c 1415 uint32_t
khuang 1:3b5be0ee5f0c 1416 offset = (uint32_t)pChTable[1]
khuang 1:3b5be0ee5f0c 1417 | ( (uint32_t)pChTable[2] << 8 )
khuang 1:3b5be0ee5f0c 1418 | ( (uint32_t)pChTable[3] << 16 );
khuang 1:3b5be0ee5f0c 1419
khuang 1:3b5be0ee5f0c 1420 const uint8_t*
khuang 1:3b5be0ee5f0c 1421 pChBitMap = selectedFont + offset;
khuang 1:3b5be0ee5f0c 1422
khuang 1:3b5be0ee5f0c 1423 if ( 0 == isFontInitialized )
khuang 1:3b5be0ee5f0c 1424 {
khuang 1:3b5be0ee5f0c 1425 // default font
khuang 3:4121d3cd9f60 1426 SetFont( OpenSans_10x15_Regular, COLOR_WHITE );
khuang 1:3b5be0ee5f0c 1427 }
khuang 1:3b5be0ee5f0c 1428
khuang 1:3b5be0ee5f0c 1429 // allocate space for char image
khuang 1:3b5be0ee5f0c 1430 *chrBuf = (oled_pixel_t)AllocateDynamicArea( currentChar_height * currentChar_width );
khuang 1:3b5be0ee5f0c 1431
khuang 1:3b5be0ee5f0c 1432 if ( NULL == *chrBuf )
khuang 1:3b5be0ee5f0c 1433 {
khuang 1:3b5be0ee5f0c 1434 return;
khuang 1:3b5be0ee5f0c 1435 }
khuang 1:3b5be0ee5f0c 1436
khuang 1:3b5be0ee5f0c 1437 for ( uint8_t yCnt = 0; yCnt < currentChar_height; yCnt++ )
khuang 1:3b5be0ee5f0c 1438 {
khuang 1:3b5be0ee5f0c 1439 mask = 0;
khuang 1:3b5be0ee5f0c 1440
khuang 1:3b5be0ee5f0c 1441 for ( uint8_t xCnt = 0; xCnt < currentChar_width; xCnt++ )
khuang 1:3b5be0ee5f0c 1442 {
khuang 1:3b5be0ee5f0c 1443 if ( 0 == mask )
khuang 1:3b5be0ee5f0c 1444 {
khuang 1:3b5be0ee5f0c 1445 mask = 1;
khuang 1:3b5be0ee5f0c 1446 foo = *pChBitMap++;
khuang 1:3b5be0ee5f0c 1447 }
khuang 1:3b5be0ee5f0c 1448
khuang 1:3b5be0ee5f0c 1449 if ( 0 != ( foo & mask ) )
khuang 1:3b5be0ee5f0c 1450 {
khuang 1:3b5be0ee5f0c 1451 *( *chrBuf + yCnt*currentChar_width + xCnt ) = selectedFont_color;
khuang 1:3b5be0ee5f0c 1452 }
khuang 1:3b5be0ee5f0c 1453
khuang 1:3b5be0ee5f0c 1454 else
khuang 1:3b5be0ee5f0c 1455 {
khuang 1:3b5be0ee5f0c 1456 *( *chrBuf + yCnt*currentChar_width + xCnt ) = 0;
khuang 1:3b5be0ee5f0c 1457 }
khuang 1:3b5be0ee5f0c 1458
khuang 1:3b5be0ee5f0c 1459 mask <<= 1;
khuang 1:3b5be0ee5f0c 1460 }
khuang 1:3b5be0ee5f0c 1461 }
khuang 1:3b5be0ee5f0c 1462 }
khuang 1:3b5be0ee5f0c 1463
khuang 1:3b5be0ee5f0c 1464
khuang 1:3b5be0ee5f0c 1465
khuang 1:3b5be0ee5f0c 1466 /**
khuang 1:3b5be0ee5f0c 1467 * Add subimage/character to the active image buffer
khuang 1:3b5be0ee5f0c 1468 * @param xOffset offset for the x-coordinate
khuang 1:3b5be0ee5f0c 1469 * @param yOffset offset for the y-coordinate
khuang 1:3b5be0ee5f0c 1470 * @param width desired width
khuang 1:3b5be0ee5f0c 1471 * @param height desired height
khuang 1:3b5be0ee5f0c 1472 * @return status flag
khuang 1:3b5be0ee5f0c 1473 */
khuang 1:3b5be0ee5f0c 1474 oled_status_t SSD1351::AddCharToTextArea(
khuang 1:3b5be0ee5f0c 1475 oled_pixel_t chrPtr,
khuang 1:3b5be0ee5f0c 1476 uint8_t chrWidth,
khuang 1:3b5be0ee5f0c 1477 uint8_t chrHeight,
khuang 1:3b5be0ee5f0c 1478 oled_pixel_t copyAddr,
khuang 1:3b5be0ee5f0c 1479 uint8_t imgWidth
khuang 1:3b5be0ee5f0c 1480 )
khuang 1:3b5be0ee5f0c 1481 {
khuang 1:3b5be0ee5f0c 1482 if ( NULL == copyAddr )
khuang 1:3b5be0ee5f0c 1483 {
khuang 1:3b5be0ee5f0c 1484 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 1485 }
khuang 1:3b5be0ee5f0c 1486
khuang 1:3b5be0ee5f0c 1487 for ( uint8_t i = 0; i < chrHeight; i++ )
khuang 1:3b5be0ee5f0c 1488 {
khuang 1:3b5be0ee5f0c 1489 for ( uint8_t j = 0; j < chrWidth; j++ )
khuang 1:3b5be0ee5f0c 1490 {
khuang 1:3b5be0ee5f0c 1491 if ( 0 != chrPtr[j] )
khuang 1:3b5be0ee5f0c 1492 {
khuang 1:3b5be0ee5f0c 1493 copyAddr[j] = chrPtr[j];
khuang 1:3b5be0ee5f0c 1494 }
khuang 1:3b5be0ee5f0c 1495 }
khuang 1:3b5be0ee5f0c 1496 copyAddr += imgWidth;
khuang 1:3b5be0ee5f0c 1497 chrPtr += chrWidth;
khuang 1:3b5be0ee5f0c 1498 }
khuang 1:3b5be0ee5f0c 1499 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 1500 }
khuang 1:3b5be0ee5f0c 1501
khuang 1:3b5be0ee5f0c 1502
khuang 1:3b5be0ee5f0c 1503 /**
khuang 1:3b5be0ee5f0c 1504 * Allocate memory for the desired image/character
khuang 1:3b5be0ee5f0c 1505 * @param area desired area dimensions
khuang 1:3b5be0ee5f0c 1506 */
khuang 1:3b5be0ee5f0c 1507 void* SSD1351::AllocateDynamicArea( uint32_t area )
khuang 1:3b5be0ee5f0c 1508 {
khuang 1:3b5be0ee5f0c 1509 void*
khuang 1:3b5be0ee5f0c 1510 ptr = malloc( area * OLED_BYTES_PER_PIXEL );
khuang 1:3b5be0ee5f0c 1511
khuang 1:3b5be0ee5f0c 1512 if ( NULL == ptr )
khuang 1:3b5be0ee5f0c 1513 {
khuang 1:3b5be0ee5f0c 1514 return NULL;
khuang 1:3b5be0ee5f0c 1515 }
khuang 1:3b5be0ee5f0c 1516
khuang 1:3b5be0ee5f0c 1517 return ptr;
khuang 1:3b5be0ee5f0c 1518 }
khuang 1:3b5be0ee5f0c 1519
khuang 1:3b5be0ee5f0c 1520
khuang 1:3b5be0ee5f0c 1521 /**
khuang 1:3b5be0ee5f0c 1522 * Deallocate current area
khuang 1:3b5be0ee5f0c 1523 * @param area pointer to current area
khuang 1:3b5be0ee5f0c 1524 */
khuang 1:3b5be0ee5f0c 1525 oled_status_t SSD1351::DestroyDynamicArea( void* ptr )
khuang 1:3b5be0ee5f0c 1526 {
khuang 1:3b5be0ee5f0c 1527 if ( NULL == ptr )
khuang 1:3b5be0ee5f0c 1528 {
khuang 1:3b5be0ee5f0c 1529 return OLED_STATUS_INIT_ERROR;
khuang 1:3b5be0ee5f0c 1530 }
khuang 1:3b5be0ee5f0c 1531
khuang 1:3b5be0ee5f0c 1532 free(ptr);
khuang 1:3b5be0ee5f0c 1533
khuang 1:3b5be0ee5f0c 1534 return OLED_STATUS_SUCCESS;
khuang 1:3b5be0ee5f0c 1535 }
khuang 1:3b5be0ee5f0c 1536
khuang 1:3b5be0ee5f0c 1537
khuang 1:3b5be0ee5f0c 1538
khuang 1:3b5be0ee5f0c 1539
khuang 1:3b5be0ee5f0c 1540
khuang 1:3b5be0ee5f0c 1541
khuang 1:3b5be0ee5f0c 1542