Changeset 551:f9b73af24bca
- Timestamp:
- 05/31/08 21:31:49 (7 months ago)
- Author:
- Maxime Petazzoni <maxime.petazzoni@…>
- Branch:
- default
- Message:
-
Remove some trailing whitespaces. Emacs victor.
- Location:
- nxos
- Files:
-
Legend:
- Unmodified
- Added
- Removed
-
|
r539
|
r551
|
|
| 26 | 26 | fs_file_t *nx__fs_get_file(fs_fd_t fd) { |
| 27 | 27 | NX_ASSERT(fd < FS_MAX_OPENED_FILES); |
| 28 | | |
| | 28 | |
| 29 | 29 | if (!fdset[fd].used) { |
| 30 | 30 | return NULL; |
| … |
… |
|
| 49 | 49 | volatile U32 *metadata = &(FLASH_BASE_PTR[i*EFC_PAGE_WORDS]); |
| 50 | 50 | union U32tochar nameconv; |
| 51 | | |
| | 51 | |
| 52 | 52 | memcpy(nameconv.integers, |
| 53 | 53 | (void *)(metadata + FS_FILENAME_OFFSET), |
| … |
… |
|
| 58 | 58 | return FS_ERR_NO_ERROR; |
| 59 | 59 | } |
| 60 | | |
| | 60 | |
| 61 | 61 | /* Otherwise jump over the file and continue searching. */ |
| 62 | 62 | else { |
| … |
… |
|
| 74 | 74 | fs_err_t nx__fs_find_last_origin(U32 *origin) { |
| 75 | 75 | U32 candidate = 0, i; |
| 76 | | |
| | 76 | |
| 77 | 77 | for (i=FS_PAGE_START; i<FS_PAGE_END; i++) { |
| 78 | 78 | if (nx__fs_page_has_magic(i)) { |
| … |
… |
|
| 84 | 84 | } |
| 85 | 85 | } |
| 86 | | |
| | 86 | |
| 87 | 87 | if (candidate) { |
| 88 | 88 | *origin = candidate; |
| 89 | 89 | return FS_ERR_NO_ERROR; |
| 90 | 90 | } |
| 91 | | |
| | 91 | |
| 92 | 92 | return FS_ERR_FILE_NOT_FOUND; |
| 93 | 93 | } |
| … |
… |
|
| 95 | 95 | fs_err_t nx__fs_find_next_origin(U32 start, U32 *origin) { |
| 96 | 96 | U32 i; |
| 97 | | |
| | 97 | |
| 98 | 98 | for (i=start; i<FS_PAGE_END; i++) { |
| 99 | 99 | if (nx__fs_page_has_magic(i)) { |
| … |
… |
|
| 102 | 102 | } |
| 103 | 103 | } |
| 104 | | |
| | 104 | |
| 105 | 105 | return FS_ERR_FILE_NOT_FOUND; |
| 106 | 106 | } |
| … |
… |
|
| 110 | 110 | U32 nx__fs_get_file_page_count(size_t size) { |
| 111 | 111 | U32 pages; |
| 112 | | |
| | 112 | |
| 113 | 113 | /* Compute page occupation. */ |
| 114 | 114 | size += FS_FILE_METADATA_BYTES; |
| … |
… |
|
| 117 | 117 | pages++; |
| 118 | 118 | } |
| 119 | | |
| | 119 | |
| 120 | 120 | return pages; |
| 121 | 121 | } |
| … |
… |
|
| 127 | 127 | fs_perm_t nx__fs_get_file_perms_from_metadata(volatile U32 *metadata) { |
| 128 | 128 | U8 perms = (*metadata & FS_FILE_PERMS_MASK) >> 20; |
| 129 | | |
| | 129 | |
| 130 | 130 | if (perms & FS_FILE_PERM_MASK_READWRITE) { |
| 131 | 131 | return FS_PERM_READWRITE; |
| … |
… |
|
| 133 | 133 | return FS_PERM_EXECUTABLE; |
| 134 | 134 | } |
| 135 | | |
| | 135 | |
| 136 | 136 | /* Defaults to read-only. */ |
| 137 | 137 | return FS_PERM_READONLY; |
| … |
… |
|
| 146 | 146 | |
| 147 | 147 | memset(metadata, 0, FS_FILE_METADATA_BYTES); |
| 148 | | |
| | 148 | |
| 149 | 149 | memset(nameconv.chars, 0, 32); |
| 150 | 150 | memcpy(nameconv.chars, name, MIN(strlen(name), 31)); |
| … |
… |
|
| 164 | 164 | break; |
| 165 | 165 | } |
| 166 | | |
| | 166 | |
| 167 | 167 | /* File size. */ |
| 168 | 168 | metadata[0] += (size & FS_FILE_SIZE_MASK); |
| 169 | 169 | |
| 170 | 170 | /* Insert here in metadata[1] what would be relevant (future). */ |
| 171 | | |
| | 171 | |
| 172 | 172 | /* File name. */ |
| 173 | 173 | memcpy(metadata + FS_FILENAME_OFFSET, nameconv.integers, FS_FILENAME_LENGTH); |
| … |
… |
|
| 178 | 178 | U32 diff, i; |
| 179 | 179 | size_t size; |
| 180 | | |
| | 180 | |
| 181 | 181 | diff = origin - file->origin; |
| 182 | 182 | |
| 183 | 183 | /* Move the file's data. */ |
| 184 | 184 | size = nx__fs_get_file_page_count(file->size); |
| 185 | | |
| | 185 | |
| 186 | 186 | for (i=file->origin; i<size; i++) { |
| 187 | 187 | nx__efc_read_page(i, page_data); |
| … |
… |
|
| 192 | 192 | } |
| 193 | 193 | } |
| 194 | | |
| | 194 | |
| 195 | 195 | file->origin = origin; |
| 196 | 196 | file->rbuf.page += diff; |
| 197 | 197 | file->wbuf.page += diff; |
| 198 | | |
| | 198 | |
| 199 | 199 | return FS_ERR_NO_ERROR; |
| 200 | 200 | } |
| … |
… |
|
| 203 | 203 | U32 origin, start; |
| 204 | 204 | size_t size; |
| 205 | | |
| | 205 | |
| 206 | 206 | size = nx__fs_get_file_page_count(file->size); |
| 207 | | |
| | 207 | |
| 208 | 208 | /* First, look at the end of the flash for free space. */ |
| 209 | 209 | if (nx__fs_find_last_origin(&origin) == FS_ERR_NO_ERROR) { |
| … |
… |
|
| 216 | 216 | } |
| 217 | 217 | } |
| 218 | | |
| | 218 | |
| 219 | 219 | start = FS_PAGE_START; |
| 220 | 220 | while (nx__fs_find_next_origin(start, &origin) != FS_ERR_FILE_NOT_FOUND) { |
| … |
… |
|
| 227 | 227 | &(FLASH_BASE_PTR[origin*EFC_PAGE_WORDS]))); |
| 228 | 228 | } |
| 229 | | |
| | 229 | |
| 230 | 230 | return FS_ERR_NO_SPACE_LEFT_ON_DEVICE; |
| 231 | 231 | } |
-
|
r542
|
r551
|
|
| 37 | 37 | NX_ASSERT(len < EFC_PAGES); |
| 38 | 38 | NX_ASSERT(dest - source <= len); |
| 39 | | |
| | 39 | |
| 40 | 40 | while (len--) { |
| 41 | 41 | data = FLASH_BASE_PTR[source*EFC_PAGE_WORDS]; |
| … |
… |
|
| 43 | 43 | return DEFRAG_ERR_FLASH_ERROR; |
| 44 | 44 | } |
| 45 | | |
| | 45 | |
| 46 | 46 | source++; |
| 47 | 47 | dest++; |
| 48 | 48 | } |
| 49 | | |
| | 49 | |
| 50 | 50 | return DEFRAG_ERR_NO_ERROR; |
| 51 | 51 | } |
| … |
… |
|
| 58 | 58 | U32 origin; |
| 59 | 59 | fs_err_t err; |
| 60 | | |
| | 60 | |
| 61 | 61 | err = nx__fs_find_file_origin(name, &origin); |
| 62 | 62 | if (err == FS_ERR_NO_ERROR) { |
| 63 | 63 | return nx_defrag_for_file_by_origin(origin); |
| 64 | 64 | } |
| 65 | | |
| | 65 | |
| 66 | 66 | /* Fall back to simple defrag. */ |
| 67 | 67 | return nx_defrag_simple(); |
| … |
… |
|
| 70 | 70 | defrag_err_t nx_defrag_for_file_by_origin(U32 origin) { |
| 71 | 71 | nx_defrag_move_region(origin, 1, 1); // TBR |
| 72 | | |
| | 72 | |
| 73 | 73 | return DEFRAG_ERR_NO_ERROR; |
| 74 | 74 | } |
-
|
r537
|
r551
|
|
| 30 | 30 | |
| 31 | 31 | nx_systick_wait_ms(EFC_THROTTLE_TIMER); |
| 32 | | |
| | 32 | |
| 33 | 33 | /* Write the page data to the flash in-memory mapping. */ |
| 34 | 34 | for (i=0 ; i<EFC_PAGE_WORDS ; i++) { |
| … |
… |
|
| 43 | 43 | ret = *AT91C_MC_FSR; |
| 44 | 44 | } while (!(ret & AT91C_MC_FRDY)); |
| 45 | | |
| | 45 | |
| 46 | 46 | /* Check the command result by reading the status register |
| 47 | 47 | * only once to avoid the bits being cleared. |
-
|
r549
|
r551
|
|
| 23 | 23 | /** @defgroup efcinternal Embedded Flash Controller driver |
| 24 | 24 | * |
| 25 | | * The flash driver provides a software interface to the on-board |
| | 25 | * The flash driver provides a software interface to the on-board |
| 26 | 26 | * flash memory through the embedded flash controller. |
| 27 | 27 | */ |
-
|
r502
|
r551
|
|
| 721 | 721 | i2c_set_bus_state(sensor, I2C_IDLE); |
| 722 | 722 | p->txn_state = TXN_WAITING; |
| 723 | | |
| | 723 | |
| 724 | 724 | /* When the sub-transaction is done, decrement i2c_txn_count. |
| 725 | 725 | * If it reaches 0, disable the I2C interrupt. |
-
|
r490
|
r551
|
|
| 66 | 66 | * there is data available to send. |
| 67 | 67 | */ |
| 68 | | *AT91C_SSC_TCMR = (AT91C_SSC_CKS_DIV + |
| 69 | | AT91C_SSC_CKO_CONTINOUS + |
| | 68 | *AT91C_SSC_TCMR = (AT91C_SSC_CKS_DIV |
| | 69 | AT91C_SSC_CKO_CONTINOUS |
| 70 | 70 | AT91C_SSC_START_CONTINOUS); |
| 71 | 71 | |
-
|
r539
|
r551
|
|
| 33 | 33 | volatile U32 *metadata = &(FLASH_BASE_PTR[origin*EFC_PAGE_WORDS]); |
| 34 | 34 | fs_file_t *file; |
| 35 | | |
| | 35 | |
| 36 | 36 | file = nx__fs_get_file(fd); |
| 37 | 37 | NX_ASSERT(file != NULL); |
| 38 | | |
| | 38 | |
| 39 | 39 | file->origin = origin; |
| 40 | 40 | file->size = nx__fs_get_file_size_from_metadata(metadata); |
| 41 | 41 | file->perms = nx__fs_get_file_perms_from_metadata(metadata); |
| 42 | | |
| | 42 | |
| 43 | 43 | file->rbuf.page = file->rbuf.pos = 0; |
| 44 | 44 | file->wbuf.page = file->wbuf.pos = 0; |
| … |
… |
|
| 53 | 53 | U32 origin; |
| 54 | 54 | fs_err_t err; |
| 55 | | |
| | 55 | |
| 56 | 56 | err = nx__fs_find_file_origin(name, &origin); |
| 57 | 57 | if (err != FS_ERR_NO_ERROR) { |
| 58 | 58 | return err; |
| 59 | 59 | } |
| 60 | | |
| | 60 | |
| 61 | 61 | return nx_fs_init_fd(origin, fd); |
| 62 | 62 | } |
| … |
… |
|
| 85 | 85 | if (origin >= EFC_PAGES) { |
| 86 | 86 | /* TODO: search for an available page on the flash. */ |
| 87 | | |
| | 87 | |
| 88 | 88 | return FS_ERR_NO_SPACE_LEFT_ON_DEVICE; |
| 89 | 89 | } |
| 90 | | |
| | 90 | |
| 91 | 91 | /* Bootstrap the metadata to the flash page. */ |
| 92 | 92 | nx__fs_create_metadata(FS_PERM_READWRITE, name, 0, metadata); |
| … |
… |
|
| 96 | 96 | return FS_ERR_FLASH_ERROR; |
| 97 | 97 | } |
| 98 | | |
| | 98 | |
| 99 | 99 | return nx_fs_init_fd(origin, fd); |
| 100 | 100 | } |
| … |
… |
|
| 123 | 123 | file = &(fdset[slot]); |
| 124 | 124 | file->used = TRUE; |
| 125 | | |
| | 125 | |
| 126 | 126 | switch (mode) { |
| 127 | 127 | case FS_FILE_MODE_CREATE: |
| … |
… |
|
| 134 | 134 | file->wbuf.pos = FS_FILE_METADATA_BYTES; |
| 135 | 135 | file->wbuf.page = file->origin; |
| 136 | | |
| | 136 | |
| 137 | 137 | file->rbuf = file->wbuf; |
| 138 | 138 | break; |
| … |
… |
|
| 143 | 143 | } |
| 144 | 144 | |
| 145 | | nx__efc_read_page(file->origin, file->wbuf.data.raw); |
| | 145 | nx__efc_read_page(file->origin, file->wbuf.data.raw); |
| 146 | 146 | file->wbuf.pos = FS_FILE_METADATA_BYTES; |
| 147 | 147 | file->wbuf.page = file->origin; |
| … |
… |
|
| 152 | 152 | err = nx_fs_open_by_name(name, slot); |
| 153 | 153 | if (err != FS_ERR_NO_ERROR) { |
| 154 | | break; |
| | 154 | break; |
| 155 | 155 | } |
| 156 | | |
| | 156 | |
| 157 | 157 | /* Put writing position at the end of the file. */ |
| 158 | 158 | file->wbuf.page = file->origin |
| … |
… |
|
| 160 | 160 | nx__efc_read_page(file->wbuf.page, file->wbuf.data.raw); |
| 161 | 161 | file->wbuf.pos = (FS_FILE_METADATA_BYTES + file->size) % EFC_PAGE_BYTES; |
| 162 | | |
| | 162 | |
| 163 | 163 | file->rbuf.page = file->origin; |
| 164 | | nx__efc_read_page(file->rbuf.page, file->rbuf.data.raw); |
| | 164 | nx__efc_read_page(file->rbuf.page, file->rbuf.data.raw); |
| 165 | 165 | file->rbuf.pos = FS_FILE_METADATA_BYTES; |
| 166 | 166 | |
| … |
… |
|
| 170 | 170 | break; |
| 171 | 171 | } |
| 172 | | |
| | 172 | |
| 173 | 173 | if (err == FS_ERR_NO_ERROR) { |
| 174 | 174 | *fd = slot; |
| … |
… |
|
| 177 | 177 | file->used = FALSE; |
| 178 | 178 | } |
| 179 | | |
| | 179 | |
| 180 | 180 | return err; |
| 181 | 181 | } |
| … |
… |
|
| 189 | 189 | return -1; |
| 190 | 190 | } |
| 191 | | |
| | 191 | |
| 192 | 192 | return file->size; |
| 193 | 193 | } |
| … |
… |
|
| 253 | 253 | if (err != FS_ERR_NO_ERROR) |
| 254 | 254 | return err; |
| 255 | | |
| | 255 | |
| 256 | 256 | file->wbuf.page++; |
| 257 | 257 | file->wbuf.pos = 0; |
| … |
… |
|
| 263 | 263 | |
| 264 | 264 | file->wbuf.data.bytes[file->wbuf.pos++] = byte; |
| 265 | | |
| | 265 | |
| 266 | 266 | /* Increment the size of the file if necessary */ |
| 267 | 267 | if (file->wbuf.page == file->origin + pages) { |
| … |
… |
|
| 278 | 278 | fs_err_t nx_fs_flush(fs_fd_t fd) { |
| 279 | 279 | fs_file_t *file; |
| 280 | | |
| | 280 | |
| 281 | 281 | file = nx__fs_get_file(fd); |
| 282 | 282 | if (!file) { |
| … |
… |
|
| 303 | 303 | fs_file_t *file; |
| 304 | 304 | fs_err_t err; |
| 305 | | |
| 306 | | file = nx__fs_get_file(fd); |
| 307 | | if (!file) { |
| 308 | | return FS_ERR_INVALID_FD; |
| 309 | | } |
| 310 | | |
| | 305 | |
| | 306 | file = nx__fs_get_file(fd); |
| | 307 | if (!file) { |
| | 308 | return FS_ERR_INVALID_FD; |
| | 309 | } |
| | 310 | |
| 311 | 311 | err = nx_fs_flush(fd); |
| 312 | 312 | if (err != FS_ERR_NO_ERROR) { |
| … |
… |
|
| 327 | 327 | fs_perm_t nx_fs_get_perms(fs_fd_t fd) { |
| 328 | 328 | fs_file_t *file; |
| 329 | | |
| | 329 | |
| 330 | 330 | file = nx__fs_get_file(fd); |
| 331 | 331 | if (!file) { |
| … |
… |
|
| 338 | 338 | fs_err_t nx_fs_set_perms(fs_fd_t fd, fs_perm_t perms) { |
| 339 | 339 | fs_file_t *file; |
| 340 | | |
| 341 | | file = nx__fs_get_file(fd); |
| 342 | | if (!file) { |
| 343 | | return FS_ERR_INVALID_FD; |
| 344 | | } |
| 345 | | |
| | 340 | |
| | 341 | file = nx__fs_get_file(fd); |
| | 342 | if (!file) { |
| | 343 | return FS_ERR_INVALID_FD; |
| | 344 | } |
| | 345 | |
| 346 | 346 | file->perms = perms; |
| 347 | | |
| | 347 | |
| 348 | 348 | return FS_ERR_NO_ERROR; |
| 349 | 349 | } |
| … |
… |
|
| 354 | 354 | U32 page, end; |
| 355 | 355 | U32 erase[EFC_PAGE_WORDS] = {0}; |
| 356 | | |
| 357 | | file = nx__fs_get_file(fd); |
| 358 | | if (!file) { |
| 359 | | return FS_ERR_INVALID_FD; |
| 360 | | } |
| 361 | | |
| | 356 | |
| | 357 | file = nx__fs_get_file(fd); |
| | 358 | if (!file) { |
| | 359 | return FS_ERR_INVALID_FD; |
| | 360 | } |
| | 361 | |
| 362 | 362 | /* Remove file marker and potential in-file marker-alike. */ |
| 363 | 363 | end = file->origin + nx__fs_get_file_page_count(file->size); |
| … |
… |
|
| 370 | 370 | } |
| 371 | 371 | } |
| 372 | | |
| | 372 | |
| 373 | 373 | file->used = FALSE; |
| 374 | 374 | return FS_ERR_NO_ERROR; |
| … |
… |
|
| 411 | 411 | if (files) { |
| 412 | 412 | } |
| 413 | | |
| | 413 | |
| 414 | 414 | if (used) { |
| 415 | 415 | } |
| 416 | | |
| | 416 | |
| 417 | 417 | if (free_pages) { |
| 418 | 418 | } |
| 419 | | |
| | 419 | |
| 420 | 420 | if (wasted) { |
| 421 | 421 | } |
-
|
r536
|
r551
|
|
| 84 | 84 | bool used; /**< Denotes fd usage. */ |
| 85 | 85 | char name[FS_FILENAME_LENGTH]; /**< The file name. */ |
| 86 | | |
| | 86 | |
| 87 | 87 | U32 origin; /**< File origin page on the flash */ |
| 88 | 88 | size_t size; /**< The file size. */ |
| 89 | | |
| | 89 | |
| 90 | 90 | fs_perm_t perms; /**< File permissions. */ |
| 91 | | |
| | 91 | |
| 92 | 92 | fs_buffer_t rbuf; /**< Read buffer. */ |
| 93 | 93 | fs_buffer_t wbuf; /**< Write buffer. */ |
-
|
r535
|
r551
|
|
| 19 | 19 | |
| 20 | 20 | NX_ASSERT(strlen(menu.title) > 0); |
| 21 | | |
| | 21 | |
| 22 | 22 | for (i=0; menu.entries[i]; count++, i++); |
| 23 | 23 | NX_ASSERT(count > 0); |
| … |
… |
|
| 58 | 58 | nx_display_string(". "); |
| 59 | 59 | |
| 60 | | nx_display_string(menu.entries[i]); |
| | 60 | nx_display_string(menu.entries[i]); |
| 61 | 61 | nx_display_end_line(); |
| 62 | 62 | } |
| … |
… |
|
| 85 | 85 | break; |
| 86 | 86 | } |
| 87 | | } while (!done); |
| | 87 | } while (!done); |
| 88 | 88 | |
| 89 | 89 | |
-
|
r549
|
r551
|
|
| 45 | 45 | return RCMD_ERR_NO_ERROR; |
| 46 | 46 | } |
| 47 | | |
| | 47 | |
| 48 | 48 | i++; |
| 49 | 49 | } |
| … |
… |
|
| 55 | 55 | int ntokens, indices[RCMD_MAX_TOKENS], subind[NXT_N_MOTORS], i; |
| 56 | 56 | char *spec; |
| 57 | | |
| | 57 | |
| 58 | 58 | bool active[NXT_N_MOTORS] = {FALSE}; |
| 59 | 59 | S32 speeds[NXT_N_MOTORS]; |
| 60 | 60 | U32 durations[NXT_N_MOTORS]; |
| 61 | | |
| | 61 | |
| 62 | 62 | nx__rcmd_tokenize(line, RCMD_TOKEN_SEPARATOR, &ntokens, indices); |
| 63 | 63 | |
| … |
… |
|
| 65 | 65 | return RCMD_ERR_INCORRECT_ARGC; |
| 66 | 66 | } |
| 67 | | |
| | 67 | |
| 68 | 68 | /* Parse motors spec. */ |
| 69 | 69 | spec = line + indices[1]; |
| … |
… |
|
| 77 | 77 | } |
| 78 | 78 | } |
| 79 | | |
| | 79 | |
| 80 | 80 | /* Parse speeds spec. */ |
| 81 | 81 | spec = line + indices[2]; |
| … |
… |
|
| 87 | 87 | speeds[i] = atos32(spec + subind[i]); |
| 88 | 88 | } |
| 89 | | |
| | 89 | |
| 90 | 90 | if (speeds[i] > 100 || speeds[i] < -100) { |
| 91 | 91 | return RCMD_ERR_INVALID_PARAMETER; |
| … |
… |
|
| 102 | 102 | durations[i] = atou32(spec + subind[i]); |
| 103 | 103 | } |
| 104 | | |
| | 104 | |
| 105 | 105 | if (speeds[i] != 0 && durations[i] == 0) { |
| 106 | 106 | return RCMD_ERR_INVALID_PARAMETER; |
| 107 | 107 | } |
| 108 | 108 | } |
| 109 | | |
| | 109 | |
| 110 | 110 | /* Activate motors. */ |
| 111 | 111 | for (i=0; i<NXT_N_MOTORS; i++) { |
| … |
… |
|
| 126 | 126 | rcmd_err_t nx__rcmd_print(char *line) { |
| 127 | 127 | int ntokens, indices[RCMD_MAX_TOKENS], i; |
| 128 | | |
| 129 | | nx__rcmd_tokenize(line, RCMD_TOKEN_SEPARATOR, &ntokens, indices); |
| 130 | | |
| | 128 | |
| | 129 | nx__rcmd_tokenize(line, RCMD_TOKEN_SEPARATOR, &ntokens, indices); |
| | 130 | |
| 131 | 131 | for (i=1; i<ntokens; i++) { |
| 132 | 132 | nx_display_string(line + indices[i]); |
| … |
… |
|
| 143 | 143 | char c; |
| 144 | 144 | c = line[0]; |
| 145 | | |
| | 145 | |
| 146 | 146 | nx_display_clear(); |
| 147 | 147 | return RCMD_ERR_NO_ERROR; |
| … |
… |
|
| 151 | 151 | int ntokens, indices[RCMD_MAX_TOKENS]; |
| 152 | 152 | U32 freq, duration; |
| 153 | | |
| 154 | | nx__rcmd_tokenize(line, RCMD_TOKEN_SEPARATOR, &ntokens, indices); |
| 155 | | |
| | 153 | |
| | 154 | nx__rcmd_tokenize(line, RCMD_TOKEN_SEPARATOR, &ntokens, indices); |
| | 155 | |
| 156 | 156 | if (ntokens < rcmd_commands[RCMD_CMD_PLAY].argc) { |
| 157 | 157 | return RCMD_ERR_INCORRECT_ARGC; |
| 158 | 158 | } |
| 159 | | |