Hexiwear / Hexi_OLED_SSD1351

Dependents:   Hexi_OLED_TextImage_Example Hexi_OLED_Text_Example Hexi_OLED_Image_Example security-console-app ... more

Committer:
khuang
Date:
Wed Aug 17 22:08:40 2016 +0000
Revision:
0:06f42dd3eab3
Initial Version of Hexiwear OLED Display Driver; APIs not finalized; SUBJECT TO CHANGE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khuang 0:06f42dd3eab3 1 #include "OLED_types.h"
khuang 0:06f42dd3eab3 2 #include "OLED_info.h"
khuang 0:06f42dd3eab3 3 #include "mbed.h"
khuang 0:06f42dd3eab3 4 #include "OLED_driver.h"
khuang 0:06f42dd3eab3 5 #include "OLED_fonts.h"
khuang 0:06f42dd3eab3 6
khuang 0:06f42dd3eab3 7
khuang 0:06f42dd3eab3 8 /* oled_init arrays*/
khuang 0:06f42dd3eab3 9 const uint32_t oled_init_cmd[] = {
khuang 0:06f42dd3eab3 10 OLED_CMD_SET_CMD_LOCK,
khuang 0:06f42dd3eab3 11 OLED_UNLOCK,
khuang 0:06f42dd3eab3 12 OLED_CMD_SET_CMD_LOCK,
khuang 0:06f42dd3eab3 13 OLED_ACC_TO_CMD_YES,
khuang 0:06f42dd3eab3 14 OLED_CMD_DISPLAYOFF,
khuang 0:06f42dd3eab3 15 OLED_CMD_SET_OSC_FREQ_AND_CLOCKDIV,
khuang 0:06f42dd3eab3 16 0xF1,
khuang 0:06f42dd3eab3 17 OLED_CMD_SET_MUX_RATIO,
khuang 0:06f42dd3eab3 18 0x5F,
khuang 0:06f42dd3eab3 19 OLED_CMD_SET_REMAP,
khuang 0:06f42dd3eab3 20 OLED_REMAP_SETTINGS,
khuang 0:06f42dd3eab3 21 OLED_CMD_SET_COLUMN,
khuang 0:06f42dd3eab3 22 0x00,
khuang 0:06f42dd3eab3 23 0x5F,
khuang 0:06f42dd3eab3 24 OLED_CMD_SET_ROW,
khuang 0:06f42dd3eab3 25 0x00,
khuang 0:06f42dd3eab3 26 0x5F,
khuang 0:06f42dd3eab3 27 OLED_CMD_STARTLINE,
khuang 0:06f42dd3eab3 28 0x80,
khuang 0:06f42dd3eab3 29 OLED_CMD_DISPLAYOFFSET,
khuang 0:06f42dd3eab3 30 0x60,
khuang 0:06f42dd3eab3 31 OLED_CMD_PRECHARGE,
khuang 0:06f42dd3eab3 32 0x32,
khuang 0:06f42dd3eab3 33 OLED_CMD_VCOMH,
khuang 0:06f42dd3eab3 34 0x05,
khuang 0:06f42dd3eab3 35 OLED_CMD_NORMALDISPLAY,
khuang 0:06f42dd3eab3 36 OLED_CMD_CONTRASTABC,
khuang 0:06f42dd3eab3 37 0x8A,
khuang 0:06f42dd3eab3 38 0x51,
khuang 0:06f42dd3eab3 39 0x8A,
khuang 0:06f42dd3eab3 40 OLED_CMD_CONTRASTMASTER,
khuang 0:06f42dd3eab3 41 0xCF,
khuang 0:06f42dd3eab3 42 OLED_CMD_SETVSL,
khuang 0:06f42dd3eab3 43 0xA0,
khuang 0:06f42dd3eab3 44 0xB5,
khuang 0:06f42dd3eab3 45 0x55,
khuang 0:06f42dd3eab3 46 OLED_CMD_PRECHARGE2,
khuang 0:06f42dd3eab3 47 0x01,
khuang 0:06f42dd3eab3 48 OLED_CMD_DISPLAYON };
khuang 0:06f42dd3eab3 49
khuang 0:06f42dd3eab3 50
khuang 0:06f42dd3eab3 51 const uint8_t oled_init_isFirst[] = {
khuang 0:06f42dd3eab3 52 FIRST_BYTE,
khuang 0:06f42dd3eab3 53 OTHER_BYTE,
khuang 0:06f42dd3eab3 54 FIRST_BYTE,
khuang 0:06f42dd3eab3 55 OTHER_BYTE,
khuang 0:06f42dd3eab3 56 FIRST_BYTE,
khuang 0:06f42dd3eab3 57 FIRST_BYTE,
khuang 0:06f42dd3eab3 58 OTHER_BYTE,
khuang 0:06f42dd3eab3 59 FIRST_BYTE,
khuang 0:06f42dd3eab3 60 OTHER_BYTE,
khuang 0:06f42dd3eab3 61 FIRST_BYTE,
khuang 0:06f42dd3eab3 62 OTHER_BYTE,
khuang 0:06f42dd3eab3 63 FIRST_BYTE,
khuang 0:06f42dd3eab3 64 OTHER_BYTE,
khuang 0:06f42dd3eab3 65 OTHER_BYTE,
khuang 0:06f42dd3eab3 66 FIRST_BYTE,
khuang 0:06f42dd3eab3 67 OTHER_BYTE,
khuang 0:06f42dd3eab3 68 OTHER_BYTE,
khuang 0:06f42dd3eab3 69 FIRST_BYTE,
khuang 0:06f42dd3eab3 70 OTHER_BYTE,
khuang 0:06f42dd3eab3 71 FIRST_BYTE,
khuang 0:06f42dd3eab3 72 OTHER_BYTE,
khuang 0:06f42dd3eab3 73 FIRST_BYTE,
khuang 0:06f42dd3eab3 74 FIRST_BYTE,
khuang 0:06f42dd3eab3 75 FIRST_BYTE,
khuang 0:06f42dd3eab3 76 FIRST_BYTE,
khuang 0:06f42dd3eab3 77 FIRST_BYTE,
khuang 0:06f42dd3eab3 78 FIRST_BYTE,
khuang 0:06f42dd3eab3 79 OTHER_BYTE,
khuang 0:06f42dd3eab3 80 OTHER_BYTE,
khuang 0:06f42dd3eab3 81 OTHER_BYTE,
khuang 0:06f42dd3eab3 82 FIRST_BYTE,
khuang 0:06f42dd3eab3 83 OTHER_BYTE,
khuang 0:06f42dd3eab3 84 FIRST_BYTE,
khuang 0:06f42dd3eab3 85 OTHER_BYTE,
khuang 0:06f42dd3eab3 86 OTHER_BYTE,
khuang 0:06f42dd3eab3 87 OTHER_BYTE,
khuang 0:06f42dd3eab3 88 FIRST_BYTE,
khuang 0:06f42dd3eab3 89 OTHER_BYTE,
khuang 0:06f42dd3eab3 90 FIRST_BYTE};
khuang 0:06f42dd3eab3 91
khuang 0:06f42dd3eab3 92
khuang 0:06f42dd3eab3 93
khuang 0:06f42dd3eab3 94
khuang 0:06f42dd3eab3 95 OLED::OLED(PinName mosi,PinName sclk,PinName pwr, PinName cs,PinName rst, PinName dc): oled_SPI(mosi,NC,sclk) , oled_POWER(pwr), oled_CS(cs),oled_RST(rst),oled_DC(dc)
khuang 0:06f42dd3eab3 96 {
khuang 0:06f42dd3eab3 97
khuang 0:06f42dd3eab3 98 oled_SPI.frequency(8000000);
khuang 0:06f42dd3eab3 99
khuang 0:06f42dd3eab3 100
khuang 0:06f42dd3eab3 101 oled_DC =0;
khuang 0:06f42dd3eab3 102 OLED_PowerOFF();
khuang 0:06f42dd3eab3 103 wait_ms(1);
khuang 0:06f42dd3eab3 104 oled_RST = 0 ;
khuang 0:06f42dd3eab3 105 wait_ms(1);
khuang 0:06f42dd3eab3 106 oled_RST = 1 ;
khuang 0:06f42dd3eab3 107 wait_ms(1);
khuang 0:06f42dd3eab3 108 OLED_PowerON();
khuang 0:06f42dd3eab3 109
khuang 0:06f42dd3eab3 110 isFontInitialized = 0 ;
khuang 0:06f42dd3eab3 111 currentChar_width = 0,
khuang 0:06f42dd3eab3 112 currentChar_height = 0;
khuang 0:06f42dd3eab3 113 colorMask = COLOR_WHITE;
khuang 0:06f42dd3eab3 114
khuang 0:06f42dd3eab3 115 oled_text_properties.alignParam = OLED_TEXT_ALIGN_CENTER;
khuang 0:06f42dd3eab3 116 oled_text_properties.background = NULL;
khuang 0:06f42dd3eab3 117 oled_text_properties.font = oledFont_Tahoma_8_Regular;
khuang 0:06f42dd3eab3 118 oled_text_properties.fontColor = COLOR_RED;
khuang 0:06f42dd3eab3 119
khuang 0:06f42dd3eab3 120 oled_dynamic_area.areaBuffer = NULL;
khuang 0:06f42dd3eab3 121 oled_dynamic_area.height = 0;
khuang 0:06f42dd3eab3 122 oled_dynamic_area.width = 0;
khuang 0:06f42dd3eab3 123
khuang 0:06f42dd3eab3 124
khuang 0:06f42dd3eab3 125
khuang 0:06f42dd3eab3 126 for (int i=0;i<39;i++)
khuang 0:06f42dd3eab3 127 {
khuang 0:06f42dd3eab3 128 OLED_SendCmd(oled_init_cmd[i],oled_init_isFirst[i]);
khuang 0:06f42dd3eab3 129 }
khuang 0:06f42dd3eab3 130
khuang 0:06f42dd3eab3 131
khuang 0:06f42dd3eab3 132
khuang 0:06f42dd3eab3 133 }
khuang 0:06f42dd3eab3 134
khuang 0:06f42dd3eab3 135
khuang 0:06f42dd3eab3 136 OLED::~OLED(void)
khuang 0:06f42dd3eab3 137 {
khuang 0:06f42dd3eab3 138
khuang 0:06f42dd3eab3 139 //Run Free and zero pointers.
khuang 0:06f42dd3eab3 140 }
khuang 0:06f42dd3eab3 141
khuang 0:06f42dd3eab3 142
khuang 0:06f42dd3eab3 143
khuang 0:06f42dd3eab3 144
khuang 0:06f42dd3eab3 145 void OLED::OLED_SendCmd(uint32_t cmd,
khuang 0:06f42dd3eab3 146 uint8_t isFirst)
khuang 0:06f42dd3eab3 147 {
khuang 0:06f42dd3eab3 148
khuang 0:06f42dd3eab3 149
khuang 0:06f42dd3eab3 150
khuang 0:06f42dd3eab3 151 uint8_t
khuang 0:06f42dd3eab3 152 txSize = 1,
khuang 0:06f42dd3eab3 153 txBuf[4];
khuang 0:06f42dd3eab3 154
khuang 0:06f42dd3eab3 155 memcpy((void*)txBuf, (void*)&cmd, txSize );
khuang 0:06f42dd3eab3 156
khuang 0:06f42dd3eab3 157 if (isFirst )
khuang 0:06f42dd3eab3 158 {
khuang 0:06f42dd3eab3 159 oled_DC = 0;
khuang 0:06f42dd3eab3 160 }
khuang 0:06f42dd3eab3 161 else
khuang 0:06f42dd3eab3 162 {
khuang 0:06f42dd3eab3 163 oled_DC = 1;
khuang 0:06f42dd3eab3 164 }
khuang 0:06f42dd3eab3 165
khuang 0:06f42dd3eab3 166 oled_CS = 0;
khuang 0:06f42dd3eab3 167 oled_SPI.write(*txBuf);
khuang 0:06f42dd3eab3 168 oled_CS = 1;
khuang 0:06f42dd3eab3 169
khuang 0:06f42dd3eab3 170 }
khuang 0:06f42dd3eab3 171
khuang 0:06f42dd3eab3 172
khuang 0:06f42dd3eab3 173
khuang 0:06f42dd3eab3 174 void OLED::OLED_SendData ( const uint8_t* dataToSend,
khuang 0:06f42dd3eab3 175 uint32_t dataSize)
khuang 0:06f42dd3eab3 176
khuang 0:06f42dd3eab3 177 {
khuang 0:06f42dd3eab3 178
khuang 0:06f42dd3eab3 179
khuang 0:06f42dd3eab3 180 uint16_t* arrayPtr = (uint16_t*)dataToSend;
khuang 0:06f42dd3eab3 181
khuang 0:06f42dd3eab3 182 for( uint32_t i = 0; i < dataSize/2; i++ )
khuang 0:06f42dd3eab3 183 {
khuang 0:06f42dd3eab3 184 arrayPtr[i] &= colorMask;
khuang 0:06f42dd3eab3 185 }
khuang 0:06f42dd3eab3 186
khuang 0:06f42dd3eab3 187
khuang 0:06f42dd3eab3 188 this->OLED_SendCmd( OLED_CMD_WRITERAM, FIRST_BYTE );
khuang 0:06f42dd3eab3 189
khuang 0:06f42dd3eab3 190
khuang 0:06f42dd3eab3 191 // sending data -> set DC pin
khuang 0:06f42dd3eab3 192
khuang 0:06f42dd3eab3 193 oled_DC = 1;
khuang 0:06f42dd3eab3 194 oled_CS = 0 ;
khuang 0:06f42dd3eab3 195
khuang 0:06f42dd3eab3 196
khuang 0:06f42dd3eab3 197 const uint8_t*
khuang 0:06f42dd3eab3 198 // traversing pointer
khuang 0:06f42dd3eab3 199 bufPtr = dataToSend;
khuang 0:06f42dd3eab3 200
khuang 0:06f42dd3eab3 201
khuang 0:06f42dd3eab3 202 for ( uint32_t i = 0; i < dataSize; i++)
khuang 0:06f42dd3eab3 203 {
khuang 0:06f42dd3eab3 204 oled_SPI.write(*bufPtr);
khuang 0:06f42dd3eab3 205 bufPtr += 1;
khuang 0:06f42dd3eab3 206 }
khuang 0:06f42dd3eab3 207
khuang 0:06f42dd3eab3 208
khuang 0:06f42dd3eab3 209 oled_CS = 1;
khuang 0:06f42dd3eab3 210
khuang 0:06f42dd3eab3 211 }
khuang 0:06f42dd3eab3 212
khuang 0:06f42dd3eab3 213
khuang 0:06f42dd3eab3 214 oled_status_t OLED::OLED_DrawBox (
khuang 0:06f42dd3eab3 215 uint16_t xCrd,
khuang 0:06f42dd3eab3 216 uint16_t yCrd,
khuang 0:06f42dd3eab3 217 uint16_t width,
khuang 0:06f42dd3eab3 218 uint16_t height,
khuang 0:06f42dd3eab3 219 uint16_t color
khuang 0:06f42dd3eab3 220 )
khuang 0:06f42dd3eab3 221 {
khuang 0:06f42dd3eab3 222
khuang 0:06f42dd3eab3 223 oled_status_t status;
khuang 0:06f42dd3eab3 224 oled_dynamic_area_t boxArea;
khuang 0:06f42dd3eab3 225
khuang 0:06f42dd3eab3 226 boxArea.xCrd = xCrd;
khuang 0:06f42dd3eab3 227 boxArea.yCrd = yCrd;
khuang 0:06f42dd3eab3 228 boxArea.width = width;
khuang 0:06f42dd3eab3 229 boxArea.height = height;
khuang 0:06f42dd3eab3 230
khuang 0:06f42dd3eab3 231 uint32_t
khuang 0:06f42dd3eab3 232 boxSize = width*height;
khuang 0:06f42dd3eab3 233
khuang 0:06f42dd3eab3 234 OLED_SetDynamicArea( &boxArea );
khuang 0:06f42dd3eab3 235
khuang 0:06f42dd3eab3 236 // helper pointer
khuang 0:06f42dd3eab3 237 uint8_t*
khuang 0:06f42dd3eab3 238 boxBuf = (uint8_t*)oled_dynamic_area.areaBuffer;
khuang 0:06f42dd3eab3 239
khuang 0:06f42dd3eab3 240 if ( NULL == boxBuf )
khuang 0:06f42dd3eab3 241 {
khuang 0:06f42dd3eab3 242
khuang 0:06f42dd3eab3 243 return OLED_STATUS_ERROR;
khuang 0:06f42dd3eab3 244 }
khuang 0:06f42dd3eab3 245
khuang 0:06f42dd3eab3 246 // check the bounds
khuang 0:06f42dd3eab3 247 if AreCoordsNotValid( xCrd, yCrd, width, height )
khuang 0:06f42dd3eab3 248 {
khuang 0:06f42dd3eab3 249 status = OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 250 }
khuang 0:06f42dd3eab3 251
khuang 0:06f42dd3eab3 252 else
khuang 0:06f42dd3eab3 253 {
khuang 0:06f42dd3eab3 254 /** fill the buffer with color */
khuang 0:06f42dd3eab3 255
khuang 0:06f42dd3eab3 256 for ( uint16_t i = 0; i < boxSize; i++ )
khuang 0:06f42dd3eab3 257 {
khuang 0:06f42dd3eab3 258 boxBuf[ 2*i ] = color >> 8;
khuang 0:06f42dd3eab3 259 boxBuf[ 2*i + 1 ] = color;
khuang 0:06f42dd3eab3 260 }
khuang 0:06f42dd3eab3 261
khuang 0:06f42dd3eab3 262 /** set the locations */
khuang 0:06f42dd3eab3 263
khuang 0:06f42dd3eab3 264 // adjust for the offset
khuang 0:06f42dd3eab3 265 OLED_AdjustColumnOffset(xCrd);
khuang 0:06f42dd3eab3 266 OLED_AdjustRowOffset(yCrd);
khuang 0:06f42dd3eab3 267
khuang 0:06f42dd3eab3 268 OLED_SendCmd( OLED_CMD_SET_COLUMN, FIRST_BYTE);
khuang 0:06f42dd3eab3 269 OLED_SendCmd( xCrd, OTHER_BYTE );
khuang 0:06f42dd3eab3 270 OLED_SendCmd( xCrd + (width-1), OTHER_BYTE );
khuang 0:06f42dd3eab3 271 OLED_SendCmd( OLED_CMD_SET_ROW, FIRST_BYTE );
khuang 0:06f42dd3eab3 272 OLED_SendCmd( yCrd, OTHER_BYTE );
khuang 0:06f42dd3eab3 273 OLED_SendCmd( yCrd + (height-1), OTHER_BYTE );
khuang 0:06f42dd3eab3 274
khuang 0:06f42dd3eab3 275
khuang 0:06f42dd3eab3 276 // fill the GRAM
khuang 0:06f42dd3eab3 277 OLED_SendData( (uint8_t*)boxBuf, boxSize*OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 278
khuang 0:06f42dd3eab3 279 OLED_DestroyDynamicArea();
khuang 0:06f42dd3eab3 280
khuang 0:06f42dd3eab3 281 }
khuang 0:06f42dd3eab3 282
khuang 0:06f42dd3eab3 283 return status;
khuang 0:06f42dd3eab3 284 }
khuang 0:06f42dd3eab3 285
khuang 0:06f42dd3eab3 286 /**
khuang 0:06f42dd3eab3 287 * fill the entire screen
khuang 0:06f42dd3eab3 288 * @param color color to fill with
khuang 0:06f42dd3eab3 289 * @return status flag
khuang 0:06f42dd3eab3 290 */
khuang 0:06f42dd3eab3 291 void OLED::OLED_FillScreen( uint16_t color )
khuang 0:06f42dd3eab3 292 {
khuang 0:06f42dd3eab3 293 /** fill the screen buffer with color */
khuang 0:06f42dd3eab3 294 for ( uint16_t i = 0; i < ( OLED_SCREEN_WIDTH * OLED_SCREEN_HEIGHT ); i++ )
khuang 0:06f42dd3eab3 295 {
khuang 0:06f42dd3eab3 296 screenBuf[ 2*i ] = color >> 8;
khuang 0:06f42dd3eab3 297 screenBuf[ 2*i + 1 ] = color;
khuang 0:06f42dd3eab3 298 }
khuang 0:06f42dd3eab3 299
khuang 0:06f42dd3eab3 300 /** set the locations */
khuang 0:06f42dd3eab3 301 SetBorders( 0, 0, OLED_SCREEN_WIDTH, OLED_SCREEN_HEIGHT );
khuang 0:06f42dd3eab3 302
khuang 0:06f42dd3eab3 303 /** fill GRAM */
khuang 0:06f42dd3eab3 304 OLED_SendData( (uint8_t*)screenBuf, OLED_SCREEN_WIDTH * OLED_SCREEN_HEIGHT * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 305
khuang 0:06f42dd3eab3 306 }
khuang 0:06f42dd3eab3 307
khuang 0:06f42dd3eab3 308
khuang 0:06f42dd3eab3 309
khuang 0:06f42dd3eab3 310 oled_status_t OLED::OLED_DrawPixel (
khuang 0:06f42dd3eab3 311 int16_t xCrd,
khuang 0:06f42dd3eab3 312 int16_t yCrd,
khuang 0:06f42dd3eab3 313 uint16_t color
khuang 0:06f42dd3eab3 314 )
khuang 0:06f42dd3eab3 315 {
khuang 0:06f42dd3eab3 316 // check the bounds
khuang 0:06f42dd3eab3 317 if AreCoordsNotValid( xCrd, yCrd, 1, 1 )
khuang 0:06f42dd3eab3 318 {
khuang 0:06f42dd3eab3 319 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 320 }
khuang 0:06f42dd3eab3 321
khuang 0:06f42dd3eab3 322 else
khuang 0:06f42dd3eab3 323 {
khuang 0:06f42dd3eab3 324 // set directions
khuang 0:06f42dd3eab3 325 SetBorders( xCrd, yCrd, OLED_SCREEN_WIDTH, OLED_SCREEN_HEIGHT);
khuang 0:06f42dd3eab3 326
khuang 0:06f42dd3eab3 327 uint16_t
khuang 0:06f42dd3eab3 328 // swap bytes
khuang 0:06f42dd3eab3 329 dot = color;
khuang 0:06f42dd3eab3 330
khuang 0:06f42dd3eab3 331 OLED_SwapMe(dot);
khuang 0:06f42dd3eab3 332
khuang 0:06f42dd3eab3 333 // fill the GRAM
khuang 0:06f42dd3eab3 334 OLED_SendData( (uint8_t*)&dot, 2 );
khuang 0:06f42dd3eab3 335
khuang 0:06f42dd3eab3 336 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 337 }
khuang 0:06f42dd3eab3 338 }
khuang 0:06f42dd3eab3 339
khuang 0:06f42dd3eab3 340
khuang 0:06f42dd3eab3 341 oled_status_t OLED::OLED_DrawScreen (
khuang 0:06f42dd3eab3 342 const uint8_t* image,
khuang 0:06f42dd3eab3 343 uint8_t xCrd,
khuang 0:06f42dd3eab3 344 uint8_t yCrd,
khuang 0:06f42dd3eab3 345 uint8_t width,
khuang 0:06f42dd3eab3 346 uint8_t height,
khuang 0:06f42dd3eab3 347 oled_transition_t transition
khuang 0:06f42dd3eab3 348 )
khuang 0:06f42dd3eab3 349 {
khuang 0:06f42dd3eab3 350 oled_status_t
khuang 0:06f42dd3eab3 351 status = OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 352
khuang 0:06f42dd3eab3 353 if AreCoordsNotValid( xCrd, yCrd, width, height )
khuang 0:06f42dd3eab3 354 {
khuang 0:06f42dd3eab3 355 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 356 }
khuang 0:06f42dd3eab3 357
khuang 0:06f42dd3eab3 358 switch ( transition )
khuang 0:06f42dd3eab3 359 {
khuang 0:06f42dd3eab3 360 case OLED_TRANSITION_NONE: {
khuang 0:06f42dd3eab3 361 /** set the locations */
khuang 0:06f42dd3eab3 362 SetBorders( xCrd, yCrd, width, height);
khuang 0:06f42dd3eab3 363
khuang 0:06f42dd3eab3 364 // fill the GRAM
khuang 0:06f42dd3eab3 365 OLED_SendData( (const uint8_t*)image, width * height * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 366 break;
khuang 0:06f42dd3eab3 367 }
khuang 0:06f42dd3eab3 368
khuang 0:06f42dd3eab3 369 case OLED_TRANSITION_TOP_DOWN: {
khuang 0:06f42dd3eab3 370 TopDown( image, xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 371 break;
khuang 0:06f42dd3eab3 372 }
khuang 0:06f42dd3eab3 373
khuang 0:06f42dd3eab3 374 case OLED_TRANSITION_DOWN_TOP: {
khuang 0:06f42dd3eab3 375 DownTop( image, xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 376 break;
khuang 0:06f42dd3eab3 377 }
khuang 0:06f42dd3eab3 378
khuang 0:06f42dd3eab3 379 case OLED_TRANSITION_LEFT_RIGHT: {
khuang 0:06f42dd3eab3 380 LeftRight( image, xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 381 break;
khuang 0:06f42dd3eab3 382 }
khuang 0:06f42dd3eab3 383
khuang 0:06f42dd3eab3 384 case OLED_TRANSITION_RIGHT_LEFT: {
khuang 0:06f42dd3eab3 385 RightLeft( image, xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 386 break;
khuang 0:06f42dd3eab3 387 }
khuang 0:06f42dd3eab3 388
khuang 0:06f42dd3eab3 389 default: {}
khuang 0:06f42dd3eab3 390 }
khuang 0:06f42dd3eab3 391
khuang 0:06f42dd3eab3 392 return status;
khuang 0:06f42dd3eab3 393 }
khuang 0:06f42dd3eab3 394
khuang 0:06f42dd3eab3 395
khuang 0:06f42dd3eab3 396 oled_status_t OLED::OLED_SetFont(
khuang 0:06f42dd3eab3 397 const uint8_t* newFont,
khuang 0:06f42dd3eab3 398 uint16_t newColor
khuang 0:06f42dd3eab3 399 )
khuang 0:06f42dd3eab3 400 {
khuang 0:06f42dd3eab3 401 /** save the new values in intern variables */
khuang 0:06f42dd3eab3 402
khuang 0:06f42dd3eab3 403 selectedFont = newFont;
khuang 0:06f42dd3eab3 404 // selectedFont_firstChar = newFont[2] + (newFont[3] << 8);
khuang 0:06f42dd3eab3 405 selectedFont_firstChar = newFont[2] | ( (uint16_t)newFont[3] << 8 );
khuang 0:06f42dd3eab3 406 // selectedFont_lastChar = newFont[4] + (newFont[5] << 8);
khuang 0:06f42dd3eab3 407 selectedFont_lastChar = newFont[4] | ( (uint16_t)newFont[5] << 8 );
khuang 0:06f42dd3eab3 408 selectedFont_height = newFont[6];
khuang 0:06f42dd3eab3 409 selectedFont_color = newColor;
khuang 0:06f42dd3eab3 410
khuang 0:06f42dd3eab3 411 OLED_SwapMe( selectedFont_color );
khuang 0:06f42dd3eab3 412
khuang 0:06f42dd3eab3 413 isFontInitialized = 1;
khuang 0:06f42dd3eab3 414 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 415 }
khuang 0:06f42dd3eab3 416
khuang 0:06f42dd3eab3 417
khuang 0:06f42dd3eab3 418 void OLED::OLED_SetDynamicArea(oled_dynamic_area_t *dynamic_area)
khuang 0:06f42dd3eab3 419 {
khuang 0:06f42dd3eab3 420
khuang 0:06f42dd3eab3 421 if( NULL == oled_dynamic_area.areaBuffer )
khuang 0:06f42dd3eab3 422 {
khuang 0:06f42dd3eab3 423 oled_dynamic_area.areaBuffer = (oled_pixel_t)AllocateDynamicArea( dynamic_area->width * dynamic_area->height );
khuang 0:06f42dd3eab3 424 }
khuang 0:06f42dd3eab3 425 else if(
khuang 0:06f42dd3eab3 426 ( dynamic_area->height != oled_dynamic_area.height ) ||
khuang 0:06f42dd3eab3 427 ( dynamic_area->width != oled_dynamic_area.width )
khuang 0:06f42dd3eab3 428 )
khuang 0:06f42dd3eab3 429 {
khuang 0:06f42dd3eab3 430 OLED_DestroyDynamicArea();
khuang 0:06f42dd3eab3 431 oled_dynamic_area.areaBuffer = (oled_pixel_t)AllocateDynamicArea( dynamic_area->width * dynamic_area->height );
khuang 0:06f42dd3eab3 432 }
khuang 0:06f42dd3eab3 433
khuang 0:06f42dd3eab3 434 oled_dynamic_area.xCrd = dynamic_area->xCrd;
khuang 0:06f42dd3eab3 435 oled_dynamic_area.yCrd = dynamic_area->yCrd;
khuang 0:06f42dd3eab3 436 oled_dynamic_area.width = dynamic_area->width;
khuang 0:06f42dd3eab3 437 oled_dynamic_area.height = dynamic_area->height;
khuang 0:06f42dd3eab3 438 }
khuang 0:06f42dd3eab3 439
khuang 0:06f42dd3eab3 440
khuang 0:06f42dd3eab3 441 void OLED::OLED_DestroyDynamicArea()
khuang 0:06f42dd3eab3 442 {
khuang 0:06f42dd3eab3 443 if ( NULL != oled_dynamic_area.areaBuffer )
khuang 0:06f42dd3eab3 444 {
khuang 0:06f42dd3eab3 445 DestroyDynamicArea( oled_dynamic_area.areaBuffer );
khuang 0:06f42dd3eab3 446 oled_dynamic_area.areaBuffer = NULL;
khuang 0:06f42dd3eab3 447 }
khuang 0:06f42dd3eab3 448 }
khuang 0:06f42dd3eab3 449
khuang 0:06f42dd3eab3 450
khuang 0:06f42dd3eab3 451 void OLED::OLED_SetTextProperties(oled_text_properties_t *textProperties)
khuang 0:06f42dd3eab3 452 {
khuang 0:06f42dd3eab3 453 oled_text_properties.font = textProperties->font;
khuang 0:06f42dd3eab3 454 oled_text_properties.fontColor = textProperties->fontColor;
khuang 0:06f42dd3eab3 455 oled_text_properties.alignParam = textProperties->alignParam;
khuang 0:06f42dd3eab3 456 oled_text_properties.background = textProperties->background;
khuang 0:06f42dd3eab3 457
khuang 0:06f42dd3eab3 458 OLED_SetFont( oled_text_properties.font, oled_text_properties.fontColor );
khuang 0:06f42dd3eab3 459 }
khuang 0:06f42dd3eab3 460
khuang 0:06f42dd3eab3 461
khuang 0:06f42dd3eab3 462
khuang 0:06f42dd3eab3 463
khuang 0:06f42dd3eab3 464 uint8_t OLED::OLED_GetTextWidth(const uint8_t* text)
khuang 0:06f42dd3eab3 465 {
khuang 0:06f42dd3eab3 466 uint8_t chrCnt = 0;
khuang 0:06f42dd3eab3 467 uint8_t text_width = 0;
khuang 0:06f42dd3eab3 468
khuang 0:06f42dd3eab3 469 while ( 0 != text[chrCnt] )
khuang 0:06f42dd3eab3 470 {
khuang 0:06f42dd3eab3 471 text_width += *( selectedFont + 8 + (uint16_t)( ( text[chrCnt++] - selectedFont_firstChar ) << 2 ) );
khuang 0:06f42dd3eab3 472 // make 1px space between chars
khuang 0:06f42dd3eab3 473 text_width++;
khuang 0:06f42dd3eab3 474 }
khuang 0:06f42dd3eab3 475 // remove the final space
khuang 0:06f42dd3eab3 476 text_width--;
khuang 0:06f42dd3eab3 477
khuang 0:06f42dd3eab3 478 return text_width;
khuang 0:06f42dd3eab3 479 }
khuang 0:06f42dd3eab3 480
khuang 0:06f42dd3eab3 481
khuang 0:06f42dd3eab3 482
khuang 0:06f42dd3eab3 483 uint8_t OLED::OLED_CharCount(uint8_t width, const uint8_t* font, const uint8_t* text, uint8_t length)
khuang 0:06f42dd3eab3 484 {
khuang 0:06f42dd3eab3 485 uint8_t chrCnt = 0;
khuang 0:06f42dd3eab3 486 uint8_t text_width = 0;
khuang 0:06f42dd3eab3 487 uint16_t firstChar;
khuang 0:06f42dd3eab3 488
khuang 0:06f42dd3eab3 489 firstChar = font[2] | ( (uint16_t)font[3] << 8 );
khuang 0:06f42dd3eab3 490
khuang 0:06f42dd3eab3 491 while ( chrCnt < length )
khuang 0:06f42dd3eab3 492 {
khuang 0:06f42dd3eab3 493 text_width += *( font + 8 + (uint16_t)( ( text[chrCnt++] - firstChar ) << 2 ) );
khuang 0:06f42dd3eab3 494 if(text_width > width)
khuang 0:06f42dd3eab3 495 {
khuang 0:06f42dd3eab3 496 chrCnt--;
khuang 0:06f42dd3eab3 497 break;
khuang 0:06f42dd3eab3 498 }
khuang 0:06f42dd3eab3 499 // make 1px space between chars
khuang 0:06f42dd3eab3 500 text_width++;
khuang 0:06f42dd3eab3 501 }
khuang 0:06f42dd3eab3 502
khuang 0:06f42dd3eab3 503 return chrCnt;
khuang 0:06f42dd3eab3 504 }
khuang 0:06f42dd3eab3 505
khuang 0:06f42dd3eab3 506
khuang 0:06f42dd3eab3 507 oled_status_t OLED::OLED_AddText( const uint8_t* text )
khuang 0:06f42dd3eab3 508 {
khuang 0:06f42dd3eab3 509 uint16_t
khuang 0:06f42dd3eab3 510 chrCnt = 0;
khuang 0:06f42dd3eab3 511 oled_pixel_t
khuang 0:06f42dd3eab3 512 chrBuf = NULL;
khuang 0:06f42dd3eab3 513
khuang 0:06f42dd3eab3 514 uint8_t
khuang 0:06f42dd3eab3 515 currentChar_x = 0,
khuang 0:06f42dd3eab3 516 currentChar_y = 0;
khuang 0:06f42dd3eab3 517
khuang 0:06f42dd3eab3 518 uint8_t
khuang 0:06f42dd3eab3 519 text_height = 0,
khuang 0:06f42dd3eab3 520 text_width = 0;
khuang 0:06f42dd3eab3 521
khuang 0:06f42dd3eab3 522 text_width = OLED_GetTextWidth(text);
khuang 0:06f42dd3eab3 523
khuang 0:06f42dd3eab3 524 /**
khuang 0:06f42dd3eab3 525 * set default values, if necessary
khuang 0:06f42dd3eab3 526 */
khuang 0:06f42dd3eab3 527
khuang 0:06f42dd3eab3 528 text_height = selectedFont_height;
khuang 0:06f42dd3eab3 529
khuang 0:06f42dd3eab3 530 if (( oled_dynamic_area.width < text_width )||( oled_dynamic_area.height < text_height ))
khuang 0:06f42dd3eab3 531 {
khuang 0:06f42dd3eab3 532 oled_dynamic_area_t
khuang 0:06f42dd3eab3 533 textArea;
khuang 0:06f42dd3eab3 534
khuang 0:06f42dd3eab3 535 textArea.width = text_width;
khuang 0:06f42dd3eab3 536 textArea.height = text_height;
khuang 0:06f42dd3eab3 537 OLED_SetDynamicArea( &textArea );
khuang 0:06f42dd3eab3 538 }
khuang 0:06f42dd3eab3 539
khuang 0:06f42dd3eab3 540 // oled_dynamic_area.width = text_width;
khuang 0:06f42dd3eab3 541 // oled_dynamic_area.height = text_height;
khuang 0:06f42dd3eab3 542 // // malloc new text space
khuang 0:06f42dd3eab3 543 // OLED_DestroyDynamicArea();
khuang 0:06f42dd3eab3 544 // oled_dynamic_area.areaBuffer = (oled_pixel_t)AllocateDynamicArea( oled_dynamic_area.width * oled_dynamic_area.height );
khuang 0:06f42dd3eab3 545
khuang 0:06f42dd3eab3 546 // if ( NULL == oled_dynamic_area.areaBuffer )
khuang 0:06f42dd3eab3 547 // {
khuang 0:06f42dd3eab3 548 // return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 549 // }
khuang 0:06f42dd3eab3 550
khuang 0:06f42dd3eab3 551 currentChar_y = ( oled_dynamic_area.height - text_height ) >> 1;
khuang 0:06f42dd3eab3 552
khuang 0:06f42dd3eab3 553 switch ( oled_text_properties.alignParam & OLED_TEXT_HALIGN_MASK )
khuang 0:06f42dd3eab3 554 {
khuang 0:06f42dd3eab3 555 case OLED_TEXT_ALIGN_LEFT:
khuang 0:06f42dd3eab3 556 {
khuang 0:06f42dd3eab3 557 currentChar_x = 0;
khuang 0:06f42dd3eab3 558 break;
khuang 0:06f42dd3eab3 559 }
khuang 0:06f42dd3eab3 560
khuang 0:06f42dd3eab3 561 case OLED_TEXT_ALIGN_RIGHT:
khuang 0:06f42dd3eab3 562 {
khuang 0:06f42dd3eab3 563 currentChar_x = ( oled_dynamic_area.width - text_width );
khuang 0:06f42dd3eab3 564 break;
khuang 0:06f42dd3eab3 565 }
khuang 0:06f42dd3eab3 566
khuang 0:06f42dd3eab3 567 case OLED_TEXT_ALIGN_CENTER:
khuang 0:06f42dd3eab3 568 {
khuang 0:06f42dd3eab3 569 currentChar_x += ( oled_dynamic_area.width - text_width ) >> 1 ;
khuang 0:06f42dd3eab3 570 break;
khuang 0:06f42dd3eab3 571 }
khuang 0:06f42dd3eab3 572
khuang 0:06f42dd3eab3 573 case OLED_TEXT_ALIGN_NONE:
khuang 0:06f42dd3eab3 574 {
khuang 0:06f42dd3eab3 575 break;
khuang 0:06f42dd3eab3 576 }
khuang 0:06f42dd3eab3 577
khuang 0:06f42dd3eab3 578 default: {}
khuang 0:06f42dd3eab3 579 }
khuang 0:06f42dd3eab3 580
khuang 0:06f42dd3eab3 581 if ( CreateTextBackground() != OLED_STATUS_SUCCESS )
khuang 0:06f42dd3eab3 582 {
khuang 0:06f42dd3eab3 583 return OLED_STATUS_ERROR;
khuang 0:06f42dd3eab3 584 }
khuang 0:06f42dd3eab3 585
khuang 0:06f42dd3eab3 586 /**
khuang 0:06f42dd3eab3 587 * write the characters into designated space, one by one
khuang 0:06f42dd3eab3 588 */
khuang 0:06f42dd3eab3 589
khuang 0:06f42dd3eab3 590 chrCnt = 0;
khuang 0:06f42dd3eab3 591 while ( 0 != text[chrCnt] )
khuang 0:06f42dd3eab3 592 {
khuang 0:06f42dd3eab3 593 WriteCharToBuf( text[chrCnt++], &chrBuf );
khuang 0:06f42dd3eab3 594
khuang 0:06f42dd3eab3 595 if ( NULL == chrBuf )
khuang 0:06f42dd3eab3 596 {
khuang 0:06f42dd3eab3 597 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 598 }
khuang 0:06f42dd3eab3 599
khuang 0:06f42dd3eab3 600 else
khuang 0:06f42dd3eab3 601 {
khuang 0:06f42dd3eab3 602 if (
khuang 0:06f42dd3eab3 603 ( ( currentChar_x + currentChar_width ) > oled_dynamic_area.width )
khuang 0:06f42dd3eab3 604 || ( ( currentChar_y + currentChar_height ) > oled_dynamic_area.height )
khuang 0:06f42dd3eab3 605 )
khuang 0:06f42dd3eab3 606 {
khuang 0:06f42dd3eab3 607 DestroyDynamicArea( chrBuf );
khuang 0:06f42dd3eab3 608 chrBuf = NULL;
khuang 0:06f42dd3eab3 609 return OLED_STATUS_ERROR;
khuang 0:06f42dd3eab3 610 }
khuang 0:06f42dd3eab3 611
khuang 0:06f42dd3eab3 612 // copy data
khuang 0:06f42dd3eab3 613 oled_pixel_t
khuang 0:06f42dd3eab3 614 copyAddr = oled_dynamic_area.areaBuffer + ( currentChar_y * oled_dynamic_area.width + currentChar_x );
khuang 0:06f42dd3eab3 615
khuang 0:06f42dd3eab3 616 AddCharToTextArea( chrBuf, currentChar_width, currentChar_height, copyAddr, oled_dynamic_area.width );
khuang 0:06f42dd3eab3 617
khuang 0:06f42dd3eab3 618 currentChar_x += ( currentChar_width+1 );
khuang 0:06f42dd3eab3 619 currentChar_y += 0;
khuang 0:06f42dd3eab3 620
khuang 0:06f42dd3eab3 621 DestroyDynamicArea( chrBuf );
khuang 0:06f42dd3eab3 622 chrBuf = NULL;
khuang 0:06f42dd3eab3 623 }
khuang 0:06f42dd3eab3 624 }
khuang 0:06f42dd3eab3 625
khuang 0:06f42dd3eab3 626 OLED_UpdateBuffer(
khuang 0:06f42dd3eab3 627 oled_dynamic_area.xCrd,
khuang 0:06f42dd3eab3 628 oled_dynamic_area.yCrd,
khuang 0:06f42dd3eab3 629 oled_dynamic_area.width,
khuang 0:06f42dd3eab3 630 oled_dynamic_area.height,
khuang 0:06f42dd3eab3 631 (const uint8_t*)oled_dynamic_area.areaBuffer
khuang 0:06f42dd3eab3 632 );
khuang 0:06f42dd3eab3 633
khuang 0:06f42dd3eab3 634 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 635 }
khuang 0:06f42dd3eab3 636
khuang 0:06f42dd3eab3 637
khuang 0:06f42dd3eab3 638
khuang 0:06f42dd3eab3 639
khuang 0:06f42dd3eab3 640 oled_status_t OLED::OLED_DrawText ( const uint8_t* text )
khuang 0:06f42dd3eab3 641 {
khuang 0:06f42dd3eab3 642
khuang 0:06f42dd3eab3 643 if ( NULL == text )
khuang 0:06f42dd3eab3 644 {
khuang 0:06f42dd3eab3 645 return OLED_STATUS_ERROR;
khuang 0:06f42dd3eab3 646 }
khuang 0:06f42dd3eab3 647
khuang 0:06f42dd3eab3 648 OLED_AddText( text );
khuang 0:06f42dd3eab3 649
khuang 0:06f42dd3eab3 650 // set the locations
khuang 0:06f42dd3eab3 651 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
khuang 0:06f42dd3eab3 652
khuang 0:06f42dd3eab3 653 // fill the GRAM
khuang 0:06f42dd3eab3 654 OLED_SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 655
khuang 0:06f42dd3eab3 656
khuang 0:06f42dd3eab3 657 // free( currentTextAreaImage );
khuang 0:06f42dd3eab3 658 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 659 }
khuang 0:06f42dd3eab3 660
khuang 0:06f42dd3eab3 661
khuang 0:06f42dd3eab3 662 void OLED::OLED_GetImageDimensions(uint8_t *width, uint8_t *height, const uint8_t* image)
khuang 0:06f42dd3eab3 663 {
khuang 0:06f42dd3eab3 664 *height = image[2] + (image[3] << 8);
khuang 0:06f42dd3eab3 665 *width = image[4] + (image[5] << 8);
khuang 0:06f42dd3eab3 666 }
khuang 0:06f42dd3eab3 667
khuang 0:06f42dd3eab3 668
khuang 0:06f42dd3eab3 669
khuang 0:06f42dd3eab3 670 oled_status_t OLED::OLED_AddImage ( const uint8_t* image )
khuang 0:06f42dd3eab3 671 {
khuang 0:06f42dd3eab3 672 oled_status_t
khuang 0:06f42dd3eab3 673 status = OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 674
khuang 0:06f42dd3eab3 675 // check the bounds
khuang 0:06f42dd3eab3 676 if AreCoordsNotValid( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height )
khuang 0:06f42dd3eab3 677 {
khuang 0:06f42dd3eab3 678 status = OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 679 }
khuang 0:06f42dd3eab3 680
khuang 0:06f42dd3eab3 681 else
khuang 0:06f42dd3eab3 682 {
khuang 0:06f42dd3eab3 683 OLED_Swap( (oled_pixel_t)oled_dynamic_area.areaBuffer, BMP_SkipHeader(image), oled_dynamic_area.width*oled_dynamic_area.height );
khuang 0:06f42dd3eab3 684
khuang 0:06f42dd3eab3 685 // update the main screen buffer
khuang 0:06f42dd3eab3 686 OLED_UpdateBuffer( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height, (const uint8_t *)oled_dynamic_area.areaBuffer );
khuang 0:06f42dd3eab3 687 }
khuang 0:06f42dd3eab3 688
khuang 0:06f42dd3eab3 689 return status;
khuang 0:06f42dd3eab3 690 }
khuang 0:06f42dd3eab3 691
khuang 0:06f42dd3eab3 692
khuang 0:06f42dd3eab3 693
khuang 0:06f42dd3eab3 694 oled_status_t OLED::OLED_DrawImage ( const uint8_t* image )
khuang 0:06f42dd3eab3 695 {
khuang 0:06f42dd3eab3 696
khuang 0:06f42dd3eab3 697 oled_status_t
khuang 0:06f42dd3eab3 698 status = OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 699
khuang 0:06f42dd3eab3 700 status = OLED_AddImage( image );
khuang 0:06f42dd3eab3 701
khuang 0:06f42dd3eab3 702 // set the locations
khuang 0:06f42dd3eab3 703 SetBorders( oled_dynamic_area.xCrd, oled_dynamic_area.yCrd, oled_dynamic_area.width, oled_dynamic_area.height );
khuang 0:06f42dd3eab3 704
khuang 0:06f42dd3eab3 705 // fill the GRAM
khuang 0:06f42dd3eab3 706 OLED_SendData( (const uint8_t*)oled_dynamic_area.areaBuffer, oled_dynamic_area.width * oled_dynamic_area.height * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 707
khuang 0:06f42dd3eab3 708
khuang 0:06f42dd3eab3 709 return status;
khuang 0:06f42dd3eab3 710 }
khuang 0:06f42dd3eab3 711
khuang 0:06f42dd3eab3 712
khuang 0:06f42dd3eab3 713
khuang 0:06f42dd3eab3 714 void OLED::OLED_DimScreenON()
khuang 0:06f42dd3eab3 715 {
khuang 0:06f42dd3eab3 716 for ( int i = 0; i < 16; i++ )
khuang 0:06f42dd3eab3 717 {
khuang 0:06f42dd3eab3 718 OLED_SendCmd( OLED_CMD_CONTRASTMASTER, FIRST_BYTE );
khuang 0:06f42dd3eab3 719 OLED_SendCmd( 0xC0 | (0xF-i), OTHER_BYTE );
khuang 0:06f42dd3eab3 720 wait_ms(20);
khuang 0:06f42dd3eab3 721 //OSA_TimeDelay( 20 );
khuang 0:06f42dd3eab3 722 }
khuang 0:06f42dd3eab3 723 }
khuang 0:06f42dd3eab3 724
khuang 0:06f42dd3eab3 725
khuang 0:06f42dd3eab3 726 void OLED::OLED_DimScreenOFF()
khuang 0:06f42dd3eab3 727 {
khuang 0:06f42dd3eab3 728 OLED_SendCmd( OLED_CMD_CONTRASTMASTER, FIRST_BYTE );
khuang 0:06f42dd3eab3 729 OLED_SendCmd( 0xC0 | 0xF, OTHER_BYTE );
khuang 0:06f42dd3eab3 730 }
khuang 0:06f42dd3eab3 731
khuang 0:06f42dd3eab3 732
khuang 0:06f42dd3eab3 733
khuang 0:06f42dd3eab3 734 void OLED::OLED_Swap(
khuang 0:06f42dd3eab3 735 oled_pixel_t imgDst,
khuang 0:06f42dd3eab3 736 const uint8_t* imgSrc,
khuang 0:06f42dd3eab3 737 uint16_t imgSize
khuang 0:06f42dd3eab3 738 )
khuang 0:06f42dd3eab3 739 {
khuang 0:06f42dd3eab3 740 for ( int var = 0; var < imgSize; var++ )
khuang 0:06f42dd3eab3 741 {
khuang 0:06f42dd3eab3 742 *imgDst = *imgSrc << 8;
khuang 0:06f42dd3eab3 743 imgSrc++;
khuang 0:06f42dd3eab3 744 *imgDst |= *imgSrc;
khuang 0:06f42dd3eab3 745 imgDst++;
khuang 0:06f42dd3eab3 746 imgSrc++;
khuang 0:06f42dd3eab3 747 }
khuang 0:06f42dd3eab3 748 }
khuang 0:06f42dd3eab3 749
khuang 0:06f42dd3eab3 750
khuang 0:06f42dd3eab3 751 void OLED::OLED_PowerON()
khuang 0:06f42dd3eab3 752 {
khuang 0:06f42dd3eab3 753 oled_POWER = 1;
khuang 0:06f42dd3eab3 754 }
khuang 0:06f42dd3eab3 755
khuang 0:06f42dd3eab3 756 void OLED::OLED_PowerOFF()
khuang 0:06f42dd3eab3 757 {
khuang 0:06f42dd3eab3 758 oled_POWER = 0;
khuang 0:06f42dd3eab3 759 }
khuang 0:06f42dd3eab3 760
khuang 0:06f42dd3eab3 761
khuang 0:06f42dd3eab3 762
khuang 0:06f42dd3eab3 763 //Formerly Known as GuiDriver_UpdateScreen
khuang 0:06f42dd3eab3 764 void OLED::OLED_UpdateBuffer (
khuang 0:06f42dd3eab3 765 uint8_t xCrd,
khuang 0:06f42dd3eab3 766 uint8_t yCrd,
khuang 0:06f42dd3eab3 767 uint8_t width,
khuang 0:06f42dd3eab3 768 uint8_t height,
khuang 0:06f42dd3eab3 769 const uint8_t* image
khuang 0:06f42dd3eab3 770 )
khuang 0:06f42dd3eab3 771 {
khuang 0:06f42dd3eab3 772 // copy data
khuang 0:06f42dd3eab3 773 oled_pixel_t
khuang 0:06f42dd3eab3 774 copyAddr = (oled_pixel_t)screenBuf + ( yCrd*OLED_SCREEN_WIDTH + xCrd );
khuang 0:06f42dd3eab3 775
khuang 0:06f42dd3eab3 776 for ( uint8_t i = 0; i < height; i++ )
khuang 0:06f42dd3eab3 777 {
khuang 0:06f42dd3eab3 778 memcpy( (void*)copyAddr, (void*)image, width*OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 779 copyAddr += OLED_SCREEN_WIDTH;
khuang 0:06f42dd3eab3 780 image += width*OLED_BYTES_PER_PIXEL;
khuang 0:06f42dd3eab3 781 }
khuang 0:06f42dd3eab3 782 }
khuang 0:06f42dd3eab3 783
khuang 0:06f42dd3eab3 784 /* Internal Functions */
khuang 0:06f42dd3eab3 785
khuang 0:06f42dd3eab3 786 /**
khuang 0:06f42dd3eab3 787 * [transpose description]
khuang 0:06f42dd3eab3 788 * @param transImage Transposed Image
khuang 0:06f42dd3eab3 789 * @param image Source Image
khuang 0:06f42dd3eab3 790 * @param width Width to Transpose
khuang 0:06f42dd3eab3 791 * @param height Height to Transpose
khuang 0:06f42dd3eab3 792 */
khuang 0:06f42dd3eab3 793 void OLED::Transpose(
khuang 0:06f42dd3eab3 794 oled_pixel_t transImage,
khuang 0:06f42dd3eab3 795 const oled_pixel_t image,
khuang 0:06f42dd3eab3 796 uint8_t width,
khuang 0:06f42dd3eab3 797 uint8_t height
khuang 0:06f42dd3eab3 798 )
khuang 0:06f42dd3eab3 799 {
khuang 0:06f42dd3eab3 800 for ( uint8_t i = 0; i < height; i++ )
khuang 0:06f42dd3eab3 801 {
khuang 0:06f42dd3eab3 802 for ( uint8_t j = 0; j < width ; j++ )
khuang 0:06f42dd3eab3 803 {
khuang 0:06f42dd3eab3 804 transImage[ j*height + i ] = image[ i*width + j ];
khuang 0:06f42dd3eab3 805 }
khuang 0:06f42dd3eab3 806 }
khuang 0:06f42dd3eab3 807 }
khuang 0:06f42dd3eab3 808
khuang 0:06f42dd3eab3 809
khuang 0:06f42dd3eab3 810
khuang 0:06f42dd3eab3 811 /**
khuang 0:06f42dd3eab3 812 * TopDown Transition Effect for Image
khuang 0:06f42dd3eab3 813 * @param image image to be transitioned
khuang 0:06f42dd3eab3 814 * @param xCrd x coordinate of image
khuang 0:06f42dd3eab3 815 * @param yCrd y coordinate of image
khuang 0:06f42dd3eab3 816 * @param width width of image
khuang 0:06f42dd3eab3 817 * @param height height of image
khuang 0:06f42dd3eab3 818 * @return status flag
khuang 0:06f42dd3eab3 819 */
khuang 0:06f42dd3eab3 820 oled_status_t OLED::TopDown(
khuang 0:06f42dd3eab3 821 const uint8_t* image,
khuang 0:06f42dd3eab3 822 uint8_t xCrd,
khuang 0:06f42dd3eab3 823 uint8_t yCrd,
khuang 0:06f42dd3eab3 824 uint8_t width,
khuang 0:06f42dd3eab3 825 uint8_t height
khuang 0:06f42dd3eab3 826 )
khuang 0:06f42dd3eab3 827 {
khuang 0:06f42dd3eab3 828 uint16_t
khuang 0:06f42dd3eab3 829 transStep = OLED_TRANSITION_STEP;
khuang 0:06f42dd3eab3 830
khuang 0:06f42dd3eab3 831 uint16_t
khuang 0:06f42dd3eab3 832 partImgSize = width*transStep;
khuang 0:06f42dd3eab3 833
khuang 0:06f42dd3eab3 834 oled_status_t
khuang 0:06f42dd3eab3 835 status = OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 836
khuang 0:06f42dd3eab3 837 uint8_t*
khuang 0:06f42dd3eab3 838 partImgPtr = (uint8_t*)image + ( height - transStep ) * ( width * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 839
khuang 0:06f42dd3eab3 840 /**
khuang 0:06f42dd3eab3 841 * set locations
khuang 0:06f42dd3eab3 842 */
khuang 0:06f42dd3eab3 843
khuang 0:06f42dd3eab3 844 while (1)
khuang 0:06f42dd3eab3 845 {
khuang 0:06f42dd3eab3 846 SetBorders( xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 847
khuang 0:06f42dd3eab3 848 if ( partImgSize > width*height )
khuang 0:06f42dd3eab3 849 {
khuang 0:06f42dd3eab3 850 OLED_SendData( (const uint8_t*)image, width*height*OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 851 break;
khuang 0:06f42dd3eab3 852 }
khuang 0:06f42dd3eab3 853 else
khuang 0:06f42dd3eab3 854 {
khuang 0:06f42dd3eab3 855 OLED_SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 856 }
khuang 0:06f42dd3eab3 857
khuang 0:06f42dd3eab3 858
khuang 0:06f42dd3eab3 859 /**
khuang 0:06f42dd3eab3 860 * update variables
khuang 0:06f42dd3eab3 861 */
khuang 0:06f42dd3eab3 862
khuang 0:06f42dd3eab3 863 partImgPtr -= ( width * transStep ) * OLED_BYTES_PER_PIXEL;
khuang 0:06f42dd3eab3 864 partImgSize += ( width * transStep );
khuang 0:06f42dd3eab3 865 transStep++;
khuang 0:06f42dd3eab3 866 }
khuang 0:06f42dd3eab3 867
khuang 0:06f42dd3eab3 868 return status;
khuang 0:06f42dd3eab3 869 }
khuang 0:06f42dd3eab3 870
khuang 0:06f42dd3eab3 871 /**
khuang 0:06f42dd3eab3 872 * DownTop Transition Effect for Image
khuang 0:06f42dd3eab3 873 * @param image image to be transitioned
khuang 0:06f42dd3eab3 874 * @param xCrd x coordinate of image
khuang 0:06f42dd3eab3 875 * @param yCrd y coordinate of image
khuang 0:06f42dd3eab3 876 * @param width width of image
khuang 0:06f42dd3eab3 877 * @param height height of image
khuang 0:06f42dd3eab3 878 * @return status flag
khuang 0:06f42dd3eab3 879 */
khuang 0:06f42dd3eab3 880
khuang 0:06f42dd3eab3 881 oled_status_t OLED::DownTop(
khuang 0:06f42dd3eab3 882 const uint8_t* image,
khuang 0:06f42dd3eab3 883 uint8_t xCrd,
khuang 0:06f42dd3eab3 884 uint8_t yCrd,
khuang 0:06f42dd3eab3 885 uint8_t width,
khuang 0:06f42dd3eab3 886 uint8_t height
khuang 0:06f42dd3eab3 887 )
khuang 0:06f42dd3eab3 888 {
khuang 0:06f42dd3eab3 889 uint16_t
khuang 0:06f42dd3eab3 890 transStep = OLED_TRANSITION_STEP;
khuang 0:06f42dd3eab3 891
khuang 0:06f42dd3eab3 892 uint16_t
khuang 0:06f42dd3eab3 893 partImgSize = width*transStep;
khuang 0:06f42dd3eab3 894
khuang 0:06f42dd3eab3 895 oled_status_t
khuang 0:06f42dd3eab3 896 status = OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 897
khuang 0:06f42dd3eab3 898 uint8_t*
khuang 0:06f42dd3eab3 899 partImgPtr = (uint8_t*)image;
khuang 0:06f42dd3eab3 900
khuang 0:06f42dd3eab3 901 uint8_t
khuang 0:06f42dd3eab3 902 yCrd_moving = ( yCrd + height ) - 1;
khuang 0:06f42dd3eab3 903
khuang 0:06f42dd3eab3 904 /**
khuang 0:06f42dd3eab3 905 * set locations
khuang 0:06f42dd3eab3 906 */
khuang 0:06f42dd3eab3 907
khuang 0:06f42dd3eab3 908 while (1)
khuang 0:06f42dd3eab3 909 {
khuang 0:06f42dd3eab3 910 if (
khuang 0:06f42dd3eab3 911 ( partImgSize > OLED_SCREEN_SIZE )
khuang 0:06f42dd3eab3 912 || ( yCrd_moving < yCrd )
khuang 0:06f42dd3eab3 913 )
khuang 0:06f42dd3eab3 914 {
khuang 0:06f42dd3eab3 915 // draw full image
khuang 0:06f42dd3eab3 916 SetBorders( xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 917 OLED_SendData( (const uint8_t*)image, width * height * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 918 break;
khuang 0:06f42dd3eab3 919 }
khuang 0:06f42dd3eab3 920
khuang 0:06f42dd3eab3 921 else
khuang 0:06f42dd3eab3 922 {
khuang 0:06f42dd3eab3 923 SetBorders( xCrd, yCrd_moving, width, ( yCrd + height ) - yCrd_moving );
khuang 0:06f42dd3eab3 924 OLED_SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 925 }
khuang 0:06f42dd3eab3 926
khuang 0:06f42dd3eab3 927 /**
khuang 0:06f42dd3eab3 928 * update variables
khuang 0:06f42dd3eab3 929 */
khuang 0:06f42dd3eab3 930
khuang 0:06f42dd3eab3 931 yCrd_moving -= transStep;
khuang 0:06f42dd3eab3 932 partImgSize += ( width * transStep );
khuang 0:06f42dd3eab3 933 transStep++;
khuang 0:06f42dd3eab3 934 }
khuang 0:06f42dd3eab3 935
khuang 0:06f42dd3eab3 936 return status;
khuang 0:06f42dd3eab3 937 }
khuang 0:06f42dd3eab3 938
khuang 0:06f42dd3eab3 939
khuang 0:06f42dd3eab3 940 /**
khuang 0:06f42dd3eab3 941 * LeftRight Transition Effect for Image
khuang 0:06f42dd3eab3 942 * @param image image to be transitioned
khuang 0:06f42dd3eab3 943 * @param xCrd x coordinate of image
khuang 0:06f42dd3eab3 944 * @param yCrd y coordinate of image
khuang 0:06f42dd3eab3 945 * @param width width of image
khuang 0:06f42dd3eab3 946 * @param height height of image
khuang 0:06f42dd3eab3 947 * @return status flag
khuang 0:06f42dd3eab3 948 */
khuang 0:06f42dd3eab3 949
khuang 0:06f42dd3eab3 950 oled_status_t OLED::LeftRight(
khuang 0:06f42dd3eab3 951 const uint8_t* image,
khuang 0:06f42dd3eab3 952 uint8_t xCrd,
khuang 0:06f42dd3eab3 953 uint8_t yCrd,
khuang 0:06f42dd3eab3 954 uint8_t width,
khuang 0:06f42dd3eab3 955 uint8_t height
khuang 0:06f42dd3eab3 956 )
khuang 0:06f42dd3eab3 957 {
khuang 0:06f42dd3eab3 958 oled_status_t
khuang 0:06f42dd3eab3 959 status = OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 960
khuang 0:06f42dd3eab3 961 oled_dynamic_area_t
khuang 0:06f42dd3eab3 962 transImageArea =
khuang 0:06f42dd3eab3 963 {
khuang 0:06f42dd3eab3 964 .xCrd = 0,
khuang 0:06f42dd3eab3 965 .yCrd = 0,
khuang 0:06f42dd3eab3 966
khuang 0:06f42dd3eab3 967 .width = 96,
khuang 0:06f42dd3eab3 968 .height= 96
khuang 0:06f42dd3eab3 969 };
khuang 0:06f42dd3eab3 970
khuang 0:06f42dd3eab3 971 OLED_SetDynamicArea( &transImageArea );
khuang 0:06f42dd3eab3 972
khuang 0:06f42dd3eab3 973 // helper pointer
khuang 0:06f42dd3eab3 974 oled_pixel_t
khuang 0:06f42dd3eab3 975 transImage = (oled_pixel_t)oled_dynamic_area.areaBuffer;
khuang 0:06f42dd3eab3 976
khuang 0:06f42dd3eab3 977 if ( NULL == transImage )
khuang 0:06f42dd3eab3 978 {
khuang 0:06f42dd3eab3 979 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 980 }
khuang 0:06f42dd3eab3 981
khuang 0:06f42dd3eab3 982 Transpose( (oled_pixel_t)transImage, (const oled_pixel_t)image, width, height );
khuang 0:06f42dd3eab3 983
khuang 0:06f42dd3eab3 984 OLED_SendCmd( OLED_CMD_SET_REMAP, FIRST_BYTE );
khuang 0:06f42dd3eab3 985 OLED_SendCmd( OLED_REMAP_SETTINGS | REMAP_VERTICAL_INCREMENT, OTHER_BYTE );
khuang 0:06f42dd3eab3 986
khuang 0:06f42dd3eab3 987 uint16_t
khuang 0:06f42dd3eab3 988 transStep = OLED_TRANSITION_STEP;
khuang 0:06f42dd3eab3 989
khuang 0:06f42dd3eab3 990 uint16_t
khuang 0:06f42dd3eab3 991 partImgSize = height*transStep;
khuang 0:06f42dd3eab3 992
khuang 0:06f42dd3eab3 993 uint8_t*
khuang 0:06f42dd3eab3 994 partImgPtr = (uint8_t*)transImage + ( width - transStep ) * ( height * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 995
khuang 0:06f42dd3eab3 996 /**
khuang 0:06f42dd3eab3 997 * set locations
khuang 0:06f42dd3eab3 998 */
khuang 0:06f42dd3eab3 999
khuang 0:06f42dd3eab3 1000 while (1)
khuang 0:06f42dd3eab3 1001 {
khuang 0:06f42dd3eab3 1002 SetBorders( xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 1003
khuang 0:06f42dd3eab3 1004 if ( partImgSize > width*height )
khuang 0:06f42dd3eab3 1005 {
khuang 0:06f42dd3eab3 1006 OLED_SendData((const uint8_t*)transImage, width * height * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 1007 break;
khuang 0:06f42dd3eab3 1008 }
khuang 0:06f42dd3eab3 1009 else
khuang 0:06f42dd3eab3 1010 {
khuang 0:06f42dd3eab3 1011 OLED_SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 1012 }
khuang 0:06f42dd3eab3 1013
khuang 0:06f42dd3eab3 1014
khuang 0:06f42dd3eab3 1015 partImgPtr -= ( transStep * height ) * OLED_BYTES_PER_PIXEL;
khuang 0:06f42dd3eab3 1016 partImgSize += ( transStep * height );
khuang 0:06f42dd3eab3 1017 transStep++;
khuang 0:06f42dd3eab3 1018
khuang 0:06f42dd3eab3 1019 }
khuang 0:06f42dd3eab3 1020
khuang 0:06f42dd3eab3 1021 OLED_SendCmd( OLED_CMD_SET_REMAP, FIRST_BYTE );
khuang 0:06f42dd3eab3 1022 OLED_SendCmd( OLED_REMAP_SETTINGS, OTHER_BYTE );
khuang 0:06f42dd3eab3 1023
khuang 0:06f42dd3eab3 1024 OLED_DestroyDynamicArea();
khuang 0:06f42dd3eab3 1025 return status;
khuang 0:06f42dd3eab3 1026 }
khuang 0:06f42dd3eab3 1027
khuang 0:06f42dd3eab3 1028
khuang 0:06f42dd3eab3 1029 /**
khuang 0:06f42dd3eab3 1030 * RightLeft Transition Effect for Image
khuang 0:06f42dd3eab3 1031 * @param image image to be transitioned
khuang 0:06f42dd3eab3 1032 * @param xCrd x coordinate of image
khuang 0:06f42dd3eab3 1033 * @param yCrd y coordinate of image
khuang 0:06f42dd3eab3 1034 * @param width width of image
khuang 0:06f42dd3eab3 1035 * @param height height of image
khuang 0:06f42dd3eab3 1036 * @return status flag
khuang 0:06f42dd3eab3 1037 */
khuang 0:06f42dd3eab3 1038 oled_status_t OLED::RightLeft(
khuang 0:06f42dd3eab3 1039 const uint8_t* image,
khuang 0:06f42dd3eab3 1040 uint8_t xCrd,
khuang 0:06f42dd3eab3 1041 uint8_t yCrd,
khuang 0:06f42dd3eab3 1042 uint8_t width,
khuang 0:06f42dd3eab3 1043 uint8_t height
khuang 0:06f42dd3eab3 1044 )
khuang 0:06f42dd3eab3 1045 {
khuang 0:06f42dd3eab3 1046 oled_dynamic_area_t
khuang 0:06f42dd3eab3 1047 transImageArea =
khuang 0:06f42dd3eab3 1048 {
khuang 0:06f42dd3eab3 1049 .xCrd = 0,
khuang 0:06f42dd3eab3 1050 .yCrd = 0,
khuang 0:06f42dd3eab3 1051
khuang 0:06f42dd3eab3 1052 .width = 96,
khuang 0:06f42dd3eab3 1053 .height= 96
khuang 0:06f42dd3eab3 1054 };
khuang 0:06f42dd3eab3 1055
khuang 0:06f42dd3eab3 1056 OLED_SetDynamicArea( &transImageArea );
khuang 0:06f42dd3eab3 1057
khuang 0:06f42dd3eab3 1058 // helper pointer
khuang 0:06f42dd3eab3 1059 oled_pixel_t
khuang 0:06f42dd3eab3 1060 transImage = oled_dynamic_area.areaBuffer;
khuang 0:06f42dd3eab3 1061
khuang 0:06f42dd3eab3 1062 if ( NULL == transImage )
khuang 0:06f42dd3eab3 1063 {
khuang 0:06f42dd3eab3 1064 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 1065 }
khuang 0:06f42dd3eab3 1066
khuang 0:06f42dd3eab3 1067 Transpose( (oled_pixel_t)transImage, (const oled_pixel_t)image, width, height );
khuang 0:06f42dd3eab3 1068
khuang 0:06f42dd3eab3 1069 OLED_SendCmd( OLED_CMD_SET_REMAP, FIRST_BYTE );
khuang 0:06f42dd3eab3 1070 OLED_SendCmd( OLED_REMAP_SETTINGS | REMAP_VERTICAL_INCREMENT, OTHER_BYTE );
khuang 0:06f42dd3eab3 1071
khuang 0:06f42dd3eab3 1072
khuang 0:06f42dd3eab3 1073 uint16_t
khuang 0:06f42dd3eab3 1074 transStep = OLED_TRANSITION_STEP;
khuang 0:06f42dd3eab3 1075
khuang 0:06f42dd3eab3 1076 uint16_t
khuang 0:06f42dd3eab3 1077 partImgSize = height * transStep;
khuang 0:06f42dd3eab3 1078
khuang 0:06f42dd3eab3 1079 uint8_t*
khuang 0:06f42dd3eab3 1080 partImgPtr = (uint8_t*)transImage;
khuang 0:06f42dd3eab3 1081
khuang 0:06f42dd3eab3 1082 uint8_t
khuang 0:06f42dd3eab3 1083 xCrd_moving = ( xCrd + width ) - 1;
khuang 0:06f42dd3eab3 1084
khuang 0:06f42dd3eab3 1085 /** set locations */
khuang 0:06f42dd3eab3 1086
khuang 0:06f42dd3eab3 1087 while (1)
khuang 0:06f42dd3eab3 1088 {
khuang 0:06f42dd3eab3 1089 if (( partImgSize > width*height )|| ( xCrd_moving < xCrd ))
khuang 0:06f42dd3eab3 1090 {
khuang 0:06f42dd3eab3 1091 SetBorders( xCrd, yCrd, width, height );
khuang 0:06f42dd3eab3 1092 OLED_SendData( (const uint8_t*)transImage, height * width * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 1093 break;
khuang 0:06f42dd3eab3 1094 }
khuang 0:06f42dd3eab3 1095 else
khuang 0:06f42dd3eab3 1096 {
khuang 0:06f42dd3eab3 1097 SetBorders( xCrd_moving, yCrd, ( xCrd + width ) - xCrd_moving, height );
khuang 0:06f42dd3eab3 1098 OLED_SendData( (const uint8_t*)partImgPtr, partImgSize * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 1099 }
khuang 0:06f42dd3eab3 1100
khuang 0:06f42dd3eab3 1101 /** update variables*/
khuang 0:06f42dd3eab3 1102
khuang 0:06f42dd3eab3 1103 xCrd_moving -= transStep;
khuang 0:06f42dd3eab3 1104 partImgSize += ( height * transStep );
khuang 0:06f42dd3eab3 1105 transStep++;
khuang 0:06f42dd3eab3 1106 }
khuang 0:06f42dd3eab3 1107
khuang 0:06f42dd3eab3 1108 OLED_SendCmd( OLED_CMD_SET_REMAP, FIRST_BYTE );
khuang 0:06f42dd3eab3 1109 OLED_SendCmd( OLED_REMAP_SETTINGS, OTHER_BYTE );
khuang 0:06f42dd3eab3 1110
khuang 0:06f42dd3eab3 1111 OLED_DestroyDynamicArea();
khuang 0:06f42dd3eab3 1112
khuang 0:06f42dd3eab3 1113 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 1114 }
khuang 0:06f42dd3eab3 1115
khuang 0:06f42dd3eab3 1116
khuang 0:06f42dd3eab3 1117 /**
khuang 0:06f42dd3eab3 1118 * [setDirection description]
khuang 0:06f42dd3eab3 1119 * @param self [description]
khuang 0:06f42dd3eab3 1120 * @param xCrd [description]
khuang 0:06f42dd3eab3 1121 * @param yCrd [description]
khuang 0:06f42dd3eab3 1122 * @return [description]
khuang 0:06f42dd3eab3 1123 */
khuang 0:06f42dd3eab3 1124 void OLED::SetBorders(
khuang 0:06f42dd3eab3 1125 uint8_t xCrd,
khuang 0:06f42dd3eab3 1126 uint8_t yCrd,
khuang 0:06f42dd3eab3 1127 uint8_t width,
khuang 0:06f42dd3eab3 1128 uint8_t height
khuang 0:06f42dd3eab3 1129 )
khuang 0:06f42dd3eab3 1130 {
khuang 0:06f42dd3eab3 1131
khuang 0:06f42dd3eab3 1132 // adjust for the offset
khuang 0:06f42dd3eab3 1133 OLED_AdjustColumnOffset(xCrd);
khuang 0:06f42dd3eab3 1134 OLED_AdjustRowOffset(yCrd);
khuang 0:06f42dd3eab3 1135
khuang 0:06f42dd3eab3 1136 OLED_SendCmd( OLED_CMD_SET_COLUMN, FIRST_BYTE );
khuang 0:06f42dd3eab3 1137 OLED_SendCmd( xCrd, OTHER_BYTE );
khuang 0:06f42dd3eab3 1138 OLED_SendCmd( xCrd + (width-1), OTHER_BYTE );
khuang 0:06f42dd3eab3 1139 OLED_SendCmd( OLED_CMD_SET_ROW, FIRST_BYTE );
khuang 0:06f42dd3eab3 1140 OLED_SendCmd( yCrd, OTHER_BYTE );
khuang 0:06f42dd3eab3 1141 OLED_SendCmd( yCrd + (height-1), OTHER_BYTE );
khuang 0:06f42dd3eab3 1142
khuang 0:06f42dd3eab3 1143 }
khuang 0:06f42dd3eab3 1144
khuang 0:06f42dd3eab3 1145 /**
khuang 0:06f42dd3eab3 1146 * create the buffer for a partial image
khuang 0:06f42dd3eab3 1147 * @param imgBuf [description]
khuang 0:06f42dd3eab3 1148 * @param width [description]
khuang 0:06f42dd3eab3 1149 * @param height [description]
khuang 0:06f42dd3eab3 1150 * @return [description]
khuang 0:06f42dd3eab3 1151 */
khuang 0:06f42dd3eab3 1152 oled_status_t OLED::CreateTextBackground()
khuang 0:06f42dd3eab3 1153 {
khuang 0:06f42dd3eab3 1154 uint8_t
khuang 0:06f42dd3eab3 1155 xCrd = oled_dynamic_area.xCrd,
khuang 0:06f42dd3eab3 1156 yCrd = oled_dynamic_area.yCrd,
khuang 0:06f42dd3eab3 1157 width = oled_dynamic_area.width,
khuang 0:06f42dd3eab3 1158 height = oled_dynamic_area.height;
khuang 0:06f42dd3eab3 1159
khuang 0:06f42dd3eab3 1160 oled_pixel_t
khuang 0:06f42dd3eab3 1161 imgBuf = oled_dynamic_area.areaBuffer,
khuang 0:06f42dd3eab3 1162 copyAddr;
khuang 0:06f42dd3eab3 1163
khuang 0:06f42dd3eab3 1164 const uint8_t*
khuang 0:06f42dd3eab3 1165 background = oled_text_properties.background;
khuang 0:06f42dd3eab3 1166
khuang 0:06f42dd3eab3 1167 /** copy data */
khuang 0:06f42dd3eab3 1168
khuang 0:06f42dd3eab3 1169 if (
khuang 0:06f42dd3eab3 1170 ( NULL == imgBuf )
khuang 0:06f42dd3eab3 1171 || ( ( xCrd + width ) > OLED_SCREEN_WIDTH )
khuang 0:06f42dd3eab3 1172 || ( ( yCrd + height ) > OLED_SCREEN_HEIGHT )
khuang 0:06f42dd3eab3 1173 )
khuang 0:06f42dd3eab3 1174 {
khuang 0:06f42dd3eab3 1175 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 1176 }
khuang 0:06f42dd3eab3 1177
khuang 0:06f42dd3eab3 1178 if ( NULL == background )
khuang 0:06f42dd3eab3 1179 {
khuang 0:06f42dd3eab3 1180 for ( uint8_t i = 0; i < height; i++ )
khuang 0:06f42dd3eab3 1181 {
khuang 0:06f42dd3eab3 1182 memset( (void*)imgBuf, 0, width*OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 1183 imgBuf += width;
khuang 0:06f42dd3eab3 1184 }
khuang 0:06f42dd3eab3 1185 }
khuang 0:06f42dd3eab3 1186
khuang 0:06f42dd3eab3 1187 else
khuang 0:06f42dd3eab3 1188 {
khuang 0:06f42dd3eab3 1189 copyAddr = (oled_pixel_t)( BMP_SkipHeader( background ) ) + ( yCrd*OLED_SCREEN_WIDTH + xCrd );
khuang 0:06f42dd3eab3 1190 for ( uint8_t i = 0; i < height; i++ )
khuang 0:06f42dd3eab3 1191 {
khuang 0:06f42dd3eab3 1192 OLED_Swap( (oled_pixel_t)imgBuf, (const uint8_t*)copyAddr, width );
khuang 0:06f42dd3eab3 1193 imgBuf += width;
khuang 0:06f42dd3eab3 1194 copyAddr += OLED_SCREEN_WIDTH;
khuang 0:06f42dd3eab3 1195 }
khuang 0:06f42dd3eab3 1196 }
khuang 0:06f42dd3eab3 1197
khuang 0:06f42dd3eab3 1198 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 1199 }
khuang 0:06f42dd3eab3 1200
khuang 0:06f42dd3eab3 1201
khuang 0:06f42dd3eab3 1202 /**
khuang 0:06f42dd3eab3 1203 * Write the character to Buffer
khuang 0:06f42dd3eab3 1204 * @param charToWrite character to be written
khuang 0:06f42dd3eab3 1205 * @param chrBuf given pointer for buffer for the character
khuang 0:06f42dd3eab3 1206 */
khuang 0:06f42dd3eab3 1207 void OLED::WriteCharToBuf(
khuang 0:06f42dd3eab3 1208 uint16_t charToWrite,
khuang 0:06f42dd3eab3 1209 oled_pixel_t* chrBuf
khuang 0:06f42dd3eab3 1210 )
khuang 0:06f42dd3eab3 1211 {
khuang 0:06f42dd3eab3 1212 uint8_t
khuang 0:06f42dd3eab3 1213 foo = 0,
khuang 0:06f42dd3eab3 1214 mask;
khuang 0:06f42dd3eab3 1215
khuang 0:06f42dd3eab3 1216 const uint8_t*
khuang 0:06f42dd3eab3 1217 pChTable = selectedFont + 8 + (uint16_t)( ( charToWrite - selectedFont_firstChar ) << 2 );
khuang 0:06f42dd3eab3 1218
khuang 0:06f42dd3eab3 1219 currentChar_width = *pChTable,
khuang 0:06f42dd3eab3 1220 currentChar_height = selectedFont_height;
khuang 0:06f42dd3eab3 1221
khuang 0:06f42dd3eab3 1222 uint32_t
khuang 0:06f42dd3eab3 1223 offset = (uint32_t)pChTable[1]
khuang 0:06f42dd3eab3 1224 | ( (uint32_t)pChTable[2] << 8 )
khuang 0:06f42dd3eab3 1225 | ( (uint32_t)pChTable[3] << 16 );
khuang 0:06f42dd3eab3 1226
khuang 0:06f42dd3eab3 1227 const uint8_t*
khuang 0:06f42dd3eab3 1228 pChBitMap = selectedFont + offset;
khuang 0:06f42dd3eab3 1229
khuang 0:06f42dd3eab3 1230 if ( 0 == isFontInitialized )
khuang 0:06f42dd3eab3 1231 {
khuang 0:06f42dd3eab3 1232 // default font
khuang 0:06f42dd3eab3 1233 OLED_SetFont( oledFont_Tahoma_8_Regular, COLOR_WHITE );
khuang 0:06f42dd3eab3 1234 }
khuang 0:06f42dd3eab3 1235
khuang 0:06f42dd3eab3 1236 // allocate space for char image
khuang 0:06f42dd3eab3 1237 *chrBuf = (oled_pixel_t)AllocateDynamicArea( currentChar_height * currentChar_width );
khuang 0:06f42dd3eab3 1238
khuang 0:06f42dd3eab3 1239 if ( NULL == *chrBuf )
khuang 0:06f42dd3eab3 1240 {
khuang 0:06f42dd3eab3 1241 return;
khuang 0:06f42dd3eab3 1242 }
khuang 0:06f42dd3eab3 1243
khuang 0:06f42dd3eab3 1244 for ( uint8_t yCnt = 0; yCnt < currentChar_height; yCnt++ )
khuang 0:06f42dd3eab3 1245 {
khuang 0:06f42dd3eab3 1246 mask = 0;
khuang 0:06f42dd3eab3 1247
khuang 0:06f42dd3eab3 1248 for ( uint8_t xCnt = 0; xCnt < currentChar_width; xCnt++ )
khuang 0:06f42dd3eab3 1249 {
khuang 0:06f42dd3eab3 1250 if ( 0 == mask )
khuang 0:06f42dd3eab3 1251 {
khuang 0:06f42dd3eab3 1252 mask = 1;
khuang 0:06f42dd3eab3 1253 foo = *pChBitMap++;
khuang 0:06f42dd3eab3 1254 }
khuang 0:06f42dd3eab3 1255
khuang 0:06f42dd3eab3 1256 if ( 0 != ( foo & mask ) )
khuang 0:06f42dd3eab3 1257 {
khuang 0:06f42dd3eab3 1258 *( *chrBuf + yCnt*currentChar_width + xCnt ) = selectedFont_color;
khuang 0:06f42dd3eab3 1259 }
khuang 0:06f42dd3eab3 1260
khuang 0:06f42dd3eab3 1261 else
khuang 0:06f42dd3eab3 1262 {
khuang 0:06f42dd3eab3 1263 *( *chrBuf + yCnt*currentChar_width + xCnt ) = 0;
khuang 0:06f42dd3eab3 1264 }
khuang 0:06f42dd3eab3 1265
khuang 0:06f42dd3eab3 1266 mask <<= 1;
khuang 0:06f42dd3eab3 1267 }
khuang 0:06f42dd3eab3 1268 }
khuang 0:06f42dd3eab3 1269 }
khuang 0:06f42dd3eab3 1270
khuang 0:06f42dd3eab3 1271
khuang 0:06f42dd3eab3 1272
khuang 0:06f42dd3eab3 1273 /**
khuang 0:06f42dd3eab3 1274 * Add subimage/character to the active image buffer
khuang 0:06f42dd3eab3 1275 * @param xOffset offset for the x-coordinate
khuang 0:06f42dd3eab3 1276 * @param yOffset offset for the y-coordinate
khuang 0:06f42dd3eab3 1277 * @param width desired width
khuang 0:06f42dd3eab3 1278 * @param height desired height
khuang 0:06f42dd3eab3 1279 * @return status flag
khuang 0:06f42dd3eab3 1280 */
khuang 0:06f42dd3eab3 1281 oled_status_t OLED::AddCharToTextArea(
khuang 0:06f42dd3eab3 1282 oled_pixel_t chrPtr,
khuang 0:06f42dd3eab3 1283 uint8_t chrWidth,
khuang 0:06f42dd3eab3 1284 uint8_t chrHeight,
khuang 0:06f42dd3eab3 1285 oled_pixel_t copyAddr,
khuang 0:06f42dd3eab3 1286 uint8_t imgWidth
khuang 0:06f42dd3eab3 1287 )
khuang 0:06f42dd3eab3 1288 {
khuang 0:06f42dd3eab3 1289 if ( NULL == copyAddr )
khuang 0:06f42dd3eab3 1290 {
khuang 0:06f42dd3eab3 1291 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 1292 }
khuang 0:06f42dd3eab3 1293
khuang 0:06f42dd3eab3 1294 for ( uint8_t i = 0; i < chrHeight; i++ )
khuang 0:06f42dd3eab3 1295 {
khuang 0:06f42dd3eab3 1296 for ( uint8_t j = 0; j < chrWidth; j++ )
khuang 0:06f42dd3eab3 1297 {
khuang 0:06f42dd3eab3 1298 if ( 0 != chrPtr[j] )
khuang 0:06f42dd3eab3 1299 {
khuang 0:06f42dd3eab3 1300 copyAddr[j] = chrPtr[j];
khuang 0:06f42dd3eab3 1301 }
khuang 0:06f42dd3eab3 1302 }
khuang 0:06f42dd3eab3 1303 copyAddr += imgWidth;
khuang 0:06f42dd3eab3 1304 chrPtr += chrWidth;
khuang 0:06f42dd3eab3 1305 }
khuang 0:06f42dd3eab3 1306 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 1307 }
khuang 0:06f42dd3eab3 1308
khuang 0:06f42dd3eab3 1309
khuang 0:06f42dd3eab3 1310 /**
khuang 0:06f42dd3eab3 1311 * Allocate memory for the desired image/character
khuang 0:06f42dd3eab3 1312 * @param area desired area dimensions
khuang 0:06f42dd3eab3 1313 */
khuang 0:06f42dd3eab3 1314 void* OLED::AllocateDynamicArea( uint32_t area )
khuang 0:06f42dd3eab3 1315 {
khuang 0:06f42dd3eab3 1316 void*
khuang 0:06f42dd3eab3 1317 ptr = malloc( area * OLED_BYTES_PER_PIXEL );
khuang 0:06f42dd3eab3 1318
khuang 0:06f42dd3eab3 1319 if ( NULL == ptr )
khuang 0:06f42dd3eab3 1320 {
khuang 0:06f42dd3eab3 1321 return NULL;
khuang 0:06f42dd3eab3 1322 }
khuang 0:06f42dd3eab3 1323
khuang 0:06f42dd3eab3 1324 return ptr;
khuang 0:06f42dd3eab3 1325 }
khuang 0:06f42dd3eab3 1326
khuang 0:06f42dd3eab3 1327
khuang 0:06f42dd3eab3 1328 /**
khuang 0:06f42dd3eab3 1329 * Deallocate current area
khuang 0:06f42dd3eab3 1330 * @param area pointer to current area
khuang 0:06f42dd3eab3 1331 */
khuang 0:06f42dd3eab3 1332 oled_status_t OLED::DestroyDynamicArea( void* ptr )
khuang 0:06f42dd3eab3 1333 {
khuang 0:06f42dd3eab3 1334 if ( NULL == ptr )
khuang 0:06f42dd3eab3 1335 {
khuang 0:06f42dd3eab3 1336 return OLED_STATUS_INIT_ERROR;
khuang 0:06f42dd3eab3 1337 }
khuang 0:06f42dd3eab3 1338
khuang 0:06f42dd3eab3 1339 free(ptr);
khuang 0:06f42dd3eab3 1340
khuang 0:06f42dd3eab3 1341 return OLED_STATUS_SUCCESS;
khuang 0:06f42dd3eab3 1342 }
khuang 0:06f42dd3eab3 1343
khuang 0:06f42dd3eab3 1344
khuang 0:06f42dd3eab3 1345
khuang 0:06f42dd3eab3 1346
khuang 0:06f42dd3eab3 1347
khuang 0:06f42dd3eab3 1348