Reham Faqehi / Mbed 2 deprecated fy15raf

Dependencies:   mbed

Fork of fy15raf by ELEC2645 (2017/18)

Committer:
RehamFaqehi
Date:
Tue May 08 11:10:34 2018 +0000
Revision:
18:53017c90bd26
Parent:
0:f3d96a1a3177
Final Submission. I have read and agreed with Statement of Academic Integrity.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RehamFaqehi 0:f3d96a1a3177 1 #ifndef N5110_H
RehamFaqehi 0:f3d96a1a3177 2 #define N5110_H
RehamFaqehi 0:f3d96a1a3177 3
RehamFaqehi 0:f3d96a1a3177 4 #include "mbed.h"
RehamFaqehi 0:f3d96a1a3177 5
RehamFaqehi 0:f3d96a1a3177 6 // number of pixels on display
RehamFaqehi 0:f3d96a1a3177 7 #define WIDTH 84
RehamFaqehi 0:f3d96a1a3177 8 #define HEIGHT 48
RehamFaqehi 0:f3d96a1a3177 9 #define BANKS 6
RehamFaqehi 0:f3d96a1a3177 10
RehamFaqehi 0:f3d96a1a3177 11 /// Fill types for 2D shapes
RehamFaqehi 0:f3d96a1a3177 12 enum FillType {
RehamFaqehi 0:f3d96a1a3177 13 FILL_TRANSPARENT, ///< Transparent with outline
RehamFaqehi 0:f3d96a1a3177 14 FILL_BLACK, ///< Filled black
RehamFaqehi 0:f3d96a1a3177 15 FILL_WHITE, ///< Filled white (no outline)
RehamFaqehi 0:f3d96a1a3177 16 };
RehamFaqehi 0:f3d96a1a3177 17
RehamFaqehi 0:f3d96a1a3177 18 /** N5110 Class
RehamFaqehi 0:f3d96a1a3177 19 @brief Library for interfacing with Nokia 5110 LCD display (https://www.sparkfun.com/products/10168) using the hardware SPI on the mbed.
RehamFaqehi 0:f3d96a1a3177 20 @brief The display is powered from a GPIO pin meaning it can be controlled via software. The LED backlight is also software-controllable (via PWM pin).
RehamFaqehi 0:f3d96a1a3177 21 @brief Can print characters and strings to the display using the included 5x7 font.
RehamFaqehi 0:f3d96a1a3177 22 @brief The library also implements a screen buffer so that individual pixels on the display (84 x 48) can be set, cleared and read.
RehamFaqehi 0:f3d96a1a3177 23 @brief The library can print primitive shapes (lines, circles, rectangles)
RehamFaqehi 0:f3d96a1a3177 24 @brief Acknowledgements to Chris Yan's Nokia_5110 Library.
RehamFaqehi 0:f3d96a1a3177 25
RehamFaqehi 0:f3d96a1a3177 26 @brief Revision 1.3
RehamFaqehi 0:f3d96a1a3177 27
RehamFaqehi 0:f3d96a1a3177 28 @author Craig A. Evans
RehamFaqehi 0:f3d96a1a3177 29 @date 7th February 2017
RehamFaqehi 0:f3d96a1a3177 30
RehamFaqehi 0:f3d96a1a3177 31 @code
RehamFaqehi 0:f3d96a1a3177 32
RehamFaqehi 0:f3d96a1a3177 33 #include "mbed.h"
RehamFaqehi 0:f3d96a1a3177 34 #include "N5110.h"
RehamFaqehi 0:f3d96a1a3177 35
RehamFaqehi 0:f3d96a1a3177 36 // rows,cols
RehamFaqehi 0:f3d96a1a3177 37 int sprite[8][5] = {
RehamFaqehi 0:f3d96a1a3177 38 { 0,0,1,0,0 },
RehamFaqehi 0:f3d96a1a3177 39 { 0,1,1,1,0 },
RehamFaqehi 0:f3d96a1a3177 40 { 0,0,1,0,0 },
RehamFaqehi 0:f3d96a1a3177 41 { 0,1,1,1,0 },
RehamFaqehi 0:f3d96a1a3177 42 { 1,1,1,1,1 },
RehamFaqehi 0:f3d96a1a3177 43 { 1,1,1,1,1 },
RehamFaqehi 0:f3d96a1a3177 44 { 1,1,0,1,1 },
RehamFaqehi 0:f3d96a1a3177 45 { 1,1,0,1,1 },
RehamFaqehi 0:f3d96a1a3177 46 };
RehamFaqehi 0:f3d96a1a3177 47
RehamFaqehi 0:f3d96a1a3177 48 // VCC,SCE,RST,D/C,MOSI,SCLK,LED
RehamFaqehi 0:f3d96a1a3177 49 //N5110 lcd(p7,p8,p9,p10,p11,p13,p21); // LPC1768 - pwr from GPIO
RehamFaqehi 0:f3d96a1a3177 50 N5110 lcd(p8,p9,p10,p11,p13,p21); // LPC1768 - powered from +3V3 - JP1 in 2/3 position
RehamFaqehi 0:f3d96a1a3177 51 //N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // K64F - pwr from 3V3
RehamFaqehi 0:f3d96a1a3177 52
RehamFaqehi 0:f3d96a1a3177 53 int main()
RehamFaqehi 0:f3d96a1a3177 54 {
RehamFaqehi 0:f3d96a1a3177 55 // first need to initialise display
RehamFaqehi 0:f3d96a1a3177 56 lcd.init();
RehamFaqehi 0:f3d96a1a3177 57
RehamFaqehi 0:f3d96a1a3177 58 // change set contrast in range 0.0 to 1.0
RehamFaqehi 0:f3d96a1a3177 59 // 0.4 appears to be a good starting point
RehamFaqehi 0:f3d96a1a3177 60 lcd.setContrast(0.4);
RehamFaqehi 0:f3d96a1a3177 61
RehamFaqehi 0:f3d96a1a3177 62 while(1) {
RehamFaqehi 0:f3d96a1a3177 63
RehamFaqehi 0:f3d96a1a3177 64 // these are default settings so not strictly needed
RehamFaqehi 0:f3d96a1a3177 65 lcd.normalMode(); // normal colour mode
RehamFaqehi 0:f3d96a1a3177 66 lcd.setBrightness(0.5); // put LED backlight on 50%
RehamFaqehi 0:f3d96a1a3177 67
RehamFaqehi 0:f3d96a1a3177 68 lcd.clear();
RehamFaqehi 0:f3d96a1a3177 69 // x origin, y origin, rows, cols, sprite
RehamFaqehi 0:f3d96a1a3177 70 lcd.drawSprite(20,6,8,5,(int *)sprite);
RehamFaqehi 0:f3d96a1a3177 71 lcd.refresh();
RehamFaqehi 0:f3d96a1a3177 72 wait(5.0);
RehamFaqehi 0:f3d96a1a3177 73
RehamFaqehi 0:f3d96a1a3177 74 lcd.clear(); // clear buffer at start of every loop
RehamFaqehi 0:f3d96a1a3177 75 // can directly print strings at specified co-ordinates (must be less than 84 pixels to fit on display)
RehamFaqehi 0:f3d96a1a3177 76 lcd.printString("Hello, World!",0,0);
RehamFaqehi 0:f3d96a1a3177 77
RehamFaqehi 0:f3d96a1a3177 78 char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
RehamFaqehi 0:f3d96a1a3177 79 // so can display a string of a maximum 14 characters in length
RehamFaqehi 0:f3d96a1a3177 80 // or create formatted strings - ensure they aren't more than 14 characters long
RehamFaqehi 0:f3d96a1a3177 81 int temperature = 27;
RehamFaqehi 0:f3d96a1a3177 82 int length = sprintf(buffer,"T = %2d C",temperature); // print formatted data to buffer
RehamFaqehi 0:f3d96a1a3177 83 // it is important the format specifier ensures the length will fit in the buffer
RehamFaqehi 0:f3d96a1a3177 84 if (length <= 14) // if string will fit on display (assuming printing at x=0)
RehamFaqehi 0:f3d96a1a3177 85 lcd.printString(buffer,0,1); // display on screen
RehamFaqehi 0:f3d96a1a3177 86
RehamFaqehi 0:f3d96a1a3177 87 float pressure = 1012.3; // same idea with floats
RehamFaqehi 0:f3d96a1a3177 88 length = sprintf(buffer,"P = %.2f mb",pressure);
RehamFaqehi 0:f3d96a1a3177 89 if (length <= 14)
RehamFaqehi 0:f3d96a1a3177 90 lcd.printString(buffer,0,2);
RehamFaqehi 0:f3d96a1a3177 91
RehamFaqehi 0:f3d96a1a3177 92 // can also print individual characters at specified place
RehamFaqehi 0:f3d96a1a3177 93 lcd.printChar('X',5,3);
RehamFaqehi 0:f3d96a1a3177 94
RehamFaqehi 0:f3d96a1a3177 95 // draw a line across the display at y = 40 pixels (origin top-left)
RehamFaqehi 0:f3d96a1a3177 96 for (int i = 0; i < WIDTH; i++) {
RehamFaqehi 0:f3d96a1a3177 97 lcd.setPixel(i,40,true);
RehamFaqehi 0:f3d96a1a3177 98 }
RehamFaqehi 0:f3d96a1a3177 99 // need to refresh display after setting pixels or writing strings
RehamFaqehi 0:f3d96a1a3177 100 lcd.refresh();
RehamFaqehi 0:f3d96a1a3177 101 wait(5.0);
RehamFaqehi 0:f3d96a1a3177 102
RehamFaqehi 0:f3d96a1a3177 103 // can check status of pixel using getPixel(x,y);
RehamFaqehi 0:f3d96a1a3177 104 lcd.clear(); // clear buffer
RehamFaqehi 0:f3d96a1a3177 105 lcd.setPixel(2,2,true); // set random pixel in buffer
RehamFaqehi 0:f3d96a1a3177 106 lcd.refresh();
RehamFaqehi 0:f3d96a1a3177 107 wait(1.0);
RehamFaqehi 0:f3d96a1a3177 108
RehamFaqehi 0:f3d96a1a3177 109 int pixel_to_test = lcd.getPixel(2,2);
RehamFaqehi 0:f3d96a1a3177 110
RehamFaqehi 0:f3d96a1a3177 111 if ( pixel_to_test ) {
RehamFaqehi 0:f3d96a1a3177 112 lcd.printString("2,2 is set",0,4);
RehamFaqehi 0:f3d96a1a3177 113 }
RehamFaqehi 0:f3d96a1a3177 114
RehamFaqehi 0:f3d96a1a3177 115 // this one shouldn't be set
RehamFaqehi 0:f3d96a1a3177 116 lcd.setPixel(3,3,false); // clear random pixel in buffer
RehamFaqehi 0:f3d96a1a3177 117 lcd.refresh();
RehamFaqehi 0:f3d96a1a3177 118 pixel_to_test = lcd.getPixel(3,3);
RehamFaqehi 0:f3d96a1a3177 119
RehamFaqehi 0:f3d96a1a3177 120 if ( pixel_to_test == 0 ) {
RehamFaqehi 0:f3d96a1a3177 121 lcd.printString("3,3 is clear",0,5);
RehamFaqehi 0:f3d96a1a3177 122 }
RehamFaqehi 0:f3d96a1a3177 123
RehamFaqehi 0:f3d96a1a3177 124 lcd.refresh();
RehamFaqehi 0:f3d96a1a3177 125 wait(4.0);
RehamFaqehi 0:f3d96a1a3177 126
RehamFaqehi 0:f3d96a1a3177 127 lcd.clear(); // clear buffer
RehamFaqehi 0:f3d96a1a3177 128 lcd.inverseMode(); // invert colours
RehamFaqehi 0:f3d96a1a3177 129 lcd.setBrightness(1.0); // put LED backlight on full
RehamFaqehi 0:f3d96a1a3177 130
RehamFaqehi 0:f3d96a1a3177 131 float array[84];
RehamFaqehi 0:f3d96a1a3177 132
RehamFaqehi 0:f3d96a1a3177 133 for (int i = 0; i < 84; i++) {
RehamFaqehi 0:f3d96a1a3177 134 array[i] = 0.5 + 0.5*sin(i*2*3.14/84);
RehamFaqehi 0:f3d96a1a3177 135 }
RehamFaqehi 0:f3d96a1a3177 136
RehamFaqehi 0:f3d96a1a3177 137 // can also plot graphs - 84 elements only
RehamFaqehi 0:f3d96a1a3177 138 // values must be in range 0.0 - 1.0
RehamFaqehi 0:f3d96a1a3177 139 lcd.plotArray(array);
RehamFaqehi 0:f3d96a1a3177 140 lcd.refresh();
RehamFaqehi 0:f3d96a1a3177 141 wait(5.0);
RehamFaqehi 0:f3d96a1a3177 142
RehamFaqehi 0:f3d96a1a3177 143 lcd.clear();
RehamFaqehi 0:f3d96a1a3177 144 lcd.normalMode(); // normal colour mode back
RehamFaqehi 0:f3d96a1a3177 145 lcd.setBrightness(0.5); // put LED backlight on 50%
RehamFaqehi 0:f3d96a1a3177 146
RehamFaqehi 0:f3d96a1a3177 147 // example of drawing lines
RehamFaqehi 0:f3d96a1a3177 148 for (int x = 0; x < WIDTH ; x+=10) {
RehamFaqehi 0:f3d96a1a3177 149 // x0,y0,x1,y1,type 0-white,1-black,2-dotted
RehamFaqehi 0:f3d96a1a3177 150 lcd.drawLine(0,0,x,HEIGHT,2);
RehamFaqehi 0:f3d96a1a3177 151 }
RehamFaqehi 0:f3d96a1a3177 152 lcd.refresh(); // refresh after drawing shapes
RehamFaqehi 0:f3d96a1a3177 153 wait(5.0);
RehamFaqehi 0:f3d96a1a3177 154
RehamFaqehi 0:f3d96a1a3177 155
RehamFaqehi 0:f3d96a1a3177 156 lcd.clear();
RehamFaqehi 0:f3d96a1a3177 157 // example of how to draw circles
RehamFaqehi 0:f3d96a1a3177 158 lcd.drawCircle(WIDTH/2,HEIGHT/2,20,FILL_BLACK); // x,y,radius,black fill
RehamFaqehi 0:f3d96a1a3177 159 lcd.drawCircle(WIDTH/2,HEIGHT/2,10,FILL_WHITE); // x,y,radius,white fill
RehamFaqehi 0:f3d96a1a3177 160 lcd.drawCircle(WIDTH/2,HEIGHT/2,30,FILL_TRANSPARENT); // x,y,radius,transparent with outline
RehamFaqehi 0:f3d96a1a3177 161 lcd.refresh(); // refresh after drawing shapes
RehamFaqehi 0:f3d96a1a3177 162 wait(5.0);
RehamFaqehi 0:f3d96a1a3177 163
RehamFaqehi 0:f3d96a1a3177 164 lcd.clear();
RehamFaqehi 0:f3d96a1a3177 165 // example of how to draw rectangles
RehamFaqehi 0:f3d96a1a3177 166 // origin x,y,width,height,type
RehamFaqehi 0:f3d96a1a3177 167 lcd.drawRect(10,10,50,30,FILL_BLACK); // filled black rectangle
RehamFaqehi 0:f3d96a1a3177 168 lcd.drawRect(15,15,20,10,FILL_WHITE); // filled white rectange (no outline)
RehamFaqehi 0:f3d96a1a3177 169 lcd.drawRect(2,2,70,40,FILL_TRANSPARENT); // transparent, just outline
RehamFaqehi 0:f3d96a1a3177 170 lcd.refresh(); // refresh after drawing shapes
RehamFaqehi 0:f3d96a1a3177 171 wait(5.0);
RehamFaqehi 0:f3d96a1a3177 172
RehamFaqehi 0:f3d96a1a3177 173 }
RehamFaqehi 0:f3d96a1a3177 174 }
RehamFaqehi 0:f3d96a1a3177 175
RehamFaqehi 0:f3d96a1a3177 176
RehamFaqehi 0:f3d96a1a3177 177 @endcode
RehamFaqehi 0:f3d96a1a3177 178 */
RehamFaqehi 0:f3d96a1a3177 179 class N5110
RehamFaqehi 0:f3d96a1a3177 180 {
RehamFaqehi 0:f3d96a1a3177 181 private:
RehamFaqehi 0:f3d96a1a3177 182 // objects
RehamFaqehi 0:f3d96a1a3177 183 SPI *_spi;
RehamFaqehi 0:f3d96a1a3177 184 PwmOut *_led;
RehamFaqehi 0:f3d96a1a3177 185 DigitalOut *_pwr;
RehamFaqehi 0:f3d96a1a3177 186 DigitalOut *_sce;
RehamFaqehi 0:f3d96a1a3177 187 DigitalOut *_rst;
RehamFaqehi 0:f3d96a1a3177 188 DigitalOut *_dc;
RehamFaqehi 0:f3d96a1a3177 189
RehamFaqehi 0:f3d96a1a3177 190 // variables
RehamFaqehi 0:f3d96a1a3177 191 unsigned char buffer[84][6]; // screen buffer - the 6 is for the banks - each one is 8 bits;
RehamFaqehi 0:f3d96a1a3177 192
RehamFaqehi 0:f3d96a1a3177 193 public:
RehamFaqehi 0:f3d96a1a3177 194 /** Create a N5110 object connected to the specified pins
RehamFaqehi 0:f3d96a1a3177 195 *
RehamFaqehi 0:f3d96a1a3177 196 * @param pwr Pin connected to Vcc on the LCD display (pin 1)
RehamFaqehi 0:f3d96a1a3177 197 * @param sce Pin connected to chip enable (pin 3)
RehamFaqehi 0:f3d96a1a3177 198 * @param rst Pin connected to reset (pin 4)
RehamFaqehi 0:f3d96a1a3177 199 * @param dc Pin connected to data/command select (pin 5)
RehamFaqehi 0:f3d96a1a3177 200 * @param mosi Pin connected to data input (MOSI) (pin 6)
RehamFaqehi 0:f3d96a1a3177 201 * @param sclk Pin connected to serial clock (SCLK) (pin 7)
RehamFaqehi 0:f3d96a1a3177 202 * @param led Pin connected to LED backlight (must be PWM) (pin 8)
RehamFaqehi 0:f3d96a1a3177 203 *
RehamFaqehi 0:f3d96a1a3177 204 */
RehamFaqehi 0:f3d96a1a3177 205 N5110(PinName const pwrPin,
RehamFaqehi 0:f3d96a1a3177 206 PinName const scePin,
RehamFaqehi 0:f3d96a1a3177 207 PinName const rstPin,
RehamFaqehi 0:f3d96a1a3177 208 PinName const dcPin,
RehamFaqehi 0:f3d96a1a3177 209 PinName const mosiPin,
RehamFaqehi 0:f3d96a1a3177 210 PinName const sclkPin,
RehamFaqehi 0:f3d96a1a3177 211 PinName const ledPin);
RehamFaqehi 0:f3d96a1a3177 212
RehamFaqehi 0:f3d96a1a3177 213 /** Create a N5110 object connected to the specified pins (Vcc to +3V3)
RehamFaqehi 0:f3d96a1a3177 214 *
RehamFaqehi 0:f3d96a1a3177 215 * @param sce Pin connected to chip enable (pin 3)
RehamFaqehi 0:f3d96a1a3177 216 * @param rst Pin connected to reset (pin 4)
RehamFaqehi 0:f3d96a1a3177 217 * @param dc Pin connected to data/command select (pin 5)
RehamFaqehi 0:f3d96a1a3177 218 * @param mosi Pin connected to data input (MOSI) (pin 6)
RehamFaqehi 0:f3d96a1a3177 219 * @param sclk Pin connected to serial clock (SCLK) (pin 7)
RehamFaqehi 0:f3d96a1a3177 220 * @param led Pin connected to LED backlight (must be PWM) (pin 8)
RehamFaqehi 0:f3d96a1a3177 221 *
RehamFaqehi 0:f3d96a1a3177 222 */
RehamFaqehi 0:f3d96a1a3177 223 N5110(PinName const scePin,
RehamFaqehi 0:f3d96a1a3177 224 PinName const rstPin,
RehamFaqehi 0:f3d96a1a3177 225 PinName const dcPin,
RehamFaqehi 0:f3d96a1a3177 226 PinName const mosiPin,
RehamFaqehi 0:f3d96a1a3177 227 PinName const sclkPin,
RehamFaqehi 0:f3d96a1a3177 228 PinName const ledPin);
RehamFaqehi 0:f3d96a1a3177 229
RehamFaqehi 0:f3d96a1a3177 230 /**
RehamFaqehi 0:f3d96a1a3177 231 * Free allocated memory when object goes out of scope
RehamFaqehi 0:f3d96a1a3177 232 */
RehamFaqehi 0:f3d96a1a3177 233 ~N5110();
RehamFaqehi 0:f3d96a1a3177 234
RehamFaqehi 0:f3d96a1a3177 235 /** Initialise display
RehamFaqehi 0:f3d96a1a3177 236 *
RehamFaqehi 0:f3d96a1a3177 237 * Powers up the display and turns on backlight (50% brightness default).
RehamFaqehi 0:f3d96a1a3177 238 * Sets the display up in horizontal addressing mode and with normal video mode.
RehamFaqehi 0:f3d96a1a3177 239 */
RehamFaqehi 0:f3d96a1a3177 240 void init();
RehamFaqehi 0:f3d96a1a3177 241
RehamFaqehi 0:f3d96a1a3177 242 /** Turn off
RehamFaqehi 0:f3d96a1a3177 243 *
RehamFaqehi 0:f3d96a1a3177 244 * Powers down the display and turns of the backlight.
RehamFaqehi 0:f3d96a1a3177 245 * Needs to be reinitialised before being re-used.
RehamFaqehi 0:f3d96a1a3177 246 */
RehamFaqehi 0:f3d96a1a3177 247 void turnOff();
RehamFaqehi 0:f3d96a1a3177 248
RehamFaqehi 0:f3d96a1a3177 249 /** Clear
RehamFaqehi 0:f3d96a1a3177 250 *
RehamFaqehi 0:f3d96a1a3177 251 * Clears the screen buffer.
RehamFaqehi 0:f3d96a1a3177 252 */
RehamFaqehi 0:f3d96a1a3177 253 void clear();
RehamFaqehi 0:f3d96a1a3177 254
RehamFaqehi 0:f3d96a1a3177 255 /** Set screen constrast
RehamFaqehi 0:f3d96a1a3177 256 * @param constrast - float in range 0.0 to 1.0 (0.40 to 0.60 is usually a good value)
RehamFaqehi 0:f3d96a1a3177 257 */
RehamFaqehi 0:f3d96a1a3177 258 void setContrast(float contrast);
RehamFaqehi 0:f3d96a1a3177 259
RehamFaqehi 0:f3d96a1a3177 260 /** Turn on normal video mode (default)
RehamFaqehi 0:f3d96a1a3177 261 * Black on white
RehamFaqehi 0:f3d96a1a3177 262 */
RehamFaqehi 0:f3d96a1a3177 263 void normalMode();
RehamFaqehi 0:f3d96a1a3177 264
RehamFaqehi 0:f3d96a1a3177 265 /** Turn on inverse video mode (default)
RehamFaqehi 0:f3d96a1a3177 266 * White on black
RehamFaqehi 0:f3d96a1a3177 267 */
RehamFaqehi 0:f3d96a1a3177 268 void inverseMode();
RehamFaqehi 0:f3d96a1a3177 269
RehamFaqehi 0:f3d96a1a3177 270 /** Set Brightness
RehamFaqehi 0:f3d96a1a3177 271 *
RehamFaqehi 0:f3d96a1a3177 272 * Sets brightness of LED backlight.
RehamFaqehi 0:f3d96a1a3177 273 * @param brightness - float in range 0.0 to 1.0
RehamFaqehi 0:f3d96a1a3177 274 */
RehamFaqehi 0:f3d96a1a3177 275 void setBrightness(float const brightness);
RehamFaqehi 0:f3d96a1a3177 276
RehamFaqehi 0:f3d96a1a3177 277 /** Print String
RehamFaqehi 0:f3d96a1a3177 278 *
RehamFaqehi 0:f3d96a1a3177 279 * Prints a string of characters to the screen buffer. String is cut-off after the 83rd pixel.
RehamFaqehi 0:f3d96a1a3177 280 * @param x - the column number (0 to 83)
RehamFaqehi 0:f3d96a1a3177 281 * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row
RehamFaqehi 0:f3d96a1a3177 282 */
RehamFaqehi 0:f3d96a1a3177 283 void printString(char const *str,
RehamFaqehi 0:f3d96a1a3177 284 unsigned int const x,
RehamFaqehi 0:f3d96a1a3177 285 unsigned int const y);
RehamFaqehi 0:f3d96a1a3177 286
RehamFaqehi 0:f3d96a1a3177 287 /** Print Character
RehamFaqehi 0:f3d96a1a3177 288 *
RehamFaqehi 0:f3d96a1a3177 289 * Sends a character to the screen buffer. Printed at the specified location. Character is cut-off after the 83rd pixel.
RehamFaqehi 0:f3d96a1a3177 290 * @param c - the character to print. Can print ASCII as so printChar('C').
RehamFaqehi 0:f3d96a1a3177 291 * @param x - the column number (0 to 83)
RehamFaqehi 0:f3d96a1a3177 292 * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row
RehamFaqehi 0:f3d96a1a3177 293 */
RehamFaqehi 0:f3d96a1a3177 294 void printChar(char const c,
RehamFaqehi 0:f3d96a1a3177 295 unsigned int const x,
RehamFaqehi 0:f3d96a1a3177 296 unsigned int const y);
RehamFaqehi 0:f3d96a1a3177 297
RehamFaqehi 0:f3d96a1a3177 298 /**
RehamFaqehi 0:f3d96a1a3177 299 * @brief Set a Pixel
RehamFaqehi 0:f3d96a1a3177 300 *
RehamFaqehi 0:f3d96a1a3177 301 * @param x The x co-ordinate of the pixel (0 to 83)
RehamFaqehi 0:f3d96a1a3177 302 * @param y The y co-ordinate of the pixel (0 to 47)
RehamFaqehi 0:f3d96a1a3177 303 * @param state The state of the pixel [true=black (default), false=white]
RehamFaqehi 0:f3d96a1a3177 304 *
RehamFaqehi 0:f3d96a1a3177 305 * @details This function sets the state of a pixel in the screen buffer.
RehamFaqehi 0:f3d96a1a3177 306 * The third parameter can be omitted,
RehamFaqehi 0:f3d96a1a3177 307 */
RehamFaqehi 0:f3d96a1a3177 308 void setPixel(unsigned int const x,
RehamFaqehi 0:f3d96a1a3177 309 unsigned int const y,
RehamFaqehi 0:f3d96a1a3177 310 bool const state = true);
RehamFaqehi 0:f3d96a1a3177 311
RehamFaqehi 0:f3d96a1a3177 312 /**
RehamFaqehi 0:f3d96a1a3177 313 * @brief Clear a Pixel
RehamFaqehi 0:f3d96a1a3177 314 *
RehamFaqehi 0:f3d96a1a3177 315 * @param x - the x co-ordinate of the pixel (0 to 83)
RehamFaqehi 0:f3d96a1a3177 316 * @param y - the y co-ordinate of the pixel (0 to 47)
RehamFaqehi 0:f3d96a1a3177 317 *
RehamFaqehi 0:f3d96a1a3177 318 * @details This function clears pixel in the screen buffer
RehamFaqehi 0:f3d96a1a3177 319 *
RehamFaqehi 0:f3d96a1a3177 320 * @deprecated Use setPixel(x, y, false) instead
RehamFaqehi 0:f3d96a1a3177 321 */
RehamFaqehi 0:f3d96a1a3177 322 void clearPixel(unsigned int const x,
RehamFaqehi 0:f3d96a1a3177 323 unsigned int const y)
RehamFaqehi 0:f3d96a1a3177 324 __attribute__((deprecated("Use setPixel(x,y,false) instead")));
RehamFaqehi 0:f3d96a1a3177 325
RehamFaqehi 0:f3d96a1a3177 326 /** Get a Pixel
RehamFaqehi 0:f3d96a1a3177 327 *
RehamFaqehi 0:f3d96a1a3177 328 * This function gets the status of a pixel in the screen buffer.
RehamFaqehi 0:f3d96a1a3177 329 * @param x - the x co-ordinate of the pixel (0 to 83)
RehamFaqehi 0:f3d96a1a3177 330 * @param y - the y co-ordinate of the pixel (0 to 47)
RehamFaqehi 0:f3d96a1a3177 331 * @returns
RehamFaqehi 0:f3d96a1a3177 332 * 0 - pixel is clear
RehamFaqehi 0:f3d96a1a3177 333 * 1 - pixel is set
RehamFaqehi 0:f3d96a1a3177 334 */
RehamFaqehi 0:f3d96a1a3177 335 int getPixel(unsigned int const x,
RehamFaqehi 0:f3d96a1a3177 336 unsigned int const y) const;
RehamFaqehi 0:f3d96a1a3177 337
RehamFaqehi 0:f3d96a1a3177 338 /** Refresh display
RehamFaqehi 0:f3d96a1a3177 339 *
RehamFaqehi 0:f3d96a1a3177 340 * This functions sends the screen buffer to the display.
RehamFaqehi 0:f3d96a1a3177 341 */
RehamFaqehi 0:f3d96a1a3177 342 void refresh();
RehamFaqehi 0:f3d96a1a3177 343
RehamFaqehi 0:f3d96a1a3177 344 /** Randomise buffer
RehamFaqehi 0:f3d96a1a3177 345 *
RehamFaqehi 0:f3d96a1a3177 346 * This function fills the buffer with random data. Can be used to test the display.
RehamFaqehi 0:f3d96a1a3177 347 * A call to refresh() must be made to update the display to reflect the change in pixels.
RehamFaqehi 0:f3d96a1a3177 348 * The seed is not set and so the generated pattern will probably be the same each time.
RehamFaqehi 0:f3d96a1a3177 349 * TODO: Randomise the seed - maybe using the noise on the AnalogIn pins.
RehamFaqehi 0:f3d96a1a3177 350 */
RehamFaqehi 0:f3d96a1a3177 351 void randomiseBuffer();
RehamFaqehi 0:f3d96a1a3177 352
RehamFaqehi 0:f3d96a1a3177 353 /** Plot Array
RehamFaqehi 0:f3d96a1a3177 354 *
RehamFaqehi 0:f3d96a1a3177 355 * This function plots a one-dimensional array in the buffer.
RehamFaqehi 0:f3d96a1a3177 356 * @param array[] - y values of the plot. Values should be normalised in the range 0.0 to 1.0. First 84 plotted.
RehamFaqehi 0:f3d96a1a3177 357 */
RehamFaqehi 0:f3d96a1a3177 358 void plotArray(float const array[]);
RehamFaqehi 0:f3d96a1a3177 359
RehamFaqehi 0:f3d96a1a3177 360 /** Draw Circle
RehamFaqehi 0:f3d96a1a3177 361 *
RehamFaqehi 0:f3d96a1a3177 362 * This function draws a circle at the specified origin with specified radius in the screen buffer
RehamFaqehi 0:f3d96a1a3177 363 * Uses the midpoint circle algorithm.
RehamFaqehi 0:f3d96a1a3177 364 * @see http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
RehamFaqehi 0:f3d96a1a3177 365 * @param x0 - x-coordinate of centre
RehamFaqehi 0:f3d96a1a3177 366 * @param y0 - y-coordinate of centre
RehamFaqehi 0:f3d96a1a3177 367 * @param radius - radius of circle in pixels
RehamFaqehi 0:f3d96a1a3177 368 * @param fill - fill-type for the shape
RehamFaqehi 0:f3d96a1a3177 369 */
RehamFaqehi 0:f3d96a1a3177 370 void drawCircle(unsigned int const x0,
RehamFaqehi 0:f3d96a1a3177 371 unsigned int const y0,
RehamFaqehi 0:f3d96a1a3177 372 unsigned int const radius,
RehamFaqehi 0:f3d96a1a3177 373 FillType const fill);
RehamFaqehi 0:f3d96a1a3177 374
RehamFaqehi 0:f3d96a1a3177 375 /** Draw Line
RehamFaqehi 0:f3d96a1a3177 376 *
RehamFaqehi 0:f3d96a1a3177 377 * This function draws a line between the specified points using linear interpolation.
RehamFaqehi 0:f3d96a1a3177 378 * @param x0 - x-coordinate of first point
RehamFaqehi 0:f3d96a1a3177 379 * @param y0 - y-coordinate of first point
RehamFaqehi 0:f3d96a1a3177 380 * @param x1 - x-coordinate of last point
RehamFaqehi 0:f3d96a1a3177 381 * @param y1 - y-coordinate of last point
RehamFaqehi 0:f3d96a1a3177 382 * @param type - 0 white,1 black,2 dotted
RehamFaqehi 0:f3d96a1a3177 383 */
RehamFaqehi 0:f3d96a1a3177 384 void drawLine(unsigned int const x0,
RehamFaqehi 0:f3d96a1a3177 385 unsigned int const y0,
RehamFaqehi 0:f3d96a1a3177 386 unsigned int const x1,
RehamFaqehi 0:f3d96a1a3177 387 unsigned int const y1,
RehamFaqehi 0:f3d96a1a3177 388 unsigned int const type);
RehamFaqehi 0:f3d96a1a3177 389
RehamFaqehi 0:f3d96a1a3177 390 /** Draw Rectangle
RehamFaqehi 0:f3d96a1a3177 391 *
RehamFaqehi 0:f3d96a1a3177 392 * This function draws a rectangle.
RehamFaqehi 0:f3d96a1a3177 393 * @param x0 - x-coordinate of origin (top-left)
RehamFaqehi 0:f3d96a1a3177 394 * @param y0 - y-coordinate of origin (top-left)
RehamFaqehi 0:f3d96a1a3177 395 * @param width - width of rectangle
RehamFaqehi 0:f3d96a1a3177 396 * @param height - height of rectangle
RehamFaqehi 0:f3d96a1a3177 397 * @param fill - fill-type for the shape
RehamFaqehi 0:f3d96a1a3177 398 */
RehamFaqehi 0:f3d96a1a3177 399 void drawRect(unsigned int const x0,
RehamFaqehi 0:f3d96a1a3177 400 unsigned int const y0,
RehamFaqehi 0:f3d96a1a3177 401 unsigned int const width,
RehamFaqehi 0:f3d96a1a3177 402 unsigned int const height,
RehamFaqehi 0:f3d96a1a3177 403 FillType const fill);
RehamFaqehi 0:f3d96a1a3177 404
RehamFaqehi 0:f3d96a1a3177 405 /** Draw Sprite
RehamFaqehi 0:f3d96a1a3177 406 *
RehamFaqehi 0:f3d96a1a3177 407 * This function draws a sprite as defined in a 2D array
RehamFaqehi 0:f3d96a1a3177 408 * @param x0 - x-coordinate of origin (top-left)
RehamFaqehi 0:f3d96a1a3177 409 * @param y0 - y-coordinate of origin (top-left)
RehamFaqehi 0:f3d96a1a3177 410 * @param nrows - number of rows in sprite
RehamFaqehi 0:f3d96a1a3177 411 * @param ncols - number of columns in sprite
RehamFaqehi 0:f3d96a1a3177 412 * @param sprite - 2D array representing the sprite
RehamFaqehi 0:f3d96a1a3177 413 */
RehamFaqehi 0:f3d96a1a3177 414 void drawSprite(int x0,
RehamFaqehi 0:f3d96a1a3177 415 int y0,
RehamFaqehi 0:f3d96a1a3177 416 int nrows,
RehamFaqehi 0:f3d96a1a3177 417 int ncols,
RehamFaqehi 0:f3d96a1a3177 418 int *sprite);
RehamFaqehi 0:f3d96a1a3177 419
RehamFaqehi 0:f3d96a1a3177 420
RehamFaqehi 0:f3d96a1a3177 421 private:
RehamFaqehi 0:f3d96a1a3177 422 // methods
RehamFaqehi 0:f3d96a1a3177 423 void setXYAddress(unsigned int const x,
RehamFaqehi 0:f3d96a1a3177 424 unsigned int const y);
RehamFaqehi 0:f3d96a1a3177 425 void initSPI();
RehamFaqehi 0:f3d96a1a3177 426 void turnOn();
RehamFaqehi 0:f3d96a1a3177 427 void reset();
RehamFaqehi 0:f3d96a1a3177 428 void clearRAM();
RehamFaqehi 0:f3d96a1a3177 429 void sendCommand(unsigned char command);
RehamFaqehi 0:f3d96a1a3177 430 void sendData(unsigned char data);
RehamFaqehi 0:f3d96a1a3177 431 void setTempCoefficient(char tc); // 0 to 3
RehamFaqehi 0:f3d96a1a3177 432 void setBias(char bias); // 0 to 7
RehamFaqehi 0:f3d96a1a3177 433 };
RehamFaqehi 0:f3d96a1a3177 434
RehamFaqehi 0:f3d96a1a3177 435 const unsigned char font5x7[480] = {
RehamFaqehi 0:f3d96a1a3177 436 0x00, 0x00, 0x00, 0x00, 0x00,// (space)
RehamFaqehi 0:f3d96a1a3177 437 0x00, 0x00, 0x5F, 0x00, 0x00,// !
RehamFaqehi 0:f3d96a1a3177 438 0x00, 0x07, 0x00, 0x07, 0x00,// "
RehamFaqehi 0:f3d96a1a3177 439 0x14, 0x7F, 0x14, 0x7F, 0x14,// #
RehamFaqehi 0:f3d96a1a3177 440 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
RehamFaqehi 0:f3d96a1a3177 441 0x23, 0x13, 0x08, 0x64, 0x62,// %
RehamFaqehi 0:f3d96a1a3177 442 0x36, 0x49, 0x55, 0x22, 0x50,// &
RehamFaqehi 0:f3d96a1a3177 443 0x00, 0x05, 0x03, 0x00, 0x00,// '
RehamFaqehi 0:f3d96a1a3177 444 0x00, 0x1C, 0x22, 0x41, 0x00,// (
RehamFaqehi 0:f3d96a1a3177 445 0x00, 0x41, 0x22, 0x1C, 0x00,// )
RehamFaqehi 0:f3d96a1a3177 446 0x08, 0x2A, 0x1C, 0x2A, 0x08,// *
RehamFaqehi 0:f3d96a1a3177 447 0x08, 0x08, 0x3E, 0x08, 0x08,// +
RehamFaqehi 0:f3d96a1a3177 448 0x00, 0x50, 0x30, 0x00, 0x00,// ,
RehamFaqehi 0:f3d96a1a3177 449 0x08, 0x08, 0x08, 0x08, 0x08,// -
RehamFaqehi 0:f3d96a1a3177 450 0x00, 0x60, 0x60, 0x00, 0x00,// .
RehamFaqehi 0:f3d96a1a3177 451 0x20, 0x10, 0x08, 0x04, 0x02,// /
RehamFaqehi 0:f3d96a1a3177 452 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
RehamFaqehi 0:f3d96a1a3177 453 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
RehamFaqehi 0:f3d96a1a3177 454 0x42, 0x61, 0x51, 0x49, 0x46,// 2
RehamFaqehi 0:f3d96a1a3177 455 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
RehamFaqehi 0:f3d96a1a3177 456 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
RehamFaqehi 0:f3d96a1a3177 457 0x27, 0x45, 0x45, 0x45, 0x39,// 5
RehamFaqehi 0:f3d96a1a3177 458 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
RehamFaqehi 0:f3d96a1a3177 459 0x01, 0x71, 0x09, 0x05, 0x03,// 7
RehamFaqehi 0:f3d96a1a3177 460 0x36, 0x49, 0x49, 0x49, 0x36,// 8
RehamFaqehi 0:f3d96a1a3177 461 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
RehamFaqehi 0:f3d96a1a3177 462 0x00, 0x36, 0x36, 0x00, 0x00,// :
RehamFaqehi 0:f3d96a1a3177 463 0x00, 0x56, 0x36, 0x00, 0x00,// ;
RehamFaqehi 0:f3d96a1a3177 464 0x00, 0x08, 0x14, 0x22, 0x41,// <
RehamFaqehi 0:f3d96a1a3177 465 0x14, 0x14, 0x14, 0x14, 0x14,// =
RehamFaqehi 0:f3d96a1a3177 466 0x41, 0x22, 0x14, 0x08, 0x00,// >
RehamFaqehi 0:f3d96a1a3177 467 0x02, 0x01, 0x51, 0x09, 0x06,// ?
RehamFaqehi 0:f3d96a1a3177 468 0x32, 0x49, 0x79, 0x41, 0x3E,// @
RehamFaqehi 0:f3d96a1a3177 469 0x7E, 0x11, 0x11, 0x11, 0x7E,// A
RehamFaqehi 0:f3d96a1a3177 470 0x7F, 0x49, 0x49, 0x49, 0x36,// B
RehamFaqehi 0:f3d96a1a3177 471 0x3E, 0x41, 0x41, 0x41, 0x22,// C
RehamFaqehi 0:f3d96a1a3177 472 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
RehamFaqehi 0:f3d96a1a3177 473 0x7F, 0x49, 0x49, 0x49, 0x41,// E
RehamFaqehi 0:f3d96a1a3177 474 0x7F, 0x09, 0x09, 0x01, 0x01,// F
RehamFaqehi 0:f3d96a1a3177 475 0x3E, 0x41, 0x41, 0x51, 0x32,// G
RehamFaqehi 0:f3d96a1a3177 476 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
RehamFaqehi 0:f3d96a1a3177 477 0x00, 0x41, 0x7F, 0x41, 0x00,// I
RehamFaqehi 0:f3d96a1a3177 478 0x20, 0x40, 0x41, 0x3F, 0x01,// J
RehamFaqehi 0:f3d96a1a3177 479 0x7F, 0x08, 0x14, 0x22, 0x41,// K
RehamFaqehi 0:f3d96a1a3177 480 0x7F, 0x40, 0x40, 0x40, 0x40,// L
RehamFaqehi 0:f3d96a1a3177 481 0x7F, 0x02, 0x04, 0x02, 0x7F,// M
RehamFaqehi 0:f3d96a1a3177 482 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
RehamFaqehi 0:f3d96a1a3177 483 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
RehamFaqehi 0:f3d96a1a3177 484 0x7F, 0x09, 0x09, 0x09, 0x06,// P
RehamFaqehi 0:f3d96a1a3177 485 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
RehamFaqehi 0:f3d96a1a3177 486 0x7F, 0x09, 0x19, 0x29, 0x46,// R
RehamFaqehi 0:f3d96a1a3177 487 0x46, 0x49, 0x49, 0x49, 0x31,// S
RehamFaqehi 0:f3d96a1a3177 488 0x01, 0x01, 0x7F, 0x01, 0x01,// T
RehamFaqehi 0:f3d96a1a3177 489 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
RehamFaqehi 0:f3d96a1a3177 490 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
RehamFaqehi 0:f3d96a1a3177 491 0x7F, 0x20, 0x18, 0x20, 0x7F,// W
RehamFaqehi 0:f3d96a1a3177 492 0x63, 0x14, 0x08, 0x14, 0x63,// X
RehamFaqehi 0:f3d96a1a3177 493 0x03, 0x04, 0x78, 0x04, 0x03,// Y
RehamFaqehi 0:f3d96a1a3177 494 0x61, 0x51, 0x49, 0x45, 0x43,// Z
RehamFaqehi 0:f3d96a1a3177 495 0x00, 0x00, 0x7F, 0x41, 0x41,// [
RehamFaqehi 0:f3d96a1a3177 496 0x02, 0x04, 0x08, 0x10, 0x20,// "\"
RehamFaqehi 0:f3d96a1a3177 497 0x41, 0x41, 0x7F, 0x00, 0x00,// ]
RehamFaqehi 0:f3d96a1a3177 498 0x04, 0x02, 0x01, 0x02, 0x04,// ^
RehamFaqehi 0:f3d96a1a3177 499 0x40, 0x40, 0x40, 0x40, 0x40,// _
RehamFaqehi 0:f3d96a1a3177 500 0x00, 0x01, 0x02, 0x04, 0x00,// `
RehamFaqehi 0:f3d96a1a3177 501 0x20, 0x54, 0x54, 0x54, 0x78,// a
RehamFaqehi 0:f3d96a1a3177 502 0x7F, 0x48, 0x44, 0x44, 0x38,// b
RehamFaqehi 0:f3d96a1a3177 503 0x38, 0x44, 0x44, 0x44, 0x20,// c
RehamFaqehi 0:f3d96a1a3177 504 0x38, 0x44, 0x44, 0x48, 0x7F,// d
RehamFaqehi 0:f3d96a1a3177 505 0x38, 0x54, 0x54, 0x54, 0x18,// e
RehamFaqehi 0:f3d96a1a3177 506 0x08, 0x7E, 0x09, 0x01, 0x02,// f
RehamFaqehi 0:f3d96a1a3177 507 0x08, 0x14, 0x54, 0x54, 0x3C,// g
RehamFaqehi 0:f3d96a1a3177 508 0x7F, 0x08, 0x04, 0x04, 0x78,// h
RehamFaqehi 0:f3d96a1a3177 509 0x00, 0x44, 0x7D, 0x40, 0x00,// i
RehamFaqehi 0:f3d96a1a3177 510 0x20, 0x40, 0x44, 0x3D, 0x00,// j
RehamFaqehi 0:f3d96a1a3177 511 0x00, 0x7F, 0x10, 0x28, 0x44,// k
RehamFaqehi 0:f3d96a1a3177 512 0x00, 0x41, 0x7F, 0x40, 0x00,// l
RehamFaqehi 0:f3d96a1a3177 513 0x7C, 0x04, 0x18, 0x04, 0x78,// m
RehamFaqehi 0:f3d96a1a3177 514 0x7C, 0x08, 0x04, 0x04, 0x78,// n
RehamFaqehi 0:f3d96a1a3177 515 0x38, 0x44, 0x44, 0x44, 0x38,// o
RehamFaqehi 0:f3d96a1a3177 516 0x7C, 0x14, 0x14, 0x14, 0x08,// p
RehamFaqehi 0:f3d96a1a3177 517 0x08, 0x14, 0x14, 0x18, 0x7C,// q
RehamFaqehi 0:f3d96a1a3177 518 0x7C, 0x08, 0x04, 0x04, 0x08,// r
RehamFaqehi 0:f3d96a1a3177 519 0x48, 0x54, 0x54, 0x54, 0x20,// s
RehamFaqehi 0:f3d96a1a3177 520 0x04, 0x3F, 0x44, 0x40, 0x20,// t
RehamFaqehi 0:f3d96a1a3177 521 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
RehamFaqehi 0:f3d96a1a3177 522 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
RehamFaqehi 0:f3d96a1a3177 523 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
RehamFaqehi 0:f3d96a1a3177 524 0x44, 0x28, 0x10, 0x28, 0x44,// x
RehamFaqehi 0:f3d96a1a3177 525 0x0C, 0x50, 0x50, 0x50, 0x3C,// y
RehamFaqehi 0:f3d96a1a3177 526 0x44, 0x64, 0x54, 0x4C, 0x44,// z
RehamFaqehi 0:f3d96a1a3177 527 0x00, 0x08, 0x36, 0x41, 0x00,// {
RehamFaqehi 0:f3d96a1a3177 528 0x00, 0x00, 0x7F, 0x00, 0x00,// |
RehamFaqehi 0:f3d96a1a3177 529 0x00, 0x41, 0x36, 0x08, 0x00,// }
RehamFaqehi 0:f3d96a1a3177 530 0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
RehamFaqehi 0:f3d96a1a3177 531 0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
RehamFaqehi 0:f3d96a1a3177 532 };
RehamFaqehi 0:f3d96a1a3177 533
RehamFaqehi 0:f3d96a1a3177 534 #endif