Code for the Hexiwear sensor system. Requires an Air Quality Click, Carbon Monoxide Click, and Buzzer Click for full functionality. Currently only reads values and displays to the OLED while testing and alerting the user of present threats. Future goals are to incorporate button presses with separate screens to display the data as well as using the KW40 drivers to transmit the data. Still in early stages of development, many unnecessary files will be removed and cleaned up once final product is completed within the next month. Driver.cpp is the main driver for the program and was written for purposes of this project. All other headers and functions were found on mbed.org from other developers repositories or provided by NXP Semiconductors for purposes of this project.

Dependencies:   Hexi_KW40Z images

Committer:
Gfolker
Date:
Fri Apr 28 07:26:16 2017 +0000
Revision:
3:24b332b8e41d
Parent:
1:8ab4a1e27785
Final version of the project - BLE integrated, code cleaned up, ARC calculation implemented, all user interface screens/button presses implemented, alert states tested and verified

Who changed what in which revision?

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