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:
Wed Mar 15 19:14:55 2017 +0000
Revision:
0:f70b1d60f794
Child:
1:8ab4a1e27785
v1.0 of Hexiwear Sensor system. Currently able to detect air quality and carbon monoxide and display to the screen with alerts on the PWM buzzer click module and RGB LED.

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 0:f70b1d60f794 638
Gfolker 0:f70b1d60f794 639 if (( oled_dynamic_area.width < text_width )||( oled_dynamic_area.height < text_height ))
Gfolker 0:f70b1d60f794 640 {
Gfolker 0:f70b1d60f794 641 oled_dynamic_area_t textArea;
Gfolker 0:f70b1d60f794 642 textArea.width = text_width;
Gfolker 0:f70b1d60f794 643 textArea.height = text_height;
Gfolker 0:f70b1d60f794 644 SetDynamicArea(&textArea);
Gfolker 0:f70b1d60f794 645 }
Gfolker 0:f70b1d60f794 646
Gfolker 0:f70b1d60f794 647 currentChar_y = ( oled_dynamic_area.height - text_height ) >> 1;
Gfolker 0:f70b1d60f794 648
Gfolker 0:f70b1d60f794 649 switch ( oled_text_properties.alignParam & OLED_TEXT_HALIGN_MASK )
Gfolker 0:f70b1d60f794 650 {
Gfolker 0:f70b1d60f794 651 case OLED_TEXT_ALIGN_LEFT:
Gfolker 0:f70b1d60f794 652 {
Gfolker 0:f70b1d60f794 653 currentChar_x = 0;
Gfolker 0:f70b1d60f794 654 break;
Gfolker 0:f70b1d60f794 655 }
Gfolker 0:f70b1d60f794 656
Gfolker 0:f70b1d60f794 657 case OLED_TEXT_ALIGN_RIGHT:
Gfolker 0:f70b1d60f794 658 {
Gfolker 0:f70b1d60f794 659 currentChar_x = ( oled_dynamic_area.width - text_width );
Gfolker 0:f70b1d60f794 660 break;
Gfolker 0:f70b1d60f794 661 }
Gfolker 0:f70b1d60f794 662
Gfolker 0:f70b1d60f794 663 case OLED_TEXT_ALIGN_CENTER:
Gfolker 0:f70b1d60f794 664 {
Gfolker 0:f70b1d60f794 665 currentChar_x += ( oled_dynamic_area.width - text_width ) >> 1 ;
Gfolker 0:f70b1d60f794 666 break;
Gfolker 0:f70b1d60f794 667 }
Gfolker 0:f70b1d60f794 668
Gfolker 0:f70b1d60f794 669 case OLED_TEXT_ALIGN_NONE:
Gfolker 0:f70b1d60f794 670 {
Gfolker 0:f70b1d60f794 671 break;
Gfolker 0:f70b1d60f794 672 }
Gfolker 0:f70b1d60f794 673
Gfolker 0:f70b1d60f794 674 default: {}
Gfolker 0:f70b1d60f794 675 }
Gfolker 0:f70b1d60f794 676
Gfolker 0:f70b1d60f794 677 if ( CreateTextBackground() != OLED_STATUS_SUCCESS )
Gfolker 0:f70b1d60f794 678 {
Gfolker 0:f70b1d60f794 679 return OLED_STATUS_ERROR;
Gfolker 0:f70b1d60f794 680 }
Gfolker 0:f70b1d60f794 681
Gfolker 0:f70b1d60f794 682 /**
Gfolker 0:f70b1d60f794 683 * write the characters into designated space, one by one
Gfolker 0:f70b1d60f794 684 */
Gfolker 0:f70b1d60f794 685
Gfolker 0:f70b1d60f794 686 chrCnt = 0;
Gfolker 0:f70b1d60f794 687 while ( 0 != text[chrCnt] )
Gfolker 0:f70b1d60f794 688 {
Gfolker 0:f70b1d60f794 689 WriteCharToBuf( text[chrCnt++], &chrBuf );
Gfolker 0:f70b1d60f794 690
Gfolker 0:f70b1d60f794 691 if ( NULL == chrBuf )
Gfolker 0:f70b1d60f794 692 {
Gfolker 0:f70b1d60f794 693 return OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 694 }
Gfolker 0:f70b1d60f794 695
Gfolker 0:f70b1d60f794 696 else
Gfolker 0:f70b1d60f794 697 {
Gfolker 0:f70b1d60f794 698 if (
Gfolker 0:f70b1d60f794 699 ( ( currentChar_x + currentChar_width ) > oled_dynamic_area.width )
Gfolker 0:f70b1d60f794 700 || ( ( currentChar_y + currentChar_height ) > oled_dynamic_area.height )
Gfolker 0:f70b1d60f794 701 )
Gfolker 0:f70b1d60f794 702 {
Gfolker 0:f70b1d60f794 703 DestroyDynamicArea( chrBuf );
Gfolker 0:f70b1d60f794 704 chrBuf = NULL;
Gfolker 0:f70b1d60f794 705 return OLED_STATUS_ERROR;
Gfolker 0:f70b1d60f794 706 }
Gfolker 0:f70b1d60f794 707
Gfolker 0:f70b1d60f794 708 /* copy data */
Gfolker 0:f70b1d60f794 709 oled_pixel_t
Gfolker 0:f70b1d60f794 710 copyAddr = oled_dynamic_area.areaBuffer + ( currentChar_y * oled_dynamic_area.width + currentChar_x );
Gfolker 0:f70b1d60f794 711
Gfolker 0:f70b1d60f794 712 AddCharToTextArea( chrBuf, currentChar_width, currentChar_height, copyAddr, oled_dynamic_area.width );
Gfolker 0:f70b1d60f794 713
Gfolker 0:f70b1d60f794 714 currentChar_x += ( currentChar_width+1 );
Gfolker 0:f70b1d60f794 715 currentChar_y += 0;
Gfolker 0:f70b1d60f794 716
Gfolker 0:f70b1d60f794 717 DestroyDynamicArea( chrBuf );
Gfolker 0:f70b1d60f794 718 chrBuf = NULL;
Gfolker 0:f70b1d60f794 719 }
Gfolker 0:f70b1d60f794 720 }
Gfolker 0:f70b1d60f794 721
Gfolker 0:f70b1d60f794 722 UpdateBuffer(
Gfolker 0:f70b1d60f794 723 oled_dynamic_area.xCrd,
Gfolker 0:f70b1d60f794 724 oled_dynamic_area.yCrd,
Gfolker 0:f70b1d60f794 725 oled_dynamic_area.width,
Gfolker 0:f70b1d60f794 726 oled_dynamic_area.height,
Gfolker 0:f70b1d60f794 727 (const uint8_t*)oled_dynamic_area.areaBuffer
Gfolker 0:f70b1d60f794 728 );
Gfolker 0:f70b1d60f794 729
Gfolker 0:f70b1d60f794 730 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 731 }
Gfolker 0:f70b1d60f794 732
Gfolker 0:f70b1d60f794 733
Gfolker 0:f70b1d60f794 734
Gfolker 0:f70b1d60f794 735 oled_status_t SSD1351::DrawText( const uint8_t* text)
Gfolker 0:f70b1d60f794 736 {
Gfolker 0:f70b1d60f794 737
Gfolker 0:f70b1d60f794 738 if ( NULL == text )
Gfolker 0:f70b1d60f794 739 {
Gfolker 0:f70b1d60f794 740 return OLED_STATUS_ERROR;
Gfolker 0:f70b1d60f794 741 }
Gfolker 0:f70b1d60f794 742
Gfolker 0:f70b1d60f794 743 AddText(text);
Gfolker 0:f70b1d60f794 744 /* set the locations */
Gfolker 0:f70b1d60f794 745 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
Gfolker 0:f70b1d60f794 746 /* fill the GRAM */
Gfolker 0:f70b1d60f794 747 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 748
Gfolker 0:f70b1d60f794 749 //free( currentTextAreaImage );
Gfolker 0:f70b1d60f794 750 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 751 }
Gfolker 0:f70b1d60f794 752
Gfolker 0:f70b1d60f794 753
Gfolker 0:f70b1d60f794 754 void SSD1351::GetImageDimensions(uint8_t *width, uint8_t *height, const uint8_t* image)
Gfolker 0:f70b1d60f794 755 {
Gfolker 0:f70b1d60f794 756 *height = image[2] + (image[3] << 8);
Gfolker 0:f70b1d60f794 757 *width = image[4] + (image[5] << 8);
Gfolker 0:f70b1d60f794 758 }
Gfolker 0:f70b1d60f794 759
Gfolker 0:f70b1d60f794 760
Gfolker 0:f70b1d60f794 761 oled_status_t SSD1351::AddImage ( const uint8_t* image )
Gfolker 0:f70b1d60f794 762 {
Gfolker 0:f70b1d60f794 763 oled_status_t
Gfolker 0:f70b1d60f794 764 status = OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 765
Gfolker 0:f70b1d60f794 766 /* check the bounds */
Gfolker 0:f70b1d60f794 767 if AreCoordsNotValid( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height )
Gfolker 0:f70b1d60f794 768 {
Gfolker 0:f70b1d60f794 769 status = OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 770 }
Gfolker 0:f70b1d60f794 771
Gfolker 0:f70b1d60f794 772 else
Gfolker 0:f70b1d60f794 773 {
Gfolker 0:f70b1d60f794 774 Swap( (oled_pixel_t)oled_dynamic_area.areaBuffer, BMP_SkipHeader(image), oled_dynamic_area.width*oled_dynamic_area.height );
Gfolker 0:f70b1d60f794 775
Gfolker 0:f70b1d60f794 776 /* update the main screen buffer */
Gfolker 0:f70b1d60f794 777 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 778 }
Gfolker 0:f70b1d60f794 779
Gfolker 0:f70b1d60f794 780 return status;
Gfolker 0:f70b1d60f794 781 }
Gfolker 0:f70b1d60f794 782
Gfolker 0:f70b1d60f794 783
Gfolker 0:f70b1d60f794 784 oled_status_t SSD1351::AddImage ( const uint8_t* image, int8_t xCrd, int8_t yCrd )
Gfolker 0:f70b1d60f794 785 {
Gfolker 0:f70b1d60f794 786 oled_status_t
Gfolker 0:f70b1d60f794 787 status = OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 788
Gfolker 0:f70b1d60f794 789 oled_dynamic_area_t image_dynamicArea;
Gfolker 0:f70b1d60f794 790
Gfolker 0:f70b1d60f794 791 image_dynamicArea.xCrd = xCrd;
Gfolker 0:f70b1d60f794 792 image_dynamicArea.yCrd = yCrd;
Gfolker 0:f70b1d60f794 793
Gfolker 0:f70b1d60f794 794 GetImageDimensions(&image_dynamicArea.width, &image_dynamicArea.height, image);
Gfolker 0:f70b1d60f794 795 SetDynamicArea(&image_dynamicArea);
Gfolker 0:f70b1d60f794 796
Gfolker 0:f70b1d60f794 797 /* check the bounds */
Gfolker 0:f70b1d60f794 798 if AreCoordsNotValid( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height )
Gfolker 0:f70b1d60f794 799 {
Gfolker 0:f70b1d60f794 800 status = OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 801 }
Gfolker 0:f70b1d60f794 802
Gfolker 0:f70b1d60f794 803 else
Gfolker 0:f70b1d60f794 804 {
Gfolker 0:f70b1d60f794 805 Swap( (oled_pixel_t)oled_dynamic_area.areaBuffer, BMP_SkipHeader(image), oled_dynamic_area.width*oled_dynamic_area.height );
Gfolker 0:f70b1d60f794 806
Gfolker 0:f70b1d60f794 807 /* update the main screen buffer */
Gfolker 0:f70b1d60f794 808 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 809 }
Gfolker 0:f70b1d60f794 810
Gfolker 0:f70b1d60f794 811 return status;
Gfolker 0:f70b1d60f794 812 }
Gfolker 0:f70b1d60f794 813
Gfolker 0:f70b1d60f794 814
Gfolker 0:f70b1d60f794 815
Gfolker 0:f70b1d60f794 816 oled_status_t SSD1351::DrawImage ( const uint8_t* image )
Gfolker 0:f70b1d60f794 817 {
Gfolker 0:f70b1d60f794 818
Gfolker 0:f70b1d60f794 819 oled_status_t
Gfolker 0:f70b1d60f794 820 status = OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 821
Gfolker 0:f70b1d60f794 822 status = AddImage( image );
Gfolker 0:f70b1d60f794 823
Gfolker 0:f70b1d60f794 824 /* set the locations */
Gfolker 0:f70b1d60f794 825 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
Gfolker 0:f70b1d60f794 826
Gfolker 0:f70b1d60f794 827 /* fill the GRAM */
Gfolker 0:f70b1d60f794 828 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 829
Gfolker 0:f70b1d60f794 830
Gfolker 0:f70b1d60f794 831 return status;
Gfolker 0:f70b1d60f794 832 }
Gfolker 0:f70b1d60f794 833
Gfolker 0:f70b1d60f794 834 oled_status_t SSD1351::DrawImage ( const uint8_t* image, int8_t xCrd, int8_t yCrd )
Gfolker 0:f70b1d60f794 835 {
Gfolker 0:f70b1d60f794 836
Gfolker 0:f70b1d60f794 837 oled_status_t
Gfolker 0:f70b1d60f794 838 status = OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 839
Gfolker 0:f70b1d60f794 840 status = AddImage( image,xCrd,yCrd);
Gfolker 0:f70b1d60f794 841
Gfolker 0:f70b1d60f794 842 /* set the locations */
Gfolker 0:f70b1d60f794 843 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
Gfolker 0:f70b1d60f794 844
Gfolker 0:f70b1d60f794 845 /* fill the GRAM */
Gfolker 0:f70b1d60f794 846 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 847
Gfolker 0:f70b1d60f794 848
Gfolker 0:f70b1d60f794 849 return status;
Gfolker 0:f70b1d60f794 850 }
Gfolker 0:f70b1d60f794 851
Gfolker 0:f70b1d60f794 852
Gfolker 0:f70b1d60f794 853
Gfolker 0:f70b1d60f794 854 void SSD1351::DimScreenON()
Gfolker 0:f70b1d60f794 855 {
Gfolker 0:f70b1d60f794 856 for ( int i = 0; i < 16; i++ )
Gfolker 0:f70b1d60f794 857 {
Gfolker 0:f70b1d60f794 858 SendCmd( OLED_CMD_CONTRASTMASTER, CMD_BYTE );
Gfolker 0:f70b1d60f794 859 SendCmd( 0xC0 | (0xF-i), DATA_BYTE );
Gfolker 0:f70b1d60f794 860 wait_ms(20);
Gfolker 0:f70b1d60f794 861 // OSA_TimeDelay( 20 );
Gfolker 0:f70b1d60f794 862 }
Gfolker 0:f70b1d60f794 863 }
Gfolker 0:f70b1d60f794 864
Gfolker 0:f70b1d60f794 865
Gfolker 0:f70b1d60f794 866 void SSD1351::DimScreenOFF()
Gfolker 0:f70b1d60f794 867 {
Gfolker 0:f70b1d60f794 868 SendCmd( OLED_CMD_CONTRASTMASTER, CMD_BYTE );
Gfolker 0:f70b1d60f794 869 SendCmd( 0xC0 | 0xF, DATA_BYTE );
Gfolker 0:f70b1d60f794 870 }
Gfolker 0:f70b1d60f794 871
Gfolker 0:f70b1d60f794 872
Gfolker 0:f70b1d60f794 873
Gfolker 0:f70b1d60f794 874 void SSD1351::Swap(
Gfolker 0:f70b1d60f794 875 oled_pixel_t imgDst,
Gfolker 0:f70b1d60f794 876 const uint8_t* imgSrc,
Gfolker 0:f70b1d60f794 877 uint16_t imgSize
Gfolker 0:f70b1d60f794 878 )
Gfolker 0:f70b1d60f794 879 {
Gfolker 0:f70b1d60f794 880 for ( int var = 0; var < imgSize; var++ )
Gfolker 0:f70b1d60f794 881 {
Gfolker 0:f70b1d60f794 882 *imgDst = *imgSrc << 8;
Gfolker 0:f70b1d60f794 883 imgSrc++;
Gfolker 0:f70b1d60f794 884 *imgDst |= *imgSrc;
Gfolker 0:f70b1d60f794 885 imgDst++;
Gfolker 0:f70b1d60f794 886 imgSrc++;
Gfolker 0:f70b1d60f794 887 }
Gfolker 0:f70b1d60f794 888 }
Gfolker 0:f70b1d60f794 889
Gfolker 0:f70b1d60f794 890
Gfolker 0:f70b1d60f794 891 void SSD1351::PowerON()
Gfolker 0:f70b1d60f794 892 {
Gfolker 0:f70b1d60f794 893 power = 1;
Gfolker 0:f70b1d60f794 894 }
Gfolker 0:f70b1d60f794 895
Gfolker 0:f70b1d60f794 896 void SSD1351::PowerOFF()
Gfolker 0:f70b1d60f794 897 {
Gfolker 0:f70b1d60f794 898 power = 0;
Gfolker 0:f70b1d60f794 899 }
Gfolker 0:f70b1d60f794 900
Gfolker 0:f70b1d60f794 901
Gfolker 0:f70b1d60f794 902
Gfolker 0:f70b1d60f794 903 /* Formerly Known as GuiDriver_UpdateScreen */
Gfolker 0:f70b1d60f794 904 void SSD1351::UpdateBuffer (
Gfolker 0:f70b1d60f794 905 int8_t xCrd,
Gfolker 0:f70b1d60f794 906 int8_t yCrd,
Gfolker 0:f70b1d60f794 907 uint8_t width,
Gfolker 0:f70b1d60f794 908 uint8_t height,
Gfolker 0:f70b1d60f794 909 const uint8_t* image
Gfolker 0:f70b1d60f794 910 )
Gfolker 0:f70b1d60f794 911 {
Gfolker 0:f70b1d60f794 912 /* copy data */
Gfolker 0:f70b1d60f794 913 oled_pixel_t
Gfolker 0:f70b1d60f794 914 copyAddr = (oled_pixel_t)screenBuf + ( yCrd*OLED_SCREEN_WIDTH + xCrd );
Gfolker 0:f70b1d60f794 915
Gfolker 0:f70b1d60f794 916 for ( uint8_t i = 0; i < height; i++ )
Gfolker 0:f70b1d60f794 917 {
Gfolker 0:f70b1d60f794 918 memcpy( (void*)copyAddr, (void*)image, width*OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 919 copyAddr += OLED_SCREEN_WIDTH;
Gfolker 0:f70b1d60f794 920 image += width*OLED_BYTES_PER_PIXEL;
Gfolker 0:f70b1d60f794 921 }
Gfolker 0:f70b1d60f794 922 }
Gfolker 0:f70b1d60f794 923
Gfolker 0:f70b1d60f794 924
Gfolker 0:f70b1d60f794 925 oled_status_t SSD1351::Label ( const uint8_t* text,int8_t xCrd, int8_t yCrd )
Gfolker 0:f70b1d60f794 926 {
Gfolker 0:f70b1d60f794 927
Gfolker 0:f70b1d60f794 928 if ( NULL == text )
Gfolker 0:f70b1d60f794 929 {
Gfolker 0:f70b1d60f794 930 return OLED_STATUS_ERROR;
Gfolker 0:f70b1d60f794 931 }
Gfolker 0:f70b1d60f794 932
Gfolker 0:f70b1d60f794 933 AddText(text,xCrd,yCrd);
Gfolker 0:f70b1d60f794 934
Gfolker 0:f70b1d60f794 935 /* set the locations */
Gfolker 0:f70b1d60f794 936 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
Gfolker 0:f70b1d60f794 937
Gfolker 0:f70b1d60f794 938 /* fill the GRAM */
Gfolker 0:f70b1d60f794 939 SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 940
Gfolker 0:f70b1d60f794 941 //free( currentTextAreaImage );
Gfolker 0:f70b1d60f794 942 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 943 }
Gfolker 0:f70b1d60f794 944
Gfolker 0:f70b1d60f794 945
Gfolker 0:f70b1d60f794 946 oled_status_t SSD1351::TextBox(const uint8_t* text, int8_t xCrd, int8_t yCrd,uint8_t width,uint8_t height)
Gfolker 0:f70b1d60f794 947 {
Gfolker 0:f70b1d60f794 948
Gfolker 0:f70b1d60f794 949 if ( NULL == text )
Gfolker 0:f70b1d60f794 950 {
Gfolker 0:f70b1d60f794 951 return OLED_STATUS_ERROR;
Gfolker 0:f70b1d60f794 952 }
Gfolker 0:f70b1d60f794 953
Gfolker 0:f70b1d60f794 954 oled_dynamic_area_t textArea;
Gfolker 0:f70b1d60f794 955 textArea.width = width;
Gfolker 0:f70b1d60f794 956 textArea.height = height;
Gfolker 0:f70b1d60f794 957 textArea.xCrd = xCrd;
Gfolker 0:f70b1d60f794 958 textArea.yCrd = yCrd;
Gfolker 0:f70b1d60f794 959
Gfolker 0:f70b1d60f794 960 SetDynamicArea(&textArea);
Gfolker 0:f70b1d60f794 961 DrawText(text);
Gfolker 0:f70b1d60f794 962
Gfolker 0:f70b1d60f794 963 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 964
Gfolker 0:f70b1d60f794 965 }
Gfolker 0:f70b1d60f794 966
Gfolker 0:f70b1d60f794 967
Gfolker 0:f70b1d60f794 968 /* Internal Functions */
Gfolker 0:f70b1d60f794 969
Gfolker 0:f70b1d60f794 970 /**
Gfolker 0:f70b1d60f794 971 * [transpose description]
Gfolker 0:f70b1d60f794 972 * @param transImage Transposed Image
Gfolker 0:f70b1d60f794 973 * @param image Source Image
Gfolker 0:f70b1d60f794 974 * @param width Width to Transpose
Gfolker 0:f70b1d60f794 975 * @param height Height to Transpose
Gfolker 0:f70b1d60f794 976 */
Gfolker 0:f70b1d60f794 977 void SSD1351::Transpose(
Gfolker 0:f70b1d60f794 978 oled_pixel_t transImage,
Gfolker 0:f70b1d60f794 979 const oled_pixel_t image,
Gfolker 0:f70b1d60f794 980 uint8_t width,
Gfolker 0:f70b1d60f794 981 uint8_t height
Gfolker 0:f70b1d60f794 982 )
Gfolker 0:f70b1d60f794 983 {
Gfolker 0:f70b1d60f794 984 for ( uint8_t i = 0; i < height; i++ )
Gfolker 0:f70b1d60f794 985 {
Gfolker 0:f70b1d60f794 986 for ( uint8_t j = 0; j < width ; j++ )
Gfolker 0:f70b1d60f794 987 {
Gfolker 0:f70b1d60f794 988 transImage[ j*height + i ] = image[ i*width + j ];
Gfolker 0:f70b1d60f794 989 }
Gfolker 0:f70b1d60f794 990 }
Gfolker 0:f70b1d60f794 991 }
Gfolker 0:f70b1d60f794 992
Gfolker 0:f70b1d60f794 993
Gfolker 0:f70b1d60f794 994
Gfolker 0:f70b1d60f794 995 /**
Gfolker 0:f70b1d60f794 996 * TopDown Transition Effect for Image
Gfolker 0:f70b1d60f794 997 * @param image image to be transitioned
Gfolker 0:f70b1d60f794 998 * @param xCrd x coordinate of image
Gfolker 0:f70b1d60f794 999 * @param yCrd y coordinate of image
Gfolker 0:f70b1d60f794 1000 * @param width width of image
Gfolker 0:f70b1d60f794 1001 * @param height height of image
Gfolker 0:f70b1d60f794 1002 * @return status flag
Gfolker 0:f70b1d60f794 1003 */
Gfolker 0:f70b1d60f794 1004 oled_status_t SSD1351::TopDown(
Gfolker 0:f70b1d60f794 1005 const uint8_t* image,
Gfolker 0:f70b1d60f794 1006 int8_t xCrd,
Gfolker 0:f70b1d60f794 1007 int8_t yCrd,
Gfolker 0:f70b1d60f794 1008 uint8_t width,
Gfolker 0:f70b1d60f794 1009 uint8_t height
Gfolker 0:f70b1d60f794 1010 )
Gfolker 0:f70b1d60f794 1011 {
Gfolker 0:f70b1d60f794 1012 uint16_t
Gfolker 0:f70b1d60f794 1013 transStep = OLED_TRANSITION_STEP;
Gfolker 0:f70b1d60f794 1014
Gfolker 0:f70b1d60f794 1015 uint16_t
Gfolker 0:f70b1d60f794 1016 partImgSize = width*transStep;
Gfolker 0:f70b1d60f794 1017
Gfolker 0:f70b1d60f794 1018 oled_status_t
Gfolker 0:f70b1d60f794 1019 status = OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 1020
Gfolker 0:f70b1d60f794 1021 uint8_t*
Gfolker 0:f70b1d60f794 1022 partImgPtr = (uint8_t*)image + ( height - transStep ) * ( width * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1023
Gfolker 0:f70b1d60f794 1024 /**
Gfolker 0:f70b1d60f794 1025 * set locations
Gfolker 0:f70b1d60f794 1026 */
Gfolker 0:f70b1d60f794 1027
Gfolker 0:f70b1d60f794 1028 while (1)
Gfolker 0:f70b1d60f794 1029 {
Gfolker 0:f70b1d60f794 1030 SetBorders( xCrd, yCrd, width, height );
Gfolker 0:f70b1d60f794 1031
Gfolker 0:f70b1d60f794 1032 if ( partImgSize > width*height )
Gfolker 0:f70b1d60f794 1033 {
Gfolker 0:f70b1d60f794 1034 SendData( (const uint8_t*)image, width*height*OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1035 break;
Gfolker 0:f70b1d60f794 1036 }
Gfolker 0:f70b1d60f794 1037 else
Gfolker 0:f70b1d60f794 1038 {
Gfolker 0:f70b1d60f794 1039 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1040 }
Gfolker 0:f70b1d60f794 1041
Gfolker 0:f70b1d60f794 1042
Gfolker 0:f70b1d60f794 1043 /**
Gfolker 0:f70b1d60f794 1044 * update variables
Gfolker 0:f70b1d60f794 1045 */
Gfolker 0:f70b1d60f794 1046
Gfolker 0:f70b1d60f794 1047 partImgPtr -= ( width * transStep ) * OLED_BYTES_PER_PIXEL;
Gfolker 0:f70b1d60f794 1048 partImgSize += ( width * transStep );
Gfolker 0:f70b1d60f794 1049 transStep++;
Gfolker 0:f70b1d60f794 1050 }
Gfolker 0:f70b1d60f794 1051
Gfolker 0:f70b1d60f794 1052 return status;
Gfolker 0:f70b1d60f794 1053 }
Gfolker 0:f70b1d60f794 1054
Gfolker 0:f70b1d60f794 1055 /**
Gfolker 0:f70b1d60f794 1056 * DownTop Transition Effect for Image
Gfolker 0:f70b1d60f794 1057 * @param image image to be transitioned
Gfolker 0:f70b1d60f794 1058 * @param xCrd x coordinate of image
Gfolker 0:f70b1d60f794 1059 * @param yCrd y coordinate of image
Gfolker 0:f70b1d60f794 1060 * @param width width of image
Gfolker 0:f70b1d60f794 1061 * @param height height of image
Gfolker 0:f70b1d60f794 1062 * @return status flag
Gfolker 0:f70b1d60f794 1063 */
Gfolker 0:f70b1d60f794 1064
Gfolker 0:f70b1d60f794 1065 oled_status_t SSD1351::DownTop(
Gfolker 0:f70b1d60f794 1066 const uint8_t* image,
Gfolker 0:f70b1d60f794 1067 int8_t xCrd,
Gfolker 0:f70b1d60f794 1068 int8_t yCrd,
Gfolker 0:f70b1d60f794 1069 uint8_t width,
Gfolker 0:f70b1d60f794 1070 uint8_t height
Gfolker 0:f70b1d60f794 1071 )
Gfolker 0:f70b1d60f794 1072 {
Gfolker 0:f70b1d60f794 1073 uint16_t
Gfolker 0:f70b1d60f794 1074 transStep = OLED_TRANSITION_STEP;
Gfolker 0:f70b1d60f794 1075
Gfolker 0:f70b1d60f794 1076 uint16_t
Gfolker 0:f70b1d60f794 1077 partImgSize = width*transStep;
Gfolker 0:f70b1d60f794 1078
Gfolker 0:f70b1d60f794 1079 oled_status_t
Gfolker 0:f70b1d60f794 1080 status = OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 1081
Gfolker 0:f70b1d60f794 1082 uint8_t*
Gfolker 0:f70b1d60f794 1083 partImgPtr = (uint8_t*)image;
Gfolker 0:f70b1d60f794 1084
Gfolker 0:f70b1d60f794 1085 uint8_t
Gfolker 0:f70b1d60f794 1086 yCrd_moving = ( yCrd + height ) - 1;
Gfolker 0:f70b1d60f794 1087
Gfolker 0:f70b1d60f794 1088 /**
Gfolker 0:f70b1d60f794 1089 * set locations
Gfolker 0:f70b1d60f794 1090 */
Gfolker 0:f70b1d60f794 1091
Gfolker 0:f70b1d60f794 1092 while (1)
Gfolker 0:f70b1d60f794 1093 {
Gfolker 0:f70b1d60f794 1094 if (
Gfolker 0:f70b1d60f794 1095 ( partImgSize > OLED_SCREEN_SIZE )
Gfolker 0:f70b1d60f794 1096 || ( yCrd_moving < yCrd )
Gfolker 0:f70b1d60f794 1097 )
Gfolker 0:f70b1d60f794 1098 {
Gfolker 0:f70b1d60f794 1099 /* draw full image */
Gfolker 0:f70b1d60f794 1100 SetBorders( xCrd, yCrd, width, height );
Gfolker 0:f70b1d60f794 1101 SendData( (const uint8_t*)image, width * height * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1102 break;
Gfolker 0:f70b1d60f794 1103 }
Gfolker 0:f70b1d60f794 1104
Gfolker 0:f70b1d60f794 1105 else
Gfolker 0:f70b1d60f794 1106 {
Gfolker 0:f70b1d60f794 1107 SetBorders( xCrd, yCrd_moving, width, ( yCrd + height ) - yCrd_moving );
Gfolker 0:f70b1d60f794 1108 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1109 }
Gfolker 0:f70b1d60f794 1110
Gfolker 0:f70b1d60f794 1111 /**
Gfolker 0:f70b1d60f794 1112 * update variables
Gfolker 0:f70b1d60f794 1113 */
Gfolker 0:f70b1d60f794 1114
Gfolker 0:f70b1d60f794 1115 yCrd_moving -= transStep;
Gfolker 0:f70b1d60f794 1116 partImgSize += ( width * transStep );
Gfolker 0:f70b1d60f794 1117 transStep++;
Gfolker 0:f70b1d60f794 1118 }
Gfolker 0:f70b1d60f794 1119
Gfolker 0:f70b1d60f794 1120 return status;
Gfolker 0:f70b1d60f794 1121 }
Gfolker 0:f70b1d60f794 1122
Gfolker 0:f70b1d60f794 1123
Gfolker 0:f70b1d60f794 1124 /**
Gfolker 0:f70b1d60f794 1125 * LeftRight Transition Effect for Image
Gfolker 0:f70b1d60f794 1126 * @param image image to be transitioned
Gfolker 0:f70b1d60f794 1127 * @param xCrd x coordinate of image
Gfolker 0:f70b1d60f794 1128 * @param yCrd y coordinate of image
Gfolker 0:f70b1d60f794 1129 * @param width width of image
Gfolker 0:f70b1d60f794 1130 * @param height height of image
Gfolker 0:f70b1d60f794 1131 * @return status flag
Gfolker 0:f70b1d60f794 1132 */
Gfolker 0:f70b1d60f794 1133
Gfolker 0:f70b1d60f794 1134 oled_status_t SSD1351::LeftRight(
Gfolker 0:f70b1d60f794 1135 const uint8_t* image,
Gfolker 0:f70b1d60f794 1136 int8_t xCrd,
Gfolker 0:f70b1d60f794 1137 int8_t yCrd,
Gfolker 0:f70b1d60f794 1138 uint8_t width,
Gfolker 0:f70b1d60f794 1139 uint8_t height
Gfolker 0:f70b1d60f794 1140 )
Gfolker 0:f70b1d60f794 1141 {
Gfolker 0:f70b1d60f794 1142 oled_status_t
Gfolker 0:f70b1d60f794 1143 status = OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 1144
Gfolker 0:f70b1d60f794 1145 oled_dynamic_area_t
Gfolker 0:f70b1d60f794 1146 transImageArea =
Gfolker 0:f70b1d60f794 1147 {
Gfolker 0:f70b1d60f794 1148 .xCrd = 0,
Gfolker 0:f70b1d60f794 1149 .yCrd = 0,
Gfolker 0:f70b1d60f794 1150
Gfolker 0:f70b1d60f794 1151 .width = 96,
Gfolker 0:f70b1d60f794 1152 .height= 96
Gfolker 0:f70b1d60f794 1153 };
Gfolker 0:f70b1d60f794 1154
Gfolker 0:f70b1d60f794 1155 SetDynamicArea( &transImageArea );
Gfolker 0:f70b1d60f794 1156
Gfolker 0:f70b1d60f794 1157 /* helper pointer */
Gfolker 0:f70b1d60f794 1158 oled_pixel_t
Gfolker 0:f70b1d60f794 1159 transImage = (oled_pixel_t)oled_dynamic_area.areaBuffer;
Gfolker 0:f70b1d60f794 1160
Gfolker 0:f70b1d60f794 1161 if ( NULL == transImage )
Gfolker 0:f70b1d60f794 1162 {
Gfolker 0:f70b1d60f794 1163 return OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 1164 }
Gfolker 0:f70b1d60f794 1165
Gfolker 0:f70b1d60f794 1166 Transpose( transImage,(oled_pixel_t)image, width, height );
Gfolker 0:f70b1d60f794 1167
Gfolker 0:f70b1d60f794 1168 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
Gfolker 0:f70b1d60f794 1169 SendCmd( OLED_REMAP_SETTINGS | REMAP_VERTICAL_INCREMENT, DATA_BYTE );
Gfolker 0:f70b1d60f794 1170
Gfolker 0:f70b1d60f794 1171 uint16_t
Gfolker 0:f70b1d60f794 1172 transStep = OLED_TRANSITION_STEP;
Gfolker 0:f70b1d60f794 1173
Gfolker 0:f70b1d60f794 1174 uint16_t
Gfolker 0:f70b1d60f794 1175 partImgSize = height*transStep;
Gfolker 0:f70b1d60f794 1176
Gfolker 0:f70b1d60f794 1177 uint8_t*
Gfolker 0:f70b1d60f794 1178 partImgPtr = (uint8_t*)transImage + ( width - transStep ) * ( height * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1179
Gfolker 0:f70b1d60f794 1180 /**
Gfolker 0:f70b1d60f794 1181 * set locations
Gfolker 0:f70b1d60f794 1182 */
Gfolker 0:f70b1d60f794 1183
Gfolker 0:f70b1d60f794 1184 while (1)
Gfolker 0:f70b1d60f794 1185 {
Gfolker 0:f70b1d60f794 1186 SetBorders( xCrd, yCrd, width, height );
Gfolker 0:f70b1d60f794 1187
Gfolker 0:f70b1d60f794 1188 if ( partImgSize > width*height )
Gfolker 0:f70b1d60f794 1189 {
Gfolker 0:f70b1d60f794 1190 SendData((const uint8_t*)transImage, width * height * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1191 break;
Gfolker 0:f70b1d60f794 1192 }
Gfolker 0:f70b1d60f794 1193 else
Gfolker 0:f70b1d60f794 1194 {
Gfolker 0:f70b1d60f794 1195 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1196 }
Gfolker 0:f70b1d60f794 1197
Gfolker 0:f70b1d60f794 1198
Gfolker 0:f70b1d60f794 1199 partImgPtr -= ( transStep * height ) * OLED_BYTES_PER_PIXEL;
Gfolker 0:f70b1d60f794 1200 partImgSize += ( transStep * height );
Gfolker 0:f70b1d60f794 1201 transStep++;
Gfolker 0:f70b1d60f794 1202
Gfolker 0:f70b1d60f794 1203 }
Gfolker 0:f70b1d60f794 1204
Gfolker 0:f70b1d60f794 1205 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
Gfolker 0:f70b1d60f794 1206 SendCmd( OLED_REMAP_SETTINGS, DATA_BYTE );
Gfolker 0:f70b1d60f794 1207 DestroyDynamicArea();
Gfolker 0:f70b1d60f794 1208 return status;
Gfolker 0:f70b1d60f794 1209 }
Gfolker 0:f70b1d60f794 1210
Gfolker 0:f70b1d60f794 1211
Gfolker 0:f70b1d60f794 1212 /**
Gfolker 0:f70b1d60f794 1213 * RightLeft Transition Effect for Image
Gfolker 0:f70b1d60f794 1214 * @param image image to be transitioned
Gfolker 0:f70b1d60f794 1215 * @param xCrd x coordinate of image
Gfolker 0:f70b1d60f794 1216 * @param yCrd y coordinate of image
Gfolker 0:f70b1d60f794 1217 * @param width width of image
Gfolker 0:f70b1d60f794 1218 * @param height height of image
Gfolker 0:f70b1d60f794 1219 * @return status flag
Gfolker 0:f70b1d60f794 1220 */
Gfolker 0:f70b1d60f794 1221 oled_status_t SSD1351::RightLeft(
Gfolker 0:f70b1d60f794 1222 const uint8_t* image,
Gfolker 0:f70b1d60f794 1223 int8_t xCrd,
Gfolker 0:f70b1d60f794 1224 int8_t yCrd,
Gfolker 0:f70b1d60f794 1225 uint8_t width,
Gfolker 0:f70b1d60f794 1226 uint8_t height
Gfolker 0:f70b1d60f794 1227 )
Gfolker 0:f70b1d60f794 1228 {
Gfolker 0:f70b1d60f794 1229 oled_dynamic_area_t
Gfolker 0:f70b1d60f794 1230 transImageArea =
Gfolker 0:f70b1d60f794 1231 {
Gfolker 0:f70b1d60f794 1232 .xCrd = 0,
Gfolker 0:f70b1d60f794 1233 .yCrd = 0,
Gfolker 0:f70b1d60f794 1234
Gfolker 0:f70b1d60f794 1235 .width = 96,
Gfolker 0:f70b1d60f794 1236 .height= 96
Gfolker 0:f70b1d60f794 1237 };
Gfolker 0:f70b1d60f794 1238
Gfolker 0:f70b1d60f794 1239 SetDynamicArea( &transImageArea );
Gfolker 0:f70b1d60f794 1240
Gfolker 0:f70b1d60f794 1241 /* helper pointer */
Gfolker 0:f70b1d60f794 1242 oled_pixel_t
Gfolker 0:f70b1d60f794 1243 transImage = oled_dynamic_area.areaBuffer;
Gfolker 0:f70b1d60f794 1244
Gfolker 0:f70b1d60f794 1245 if ( NULL == transImage )
Gfolker 0:f70b1d60f794 1246 {
Gfolker 0:f70b1d60f794 1247 return OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 1248 }
Gfolker 0:f70b1d60f794 1249
Gfolker 0:f70b1d60f794 1250 Transpose(transImage, (oled_pixel_t)image, width, height );
Gfolker 0:f70b1d60f794 1251
Gfolker 0:f70b1d60f794 1252 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
Gfolker 0:f70b1d60f794 1253 SendCmd( OLED_REMAP_SETTINGS | REMAP_VERTICAL_INCREMENT, DATA_BYTE );
Gfolker 0:f70b1d60f794 1254
Gfolker 0:f70b1d60f794 1255
Gfolker 0:f70b1d60f794 1256 uint16_t
Gfolker 0:f70b1d60f794 1257 transStep = OLED_TRANSITION_STEP;
Gfolker 0:f70b1d60f794 1258
Gfolker 0:f70b1d60f794 1259 uint16_t
Gfolker 0:f70b1d60f794 1260 partImgSize = height * transStep;
Gfolker 0:f70b1d60f794 1261
Gfolker 0:f70b1d60f794 1262 uint8_t*
Gfolker 0:f70b1d60f794 1263 partImgPtr = (uint8_t*)transImage;
Gfolker 0:f70b1d60f794 1264
Gfolker 0:f70b1d60f794 1265 uint8_t
Gfolker 0:f70b1d60f794 1266 xCrd_moving = ( xCrd + width ) - 1;
Gfolker 0:f70b1d60f794 1267
Gfolker 0:f70b1d60f794 1268 /** set locations */
Gfolker 0:f70b1d60f794 1269
Gfolker 0:f70b1d60f794 1270 while (1)
Gfolker 0:f70b1d60f794 1271 {
Gfolker 0:f70b1d60f794 1272 if (( partImgSize > width*height )|| ( xCrd_moving < xCrd ))
Gfolker 0:f70b1d60f794 1273 {
Gfolker 0:f70b1d60f794 1274 SetBorders( xCrd, yCrd, width, height );
Gfolker 0:f70b1d60f794 1275 SendData( (const uint8_t*)transImage, height * width * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1276 break;
Gfolker 0:f70b1d60f794 1277 }
Gfolker 0:f70b1d60f794 1278 else
Gfolker 0:f70b1d60f794 1279 {
Gfolker 0:f70b1d60f794 1280 SetBorders( xCrd_moving, yCrd, ( xCrd + width ) - xCrd_moving, height );
Gfolker 0:f70b1d60f794 1281 SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1282 }
Gfolker 0:f70b1d60f794 1283
Gfolker 0:f70b1d60f794 1284 /** update variables*/
Gfolker 0:f70b1d60f794 1285
Gfolker 0:f70b1d60f794 1286 xCrd_moving -= transStep;
Gfolker 0:f70b1d60f794 1287 partImgSize += ( height * transStep );
Gfolker 0:f70b1d60f794 1288 transStep++;
Gfolker 0:f70b1d60f794 1289 }
Gfolker 0:f70b1d60f794 1290
Gfolker 0:f70b1d60f794 1291 SendCmd( OLED_CMD_SET_REMAP, CMD_BYTE );
Gfolker 0:f70b1d60f794 1292 SendCmd( OLED_REMAP_SETTINGS, DATA_BYTE );
Gfolker 0:f70b1d60f794 1293
Gfolker 0:f70b1d60f794 1294 DestroyDynamicArea();
Gfolker 0:f70b1d60f794 1295
Gfolker 0:f70b1d60f794 1296 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 1297 }
Gfolker 0:f70b1d60f794 1298
Gfolker 0:f70b1d60f794 1299
Gfolker 0:f70b1d60f794 1300 /**
Gfolker 0:f70b1d60f794 1301 * [setDirection description]
Gfolker 0:f70b1d60f794 1302 * @param self [description]
Gfolker 0:f70b1d60f794 1303 * @param xCrd [description]
Gfolker 0:f70b1d60f794 1304 * @param yCrd [description]
Gfolker 0:f70b1d60f794 1305 * @return [description]
Gfolker 0:f70b1d60f794 1306 */
Gfolker 0:f70b1d60f794 1307 void SSD1351::SetBorders(
Gfolker 0:f70b1d60f794 1308 int8_t xCrd,
Gfolker 0:f70b1d60f794 1309 int8_t yCrd,
Gfolker 0:f70b1d60f794 1310 uint8_t width,
Gfolker 0:f70b1d60f794 1311 uint8_t height
Gfolker 0:f70b1d60f794 1312 )
Gfolker 0:f70b1d60f794 1313 {
Gfolker 0:f70b1d60f794 1314
Gfolker 0:f70b1d60f794 1315 /* adjust for the offset*/
Gfolker 0:f70b1d60f794 1316 OLED_AdjustColumnOffset(xCrd);
Gfolker 0:f70b1d60f794 1317 OLED_AdjustRowOffset(yCrd);
Gfolker 0:f70b1d60f794 1318
Gfolker 0:f70b1d60f794 1319 SendCmd( OLED_CMD_SET_COLUMN, CMD_BYTE );
Gfolker 0:f70b1d60f794 1320 SendCmd( xCrd, DATA_BYTE );
Gfolker 0:f70b1d60f794 1321 SendCmd( xCrd + (width-1), DATA_BYTE );
Gfolker 0:f70b1d60f794 1322 SendCmd( OLED_CMD_SET_ROW, CMD_BYTE );
Gfolker 0:f70b1d60f794 1323 SendCmd( yCrd, DATA_BYTE );
Gfolker 0:f70b1d60f794 1324 SendCmd( yCrd + (height-1), DATA_BYTE );
Gfolker 0:f70b1d60f794 1325
Gfolker 0:f70b1d60f794 1326 }
Gfolker 0:f70b1d60f794 1327
Gfolker 0:f70b1d60f794 1328 /**
Gfolker 0:f70b1d60f794 1329 * create the buffer for a partial image
Gfolker 0:f70b1d60f794 1330 * @param imgBuf [description]
Gfolker 0:f70b1d60f794 1331 * @param width [description]
Gfolker 0:f70b1d60f794 1332 * @param height [description]
Gfolker 0:f70b1d60f794 1333 * @return [description]
Gfolker 0:f70b1d60f794 1334 */
Gfolker 0:f70b1d60f794 1335 oled_status_t SSD1351::CreateTextBackground()
Gfolker 0:f70b1d60f794 1336 {
Gfolker 0:f70b1d60f794 1337 uint8_t
Gfolker 0:f70b1d60f794 1338 xCrd = oled_dynamic_area.xCrd,
Gfolker 0:f70b1d60f794 1339 yCrd = oled_dynamic_area.yCrd,
Gfolker 0:f70b1d60f794 1340 width = oled_dynamic_area.width,
Gfolker 0:f70b1d60f794 1341 height = oled_dynamic_area.height;
Gfolker 0:f70b1d60f794 1342
Gfolker 0:f70b1d60f794 1343 oled_pixel_t
Gfolker 0:f70b1d60f794 1344 imgBuf = oled_dynamic_area.areaBuffer,
Gfolker 0:f70b1d60f794 1345 copyAddr;
Gfolker 0:f70b1d60f794 1346
Gfolker 0:f70b1d60f794 1347 const uint8_t*
Gfolker 0:f70b1d60f794 1348 background = oled_text_properties.background;
Gfolker 0:f70b1d60f794 1349
Gfolker 0:f70b1d60f794 1350 /* copy data */
Gfolker 0:f70b1d60f794 1351
Gfolker 0:f70b1d60f794 1352 if (
Gfolker 0:f70b1d60f794 1353 ( NULL == imgBuf )
Gfolker 0:f70b1d60f794 1354 || ( ( xCrd + width ) > OLED_SCREEN_WIDTH )
Gfolker 0:f70b1d60f794 1355 || ( ( yCrd + height ) > OLED_SCREEN_HEIGHT )
Gfolker 0:f70b1d60f794 1356 )
Gfolker 0:f70b1d60f794 1357 {
Gfolker 0:f70b1d60f794 1358 return OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 1359 }
Gfolker 0:f70b1d60f794 1360
Gfolker 0:f70b1d60f794 1361 if ( NULL == background )
Gfolker 0:f70b1d60f794 1362 {
Gfolker 0:f70b1d60f794 1363 for ( uint8_t i = 0; i < height; i++ )
Gfolker 0:f70b1d60f794 1364 {
Gfolker 0:f70b1d60f794 1365 memset( (void*)imgBuf, 0, width*OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1366 imgBuf += width;
Gfolker 0:f70b1d60f794 1367 }
Gfolker 0:f70b1d60f794 1368 }
Gfolker 0:f70b1d60f794 1369
Gfolker 0:f70b1d60f794 1370 else
Gfolker 0:f70b1d60f794 1371 {
Gfolker 0:f70b1d60f794 1372 copyAddr = (oled_pixel_t)( BMP_SkipHeader( background ) ) + ( yCrd*OLED_SCREEN_WIDTH + xCrd );
Gfolker 0:f70b1d60f794 1373 for ( uint8_t i = 0; i < height; i++ )
Gfolker 0:f70b1d60f794 1374 {
Gfolker 0:f70b1d60f794 1375 Swap( (oled_pixel_t)imgBuf, (const uint8_t*)copyAddr, width );
Gfolker 0:f70b1d60f794 1376 imgBuf += width;
Gfolker 0:f70b1d60f794 1377 copyAddr += OLED_SCREEN_WIDTH;
Gfolker 0:f70b1d60f794 1378 }
Gfolker 0:f70b1d60f794 1379 }
Gfolker 0:f70b1d60f794 1380
Gfolker 0:f70b1d60f794 1381 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 1382 }
Gfolker 0:f70b1d60f794 1383
Gfolker 0:f70b1d60f794 1384
Gfolker 0:f70b1d60f794 1385 /**
Gfolker 0:f70b1d60f794 1386 * Write the character to Buffer
Gfolker 0:f70b1d60f794 1387 * @param charToWrite character to be written
Gfolker 0:f70b1d60f794 1388 * @param chrBuf given pointer for buffer for the character
Gfolker 0:f70b1d60f794 1389 */
Gfolker 0:f70b1d60f794 1390 void SSD1351::WriteCharToBuf(
Gfolker 0:f70b1d60f794 1391 uint16_t charToWrite,
Gfolker 0:f70b1d60f794 1392 oled_pixel_t* chrBuf
Gfolker 0:f70b1d60f794 1393 )
Gfolker 0:f70b1d60f794 1394 {
Gfolker 0:f70b1d60f794 1395 uint8_t
Gfolker 0:f70b1d60f794 1396 foo = 0,
Gfolker 0:f70b1d60f794 1397 mask;
Gfolker 0:f70b1d60f794 1398
Gfolker 0:f70b1d60f794 1399 const uint8_t*
Gfolker 0:f70b1d60f794 1400 pChTable = selectedFont + 8 + (uint16_t)( ( charToWrite - selectedFont_firstChar ) << 2 );
Gfolker 0:f70b1d60f794 1401
Gfolker 0:f70b1d60f794 1402 currentChar_width = *pChTable,
Gfolker 0:f70b1d60f794 1403 currentChar_height = selectedFont_height;
Gfolker 0:f70b1d60f794 1404
Gfolker 0:f70b1d60f794 1405 uint32_t
Gfolker 0:f70b1d60f794 1406 offset = (uint32_t)pChTable[1]
Gfolker 0:f70b1d60f794 1407 | ( (uint32_t)pChTable[2] << 8 )
Gfolker 0:f70b1d60f794 1408 | ( (uint32_t)pChTable[3] << 16 );
Gfolker 0:f70b1d60f794 1409
Gfolker 0:f70b1d60f794 1410 const uint8_t*
Gfolker 0:f70b1d60f794 1411 pChBitMap = selectedFont + offset;
Gfolker 0:f70b1d60f794 1412
Gfolker 0:f70b1d60f794 1413 /* allocate space for char image */
Gfolker 0:f70b1d60f794 1414 *chrBuf = (oled_pixel_t)AllocateDynamicArea( currentChar_height * currentChar_width );
Gfolker 0:f70b1d60f794 1415
Gfolker 0:f70b1d60f794 1416 if ( NULL == *chrBuf )
Gfolker 0:f70b1d60f794 1417 {
Gfolker 0:f70b1d60f794 1418 return;
Gfolker 0:f70b1d60f794 1419 }
Gfolker 0:f70b1d60f794 1420
Gfolker 0:f70b1d60f794 1421 for ( uint8_t yCnt = 0; yCnt < currentChar_height; yCnt++ )
Gfolker 0:f70b1d60f794 1422 {
Gfolker 0:f70b1d60f794 1423 mask = 0;
Gfolker 0:f70b1d60f794 1424
Gfolker 0:f70b1d60f794 1425 for ( uint8_t xCnt = 0; xCnt < currentChar_width; xCnt++ )
Gfolker 0:f70b1d60f794 1426 {
Gfolker 0:f70b1d60f794 1427 if ( 0 == mask )
Gfolker 0:f70b1d60f794 1428 {
Gfolker 0:f70b1d60f794 1429 mask = 1;
Gfolker 0:f70b1d60f794 1430 foo = *pChBitMap++;
Gfolker 0:f70b1d60f794 1431 }
Gfolker 0:f70b1d60f794 1432
Gfolker 0:f70b1d60f794 1433 if ( 0 != ( foo & mask ) )
Gfolker 0:f70b1d60f794 1434 {
Gfolker 0:f70b1d60f794 1435 *( *chrBuf + yCnt*currentChar_width + xCnt ) = selectedFont_color;
Gfolker 0:f70b1d60f794 1436 }
Gfolker 0:f70b1d60f794 1437
Gfolker 0:f70b1d60f794 1438 else
Gfolker 0:f70b1d60f794 1439 {
Gfolker 0:f70b1d60f794 1440 *( *chrBuf + yCnt*currentChar_width + xCnt ) = 0;
Gfolker 0:f70b1d60f794 1441 }
Gfolker 0:f70b1d60f794 1442
Gfolker 0:f70b1d60f794 1443 mask <<= 1;
Gfolker 0:f70b1d60f794 1444 }
Gfolker 0:f70b1d60f794 1445 }
Gfolker 0:f70b1d60f794 1446 }
Gfolker 0:f70b1d60f794 1447
Gfolker 0:f70b1d60f794 1448
Gfolker 0:f70b1d60f794 1449 /**
Gfolker 0:f70b1d60f794 1450 * Add subimage/character to the active image buffer
Gfolker 0:f70b1d60f794 1451 * @param xOffset offset for the x-coordinate
Gfolker 0:f70b1d60f794 1452 * @param yOffset offset for the y-coordinate
Gfolker 0:f70b1d60f794 1453 * @param width desired width
Gfolker 0:f70b1d60f794 1454 * @param height desired height
Gfolker 0:f70b1d60f794 1455 * @return status flag
Gfolker 0:f70b1d60f794 1456 */
Gfolker 0:f70b1d60f794 1457 oled_status_t SSD1351::AddCharToTextArea(
Gfolker 0:f70b1d60f794 1458 oled_pixel_t chrPtr,
Gfolker 0:f70b1d60f794 1459 uint8_t chrWidth,
Gfolker 0:f70b1d60f794 1460 uint8_t chrHeight,
Gfolker 0:f70b1d60f794 1461 oled_pixel_t copyAddr,
Gfolker 0:f70b1d60f794 1462 uint8_t imgWidth
Gfolker 0:f70b1d60f794 1463 )
Gfolker 0:f70b1d60f794 1464 {
Gfolker 0:f70b1d60f794 1465 if ( NULL == copyAddr )
Gfolker 0:f70b1d60f794 1466 {
Gfolker 0:f70b1d60f794 1467 return OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 1468 }
Gfolker 0:f70b1d60f794 1469
Gfolker 0:f70b1d60f794 1470 for ( uint8_t i = 0; i < chrHeight; i++ )
Gfolker 0:f70b1d60f794 1471 {
Gfolker 0:f70b1d60f794 1472 for ( uint8_t j = 0; j < chrWidth; j++ )
Gfolker 0:f70b1d60f794 1473 {
Gfolker 0:f70b1d60f794 1474 if ( 0 != chrPtr[j] )
Gfolker 0:f70b1d60f794 1475 {
Gfolker 0:f70b1d60f794 1476 copyAddr[j] = chrPtr[j];
Gfolker 0:f70b1d60f794 1477 }
Gfolker 0:f70b1d60f794 1478 }
Gfolker 0:f70b1d60f794 1479 copyAddr += imgWidth;
Gfolker 0:f70b1d60f794 1480 chrPtr += chrWidth;
Gfolker 0:f70b1d60f794 1481 }
Gfolker 0:f70b1d60f794 1482 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 1483 }
Gfolker 0:f70b1d60f794 1484
Gfolker 0:f70b1d60f794 1485
Gfolker 0:f70b1d60f794 1486 /**
Gfolker 0:f70b1d60f794 1487 * Allocate memory for the desired image/character
Gfolker 0:f70b1d60f794 1488 * @param area desired area dimensions
Gfolker 0:f70b1d60f794 1489 */
Gfolker 0:f70b1d60f794 1490 void* SSD1351::AllocateDynamicArea( uint32_t area )
Gfolker 0:f70b1d60f794 1491 {
Gfolker 0:f70b1d60f794 1492 void*
Gfolker 0:f70b1d60f794 1493 ptr = malloc( area * OLED_BYTES_PER_PIXEL );
Gfolker 0:f70b1d60f794 1494
Gfolker 0:f70b1d60f794 1495 if ( NULL == ptr )
Gfolker 0:f70b1d60f794 1496 {
Gfolker 0:f70b1d60f794 1497 return NULL;
Gfolker 0:f70b1d60f794 1498 }
Gfolker 0:f70b1d60f794 1499
Gfolker 0:f70b1d60f794 1500 return ptr;
Gfolker 0:f70b1d60f794 1501 }
Gfolker 0:f70b1d60f794 1502
Gfolker 0:f70b1d60f794 1503
Gfolker 0:f70b1d60f794 1504 /**
Gfolker 0:f70b1d60f794 1505 * Deallocate current area
Gfolker 0:f70b1d60f794 1506 * @param area pointer to current area
Gfolker 0:f70b1d60f794 1507 */
Gfolker 0:f70b1d60f794 1508 oled_status_t SSD1351::DestroyDynamicArea( void* ptr )
Gfolker 0:f70b1d60f794 1509 {
Gfolker 0:f70b1d60f794 1510 if ( NULL == ptr )
Gfolker 0:f70b1d60f794 1511 {
Gfolker 0:f70b1d60f794 1512 return OLED_STATUS_INIT_ERROR;
Gfolker 0:f70b1d60f794 1513 }
Gfolker 0:f70b1d60f794 1514
Gfolker 0:f70b1d60f794 1515 free(ptr);
Gfolker 0:f70b1d60f794 1516
Gfolker 0:f70b1d60f794 1517 return OLED_STATUS_SUCCESS;
Gfolker 0:f70b1d60f794 1518 }