Beispiel fuer das Auslesen von RFID Tags mittels RFID Reader

Dependencies:   MFRC522 mbed

ReaderTags
RFID ReaderRFID Tags

RFID (engl. radio-frequency identification - „Identifizierung mit Hilfe elektromagnetischer Wellen“) bezeichnet eine Technologie für Sender-Empfänger-Systeme zum automatischen und berührungslosen Identifizieren und Lokalisieren von Objekten (Produkte - Lebewesen) mit Radiowellen.

Ein RFID-System besteht aus einem Transponder (umgangssprachlich auch Funketikett genannt), der sich am oder im Gegenstand bzw. Lebewesen befindet und einen kennzeichnenden Code enthält, sowie einem Lesegerät zum Auslesen dieser Kennung.

RFID-Transponder können so klein wie ein Reiskorn sein und implantiert werden, etwa bei Menschen oder Haustieren.

Die Kopplung geschieht durch vom Lesegerät erzeugte magnetische Wechselfelder geringer Reichweite oder durch hochfrequente Radiowellen. Damit werden nicht nur Daten übertragen, sondern auch der Transponder mit Energie versorgt.

Der RFID Reader benötigt die MFRC522 Library. Der Reader wir via SPI angesprochen. Auf den Shields ist ein entsprechender Steckplatz vorgesehen.

Anwendungen

  • Fahrzeugidentifikation
  • Banknoten
  • Bezahlkarten
  • Identifizierung von Personen
  • Textilien und Bekleidung
  • Tieridentifikation
  • Waren- und Bestandsmanagement
  • Müllentsorgung
  • Zutrittskontrolle und Zeitkontrolle

Der RFID Reader hat einen eigenen Steckplatz oben auf dem Shield

Committer:
marcel1691
Date:
Fri Mar 25 17:07:01 2016 +0000
Revision:
4:00eaa9fcd3ef
Parent:
3:8725b25bcb6f
undo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcel1691 3:8725b25bcb6f 1 /***********************************
marcel1691 3:8725b25bcb6f 2 This is a our graphics core library, for all our displays.
marcel1691 3:8725b25bcb6f 3 We'll be adapting all the
marcel1691 3:8725b25bcb6f 4 existing libaries to use this core to make updating, support
marcel1691 3:8725b25bcb6f 5 and upgrading easier!
marcel1691 3:8725b25bcb6f 6
marcel1691 3:8725b25bcb6f 7 Adafruit invests time and resources providing this open source code,
marcel1691 3:8725b25bcb6f 8 please support Adafruit and open-source hardware by purchasing
marcel1691 3:8725b25bcb6f 9 products from Adafruit!
marcel1691 3:8725b25bcb6f 10
marcel1691 3:8725b25bcb6f 11 Written by Limor Fried/Ladyada for Adafruit Industries.
marcel1691 3:8725b25bcb6f 12 BSD license, check license.txt for more information
marcel1691 3:8725b25bcb6f 13 All text above must be included in any redistribution
marcel1691 3:8725b25bcb6f 14 ****************************************/
marcel1691 3:8725b25bcb6f 15
marcel1691 3:8725b25bcb6f 16 /*
marcel1691 3:8725b25bcb6f 17 * Modified by Neal Horman 7/14/2012 for use in mbed
marcel1691 3:8725b25bcb6f 18 */
marcel1691 3:8725b25bcb6f 19
marcel1691 3:8725b25bcb6f 20 #include "mbed.h"
marcel1691 3:8725b25bcb6f 21
marcel1691 3:8725b25bcb6f 22 #include "Adafruit_GFX.h"
marcel1691 3:8725b25bcb6f 23 #include "glcdfont.h"
marcel1691 3:8725b25bcb6f 24
marcel1691 3:8725b25bcb6f 25 #if defined(GFX_WANT_ABSTRACTS)
marcel1691 3:8725b25bcb6f 26 // draw a circle outline
marcel1691 3:8725b25bcb6f 27 void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color)
marcel1691 3:8725b25bcb6f 28 {
marcel1691 3:8725b25bcb6f 29 int16_t f = 1 - r;
marcel1691 3:8725b25bcb6f 30 int16_t ddF_x = 1;
marcel1691 3:8725b25bcb6f 31 int16_t ddF_y = -2 * r;
marcel1691 3:8725b25bcb6f 32 int16_t x = 0;
marcel1691 3:8725b25bcb6f 33 int16_t y = r;
marcel1691 3:8725b25bcb6f 34
marcel1691 3:8725b25bcb6f 35 drawPixel(x0, y0+r, color);
marcel1691 3:8725b25bcb6f 36 drawPixel(x0, y0-r, color);
marcel1691 3:8725b25bcb6f 37 drawPixel(x0+r, y0, color);
marcel1691 3:8725b25bcb6f 38 drawPixel(x0-r, y0, color);
marcel1691 3:8725b25bcb6f 39
marcel1691 3:8725b25bcb6f 40 while (x<y)
marcel1691 3:8725b25bcb6f 41 {
marcel1691 3:8725b25bcb6f 42 if (f >= 0)
marcel1691 3:8725b25bcb6f 43 {
marcel1691 3:8725b25bcb6f 44 y--;
marcel1691 3:8725b25bcb6f 45 ddF_y += 2;
marcel1691 3:8725b25bcb6f 46 f += ddF_y;
marcel1691 3:8725b25bcb6f 47 }
marcel1691 3:8725b25bcb6f 48 x++;
marcel1691 3:8725b25bcb6f 49 ddF_x += 2;
marcel1691 3:8725b25bcb6f 50 f += ddF_x;
marcel1691 3:8725b25bcb6f 51
marcel1691 3:8725b25bcb6f 52 drawPixel(x0 + x, y0 + y, color);
marcel1691 3:8725b25bcb6f 53 drawPixel(x0 - x, y0 + y, color);
marcel1691 3:8725b25bcb6f 54 drawPixel(x0 + x, y0 - y, color);
marcel1691 3:8725b25bcb6f 55 drawPixel(x0 - x, y0 - y, color);
marcel1691 3:8725b25bcb6f 56 drawPixel(x0 + y, y0 + x, color);
marcel1691 3:8725b25bcb6f 57 drawPixel(x0 - y, y0 + x, color);
marcel1691 3:8725b25bcb6f 58 drawPixel(x0 + y, y0 - x, color);
marcel1691 3:8725b25bcb6f 59 drawPixel(x0 - y, y0 - x, color);
marcel1691 3:8725b25bcb6f 60 }
marcel1691 3:8725b25bcb6f 61 }
marcel1691 3:8725b25bcb6f 62
marcel1691 3:8725b25bcb6f 63 void Adafruit_GFX::drawCircleHelper( int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color)
marcel1691 3:8725b25bcb6f 64 {
marcel1691 3:8725b25bcb6f 65 int16_t f = 1 - r;
marcel1691 3:8725b25bcb6f 66 int16_t ddF_x = 1;
marcel1691 3:8725b25bcb6f 67 int16_t ddF_y = -2 * r;
marcel1691 3:8725b25bcb6f 68 int16_t x = 0;
marcel1691 3:8725b25bcb6f 69 int16_t y = r;
marcel1691 3:8725b25bcb6f 70
marcel1691 3:8725b25bcb6f 71 while (x<y)
marcel1691 3:8725b25bcb6f 72 {
marcel1691 3:8725b25bcb6f 73 if (f >= 0)
marcel1691 3:8725b25bcb6f 74 {
marcel1691 3:8725b25bcb6f 75 y--;
marcel1691 3:8725b25bcb6f 76 ddF_y += 2;
marcel1691 3:8725b25bcb6f 77 f += ddF_y;
marcel1691 3:8725b25bcb6f 78 }
marcel1691 3:8725b25bcb6f 79 x++;
marcel1691 3:8725b25bcb6f 80 ddF_x += 2;
marcel1691 3:8725b25bcb6f 81 f += ddF_x;
marcel1691 3:8725b25bcb6f 82
marcel1691 3:8725b25bcb6f 83 if (cornername & 0x4)
marcel1691 3:8725b25bcb6f 84 {
marcel1691 3:8725b25bcb6f 85 drawPixel(x0 + x, y0 + y, color);
marcel1691 3:8725b25bcb6f 86 drawPixel(x0 + y, y0 + x, color);
marcel1691 3:8725b25bcb6f 87 }
marcel1691 3:8725b25bcb6f 88
marcel1691 3:8725b25bcb6f 89 if (cornername & 0x2)
marcel1691 3:8725b25bcb6f 90 {
marcel1691 3:8725b25bcb6f 91 drawPixel(x0 + x, y0 - y, color);
marcel1691 3:8725b25bcb6f 92 drawPixel(x0 + y, y0 - x, color);
marcel1691 3:8725b25bcb6f 93 }
marcel1691 3:8725b25bcb6f 94
marcel1691 3:8725b25bcb6f 95 if (cornername & 0x8)
marcel1691 3:8725b25bcb6f 96 {
marcel1691 3:8725b25bcb6f 97 drawPixel(x0 - y, y0 + x, color);
marcel1691 3:8725b25bcb6f 98 drawPixel(x0 - x, y0 + y, color);
marcel1691 3:8725b25bcb6f 99 }
marcel1691 3:8725b25bcb6f 100
marcel1691 3:8725b25bcb6f 101 if (cornername & 0x1)
marcel1691 3:8725b25bcb6f 102 {
marcel1691 3:8725b25bcb6f 103 drawPixel(x0 - y, y0 - x, color);
marcel1691 3:8725b25bcb6f 104 drawPixel(x0 - x, y0 - y, color);
marcel1691 3:8725b25bcb6f 105 }
marcel1691 3:8725b25bcb6f 106 }
marcel1691 3:8725b25bcb6f 107 }
marcel1691 3:8725b25bcb6f 108
marcel1691 3:8725b25bcb6f 109 void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color)
marcel1691 3:8725b25bcb6f 110 {
marcel1691 3:8725b25bcb6f 111 drawFastVLine(x0, y0-r, 2*r+1, color);
marcel1691 3:8725b25bcb6f 112 fillCircleHelper(x0, y0, r, 3, 0, color);
marcel1691 3:8725b25bcb6f 113 }
marcel1691 3:8725b25bcb6f 114
marcel1691 3:8725b25bcb6f 115 // used to do circles and roundrects!
marcel1691 3:8725b25bcb6f 116 void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color)
marcel1691 3:8725b25bcb6f 117 {
marcel1691 3:8725b25bcb6f 118 int16_t f = 1 - r;
marcel1691 3:8725b25bcb6f 119 int16_t ddF_x = 1;
marcel1691 3:8725b25bcb6f 120 int16_t ddF_y = -2 * r;
marcel1691 3:8725b25bcb6f 121 int16_t x = 0;
marcel1691 3:8725b25bcb6f 122 int16_t y = r;
marcel1691 3:8725b25bcb6f 123
marcel1691 3:8725b25bcb6f 124 while (x<y)
marcel1691 3:8725b25bcb6f 125 {
marcel1691 3:8725b25bcb6f 126 if (f >= 0)
marcel1691 3:8725b25bcb6f 127 {
marcel1691 3:8725b25bcb6f 128 y--;
marcel1691 3:8725b25bcb6f 129 ddF_y += 2;
marcel1691 3:8725b25bcb6f 130 f += ddF_y;
marcel1691 3:8725b25bcb6f 131 }
marcel1691 3:8725b25bcb6f 132 x++;
marcel1691 3:8725b25bcb6f 133 ddF_x += 2;
marcel1691 3:8725b25bcb6f 134 f += ddF_x;
marcel1691 3:8725b25bcb6f 135
marcel1691 3:8725b25bcb6f 136 if (cornername & 0x1)
marcel1691 3:8725b25bcb6f 137 {
marcel1691 3:8725b25bcb6f 138 drawFastVLine(x0+x, y0-y, 2*y+1+delta, color);
marcel1691 3:8725b25bcb6f 139 drawFastVLine(x0+y, y0-x, 2*x+1+delta, color);
marcel1691 3:8725b25bcb6f 140 }
marcel1691 3:8725b25bcb6f 141
marcel1691 3:8725b25bcb6f 142 if (cornername & 0x2)
marcel1691 3:8725b25bcb6f 143 {
marcel1691 3:8725b25bcb6f 144 drawFastVLine(x0-x, y0-y, 2*y+1+delta, color);
marcel1691 3:8725b25bcb6f 145 drawFastVLine(x0-y, y0-x, 2*x+1+delta, color);
marcel1691 3:8725b25bcb6f 146 }
marcel1691 3:8725b25bcb6f 147 }
marcel1691 3:8725b25bcb6f 148 }
marcel1691 3:8725b25bcb6f 149 #endif
marcel1691 3:8725b25bcb6f 150
marcel1691 3:8725b25bcb6f 151 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
marcel1691 3:8725b25bcb6f 152 // bresenham's algorithm - thx wikpedia
marcel1691 3:8725b25bcb6f 153 void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
marcel1691 3:8725b25bcb6f 154 {
marcel1691 3:8725b25bcb6f 155 int16_t steep = abs(y1 - y0) > abs(x1 - x0);
marcel1691 3:8725b25bcb6f 156
marcel1691 3:8725b25bcb6f 157 if (steep)
marcel1691 3:8725b25bcb6f 158 {
marcel1691 3:8725b25bcb6f 159 swap(x0, y0);
marcel1691 3:8725b25bcb6f 160 swap(x1, y1);
marcel1691 3:8725b25bcb6f 161 }
marcel1691 3:8725b25bcb6f 162
marcel1691 3:8725b25bcb6f 163 if (x0 > x1)
marcel1691 3:8725b25bcb6f 164 {
marcel1691 3:8725b25bcb6f 165 swap(x0, x1);
marcel1691 3:8725b25bcb6f 166 swap(y0, y1);
marcel1691 3:8725b25bcb6f 167 }
marcel1691 3:8725b25bcb6f 168
marcel1691 3:8725b25bcb6f 169 int16_t dx, dy;
marcel1691 3:8725b25bcb6f 170 dx = x1 - x0;
marcel1691 3:8725b25bcb6f 171 dy = abs(y1 - y0);
marcel1691 3:8725b25bcb6f 172
marcel1691 3:8725b25bcb6f 173 int16_t err = dx / 2;
marcel1691 3:8725b25bcb6f 174 int16_t ystep;
marcel1691 3:8725b25bcb6f 175
marcel1691 3:8725b25bcb6f 176 if (y0 < y1)
marcel1691 3:8725b25bcb6f 177 ystep = 1;
marcel1691 3:8725b25bcb6f 178 else
marcel1691 3:8725b25bcb6f 179 ystep = -1;
marcel1691 3:8725b25bcb6f 180
marcel1691 3:8725b25bcb6f 181 for (; x0<=x1; x0++)
marcel1691 3:8725b25bcb6f 182 {
marcel1691 3:8725b25bcb6f 183 if (steep)
marcel1691 3:8725b25bcb6f 184 drawPixel(y0, x0, color);
marcel1691 3:8725b25bcb6f 185 else
marcel1691 3:8725b25bcb6f 186 drawPixel(x0, y0, color);
marcel1691 3:8725b25bcb6f 187
marcel1691 3:8725b25bcb6f 188 err -= dy;
marcel1691 3:8725b25bcb6f 189 if (err < 0)
marcel1691 3:8725b25bcb6f 190 {
marcel1691 3:8725b25bcb6f 191 y0 += ystep;
marcel1691 3:8725b25bcb6f 192 err += dx;
marcel1691 3:8725b25bcb6f 193 }
marcel1691 3:8725b25bcb6f 194 }
marcel1691 3:8725b25bcb6f 195 }
marcel1691 3:8725b25bcb6f 196
marcel1691 3:8725b25bcb6f 197 void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color)
marcel1691 3:8725b25bcb6f 198 {
marcel1691 3:8725b25bcb6f 199 // stupidest version - update in subclasses if desired!
marcel1691 3:8725b25bcb6f 200 drawLine(x, y, x, y+h-1, color);
marcel1691 3:8725b25bcb6f 201 }
marcel1691 3:8725b25bcb6f 202
marcel1691 3:8725b25bcb6f 203 void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
marcel1691 3:8725b25bcb6f 204 {
marcel1691 3:8725b25bcb6f 205 // stupidest version - update in subclasses if desired!
marcel1691 3:8725b25bcb6f 206 for (int16_t i=x; i<x+w; i++)
marcel1691 3:8725b25bcb6f 207 drawFastVLine(i, y, h, color);
marcel1691 3:8725b25bcb6f 208 }
marcel1691 3:8725b25bcb6f 209 #endif
marcel1691 3:8725b25bcb6f 210
marcel1691 3:8725b25bcb6f 211 #if defined(GFX_WANT_ABSTRACTS)
marcel1691 3:8725b25bcb6f 212 // draw a rectangle
marcel1691 3:8725b25bcb6f 213 void Adafruit_GFX::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
marcel1691 3:8725b25bcb6f 214 {
marcel1691 3:8725b25bcb6f 215 drawFastHLine(x, y, w, color);
marcel1691 3:8725b25bcb6f 216 drawFastHLine(x, y+h-1, w, color);
marcel1691 3:8725b25bcb6f 217 drawFastVLine(x, y, h, color);
marcel1691 3:8725b25bcb6f 218 drawFastVLine(x+w-1, y, h, color);
marcel1691 3:8725b25bcb6f 219 }
marcel1691 3:8725b25bcb6f 220
marcel1691 3:8725b25bcb6f 221 void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color)
marcel1691 3:8725b25bcb6f 222 {
marcel1691 3:8725b25bcb6f 223 // stupidest version - update in subclasses if desired!
marcel1691 3:8725b25bcb6f 224 drawLine(x, y, x+w-1, y, color);
marcel1691 3:8725b25bcb6f 225 }
marcel1691 3:8725b25bcb6f 226
marcel1691 3:8725b25bcb6f 227 void Adafruit_GFX::fillScreen(uint16_t color)
marcel1691 3:8725b25bcb6f 228 {
marcel1691 3:8725b25bcb6f 229 fillRect(0, 0, _width, _height, color);
marcel1691 3:8725b25bcb6f 230 }
marcel1691 3:8725b25bcb6f 231
marcel1691 3:8725b25bcb6f 232 // draw a rounded rectangle!
marcel1691 3:8725b25bcb6f 233 void Adafruit_GFX::drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color)
marcel1691 3:8725b25bcb6f 234 {
marcel1691 3:8725b25bcb6f 235 // smarter version
marcel1691 3:8725b25bcb6f 236 drawFastHLine(x+r , y , w-2*r, color); // Top
marcel1691 3:8725b25bcb6f 237 drawFastHLine(x+r , y+h-1, w-2*r, color); // Bottom
marcel1691 3:8725b25bcb6f 238 drawFastVLine( x , y+r , h-2*r, color); // Left
marcel1691 3:8725b25bcb6f 239 drawFastVLine( x+w-1, y+r , h-2*r, color); // Right
marcel1691 3:8725b25bcb6f 240 // draw four corners
marcel1691 3:8725b25bcb6f 241 drawCircleHelper(x+r , y+r , r, 1, color);
marcel1691 3:8725b25bcb6f 242 drawCircleHelper(x+w-r-1, y+r , r, 2, color);
marcel1691 3:8725b25bcb6f 243 drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);
marcel1691 3:8725b25bcb6f 244 drawCircleHelper(x+r , y+h-r-1, r, 8, color);
marcel1691 3:8725b25bcb6f 245 }
marcel1691 3:8725b25bcb6f 246
marcel1691 3:8725b25bcb6f 247 // fill a rounded rectangle!
marcel1691 3:8725b25bcb6f 248 void Adafruit_GFX::fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color)
marcel1691 3:8725b25bcb6f 249 {
marcel1691 3:8725b25bcb6f 250 // smarter version
marcel1691 3:8725b25bcb6f 251 fillRect(x+r, y, w-2*r, h, color);
marcel1691 3:8725b25bcb6f 252
marcel1691 3:8725b25bcb6f 253 // draw four corners
marcel1691 3:8725b25bcb6f 254 fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);
marcel1691 3:8725b25bcb6f 255 fillCircleHelper(x+r , y+r, r, 2, h-2*r-1, color);
marcel1691 3:8725b25bcb6f 256 }
marcel1691 3:8725b25bcb6f 257
marcel1691 3:8725b25bcb6f 258 // draw a triangle!
marcel1691 3:8725b25bcb6f 259 void Adafruit_GFX::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
marcel1691 3:8725b25bcb6f 260 {
marcel1691 3:8725b25bcb6f 261 drawLine(x0, y0, x1, y1, color);
marcel1691 3:8725b25bcb6f 262 drawLine(x1, y1, x2, y2, color);
marcel1691 3:8725b25bcb6f 263 drawLine(x2, y2, x0, y0, color);
marcel1691 3:8725b25bcb6f 264 }
marcel1691 3:8725b25bcb6f 265
marcel1691 3:8725b25bcb6f 266 // fill a triangle!
marcel1691 3:8725b25bcb6f 267 void Adafruit_GFX::fillTriangle ( int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
marcel1691 3:8725b25bcb6f 268 {
marcel1691 3:8725b25bcb6f 269 int16_t a, b, y, last;
marcel1691 3:8725b25bcb6f 270
marcel1691 3:8725b25bcb6f 271 // Sort coordinates by Y order (y2 >= y1 >= y0)
marcel1691 3:8725b25bcb6f 272 if (y0 > y1)
marcel1691 3:8725b25bcb6f 273 swap(y0, y1); swap(x0, x1);
marcel1691 3:8725b25bcb6f 274
marcel1691 3:8725b25bcb6f 275 if (y1 > y2)
marcel1691 3:8725b25bcb6f 276 swap(y2, y1); swap(x2, x1);
marcel1691 3:8725b25bcb6f 277
marcel1691 3:8725b25bcb6f 278 if (y0 > y1)
marcel1691 3:8725b25bcb6f 279 swap(y0, y1); swap(x0, x1);
marcel1691 3:8725b25bcb6f 280
marcel1691 3:8725b25bcb6f 281
marcel1691 3:8725b25bcb6f 282 if(y0 == y2)
marcel1691 3:8725b25bcb6f 283 { // Handle awkward all-on-same-line case as its own thing
marcel1691 3:8725b25bcb6f 284 a = b = x0;
marcel1691 3:8725b25bcb6f 285 if(x1 < a)
marcel1691 3:8725b25bcb6f 286 a = x1;
marcel1691 3:8725b25bcb6f 287 else if(x1 > b)
marcel1691 3:8725b25bcb6f 288 b = x1;
marcel1691 3:8725b25bcb6f 289
marcel1691 3:8725b25bcb6f 290 if(x2 < a)
marcel1691 3:8725b25bcb6f 291 a = x2;
marcel1691 3:8725b25bcb6f 292 else if(x2 > b) b = x2;
marcel1691 3:8725b25bcb6f 293 drawFastHLine(a, y0, b-a+1, color);
marcel1691 3:8725b25bcb6f 294 return;
marcel1691 3:8725b25bcb6f 295 }
marcel1691 3:8725b25bcb6f 296
marcel1691 3:8725b25bcb6f 297 int16_t
marcel1691 3:8725b25bcb6f 298 dx01 = x1 - x0,
marcel1691 3:8725b25bcb6f 299 dy01 = y1 - y0,
marcel1691 3:8725b25bcb6f 300 dx02 = x2 - x0,
marcel1691 3:8725b25bcb6f 301 dy02 = y2 - y0,
marcel1691 3:8725b25bcb6f 302 dx12 = x2 - x1,
marcel1691 3:8725b25bcb6f 303 dy12 = y2 - y1,
marcel1691 3:8725b25bcb6f 304 sa = 0,
marcel1691 3:8725b25bcb6f 305 sb = 0;
marcel1691 3:8725b25bcb6f 306
marcel1691 3:8725b25bcb6f 307 // For upper part of triangle, find scanline crossings for segments
marcel1691 3:8725b25bcb6f 308 // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
marcel1691 3:8725b25bcb6f 309 // is included here (and second loop will be skipped, avoiding a /0
marcel1691 3:8725b25bcb6f 310 // error there), otherwise scanline y1 is skipped here and handled
marcel1691 3:8725b25bcb6f 311 // in the second loop...which also avoids a /0 error here if y0=y1
marcel1691 3:8725b25bcb6f 312 // (flat-topped triangle).
marcel1691 3:8725b25bcb6f 313 if(y1 == y2)
marcel1691 3:8725b25bcb6f 314 last = y1; // Include y1 scanline
marcel1691 3:8725b25bcb6f 315 else
marcel1691 3:8725b25bcb6f 316 last = y1-1; // Skip it
marcel1691 3:8725b25bcb6f 317
marcel1691 3:8725b25bcb6f 318 for(y=y0; y<=last; y++)
marcel1691 3:8725b25bcb6f 319 {
marcel1691 3:8725b25bcb6f 320 a = x0 + sa / dy01;
marcel1691 3:8725b25bcb6f 321 b = x0 + sb / dy02;
marcel1691 3:8725b25bcb6f 322 sa += dx01;
marcel1691 3:8725b25bcb6f 323 sb += dx02;
marcel1691 3:8725b25bcb6f 324 /* longhand:
marcel1691 3:8725b25bcb6f 325 a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
marcel1691 3:8725b25bcb6f 326 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
marcel1691 3:8725b25bcb6f 327 */
marcel1691 3:8725b25bcb6f 328 if(a > b)
marcel1691 3:8725b25bcb6f 329 swap(a,b);
marcel1691 3:8725b25bcb6f 330 drawFastHLine(a, y, b-a+1, color);
marcel1691 3:8725b25bcb6f 331 }
marcel1691 3:8725b25bcb6f 332
marcel1691 3:8725b25bcb6f 333 // For lower part of triangle, find scanline crossings for segments
marcel1691 3:8725b25bcb6f 334 // 0-2 and 1-2. This loop is skipped if y1=y2.
marcel1691 3:8725b25bcb6f 335 sa = dx12 * (y - y1);
marcel1691 3:8725b25bcb6f 336 sb = dx02 * (y - y0);
marcel1691 3:8725b25bcb6f 337 for(; y<=y2; y++)
marcel1691 3:8725b25bcb6f 338 {
marcel1691 3:8725b25bcb6f 339 a = x1 + sa / dy12;
marcel1691 3:8725b25bcb6f 340 b = x0 + sb / dy02;
marcel1691 3:8725b25bcb6f 341 sa += dx12;
marcel1691 3:8725b25bcb6f 342 sb += dx02;
marcel1691 3:8725b25bcb6f 343 /* longhand:
marcel1691 3:8725b25bcb6f 344 a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
marcel1691 3:8725b25bcb6f 345 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
marcel1691 3:8725b25bcb6f 346 */
marcel1691 3:8725b25bcb6f 347 if(a > b)
marcel1691 3:8725b25bcb6f 348 swap(a,b);
marcel1691 3:8725b25bcb6f 349 drawFastHLine(a, y, b-a+1, color);
marcel1691 3:8725b25bcb6f 350 }
marcel1691 3:8725b25bcb6f 351 }
marcel1691 3:8725b25bcb6f 352
marcel1691 3:8725b25bcb6f 353 void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
marcel1691 3:8725b25bcb6f 354 {
marcel1691 3:8725b25bcb6f 355 for (int16_t j=0; j<h; j++)
marcel1691 3:8725b25bcb6f 356 {
marcel1691 3:8725b25bcb6f 357 for (int16_t i=0; i<w; i++ )
marcel1691 3:8725b25bcb6f 358 {
marcel1691 3:8725b25bcb6f 359 if (bitmap[i + (j/8)*w] & _BV(j%8))
marcel1691 3:8725b25bcb6f 360 drawPixel(x+i, y+j, color);
marcel1691 3:8725b25bcb6f 361 }
marcel1691 3:8725b25bcb6f 362 }
marcel1691 3:8725b25bcb6f 363 }
marcel1691 3:8725b25bcb6f 364 #endif
marcel1691 3:8725b25bcb6f 365
marcel1691 3:8725b25bcb6f 366 size_t Adafruit_GFX::writeChar(uint8_t c)
marcel1691 3:8725b25bcb6f 367 {
marcel1691 3:8725b25bcb6f 368 if (c == '\n')
marcel1691 3:8725b25bcb6f 369 {
marcel1691 3:8725b25bcb6f 370 cursor_y += textsize*8;
marcel1691 3:8725b25bcb6f 371 cursor_x = 0;
marcel1691 3:8725b25bcb6f 372 }
marcel1691 3:8725b25bcb6f 373 else if (c == '\r')
marcel1691 3:8725b25bcb6f 374 cursor_x = 0;
marcel1691 3:8725b25bcb6f 375 else
marcel1691 3:8725b25bcb6f 376 {
marcel1691 3:8725b25bcb6f 377 drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
marcel1691 3:8725b25bcb6f 378 cursor_x += textsize*6;
marcel1691 3:8725b25bcb6f 379 if (wrap && (cursor_x > (_width - textsize*6)))
marcel1691 3:8725b25bcb6f 380 {
marcel1691 3:8725b25bcb6f 381 cursor_y += textsize*8;
marcel1691 3:8725b25bcb6f 382 cursor_x = 0;
marcel1691 3:8725b25bcb6f 383 }
marcel1691 3:8725b25bcb6f 384 }
marcel1691 3:8725b25bcb6f 385 return 1;
marcel1691 3:8725b25bcb6f 386 }
marcel1691 3:8725b25bcb6f 387
marcel1691 3:8725b25bcb6f 388 // draw a character
marcel1691 3:8725b25bcb6f 389 void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size)
marcel1691 3:8725b25bcb6f 390 {
marcel1691 3:8725b25bcb6f 391 if(
marcel1691 3:8725b25bcb6f 392 (x >= _width) || // Clip right
marcel1691 3:8725b25bcb6f 393 (y >= _height) || // Clip bottom
marcel1691 3:8725b25bcb6f 394 ((x + 5 * size - 1) < 0) || // Clip left
marcel1691 3:8725b25bcb6f 395 ((y + 8 * size - 1) < 0) // Clip top
marcel1691 3:8725b25bcb6f 396 )
marcel1691 3:8725b25bcb6f 397 return;
marcel1691 3:8725b25bcb6f 398
marcel1691 3:8725b25bcb6f 399 for (int8_t i=0; i<6; i++ )
marcel1691 3:8725b25bcb6f 400 {
marcel1691 3:8725b25bcb6f 401 uint8_t line = 0;
marcel1691 3:8725b25bcb6f 402
marcel1691 3:8725b25bcb6f 403 if (i == 5)
marcel1691 3:8725b25bcb6f 404 line = 0x0;
marcel1691 3:8725b25bcb6f 405 else
marcel1691 3:8725b25bcb6f 406 line = font[(c*5)+i];
marcel1691 3:8725b25bcb6f 407
marcel1691 3:8725b25bcb6f 408 for (int8_t j = 0; j<8; j++)
marcel1691 3:8725b25bcb6f 409 {
marcel1691 3:8725b25bcb6f 410 if (line & 0x1)
marcel1691 3:8725b25bcb6f 411 {
marcel1691 3:8725b25bcb6f 412 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
marcel1691 3:8725b25bcb6f 413 if (size == 1) // default size
marcel1691 3:8725b25bcb6f 414 drawPixel(x+i, y+j, color);
marcel1691 3:8725b25bcb6f 415 else // big size
marcel1691 3:8725b25bcb6f 416 fillRect(x+(i*size), y+(j*size), size, size, color);
marcel1691 3:8725b25bcb6f 417 #else
marcel1691 3:8725b25bcb6f 418 drawPixel(x+i, y+j, color);
marcel1691 3:8725b25bcb6f 419 #endif
marcel1691 3:8725b25bcb6f 420 }
marcel1691 3:8725b25bcb6f 421 else if (bg != color)
marcel1691 3:8725b25bcb6f 422 {
marcel1691 3:8725b25bcb6f 423 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
marcel1691 3:8725b25bcb6f 424 if (size == 1) // default size
marcel1691 3:8725b25bcb6f 425 drawPixel(x+i, y+j, bg);
marcel1691 3:8725b25bcb6f 426 else // big size
marcel1691 3:8725b25bcb6f 427 fillRect(x+i*size, y+j*size, size, size, bg);
marcel1691 3:8725b25bcb6f 428 #else
marcel1691 3:8725b25bcb6f 429 drawPixel(x+i, y+j, bg);
marcel1691 3:8725b25bcb6f 430 #endif
marcel1691 3:8725b25bcb6f 431 }
marcel1691 3:8725b25bcb6f 432 line >>= 1;
marcel1691 3:8725b25bcb6f 433 }
marcel1691 3:8725b25bcb6f 434 }
marcel1691 3:8725b25bcb6f 435 }
marcel1691 3:8725b25bcb6f 436
marcel1691 3:8725b25bcb6f 437 void Adafruit_GFX::setRotation(uint8_t x)
marcel1691 3:8725b25bcb6f 438 {
marcel1691 3:8725b25bcb6f 439 x %= 4; // cant be higher than 3
marcel1691 3:8725b25bcb6f 440 rotation = x;
marcel1691 3:8725b25bcb6f 441 switch (x)
marcel1691 3:8725b25bcb6f 442 {
marcel1691 3:8725b25bcb6f 443 case 0:
marcel1691 3:8725b25bcb6f 444 case 2:
marcel1691 3:8725b25bcb6f 445 _width = _rawWidth;
marcel1691 3:8725b25bcb6f 446 _height = _rawHeight;
marcel1691 3:8725b25bcb6f 447 break;
marcel1691 3:8725b25bcb6f 448 case 1:
marcel1691 3:8725b25bcb6f 449 case 3:
marcel1691 3:8725b25bcb6f 450 _width = _rawHeight;
marcel1691 3:8725b25bcb6f 451 _height = _rawWidth;
marcel1691 3:8725b25bcb6f 452 break;
marcel1691 3:8725b25bcb6f 453 }
marcel1691 3:8725b25bcb6f 454 }