📄 synclogc.nc
字号:
/**
* Test reading and writing to a log with lots of syncs. See README.txt for
* more details.
*
* @author Mayur Maheshwari (mayur.maheshwari@gmail.com)
* @author David Gay
*/
module SyncLogC
{
uses {
interface Leds;
interface Boot;
interface SplitControl as AMControl;
interface LogWrite;
interface LogRead;
interface Timer<TMilli> as Timer0;
interface Timer<TMilli> as Timer1;
interface AMSend;
}
}
implementation {
uint16_t data = 0;
uint16_t readings = 0;
message_t pkt;
bool busy = FALSE;
bool logBusy = FALSE;
task void sendTask();
storage_cookie_t readCookie;
storage_cookie_t writeCookie;
#define SAMPLING_FREQUENCY 2333
#define TIMER_PERIOD_MILLI 5120
event void Boot.booted() {
call AMControl.start();
}
event void AMControl.startDone(error_t err) {
if (err == SUCCESS)
call LogWrite.erase();
else
call AMControl.start();
}
event void LogWrite.eraseDone(error_t result) {
call Timer1.startPeriodic(SAMPLING_FREQUENCY);
call Timer0.startPeriodic(TIMER_PERIOD_MILLI);
}
event void Timer1.fired()
{
readings++;
if (!logBusy)
{
logBusy = TRUE;
call LogWrite.append(&readings, sizeof(readings));
}
}
event void LogWrite.appendDone(void *buf, storage_len_t len, bool recordsLost, error_t result) {
if (result == SUCCESS)
call LogWrite.sync();
}
event void LogWrite.syncDone(error_t result) {
logBusy = FALSE;
call Leds.led2Toggle();
}
event void Timer0.fired() {
call Timer1.stop();
if (!logBusy)
{
call Leds.led0Toggle();
logBusy = TRUE;
call LogRead.read(&data, sizeof data);
}
}
event void LogRead.readDone(void* buf, storage_len_t len, error_t error) {
if (error == SUCCESS)
if (len == sizeof data)
post sendTask();
else
{
logBusy = FALSE;
call Timer1.startPeriodic(SAMPLING_FREQUENCY);
}
}
typedef nx_struct {
nx_uint16_t nodeid;
nx_uint16_t payloadData;
} SenseStoreRadioMsg;
task void sendTask() {
if (!busy)
{
SenseStoreRadioMsg* ssrpkt =
(SenseStoreRadioMsg*)(call AMSend.getPayload(&pkt, sizeof(SenseStoreRadioMsg)));
ssrpkt->nodeid = TOS_NODE_ID;
ssrpkt->payloadData = data;
if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(SenseStoreRadioMsg)) == SUCCESS)
busy = TRUE;
}
}
event void AMSend.sendDone(message_t* msg, error_t err) {
if (&pkt == msg)
{
busy = FALSE;
call LogRead.read(&data, sizeof data);
}
}
event void LogRead.seekDone(error_t error) { }
event void AMControl.stopDone(error_t err) { }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -