Displays simple html web pages using the uVGA-II.
BasicWeb.cpp@3:5f688bcc92b9, 2013-03-06 (annotated)
- Committer:
- yaolu23
- Date:
- Wed Mar 06 18:17:39 2013 +0000
- Revision:
- 3:5f688bcc92b9
- Parent:
- 2:ff57d9a43c7d
BasicWeb
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yaolu23 | 0:7fac52628f4e | 1 | #include "BasicWeb.h" |
yaolu23 | 0:7fac52628f4e | 2 | |
yaolu23 | 0:7fac52628f4e | 3 | // table used to convert keyboard scan codes to ASCII |
yaolu23 | 0:7fac52628f4e | 4 | const unsigned char BasicWeb::table[] = { |
yaolu23 | 0:7fac52628f4e | 5 | // 0 1 2 3 4 5 6 7 8 9 A B C D E F |
yaolu23 | 0:7fac52628f4e | 6 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'~', 0, // 0 |
yaolu23 | 0:7fac52628f4e | 7 | 0, 0, 0, 0, 0,'q','1', 0, 0, 0,'z','s','a','w','2', 0, // 1 |
yaolu23 | 0:7fac52628f4e | 8 | 0,'c','x','d','e','4','3', 0, 0,' ','v','f','t','r','5', 0, // 2 |
yaolu23 | 0:7fac52628f4e | 9 | 0,'n','b','h','g','y','6', 0, 0, 0,'m','j','u','7','8', 0, // 3 |
yaolu23 | 3:5f688bcc92b9 | 10 | 0, 0,'k','i','o','0','9', 0, 0,'.','/','l',':','p','_', 0, // 4 |
yaolu23 | 0:7fac52628f4e | 11 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5 |
yaolu23 | 0:7fac52628f4e | 12 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 |
yaolu23 | 3:5f688bcc92b9 | 13 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'-', 0, 0, 0, 0, // 7 |
yaolu23 | 0:7fac52628f4e | 14 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 |
yaolu23 | 0:7fac52628f4e | 15 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 9 |
yaolu23 | 0:7fac52628f4e | 16 | |
yaolu23 | 0:7fac52628f4e | 17 | BasicWeb::BasicWeb(PinName tx, PinName rx, PinName reset) |
yaolu23 | 0:7fac52628f4e | 18 | :vga(tx, rx, reset), |
yaolu23 | 0:7fac52628f4e | 19 | urlStr("http://www.batw.net/htmllessons/example_page.html"), |
yaolu23 | 3:5f688bcc92b9 | 20 | urlIndex(49), str(NULL), bold(false), font(0), color(0x000000), index(0), title(false) { |
yaolu23 | 0:7fac52628f4e | 21 | |
yaolu23 | 0:7fac52628f4e | 22 | // initialize uVGA |
yaolu23 | 0:7fac52628f4e | 23 | vga.baudrate(115200); |
yaolu23 | 0:7fac52628f4e | 24 | vga.display_control(0x0c, 0x01); // Set display to VGA 640x480 |
yaolu23 | 0:7fac52628f4e | 25 | } |
yaolu23 | 0:7fac52628f4e | 26 | |
yaolu23 | 0:7fac52628f4e | 27 | void BasicWeb::browser(){ |
yaolu23 | 0:7fac52628f4e | 28 | // draw browser |
yaolu23 | 0:7fac52628f4e | 29 | vga.background_color(WHITE); |
yaolu23 | 0:7fac52628f4e | 30 | vga.rectangle(0, 0, 640, 38, 0xBBBBBB); |
yaolu23 | 0:7fac52628f4e | 31 | vga.rectangle(30, 20, 636, 34, WHITE); |
yaolu23 | 0:7fac52628f4e | 32 | displayUrl(); |
yaolu23 | 0:7fac52628f4e | 33 | |
yaolu23 | 0:7fac52628f4e | 34 | // connect to internet and display IP |
yaolu23 | 0:7fac52628f4e | 35 | eth.init(); |
yaolu23 | 0:7fac52628f4e | 36 | eth.connect(); |
yaolu23 | 0:7fac52628f4e | 37 | vga.text_string("IP address is:", 50, 1, 1, 0x000000); |
yaolu23 | 0:7fac52628f4e | 38 | vga.text_string(eth.getIPAddress(), 65, 1, 1, 0x000000); |
yaolu23 | 0:7fac52628f4e | 39 | } |
yaolu23 | 0:7fac52628f4e | 40 | |
yaolu23 | 0:7fac52628f4e | 41 | void BasicWeb::displayUrl(){ |
yaolu23 | 0:7fac52628f4e | 42 | vga.rectangle(30, 20, 636, 34, WHITE); // clear url |
yaolu23 | 0:7fac52628f4e | 43 | vga.text_string(urlStr, 4, 3, 1, 0x000000); |
yaolu23 | 0:7fac52628f4e | 44 | } |
yaolu23 | 0:7fac52628f4e | 45 | |
yaolu23 | 0:7fac52628f4e | 46 | // process new key |
yaolu23 | 0:7fac52628f4e | 47 | void BasicWeb::newKey(char scancode){ |
yaolu23 | 0:7fac52628f4e | 48 | char c = table[scancode]; |
yaolu23 | 0:7fac52628f4e | 49 | if(c != 0){ // if a alpha numeric |
yaolu23 | 0:7fac52628f4e | 50 | urlStr[urlIndex] = c; |
yaolu23 | 0:7fac52628f4e | 51 | char s[] = {c, 0}; |
yaolu23 | 0:7fac52628f4e | 52 | vga.text_string(s, 4 + urlIndex, 3, 1, 0x000000); |
yaolu23 | 0:7fac52628f4e | 53 | urlIndex += 1; |
yaolu23 | 0:7fac52628f4e | 54 | urlStr[urlIndex] = '\0'; |
yaolu23 | 0:7fac52628f4e | 55 | }else{ |
yaolu23 | 0:7fac52628f4e | 56 | if(scancode == 0x66){ // backspace |
yaolu23 | 0:7fac52628f4e | 57 | if(urlIndex != 0){ |
yaolu23 | 0:7fac52628f4e | 58 | urlIndex -= 1; |
yaolu23 | 0:7fac52628f4e | 59 | urlStr[urlIndex] = '\0'; |
yaolu23 | 0:7fac52628f4e | 60 | vga.rectangle(31 + urlIndex*8, 20, 39 + urlIndex*8, 34, WHITE); |
yaolu23 | 0:7fac52628f4e | 61 | } |
yaolu23 | 0:7fac52628f4e | 62 | }else if(scancode == 0x5A){ // enter |
yaolu23 | 0:7fac52628f4e | 63 | int ret = http.get(urlStr, text, 10240); |
yaolu23 | 0:7fac52628f4e | 64 | if(!ret){ |
yaolu23 | 0:7fac52628f4e | 65 | removeRL(text, 10240); |
yaolu23 | 0:7fac52628f4e | 66 | index = 0; |
yaolu23 | 0:7fac52628f4e | 67 | lineIndex = 40; |
yaolu23 | 0:7fac52628f4e | 68 | vga.rectangle(0, 0, 640, 19, 0xBBBBBB); // clear title |
yaolu23 | 0:7fac52628f4e | 69 | vga.rectangle(0, 39, 640, 480, 0xFFFFFF); // clear page |
yaolu23 | 0:7fac52628f4e | 70 | displayPage(); |
yaolu23 | 0:7fac52628f4e | 71 | }else{ |
yaolu23 | 0:7fac52628f4e | 72 | vga.graphic_string("Could not fetch page", 21, 0, 1, color, 1, 1); |
yaolu23 | 0:7fac52628f4e | 73 | } |
yaolu23 | 0:7fac52628f4e | 74 | } |
yaolu23 | 0:7fac52628f4e | 75 | } |
yaolu23 | 0:7fac52628f4e | 76 | } |
yaolu23 | 0:7fac52628f4e | 77 | |
yaolu23 | 0:7fac52628f4e | 78 | void BasicWeb::modKey(char scancode1, char scancode2){ |
yaolu23 | 0:7fac52628f4e | 79 | if(scancode1 == 0xE0){ |
yaolu23 | 0:7fac52628f4e | 80 | if(scancode2 == 0x72 || scancode2 == 0x74){ // up and right arrow |
yaolu23 | 0:7fac52628f4e | 81 | vga.rectangle(0, 39, 640, 480, 0xFFFFFF); // clear page |
yaolu23 | 0:7fac52628f4e | 82 | lineIndex = 40; |
yaolu23 | 0:7fac52628f4e | 83 | displayPage(); |
yaolu23 | 0:7fac52628f4e | 84 | } |
yaolu23 | 0:7fac52628f4e | 85 | } |
yaolu23 | 0:7fac52628f4e | 86 | } |
yaolu23 | 0:7fac52628f4e | 87 | |
yaolu23 | 0:7fac52628f4e | 88 | void BasicWeb::displayPage(){ |
yaolu23 | 0:7fac52628f4e | 89 | parseStr(); |
yaolu23 | 0:7fac52628f4e | 90 | while(printText(str)){ |
yaolu23 | 0:7fac52628f4e | 91 | parseStr(); |
yaolu23 | 0:7fac52628f4e | 92 | if(title){ |
yaolu23 | 0:7fac52628f4e | 93 | title = false; |
yaolu23 | 0:7fac52628f4e | 94 | vga.rectangle(0, 0, 640, 19, 0xBBBBBB); |
yaolu23 | 0:7fac52628f4e | 95 | vga.text_string(titleStr, 1, 1, 1, 0x000000); |
yaolu23 | 0:7fac52628f4e | 96 | } |
yaolu23 | 0:7fac52628f4e | 97 | } |
yaolu23 | 0:7fac52628f4e | 98 | } |
yaolu23 | 0:7fac52628f4e | 99 | |
yaolu23 | 0:7fac52628f4e | 100 | /* processes tags up until a string to display is found */ |
yaolu23 | 0:7fac52628f4e | 101 | void BasicWeb::parseStr(){ |
yaolu23 | 0:7fac52628f4e | 102 | bool cont = true; |
yaolu23 | 0:7fac52628f4e | 103 | while(cont){ |
yaolu23 | 0:7fac52628f4e | 104 | while(text[index] == ' ') index++; // skip white space |
yaolu23 | 0:7fac52628f4e | 105 | if(text[index] == '\0'){ |
yaolu23 | 0:7fac52628f4e | 106 | str = NULL; |
yaolu23 | 0:7fac52628f4e | 107 | return; |
yaolu23 | 0:7fac52628f4e | 108 | } |
yaolu23 | 0:7fac52628f4e | 109 | if(text[index] == '<'){ |
yaolu23 | 0:7fac52628f4e | 110 | cont = applyTag(); |
yaolu23 | 0:7fac52628f4e | 111 | }else{ |
yaolu23 | 0:7fac52628f4e | 112 | cont = extractStr(); |
yaolu23 | 0:7fac52628f4e | 113 | } |
yaolu23 | 0:7fac52628f4e | 114 | } |
yaolu23 | 0:7fac52628f4e | 115 | } |
yaolu23 | 0:7fac52628f4e | 116 | |
yaolu23 | 0:7fac52628f4e | 117 | /* processes the tag and increment index past it */ |
yaolu23 | 0:7fac52628f4e | 118 | bool BasicWeb::applyTag(){ |
yaolu23 | 0:7fac52628f4e | 119 | index++; |
yaolu23 | 0:7fac52628f4e | 120 | |
yaolu23 | 0:7fac52628f4e | 121 | // skip comments |
yaolu23 | 0:7fac52628f4e | 122 | bool comment = true; |
yaolu23 | 0:7fac52628f4e | 123 | if(text[index] == '!'){ |
yaolu23 | 0:7fac52628f4e | 124 | if(text[index+1] == '-' && text[index+2] == '-'){ |
yaolu23 | 0:7fac52628f4e | 125 | index += 3; |
yaolu23 | 0:7fac52628f4e | 126 | while(comment){ // while still in comment body |
yaolu23 | 0:7fac52628f4e | 127 | |
yaolu23 | 0:7fac52628f4e | 128 | // check for ending sequence |
yaolu23 | 0:7fac52628f4e | 129 | if(text[index] == '-'){ |
yaolu23 | 0:7fac52628f4e | 130 | index += 1; |
yaolu23 | 0:7fac52628f4e | 131 | if(text[index] == '-'){ |
yaolu23 | 0:7fac52628f4e | 132 | index += 1; |
yaolu23 | 0:7fac52628f4e | 133 | if(text[index] == '>'){ |
yaolu23 | 0:7fac52628f4e | 134 | comment = false; // break out of comment |
yaolu23 | 0:7fac52628f4e | 135 | } |
yaolu23 | 0:7fac52628f4e | 136 | } |
yaolu23 | 0:7fac52628f4e | 137 | }else{ |
yaolu23 | 0:7fac52628f4e | 138 | index++; |
yaolu23 | 0:7fac52628f4e | 139 | } |
yaolu23 | 0:7fac52628f4e | 140 | } |
yaolu23 | 0:7fac52628f4e | 141 | comment = true; // reset comment flag |
yaolu23 | 0:7fac52628f4e | 142 | } |
yaolu23 | 0:7fac52628f4e | 143 | while(text[index] != '>') index++; |
yaolu23 | 0:7fac52628f4e | 144 | index++; |
yaolu23 | 0:7fac52628f4e | 145 | return true; |
yaolu23 | 0:7fac52628f4e | 146 | } |
yaolu23 | 0:7fac52628f4e | 147 | |
yaolu23 | 0:7fac52628f4e | 148 | // process tag |
yaolu23 | 0:7fac52628f4e | 149 | int i = 0; |
yaolu23 | 0:7fac52628f4e | 150 | if(compareTag(text + index, "title")){ |
yaolu23 | 0:7fac52628f4e | 151 | index += 6; |
yaolu23 | 0:7fac52628f4e | 152 | title = true; |
yaolu23 | 0:7fac52628f4e | 153 | while(text[index+i] != '<' && text[index+i] != '\0'){ |
yaolu23 | 0:7fac52628f4e | 154 | i++; |
yaolu23 | 0:7fac52628f4e | 155 | } |
yaolu23 | 0:7fac52628f4e | 156 | if(i < 30){ |
yaolu23 | 0:7fac52628f4e | 157 | copyStr(text + index, titleStr, i); |
yaolu23 | 0:7fac52628f4e | 158 | }else{ |
yaolu23 | 0:7fac52628f4e | 159 | copyStr(text + index, titleStr, 30); |
yaolu23 | 0:7fac52628f4e | 160 | } |
yaolu23 | 0:7fac52628f4e | 161 | index += i; |
yaolu23 | 0:7fac52628f4e | 162 | }else if(compareTag(text + index, "script")){ // skip script |
yaolu23 | 0:7fac52628f4e | 163 | index += 7; |
yaolu23 | 0:7fac52628f4e | 164 | while(text[index] != '\0'){ |
yaolu23 | 0:7fac52628f4e | 165 | if(text[index] == '<'){ |
yaolu23 | 0:7fac52628f4e | 166 | index++; |
yaolu23 | 0:7fac52628f4e | 167 | if(compareTag(text + index, "/script")){ |
yaolu23 | 0:7fac52628f4e | 168 | index += 8; |
yaolu23 | 0:7fac52628f4e | 169 | break; |
yaolu23 | 0:7fac52628f4e | 170 | } |
yaolu23 | 0:7fac52628f4e | 171 | } |
yaolu23 | 0:7fac52628f4e | 172 | index++; |
yaolu23 | 0:7fac52628f4e | 173 | } |
yaolu23 | 0:7fac52628f4e | 174 | }else if(compareTag(text + index, "style")){ // skip style |
yaolu23 | 0:7fac52628f4e | 175 | index += 6; |
yaolu23 | 0:7fac52628f4e | 176 | while(text[index] != '\0'){ |
yaolu23 | 0:7fac52628f4e | 177 | if(text[index] == '<'){ |
yaolu23 | 0:7fac52628f4e | 178 | index++; |
yaolu23 | 0:7fac52628f4e | 179 | if(compareTag(text + index, "/style")){ |
yaolu23 | 0:7fac52628f4e | 180 | index += 7; |
yaolu23 | 0:7fac52628f4e | 181 | break; |
yaolu23 | 0:7fac52628f4e | 182 | } |
yaolu23 | 0:7fac52628f4e | 183 | } |
yaolu23 | 0:7fac52628f4e | 184 | index++; |
yaolu23 | 0:7fac52628f4e | 185 | } |
yaolu23 | 0:7fac52628f4e | 186 | }else if(compareTag(text + index, "br")){ |
yaolu23 | 0:7fac52628f4e | 187 | index += 3; |
yaolu23 | 0:7fac52628f4e | 188 | lineIndex += 10; |
yaolu23 | 0:7fac52628f4e | 189 | }else if(compareTag(text + index, "/br")){ |
yaolu23 | 0:7fac52628f4e | 190 | index += 3; |
yaolu23 | 0:7fac52628f4e | 191 | lineIndex += 10; |
yaolu23 | 0:7fac52628f4e | 192 | }else if(compareTag(text + index, "b")){ |
yaolu23 | 0:7fac52628f4e | 193 | index += 2; |
yaolu23 | 0:7fac52628f4e | 194 | font += 1; |
yaolu23 | 0:7fac52628f4e | 195 | }else if(compareTag(text + index, "/b")){ |
yaolu23 | 0:7fac52628f4e | 196 | index += 3; |
yaolu23 | 0:7fac52628f4e | 197 | font -= 1; |
yaolu23 | 0:7fac52628f4e | 198 | }else if(compareTag(text + index, "h1")){ |
yaolu23 | 0:7fac52628f4e | 199 | index += 3; |
yaolu23 | 0:7fac52628f4e | 200 | font = 3; |
yaolu23 | 0:7fac52628f4e | 201 | }else if(compareTag(text + index, "/h1")){ |
yaolu23 | 0:7fac52628f4e | 202 | index += 4; |
yaolu23 | 0:7fac52628f4e | 203 | font = 0; |
yaolu23 | 0:7fac52628f4e | 204 | }else if(compareTag(text + index, "h2")){ |
yaolu23 | 0:7fac52628f4e | 205 | index += 3; |
yaolu23 | 0:7fac52628f4e | 206 | font = 2; |
yaolu23 | 0:7fac52628f4e | 207 | }else if(compareTag(text + index, "/h2")){ |
yaolu23 | 0:7fac52628f4e | 208 | index += 4; |
yaolu23 | 0:7fac52628f4e | 209 | font = 0; |
yaolu23 | 0:7fac52628f4e | 210 | }else if(compareTag(text + index, "h3")){ |
yaolu23 | 0:7fac52628f4e | 211 | index += 3; |
yaolu23 | 0:7fac52628f4e | 212 | font = 1; |
yaolu23 | 0:7fac52628f4e | 213 | }else if(compareTag(text + index, "/h3")){ |
yaolu23 | 0:7fac52628f4e | 214 | index += 4; |
yaolu23 | 0:7fac52628f4e | 215 | font = 0; |
yaolu23 | 0:7fac52628f4e | 216 | }else{ |
yaolu23 | 0:7fac52628f4e | 217 | while(text[index+i] != '>') i++; |
yaolu23 | 0:7fac52628f4e | 218 | index += i + 1; |
yaolu23 | 0:7fac52628f4e | 219 | } |
yaolu23 | 0:7fac52628f4e | 220 | |
yaolu23 | 0:7fac52628f4e | 221 | return true; |
yaolu23 | 0:7fac52628f4e | 222 | } |
yaolu23 | 0:7fac52628f4e | 223 | |
yaolu23 | 0:7fac52628f4e | 224 | /* checks string against given tag */ |
yaolu23 | 0:7fac52628f4e | 225 | bool BasicWeb::compareTag(char* s, char* tag){ |
yaolu23 | 0:7fac52628f4e | 226 | int i = 0; |
yaolu23 | 0:7fac52628f4e | 227 | while(s[i] != '>' && s[i] != '\0'){ |
yaolu23 | 0:7fac52628f4e | 228 | if(s[i] != tag[i]) return false; |
yaolu23 | 0:7fac52628f4e | 229 | i++; |
yaolu23 | 0:7fac52628f4e | 230 | } |
yaolu23 | 0:7fac52628f4e | 231 | if(tag[i] != '\0'){ |
yaolu23 | 0:7fac52628f4e | 232 | return false; |
yaolu23 | 0:7fac52628f4e | 233 | }else{ |
yaolu23 | 0:7fac52628f4e | 234 | return true; |
yaolu23 | 0:7fac52628f4e | 235 | } |
yaolu23 | 0:7fac52628f4e | 236 | } |
yaolu23 | 0:7fac52628f4e | 237 | |
yaolu23 | 0:7fac52628f4e | 238 | /* stores string up to the start of the next tag into str variable */ |
yaolu23 | 0:7fac52628f4e | 239 | bool BasicWeb::extractStr(){ |
yaolu23 | 3:5f688bcc92b9 | 240 | |
yaolu23 | 3:5f688bcc92b9 | 241 | // skip white space |
yaolu23 | 0:7fac52628f4e | 242 | int i = 0; |
yaolu23 | 3:5f688bcc92b9 | 243 | while(text[index+i] == ' ') i++; |
yaolu23 | 3:5f688bcc92b9 | 244 | index += i; |
yaolu23 | 3:5f688bcc92b9 | 245 | |
yaolu23 | 3:5f688bcc92b9 | 246 | if(text[index+1] == '<'){ |
yaolu23 | 3:5f688bcc92b9 | 247 | index++; |
yaolu23 | 3:5f688bcc92b9 | 248 | return true; |
yaolu23 | 3:5f688bcc92b9 | 249 | } |
yaolu23 | 3:5f688bcc92b9 | 250 | |
yaolu23 | 3:5f688bcc92b9 | 251 | i = 0; |
yaolu23 | 0:7fac52628f4e | 252 | while(text[index+i] != '<' && text[index+i] != '\0'){ |
yaolu23 | 0:7fac52628f4e | 253 | i++; |
yaolu23 | 0:7fac52628f4e | 254 | } |
yaolu23 | 0:7fac52628f4e | 255 | delete[] str; |
yaolu23 | 0:7fac52628f4e | 256 | str = new char[i + 1]; |
yaolu23 | 0:7fac52628f4e | 257 | copyStr(text + index, str, i); |
yaolu23 | 0:7fac52628f4e | 258 | index += i; |
yaolu23 | 0:7fac52628f4e | 259 | strSize = i; |
yaolu23 | 0:7fac52628f4e | 260 | return false; |
yaolu23 | 0:7fac52628f4e | 261 | } |
yaolu23 | 0:7fac52628f4e | 262 | |
yaolu23 | 0:7fac52628f4e | 263 | /* copies s1 into s2 upto given size */ |
yaolu23 | 0:7fac52628f4e | 264 | void BasicWeb::copyStr(char* s1, char* s2, int size){ |
yaolu23 | 0:7fac52628f4e | 265 | int i; |
yaolu23 | 0:7fac52628f4e | 266 | for(i = 0; i < size; i++){ |
yaolu23 | 0:7fac52628f4e | 267 | s2[i] = s1[i]; |
yaolu23 | 0:7fac52628f4e | 268 | if(s1[i] == '\0') return; |
yaolu23 | 0:7fac52628f4e | 269 | } |
yaolu23 | 0:7fac52628f4e | 270 | s2[i] = '\0'; |
yaolu23 | 0:7fac52628f4e | 271 | } |
yaolu23 | 0:7fac52628f4e | 272 | |
yaolu23 | 0:7fac52628f4e | 273 | /* removes CR and LR because they causes problems for vga print function */ |
yaolu23 | 0:7fac52628f4e | 274 | void BasicWeb::removeRL(char* s, int size){ |
yaolu23 | 0:7fac52628f4e | 275 | for(int i = 0; i < size; i++){ |
yaolu23 | 0:7fac52628f4e | 276 | if(s[i] == '\r' || s[i] == '\n') s[i] = ' '; |
yaolu23 | 0:7fac52628f4e | 277 | } |
yaolu23 | 0:7fac52628f4e | 278 | } |
yaolu23 | 0:7fac52628f4e | 279 | |
yaolu23 | 0:7fac52628f4e | 280 | /* prints text one line at a time, returning false if at end of screen */ |
yaolu23 | 0:7fac52628f4e | 281 | bool BasicWeb::printText(char* s){ |
yaolu23 | 0:7fac52628f4e | 282 | |
yaolu23 | 0:7fac52628f4e | 283 | if(s == NULL){ |
yaolu23 | 0:7fac52628f4e | 284 | index = 0; |
yaolu23 | 0:7fac52628f4e | 285 | return false; |
yaolu23 | 0:7fac52628f4e | 286 | } |
yaolu23 | 0:7fac52628f4e | 287 | |
yaolu23 | 0:7fac52628f4e | 288 | int maxChar; |
yaolu23 | 0:7fac52628f4e | 289 | switch(font){ |
yaolu23 | 0:7fac52628f4e | 290 | case 0: |
yaolu23 | 0:7fac52628f4e | 291 | maxChar = 105; |
yaolu23 | 0:7fac52628f4e | 292 | break; |
yaolu23 | 0:7fac52628f4e | 293 | case 1: |
yaolu23 | 0:7fac52628f4e | 294 | maxChar = 70; |
yaolu23 | 0:7fac52628f4e | 295 | break; |
yaolu23 | 0:7fac52628f4e | 296 | case 2: |
yaolu23 | 0:7fac52628f4e | 297 | maxChar = 65; |
yaolu23 | 0:7fac52628f4e | 298 | break; |
yaolu23 | 0:7fac52628f4e | 299 | case 3: |
yaolu23 | 0:7fac52628f4e | 300 | maxChar = 50; |
yaolu23 | 0:7fac52628f4e | 301 | break; |
yaolu23 | 0:7fac52628f4e | 302 | default: |
yaolu23 | 0:7fac52628f4e | 303 | maxChar = 100; |
yaolu23 | 0:7fac52628f4e | 304 | } |
yaolu23 | 0:7fac52628f4e | 305 | |
yaolu23 | 0:7fac52628f4e | 306 | char* temp; |
yaolu23 | 0:7fac52628f4e | 307 | int i = strSize; |
yaolu23 | 0:7fac52628f4e | 308 | int lineNum = 0; |
yaolu23 | 0:7fac52628f4e | 309 | |
yaolu23 | 0:7fac52628f4e | 310 | if(i < maxChar){ |
yaolu23 | 0:7fac52628f4e | 311 | vga.graphic_string(s, 0, lineIndex, font, color, 1, 1); |
yaolu23 | 0:7fac52628f4e | 312 | if(font == 3){ |
yaolu23 | 0:7fac52628f4e | 313 | lineIndex += 20; |
yaolu23 | 0:7fac52628f4e | 314 | }else{ |
yaolu23 | 0:7fac52628f4e | 315 | lineIndex += 10; |
yaolu23 | 0:7fac52628f4e | 316 | } |
yaolu23 | 0:7fac52628f4e | 317 | if(lineIndex < 480){ |
yaolu23 | 0:7fac52628f4e | 318 | return true; |
yaolu23 | 0:7fac52628f4e | 319 | }else{ |
yaolu23 | 0:7fac52628f4e | 320 | return false; |
yaolu23 | 0:7fac52628f4e | 321 | } |
yaolu23 | 0:7fac52628f4e | 322 | }else{ |
yaolu23 | 0:7fac52628f4e | 323 | temp = new char[maxChar + 1]; |
yaolu23 | 0:7fac52628f4e | 324 | while(i > 0){ |
yaolu23 | 0:7fac52628f4e | 325 | if(i > maxChar){ |
yaolu23 | 0:7fac52628f4e | 326 | copyStr(s + lineNum * maxChar, temp, maxChar); |
yaolu23 | 0:7fac52628f4e | 327 | i -= maxChar; |
yaolu23 | 0:7fac52628f4e | 328 | }else{ |
yaolu23 | 0:7fac52628f4e | 329 | copyStr(s + lineNum * maxChar, temp, i); |
yaolu23 | 0:7fac52628f4e | 330 | i = 0; |
yaolu23 | 0:7fac52628f4e | 331 | } |
yaolu23 | 0:7fac52628f4e | 332 | vga.graphic_string(temp, 0, lineIndex, font, color, 1, 1); |
yaolu23 | 0:7fac52628f4e | 333 | lineNum++; |
yaolu23 | 0:7fac52628f4e | 334 | if(font == 3){ |
yaolu23 | 0:7fac52628f4e | 335 | lineIndex += 20; |
yaolu23 | 0:7fac52628f4e | 336 | }else{ |
yaolu23 | 0:7fac52628f4e | 337 | lineIndex += 10; |
yaolu23 | 0:7fac52628f4e | 338 | } |
yaolu23 | 0:7fac52628f4e | 339 | if(lineIndex >= 480){ |
yaolu23 | 0:7fac52628f4e | 340 | delete[] temp; |
yaolu23 | 0:7fac52628f4e | 341 | return false; |
yaolu23 | 0:7fac52628f4e | 342 | } |
yaolu23 | 0:7fac52628f4e | 343 | } |
yaolu23 | 0:7fac52628f4e | 344 | delete[] temp; |
yaolu23 | 0:7fac52628f4e | 345 | } |
yaolu23 | 0:7fac52628f4e | 346 | return true; |
yaolu23 | 0:7fac52628f4e | 347 | } |