本文整理汇总了C++中TAL_CONVERT_SYMBOLS_TO_US函数的典型用法代码示例。如果您正苦于以下问题:C++ TAL_CONVERT_SYMBOLS_TO_US函数的具体用法?C++ TAL_CONVERT_SYMBOLS_TO_US怎么用?C++ TAL_CONVERT_SYMBOLS_TO_US使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了TAL_CONVERT_SYMBOLS_TO_US函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sw_controlled_csma
/**
* \brief Handles software-controlled CSMA.
*
* \param csma_mode CSMA Mode; eg. ED or CS
* \param retransmit true if frame re-transmission is requested
*/
static inline void sw_controlled_csma(csma_mode_t csma_mode, bool retransmit)
{
if (retransmit) {
number_of_tx_retries = 0; /* actual number of retries */
} else {
/* no further retries */
number_of_tx_retries = tal_pib.MaxFrameRetries;
}
/* Handle interframe spacing */
if (csma_mode == NO_CSMA_WITH_IFS) {
if (last_frame_length > aMaxSIFSFrameSize) {
pal_timer_delay(TAL_CONVERT_SYMBOLS_TO_US(
macMinLIFSPeriod_def)
- IRQ_PROCESSING_DLY_US -
PRE_TX_DURATION_US);
} else {
pal_timer_delay(TAL_CONVERT_SYMBOLS_TO_US(
macMinSIFSPeriod_def)
- IRQ_PROCESSING_DLY_US -
PRE_TX_DURATION_US);
}
}
if ((csma_mode == NO_CSMA_WITH_IFS) || (csma_mode == NO_CSMA_NO_IFS)) {
tx_frame();
} else {
csma_start();
}
}
示例2: start_backoff
/**
* \brief Starts the timer for the backoff period and enables receiver.
*/
static void start_backoff(void)
{
/* Start backoff timer to trigger CCA */
uint8_t backoff_8;
backoff_8 = (uint8_t)rand() & ((1 << BE) - 1);
if (backoff_8 > 0) {
uint16_t backoff_16;
uint32_t backoff_duration_us;
backoff_16 = backoff_8 * aUnitBackoffPeriod;
backoff_duration_us = TAL_CONVERT_SYMBOLS_TO_US(backoff_16);
pal_timer_start(TAL_T_BOFF, backoff_duration_us,
TIMEOUT_RELATIVE,
(FUNC_PTR)cca_start, NULL);
tal_state = TAL_BACKOFF;
#ifdef RX_WHILE_BACKOFF
/* Switch receiver on during backoff */
if (NULL == tal_rx_buffer) {
set_trx_state(CMD_PLL_ON);
tal_rx_on_required = true;
} else {
set_trx_state(CMD_RX_AACK_ON); /* receive while backoff
**/
}
#else
set_trx_state(CMD_PLL_ON);
#endif
} else {
/* Start CCA immediately - no backoff */
cca_start(NULL);
}
}
示例3: mac_start_missed_beacon_timer
/*
* @brief helper function to start missed beacon timer
*/
void mac_start_missed_beacon_timer(void)
{
uint32_t sync_loss_time;
uint8_t timer_status;
/* Stop the missed beacon timer. */
pal_timer_stop(T_Missed_Beacon);
#if (DEBUG > 0)
if (pal_is_timer_running(T_Missed_Beacon))
{
ASSERT("Missed BCN tmr running" == 0);
}
#endif
/* Calculate the time allowed for missed beacons. */
if (tal_pib.BeaconOrder < NON_BEACON_NWK)
{
/*
* This the regualar case where we already have a Beacon Order.
* In this case the Sync Loss time is a function of the actual
* Beacon Order.
*/
sync_loss_time = TAL_GET_BEACON_INTERVAL_TIME(tal_pib.BeaconOrder);
}
else
{
/*
* This the "pathological" case where we don NOT have a Beacon Order.
* This happens regularly in case of synchronization before association
* if the Beacon Order was not set be the network layer or application.
*
* In this case the Sync Loss time is based on the highest possible
* Beacon Order, which is 15 - 1, since 15 means no Beacon network.
*/
sync_loss_time = TAL_GET_BEACON_INTERVAL_TIME(NON_BEACON_NWK - 1);
}
sync_loss_time *= aMaxLostBeacons;
sync_loss_time = TAL_CONVERT_SYMBOLS_TO_US(sync_loss_time);
timer_status = pal_timer_start(T_Missed_Beacon,
sync_loss_time,
TIMEOUT_RELATIVE,
(FUNC_PTR)mac_t_missed_beacons_cb,
NULL);
if (MAC_SUCCESS != timer_status)
{
#if (DEBUG > 0)
ASSERT(MAC_SUCCESS == timer_status);
#endif
/* Sync timer could not be started hence report sync-loss */
mac_sync_loss(MAC_BEACON_LOSS);
}
}
示例4: tfa_ed_sample
/**
* @brief Perform a single ED measurement
*
* @return ed_value Result of the measurement
* If the build switch TRX_REG_RAW_VALUE is defined, the transceiver's
* register value is returned.
*/
uint8_t tfa_ed_sample(void)
{
trx_irq_reason_t trx_irq_cause;
uint8_t ed_value;
tal_trx_status_t trx_status;
/* Make sure that receiver is switched on. */
do
{
trx_status = set_trx_state(CMD_RX_ON);
}
while (trx_status != RX_ON);
/*
* Disable the transceiver interrupts to prevent frame reception
* while performing ED scan.
*/
pal_trx_bit_write(SR_RX_PDT_DIS, RX_DISABLE);
/* Write dummy value to start measurement. */
pal_trx_reg_write(RG_PHY_ED_LEVEL, 0xFF);
/* Wait for ED measurement completion. */
pal_timer_delay(TAL_CONVERT_SYMBOLS_TO_US(ED_SAMPLE_DURATION_SYM));
do
{
trx_irq_cause = (trx_irq_reason_t)pal_trx_reg_read(RG_IRQ_STATUS);
}
while ((trx_irq_cause & TRX_IRQ_CCA_ED_READY) != TRX_IRQ_CCA_ED_READY);
/* Read the ED Value. */
ed_value = pal_trx_reg_read(RG_PHY_ED_LEVEL);
#ifndef TRX_REG_RAW_VALUE
/*
* Scale ED result.
* Clip values to 0xFF if > -35dBm
*/
if (ed_value > CLIP_VALUE_REG)
{
ed_value = 0xFF;
}
else
{
ed_value = (uint8_t)(((uint16_t)ed_value * 0xFF) / CLIP_VALUE_REG);
}
#endif
/* Clear IRQ register */
pal_trx_reg_read(RG_IRQ_STATUS);
/* Enable reception agian */
pal_trx_bit_write(SR_RX_PDT_DIS, RX_ENABLE);
/* Switch receiver off again */
set_trx_state(CMD_TRX_OFF);
return ed_value;
}
示例5: handle_rx_on
/*
* @brief Internal function to handle immediate RX_ON
*
* This function immediately enables the receiver with the given
* RxOnDuration time in symbols from now.
*
* @param rx_on_duration_symbols Duration in symbols that the reciever is
* switched on.
*/
static void handle_rx_on(uint32_t rx_on_duration_symbols, uint8_t *m)
{
retval_t timer_status;
uint8_t rx_enable_status = mac_rx_enable();
/*
* TODO: Once it is possible to restart a timer even if it is
* already running, this could be improved by simply calling
* function pal_timer_start() without this previous check using
* function pal_is_timer_running().
*/
if (pal_is_timer_running(T_Rx_Enable))
{
/*
* Rx-Enable timer is already running, so we need to stopp it first
* before it will be started.
*/
pal_timer_stop(T_Rx_Enable);
}
/*
* Start timer for the Rx On duration of the radio being on
* in order to switch it off later again.
*/
timer_status =
pal_timer_start(T_Rx_Enable,
TAL_CONVERT_SYMBOLS_TO_US(rx_on_duration_symbols),
TIMEOUT_RELATIVE,
(FUNC_PTR())mac_t_rx_off_cb,
NULL);
ASSERT(MAC_SUCCESS == timer_status);
/*
* Send the confirm immediately depending on the status of
* the timer start and the Rx Status
*/
if (MAC_SUCCESS != timer_status)
{
gen_rx_enable_conf((buffer_t *)m, (uint8_t)MAC_INVALID_PARAMETER);
/* Do house-keeeping and turn radio off. */
mac_t_rx_off_cb(NULL);
}
else if (PHY_RX_ON != rx_enable_status)
{
gen_rx_enable_conf((buffer_t *)m, (uint8_t)MAC_TX_ACTIVE);
}
else
{
gen_rx_enable_conf((buffer_t *)m, (uint8_t)MAC_SUCCESS);
}
return;
}
示例6: tfa_cca_perform
/**
* @brief Perform a CCA
*
* This function performs a CCA request.
*
* @return phy_enum_t PHY_IDLE or PHY_BUSY
*/
phy_enum_t tfa_cca_perform(void)
{
tal_trx_status_t trx_status;
uint8_t cca_status;
uint8_t cca_done;
/* Ensure that trx is not in SLEEP for register access */
do
{
trx_status = set_trx_state(CMD_TRX_OFF);
}
while (trx_status != TRX_OFF);
/* no interest in receiving frames while doing CCA */
pal_trx_bit_write(SR_RX_PDT_DIS, RX_DISABLE); // disable frame reception indication
/* Set trx to rx mode. */
do
{
trx_status = set_trx_state(CMD_RX_ON);
}
while (trx_status != RX_ON);
/* Start CCA */
pal_trx_bit_write(SR_CCA_REQUEST, CCA_START);
/* wait until CCA is done */
pal_timer_delay(TAL_CONVERT_SYMBOLS_TO_US(CCA_DURATION_SYM));
do
{
/* poll until CCA is really done */
cca_done = pal_trx_bit_read(SR_CCA_DONE);
}
while (cca_done != CCA_COMPLETED);
set_trx_state(CMD_TRX_OFF);
/* Check if channel was idle or busy. */
if (pal_trx_bit_read(SR_CCA_STATUS) == CCA_CH_IDLE)
{
cca_status = PHY_IDLE;
}
else
{
cca_status = PHY_BUSY;
}
/* Enable frame reception again. */
pal_trx_bit_write(SR_RX_PDT_DIS, RX_ENABLE);
return (phy_enum_t)cca_status;
}
示例7: mac_scan_send_complete
/**
* @brief Continue scanning after the completion of frame transmission.
*
* This functions continues the corresponding scaning depending on status
* from the transmission of a beacon request or orphan notification frame.
*
* @param status Status of transmission
*/
void mac_scan_send_complete(retval_t status)
{
retval_t timer_status;
mac_pib.mac_DSN++;
if (MAC_SUCCESS == status) {
uint32_t tmr = 0;
if (MAC_SCAN_ACTIVE == mac_scan_state) {
tmr = MAC_CALCULATE_SYMBOL_TIME_SCANDURATION(
scan_duration);
} else {
/*
* Since this function is only called in active or
* orphan scan state,
* this case is handling the orphan scan state.
*/
tmr = mac_pib.mac_ResponseWaitTime;
}
timer_status = pal_timer_start(T_Scan_Duration,
TAL_CONVERT_SYMBOLS_TO_US(tmr),
TIMEOUT_RELATIVE,
(FUNC_PTR)mac_t_scan_duration_cb,
NULL);
#if (_DEBUG_ > 0)
Assert(MAC_SUCCESS == timer_status);
#endif
if (MAC_SUCCESS != timer_status) {
uint8_t timer_id = T_Scan_Duration;
/*
* Scan duration timer could not be started, so we call
* the timer callback function directly. This will
* basically
* shorten scanning without having really scanned.
*/
mac_t_scan_duration_cb((void *)&timer_id);
}
} else {
/* Did not work, continue. */
scan_curr_channel++;
scan_proceed(scan_type, (buffer_t *)mac_conf_buf_ptr);
}
}
示例8: start_beacon_loss_timer
/**
* \brief Starts the beacon loss timer
*/
static void start_beacon_loss_timer(void)
{
uint32_t timer_duration_us;
#if (_DEBUG_ > 0)
retval_t timer_status;
#endif
/* debug pin to switch on: define ENABLE_DEBUG_PINS, pal_config.h */
PIN_BEACON_LOSS_TIMER_START();
timer_duration_us
= TAL_CONVERT_SYMBOLS_TO_US(TAL_GET_BEACON_INTERVAL_TIME(tal_pib
.BeaconOrder));
timer_duration_us *= aMaxLostBeacons;
timer_duration_us += CSMA_BEACON_LOSS_GUARD_TIME_US;
#if (_DEBUG_ > 0)
timer_status =
#endif
pal_timer_start(TAL_CSMA_BEACON_LOSS_TIMER,
timer_duration_us,
TIMEOUT_RELATIVE,
(FUNC_PTR)beacon_loss_timer_cb,
NULL);
#if (_DEBUG_ > 0)
if (timer_status != MAC_SUCCESS) {
if (timer_status == PAL_TMR_INVALID_TIMEOUT) {
Assert(
"beacon loss timer start failed: PAL_TMR_INVALID_TIMEOUT" ==
0);
} else if (timer_status == PAL_TMR_ALREADY_RUNNING) {
Assert(
"beacon loss timer start failed: PAL_TMR_ALREADY_RUNNING" ==
0);
} else {
Assert("beacon loss timer start failed: ?" == 0);
}
}
#endif
}
示例9: csma_backoff_calculation
/**
* \brief Calculates backoff duration and handles the start of the CCA
*/
static void csma_backoff_calculation(void)
{
uint32_t current_CAP_duration_sym;
uint32_t current_CAP_end_sym;
uint32_t next_backoff_boundary_us;
uint32_t now_time_sym;
uint32_t guard_time_before_next_beacon;
/* \TODO consider CFP and BLE mode */
current_CAP_duration_sym = TAL_GET_SUPERFRAME_DURATION_TIME(
tal_pib.SuperFrameOrder);
current_CAP_end_sym = tal_add_time_symbols(tal_pib.BeaconTxTime,
current_CAP_duration_sym);
/*
* Add some guard time to ensure that the transaction is completed
* before
* the timer fires that is going to track the next beacon.
*/
guard_time_before_next_beacon = TAL_RADIO_WAKEUP_TIME_SYM <<
(tal_pib.BeaconOrder + 2);
guard_time_before_next_beacon += TAL_CONVERT_US_TO_SYMBOLS(
PRE_BEACON_GUARD_TIME_US);
current_CAP_end_sym = tal_sub_time_symbols(current_CAP_end_sym,
guard_time_before_next_beacon);
/* Calculate next backoff period boundary. */
{
uint32_t time_since_last_beacon_sym;
uint32_t next_backoff_boundary_period;
pal_get_current_time(&now_time_sym);
now_time_sym = TAL_CONVERT_US_TO_SYMBOLS(now_time_sym);
time_since_last_beacon_sym = tal_sub_time_symbols(now_time_sym,
tal_pib.BeaconTxTime);
next_backoff_boundary_period = time_since_last_beacon_sym /
aUnitBackoffPeriod;
if ((time_since_last_beacon_sym % aUnitBackoffPeriod) > 0) {
next_backoff_boundary_period++;
}
next_backoff_boundary_us
= TAL_CONVERT_SYMBOLS_TO_US(
pal_add_time_us(tal_pib.BeaconTxTime,
(next_backoff_boundary_period *
aUnitBackoffPeriod)));
}
/* Check if we are still within the CAP. */
if (next_backoff_boundary_us >=
TAL_CONVERT_SYMBOLS_TO_US(current_CAP_end_sym)) {
/* current CAP is over, wait for next CAP */
tal_csma_state = BACKOFF_WAITING_FOR_BEACON;
start_beacon_loss_timer();
} else { /* next backoff boundary is within current CAP */
uint32_t remaining_periods_in_CAP; /* \TODO check if variable
* size can be reduced */
/* Check if the remaining backoff time will expire in current
* CAP. */
remaining_periods_in_CAP = tal_sub_time_symbols(
current_CAP_end_sym, now_time_sym) /
aUnitBackoffPeriod;
if (remaining_backoff_periods > remaining_periods_in_CAP) {
/*
* Reduce the backoff peridos by the remaining duration
* in
* the current CAP and continue in next CAP.
*/
remaining_backoff_periods -= remaining_periods_in_CAP;
tal_csma_state = BACKOFF_WAITING_FOR_BEACON;
start_beacon_loss_timer();
} else { /* there are enough backoff periods in current CAP */
uint32_t time_after_transaction_sym; /* \TODO check if
* variable size
* can be reduced
**/
uint32_t transaction_duration_sym; /* \TODO check if
* variable size can
* be reduced */
/* Add some guard time to wakeup the transceiver. */
transaction_duration_sym
= (transaction_duration_periods *
aUnitBackoffPeriod) +
TAL_CONVERT_US_TO_SYMBOLS(
SLEEP_TO_TRX_OFF_TYP_US +
CCA_GUARD_DURATION_US);
time_after_transaction_sym
= tal_add_time_symbols(TAL_CONVERT_US_TO_SYMBOLS(
next_backoff_boundary_us),
transaction_duration_sym);
//.........这里部分代码省略.........
示例10: perform_cca_twice
/**
* \brief Performs CCA twice
*/
static uint8_t perform_cca_twice(void)
{
uint8_t cca_status;
uint8_t cca_done;
uint8_t CW = 2;
uint32_t now_time_us;
do {
pal_get_current_time(&now_time_us);
} while (pal_add_time_us(now_time_us,
(SLEEP_TO_TRX_OFF_TYP_US +
CCA_PREPARATION_DURATION_US)) <
cca_starttime_us);
#if ((MAC_START_REQUEST_CONFIRM == 1) && (defined BEACON_SUPPORT))
if (tal_beacon_transmission) {
#if (_DEBUG_ > 0)
Assert("Ongoing beacon transmission, slotted CSMA busy" == 0);
#endif
return PHY_BUSY;
}
#endif /* ((MAC_START_REQUEST_CONFIRM == 1) && (defined BEACON_SUPPORT)) */
/* Ensure that trx is at least in TRX_OFF mode at this time. */
if (tal_trx_status == TRX_SLEEP) {
set_trx_state(CMD_TRX_OFF);
}
do {
pal_get_current_time(&now_time_us);
} while (pal_add_time_us(now_time_us,
(TRX_OFF_TO_PLL_ON_TIME_US +
CCA_PREPARATION_DURATION_US)) <
cca_starttime_us);
/*
* Set trx to PLL_ON.
* If trx is busy and trx cannot be set to PLL_ON, assess channel as
* busy.
*/
if (set_trx_state(CMD_PLL_ON) != PLL_ON) {
return PHY_BUSY;
}
/* no interest in receiving frames while doing CCA */
trx_bit_write(SR_RX_PDT_DIS, RX_DISABLE); /* disable frame reception
* indication */
/* do CCA twice */
do {
/* wait here until 16us before backoff boundary */
/* assume TRX is in PLL_ON */
do {
pal_get_current_time(&now_time_us);
} while (pal_add_time_us(now_time_us,
CCA_PRE_START_DURATION_US) <
cca_starttime_us);
set_trx_state(CMD_RX_ON);
/* debug pin to switch on: define ENABLE_DEBUG_PINS,
* pal_config.h */
PIN_CCA_START();
/* Start CCA */
trx_bit_write(SR_CCA_REQUEST, CCA_START);
/* wait until CCA is done and get status */
pal_timer_delay(TAL_CONVERT_SYMBOLS_TO_US(CCA_DURATION_SYM));
do {
/* poll until CCA is really done; */
cca_done = trx_bit_read(SR_CCA_DONE);
} while (cca_done != CCA_COMPLETED);
/* between both CCA switch trx to PLL_ON to reduce power
* consumption */
set_trx_state(CMD_PLL_ON);
/* debug pin to switch on: define ENABLE_DEBUG_PINS,
* pal_config.h */
PIN_CCA_END();
/* check if channel was idle or busy */
if (trx_bit_read(SR_CCA_STATUS) == CCA_CH_IDLE) {
/* do next CCA at next backoff boundary */
cca_starttime_us = pal_add_time_us(cca_starttime_us,
TAL_CONVERT_SYMBOLS_TO_US(
aUnitBackoffPeriod));
CW--;
cca_status = PHY_IDLE;
} else { /* PHY busy */
cca_status = PHY_BUSY;
set_trx_state(CMD_RX_AACK_ON);
break; /* if channel is busy do no do CCA for the second
* time */
//.........这里部分代码省略.........
示例11: mlme_rx_enable_request
//.........这里部分代码省略.........
* According to 7.1.10.1.3:
* On a beacon-enabled PAN, the MLME first determines whether
* (RxOnTime + RxOnDuration) is less than the beacon interval, defined
* by macBeaconOrder. If it is not less, the MLME issues the
* MLME-RX-ENABLE.confirm primitive with a status of MAC_INVALID_PARAMETER.
*/
rx_off_time_symbols = rxe->RxOnTime + rxe->RxOnDuration;
if (rx_off_time_symbols >= curr_beacon_int_time_symbols)
{
/* Send the confirm immediately. */
gen_rx_enable_conf((buffer_t *)m, (uint8_t)MAC_INVALID_PARAMETER);
return;
}
pal_get_current_time(&now_time_symbols);
now_time_symbols = TAL_CONVERT_US_TO_SYMBOLS(now_time_symbols);
symbols_since_beacon = tal_sub_time_symbols(now_time_symbols, tal_pib.BeaconTxTime);
/*
* Actually, MLME-RX-ENABLE.request in a beacon enabled PAN does
* only make sense if the MAC is currently tracking beacons, so
* that macBeaconTxTime is up to date. If it appears that
* the last known macBeaconTxTime does not relate to the
* current superframe, reject the request.
*/
if (symbols_since_beacon > curr_beacon_int_time_symbols)
{
/* Send the confirm immediately. */
gen_rx_enable_conf((buffer_t *)m, (uint8_t)MAC_INVALID_PARAMETER);
return;
}
rx_on_time_symbols = tal_add_time_symbols(tal_pib.BeaconTxTime, rxe->RxOnTime);
/* Check whether RxOnTime can still be handled in current CAP. */
pal_get_current_time(&now_time_symbols);
now_time_symbols = TAL_CONVERT_US_TO_SYMBOLS(now_time_symbols);
if (tal_add_time_symbols(rx_on_time_symbols, TAL_CONVERT_US_TO_SYMBOLS(MIN_TIMEOUT))
< now_time_symbols)
{
/* RxOnTime not possible within this CAP, see whether deferred
* handling is allowed or not.. */
if (!(rxe->DeferPermit))
{
gen_rx_enable_conf((buffer_t *)m, (uint8_t)MAC_PAST_TIME);
return;
}
else
{
/*
* The MAC defers until the next superframe and attempts to enable
* the receiver in that superframe.
*/
rx_on_time_symbols = tal_add_time_symbols(rx_on_time_symbols,
curr_beacon_int_time_symbols);
}
}
/*
* Since the Rx-Enable timer could already be running,
* it is stopped first, before it will be started (again).
*/
pal_timer_stop(T_Rx_Enable);
do
{
/*
* Start a timer to turn Rx ON at the time "rxe->RxOnTime" from the start
* of the next superframe.
* Return value to be checked, because Rx on time could be too short
* or in the past already.
*/
timer_status =
pal_timer_start(T_Rx_Enable,
TAL_CONVERT_SYMBOLS_TO_US(rx_on_time_symbols),
TIMEOUT_ABSOLUTE,
(FUNC_PTR())mac_t_rx_on_cb,
(void *)m);
if (MAC_SUCCESS != timer_status)
{
rx_on_time_symbols = tal_add_time_symbols(rx_on_time_symbols,
curr_beacon_int_time_symbols);
}
}
while (MAC_SUCCESS != timer_status);
/* Remember the time to turn off the receiver. */
rx_off_time_symbols = tal_add_time_symbols(rx_on_time_symbols, rxe->RxOnDuration);
/* The remaining stuff will be done once the Rx On Timer expires. */
}
#else /* No BEACON_SUPPORT */
handle_rx_on(rxe->RxOnDuration, m);
#endif /* BEACON_SUPPORT / No BEACON_SUPPORT */
} /* mlme_rx_enable_request() */
示例12: send_frame
/*
* \brief Sends frame
*
* \param use_csma Flag indicating if CSMA is requested
* \param tx_retries Flag indicating if transmission retries are requested
* by the MAC layer
*/
void send_frame(csma_mode_t csma_mode, bool tx_retries)
{
tal_trx_status_t trx_status;
/* Configure tx according to tx_retries */
if (tx_retries) {
trx_bit_write(SR_MAX_FRAME_RETRIES,
tal_pib.MaxFrameRetries);
} else {
trx_bit_write(SR_MAX_FRAME_RETRIES, 0);
}
/* Configure tx according to csma usage */
if ((csma_mode == NO_CSMA_NO_IFS) || (csma_mode == NO_CSMA_WITH_IFS)) {
if (tx_retries) {
trx_bit_write(SR_MAX_CSMA_RETRIES,
tal_pib.MaxCSMABackoffs);
trx_reg_write(RG_CSMA_BE, 0x00);
} else {
trx_bit_write(SR_MAX_CSMA_RETRIES, 7);
}
} else {
trx_reg_write(RG_CSMA_BE,
((tal_pib.MaxBE << 4) | tal_pib.MinBE));
trx_bit_write(SR_MAX_CSMA_RETRIES, tal_pib.MaxCSMABackoffs);
}
do {
trx_status = set_trx_state(CMD_TX_ARET_ON);
} while (trx_status != TX_ARET_ON);
/* Handle interframe spacing */
if (csma_mode == NO_CSMA_WITH_IFS) {
if (last_frame_length > aMaxSIFSFrameSize) {
pal_timer_delay(TAL_CONVERT_SYMBOLS_TO_US(
macMinLIFSPeriod_def)
- IRQ_PROCESSING_DLY_US -
PRE_TX_DURATION_US);
last_frame_length = 0;
} else {
pal_timer_delay(TAL_CONVERT_SYMBOLS_TO_US(
macMinSIFSPeriod_def)
- IRQ_PROCESSING_DLY_US -
PRE_TX_DURATION_US);
last_frame_length = 0;
}
} else {
/*
* If no delay is applied after switching to TX_ARET_ON,
* a short delay is required that allows that a pending TX_END
* IRQ for
* ACK transmission gets served.
*/
pal_timer_delay(TRX_IRQ_DELAY_US);
}
ENTER_CRITICAL_REGION(); /* prevent from buffer underrun */
/* Toggle the SLP_TR pin triggering transmission. */
TRX_SLP_TR_HIGH();
PAL_WAIT_65_NS();
TRX_SLP_TR_LOW();
/*
* Send the frame to the transceiver.
* Note: The PhyHeader is the first byte of the frame to
* be sent to the transceiver and this contains the frame
* length.
* The actual length of the frame to be downloaded
* (parameter two of trx_frame_write)
* is
* 1 octet frame length octet
* + n octets frame (i.e. value of frame_tx[0])
* - 2 octets FCS
*/
trx_frame_write(tal_frame_to_tx, tal_frame_to_tx[0] - 1);
tal_state = TAL_TX_AUTO;
LEAVE_CRITICAL_REGION();
}
示例13: mac_process_beacon_frame
//.........这里部分代码省略.........
/* Payload is not present, hence the buffer is freed here */
bmm_buffer_free(beacon);
}
/* Handling of ancounced broadcast traffic by the parent. */
#ifdef BEACON_SUPPORT
if (MAC_SCAN_IDLE == mac_scan_state)
{
/*
* In case this is a beaconing network, and this node is not scanning,
* and the FCF indicates pending data thus indicating broadcast data at
* parent, the node needs to be awake until the received broadcast
* data has been received.
*/
if (mac_parse_data.fcf & FCF_FRAME_PENDING)
{
mac_bc_data_indicated = true;
/*
* Start timer since the broadcast frame is expected within
* macMaxFrameTotalWaitTime symbols.
*/
if (MAC_POLL_IDLE == mac_poll_state)
{
/*
* If the poll state is not idle, there is already an
* indirect transaction ongoing.
* Since the T_Poll_Wait_Time is going to be re-used,
* this timer can only be started, if we are not in
* a polling state other than idle.
*/
uint32_t response_timer = mac_pib.mac_MaxFrameTotalWaitTime;
response_timer = TAL_CONVERT_SYMBOLS_TO_US(response_timer);
if (MAC_SUCCESS != pal_timer_start(T_Poll_Wait_Time,
response_timer,
TIMEOUT_RELATIVE,
(FUNC_PTR)mac_t_wait_for_bc_time_cb,
NULL))
{
mac_t_wait_for_bc_time_cb(NULL);
}
}
else
{
/*
* Any indirect poll operation is ongoing, so the timer will
* not be started, i.e. nothing to be done here.
* Once this ongoing indirect transaction has finished, this
* node will go back to sleep anyway.
*/
}
}
else
{
mac_bc_data_indicated = false;
}
} /* (MAC_SCAN_IDLE == mac_scan_state) */
#endif /* BEACON_SUPPORT */
/* Handling of presented indirect traffic by the parent for this node. */
#if ((MAC_INDIRECT_DATA_BASIC == 1) && (MAC_SYNC_REQUEST == 1))
if (MAC_SCAN_IDLE == mac_scan_state)
示例14: tal_convert_symbols_to_us_def
/**
* @brief Conversion of symbols to microseconds
*/
uint32_t tal_convert_symbols_to_us_def(uint32_t symbols)
{
return (TAL_CONVERT_SYMBOLS_TO_US(symbols));
}
示例15: tx_done_handling
/*
* \brief Implements the handling of the transmission end.
*
* This function handles the callback for the transmission end.
*/
void tx_done_handling(void)
{
tal_state = TAL_IDLE;
#if (defined BEACON_SUPPORT) || (defined ENABLE_TSTAMP)
/*
* The entire timestamp calculation is only required for beaconing
*networks
* or if timestamping is explicitly enabled.
*/
/* Calculate negative offset of timestamp */
uint16_t offset;
/* Calculate the tx time */
offset
= TAL_CONVERT_SYMBOLS_TO_US(
(PHY_OVERHEAD + LENGTH_FIELD_LEN) * SYMBOLS_PER_OCTET)
+ TAL_PSDU_US_PER_OCTET(*tal_frame_to_tx + FCS_LEN)
+ IRQ_PROCESSING_DLY_US;
if (mac_frame_ptr->mpdu[PL_POS_FCF_1] & FCF_ACK_REQUEST) {
/* Tx timestamp needs to be reduced by ACK duration etc. */
offset
+= TAL_CONVERT_SYMBOLS_TO_US(
(PHY_OVERHEAD +
LENGTH_FIELD_LEN) * SYMBOLS_PER_OCTET) +
TAL_PSDU_US_PER_OCTET(ACK_PAYLOAD_LEN +
FCS_LEN);
#ifdef HIGH_DATA_RATE_SUPPORT
if (tal_pib.CurrentPage == 0) {
offset += TAL_CONVERT_SYMBOLS_TO_US(aTurnaroundTime);
} else {
offset += 32;
}
#else
offset += TAL_CONVERT_SYMBOLS_TO_US(aTurnaroundTime);
#endif /* #ifdef HIGH_DATA_RATE_SUPPORT */
}
mac_frame_ptr->time_stamp -= offset;
#endif /* #if (defined BEACON_SUPPORT) || (defined ENABLE_TSTAMP) */
retval_t status;
switch (trx_trac_status) {
case TRAC_SUCCESS:
status = MAC_SUCCESS;
break;
case TRAC_SUCCESS_DATA_PENDING:
status = TAL_FRAME_PENDING;
break;
case TRAC_CHANNEL_ACCESS_FAILURE:
status = MAC_CHANNEL_ACCESS_FAILURE;
break;
case TRAC_NO_ACK:
status = MAC_NO_ACK;
break;
case TRAC_INVALID:
status = FAILURE;
break;
default:
Assert("Unexpected tal_tx_state" == 0);
status = FAILURE;
break;
}
tal_tx_frame_done_cb(status, mac_frame_ptr);
} /* tx_done_handling() */