* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/*
- * Copyright (c) 2008 Johns Hopkins University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose, without fee, and without written
- * agreement is hereby granted, provided that the above copyright
- * notice, the (updated) modification history and the author appear in
- * all copies of this source code.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA,
- * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
/**
* @author Kevin Klues <klueska@cs.stanford.edu>
* @author Chieh-Jan Mike Liang <cliang4@cs.jhu.edu>
uses {
interface Boot;
interface Thread as ReceiveThread;
+ interface Thread as SnoopThread;
interface Thread as SendThread;
interface ConditionVariable;
interface Mutex;
interface Leds;
interface BlockingReceive as BlockingReceiveAny;
+ interface BlockingReceive as BlockingSnoopAny;
interface BlockingAMSend as BlockingAMSend[uint8_t id];
interface Packet as ReceivePacket;
interface Packet as SendPacket;
call Mutex.init(&m_queue);
call Mutex.init(&m_pool);
call ReceiveThread.start(NULL);
+ call SnoopThread.start(NULL);
call SendThread.start(NULL);
}
}
}
+ event void SnoopThread.run(void* arg) {
+ message_t* msg;
+ call Mutex.lock(&m_pool);
+ msg = call Pool.get();
+ call Mutex.unlock(&m_pool);
+ for(;;) {
+ if(call BlockingSnoopAny.receive(msg, 0) == SUCCESS) {
+ call Leds.led0Toggle();
+
+ call Mutex.lock(&m_queue);
+ call Queue.enqueue(msg);
+ call Mutex.unlock(&m_queue);
+ if( call Queue.size() == 1 ) {
+ call ConditionVariable.signalAll(&c_queue);
+ }
+
+ call Mutex.lock(&m_pool);
+ while( call Pool.empty() )
+ call ConditionVariable.wait(&c_pool, &m_pool);
+ msg = call Pool.get();
+ call Mutex.unlock(&m_pool);
+
+ }
+ else call Leds.led2Toggle();
+ }
+ }
+
event void SendThread.run(void* arg) {
message_t* msg;
am_id_t id;
}
}
}
+
+ default command error_t BlockingSnoopAny.receive(message_t* m, uint32_t timeout) { return FAIL; }
+ default command void* BlockingSnoopAny.getPayload(message_t* msg, uint8_t len) { return NULL; }
+ default command error_t SnoopThread.start(void* arg) { return FAIL; }
+ default command error_t SnoopThread.stop() { return FAIL; }
+ default command error_t SnoopThread.pause() { return FAIL; }
+ default command error_t SnoopThread.resume() { return FAIL; }
+ default command error_t SnoopThread.sleep(uint32_t milli) { return FAIL; }
}