Brickbreaker

Dependencies:   NokiaLCD PS2 mbed

Fork of Pong by William Johnston

Committer:
ipapp3
Date:
Mon Apr 29 18:17:51 2013 +0000
Revision:
4:f3ac45fa2196
Parent:
3:e1328f84b107
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wjohnsto 0:93dce1e528b9 1 #include "mbed.h"
wjohnsto 0:93dce1e528b9 2 #include "NokiaLCD.h"
wjohnsto 0:93dce1e528b9 3 #include "PS2Keyboard.h"
wjohnsto 0:93dce1e528b9 4 #include "ball.h"
wjohnsto 0:93dce1e528b9 5 #include "paddle.h"
ipapp3 3:e1328f84b107 6 #include "block.h"
wjohnsto 0:93dce1e528b9 7
wjohnsto 1:3cc8b1413557 8 // State enumerator
wjohnsto 0:93dce1e528b9 9 typedef enum {
ipapp3 3:e1328f84b107 10 RESET1, RESET2, RUN, PAUSE, WIN
wjohnsto 0:93dce1e528b9 11 } STATES;
wjohnsto 0:93dce1e528b9 12
wjohnsto 0:93dce1e528b9 13 NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type
wjohnsto 0:93dce1e528b9 14
wjohnsto 0:93dce1e528b9 15 PS2Keyboard ps2kb(p12, p11); // CLK, DAT
wjohnsto 0:93dce1e528b9 16
wjohnsto 0:93dce1e528b9 17 DigitalIn sw2(p24);
wjohnsto 0:93dce1e528b9 18 DigitalIn sw1(p25);
wjohnsto 0:93dce1e528b9 19
wjohnsto 0:93dce1e528b9 20 PwmOut g(p21);
wjohnsto 0:93dce1e528b9 21 PwmOut b(p22);
wjohnsto 0:93dce1e528b9 22 PwmOut r(p23);
wjohnsto 0:93dce1e528b9 23
wjohnsto 1:3cc8b1413557 24 // Button enumerator for PS/2 keyboard
ipapp3 3:e1328f84b107 25 enum BUTTONS {
ipapp3 3:e1328f84b107 26 UP = 0xe75,
ipapp3 3:e1328f84b107 27 DOWN = 0xe72,
wjohnsto 0:93dce1e528b9 28 };
wjohnsto 0:93dce1e528b9 29
ipapp3 3:e1328f84b107 30 /*
wjohnsto 1:3cc8b1413557 31 * Subroutine drawScreen:
ipapp3 3:e1328f84b107 32 * Description: Draws paddle, blocks
wjohnsto 1:3cc8b1413557 33 * and the ball.
wjohnsto 1:3cc8b1413557 34 */
ipapp3 3:e1328f84b107 35 void drawScreen(Paddle paddle1, Ball theBall, Block block1, Block block2, Block block3, Block block4,
ipapp3 3:e1328f84b107 36 Block block5, Block block6, Block block7, Block block8, Block block9,
ipapp3 3:e1328f84b107 37 Block block11, Block block12, Block block13, Block block14,
ipapp3 3:e1328f84b107 38 Block block15, Block block16, Block block17, Block block18, Block block19, bool isBlack)
ipapp3 3:e1328f84b107 39 {
ipapp3 3:e1328f84b107 40 paddle1.draw(lcd, isBlack);
ipapp3 3:e1328f84b107 41 theBall.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 42 block1.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 43 block2.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 44 block3.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 45 block4.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 46 block5.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 47 block6.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 48 block7.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 49 block8.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 50 block9.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 51 block11.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 52 block12.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 53 block13.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 54 block14.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 55 block15.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 56 block16.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 57 block17.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 58 block18.draw(lcd ,isBlack);
ipapp3 3:e1328f84b107 59 block19.draw(lcd ,isBlack);
wjohnsto 0:93dce1e528b9 60 }
wjohnsto 0:93dce1e528b9 61
ipapp3 3:e1328f84b107 62 /*
wjohnsto 1:3cc8b1413557 63 * Subroutine drawScores:
wjohnsto 1:3cc8b1413557 64 * Description: Draws the scoreboard
wjohnsto 1:3cc8b1413557 65 */
ipapp3 3:e1328f84b107 66 void drawScores(Paddle paddle1)
ipapp3 3:e1328f84b107 67 {
ipapp3 3:e1328f84b107 68 lcd.locate(6.5,0);
ipapp3 3:e1328f84b107 69 lcd.printf("%d",paddle1.getScore());
ipapp3 3:e1328f84b107 70 lcd.locate(7.5,15);
ipapp3 3:e1328f84b107 71 lcd.putc('0' + paddle1.getLives());
wjohnsto 0:93dce1e528b9 72 }
wjohnsto 0:93dce1e528b9 73
ipapp3 3:e1328f84b107 74 int main()
ipapp3 3:e1328f84b107 75 {
ipapp3 3:e1328f84b107 76 PS2Keyboard::keyboard_event_t evt_kb; // Setup keyboard interrupt
ipapp3 3:e1328f84b107 77 lcd.background(0x000000);
ipapp3 3:e1328f84b107 78 lcd.cls();
ipapp3 3:e1328f84b107 79 Paddle paddle1;
ipapp3 3:e1328f84b107 80 Ball theBall;
ipapp3 3:e1328f84b107 81 Block block1, block2, block3, block4, block5, block6, block7, block8, block9;
ipapp3 3:e1328f84b107 82 Block block11, block12, block13, block14, block15, block16, block17, block18, block19;
ipapp3 3:e1328f84b107 83 int temp, count=0;
ipapp3 3:e1328f84b107 84 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
ipapp3 3:e1328f84b107 85 block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
ipapp3 3:e1328f84b107 86 drawScores(paddle1);
ipapp3 3:e1328f84b107 87 STATES state = RESET1; // Initial state is RESET
ipapp3 3:e1328f84b107 88 while(1) {
ipapp3 3:e1328f84b107 89 switch(state) {
ipapp3 3:e1328f84b107 90 case WIN: // When palyer gets max score
ipapp3 3:e1328f84b107 91 lcd.locate(4,3);
ipapp3 3:e1328f84b107 92 lcd.printf("YOU WON!");
ipapp3 3:e1328f84b107 93 if(!sw2) { // Reset if SW2 is pressed
ipapp3 3:e1328f84b107 94 while(!sw2);
ipapp3 3:e1328f84b107 95 paddle1.setLives(3);
ipapp3 3:e1328f84b107 96 paddle1.setScore(0);
ipapp3 3:e1328f84b107 97 state = RESET1;
ipapp3 3:e1328f84b107 98 break;
ipapp3 3:e1328f84b107 99 }
ipapp3 3:e1328f84b107 100 break;
ipapp3 3:e1328f84b107 101 case RESET1: // Reset objects, draw the screen, state = PAUSE
ipapp3 3:e1328f84b107 102 lcd.cls();
ipapp3 3:e1328f84b107 103 paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
ipapp3 3:e1328f84b107 104 theBall = Ball(6,57,5,5,0xFFFF00,1,1);
ipapp3 3:e1328f84b107 105 block1 = Block(125,10,5,20,0x00FF00);
ipapp3 3:e1328f84b107 106 block2 = Block(125,40,5,20,0xFF0000);
ipapp3 3:e1328f84b107 107 block3 = Block(125,70,5,20,0xFFEE00);
ipapp3 3:e1328f84b107 108 block4 = Block(125,100,5,20,0x00FFFF);
ipapp3 3:e1328f84b107 109 block5 = Block(113,5,5,20,0x00FF00);
ipapp3 3:e1328f84b107 110 block6 = Block(113,30,5,20,0xFF0000);
ipapp3 3:e1328f84b107 111 block7 = Block(113,55,5,20,0xFFFFFF);
ipapp3 3:e1328f84b107 112 block8 = Block(113,80,5,20,0xFFEE00);
ipapp3 3:e1328f84b107 113 block9 = Block(113,105,5,20,0x00FFFF);
ipapp3 3:e1328f84b107 114 block11 = Block(101,10,5,20,0xFF0000);
ipapp3 3:e1328f84b107 115 block12 = Block(101,40,5,20,0x00FF00);
ipapp3 3:e1328f84b107 116 block13 = Block(101,70,5,20,0x00FFFF);
ipapp3 3:e1328f84b107 117 block14 = Block(101,100,5,20,0xFFEE00);
ipapp3 3:e1328f84b107 118 block15 = Block(89,5,5,20,0xFF0000);
ipapp3 3:e1328f84b107 119 block16 = Block(89,30,5,20,0x00FF00);
ipapp3 3:e1328f84b107 120 block17 = Block(89,55,5,20,0xFFFFFF);
ipapp3 3:e1328f84b107 121 block18 = Block(89,80,5,20,0x00FFFF);
ipapp3 3:e1328f84b107 122 block19 = Block(89,105,5,20,0xFFEE00);
ipapp3 3:e1328f84b107 123 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
ipapp3 3:e1328f84b107 124 block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
ipapp3 3:e1328f84b107 125 drawScores(paddle1);
ipapp3 3:e1328f84b107 126 state = PAUSE;
ipapp3 3:e1328f84b107 127 break;
ipapp3 3:e1328f84b107 128 case RESET2: // Reset objects, draw the screen, state = PAUSE
ipapp3 3:e1328f84b107 129 lcd.cls();
ipapp3 3:e1328f84b107 130 paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
ipapp3 3:e1328f84b107 131 theBall = Ball(6,57,5,5,0xFFFF00,1,1);
ipapp3 3:e1328f84b107 132 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
ipapp3 3:e1328f84b107 133 block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
ipapp3 3:e1328f84b107 134 drawScores(paddle1);
ipapp3 3:e1328f84b107 135 state = PAUSE;
ipapp3 3:e1328f84b107 136 break;
ipapp3 3:e1328f84b107 137 case PAUSE: // Set RGB LED to Red, wait for switch input
ipapp3 3:e1328f84b107 138 r = 0;
ipapp3 3:e1328f84b107 139 b = g = 1;
ipapp3 3:e1328f84b107 140 if(!sw2) {
ipapp3 3:e1328f84b107 141 while(!sw2);
ipapp3 3:e1328f84b107 142 paddle1.setLives(3);
ipapp3 3:e1328f84b107 143 paddle1.setScore(0);
ipapp3 3:e1328f84b107 144 state = RESET1;
ipapp3 3:e1328f84b107 145 break;
ipapp3 3:e1328f84b107 146 }
ipapp3 3:e1328f84b107 147 if(!sw1) {
ipapp3 3:e1328f84b107 148 while(!sw1);
ipapp3 3:e1328f84b107 149 state = RUN;
ipapp3 3:e1328f84b107 150 }
ipapp3 3:e1328f84b107 151 break;
ipapp3 3:e1328f84b107 152 case RUN: // Set RGB LED to Blue and run program
ipapp3 3:e1328f84b107 153 r = g = 1;
ipapp3 3:e1328f84b107 154 b = 0;
ipapp3 3:e1328f84b107 155 if(!sw2) { // Reset if SW2 is pressed
ipapp3 3:e1328f84b107 156 while(!sw2);
ipapp3 3:e1328f84b107 157 paddle1.setLives(3);
ipapp3 3:e1328f84b107 158 paddle1.setScore(0);
ipapp3 3:e1328f84b107 159 state = RESET1;
ipapp3 3:e1328f84b107 160 break;
ipapp3 3:e1328f84b107 161 }
ipapp3 3:e1328f84b107 162 if(!sw1) { // Pause if SW1 is pressed
ipapp3 3:e1328f84b107 163 while(!sw1);
ipapp3 3:e1328f84b107 164 state = PAUSE;
ipapp3 3:e1328f84b107 165 break;
ipapp3 3:e1328f84b107 166 }
ipapp3 3:e1328f84b107 167 if (ps2kb.processing(&evt_kb)) { // Executes if a key is pressed
ipapp3 3:e1328f84b107 168 temp = evt_kb.scancode[0];
ipapp3 3:e1328f84b107 169 for (int i = 1; i < evt_kb.length; i++) { // Parse keyboard input into a key
ipapp3 3:e1328f84b107 170 temp <<= 4;
ipapp3 3:e1328f84b107 171 temp |= evt_kb.scancode[i];
ipapp3 3:e1328f84b107 172 }
ipapp3 3:e1328f84b107 173 switch(temp) { // Use key enumerator to move paddle1
ipapp3 3:e1328f84b107 174 case UP:
ipapp3 3:e1328f84b107 175 if(paddle1.getY()>2)
ipapp3 3:e1328f84b107 176 paddle1.move(lcd, -2);
ipapp3 3:e1328f84b107 177 break;
ipapp3 3:e1328f84b107 178 case DOWN:
ipapp3 3:e1328f84b107 179 if(paddle1.getY()+paddle1.getHeight()<128)
ipapp3 3:e1328f84b107 180 paddle1.move(lcd, 2);
ipapp3 3:e1328f84b107 181 break;
ipapp3 3:e1328f84b107 182 }
ipapp3 3:e1328f84b107 183
ipapp3 3:e1328f84b107 184
ipapp3 3:e1328f84b107 185 }
ipapp3 3:e1328f84b107 186
ipapp3 3:e1328f84b107 187 if(++count==3) { // Only move the ball once every 4 times through the loop
ipapp3 3:e1328f84b107 188 count = 0;
ipapp3 3:e1328f84b107 189 if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight()))
ipapp3 3:e1328f84b107 190 theBall.reverseX();
ipapp3 3:e1328f84b107 191 if(theBall.hitB1((block1.getX()+block1.getWidth()), block1.getY(), block1.getHeight())) {
ipapp3 3:e1328f84b107 192 theBall.reverseX();
ipapp3 3:e1328f84b107 193 paddle1.addPoints(25);
ipapp3 3:e1328f84b107 194 block1.move(lcd, -100);
ipapp3 3:e1328f84b107 195 }
ipapp3 3:e1328f84b107 196 if(theBall.hitB1((block2.getX()+block2.getWidth()), block2.getY(), block2.getHeight())) {
ipapp3 3:e1328f84b107 197 theBall.reverseX();
ipapp3 3:e1328f84b107 198 paddle1.addPoints(25);
ipapp3 3:e1328f84b107 199 block2.move(lcd, -100);
ipapp3 3:e1328f84b107 200 }
ipapp3 3:e1328f84b107 201 if(theBall.hitB1((block3.getX()+block3.getWidth()), block3.getY(), block3.getHeight())) {
ipapp3 3:e1328f84b107 202 theBall.reverseX();
ipapp3 3:e1328f84b107 203 paddle1.addPoints(25);
ipapp3 3:e1328f84b107 204 block3.move(lcd, -100);
ipapp3 3:e1328f84b107 205 }
ipapp3 3:e1328f84b107 206 if(theBall.hitB1((block4.getX()+block4.getWidth()), block4.getY(), block4.getHeight())) {
ipapp3 3:e1328f84b107 207 theBall.reverseX();
ipapp3 3:e1328f84b107 208 paddle1.addPoints(25);
ipapp3 3:e1328f84b107 209 block4.move(lcd, -200);
ipapp3 3:e1328f84b107 210 }
ipapp3 3:e1328f84b107 211 if(theBall.hitB1((block5.getX()+block5.getWidth()), block5.getY(), block5.getHeight())) {
ipapp3 3:e1328f84b107 212 theBall.reverseX();
ipapp3 3:e1328f84b107 213 paddle1.addPoints(20);
ipapp3 3:e1328f84b107 214 block5.move(lcd, -100);
ipapp3 3:e1328f84b107 215 }
ipapp3 3:e1328f84b107 216 if(theBall.hitB1((block6.getX()+block6.getWidth()), block6.getY(), block6.getHeight())) {
ipapp3 3:e1328f84b107 217 theBall.reverseX();
ipapp3 3:e1328f84b107 218 paddle1.addPoints(20);
ipapp3 3:e1328f84b107 219 block6.move(lcd, -100);
ipapp3 3:e1328f84b107 220 }
ipapp3 3:e1328f84b107 221 if(theBall.hitB1((block7.getX()+block7.getWidth()), block7.getY(), block7.getHeight())) {
ipapp3 3:e1328f84b107 222 theBall.reverseX();
ipapp3 3:e1328f84b107 223 paddle1.addPoints(20);
ipapp3 3:e1328f84b107 224 block7.move(lcd, -100);
ipapp3 3:e1328f84b107 225 }
ipapp3 3:e1328f84b107 226 if(theBall.hitB1((block8.getX()+block8.getWidth()), block8.getY(), block8.getHeight())) {
ipapp3 3:e1328f84b107 227 theBall.reverseX();
ipapp3 3:e1328f84b107 228 paddle1.addPoints(20);
ipapp3 3:e1328f84b107 229 block8.move(lcd, -200);
ipapp3 3:e1328f84b107 230 }
ipapp3 3:e1328f84b107 231 if(theBall.hitB1((block9.getX()+block9.getWidth()), block9.getY(), block9.getHeight())) {
ipapp3 3:e1328f84b107 232 theBall.reverseX();
ipapp3 3:e1328f84b107 233 paddle1.addPoints(20);
ipapp3 3:e1328f84b107 234 block9.move(lcd, -200);
ipapp3 3:e1328f84b107 235 }
ipapp3 3:e1328f84b107 236 if(theBall.hitB1((block11.getX()+block11.getWidth()), block11.getY(), block11.getHeight())) {
ipapp3 3:e1328f84b107 237 theBall.reverseX();
ipapp3 3:e1328f84b107 238 paddle1.addPoints(15);
ipapp3 3:e1328f84b107 239 block11.move(lcd, -100);
ipapp3 3:e1328f84b107 240 }
ipapp3 3:e1328f84b107 241 if(theBall.hitB1((block12.getX()+block12.getWidth()), block12.getY(), block12.getHeight())) {
ipapp3 3:e1328f84b107 242 theBall.reverseX();
ipapp3 3:e1328f84b107 243 paddle1.addPoints(15);
ipapp3 3:e1328f84b107 244 block12.move(lcd, -100);
ipapp3 3:e1328f84b107 245 }
ipapp3 3:e1328f84b107 246 if(theBall.hitB1((block13.getX()+block13.getWidth()), block13.getY(), block13.getHeight())) {
ipapp3 3:e1328f84b107 247 theBall.reverseX();
ipapp3 3:e1328f84b107 248 paddle1.addPoints(15);
ipapp3 3:e1328f84b107 249 block13.move(lcd, -100);
ipapp3 3:e1328f84b107 250 }
ipapp3 3:e1328f84b107 251 if(theBall.hitB1((block14.getX()+block14.getWidth()), block14.getY(), block14.getHeight())) {
ipapp3 3:e1328f84b107 252 theBall.reverseX();
ipapp3 3:e1328f84b107 253 paddle1.addPoints(15);
ipapp3 3:e1328f84b107 254 block14.move(lcd, -200);
ipapp3 3:e1328f84b107 255 }
ipapp3 3:e1328f84b107 256 if(theBall.hitB1((block15.getX()+block15.getWidth()), block15.getY(), block15.getHeight())) {
ipapp3 3:e1328f84b107 257 theBall.reverseX();
ipapp3 3:e1328f84b107 258 paddle1.addPoints(10);
ipapp3 3:e1328f84b107 259 block15.move(lcd, -100);
ipapp3 3:e1328f84b107 260 }
ipapp3 3:e1328f84b107 261 if(theBall.hitB1((block16.getX()+block16.getWidth()), block16.getY(), block16.getHeight())) {
ipapp3 3:e1328f84b107 262 theBall.reverseX();
ipapp3 3:e1328f84b107 263 paddle1.addPoints(10);
ipapp3 3:e1328f84b107 264 block16.move(lcd, -100);
ipapp3 3:e1328f84b107 265 }
ipapp3 3:e1328f84b107 266 if(theBall.hitB1((block17.getX()+block17.getWidth()), block17.getY(), block17.getHeight())) {
ipapp3 3:e1328f84b107 267 theBall.reverseX();
ipapp3 3:e1328f84b107 268 paddle1.addPoints(10);
ipapp3 3:e1328f84b107 269 block17.move(lcd, -100);
ipapp3 3:e1328f84b107 270 }
ipapp3 3:e1328f84b107 271 if(theBall.hitB1((block18.getX()+block18.getWidth()), block18.getY(), block18.getHeight())) {
ipapp3 3:e1328f84b107 272 theBall.reverseX();
ipapp3 3:e1328f84b107 273 paddle1.addPoints(10);
ipapp3 3:e1328f84b107 274 block18.move(lcd, -200);
ipapp3 3:e1328f84b107 275 }
ipapp3 3:e1328f84b107 276 if(theBall.hitB1((block19.getX()+block19.getWidth()), block19.getY(), block19.getHeight())) {
ipapp3 3:e1328f84b107 277 theBall.reverseX();
ipapp3 3:e1328f84b107 278 paddle1.addPoints(10);
ipapp3 3:e1328f84b107 279 block19.move(lcd, -200);
ipapp3 3:e1328f84b107 280 }
ipapp3 3:e1328f84b107 281 if(theBall.hitX()) { // If the ball hits one of the sides of the screen
ipapp3 3:e1328f84b107 282 if(theBall.getX()<7) { // If the ball hit paddle1's side
ipapp3 3:e1328f84b107 283 if(!paddle1.loseLife()) { // If paddle1 has no more lives
ipapp3 3:e1328f84b107 284 paddle1.setLives(3);
ipapp3 3:e1328f84b107 285 paddle1.setScore(0);
ipapp3 3:e1328f84b107 286 state = RESET1; // Reset the objects
ipapp3 3:e1328f84b107 287 break;
ipapp3 3:e1328f84b107 288 }
ipapp3 3:e1328f84b107 289 state = RESET2; // Reset the objects
ipapp3 3:e1328f84b107 290 }
ipapp3 3:e1328f84b107 291 theBall.reverseX();
ipapp3 3:e1328f84b107 292 }
ipapp3 3:e1328f84b107 293 if(theBall.hitY())
ipapp3 3:e1328f84b107 294 theBall.reverseY();
ipapp3 3:e1328f84b107 295 theBall.move(lcd);
ipapp3 3:e1328f84b107 296 }
ipapp3 3:e1328f84b107 297 if(paddle1.getScore()==310) {
ipapp3 3:e1328f84b107 298 state=WIN;
ipapp3 3:e1328f84b107 299 }
ipapp3 3:e1328f84b107 300 break;
wjohnsto 0:93dce1e528b9 301 }
ipapp3 3:e1328f84b107 302 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
ipapp3 3:e1328f84b107 303 block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
ipapp3 3:e1328f84b107 304 drawScores(paddle1);
wjohnsto 0:93dce1e528b9 305 }
wjohnsto 0:93dce1e528b9 306 }