* the stack.
*/
-module CC1000RssiP
+module CC1000RssiP @safe()
{
provides {
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();
+ }
- /* The code assumes that RSSI measurements are 10-bits
- (legacy effect) */
- data >>= 6;
+ async event void ActualRssi.readDone(error_t result, uint16_t data) {
+ atomic
+ {
+ /* The RSSI measurements are assumed to be 10-bits */
+ signal Rssi.readDone[currentOp](result, data);
startNextOp();
-
- signal Rssi.readDone[op](result, data);
}
}