You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.3 KiB
C
116 lines
4.3 KiB
C
/***************************************************************************//**
|
|
* @file
|
|
* @brief This file contains helpers for transitioning into the various
|
|
* AppModes
|
|
*******************************************************************************
|
|
* # License
|
|
* <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
|
|
*******************************************************************************
|
|
*
|
|
* SPDX-License-Identifier: Zlib
|
|
*
|
|
* The licensor of this software is Silicon Laboratories Inc.
|
|
*
|
|
* This software is provided 'as-is', without any express or implied
|
|
* warranty. In no event will the authors be held liable for any damages
|
|
* arising from the use of this software.
|
|
*
|
|
* Permission is granted to anyone to use this software for any purpose,
|
|
* including commercial applications, and to alter it and redistribute it
|
|
* freely, subject to the following restrictions:
|
|
*
|
|
* 1. The origin of this software must not be misrepresented; you must not
|
|
* claim that you wrote the original software. If you use this software
|
|
* in a product, an acknowledgment in the product documentation would be
|
|
* appreciated but is not required.
|
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
* misrepresented as being the original software.
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
*
|
|
******************************************************************************/
|
|
|
|
#include <stdlib.h>
|
|
#include "rail.h"
|
|
#include "rail_types.h"
|
|
#include "response_print.h"
|
|
#include "app_common.h"
|
|
|
|
// Guard for CI functions to ensure a certain AppMode before running
|
|
bool inAppMode(AppMode_t appMode, char *command)
|
|
{
|
|
bool ret = (currentAppMode() == appMode);
|
|
if (!ret && command) {
|
|
responsePrintError(command, 0x16,
|
|
"Need to be in %s mode, not %s, for this command",
|
|
appModeNames(appMode),
|
|
appModeNames(currentAppMode()));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// Setting semantics for enabling AppMode
|
|
void setNextAppMode(AppMode_t next, char *command)
|
|
{
|
|
if (next == NONE) {
|
|
enableAppMode(currentAppMode(), false, command);
|
|
} else {
|
|
enableAppMode(next, true, command);
|
|
}
|
|
}
|
|
|
|
// Used when the AppMode is needed to be enabled to continue the function
|
|
bool enableAppModeSync(AppMode_t mode, bool enable, char *command)
|
|
{
|
|
changeAppModeIfPending();
|
|
enableAppMode(mode, enable, command);
|
|
changeAppModeIfPending();
|
|
// inAppMode shouldn't print, since enableAppMode will cause a print
|
|
return inAppMode(enable ? mode : NONE, NULL);
|
|
}
|
|
|
|
void scheduleNextTx(void)
|
|
{
|
|
// Schedule the next tx if there are more coming
|
|
if (txCount > 0 || currentAppMode() == TX_CONTINUOUS) {
|
|
if (enableRandomTxDelay) {
|
|
float randBetween0and1 = ((float) rand()) / (((uint32_t) RAND_MAX) + 1);
|
|
float fTxDelay = continuousTransferPeriod * 1000 * randBetween0and1;
|
|
RAIL_SetTimer(railHandle, (uint32_t) fTxDelay, RAIL_TIME_DELAY, &RAILCb_TimerExpired);
|
|
} else {
|
|
RAIL_SetTimer(railHandle, continuousTransferPeriod * 1000, RAIL_TIME_DELAY, &RAILCb_TimerExpired);
|
|
}
|
|
} else if (currentAppMode() == TX_N_PACKETS || currentAppMode() == TX_SCHEDULED
|
|
|| currentAppMode() == TX_UNDERFLOW || currentAppMode() == TX_CANCEL) {
|
|
setNextAppMode(NONE, NULL);
|
|
} else {
|
|
// If we automatically transitioned to SCHTX_AFTER_RX, or don't know how we
|
|
// got here, just finish whatever transmission just happened
|
|
pendFinishTxSequence();
|
|
}
|
|
}
|
|
|
|
void radioTransmit(uint32_t iterations, char *command)
|
|
{
|
|
// Do the normal work of just increasing the tx count
|
|
txCount = iterations;
|
|
|
|
if (iterations > 0) {
|
|
if (currentAppMode() == TX_UNDERFLOW) {
|
|
setNextAppMode(TX_UNDERFLOW, command); // Get a printout for TX
|
|
pendPacketTx(); // Start transmitting without waiting for the mode change
|
|
} else {
|
|
// Make a change if we're supposed to transmit more packets
|
|
setNextAppMode(TX_N_PACKETS, command);
|
|
}
|
|
} else {
|
|
// A tx count of 0 will stop a continuous or fixed transmit if we're in the
|
|
// middle of one. Otherwise, we'll enable continuous mode.
|
|
if (currentAppMode() == TX_N_PACKETS || currentAppMode() == TX_CONTINUOUS
|
|
|| currentAppMode() == TX_UNDERFLOW) {
|
|
setNextAppMode(NONE, command);
|
|
} else {
|
|
setNextAppMode(TX_CONTINUOUS, command);
|
|
}
|
|
}
|
|
}
|