Rihards Balass / 4DGL-mbed-32PTU
Committer:
CaptainR
Date:
Tue Sep 13 11:37:04 2016 +0000
Revision:
11:3ebd2263f3e9
Parent:
6:a1a85f2bc04b
Child:
12:29f5ad896382
background color, outline color, contrast, frame delay, transparency, transparent color, set graphics parameters, get graphics parameters

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CaptainR 0:a5ef6bc3c2e8 1 //
CaptainR 2:81eaaa491a02 2 // Picaso_4DGL-32PTU is a class to drive 4D Systems TFT touch screens with PICASO processor
CaptainR 2:81eaaa491a02 3 // Tested with NUCLEO L152RE development board
CaptainR 2:81eaaa491a02 4 // Copyright (C) <2016> Rihards Balass <rihards.balass@gmail.com>
CaptainR 0:a5ef6bc3c2e8 5 //
CaptainR 2:81eaaa491a02 6 // Picaso_4DGL-32PTU is free software: you can redistribute it and/or modify
CaptainR 2:81eaaa491a02 7 // it under the terms of the GNU General Public License as published by
CaptainR 2:81eaaa491a02 8 // the Free Software Foundation, either version 3 of the License, or
CaptainR 2:81eaaa491a02 9 // (at your option) any later version.
CaptainR 2:81eaaa491a02 10 //
CaptainR 2:81eaaa491a02 11 // Picaso_4DGL-32PTU is distributed in the hope that it will be useful,
CaptainR 2:81eaaa491a02 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
CaptainR 2:81eaaa491a02 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
CaptainR 2:81eaaa491a02 14 // GNU General Public License for more details.
CaptainR 2:81eaaa491a02 15 //
CaptainR 2:81eaaa491a02 16 // You can see GNU General Public License at <http://www.gnu.org/licenses/>.
CaptainR 0:a5ef6bc3c2e8 17 //
CaptainR 0:a5ef6bc3c2e8 18
CaptainR 0:a5ef6bc3c2e8 19 #include "mbed.h"
CaptainR 0:a5ef6bc3c2e8 20 #include "Picaso_4DGL-32PTU.h"
CaptainR 0:a5ef6bc3c2e8 21
CaptainR 4:50511ed54ab4 22 DigitalOut led1(LED1);
CaptainR 0:a5ef6bc3c2e8 23
CaptainR 0:a5ef6bc3c2e8 24 //******************************************************************************************************
CaptainR 3:dcfbceb81fef 25 PICASO_4DGL :: PICASO_4DGL(PinName tx, PinName rx, PinName rst) : pc(USBTX, USBRX), _cmd(tx, rx), _rst(rst) { // Constructor
CaptainR 4:50511ed54ab4 26
CaptainR 5:890ddd974624 27 rxBuf[RXBUFLEN] = 0; // create buffer
CaptainR 5:890ddd974624 28 index = 0;
CaptainR 5:890ddd974624 29 //trig = 0;
CaptainR 5:890ddd974624 30 _cmd.attach(this, &PICASO_4DGL::rxCallback, Serial::RxIrq); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CaptainR 5:890ddd974624 31 //responseBuild(10);
CaptainR 4:50511ed54ab4 32
CaptainR 11:3ebd2263f3e9 33 pc.baud(115200);
CaptainR 0:a5ef6bc3c2e8 34 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 35 pc.printf("\n\n\n");
CaptainR 0:a5ef6bc3c2e8 36 pc.printf("********************\n\r");
CaptainR 3:dcfbceb81fef 37 pc.printf("PICASO_4DGL CONSTRUCTOR\n\r");
CaptainR 0:a5ef6bc3c2e8 38 pc.printf("********************\n\r");
CaptainR 0:a5ef6bc3c2e8 39 #endif
CaptainR 0:a5ef6bc3c2e8 40
CaptainR 0:a5ef6bc3c2e8 41 _rst = 1; // put RESET pin to high to start TFT screen
CaptainR 0:a5ef6bc3c2e8 42 //wait_ms(10000);
CaptainR 0:a5ef6bc3c2e8 43 //reset();
CaptainR 0:a5ef6bc3c2e8 44 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 45 pc.printf("Wait 3 seconds for startup...\n\r");
CaptainR 3:dcfbceb81fef 46 #endif
CaptainR 0:a5ef6bc3c2e8 47 wait_ms(3000);
CaptainR 3:dcfbceb81fef 48
CaptainR 0:a5ef6bc3c2e8 49 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 50 pc.printf("set baudrate to 9600...\n\r");
CaptainR 0:a5ef6bc3c2e8 51 #endif
CaptainR 4:50511ed54ab4 52 baudrate(9600);
CaptainR 3:dcfbceb81fef 53
CaptainR 0:a5ef6bc3c2e8 54 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 55 pc.printf("clear screen...\n\r");
CaptainR 0:a5ef6bc3c2e8 56 #endif
CaptainR 0:a5ef6bc3c2e8 57 cls(); // clear screen
CaptainR 3:dcfbceb81fef 58 wait_ms(1000);
CaptainR 11:3ebd2263f3e9 59 screenMode(1);
CaptainR 0:a5ef6bc3c2e8 60 setFont(3);
CaptainR 3:dcfbceb81fef 61 //graphicsDemo();
CaptainR 0:a5ef6bc3c2e8 62
CaptainR 0:a5ef6bc3c2e8 63 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 64 pc.printf("Start Demo...\n\r");
CaptainR 0:a5ef6bc3c2e8 65 wait_ms(1000);
CaptainR 3:dcfbceb81fef 66 //mainDemo();
CaptainR 0:a5ef6bc3c2e8 67 //textDemo();
CaptainR 3:dcfbceb81fef 68 graphicsDemo();
CaptainR 0:a5ef6bc3c2e8 69 #endif
CaptainR 0:a5ef6bc3c2e8 70 }
CaptainR 0:a5ef6bc3c2e8 71
CaptainR 0:a5ef6bc3c2e8 72 //******************************************************************************************************
CaptainR 5:890ddd974624 73 void PICASO_4DGL :: rxCallback() {
CaptainR 0:a5ef6bc3c2e8 74
CaptainR 5:890ddd974624 75 while(1) {
CaptainR 5:890ddd974624 76 if(_cmd.readable()) {
CaptainR 5:890ddd974624 77 rxBuf[index++] = _cmd.getc();
CaptainR 5:890ddd974624 78 break;
CaptainR 5:890ddd974624 79 }
CaptainR 5:890ddd974624 80 }
CaptainR 0:a5ef6bc3c2e8 81 }
CaptainR 0:a5ef6bc3c2e8 82
CaptainR 0:a5ef6bc3c2e8 83 //******************************************************************************************************
CaptainR 3:dcfbceb81fef 84 void PICASO_4DGL :: writeBYTE(char c) { // send a BYTE command to screen
CaptainR 0:a5ef6bc3c2e8 85
CaptainR 0:a5ef6bc3c2e8 86 _cmd.putc(c);
CaptainR 0:a5ef6bc3c2e8 87
CaptainR 0:a5ef6bc3c2e8 88 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 89 pc.printf(" Char sent : 0x%02X ",c);
CaptainR 0:a5ef6bc3c2e8 90 pc.putc(c);
CaptainR 0:a5ef6bc3c2e8 91 pc.printf(" \n\r");
CaptainR 0:a5ef6bc3c2e8 92 #endif
CaptainR 0:a5ef6bc3c2e8 93
CaptainR 0:a5ef6bc3c2e8 94 }
CaptainR 0:a5ef6bc3c2e8 95
CaptainR 0:a5ef6bc3c2e8 96 //******************************************************************************************************
CaptainR 3:dcfbceb81fef 97 void PICASO_4DGL :: freeBUFFER(void) { // Clear serial buffer before writing command
CaptainR 0:a5ef6bc3c2e8 98
CaptainR 0:a5ef6bc3c2e8 99 while (_cmd.readable()) _cmd.getc(); // clear buffer garbage
CaptainR 0:a5ef6bc3c2e8 100 }
CaptainR 0:a5ef6bc3c2e8 101
CaptainR 0:a5ef6bc3c2e8 102 //******************************************************************************************************
CaptainR 3:dcfbceb81fef 103 void PICASO_4DGL :: writeCOMMAND(char *command, int number) { // send several BYTES making a command and return an answer
CaptainR 0:a5ef6bc3c2e8 104
CaptainR 0:a5ef6bc3c2e8 105 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 106 pc.printf("\n\r");
CaptainR 0:a5ef6bc3c2e8 107 pc.printf("New COMMAND : 0x%02X%02X\n\r", command[0], command[1]);
CaptainR 0:a5ef6bc3c2e8 108 #endif
CaptainR 0:a5ef6bc3c2e8 109 int i;
CaptainR 0:a5ef6bc3c2e8 110 freeBUFFER();
CaptainR 0:a5ef6bc3c2e8 111
CaptainR 0:a5ef6bc3c2e8 112 for (i = 0; i < number; i++) writeBYTE(command[i]); // send command to serial port
CaptainR 0:a5ef6bc3c2e8 113 }
CaptainR 0:a5ef6bc3c2e8 114
CaptainR 0:a5ef6bc3c2e8 115 //**************************************************************************
CaptainR 3:dcfbceb81fef 116 void PICASO_4DGL :: reset() { // Reset Screen
CaptainR 0:a5ef6bc3c2e8 117
CaptainR 0:a5ef6bc3c2e8 118 _rst = 0; // put RESET pin to low
CaptainR 0:a5ef6bc3c2e8 119 wait_ms(TEMPO); // wait a few milliseconds for command reception
CaptainR 0:a5ef6bc3c2e8 120 _rst = 1; // put RESET back to high
CaptainR 0:a5ef6bc3c2e8 121 wait(3); // wait 3s for screen to restart
CaptainR 0:a5ef6bc3c2e8 122
CaptainR 0:a5ef6bc3c2e8 123 freeBUFFER(); // clean buffer from possible garbage
CaptainR 0:a5ef6bc3c2e8 124 }
CaptainR 0:a5ef6bc3c2e8 125
CaptainR 0:a5ef6bc3c2e8 126 //**************************************************************************
CaptainR 3:dcfbceb81fef 127 void PICASO_4DGL :: baudrate(long speed) { // set screen baud rate
CaptainR 0:a5ef6bc3c2e8 128
CaptainR 0:a5ef6bc3c2e8 129 char command[4]= "";
CaptainR 2:81eaaa491a02 130 command[0] = (BAUDRATE >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 131 command[1] = (BAUDRATE >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 132 switch (speed) {
CaptainR 0:a5ef6bc3c2e8 133 case 300 :
CaptainR 2:81eaaa491a02 134 command[2] = (BAUD_300 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 135 command[3] = (BAUD_300 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 136 break;
CaptainR 0:a5ef6bc3c2e8 137 case 600 :
CaptainR 2:81eaaa491a02 138 command[2] = (BAUD_600 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 139 command[3] = (BAUD_600 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 140 break;
CaptainR 0:a5ef6bc3c2e8 141 case 1200 :
CaptainR 2:81eaaa491a02 142 command[2] = (BAUD_1200 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 143 command[3] = (BAUD_1200 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 144 break;
CaptainR 0:a5ef6bc3c2e8 145 case 2400 :
CaptainR 2:81eaaa491a02 146 command[2] = (BAUD_2400 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 147 command[3] = (BAUD_2400 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 148 break;
CaptainR 0:a5ef6bc3c2e8 149 case 4800 :
CaptainR 2:81eaaa491a02 150 command[2] = (BAUD_4800 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 151 command[3] = (BAUD_4800 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 152 break;
CaptainR 0:a5ef6bc3c2e8 153 case 9600 :
CaptainR 2:81eaaa491a02 154 command[2] = (BAUD_9600 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 155 command[3] = (BAUD_9600 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 156 break;
CaptainR 0:a5ef6bc3c2e8 157 case 14400 :
CaptainR 2:81eaaa491a02 158 command[2] = (BAUD_14400 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 159 command[3] = (BAUD_14400 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 160 break;
CaptainR 0:a5ef6bc3c2e8 161 case 19200 :
CaptainR 2:81eaaa491a02 162 command[2] = (BAUD_19200 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 163 command[3] = (BAUD_19200 >> (8*0)) & 0xff;
CaptainR 2:81eaaa491a02 164 break;
CaptainR 2:81eaaa491a02 165 case 31250 :
CaptainR 2:81eaaa491a02 166 command[2] = (BAUD_31250 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 167 command[3] = (BAUD_31250 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 168 break;
CaptainR 0:a5ef6bc3c2e8 169 case 38400 :
CaptainR 2:81eaaa491a02 170 command[2] = (BAUD_38400 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 171 command[3] = (BAUD_38400 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 172 break;
CaptainR 0:a5ef6bc3c2e8 173 case 56000 :
CaptainR 2:81eaaa491a02 174 command[2] = (BAUD_56000 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 175 command[3] = (BAUD_56000 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 176 break;
CaptainR 0:a5ef6bc3c2e8 177 case 57600 :
CaptainR 2:81eaaa491a02 178 command[2] = (BAUD_57600 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 179 command[3] = (BAUD_57600 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 180 break;
CaptainR 0:a5ef6bc3c2e8 181 case 115200 :
CaptainR 2:81eaaa491a02 182 command[2] = (BAUD_115200 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 183 command[3] = (BAUD_115200 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 184 break;
CaptainR 0:a5ef6bc3c2e8 185 case 128000 :
CaptainR 2:81eaaa491a02 186 command[2] = (BAUD_128000 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 187 command[3] = (BAUD_128000 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 188 break;
CaptainR 0:a5ef6bc3c2e8 189 case 256000 :
CaptainR 2:81eaaa491a02 190 command[2] = (BAUD_256000 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 191 command[3] = (BAUD_256000 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 192 break;
CaptainR 0:a5ef6bc3c2e8 193 case 300000 :
CaptainR 2:81eaaa491a02 194 command[2] = (BAUD_300000 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 195 command[3] = (BAUD_300000 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 196 break;
CaptainR 0:a5ef6bc3c2e8 197 case 375000 :
CaptainR 2:81eaaa491a02 198 command[2] = (BAUD_375000 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 199 command[3] = (BAUD_375000 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 200 break;
CaptainR 0:a5ef6bc3c2e8 201 case 500000 :
CaptainR 2:81eaaa491a02 202 command[2] = (BAUD_500000 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 203 command[3] = (BAUD_500000 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 204 break;
CaptainR 0:a5ef6bc3c2e8 205 case 600000 :
CaptainR 2:81eaaa491a02 206 command[2] = (BAUD_600000 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 207 command[3] = (BAUD_600000 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 208 break;
CaptainR 0:a5ef6bc3c2e8 209 default :
CaptainR 2:81eaaa491a02 210 command[2] = (BAUD_9600 >> (8*1)) & 0xff;
CaptainR 2:81eaaa491a02 211 command[3] = (BAUD_9600 >> (8*0)) & 0xff;
CaptainR 0:a5ef6bc3c2e8 212 speed = 9600;
CaptainR 0:a5ef6bc3c2e8 213 break;
CaptainR 0:a5ef6bc3c2e8 214 }
CaptainR 0:a5ef6bc3c2e8 215
CaptainR 0:a5ef6bc3c2e8 216 #if DEBUGMODE
CaptainR 0:a5ef6bc3c2e8 217 pc.printf("\n\r");
CaptainR 0:a5ef6bc3c2e8 218 pc.printf("New COMMAND : 0x%02X%02X\n\r", command[0], command[1]);
CaptainR 0:a5ef6bc3c2e8 219 #endif
CaptainR 0:a5ef6bc3c2e8 220
CaptainR 0:a5ef6bc3c2e8 221 int i;
CaptainR 0:a5ef6bc3c2e8 222 freeBUFFER();
CaptainR 0:a5ef6bc3c2e8 223
CaptainR 0:a5ef6bc3c2e8 224 //Change baudrates - as instructed by 4DGL
CaptainR 0:a5ef6bc3c2e8 225 if (speed == 128000) speed = 133928;
CaptainR 0:a5ef6bc3c2e8 226 if (speed == 256000) speed = 282353;
CaptainR 0:a5ef6bc3c2e8 227 if (speed == 300000) speed = 312500;
CaptainR 0:a5ef6bc3c2e8 228 if (speed == 375000) speed = 401785;
CaptainR 0:a5ef6bc3c2e8 229 if (speed == 500000) speed = 562500;
CaptainR 0:a5ef6bc3c2e8 230 if (speed == 600000) speed = 703125;
CaptainR 0:a5ef6bc3c2e8 231
CaptainR 0:a5ef6bc3c2e8 232 for (i = 0; i <4; i++) writeBYTE(command[i]); // send command to serial port
CaptainR 0:a5ef6bc3c2e8 233 _cmd.baud(speed); // set mbed to same speed
CaptainR 0:a5ef6bc3c2e8 234
CaptainR 5:890ddd974624 235 getResponse(1);
CaptainR 0:a5ef6bc3c2e8 236 }
CaptainR 0:a5ef6bc3c2e8 237
CaptainR 0:a5ef6bc3c2e8 238 //**************************************************************************
CaptainR 5:890ddd974624 239 void PICASO_4DGL :: getResponse(int count) {
CaptainR 5:890ddd974624 240
CaptainR 5:890ddd974624 241 pc.printf("\n\r Wait for answer...");
CaptainR 5:890ddd974624 242 while (index < count) wait_ms(100); // wait for screen answer
CaptainR 0:a5ef6bc3c2e8 243
CaptainR 5:890ddd974624 244 pc.printf("\n\r INDEX = %i\n\r", index);
CaptainR 5:890ddd974624 245 pc.printf("\n\r Answer = ");
CaptainR 5:890ddd974624 246 for (int i = 0; i < index; i++) {
CaptainR 5:890ddd974624 247 pc.printf("%02X ", rxBuf[i]);
CaptainR 0:a5ef6bc3c2e8 248 }
CaptainR 4:50511ed54ab4 249 pc.printf("\n\r");
CaptainR 5:890ddd974624 250 index = 0;
CaptainR 0:a5ef6bc3c2e8 251 }
CaptainR 0:a5ef6bc3c2e8 252
CaptainR 0:a5ef6bc3c2e8 253 //**************************************************************************
CaptainR 6:a1a85f2bc04b 254 void PICASO_4DGL :: calculateOrbitResponse() {
CaptainR 6:a1a85f2bc04b 255
CaptainR 6:a1a85f2bc04b 256 pc.printf("\n\r Wait for answer...");
CaptainR 6:a1a85f2bc04b 257 while (index < 5) wait_ms(100); // wait for screen answer
CaptainR 6:a1a85f2bc04b 258
CaptainR 6:a1a85f2bc04b 259 pc.printf("\n\r INDEX = %i\n\r", index);
CaptainR 6:a1a85f2bc04b 260 pc.printf("\n\r Answer = ");
CaptainR 6:a1a85f2bc04b 261 for (int i = 0; i < index; i++) {
CaptainR 6:a1a85f2bc04b 262 pc.printf("%02X ", rxBuf[i]);
CaptainR 6:a1a85f2bc04b 263 }
CaptainR 6:a1a85f2bc04b 264 pc.printf("\n\r");
CaptainR 6:a1a85f2bc04b 265 Xdest = rxBuf[1] << 8 | rxBuf[2];
CaptainR 6:a1a85f2bc04b 266 Ydest = rxBuf[3] << 8 | rxBuf[4];
CaptainR 6:a1a85f2bc04b 267 pc.printf("\n\r New coordiantes = %i x %i\n\r", Xdest, Ydest);
CaptainR 6:a1a85f2bc04b 268 index = 0;
CaptainR 6:a1a85f2bc04b 269 }
CaptainR 6:a1a85f2bc04b 270
CaptainR 11:3ebd2263f3e9 271
CaptainR 6:a1a85f2bc04b 272 //**************************************************************************
CaptainR 11:3ebd2263f3e9 273 short PICASO_4DGL :: getGraphicsResponse() {
CaptainR 11:3ebd2263f3e9 274
CaptainR 11:3ebd2263f3e9 275 short answer = 0;
CaptainR 11:3ebd2263f3e9 276 pc.printf("\n\r Wait for answer...");
CaptainR 11:3ebd2263f3e9 277 while (index < 3) wait_ms(100); // wait for screen answer
CaptainR 0:a5ef6bc3c2e8 278
CaptainR 11:3ebd2263f3e9 279 pc.printf("\n\r INDEX = %i\n\r", index);
CaptainR 11:3ebd2263f3e9 280 pc.printf("\n\r Answer = ");
CaptainR 11:3ebd2263f3e9 281 for (int i = 0; i < index; i++) {
CaptainR 11:3ebd2263f3e9 282 pc.printf("%02X ", rxBuf[i]);
CaptainR 0:a5ef6bc3c2e8 283 }
CaptainR 11:3ebd2263f3e9 284 answer = rxBuf[1] << 8 | rxBuf[2];
CaptainR 11:3ebd2263f3e9 285 pc.printf("\n\r");
CaptainR 11:3ebd2263f3e9 286 index = 0;
CaptainR 11:3ebd2263f3e9 287 return answer;
CaptainR 0:a5ef6bc3c2e8 288 }