Hexiwear OLED

Dependents:   Hexi

Fork of Hexi_OLED_SSD1351 by Hexiwear

Committer:
khuang
Date:
Sat Sep 24 19:45:48 2016 +0000
Revision:
8:ae5fad429790
Parent:
7:9961c525e249
Child:
9:18d4eb6328eb
Commented out checking to see if text will fit in textbox for DrawTextBox. Font width and height specified in font information may be too much.

Who changed what in which revision?

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