Ejemplo n.º 1
0
bool nrf_send_packet(const NRF_ADDR* targetAddr, const uint8_t* data)
{
    if (targetAddr == NULL || data == NULL)
    {
        return false;
    }

    nrf_standby();

    nrf_set_tx_addr(targetAddr->B, sizeof(targetAddr->B));

    nrf_cmd_write(NRF_CMD_W_TX_PAYLOAD, data, NRF_PACKET_SIZE);

    nrf_ce_pulse(NRF_CE_PULSE_DELAY_US);

    if (nrf_wait_irq(NRF_TX_WAIT_MS))
    {
        uint8_t status = nrf_reg_read(NRF_REG_STATUS);
        nrf_reg_write(NRF_REG_STATUS, NRF_STATUS_TX_DS | NRF_STATUS_MAX_RT);

        if (status & NRF_STATUS_TX_DS)
        {
            return true;
        }
        else if (status & NRF_STATUS_MAX_RT)
        {
            nrf_cmd_write(NRF_CMD_FLUSH_TX, NULL, 0);
            return false;
        }
        else
        {
            nrf_debugPrint("Unexpected status in sending packet:");
            nrf_debugDumpBytes(&status, sizeof(status));
            nrf_debugPrint("\r\n");
        }
    }
    else
    {
        nrf_debugPrint("Sending timeout\r\n");
    }

    return false;
}
Ejemplo n.º 2
0
Archivo: main.c Proyecto: Drooids/nrf
static void handle_set_msg(snrf_msg_t* msg)
{
  /* capture before modifying */
  const uint8_t key = msg->u.set.key;
  const uint32_t val = le_to_uint32(msg->u.set.val);

  if ((snrf_state != SNRF_STATE_CONF) && (key != SNRF_KEY_STATE))
  {
    MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL);
    return ;
  }

  /* completion sent back, assume success */
  MAKE_COMPL_ERROR(msg, SNRF_ERR_SUCCESS);

  switch (key)
  {
  case SNRF_KEY_STATE:
    {
      if (val >= SNRF_STATE_MAX)
      {
	MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL);
	break ;
      }

      if (val == snrf_state)
      {
	/* nothing */
	break ;
      }

      if (val == SNRF_STATE_CONF)
      {
	nrf_set_powerdown_mode();
      }
      else if (val == SNRF_STATE_TXRX)
      {
	nrf_set_rx_mode();
      }

      snrf_state = val;

      break ;
    }

  case SNRF_KEY_CRC:
    if (val == SNRF_CRC_DISABLED) nrf_disable_crc();
    else if (val == SNRF_CRC_8) nrf_enable_crc8();
    else if (val == SNRF_CRC_16) nrf_enable_crc16();
    else MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL);
    break ;

#if (NRF_CONFIG_NRF24L01P == 1)
  case SNRF_KEY_RATE:
    {
      static const uint8_t map[] =
      {
	NRF24L01P_RATE_250KBPS, /* invalid */
	NRF24L01P_RATE_250KBPS,
	NRF24L01P_RATE_1MBPS,
	NRF24L01P_RATE_2MBPS
      };
      if ((val == 0) || (val >= ARRAY_COUNT(map)))
      {
	MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL);
      }
      else
      {
	nrf24l01p_set_rate(map[val]);
      }
      break ;
    }
#endif

#if (NRF_CONFIG_NRF24L01P == 1)
  case SNRF_KEY_CHAN:
    nrf24l01p_set_chan((uint8_t)val);
    break ;
#endif

  case SNRF_KEY_ADDR_WIDTH:
    if (nrf_set_addr_width(val)) MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL);
    break ;

  case SNRF_KEY_RX_ADDR:
    nrf_set_rx_addr((uint8_t*)&val);
    break ;

  case SNRF_KEY_TX_ADDR:
    nrf_set_tx_addr((uint8_t*)&val);
    break ;

  case SNRF_KEY_TX_ACK:
    /* disable tx ack */
    if (val == 0) nrf_disable_tx_ack();
    /* enable tx ack */
    else if (val == 1) nrf_enable_tx_ack();
    else MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL);
    break ;

  case SNRF_KEY_PAYLOAD_WIDTH:
    if (val > SNRF_MAX_PAYLOAD_WIDTH) MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL);
    else nrf_set_payload_width((uint8_t)val);
    break ;

  case SNRF_KEY_UART_FLAGS:
    uart_flags = (uint8_t)val;
    break ;

  default:
    MAKE_COMPL_ERROR(msg, SNRF_ERR_KEY);
    break ;
  }
}