The iPod controller that I submitted for the mbed challenge

Dependencies:   mbed Motordriver PID

Committer:
networker
Date:
Wed May 04 15:41:13 2011 +0000
Revision:
0:371773dd3dd1
first publication

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 0:371773dd3dd1 1 #include "mbed.h"
networker 0:371773dd3dd1 2 #include "ipod.h"
networker 0:371773dd3dd1 3
networker 0:371773dd3dd1 4 ipod::ipod(PinName tx, PinName rx): led(*new DigitalOut(DEBUGPIN)) {
networker 0:371773dd3dd1 5 com = new Serial(tx, rx);
networker 0:371773dd3dd1 6 com->baud(19200);//should work upto 57600
networker 0:371773dd3dd1 7 rx_ready = false;
networker 0:371773dd3dd1 8 tx_ready = true;
networker 0:371773dd3dd1 9 state = 0;
networker 0:371773dd3dd1 10 tx_buffer[0] = 0xff;
networker 0:371773dd3dd1 11 tx_buffer[1] = 0x55;
networker 0:371773dd3dd1 12 com->attach(this, &ipod::handlerx);
networker 0:371773dd3dd1 13 #ifdef TX_IRQ
networker 0:371773dd3dd1 14 com->attach(this, &ipod::handletx, Serial::TxIrq);
networker 0:371773dd3dd1 15 #endif
networker 0:371773dd3dd1 16 lastcommand = -1;
networker 0:371773dd3dd1 17 error = err_success;
networker 0:371773dd3dd1 18 replies = 0;
networker 0:371773dd3dd1 19 }
networker 0:371773dd3dd1 20
networker 0:371773dd3dd1 21 void ipod::handlerx() {//Serial port interrupt handler
networker 0:371773dd3dd1 22 led = 1;
networker 0:371773dd3dd1 23 unsigned short c = com->getc();
networker 0:371773dd3dd1 24 // printf("%d: %02X; ", state, chk);
networker 0:371773dd3dd1 25 switch (state) {
networker 0:371773dd3dd1 26 case 0:
networker 0:371773dd3dd1 27 if (c==0xff) state++;
networker 0:371773dd3dd1 28 break;
networker 0:371773dd3dd1 29 case 1:
networker 0:371773dd3dd1 30 if (c==0x55) state++;
networker 0:371773dd3dd1 31 else state = 0;
networker 0:371773dd3dd1 32 break;
networker 0:371773dd3dd1 33 case 2:
networker 0:371773dd3dd1 34 if (rx_ready) {
networker 0:371773dd3dd1 35 state = 0;
networker 0:371773dd3dd1 36 break;//buffer not free, ignore the message
networker 0:371773dd3dd1 37 }
networker 0:371773dd3dd1 38 length = c;
networker 0:371773dd3dd1 39 chk = c;
networker 0:371773dd3dd1 40 rx_buffer = new char[length];
networker 0:371773dd3dd1 41 state++;
networker 0:371773dd3dd1 42 break;
networker 0:371773dd3dd1 43 case 3:
networker 0:371773dd3dd1 44 if (c > 4) {
networker 0:371773dd3dd1 45 state = 0;
networker 0:371773dd3dd1 46 break;//mode not known or not supported
networker 0:371773dd3dd1 47 }
networker 0:371773dd3dd1 48 mode = c;
networker 0:371773dd3dd1 49 chk += c;
networker 0:371773dd3dd1 50 state++;
networker 0:371773dd3dd1 51 break;
networker 0:371773dd3dd1 52 case 4:
networker 0:371773dd3dd1 53 command = c<<8;
networker 0:371773dd3dd1 54 chk += c;
networker 0:371773dd3dd1 55 state++;
networker 0:371773dd3dd1 56 break;
networker 0:371773dd3dd1 57 case 5:
networker 0:371773dd3dd1 58 command += c;
networker 0:371773dd3dd1 59 chk += c;
networker 0:371773dd3dd1 60 state++;
networker 0:371773dd3dd1 61 break;
networker 0:371773dd3dd1 62 default:
networker 0:371773dd3dd1 63 chk += c;
networker 0:371773dd3dd1 64 if (state < length+3) {
networker 0:371773dd3dd1 65 rx_buffer[state-6] = c;
networker 0:371773dd3dd1 66 state++;
networker 0:371773dd3dd1 67 } else {
networker 0:371773dd3dd1 68 if (chk==0) {
networker 0:371773dd3dd1 69 rx_ready = true;
networker 0:371773dd3dd1 70 replies--;
networker 0:371773dd3dd1 71 if (command-1 == lastcommand) {//it is a reply to lastcommand
networker 0:371773dd3dd1 72 //printf("reply to %02X\n", lastcommand);
networker 0:371773dd3dd1 73 lastcommand = -1;
networker 0:371773dd3dd1 74 }
networker 0:371773dd3dd1 75 //printf("ready %02X\n", command);
networker 0:371773dd3dd1 76 } else
networker 0:371773dd3dd1 77 printf("checksum error %02x state=%d\n", chk, state);
networker 0:371773dd3dd1 78 state = 0;
networker 0:371773dd3dd1 79 break;
networker 0:371773dd3dd1 80 }
networker 0:371773dd3dd1 81 }
networker 0:371773dd3dd1 82 led = 0;
networker 0:371773dd3dd1 83 }
networker 0:371773dd3dd1 84
networker 0:371773dd3dd1 85 void ipod::handletx() {
networker 0:371773dd3dd1 86 if (tx_index < tx_size)
networker 0:371773dd3dd1 87 com->putc(tx_buffer[tx_index++]);
networker 0:371773dd3dd1 88 else
networker 0:371773dd3dd1 89 tx_ready = true;
networker 0:371773dd3dd1 90 }
networker 0:371773dd3dd1 91
networker 0:371773dd3dd1 92 bool ipod::waitForReply() {//busy waits for a reply to the last issued command, all other replies are ignored
networker 0:371773dd3dd1 93 for (int i = 0; i < 10000000; i++) {
networker 0:371773dd3dd1 94 if (ready()) {
networker 0:371773dd3dd1 95 if (lastcommand == -1) {//indicates that a reply to the last issued command has been received
networker 0:371773dd3dd1 96 parse();//parse the last reply
networker 0:371773dd3dd1 97 return true;//return to caller for further processing
networker 0:371773dd3dd1 98 }
networker 0:371773dd3dd1 99 release();//release the buffer and hence ignore the message
networker 0:371773dd3dd1 100 }
networker 0:371773dd3dd1 101 }
networker 0:371773dd3dd1 102 printf("timeout: last received %02X(%d, %d, %d, \"%s\")\n", command, arg1, arg2, arg3, string);
networker 0:371773dd3dd1 103 error = err_timeout;
networker 0:371773dd3dd1 104 return false;
networker 0:371773dd3dd1 105 }
networker 0:371773dd3dd1 106
networker 0:371773dd3dd1 107 #define BIGENDIAN
networker 0:371773dd3dd1 108 void ipod::copy(char *b, union conv p) {//copy an UINT32 argument bytewise to the buffer
networker 0:371773dd3dd1 109 #ifdef BIGENDIAN
networker 0:371773dd3dd1 110 for (int i = 0; i < 4; i++)
networker 0:371773dd3dd1 111 *(b+3-i) = p.asBytes[i];
networker 0:371773dd3dd1 112 #else
networker 0:371773dd3dd1 113 for (int i = 0; i < 4; i++)
networker 0:371773dd3dd1 114 *(b+i) = p.asBytes[i];
networker 0:371773dd3dd1 115 #endif
networker 0:371773dd3dd1 116 }
networker 0:371773dd3dd1 117
networker 0:371773dd3dd1 118 void ipod::SendAirCmd(unsigned cmd, unsigned arg1, unsigned arg2, unsigned arg3) {//send an advanced ipod remote command, unused arguments are optional
networker 0:371773dd3dd1 119 union conv par1, par2, par3;
networker 0:371773dd3dd1 120 par1.asInt = arg1;
networker 0:371773dd3dd1 121 par2.asInt = arg2;
networker 0:371773dd3dd1 122 par3.asInt = arg3;
networker 0:371773dd3dd1 123 tx_buffer[3] = 4; //AiR mode
networker 0:371773dd3dd1 124 tx_buffer[4] = 0;
networker 0:371773dd3dd1 125 tx_buffer[5] = cmd & 0xff;
networker 0:371773dd3dd1 126 unsigned expect = 1; //typically expect 1 reply per request
networker 0:371773dd3dd1 127 switch (cmd) {
networker 0:371773dd3dd1 128 case 0x12: //get ipod type
networker 0:371773dd3dd1 129 tx_buffer[2] = 3;
networker 0:371773dd3dd1 130 //expect 2 bytes return
networker 0:371773dd3dd1 131 break;
networker 0:371773dd3dd1 132 case 0x14: //get iPod name
networker 0:371773dd3dd1 133 tx_buffer[2] = 3;
networker 0:371773dd3dd1 134 //expect string return
networker 0:371773dd3dd1 135 break;
networker 0:371773dd3dd1 136 case 0x16: //main lib
networker 0:371773dd3dd1 137 tx_buffer[2] = 3;
networker 0:371773dd3dd1 138 expect = 0;
networker 0:371773dd3dd1 139 break;
networker 0:371773dd3dd1 140 case 0x17: //goto item
networker 0:371773dd3dd1 141 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 142 tx_buffer[2] = 8;
networker 0:371773dd3dd1 143 copy(tx_buffer+7, par2);
networker 0:371773dd3dd1 144 expect = 0;
networker 0:371773dd3dd1 145 break;
networker 0:371773dd3dd1 146 case 0x18: //get count
networker 0:371773dd3dd1 147 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 148 tx_buffer[2] = 4;
networker 0:371773dd3dd1 149 //expect integer return
networker 0:371773dd3dd1 150 break;
networker 0:371773dd3dd1 151 case 0x1A: //get names
networker 0:371773dd3dd1 152 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 153 tx_buffer[2] = 12;
networker 0:371773dd3dd1 154 copy(tx_buffer+7, par2);
networker 0:371773dd3dd1 155 copy(tx_buffer+11, par3);
networker 0:371773dd3dd1 156 //expect many offset,string pairs
networker 0:371773dd3dd1 157 expect = arg3;
networker 0:371773dd3dd1 158 break;
networker 0:371773dd3dd1 159 case 0x1C: //get time/stat
networker 0:371773dd3dd1 160 tx_buffer[2] = 3;
networker 0:371773dd3dd1 161 //expect int,int,byte
networker 0:371773dd3dd1 162 break;
networker 0:371773dd3dd1 163 case 0x1E: //get position
networker 0:371773dd3dd1 164 tx_buffer[2] = 3;
networker 0:371773dd3dd1 165 //expect int
networker 0:371773dd3dd1 166 break;
networker 0:371773dd3dd1 167 case 0x20: //get title
networker 0:371773dd3dd1 168 tx_buffer[2] = 7;
networker 0:371773dd3dd1 169 copy(tx_buffer+6, par1);
networker 0:371773dd3dd1 170 //expect string
networker 0:371773dd3dd1 171 break;
networker 0:371773dd3dd1 172 case 0x22: //get artist
networker 0:371773dd3dd1 173 tx_buffer[2] = 7;
networker 0:371773dd3dd1 174 copy(tx_buffer+6, par1);
networker 0:371773dd3dd1 175 //expect string
networker 0:371773dd3dd1 176 break;
networker 0:371773dd3dd1 177 case 0x24: //get album
networker 0:371773dd3dd1 178 tx_buffer[2] = 7;
networker 0:371773dd3dd1 179 copy(tx_buffer+6, par1);
networker 0:371773dd3dd1 180 //expect string
networker 0:371773dd3dd1 181 break;
networker 0:371773dd3dd1 182 case 0x26: //poll mode
networker 0:371773dd3dd1 183 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 184 tx_buffer[2] = 4;
networker 0:371773dd3dd1 185 //expect many byte,int pairs
networker 0:371773dd3dd1 186 expect = 0; //the number to expect is unknown here, so either stop polling or just insert command anyway
networker 0:371773dd3dd1 187 break;
networker 0:371773dd3dd1 188 case 0x28: //run PL
networker 0:371773dd3dd1 189 tx_buffer[2] = 7;
networker 0:371773dd3dd1 190 copy(tx_buffer+6, par1);
networker 0:371773dd3dd1 191 expect = 0;
networker 0:371773dd3dd1 192 break;
networker 0:371773dd3dd1 193 case 0x29: //command
networker 0:371773dd3dd1 194 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 195 tx_buffer[2] = 4;
networker 0:371773dd3dd1 196 expect = 0;
networker 0:371773dd3dd1 197 break;
networker 0:371773dd3dd1 198 case 0x2C: //get shuffle
networker 0:371773dd3dd1 199 tx_buffer[2] = 3;
networker 0:371773dd3dd1 200 //expect byte
networker 0:371773dd3dd1 201 break;
networker 0:371773dd3dd1 202 case 0x2E: //set shuffle
networker 0:371773dd3dd1 203 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 204 tx_buffer[2] = 4;
networker 0:371773dd3dd1 205 expect = 0;
networker 0:371773dd3dd1 206 break;
networker 0:371773dd3dd1 207 case 0x2F: //get repeat
networker 0:371773dd3dd1 208 tx_buffer[2] = 3;
networker 0:371773dd3dd1 209 //expect byte
networker 0:371773dd3dd1 210 break;
networker 0:371773dd3dd1 211 case 0x31: //set repeat
networker 0:371773dd3dd1 212 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 213 tx_buffer[2] = 4;
networker 0:371773dd3dd1 214 expect = 0;
networker 0:371773dd3dd1 215 break;
networker 0:371773dd3dd1 216 case 0x35: //get nr in PL
networker 0:371773dd3dd1 217 tx_buffer[2] = 3;
networker 0:371773dd3dd1 218 //expect int
networker 0:371773dd3dd1 219 break;
networker 0:371773dd3dd1 220 case 0x37: //goto song
networker 0:371773dd3dd1 221 tx_buffer[2] = 7;
networker 0:371773dd3dd1 222 copy(tx_buffer+6, par1);
networker 0:371773dd3dd1 223 expect = 0;
networker 0:371773dd3dd1 224 break;
networker 0:371773dd3dd1 225 case 0x38: //select
networker 0:371773dd3dd1 226 tx_buffer[6] = arg1;
networker 0:371773dd3dd1 227 tx_buffer[2] = 9;
networker 0:371773dd3dd1 228 copy(tx_buffer+7, par2);
networker 0:371773dd3dd1 229 tx_buffer[11] = 0;//unknown
networker 0:371773dd3dd1 230 break;
networker 0:371773dd3dd1 231 default:
networker 0:371773dd3dd1 232 return;
networker 0:371773dd3dd1 233 }
networker 0:371773dd3dd1 234 tx_size = tx_buffer[2] + 4;
networker 0:371773dd3dd1 235 tx_buffer[tx_size-1] = 0;
networker 0:371773dd3dd1 236 for (int i = 2; i < tx_size-1; i++)
networker 0:371773dd3dd1 237 tx_buffer[tx_size-1] -= tx_buffer[i];//compute checksum
networker 0:371773dd3dd1 238 tx_index = 1;
networker 0:371773dd3dd1 239 replies = expect;
networker 0:371773dd3dd1 240 #ifdef TX_IRQ
networker 0:371773dd3dd1 241 while (!tx_ready) /* wait */;
networker 0:371773dd3dd1 242 tx_ready = false;
networker 0:371773dd3dd1 243 com->putc(tx_buffer[0]);//kick-off writing buffer
networker 0:371773dd3dd1 244 #else
networker 0:371773dd3dd1 245 write();
networker 0:371773dd3dd1 246 #endif
networker 0:371773dd3dd1 247 lastcommand = cmd;
networker 0:371773dd3dd1 248 printf("%02X (%d, %d, %d)\n", cmd, arg1, arg2, arg3);
networker 0:371773dd3dd1 249 }
networker 0:371773dd3dd1 250
networker 0:371773dd3dd1 251 void ipod::guarded_SendAirCmd(unsigned cmd, unsigned arg1, unsigned arg2, unsigned arg3) {//same as SendAirCmd but waits until all previous expected replies have been received
networker 0:371773dd3dd1 252 for (int i = 0; i<1000000; i++)
networker 0:371773dd3dd1 253 if (replies==0) {
networker 0:371773dd3dd1 254 SendAirCmd(cmd, arg1, arg2, arg3);
networker 0:371773dd3dd1 255 return;
networker 0:371773dd3dd1 256 }
networker 0:371773dd3dd1 257 printf("Timeout while waiting for reply to %02X, command %02X cannot be send\n", lastcommand, cmd);
networker 0:371773dd3dd1 258 }
networker 0:371773dd3dd1 259
networker 0:371773dd3dd1 260 void ipod::SetMode(int m) { //char buf[] = {0xff, 0x55, 0x03, 0x00, 0x01, 0x00, 0x00};
networker 0:371773dd3dd1 261 tx_buffer[2] = 3; //length
networker 0:371773dd3dd1 262 tx_buffer[3] = 0; //mode 0, mode switching
networker 0:371773dd3dd1 263 tx_buffer[4] = 1; //cmd high byte
networker 0:371773dd3dd1 264 tx_buffer[5] = m; //cmd low byte
networker 0:371773dd3dd1 265 tx_buffer[6] = 0x100 - 3 - 1 - m;//checksum
networker 0:371773dd3dd1 266 tx_index = 1;
networker 0:371773dd3dd1 267 tx_size = 7;
networker 0:371773dd3dd1 268 #ifdef TX_IRQ
networker 0:371773dd3dd1 269 while (!tx_ready) /* wait */;
networker 0:371773dd3dd1 270 tx_ready = false;
networker 0:371773dd3dd1 271 com->putc(tx_buffer[0]);
networker 0:371773dd3dd1 272 #else
networker 0:371773dd3dd1 273 write();
networker 0:371773dd3dd1 274 #endif
networker 0:371773dd3dd1 275 }
networker 0:371773dd3dd1 276
networker 0:371773dd3dd1 277 unsigned ipod::copy(char* s) {//return a bytewise argument from the buffer as a UINT32
networker 0:371773dd3dd1 278 union conv p;
networker 0:371773dd3dd1 279 #ifdef BIGENDIAN
networker 0:371773dd3dd1 280 for (int i = 0; i < 4; i++)
networker 0:371773dd3dd1 281 p.asBytes[3-i] = s[i];
networker 0:371773dd3dd1 282 #else
networker 0:371773dd3dd1 283 for (int i = 0; i < 4; i++)
networker 0:371773dd3dd1 284 p.asBytes[i] = s[i];
networker 0:371773dd3dd1 285 #endif
networker 0:371773dd3dd1 286 return p.asInt;
networker 0:371773dd3dd1 287 }
networker 0:371773dd3dd1 288
networker 0:371773dd3dd1 289 void ipod::parse() {
networker 0:371773dd3dd1 290 error = err_success;
networker 0:371773dd3dd1 291 switch (mode) {
networker 0:371773dd3dd1 292 case 0: //mode 0 reply
networker 0:371773dd3dd1 293 if (command & 0xFF == 4) {//reply to mode status request
networker 0:371773dd3dd1 294 printf("mode 0 reply = %04X\n", command);
networker 0:371773dd3dd1 295 } else
networker 0:371773dd3dd1 296 printf( "unexpected mode 0 reply\n");
networker 0:371773dd3dd1 297 break; //assume s.c_str()[4] == 0
networker 0:371773dd3dd1 298 case 4://reply to AiR command
networker 0:371773dd3dd1 299 switch (command) {
networker 0:371773dd3dd1 300 case 0:
networker 0:371773dd3dd1 301 if (rx_buffer[0]==0x04) {
networker 0:371773dd3dd1 302 error = err_unknown;
networker 0:371773dd3dd1 303 printf("command %04X is not understood\n", *(unsigned short*)&rx_buffer[1]);
networker 0:371773dd3dd1 304 }
networker 0:371773dd3dd1 305 break;
networker 0:371773dd3dd1 306 case 1:
networker 0:371773dd3dd1 307 error = (errors)rx_buffer[0];
networker 0:371773dd3dd1 308 switch (error) {
networker 0:371773dd3dd1 309 case err_success:
networker 0:371773dd3dd1 310 //printf("command %04X succeeded\n",*(unsigned short*)&rx_buffer[1]);
networker 0:371773dd3dd1 311 break;
networker 0:371773dd3dd1 312 case err_failure:
networker 0:371773dd3dd1 313 printf("command %04X failed\n",*(unsigned short*)&rx_buffer[1]);
networker 0:371773dd3dd1 314 break;
networker 0:371773dd3dd1 315 case err_limit:
networker 0:371773dd3dd1 316 printf("command %04X had wrong parameter(s)\n",*(unsigned short*)&rx_buffer[1]);
networker 0:371773dd3dd1 317 break;
networker 0:371773dd3dd1 318 case err_answer:
networker 0:371773dd3dd1 319 printf("command %04X is an answer\n",*(unsigned short*)&rx_buffer[1]);
networker 0:371773dd3dd1 320 break;
networker 0:371773dd3dd1 321 default:
networker 0:371773dd3dd1 322 printf("unknown error\n");
networker 0:371773dd3dd1 323 break;
networker 0:371773dd3dd1 324 }
networker 0:371773dd3dd1 325 break;
networker 0:371773dd3dd1 326 //2 bytes
networker 0:371773dd3dd1 327 case get_ipod_size+1: //ipod type
networker 0:371773dd3dd1 328 break;
networker 0:371773dd3dd1 329 //single string
networker 0:371773dd3dd1 330 case get_ipod_name+1:
networker 0:371773dd3dd1 331 case get_title+1:
networker 0:371773dd3dd1 332 case get_artist+1:
networker 0:371773dd3dd1 333 case get_album+1:
networker 0:371773dd3dd1 334 string = rx_buffer;
networker 0:371773dd3dd1 335 printf("%04X: %s\n", command, string);
networker 0:371773dd3dd1 336 break;
networker 0:371773dd3dd1 337 //number+string
networker 0:371773dd3dd1 338 case get_names+1:
networker 0:371773dd3dd1 339 string = rx_buffer + 4;
networker 0:371773dd3dd1 340 arg1 = copy(rx_buffer);
networker 0:371773dd3dd1 341 printf("%04X: %d %s\n", command, arg1, string);
networker 0:371773dd3dd1 342 break;
networker 0:371773dd3dd1 343 //number+number+byte
networker 0:371773dd3dd1 344 case get_time_status+1:
networker 0:371773dd3dd1 345 arg1 = copy(rx_buffer);
networker 0:371773dd3dd1 346 arg2 = copy(rx_buffer+4);
networker 0:371773dd3dd1 347 arg3 = rx_buffer[8];
networker 0:371773dd3dd1 348 printf("%04X: %d %d %02X\n", command, arg1, arg2, arg3);
networker 0:371773dd3dd1 349 break;
networker 0:371773dd3dd1 350 //number
networker 0:371773dd3dd1 351 case get_count+1:
networker 0:371773dd3dd1 352 case get_position+1:
networker 0:371773dd3dd1 353 case get_nr_in_playlist+1:
networker 0:371773dd3dd1 354 arg1 = copy(rx_buffer);
networker 0:371773dd3dd1 355 printf("%04X: %d\n", command, arg1);
networker 0:371773dd3dd1 356 break;
networker 0:371773dd3dd1 357 //byte + number
networker 0:371773dd3dd1 358 case polling+1:
networker 0:371773dd3dd1 359 arg1 = rx_buffer[0];
networker 0:371773dd3dd1 360 arg2 = copy(rx_buffer+1);
networker 0:371773dd3dd1 361 break;
networker 0:371773dd3dd1 362 //byte
networker 0:371773dd3dd1 363 case get_shuffle+1:
networker 0:371773dd3dd1 364 case get_repeat+1:
networker 0:371773dd3dd1 365 arg1 = rx_buffer[0];
networker 0:371773dd3dd1 366 printf("%04X: %02X\n", command, arg1);
networker 0:371773dd3dd1 367 break;
networker 0:371773dd3dd1 368 //10 bytes
networker 0:371773dd3dd1 369 case select+1: //select
networker 0:371773dd3dd1 370 break;
networker 0:371773dd3dd1 371 default:
networker 0:371773dd3dd1 372 printf("unsupported reply");
networker 0:371773dd3dd1 373 break;
networker 0:371773dd3dd1 374 }
networker 0:371773dd3dd1 375 break;
networker 0:371773dd3dd1 376 default:
networker 0:371773dd3dd1 377 printf("unsupported mode\n");
networker 0:371773dd3dd1 378 break;
networker 0:371773dd3dd1 379 }
networker 0:371773dd3dd1 380 }