}
void radioOff() {
- call ByteRadio.off();
call CC1000Control.off();
+ call ByteRadio.off();
}
/* LPL preamble length and sleep time computation */
{
case IDLE_STATE:
/* Timer already running means that we have a noise floor
- measurement scheduled. */
+ measurement scheduled. If we just set a new alarm here, we
+ might indefinitely delay noise floor measurements if we're,
+ e,g, transmitting frequently. */
if (!call WakeupTimer.isRunning())
if (call CC1000Squelch.settled())
{
- if (lplRxPower == 0 || f.txPending)
+ if (lplRxPower == 0)
call WakeupTimer.startOneShot(CC1K_SquelchIntervalSlow);
else
// timeout for receiving a message after an lpl check
*/
if (data > call CC1000Squelch.get() - (call CC1000Squelch.get() >> 2))
{
+ post sleepCheck();
// don't be too agressive (ignore really quiet thresholds).
if (data < call CC1000Squelch.get() + (call CC1000Squelch.get() >> 3))
{
rssiForSquelch = data;
post adjustSquelch();
}
- post sleepCheck();
}
else if (count++ > 5)
{
interface ReadNow<uint16_t> as Rssi[uint8_t reason];
async command void cancel();
}
- uses interface Read<uint16_t> as ActualRssi;
+ uses {
+ interface Resource;
+ interface ReadNow<uint16_t> as ActualRssi;
+ }
}
implementation
{
currentOp = CANCELLED;
}
- void startNextOp() {
- if (nextOp != IDLE)
- {
- currentOp = nextOp;
- nextOp = IDLE;
- call ActualRssi.read();
- }
- else
- currentOp = IDLE;
- }
-
- task void startOpTask() {
- atomic startNextOp();
+ event void Resource.granted() {
+ call ActualRssi.read();
}
async command error_t Rssi.read[uint8_t reason]() {
if (currentOp == IDLE)
{
- nextOp = reason;
- post startOpTask();
+ currentOp = reason;
+ if (call Resource.immediateRequest() == SUCCESS)
+ call ActualRssi.read();
+ else
+ call Resource.request();
}
- else // We should only come here with currentOp = CANCELLED
+ else
nextOp = reason;
return SUCCESS;
}
- event void ActualRssi.readDone(error_t result, uint16_t data) {
- atomic
+ void startNextOp() {
+ currentOp = nextOp;
+ if (nextOp != IDLE)
{
- uint8_t op = currentOp;
+ nextOp = IDLE;
+ call ActualRssi.read();
+ }
+ else
+ call Resource.release();
+ }
+ async event void ActualRssi.readDone(error_t result, uint16_t data) {
+ atomic
+ {
/* The code assumes that RSSI measurements are 10-bits
(legacy effect) */
- data >>= 6;
+ signal Rssi.readDone[currentOp](result, data >> 6);
startNextOp();
-
- signal Rssi.readDone[op](result, data);
}
}