The iPod controller that I submitted for the mbed challenge
Dependencies: mbed Motordriver PID
ipod.cpp@0:371773dd3dd1, 2011-05-04 (annotated)
- Committer:
- networker
- Date:
- Wed May 04 15:41:13 2011 +0000
- Revision:
- 0:371773dd3dd1
first publication
Who changed what in which revision?
User | Revision | Line number | New 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 | } |