Real-time bike tracker using Adafruit Ultimate GPS, Huzzah wifi, and Pubnub
Dependencies: MBed_Adafruit-GPS-Library mbed
Huzzah.cpp@1:0701bf58c9fa, 2017-04-19 (annotated)
- Committer:
- ECE4180
- Date:
- Wed Apr 19 01:00:53 2017 +0000
- Revision:
- 1:0701bf58c9fa
- Child:
- 2:834f8d2ebe3f
GPS String sending to Pubnub and working.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ECE4180 | 1:0701bf58c9fa | 1 | #include "Huzzah.h" |
ECE4180 | 1:0701bf58c9fa | 2 | |
ECE4180 | 1:0701bf58c9fa | 3 | |
ECE4180 | 1:0701bf58c9fa | 4 | extern Serial pc; |
ECE4180 | 1:0701bf58c9fa | 5 | extern volatile int tx_in; |
ECE4180 | 1:0701bf58c9fa | 6 | extern volatile int tx_out; |
ECE4180 | 1:0701bf58c9fa | 7 | extern volatile int rx_in; |
ECE4180 | 1:0701bf58c9fa | 8 | extern volatile int rx_out; |
ECE4180 | 1:0701bf58c9fa | 9 | extern char tx_buffer[4096]; |
ECE4180 | 1:0701bf58c9fa | 10 | extern char rx_buffer[4096]; |
ECE4180 | 1:0701bf58c9fa | 11 | |
ECE4180 | 1:0701bf58c9fa | 12 | |
ECE4180 | 1:0701bf58c9fa | 13 | Huzzah::Huzzah(PinName tx_pin, PinName rx_pin, string ssid, string pwd) |
ECE4180 | 1:0701bf58c9fa | 14 | :esp(tx_pin, rx_pin), ssid(ssid), pwd(pwd) |
ECE4180 | 1:0701bf58c9fa | 15 | { |
ECE4180 | 1:0701bf58c9fa | 16 | tx_in=0; |
ECE4180 | 1:0701bf58c9fa | 17 | tx_out=0; |
ECE4180 | 1:0701bf58c9fa | 18 | rx_in=0; |
ECE4180 | 1:0701bf58c9fa | 19 | rx_out=0; |
ECE4180 | 1:0701bf58c9fa | 20 | esp.baud(9600); |
ECE4180 | 1:0701bf58c9fa | 21 | } |
ECE4180 | 1:0701bf58c9fa | 22 | |
ECE4180 | 1:0701bf58c9fa | 23 | |
ECE4180 | 1:0701bf58c9fa | 24 | Huzzah::Huzzah(PinName tx_pin, PinName rx_pin) |
ECE4180 | 1:0701bf58c9fa | 25 | :esp(tx_pin, rx_pin), ssid(""), pwd("") |
ECE4180 | 1:0701bf58c9fa | 26 | { |
ECE4180 | 1:0701bf58c9fa | 27 | tx_in=0; |
ECE4180 | 1:0701bf58c9fa | 28 | tx_out=0; |
ECE4180 | 1:0701bf58c9fa | 29 | rx_in=0; |
ECE4180 | 1:0701bf58c9fa | 30 | rx_out=0; |
ECE4180 | 1:0701bf58c9fa | 31 | esp.baud(9600); |
ECE4180 | 1:0701bf58c9fa | 32 | } |
ECE4180 | 1:0701bf58c9fa | 33 | |
ECE4180 | 1:0701bf58c9fa | 34 | |
ECE4180 | 1:0701bf58c9fa | 35 | void Huzzah::setssid(string s) |
ECE4180 | 1:0701bf58c9fa | 36 | { |
ECE4180 | 1:0701bf58c9fa | 37 | ssid = s; |
ECE4180 | 1:0701bf58c9fa | 38 | } |
ECE4180 | 1:0701bf58c9fa | 39 | |
ECE4180 | 1:0701bf58c9fa | 40 | |
ECE4180 | 1:0701bf58c9fa | 41 | void Huzzah::setpwd(string s) |
ECE4180 | 1:0701bf58c9fa | 42 | { |
ECE4180 | 1:0701bf58c9fa | 43 | pwd = s; |
ECE4180 | 1:0701bf58c9fa | 44 | } |
ECE4180 | 1:0701bf58c9fa | 45 | |
ECE4180 | 1:0701bf58c9fa | 46 | |
ECE4180 | 1:0701bf58c9fa | 47 | string Huzzah::get_ip() |
ECE4180 | 1:0701bf58c9fa | 48 | { |
ECE4180 | 1:0701bf58c9fa | 49 | strcpy(cmdbuff, "print(wifi.sta.getip())\r\n"); |
ECE4180 | 1:0701bf58c9fa | 50 | send_cmd(); |
ECE4180 | 1:0701bf58c9fa | 51 | getreply(); |
ECE4180 | 1:0701bf58c9fa | 52 | string s(replybuff); |
ECE4180 | 1:0701bf58c9fa | 53 | return s; |
ECE4180 | 1:0701bf58c9fa | 54 | } |
ECE4180 | 1:0701bf58c9fa | 55 | |
ECE4180 | 1:0701bf58c9fa | 56 | |
ECE4180 | 1:0701bf58c9fa | 57 | void Huzzah::http_get(string request, string host, string port) |
ECE4180 | 1:0701bf58c9fa | 58 | { |
ECE4180 | 1:0701bf58c9fa | 59 | string conn("conn:connect("); |
ECE4180 | 1:0701bf58c9fa | 60 | conn += port + "\,\"" + host + "\")\r\n"; |
ECE4180 | 1:0701bf58c9fa | 61 | |
ECE4180 | 1:0701bf58c9fa | 62 | string r("conn:send(\""); |
ECE4180 | 1:0701bf58c9fa | 63 | r += request + "\")\r\n"; |
ECE4180 | 1:0701bf58c9fa | 64 | |
ECE4180 | 1:0701bf58c9fa | 65 | sprintf(cmdbuff, "conn=net.createConnection(net.TCP, false)\r\n" ); |
ECE4180 | 1:0701bf58c9fa | 66 | send_cmd(); |
ECE4180 | 1:0701bf58c9fa | 67 | getreply(); |
ECE4180 | 1:0701bf58c9fa | 68 | wait(0.2); |
ECE4180 | 1:0701bf58c9fa | 69 | sprintf(cmdbuff, "print(conn)\r\n" ); |
ECE4180 | 1:0701bf58c9fa | 70 | send_cmd(); |
ECE4180 | 1:0701bf58c9fa | 71 | getreply(); |
ECE4180 | 1:0701bf58c9fa | 72 | wait(0.2); |
ECE4180 | 1:0701bf58c9fa | 73 | sprintf(cmdbuff, "conn:on(\"receive\", function(conn, pl) print(pl) end)\r\n"); |
ECE4180 | 1:0701bf58c9fa | 74 | send_cmd(); |
ECE4180 | 1:0701bf58c9fa | 75 | getreply(); |
ECE4180 | 1:0701bf58c9fa | 76 | wait(0.2); |
ECE4180 | 1:0701bf58c9fa | 77 | sprintf(cmdbuff, conn.c_str()); |
ECE4180 | 1:0701bf58c9fa | 78 | send_cmd(); |
ECE4180 | 1:0701bf58c9fa | 79 | getreply(); |
ECE4180 | 1:0701bf58c9fa | 80 | wait(3.0); |
ECE4180 | 1:0701bf58c9fa | 81 | sprintf(cmdbuff, r.c_str()); |
ECE4180 | 1:0701bf58c9fa | 82 | send_cmd(); |
ECE4180 | 1:0701bf58c9fa | 83 | wait(1.0); |
ECE4180 | 1:0701bf58c9fa | 84 | send_cmd(); |
ECE4180 | 1:0701bf58c9fa | 85 | getreply(); |
ECE4180 | 1:0701bf58c9fa | 86 | wait(0.2); |
ECE4180 | 1:0701bf58c9fa | 87 | } |
ECE4180 | 1:0701bf58c9fa | 88 | |
ECE4180 | 1:0701bf58c9fa | 89 | |
ECE4180 | 1:0701bf58c9fa | 90 | void Huzzah::send_cmd() |
ECE4180 | 1:0701bf58c9fa | 91 | { |
ECE4180 | 1:0701bf58c9fa | 92 | int i; |
ECE4180 | 1:0701bf58c9fa | 93 | char temp_char; |
ECE4180 | 1:0701bf58c9fa | 94 | bool empty; |
ECE4180 | 1:0701bf58c9fa | 95 | i = 0; |
ECE4180 | 1:0701bf58c9fa | 96 | // Start Critical Section - don't interrupt while changing global buffer variables |
ECE4180 | 1:0701bf58c9fa | 97 | NVIC_DisableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 98 | empty = (tx_in == tx_out); |
ECE4180 | 1:0701bf58c9fa | 99 | while ((i==0) || (cmdbuff[i-1] != '\n')) { |
ECE4180 | 1:0701bf58c9fa | 100 | // Wait if buffer full |
ECE4180 | 1:0701bf58c9fa | 101 | if (((tx_in + 1) % buffer_size) == tx_out) { |
ECE4180 | 1:0701bf58c9fa | 102 | // End Critical Section - need to let interrupt routine empty buffer by sending |
ECE4180 | 1:0701bf58c9fa | 103 | NVIC_EnableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 104 | while (((tx_in + 1) % buffer_size) == tx_out) { |
ECE4180 | 1:0701bf58c9fa | 105 | } |
ECE4180 | 1:0701bf58c9fa | 106 | // Start Critical Section - don't interrupt while changing global buffer variables |
ECE4180 | 1:0701bf58c9fa | 107 | NVIC_DisableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 108 | } |
ECE4180 | 1:0701bf58c9fa | 109 | tx_buffer[tx_in] = cmdbuff[i]; |
ECE4180 | 1:0701bf58c9fa | 110 | i++; |
ECE4180 | 1:0701bf58c9fa | 111 | tx_in = (tx_in + 1) % buffer_size; |
ECE4180 | 1:0701bf58c9fa | 112 | } |
ECE4180 | 1:0701bf58c9fa | 113 | if (esp.writeable() && (empty)) { |
ECE4180 | 1:0701bf58c9fa | 114 | temp_char = tx_buffer[tx_out]; |
ECE4180 | 1:0701bf58c9fa | 115 | tx_out = (tx_out + 1) % buffer_size; |
ECE4180 | 1:0701bf58c9fa | 116 | // Send first character to start tx interrupts, if stopped |
ECE4180 | 1:0701bf58c9fa | 117 | esp.putc(temp_char); |
ECE4180 | 1:0701bf58c9fa | 118 | } |
ECE4180 | 1:0701bf58c9fa | 119 | // End Critical Section |
ECE4180 | 1:0701bf58c9fa | 120 | NVIC_EnableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 121 | return; |
ECE4180 | 1:0701bf58c9fa | 122 | } |
ECE4180 | 1:0701bf58c9fa | 123 | |
ECE4180 | 1:0701bf58c9fa | 124 | |
ECE4180 | 1:0701bf58c9fa | 125 | void Huzzah::getreply() |
ECE4180 | 1:0701bf58c9fa | 126 | { |
ECE4180 | 1:0701bf58c9fa | 127 | read_line(); |
ECE4180 | 1:0701bf58c9fa | 128 | sscanf(rx_line,replybuff); |
ECE4180 | 1:0701bf58c9fa | 129 | } |
ECE4180 | 1:0701bf58c9fa | 130 | |
ECE4180 | 1:0701bf58c9fa | 131 | |
ECE4180 | 1:0701bf58c9fa | 132 | void Huzzah::read_line() |
ECE4180 | 1:0701bf58c9fa | 133 | { |
ECE4180 | 1:0701bf58c9fa | 134 | int i; |
ECE4180 | 1:0701bf58c9fa | 135 | i = 0; |
ECE4180 | 1:0701bf58c9fa | 136 | // Start Critical Section - don't interrupt while changing global buffer variables |
ECE4180 | 1:0701bf58c9fa | 137 | NVIC_DisableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 138 | // Loop reading rx buffer characters until end of line character |
ECE4180 | 1:0701bf58c9fa | 139 | while ((i==0) || (rx_line[i-1] != '\r')) { |
ECE4180 | 1:0701bf58c9fa | 140 | // Wait if buffer empty |
ECE4180 | 1:0701bf58c9fa | 141 | if (rx_in == rx_out) { |
ECE4180 | 1:0701bf58c9fa | 142 | // End Critical Section - need to allow rx interrupt to get new characters for buffer |
ECE4180 | 1:0701bf58c9fa | 143 | NVIC_EnableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 144 | while (rx_in == rx_out) { |
ECE4180 | 1:0701bf58c9fa | 145 | } |
ECE4180 | 1:0701bf58c9fa | 146 | // Start Critical Section - don't interrupt while changing global buffer variables |
ECE4180 | 1:0701bf58c9fa | 147 | NVIC_DisableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 148 | } |
ECE4180 | 1:0701bf58c9fa | 149 | rx_line[i] = rx_buffer[rx_out]; |
ECE4180 | 1:0701bf58c9fa | 150 | i++; |
ECE4180 | 1:0701bf58c9fa | 151 | rx_out = (rx_out + 1) % buffer_size; |
ECE4180 | 1:0701bf58c9fa | 152 | } |
ECE4180 | 1:0701bf58c9fa | 153 | // End Critical Section |
ECE4180 | 1:0701bf58c9fa | 154 | NVIC_EnableIRQ(UART1_IRQn); |
ECE4180 | 1:0701bf58c9fa | 155 | rx_line[i-1] = 0; |
ECE4180 | 1:0701bf58c9fa | 156 | return; |
ECE4180 | 1:0701bf58c9fa | 157 | } |
ECE4180 | 1:0701bf58c9fa | 158 | |
ECE4180 | 1:0701bf58c9fa | 159 | |
ECE4180 | 1:0701bf58c9fa | 160 | void Huzzah::espsendcmd() |
ECE4180 | 1:0701bf58c9fa | 161 | { |
ECE4180 | 1:0701bf58c9fa | 162 | esp.printf("%s", configsnd); |
ECE4180 | 1:0701bf58c9fa | 163 | } |
ECE4180 | 1:0701bf58c9fa | 164 | |
ECE4180 | 1:0701bf58c9fa | 165 | |
ECE4180 | 1:0701bf58c9fa | 166 | void Huzzah::espgetreply() |
ECE4180 | 1:0701bf58c9fa | 167 | { |
ECE4180 | 1:0701bf58c9fa | 168 | Timer t; |
ECE4180 | 1:0701bf58c9fa | 169 | memset(configbuf, '\0', sizeof(configbuf)); |
ECE4180 | 1:0701bf58c9fa | 170 | t.start(); |
ECE4180 | 1:0701bf58c9fa | 171 | ended=0; |
ECE4180 | 1:0701bf58c9fa | 172 | count=0; |
ECE4180 | 1:0701bf58c9fa | 173 | while(!ended) { |
ECE4180 | 1:0701bf58c9fa | 174 | if(esp.readable()) { |
ECE4180 | 1:0701bf58c9fa | 175 | configbuf[count] = esp.getc(); |
ECE4180 | 1:0701bf58c9fa | 176 | count++; |
ECE4180 | 1:0701bf58c9fa | 177 | } |
ECE4180 | 1:0701bf58c9fa | 178 | if(t.read() > timeout) { |
ECE4180 | 1:0701bf58c9fa | 179 | ended = 1; |
ECE4180 | 1:0701bf58c9fa | 180 | t.stop(); |
ECE4180 | 1:0701bf58c9fa | 181 | t.reset(); |
ECE4180 | 1:0701bf58c9fa | 182 | } |
ECE4180 | 1:0701bf58c9fa | 183 | } |
ECE4180 | 1:0701bf58c9fa | 184 | } |
ECE4180 | 1:0701bf58c9fa | 185 | |
ECE4180 | 1:0701bf58c9fa | 186 | |
ECE4180 | 1:0701bf58c9fa | 187 | void Huzzah::espconfig() |
ECE4180 | 1:0701bf58c9fa | 188 | { |
ECE4180 | 1:0701bf58c9fa | 189 | wait(5); |
ECE4180 | 1:0701bf58c9fa | 190 | pc.printf("\f---------- Starting ESP Config ----------\r\n\n"); |
ECE4180 | 1:0701bf58c9fa | 191 | pc.printf("---------- Reset & get Firmware ----------\r\n"); |
ECE4180 | 1:0701bf58c9fa | 192 | strcpy(configsnd,"node.restart()\r\n"); |
ECE4180 | 1:0701bf58c9fa | 193 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 194 | timeout=5; |
ECE4180 | 1:0701bf58c9fa | 195 | espgetreply(); |
ECE4180 | 1:0701bf58c9fa | 196 | pc.printf(configbuf); |
ECE4180 | 1:0701bf58c9fa | 197 | |
ECE4180 | 1:0701bf58c9fa | 198 | wait(2); |
ECE4180 | 1:0701bf58c9fa | 199 | |
ECE4180 | 1:0701bf58c9fa | 200 | pc.printf("\n---------- Get Version ----------\r\n"); |
ECE4180 | 1:0701bf58c9fa | 201 | strcpy(configsnd,"print(node.info())\r\n"); |
ECE4180 | 1:0701bf58c9fa | 202 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 203 | timeout=4; |
ECE4180 | 1:0701bf58c9fa | 204 | espgetreply(); |
ECE4180 | 1:0701bf58c9fa | 205 | pc.printf(configbuf); |
ECE4180 | 1:0701bf58c9fa | 206 | |
ECE4180 | 1:0701bf58c9fa | 207 | wait(3); |
ECE4180 | 1:0701bf58c9fa | 208 | |
ECE4180 | 1:0701bf58c9fa | 209 | // set CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station) |
ECE4180 | 1:0701bf58c9fa | 210 | pc.printf("\n---------- Setting Mode ----------\r\n"); |
ECE4180 | 1:0701bf58c9fa | 211 | strcpy(configsnd, "wifi.setmode(wifi.STATION)\r\n"); |
ECE4180 | 1:0701bf58c9fa | 212 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 213 | timeout=4; |
ECE4180 | 1:0701bf58c9fa | 214 | espgetreply(); |
ECE4180 | 1:0701bf58c9fa | 215 | pc.printf(configbuf); |
ECE4180 | 1:0701bf58c9fa | 216 | |
ECE4180 | 1:0701bf58c9fa | 217 | wait(2); |
ECE4180 | 1:0701bf58c9fa | 218 | |
ECE4180 | 1:0701bf58c9fa | 219 | pc.printf("\n---------- Listing Access Points ----------\r\n"); |
ECE4180 | 1:0701bf58c9fa | 220 | strcpy(configsnd, "function listap(t) \r\n"); |
ECE4180 | 1:0701bf58c9fa | 221 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 222 | wait(1); |
ECE4180 | 1:0701bf58c9fa | 223 | strcpy(configsnd, "for k,v in pairs(t) do \r\n"); |
ECE4180 | 1:0701bf58c9fa | 224 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 225 | wait(1); |
ECE4180 | 1:0701bf58c9fa | 226 | strcpy(configsnd, "print(k..\" : \"..v)\r\n"); |
ECE4180 | 1:0701bf58c9fa | 227 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 228 | wait(1); |
ECE4180 | 1:0701bf58c9fa | 229 | strcpy(configsnd, "end\r\n"); |
ECE4180 | 1:0701bf58c9fa | 230 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 231 | wait(1); |
ECE4180 | 1:0701bf58c9fa | 232 | strcpy(configsnd, "end\r\n"); |
ECE4180 | 1:0701bf58c9fa | 233 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 234 | wait(1); |
ECE4180 | 1:0701bf58c9fa | 235 | strcpy(configsnd, "wifi.sta.getap(listap) \r\n"); |
ECE4180 | 1:0701bf58c9fa | 236 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 237 | wait(1); |
ECE4180 | 1:0701bf58c9fa | 238 | timeout=15; |
ECE4180 | 1:0701bf58c9fa | 239 | espgetreply(); |
ECE4180 | 1:0701bf58c9fa | 240 | pc.printf(configbuf); |
ECE4180 | 1:0701bf58c9fa | 241 | |
ECE4180 | 1:0701bf58c9fa | 242 | wait(2); |
ECE4180 | 1:0701bf58c9fa | 243 | |
ECE4180 | 1:0701bf58c9fa | 244 | pc.printf("\n---------- Connecting to AP ----------\r\n"); |
ECE4180 | 1:0701bf58c9fa | 245 | pc.printf("ssid = %s pwd = %s\r\n",ssid.c_str(),pwd.c_str()); |
ECE4180 | 1:0701bf58c9fa | 246 | strcpy(configsnd, "wifi.sta.config(\""); |
ECE4180 | 1:0701bf58c9fa | 247 | strcat(configsnd, ssid.c_str()); |
ECE4180 | 1:0701bf58c9fa | 248 | strcat(configsnd, "\",\""); |
ECE4180 | 1:0701bf58c9fa | 249 | strcat(configsnd, pwd.c_str()); |
ECE4180 | 1:0701bf58c9fa | 250 | strcat(configsnd, "\")\r\n"); |
ECE4180 | 1:0701bf58c9fa | 251 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 252 | timeout=10; |
ECE4180 | 1:0701bf58c9fa | 253 | espgetreply(); |
ECE4180 | 1:0701bf58c9fa | 254 | pc.printf(configbuf); |
ECE4180 | 1:0701bf58c9fa | 255 | |
ECE4180 | 1:0701bf58c9fa | 256 | wait(10); |
ECE4180 | 1:0701bf58c9fa | 257 | |
ECE4180 | 1:0701bf58c9fa | 258 | pc.printf("\n---------- Get IP's ----------\r\n"); |
ECE4180 | 1:0701bf58c9fa | 259 | strcpy(configsnd, "print(wifi.sta.getip())\r\n"); |
ECE4180 | 1:0701bf58c9fa | 260 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 261 | timeout=3; |
ECE4180 | 1:0701bf58c9fa | 262 | espgetreply(); |
ECE4180 | 1:0701bf58c9fa | 263 | pc.printf(configbuf); |
ECE4180 | 1:0701bf58c9fa | 264 | |
ECE4180 | 1:0701bf58c9fa | 265 | wait(1); |
ECE4180 | 1:0701bf58c9fa | 266 | |
ECE4180 | 1:0701bf58c9fa | 267 | pc.printf("\n---------- Get Connection Status ----------\r\n"); |
ECE4180 | 1:0701bf58c9fa | 268 | strcpy(configsnd, "print(wifi.sta.status())\r\n"); |
ECE4180 | 1:0701bf58c9fa | 269 | espsendcmd(); |
ECE4180 | 1:0701bf58c9fa | 270 | timeout=5; |
ECE4180 | 1:0701bf58c9fa | 271 | getreply(); |
ECE4180 | 1:0701bf58c9fa | 272 | pc.printf(configbuf); |
ECE4180 | 1:0701bf58c9fa | 273 | |
ECE4180 | 1:0701bf58c9fa | 274 | pc.printf("\n\n\n If you get a valid (non zero) IP, ESP8266 has been set up.\r\n"); |
ECE4180 | 1:0701bf58c9fa | 275 | pc.printf(" Run this if you want to reconfig the ESP8266 at any time.\r\n"); |
ECE4180 | 1:0701bf58c9fa | 276 | pc.printf(" It saves the SSID and password settings internally\r\n"); |
ECE4180 | 1:0701bf58c9fa | 277 | wait(10); |
ECE4180 | 1:0701bf58c9fa | 278 | } |