void _cc110x_get_set_address_handler(int argc, char **argv) { if (argc > 1) { int16_t a = atoi(argv[1]); printf("[cc110x] Setting address %i ... ", a); cc1100_set_address((radio_address_t)a); if (cc1100_get_address() == (radio_address_t)a) { puts("[OK]"); } else { puts("Error!"); } } else { printf("[cc1100] Got address: %i\n", cc1100_get_address()); } }
/* * @brief Get the current address of transceiver device * * @param t The transceiver device * * @return The configured address of the device * * TODO: define error behavior */ static radio_address_t get_address(transceiver_type_t t) { switch (t) { case TRANSCEIVER_CC1100: #if (defined(MODULE_CC110X) || defined(MODULE_CC110X_LEGACY)) return cc110x_get_address(); #elif MODULE_CC110X_LEGACY_CSMA return cc1100_get_address(); #else return 0; /* XXX see TODO above */ #endif #ifdef MODULE_CC2420 case TRANSCEIVER_CC2420: return cc2420_get_address(); #endif #ifdef MODULE_MC1322X case TRANSCEIVER_MC1322X: return maca_get_address(); #endif #ifdef MODULE_NATIVENET case TRANSCEIVER_NATIVE: return nativenet_get_address(); #endif #ifdef MODULE_AT86RF231 case TRANSCEIVER_AT86RF231: return at86rf231_get_address(); #endif default: return 0; /* XXX see TODO above */ } }
int cc1100_send(radio_address_t addr, protocol_t protocol, int priority, char *payload, int payload_len) { bool result; int return_code; uint8_t address; uint8_t retries; /* Lock mutex, nobody else should send now */ cc1100_phy_mutex_lock(); /* TX state machine lock -> no timers (WOR), no packets (only ACKs) */ rflags.TX = true; /* Set chip to idle state */ cc1100_set_idle(); /* CC1100 radio layer only supports 8-bit addresses */ address = addr; /* Loopback not supported */ if (address == cc1100_get_address()) { return_code = RADIO_ADDR_OUT_OF_RANGE; goto mode_before_final; } /* Check address */ if (address > MAX_UID) { return_code = RADIO_ADDR_OUT_OF_RANGE; goto mode_before_final; } /* Packet too long */ if (payload_len > MAX_DATA_LENGTH) { return_code = RADIO_PAYLOAD_TOO_LONG; goto mode_before_final; } if (radio_state == RADIO_PWD) { return_code = RADIO_WRONG_MODE; goto mode_before_final; } /* Set number of transmission retries */ retries = (address == CC1100_BROADCAST_ADDRESS) ? cc1100_retransmission_count_bc : cc1100_retransmission_count_uc; memset(tx_buffer.data, 0, MAX_DATA_LENGTH); /* Clean data */ /* TODO: If packets are shorter than max packet size, WOR interval is too long. * This must be solved in some way. */ tx_buffer.length = 3 + payload_len; /* 3 bytes (A&PS&F) + data length */ tx_buffer.address = address; /* Copy destination address */ tx_buffer.flags = 0x00; /* Set clean state */ tx_buffer.flags = W_FLAGS_PROTOCOL(protocol); /* Copy protocol identifier */ tx_buffer.phy_src = (uint8_t) cc1100_get_address(); /* Copy sender address */ /* Set identification number of packet */ tx_buffer.flags |= rflags.SEQ; /* Set flags.identification (bit 0) */ rflags.SEQ = !rflags.SEQ; /* Toggle value of layer 0 sequence number bit */ memcpy(tx_buffer.data, payload, payload_len); /* Copy data */ /* Send the packet */ cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */ result = send_burst(&tx_buffer, retries, 0); /* Send raw burst */ return_code = result ? payload_len : RADIO_OP_FAILED; /* Collect statistics */ if (address != CC1100_BROADCAST_ADDRESS) { cc1100_statistic.packets_out++; if (result) { cc1100_statistic.packets_out_acked++; } } else { cc1100_statistic.packets_out_broadcast++; } goto final; mode_before_final: rflags.TX = false; /* Definitely set secure mode (CONST_RX -> RX, WOR -> WOR) */ cc1100_go_after_tx(); final: