Пример #1
0
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());
    }
}
Пример #2
0
/*
 * @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 */
    }
}
Пример #3
0
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: