Extended library to include a screensaver

Dependencies:   SDFileSystem

Fork of 4DGL-uLCD-SE by Jay Danner

Committer:
macenzofan
Date:
Wed Feb 08 21:53:30 2017 +0000
Revision:
3:f09725357991
Parent:
0:975087cba076
IOT EC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jdanner3 0:975087cba076 1 //
jdanner3 0:975087cba076 2 // uLCD_4DGL is a class to drive 4D Systems TFT touch screens
jdanner3 0:975087cba076 3 //
jdanner3 0:975087cba076 4 // Fork of 4DGL library for 4D Systems LCD displays
jdanner3 0:975087cba076 5 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr>
jdanner3 0:975087cba076 6 // Modifed for Goldelox processor <2013> Jim Hamblen
jdanner3 0:975087cba076 7 //
jdanner3 0:975087cba076 8 // uLCD_4DGL is free software: you can redistribute it and/or modify
jdanner3 0:975087cba076 9 // it under the terms of the GNU General Public License as published by
jdanner3 0:975087cba076 10 // the Free Software Foundation, either version 3 of the License, or
jdanner3 0:975087cba076 11 // (at your option) any later version.
jdanner3 0:975087cba076 12 //
jdanner3 0:975087cba076 13 // uLCD_4DGL is distributed in the hope that it will be useful,
jdanner3 0:975087cba076 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
jdanner3 0:975087cba076 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
jdanner3 0:975087cba076 16 // GNU General Public License for more details.
jdanner3 0:975087cba076 17 //
jdanner3 0:975087cba076 18 // You should have received a copy of the GNU General Public License
jdanner3 0:975087cba076 19 // along with uLCD_4DGL. If not, see <http://www.gnu.org/licenses/>.
jdanner3 0:975087cba076 20
jdanner3 0:975087cba076 21 // @author Stephane Rochon
jdanner3 0:975087cba076 22
jdanner3 0:975087cba076 23 #include "mbed.h"
jdanner3 0:975087cba076 24 #include "time.h"
jdanner3 0:975087cba076 25 #include "rtos.h"
jdanner3 0:975087cba076 26 #include "SDFileSystem.h"
jdanner3 0:975087cba076 27 #include <fstream>
jdanner3 0:975087cba076 28 #include <cstring>
jdanner3 0:975087cba076 29
jdanner3 0:975087cba076 30 // Debug Verbose off - SGE commands echoed to USB serial for debugmode=1
jdanner3 0:975087cba076 31 #ifndef DEBUGMODE
jdanner3 0:975087cba076 32 #define DEBUGMODE 0
jdanner3 0:975087cba076 33 #endif
jdanner3 0:975087cba076 34
jdanner3 0:975087cba076 35 #ifndef MYDEBUG
jdanner3 0:975087cba076 36 #define MYDEBUG 0
jdanner3 0:975087cba076 37 #endif
jdanner3 0:975087cba076 38
jdanner3 0:975087cba076 39 // Common WAIT value in milliseconds between commands
jdanner3 0:975087cba076 40 #define TEMPO 0
jdanner3 0:975087cba076 41
jdanner3 0:975087cba076 42 // 4DGL SGE Function values for Goldelox Processor
jdanner3 0:975087cba076 43 #define CLS '\xD7'
jdanner3 0:975087cba076 44 #define BAUDRATE '\x0B' //null prefix
jdanner3 0:975087cba076 45 #define VERSION '\x08' //null prefix
jdanner3 0:975087cba076 46 #define BCKGDCOLOR '\x6E'
jdanner3 0:975087cba076 47 #define TXTBCKGDCOLOR '\x7E'
jdanner3 0:975087cba076 48 #define DISPCONTROL '\x68'
jdanner3 0:975087cba076 49 #define SETVOLUME '\x76'
jdanner3 0:975087cba076 50 #define CIRCLE '\xCD'
jdanner3 0:975087cba076 51 #define FCIRCLE '\xCC'
jdanner3 0:975087cba076 52 #define TRIANGLE '\xC9'
jdanner3 0:975087cba076 53 #define LINE '\xD2'
jdanner3 0:975087cba076 54 #define FRECTANGLE '\xCE'
jdanner3 0:975087cba076 55 #define RECTANGLE '\xCF'
jdanner3 0:975087cba076 56 #define ELLIPSE '\x65' //na
jdanner3 0:975087cba076 57 #define PIXEL '\xCB'
jdanner3 0:975087cba076 58 #define READPIXEL '\xCA'
jdanner3 0:975087cba076 59 #define SCREENCOPY '\x63' //na?
jdanner3 0:975087cba076 60 #define PENSIZE '\xD8'
jdanner3 0:975087cba076 61 #define SETFONT '\x7D'
jdanner3 0:975087cba076 62 #define TEXTMODE '\x77'
jdanner3 0:975087cba076 63 #define TEXTBOLD '\x76'
jdanner3 0:975087cba076 64 #define TEXTITALIC '\x75'
jdanner3 0:975087cba076 65 #define TEXTINVERSE '\x74'
jdanner3 0:975087cba076 66 #define TEXTUNDERLINE '\x73'
jdanner3 0:975087cba076 67 #define TEXTWIDTH '\x7C'
jdanner3 0:975087cba076 68 #define TEXTHEIGHT '\x7B'
jdanner3 0:975087cba076 69 #define TEXTCHAR '\xFE'
jdanner3 0:975087cba076 70 #define TEXTSTRING '\x06' //null prefix
jdanner3 0:975087cba076 71 #define MOVECURSOR '\xE4'
jdanner3 0:975087cba076 72 #define BLITCOM '\x0A'
jdanner3 0:975087cba076 73 #define PUTCHAR '\xFE'
jdanner3 0:975087cba076 74 #define DISPPOWER '\x66'
jdanner3 0:975087cba076 75 //media commands for uSD card
jdanner3 0:975087cba076 76 #define MINIT '\xB1'
jdanner3 0:975087cba076 77 #define SBADDRESS '\xB9'
jdanner3 0:975087cba076 78 #define SSADDRESS '\xB8'
jdanner3 0:975087cba076 79 #define READBYTE '\xB7'
jdanner3 0:975087cba076 80 #define READWORD '\xB6'
jdanner3 0:975087cba076 81 #define WRITEBYTE '\xB5'
jdanner3 0:975087cba076 82 #define WRITEWORD '\xB4'
jdanner3 0:975087cba076 83 #define FLUSHMEDIA '\xB2'
jdanner3 0:975087cba076 84 #define DISPLAYIMAGE '\xB3'
jdanner3 0:975087cba076 85 #define DISPLAYVIDEO '\xBB'
jdanner3 0:975087cba076 86 #define DISPLAYFRAME '\xBA'
jdanner3 0:975087cba076 87
jdanner3 0:975087cba076 88
jdanner3 0:975087cba076 89
jdanner3 0:975087cba076 90 // Screen answers
jdanner3 0:975087cba076 91 #define ACK '\x06'
jdanner3 0:975087cba076 92 #define NAK '\x15'
jdanner3 0:975087cba076 93
jdanner3 0:975087cba076 94
jdanner3 0:975087cba076 95
jdanner3 0:975087cba076 96 // Screen states
jdanner3 0:975087cba076 97 #define OFF '\x00'
jdanner3 0:975087cba076 98 #define ON '\x01'
jdanner3 0:975087cba076 99
jdanner3 0:975087cba076 100 // Graphics modes
jdanner3 0:975087cba076 101 #define SOLID '\x00'
jdanner3 0:975087cba076 102 #define WIREFRAME '\x01'
jdanner3 0:975087cba076 103
jdanner3 0:975087cba076 104 // Text modes
jdanner3 0:975087cba076 105 #define TRANSPARENT '\x00'
jdanner3 0:975087cba076 106 #define OPAQUE '\x01'
jdanner3 0:975087cba076 107
jdanner3 0:975087cba076 108 // Fonts Sizes
jdanner3 0:975087cba076 109 #define FONT_7X8 '\x00' //only builtin font
jdanner3 0:975087cba076 110 #define FONT_5X7 '\x04'
jdanner3 0:975087cba076 111 #define FONT_8X8 '\x01'
jdanner3 0:975087cba076 112 #define FONT_8X12 '\x02'
jdanner3 0:975087cba076 113 #define FONT_12X16 '\x03'
jdanner3 0:975087cba076 114 #define MEDIAFONT '\x07'
jdanner3 0:975087cba076 115
jdanner3 0:975087cba076 116
jdanner3 0:975087cba076 117 // Data speed
jdanner3 0:975087cba076 118 #define BAUD_110 27271
jdanner3 0:975087cba076 119 #define BAUD_300 9999
jdanner3 0:975087cba076 120 #define BAUD_600 4999
jdanner3 0:975087cba076 121 #define BAUD_1200 2499
jdanner3 0:975087cba076 122 #define BAUD_2400 1249
jdanner3 0:975087cba076 123 #define BAUD_4800 624
jdanner3 0:975087cba076 124 #define BAUD_9600 312
jdanner3 0:975087cba076 125 #define BAUD_14400 207
jdanner3 0:975087cba076 126 #define BAUD_19200 155
jdanner3 0:975087cba076 127 #define BAUD_31250 95
jdanner3 0:975087cba076 128 #define BAUD_38400 77
jdanner3 0:975087cba076 129 #define BAUD_56000 53
jdanner3 0:975087cba076 130 #define BAUD_57600 51
jdanner3 0:975087cba076 131 #define BAUD_115200 25
jdanner3 0:975087cba076 132 #define BAUD_128000 22
jdanner3 0:975087cba076 133 #define BAUD_256000 11
jdanner3 0:975087cba076 134 #define BAUD_300000 10
jdanner3 0:975087cba076 135 #define BAUD_375000 8
jdanner3 0:975087cba076 136 #define BAUD_500000 6
jdanner3 0:975087cba076 137 #define BAUD_600000 4
jdanner3 0:975087cba076 138 #define BAUD_750000 3
jdanner3 0:975087cba076 139 #define BAUD_1000000 2
jdanner3 0:975087cba076 140 #define BAUD_1500000 1
jdanner3 0:975087cba076 141 #define BAUD_3000000 0
jdanner3 0:975087cba076 142
jdanner3 0:975087cba076 143 // Defined Colors
jdanner3 0:975087cba076 144 #define WHITE 0xFFFFFF
jdanner3 0:975087cba076 145 #define BLACK 0x000000
jdanner3 0:975087cba076 146 #define RED 0xFF0000
jdanner3 0:975087cba076 147 #define GREEN 0x00FF00
jdanner3 0:975087cba076 148 #define BLUE 0x0000FF
jdanner3 0:975087cba076 149 #define LGREY 0xBFBFBF
jdanner3 0:975087cba076 150 #define DGREY 0x5F5F5F
jdanner3 0:975087cba076 151
jdanner3 0:975087cba076 152 // Mode data
jdanner3 0:975087cba076 153 #define BACKLIGHT '\x00'
jdanner3 0:975087cba076 154 #define DISPLAY '\x01'
jdanner3 0:975087cba076 155 #define CONTRAST '\x02'
jdanner3 0:975087cba076 156 #define POWER '\x03'
jdanner3 0:975087cba076 157 #define ORIENTATION '\x04'
jdanner3 0:975087cba076 158 #define TOUCH_CTRL '\x05'
jdanner3 0:975087cba076 159 #define IMAGE_FORMAT '\x06'
jdanner3 0:975087cba076 160 #define PROTECT_FAT '\x08'
jdanner3 0:975087cba076 161
jdanner3 0:975087cba076 162 // change this to your specific screen (newer versions) if needed
jdanner3 0:975087cba076 163 // Startup orientation is PORTRAIT so SIZE_X must be lesser than SIZE_Y
jdanner3 0:975087cba076 164 //uLCD144-G2 is a 128 by 128 pixel display
jdanner3 0:975087cba076 165 #define SIZE_X 128
jdanner3 0:975087cba076 166 #define SIZE_Y 128
jdanner3 0:975087cba076 167
jdanner3 0:975087cba076 168 #define IS_LANDSCAPE 0
jdanner3 0:975087cba076 169 #define IS_PORTRAIT 1
jdanner3 0:975087cba076 170
jdanner3 0:975087cba076 171 // Screen orientation
jdanner3 0:975087cba076 172 #define LANDSCAPE '\x00'
jdanner3 0:975087cba076 173 #define LANDSCAPE_R '\x01'
jdanner3 0:975087cba076 174 #define PORTRAIT '\x02'
jdanner3 0:975087cba076 175 #define PORTRAIT_R '\x03'
jdanner3 0:975087cba076 176
jdanner3 0:975087cba076 177 // Parameters
jdanner3 0:975087cba076 178 #define ENABLE '\x00'
jdanner3 0:975087cba076 179 #define DISABLE '\x01'
jdanner3 0:975087cba076 180 #define RESET '\x02'
jdanner3 0:975087cba076 181
jdanner3 0:975087cba076 182 #define NEW '\x00'
jdanner3 0:975087cba076 183 #define OLD '\x01'
jdanner3 0:975087cba076 184
jdanner3 0:975087cba076 185 #define DOWN '\x00'
jdanner3 0:975087cba076 186 #define UP '\x01'
jdanner3 0:975087cba076 187
jdanner3 0:975087cba076 188 #define PROTECT '\x00'
jdanner3 0:975087cba076 189 #define UNPROTECT '\x02'
jdanner3 0:975087cba076 190
jdanner3 0:975087cba076 191 //**************************************************************************
jdanner3 0:975087cba076 192 // \class uLCD_4DGL uLCD_4DGL.h
jdanner3 0:975087cba076 193 // \brief This is the main class. It shoud be used like this : uLCD_4GDL myLCD(p9,p10,p11);
jdanner3 0:975087cba076 194 /**
jdanner3 0:975087cba076 195 Example:
jdanner3 0:975087cba076 196 * @code
jdanner3 0:975087cba076 197 * // Display a white circle on the screen
jdanner3 0:975087cba076 198 * #include "mbed.h"
jdanner3 0:975087cba076 199 * #include " uLCD_4DGL.h"
jdanner3 0:975087cba076 200 *
jdanner3 0:975087cba076 201 * uLCD_4GDL myLCD(p9,p10,p11);
jdanner3 0:975087cba076 202 *
jdanner3 0:975087cba076 203 * int main() {
jdanner3 0:975087cba076 204 * myLCD.circle(120, 160, 80, WHITE);
jdanner3 0:975087cba076 205 * }
jdanner3 0:975087cba076 206 * @endcode
jdanner3 0:975087cba076 207 */
jdanner3 0:975087cba076 208 class uLCD_4DGL : public Stream
jdanner3 0:975087cba076 209 {
jdanner3 0:975087cba076 210 public :
jdanner3 0:975087cba076 211 uLCD_4DGL(PinName tx, PinName rx, PinName rst);
jdanner3 0:975087cba076 212
jdanner3 0:975087cba076 213 // General Commands *******************************************************************************
jdanner3 0:975087cba076 214
jdanner3 0:975087cba076 215 /** Clear the entire screen using the current background colour */
jdanner3 0:975087cba076 216 void cls();
jdanner3 0:975087cba076 217
jdanner3 0:975087cba076 218 /** Reset screen */
jdanner3 0:975087cba076 219 void reset();
jdanner3 0:975087cba076 220
jdanner3 0:975087cba076 221
jdanner3 0:975087cba076 222 /** Set serial Baud rate (both sides : screen and mbed)
jdanner3 0:975087cba076 223 * @param Speed Correct BAUD value (see uLCD_4DGL.h)
jdanner3 0:975087cba076 224 */
jdanner3 0:975087cba076 225 void baudrate(int speed);
jdanner3 0:975087cba076 226
jdanner3 0:975087cba076 227 /** Set background colour to the specified value
jdanner3 0:975087cba076 228 * @param color in HEX RGB like 0xFF00FF
jdanner3 0:975087cba076 229 */
jdanner3 0:975087cba076 230 void background_color(int color);
jdanner3 0:975087cba076 231
jdanner3 0:975087cba076 232 /** Set screen display mode to specific values
jdanner3 0:975087cba076 233 * @param mode See 4DGL documentation
jdanner3 0:975087cba076 234 * @param value See 4DGL documentation
jdanner3 0:975087cba076 235 */
jdanner3 0:975087cba076 236 void textbackground_color(int color);
jdanner3 0:975087cba076 237
jdanner3 0:975087cba076 238 /** Set screen display mode to specific values
jdanner3 0:975087cba076 239 * @param mode See 4DGL documentation
jdanner3 0:975087cba076 240 * @param value See 4DGL documentation
jdanner3 0:975087cba076 241 */
jdanner3 0:975087cba076 242 void display_control(char mode);
jdanner3 0:975087cba076 243 void display_power(char mode);
jdanner3 0:975087cba076 244 /** Set internal speaker to specified value
jdanner3 0:975087cba076 245 * @param value Correct range is 8 - 127
jdanner3 0:975087cba076 246 */
jdanner3 0:975087cba076 247 void set_volume(char value);
jdanner3 0:975087cba076 248
jdanner3 0:975087cba076 249 // Graphics Commands *******************************************************************************
jdanner3 0:975087cba076 250
jdanner3 0:975087cba076 251 /** Draw a circle centered at x,y with a radius and a colour. It uses Pen Size stored value to draw a solid or wireframe circle
jdanner3 0:975087cba076 252 * @param x Horizontal position of the circle centre
jdanner3 0:975087cba076 253 * @param y Vertical position of the circle centre
jdanner3 0:975087cba076 254 * @param radius Radius of the circle
jdanner3 0:975087cba076 255 * @param color Circle color in HEX RGB like 0xFF00FF
jdanner3 0:975087cba076 256 */
jdanner3 0:975087cba076 257 void circle(int x , int y , int radius, int color, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 258 void filled_circle(int x , int y , int radius, int color, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 259 void triangle(int, int, int, int, int, int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 260 void line(int, int, int, int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 261 void rectangle(int, int, int, int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 262 void filled_rectangle(int, int, int, int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 263 void pixel(int, int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 264 int read_pixel(int, int);
jdanner3 0:975087cba076 265 void pen_size(char);
jdanner3 0:975087cba076 266 void BLIT(int x, int y, int w, int h, int *colors, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 267
jdanner3 0:975087cba076 268 // Text Commands
jdanner3 0:975087cba076 269 void set_font(char);
jdanner3 0:975087cba076 270 void set_font_size(char width, char height);
jdanner3 0:975087cba076 271 void text_mode(char);
jdanner3 0:975087cba076 272 void text_bold(char);
jdanner3 0:975087cba076 273 void text_italic(char);
jdanner3 0:975087cba076 274 void text_inverse(char);
jdanner3 0:975087cba076 275 void text_underline(char);
jdanner3 0:975087cba076 276 void text_width(char);
jdanner3 0:975087cba076 277 void text_height(char);
jdanner3 0:975087cba076 278 void text_char(char, char, char, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 279 void text_string(char *, char, char, char, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 280 void locate(char, char, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 281 void color(int);
jdanner3 0:975087cba076 282 void putc(char, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 283 void puts(char *, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 284
jdanner3 0:975087cba076 285 //Media Commands
jdanner3 0:975087cba076 286 int media_init();
jdanner3 0:975087cba076 287 void set_byte_address(int, int);
jdanner3 0:975087cba076 288 void set_sector_address(int, int);
jdanner3 0:975087cba076 289 char read_byte();
jdanner3 0:975087cba076 290 int read_word();
jdanner3 0:975087cba076 291 void write_byte(int);
jdanner3 0:975087cba076 292 void write_word(int);
jdanner3 0:975087cba076 293 void flush_media();
jdanner3 0:975087cba076 294 void display_image(int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 295 void display_video(int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 296 void display_frame(int, int, int, bool isScreenSaverCommand=false);
jdanner3 0:975087cba076 297
jdanner3 0:975087cba076 298 // Screensaver commands
jdanner3 0:975087cba076 299 void checkActiveScreenTime();
jdanner3 0:975087cba076 300 void setActiveScreenInterval(int newInterval);
jdanner3 0:975087cba076 301 int getActiveScreenInterval();
jdanner3 0:975087cba076 302 void reportScreenInteraction();
jdanner3 0:975087cba076 303 bool isInScreensaverMode();
jdanner3 0:975087cba076 304 void enableScreensaverMode();
jdanner3 0:975087cba076 305 void exitScreensaverMode();
jdanner3 0:975087cba076 306 void backupStateOfScreen();
jdanner3 0:975087cba076 307 void restoreStateOfScreen();
jdanner3 0:975087cba076 308
jdanner3 0:975087cba076 309 // Screen Data
jdanner3 0:975087cba076 310 int type;
jdanner3 0:975087cba076 311 int revision;
jdanner3 0:975087cba076 312 int firmware;
jdanner3 0:975087cba076 313 int reserved1;
jdanner3 0:975087cba076 314 int reserved2;
jdanner3 0:975087cba076 315 time_t now;
jdanner3 0:975087cba076 316 time_t lastDisplayActivityTime;
jdanner3 0:975087cba076 317 time_t lastScreensaverInit;
jdanner3 0:975087cba076 318 int max_active_screen_interval;
jdanner3 0:975087cba076 319 bool inScreensaverMode;
jdanner3 0:975087cba076 320 bool inScreensaverHysteresis;
jdanner3 0:975087cba076 321 SDFileSystem sd; // mosi, miso, sclk, cs
jdanner3 0:975087cba076 322
jdanner3 0:975087cba076 323 // Text data
jdanner3 0:975087cba076 324 char current_col;
jdanner3 0:975087cba076 325 char current_row;
jdanner3 0:975087cba076 326 int current_color;
jdanner3 0:975087cba076 327 char current_font;
jdanner3 0:975087cba076 328 char current_orientation;
jdanner3 0:975087cba076 329 char max_col;
jdanner3 0:975087cba076 330 char max_row;
jdanner3 0:975087cba076 331 int current_w, current_h;
jdanner3 0:975087cba076 332 int current_fx, current_fy;
jdanner3 0:975087cba076 333 int current_wf, current_hf;
jdanner3 0:975087cba076 334
jdanner3 0:975087cba076 335
jdanner3 0:975087cba076 336 protected :
jdanner3 0:975087cba076 337
jdanner3 0:975087cba076 338 Serial _cmd;
jdanner3 0:975087cba076 339 DigitalOut _rst;
jdanner3 0:975087cba076 340 //used by printf
jdanner3 0:975087cba076 341 virtual int _putc(int c) {
jdanner3 0:975087cba076 342 putc(c, false);
jdanner3 0:975087cba076 343 return 0;
jdanner3 0:975087cba076 344 };
jdanner3 0:975087cba076 345 virtual int _getc() {
jdanner3 0:975087cba076 346 return -1;
jdanner3 0:975087cba076 347 }
jdanner3 0:975087cba076 348
jdanner3 0:975087cba076 349 void freeBUFFER (void);
jdanner3 0:975087cba076 350 void writeBYTE (char);
jdanner3 0:975087cba076 351 void writeBYTEfast (char);
jdanner3 0:975087cba076 352 int writeCOMMAND(char *, int);
jdanner3 0:975087cba076 353 int writeCOMMANDnull(char *, int);
jdanner3 0:975087cba076 354 int readVERSION (char *, int);
jdanner3 0:975087cba076 355 int getSTATUS (char *, int);
jdanner3 0:975087cba076 356 int version (void);
jdanner3 0:975087cba076 357 Serial pc;
jdanner3 0:975087cba076 358 };
jdanner3 0:975087cba076 359
jdanner3 0:975087cba076 360 typedef unsigned char BYTE;
jdanner3 0:975087cba076 361
jdanner3 0:975087cba076 362
jdanner3 0:975087cba076 363
jdanner3 0:975087cba076 364
jdanner3 0:975087cba076 365
jdanner3 0:975087cba076 366
jdanner3 0:975087cba076 367
jdanner3 0:975087cba076 368