[Tinyos-beta-commits] CVS: tinyos-1.x/beta/Deluge/Deluge Deluge.h,
1.8, 1.9 DelugeC.nc, 1.4, 1.5 DelugeDataRead.nc, 1.4,
1.5 DelugeDataWrite.nc, 1.3, 1.4 DelugeM.nc, 1.16,
1.17 DelugeMetadata.h, 1.3, 1.4 DelugeMetadata.nc, 1.7,
1.8 DelugeMetadataC.nc, 1.6, 1.7 DelugeMetadataM.nc, 1.15,
1.16 DelugeMsgs.h, 1.3, 1.4 DelugePageTransfer.nc, 1.3,
1.4 DelugePageTransferC.nc, 1.6, 1.7 DelugePageTransferM.nc,
1.10, 1.11 DelugeStorageM.nc, 1.8, 1.9 NetProgC.nc, 1.4,
1.5 NetProgM.nc, 1.6, 1.7 SharedMsgBufM.nc, 1.2, 1.3
Jonathan Hui
jwhui at users.sourceforge.net
Tue May 17 13:55:51 PDT 2005
Update of /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20836/Deluge
Modified Files:
Deluge.h DelugeC.nc DelugeDataRead.nc DelugeDataWrite.nc
DelugeM.nc DelugeMetadata.h DelugeMetadata.nc
DelugeMetadataC.nc DelugeMetadataM.nc DelugeMsgs.h
DelugePageTransfer.nc DelugePageTransferC.nc
DelugePageTransferM.nc DelugeStorageM.nc NetProgC.nc
NetProgM.nc SharedMsgBufM.nc
Log Message:
- GoldenImage now computes CRCs when cloning to flash so TOSBoot can
verify it.
- Removed spinning task loops.
- Reduced code size by about 1K.
- With improvements in storage stack, GoldenImage compiles to 20894
bytes under nesc-1.2alpha7.
- Overhead of including Deluge in SurgeTelos is 7746 bytes, which
includes the storage stack.
Index: Deluge.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/Deluge.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** Deluge.h 20 Apr 2005 23:26:59 -0000 1.8
--- Deluge.h 17 May 2005 20:55:47 -0000 1.9
***************
*** 47,51 ****
DELUGE_PKTS_PER_PAGE = 48,
DELUGE_PKT_PAYLOAD_SIZE = 23,
- DELUGE_DATA_Q_SIZE = 2,
DELUGE_DATA_OFFSET = 128,
DELUGE_IDENT_SIZE = 128,
--- 47,50 ----
***************
*** 86,93 ****
typedef struct DelugeAdvTimer {
! uint32_t timer : 24;
uint8_t periodLog2 : 8;
! bool overheard : 8;
! uint8_t newAdvs : 8;
} DelugeAdvTimer;
--- 85,92 ----
typedef struct DelugeAdvTimer {
! uint32_t timer : 32;
uint8_t periodLog2 : 8;
! bool overheard : 1;
! uint8_t newAdvs : 7;
} DelugeAdvTimer;
Index: DelugeC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeC.nc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** DelugeC.nc 20 Jan 2005 01:36:43 -0000 1.4
--- DelugeC.nc 17 May 2005 20:55:47 -0000 1.5
***************
*** 47,50 ****
--- 47,51 ----
Main,
BitVecUtilsC,
+ CrcC,
DelugeM,
DelugeMetadataC as Metadata,
***************
*** 69,80 ****
StdControl = DelugeM;
- Main.StdControl -> Comm;
Main.StdControl -> NetProgC;
- Main.StdControl -> SharedMsgBufM;
- Main.StdControl -> TimerC;
DelugeM.MetadataControl -> Metadata;
DelugeM.PageTransferControl -> PageTransfer;
DelugeM.Leds -> Leds;
DelugeM.Metadata -> Metadata.Metadata[unique("DelugeMetadata")];
--- 70,79 ----
StdControl = DelugeM;
Main.StdControl -> NetProgC;
DelugeM.MetadataControl -> Metadata;
DelugeM.PageTransferControl -> PageTransfer;
+ DelugeM.Crc -> CrcC;
DelugeM.Leds -> Leds;
DelugeM.Metadata -> Metadata.Metadata[unique("DelugeMetadata")];
Index: DelugeDataRead.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeDataRead.nc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** DelugeDataRead.nc 18 Mar 2005 01:13:27 -0000 1.4
--- DelugeDataRead.nc 17 May 2005 20:55:47 -0000 1.5
***************
*** 34,38 ****
interface DelugeDataRead {
! command result_t read(imgnum_t imgNum, block_addr_t addr, uint8_t* buf, block_addr_t len);
event void readDone(storage_result_t result);
--- 34,38 ----
interface DelugeDataRead {
! command result_t read(imgnum_t imgNum, block_addr_t addr, void* buf, block_addr_t len);
event void readDone(storage_result_t result);
Index: DelugeDataWrite.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeDataWrite.nc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** DelugeDataWrite.nc 11 Mar 2005 21:46:37 -0000 1.3
--- DelugeDataWrite.nc 17 May 2005 20:55:47 -0000 1.4
***************
*** 31,35 ****
interface DelugeDataWrite {
! command result_t write(imgnum_t imgNum, block_addr_t addr, uint8_t* source, block_addr_t len);
event void writeDone(storage_result_t result);
--- 31,35 ----
interface DelugeDataWrite {
! command result_t write(imgnum_t imgNum, block_addr_t addr, void* source, block_addr_t len);
event void writeDone(storage_result_t result);
Index: DelugeM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeM.nc,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** DelugeM.nc 25 Apr 2005 19:15:21 -0000 1.16
--- DelugeM.nc 17 May 2005 20:55:47 -0000 1.17
***************
*** 34,37 ****
--- 34,38 ----
}
uses {
+ interface Crc;
interface DelugeMetadata as Metadata;
interface DelugePageTransfer as PageTransfer;
***************
*** 106,124 ****
}
void setNextPage() {
! DelugeImgDesc imgDesc;
uint8_t i;
! for ( i = 0; i < DELUGE_NUM_IMAGES; i++ ) {
! call Metadata.getImgDesc(i, &imgDesc);
! if (imgDesc.numPgs != imgDesc.numPgsComplete) {
! call PageTransfer.setWorkingPage(i, imgDesc.numPgsComplete);
return;
}
}
call PageTransfer.setWorkingPage(DELUGE_INVALID_IMGNUM, DELUGE_INVALID_PGNUM);
!
}
--- 107,136 ----
}
+ void resetTimer(uint8_t i) {
+ if (advTimers[i].periodLog2 != DELUGE_MIN_ADV_PERIOD_LOG2) {
+ advTimers[i].periodLog2 = DELUGE_MIN_ADV_PERIOD_LOG2;
+ setupAdvTimer(i);
+ }
+ }
+
void setNextPage() {
! DelugeImgDesc *imgDesc;
uint8_t i;
! for ( i = 1; i < DELUGE_NUM_IMAGES; i++ ) {
! imgDesc = call Metadata.getImgDesc(i);
! if (imgDesc->numPgs != imgDesc->numPgsComplete) {
! call PageTransfer.setWorkingPage(i, imgDesc->numPgsComplete);
! advTimers[i-1].newAdvs = DELUGE_NUM_NEWDATA_ADVS_REQUIRED;
! resetTimer(i-1);
! call Leds.redOff();
return;
}
}
+ call Leds.redOn();
call PageTransfer.setWorkingPage(DELUGE_INVALID_IMGNUM, DELUGE_INVALID_PGNUM);
!
}
***************
*** 134,137 ****
--- 146,150 ----
void realStart() {
+
uint8_t i;
***************
*** 141,151 ****
state = S_ENABLED;
setNextPage();
- rebootDelay = 0;
- for ( i = 0; i < DELUGE_NUM_TIMERS; i++ ) {
- advTimers[i].periodLog2 = DELUGE_MIN_ADV_PERIOD_LOG2;
- setupAdvTimer(i);
- }
}
--- 154,162 ----
state = S_ENABLED;
+ for ( i = 0; i < DELUGE_NUM_TIMERS; i++ )
+ resetTimer(i);
+
setNextPage();
}
***************
*** 186,190 ****
TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
! DelugeAdvMsg* pMsg = (DelugeAdvMsg*)pMsgBuf->data;
if (!call SharedMsgBuf.isLocked()) {
--- 197,202 ----
TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
! DelugeAdvMsg *pMsg = (DelugeAdvMsg*)pMsgBuf->data;
! DelugeImgDesc *imgDesc = call Metadata.getImgDesc(imgNum);
if (!call SharedMsgBuf.isLocked()) {
***************
*** 192,197 ****
pMsg->version = DELUGE_VERSION;
pMsg->type = DELUGE_ADV_NORMAL;
! memcpy(&(pMsg->nodeDesc), &nodeDesc, sizeof(nodeDesc));
! call Metadata.getImgDesc(imgNum, &(pMsg->imgDesc));
if (call SendAdvMsg.send(addr, sizeof(DelugeAdvMsg), pMsgBuf) == SUCCESS) {
call Leds.greenToggle();
--- 204,210 ----
pMsg->version = DELUGE_VERSION;
pMsg->type = DELUGE_ADV_NORMAL;
! memcpy(&pMsg->nodeDesc, &nodeDesc, sizeof(DelugeNodeDesc));
! memcpy(&pMsg->imgDesc, imgDesc, sizeof(DelugeImgDesc));
! pMsg->numImages = DELUGE_NUM_IMAGES;
if (call SendAdvMsg.send(addr, sizeof(DelugeAdvMsg), pMsgBuf) == SUCCESS) {
call Leds.greenToggle();
***************
*** 206,217 ****
uint8_t minTimer = findMinTimer();
- if (call PageTransfer.getWorkingImage() == DELUGE_INVALID_IMGNUM)
- call Leds.redOn();
- else
- call Leds.redOff();
-
- if (rebootDelay == 0)
- call Leds.yellowOff();
-
updateTimers(minTimer);
--- 219,222 ----
***************
*** 231,237 ****
}
}
! else if (advTimers[minTimer].newAdvs == 0
! && advTimers[minTimer].periodLog2 < DELUGE_MAX_ADV_PERIOD_LOG2) {
! advTimers[minTimer].periodLog2++;
}
--- 236,245 ----
}
}
! else {
! call Leds.yellowOff();
! if (advTimers[minTimer].newAdvs == 0
! && advTimers[minTimer].periodLog2 < DELUGE_MAX_ADV_PERIOD_LOG2) {
! advTimers[minTimer].periodLog2++;
! }
}
***************
*** 243,254 ****
bool isNodeDescValid(DelugeNodeDesc* tmpNodeDesc) {
! uint8_t* tmp = (uint8_t*)tmpNodeDesc;
! uint16_t crc = 0;
! uint8_t i;
!
! for ( i = 0; i < 4; i++ )
! crc = crcByte(crc, tmp[i]);
!
! return ((crc == tmpNodeDesc->crc) || (tmpNodeDesc->vNum == DELUGE_INVALID_VNUM));
}
--- 251,256 ----
bool isNodeDescValid(DelugeNodeDesc* tmpNodeDesc) {
! return (tmpNodeDesc->crc == call Crc.crc16(tmpNodeDesc, 4)
! || tmpNodeDesc->vNum == DELUGE_INVALID_VNUM);
}
***************
*** 257,275 ****
DelugeAdvMsg *rxAdvMsg = (DelugeAdvMsg*)(pMsg->data);
imgnum_t imgNum = rxAdvMsg->imgDesc.imgNum;
- dm_cmp_t cmpResult = call Metadata.compareImgDesc(&(rxAdvMsg->imgDesc));
! if (state != S_ENABLED)
! return pMsg;
!
! if (rxAdvMsg->version != DELUGE_VERSION
|| !call Metadata.isImgDescValid(&(rxAdvMsg->imgDesc))
|| !isNodeDescValid(&rxAdvMsg->nodeDesc))
return pMsg;
!
if (rxAdvMsg->type == DELUGE_ADV_PC) {
// adv message from PC
if ((rxAdvMsg->nodeDesc.vNum == DELUGE_INVALID_VNUM
&& rxAdvMsg->nodeDesc.imgNum == DELUGE_INVALID_IMGNUM)
! || (cmpResult == DELUGE_IMGDESC_EQUAL)) {
sendAdvMsg(imgNum, rxAdvMsg->sourceAddr);
return pMsg;
--- 259,281 ----
DelugeAdvMsg *rxAdvMsg = (DelugeAdvMsg*)(pMsg->data);
imgnum_t imgNum = rxAdvMsg->imgDesc.imgNum;
! DelugeImgDesc *cmpImgDesc = &(rxAdvMsg->imgDesc);
! DelugeImgDesc *curImgDesc;
! bool isEqual = FALSE;
!
! if (state != S_ENABLED
! || rxAdvMsg->version != DELUGE_VERSION
|| !call Metadata.isImgDescValid(&(rxAdvMsg->imgDesc))
|| !isNodeDescValid(&rxAdvMsg->nodeDesc))
return pMsg;
!
! curImgDesc = call Metadata.getImgDesc(imgNum);
!
if (rxAdvMsg->type == DELUGE_ADV_PC) {
// adv message from PC
if ((rxAdvMsg->nodeDesc.vNum == DELUGE_INVALID_VNUM
&& rxAdvMsg->nodeDesc.imgNum == DELUGE_INVALID_IMGNUM)
! || (cmpImgDesc->vNum == curImgDesc->vNum
! && cmpImgDesc->numPgsComplete == curImgDesc->numPgsComplete)) {
sendAdvMsg(imgNum, rxAdvMsg->sourceAddr);
return pMsg;
***************
*** 277,306 ****
}
! // don't listen to advertisements about the factory image
if (imgNum != DELUGE_GOLDEN_IMAGE_NUM) {
! switch (cmpResult) {
! case DELUGE_IMGDESC_EQUAL:
! advTimers[imgNum-1].overheard = 1;
! break;
! case DELUGE_IMGDESC_NEWER:
! call Metadata.setupNewImage(&(rxAdvMsg->imgDesc));
! break;
! case DELUGE_IMGDESC_LARGER:
! // notify page transfer of more data
if (advTimers[imgNum-1].newAdvs == 0)
call PageTransfer.dataAvailable(rxAdvMsg->sourceAddr, imgNum);
- break;
- case DELUGE_IMGDESC_OLDER:
- case DELUGE_IMGDESC_SMALLER:
- advTimers[imgNum-1].newAdvs = DELUGE_NUM_NEWDATA_ADVS_REQUIRED;
- break;
}
! if ((cmpResult != DELUGE_IMGDESC_EQUAL
! || rxAdvMsg->nodeDesc.vNum != nodeDesc.vNum)
! && advTimers[imgNum-1].periodLog2 != DELUGE_MIN_ADV_PERIOD_LOG2) {
! advTimers[imgNum-1].periodLog2 = DELUGE_MIN_ADV_PERIOD_LOG2;
! setupAdvTimer(imgNum-1);
! }
}
--- 283,312 ----
}
! // don't listen to advertisements about the golden image
if (imgNum != DELUGE_GOLDEN_IMAGE_NUM) {
! if (cmpImgDesc->vNum != curImgDesc->vNum) {
! // image is newer
! if (curImgDesc->vNum == DELUGE_INVALID_VNUM
! || (cmpImgDesc->vNum != DELUGE_INVALID_VNUM
! && (cmpImgDesc->vNum - curImgDesc->vNum) > 0))
! call Metadata.setupNewImage(&(rxAdvMsg->imgDesc));
! }
! // image is larger
! else if (cmpImgDesc->numPgsComplete > curImgDesc->numPgsComplete) {
if (advTimers[imgNum-1].newAdvs == 0)
call PageTransfer.dataAvailable(rxAdvMsg->sourceAddr, imgNum);
}
+ // image is smaller
+ else if (cmpImgDesc->numPgsComplete < curImgDesc->numPgsComplete) {
+ advTimers[imgNum-1].newAdvs = DELUGE_NUM_NEWDATA_ADVS_REQUIRED;
+ }
+ // image is the same
+ else {
+ advTimers[imgNum-1].overheard = 1;
+ isEqual = TRUE;
+ }
! if (!isEqual || rxAdvMsg->nodeDesc.vNum != nodeDesc.vNum)
! resetTimer(imgNum-1);
}
***************
*** 311,320 ****
call Leds.yellowOn();
nodeDesc = rxAdvMsg->nodeDesc;
- advTimers[tmpImgNum-1].periodLog2 = DELUGE_MIN_ADV_PERIOD_LOG2;
rebootDelay = DELUGE_REBOOT_DELAY;
! setupAdvTimer(tmpImgNum-1);
if (rxAdvMsg->sourceAddr == TOS_UART_ADDR
|| rxAdvMsg->type == DELUGE_ADV_PC)
! sendAdvMsg(imgNum, rxAdvMsg->sourceAddr);
}
--- 317,325 ----
call Leds.yellowOn();
nodeDesc = rxAdvMsg->nodeDesc;
rebootDelay = DELUGE_REBOOT_DELAY;
! resetTimer(tmpImgNum-1);
if (rxAdvMsg->sourceAddr == TOS_UART_ADDR
|| rxAdvMsg->type == DELUGE_ADV_PC)
! sendAdvMsg(tmpImgNum, rxAdvMsg->sourceAddr);
}
***************
*** 323,330 ****
}
- event void Metadata.setupNewImageDone(result_t result) {
- setNextPage();
- }
-
event result_t SendAdvMsg.sendDone(TOS_MsgPtr pMsg, result_t result) {
dbg(DBG_USR1, "send adv message\n");
--- 328,331 ----
***************
*** 333,361 ****
}
! event result_t PageTransfer.receivedPage(imgnum_t imgNum, pgnum_t pgNum) {
call Metadata.receivedPage(imgNum, pgNum);
- return SUCCESS;
}
! event result_t PageTransfer.suppressMsgs(imgnum_t imgNum) {
advTimers[imgNum-1].overheard = 1;
- return SUCCESS;
}
! event void Metadata.receivedPageDone(result_t result) {
!
! imgnum_t imgNum;
!
setNextPage();
-
- imgNum = call PageTransfer.getWorkingImage();
-
- advTimers[imgNum-1].newAdvs = DELUGE_NUM_NEWDATA_ADVS_REQUIRED;
- advTimers[imgNum-1].periodLog2 = DELUGE_MIN_ADV_PERIOD_LOG2;
- setupAdvTimer(imgNum-1);
-
}
! event void SharedMsgBuf.bufFree() { ; }
}
--- 334,350 ----
}
! event void PageTransfer.receivedPage(imgnum_t imgNum, pgnum_t pgNum) {
call Metadata.receivedPage(imgNum, pgNum);
}
! event void PageTransfer.suppressMsgs(imgnum_t imgNum) {
advTimers[imgNum-1].overheard = 1;
}
! event void Metadata.updateDone(result_t result) {
setNextPage();
}
! event void SharedMsgBuf.bufFree() {}
}
Index: DelugeMetadata.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMetadata.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** DelugeMetadata.h 18 Jan 2005 20:49:16 -0000 1.3
--- DelugeMetadata.h 17 May 2005 20:55:47 -0000 1.4
***************
*** 32,42 ****
#define __DELUGE_METADATA_H__
! enum {
! DELUGE_IMGDESC_NEWER, // newer object
! DELUGE_IMGDESC_OLDER, // older object
! DELUGE_IMGDESC_LARGER, // more pages of same object
! DELUGE_IMGDESC_SMALLER, // less pages of same object
! DELUGE_IMGDESC_EQUAL, // identical
! };
typedef int8_t dm_cmp_t;
--- 32,36 ----
#define __DELUGE_METADATA_H__
! #define DELUGE_METADATA_SIZE 16
typedef int8_t dm_cmp_t;
***************
*** 51,55 ****
uint16_t crc; // crc for vNum and numPgs
uint8_t numPgsComplete; // numPgsComplete in image
! uint8_t numImages; // number of images supported
} DelugeImgDesc;
--- 45,49 ----
uint16_t crc; // crc for vNum and numPgs
uint8_t numPgsComplete; // numPgsComplete in image
! uint8_t reserved;
} DelugeImgDesc;
Index: DelugeMetadata.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMetadata.nc,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** DelugeMetadata.nc 26 Apr 2005 23:40:10 -0000 1.7
--- DelugeMetadata.nc 17 May 2005 20:55:47 -0000 1.8
***************
*** 34,44 ****
command bool isComplete(imgnum_t imgNum);
command bool isImgDescValid(DelugeImgDesc* tmpImgDesc);
! command result_t getImgDesc(imgnum_t imgNum, DelugeImgDesc* imgDesc);
! command dm_cmp_t compareImgDesc(DelugeImgDesc* imgDesc);
command result_t setupNewImage(DelugeImgDesc* imgDesc);
- event void setupNewImageDone(result_t result);
command result_t receivedPage(imgnum_t imgNum, pgnum_t pgNum);
! event void receivedPageDone(result_t result);
}
--- 34,42 ----
command bool isComplete(imgnum_t imgNum);
command bool isImgDescValid(DelugeImgDesc* tmpImgDesc);
! command DelugeImgDesc* getImgDesc(imgnum_t imgNum);
command result_t setupNewImage(DelugeImgDesc* imgDesc);
command result_t receivedPage(imgnum_t imgNum, pgnum_t pgNum);
! event void updateDone(result_t result);
}
Index: DelugeMetadataC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMetadataC.nc,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** DelugeMetadataC.nc 20 Apr 2005 23:26:59 -0000 1.6
--- DelugeMetadataC.nc 17 May 2005 20:55:47 -0000 1.7
***************
*** 43,46 ****
--- 43,47 ----
components
+ CrcC,
DelugeMetadataM,
DelugeStorageC as Storage,
***************
*** 55,63 ****
Main.StdControl -> TimerC;
DelugeMetadataM.DataRead -> Storage.DataRead[unique("DelugeDataRead")];
DelugeMetadataM.DataWrite -> Storage.DataWrite[unique("DelugeDataWrite")];
DelugeMetadataM.DelugeStorage -> Storage;
- DelugeMetadataM.MetadataRead -> Storage.DataRead[unique("DelugeDataRead")];
- DelugeMetadataM.MetadataWrite -> Storage.DataWrite[unique("DelugeDataWrite")];
DelugeMetadataM.Leds -> Leds;
DelugeMetadataM.Timer -> TimerC.Timer[unique("Timer")];
--- 56,63 ----
Main.StdControl -> TimerC;
+ DelugeMetadataM.Crc -> CrcC;
DelugeMetadataM.DataRead -> Storage.DataRead[unique("DelugeDataRead")];
DelugeMetadataM.DataWrite -> Storage.DataWrite[unique("DelugeDataWrite")];
DelugeMetadataM.DelugeStorage -> Storage;
DelugeMetadataM.Leds -> Leds;
DelugeMetadataM.Timer -> TimerC.Timer[unique("Timer")];
Index: DelugeMetadataM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMetadataM.nc,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** DelugeMetadataM.nc 26 Apr 2005 23:40:10 -0000 1.15
--- DelugeMetadataM.nc 17 May 2005 20:55:47 -0000 1.16
***************
*** 36,43 ****
}
uses {
interface DelugeDataRead as DataRead;
interface DelugeDataWrite as DataWrite;
- interface DelugeDataRead as MetadataRead;
- interface DelugeDataWrite as MetadataWrite;
interface DelugeStorage;
interface Leds;
--- 36,42 ----
}
uses {
+ interface Crc;
interface DelugeDataRead as DataRead;
interface DelugeDataWrite as DataWrite;
interface DelugeStorage;
interface Leds;
***************
*** 57,61 ****
enum {
S_INIT,
! S_SCAN,
S_IDLE,
S_VERIFY,
--- 56,61 ----
enum {
S_INIT,
! S_SCAN_METADATA,
! S_SCAN_DATA,
S_IDLE,
S_VERIFY,
***************
*** 63,66 ****
--- 63,67 ----
};
+ void verifyNextPage();
command result_t SplitControl.init() {
***************
*** 70,74 ****
command result_t SplitControl.start() {
! call Timer.start(TIMER_ONE_SHOT, 1024);
return SUCCESS;
}
--- 71,75 ----
command result_t SplitControl.start() {
! call Timer.start(TIMER_ONE_SHOT, 32);
return SUCCESS;
}
***************
*** 78,95 ****
}
result_t execute() {
switch(state) {
case S_INIT:
! return call DelugeStorage.loadImages();
! case S_SCAN:
! return call MetadataRead.read(curImage, STORAGE_BLOCK_SIZE-sizeof(DelugeImgDesc),
! (uint8_t*)&(imgDesc[curImage]), sizeof(DelugeImgDesc));
case S_VERIFY:
! return call DataRead.read(curImage, sizeof(crc)*imgDesc[curImage].numPgsComplete,
! (uint8_t*)&crc, sizeof(crc));
! case S_SETUP:
! return call DataWrite.erase(curImage);
}
! return FAIL;
}
--- 79,117 ----
}
+ void signalDone(result_t result) {
+ uint8_t tmpState = state;
+ state = S_IDLE;
+ switch(tmpState) {
+ case S_SCAN_METADATA: signal SplitControl.startDone(); break;
+ default: signal Metadata.updateDone[client](SUCCESS); break;
+ }
+ }
+
result_t execute() {
+
+ result_t result = FAIL;
+
switch(state) {
case S_INIT:
! result = call DelugeStorage.loadImages();
! break;
! case S_SCAN_DATA:
! state = S_SCAN_METADATA;
! // no break
! case S_SCAN_METADATA:
! result = call DataRead.read(curImage, 0, &imgDesc[curImage],
! sizeof(DelugeImgDesc));
! break;
! case S_SETUP:
! result = call DataWrite.erase(curImage);
! break;
case S_VERIFY:
! verifyNextPage();
! result = SUCCESS;
! break;
}
!
! return result;
!
}
***************
*** 102,106 ****
event void DelugeStorage.loadImagesDone(result_t result) {
curImage = 0;
! state = S_SCAN;
if (execute() == FAIL)
call Timer.start(TIMER_ONE_SHOT, 512);
--- 124,128 ----
event void DelugeStorage.loadImagesDone(result_t result) {
curImage = 0;
! state = S_SCAN_METADATA;
if (execute() == FAIL)
call Timer.start(TIMER_ONE_SHOT, 512);
***************
*** 108,111 ****
--- 130,134 ----
void scanNextImage() {
+ state = S_SCAN_METADATA;
curImage++;
if (curImage < DELUGE_NUM_IMAGES)
***************
*** 113,142 ****
else {
// all done, signal that metadata is ready
! state = S_IDLE;
! signal SplitControl.startDone();
}
}
-
- event void MetadataRead.readDone(storage_result_t result) {
! if (result != STORAGE_OK) {
! call Timer.start(TIMER_ONE_SHOT, 512);
! return;
! }
!
! // check if metadata is corrupt
! if (imgDesc[curImage].numPgsComplete == DELUGE_INVALID_PGNUM
! || !call Metadata.isImgDescValid[client](&imgDesc[curImage])) {
! imgDesc[curImage].imgNum = curImage;
! imgDesc[curImage].vNum = DELUGE_INVALID_VNUM;
! imgDesc[curImage].numPgs = 0;
! imgDesc[curImage].crc = 0;
! imgDesc[curImage].numPgsComplete = 0;
! scanNextImage();
! return;
! }
! if (call DataRead.read(curImage, sizeof(crc)*imgDesc[curImage].numPgsComplete,
! (uint8_t*)&crc, sizeof(crc)) == FAIL)
call Timer.start(TIMER_ONE_SHOT, 512);
--- 136,148 ----
else {
// all done, signal that metadata is ready
! signalDone(SUCCESS);
}
}
! void verifyNextPage() {
! if (call DataRead.read(curImage,
! DELUGE_METADATA_SIZE + sizeof(crc)*imgDesc[curImage].numPgsComplete,
! &crc, sizeof(crc)) == FAIL)
call Timer.start(TIMER_ONE_SHOT, 512);
***************
*** 152,167 ****
}
! if (imgDesc[curImage].numPgsComplete == 0) {
! addr = DELUGE_CRC_BLOCK_SIZE;
! len = DELUGE_BYTES_PER_PAGE-DELUGE_CRC_BLOCK_SIZE;
}
else {
! addr = (block_addr_t)imgDesc[curImage].numPgsComplete*DELUGE_BYTES_PER_PAGE;
! len = DELUGE_BYTES_PER_PAGE;
}
- if (call DataRead.computeCrc(curImage, addr, len) == FAIL)
- call Timer.start(TIMER_ONE_SHOT, 512);
-
}
--- 158,191 ----
}
! if (state == S_SCAN_METADATA) {
!
! // check if metadata is corrupt
! if (!call Metadata.isImgDescValid[client](&imgDesc[curImage])) {
! imgDesc[curImage].vNum = DELUGE_INVALID_VNUM;
! imgDesc[curImage].imgNum = curImage;
! imgDesc[curImage].numPgs = 0;
! imgDesc[curImage].numPgsComplete = 0;
! scanNextImage();
! return;
! }
!
! state = S_SCAN_DATA;
! verifyNextPage();
!
}
else {
! if (imgDesc[curImage].numPgsComplete == 0) {
! addr = DELUGE_CRC_BLOCK_SIZE;
! len = DELUGE_BYTES_PER_PAGE-DELUGE_CRC_BLOCK_SIZE;
! }
! else {
! addr = (block_addr_t)imgDesc[curImage].numPgsComplete*DELUGE_BYTES_PER_PAGE;
! len = DELUGE_BYTES_PER_PAGE;
! }
!
! if (call DataRead.computeCrc(curImage, addr + DELUGE_METADATA_SIZE, len) == FAIL)
! call Timer.start(TIMER_ONE_SHOT, 512);
}
}
***************
*** 174,191 ****
// SCAN state
! if (state == S_SCAN) {
if (crc == crcResult) {
imgDesc[curImage].numPgsComplete++;
! if (imgDesc[curImage].numPgsComplete == imgDesc[curImage].numPgs) {
! scanNextImage();
! }
! else if (call DataRead.read(curImage, sizeof(crc)*imgDesc[curImage].numPgsComplete,
! (uint8_t*)&crc, sizeof(crc)) == FAIL) {
! call Timer.start(TIMER_ONE_SHOT, 512);
}
}
! else {
! scanNextImage();
! }
}
--- 198,213 ----
// SCAN state
! if (state == S_SCAN_DATA) {
!
if (crc == crcResult) {
imgDesc[curImage].numPgsComplete++;
! if (imgDesc[curImage].numPgsComplete < imgDesc[curImage].numPgs) {
! verifyNextPage();
! return;
}
}
!
! scanNextImage();
!
}
***************
*** 200,206 ****
}
- state = S_IDLE;
imgDesc[curImage].numPgsComplete++;
! signal Metadata.receivedPageDone[client](SUCCESS);
}
--- 222,227 ----
}
imgDesc[curImage].numPgsComplete++;
! signalDone(SUCCESS);
}
***************
*** 213,235 ****
command bool Metadata.isImgDescValid[uint8_t id](DelugeImgDesc* tmpImgDesc) {
!
! uint8_t* tmp = (uint8_t*)tmpImgDesc;
! uint16_t tmpCrc = 0;
! uint8_t i;
!
! for ( i = 0; i < 4; i++ )
! tmpCrc = crcByte(tmpCrc, tmp[i]);
!
! return (tmpCrc == tmpImgDesc->crc);
!
}
command bool Metadata.isComplete[uint8_t id](imgnum_t imgNum) {
! if (state == S_IDLE
! && imgNum < DELUGE_NUM_IMAGES
! && imgDesc[imgNum].numPgsComplete > 0
! && (imgDesc[imgNum].numPgs == imgDesc[imgNum].numPgsComplete))
! return TRUE;
! return FALSE;
}
--- 234,244 ----
command bool Metadata.isImgDescValid[uint8_t id](DelugeImgDesc* tmpImgDesc) {
! return (tmpImgDesc->crc == call Crc.crc16(tmpImgDesc, 4));
}
command bool Metadata.isComplete[uint8_t id](imgnum_t imgNum) {
! return ( imgDesc[imgNum].numPgs == imgDesc[imgNum].numPgsComplete
! && imgDesc[imgNum].numPgs != DELUGE_INVALID_PGNUM
! && imgDesc[imgNum].numPgs );
}
***************
*** 249,253 ****
if (state != S_IDLE
- || imgNum >= DELUGE_NUM_IMAGES
|| imgDesc[imgNum].numPgsComplete >= imgDesc[imgNum].numPgs
|| imgDesc[imgNum].numPgsComplete != pgNum)
--- 258,261 ----
***************
*** 257,264 ****
client = id;
curImage = imgNum;
!
! if (call DataRead.read(imgNum, sizeof(crc)*pgNum, (uint8_t*)&crc, sizeof(crc)) == FAIL)
! call Timer.start(TIMER_ONE_SHOT, 512);
!
return SUCCESS;
--- 265,271 ----
client = id;
curImage = imgNum;
!
! verifyNextPage();
!
return SUCCESS;
***************
*** 267,294 ****
command result_t Metadata.setupNewImage[uint8_t id](DelugeImgDesc* newImgDesc) {
! imgnum_t imgNum = newImgDesc->imgNum;
!
! if (state != S_IDLE
! || newImgDesc->imgNum >= DELUGE_NUM_IMAGES)
return FAIL;
- client = id;
-
- memcpy(&(imgDesc[imgNum]), newImgDesc, sizeof(DelugeImgDesc));
- if (imgNum != DELUGE_GOLDEN_IMAGE_NUM)
- imgDesc[imgNum].numPgsComplete = 0;
-
state = S_SETUP;
curImage = newImgDesc->imgNum;
! call Timer.start(TIMER_ONE_SHOT, 512);
!
! return SUCCESS;
!
! }
!
! command result_t Metadata.getImgDesc[uint8_t id](uint8_t imgNum, DelugeImgDesc* newImgDesc) {
! memcpy(newImgDesc, &(imgDesc[imgNum]), sizeof(DelugeImgDesc));
! newImgDesc->numImages = DELUGE_NUM_IMAGES;
return SUCCESS;
--- 274,289 ----
command result_t Metadata.setupNewImage[uint8_t id](DelugeImgDesc* newImgDesc) {
! if (state != S_IDLE)
return FAIL;
state = S_SETUP;
+ client = id;
curImage = newImgDesc->imgNum;
!
! memcpy(&(imgDesc[curImage]), newImgDesc, sizeof(DelugeImgDesc));
! if (curImage != DELUGE_GOLDEN_IMAGE_NUM)
! imgDesc[curImage].numPgsComplete = 0;
! call Timer.start(TIMER_ONE_SHOT, 1);
return SUCCESS;
***************
*** 296,320 ****
}
! command dm_cmp_t Metadata.compareImgDesc[uint8_t id](DelugeImgDesc* cmpImgDesc) {
!
! imgnum_t image = cmpImgDesc->imgNum;
!
! if (cmpImgDesc->vNum != imgDesc[image].vNum) {
! if (cmpImgDesc->vNum == DELUGE_INVALID_VNUM)
! return DELUGE_IMGDESC_OLDER;
! else if (imgDesc[image].vNum == DELUGE_INVALID_VNUM)
! return DELUGE_IMGDESC_NEWER;
! else if ((cmpImgDesc->vNum - imgDesc[image].vNum) > 0)
! return DELUGE_IMGDESC_NEWER;
! else if ((cmpImgDesc->vNum - imgDesc[image].vNum) < 0)
! return DELUGE_IMGDESC_OLDER;
! }
! else if (cmpImgDesc->numPgsComplete > imgDesc[image].numPgsComplete)
! return DELUGE_IMGDESC_LARGER;
! else if (cmpImgDesc->numPgsComplete < imgDesc[image].numPgsComplete)
! return DELUGE_IMGDESC_SMALLER;
!
! return DELUGE_IMGDESC_EQUAL;
!
}
--- 291,296 ----
}
! command DelugeImgDesc* Metadata.getImgDesc[uint8_t id](uint8_t imgNum) {
! return &imgDesc[imgNum];
}
***************
*** 325,354 ****
return;
}
!
! switch(state) {
! case S_VERIFY:
! state = S_IDLE;
! signal Metadata.receivedPageDone[client](SUCCESS);
! break;
! case S_SETUP:
! if (call MetadataWrite.write(curImage, STORAGE_BLOCK_SIZE-sizeof(DelugeImgDesc),
! (uint8_t*)&(imgDesc[curImage]), sizeof(DelugeImgDesc)) == FAIL)
! call Timer.start(TIMER_ONE_SHOT, 512);
! break;
! }
}
! event void MetadataWrite.writeDone(storage_result_t result) {
! state = S_IDLE;
! signal Metadata.setupNewImageDone[client](result);
}
! event void DataWrite.writeDone(result_t result) { ; }
! event void MetadataRead.computeCrcDone(result_t result, uint16_t crcResult) { ; }
! event void MetadataWrite.eraseDone(result_t result) { ; }
!
! default event void Metadata.setupNewImageDone[uint8_t id](result_t result) { ; }
! default event void Metadata.receivedPageDone[uint8_t id](result_t result) { ; }
}
--- 301,316 ----
return;
}
!
! if (call DataWrite.write(curImage, 0, &imgDesc[curImage],
! sizeof(DelugeImgDesc)) == FAIL)
! call Timer.start(TIMER_ONE_SHOT, 512);
}
! event void DataWrite.writeDone(storage_result_t result) {
! signalDone(result);
}
! default event void Metadata.updateDone[uint8_t id](result_t result) {}
}
Index: DelugeMsgs.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMsgs.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** DelugeMsgs.h 3 Jan 2005 17:34:54 -0000 1.3
--- DelugeMsgs.h 17 May 2005 20:55:48 -0000 1.4
***************
*** 58,61 ****
--- 58,62 ----
DelugeNodeDesc nodeDesc; // 6
DelugeImgDesc imgDesc; // 8
+ uint8_t numImages; // 1
} DelugeAdvMsg;
Index: DelugePageTransfer.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugePageTransfer.nc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** DelugePageTransfer.nc 3 Jan 2005 17:34:54 -0000 1.3
--- DelugePageTransfer.nc 17 May 2005 20:55:48 -0000 1.4
***************
*** 35,39 ****
command bool isTransferring();
command result_t dataAvailable(uint16_t sourceAddr, imgnum_t imgNum);
! event result_t receivedPage(imgnum_t imgNum, pgnum_t pgNum);
! event result_t suppressMsgs(imgnum_t imgNum);
}
--- 35,39 ----
command bool isTransferring();
command result_t dataAvailable(uint16_t sourceAddr, imgnum_t imgNum);
! event void receivedPage(imgnum_t imgNum, pgnum_t pgNum);
! event void suppressMsgs(imgnum_t imgNum);
}
Index: DelugePageTransferC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugePageTransferC.nc,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** DelugePageTransferC.nc 20 Apr 2005 23:26:59 -0000 1.6
--- DelugePageTransferC.nc 17 May 2005 20:55:48 -0000 1.7
***************
*** 60,65 ****
Leds = DelugePageTransferM;
- Main.StdControl -> TimerC;
-
DelugePageTransferM.BitVecUtils -> BitVecUtilsC;
DelugePageTransferM.DataRead -> Storage.DataRead[unique("DelugeDataRead")];
--- 60,63 ----
***************
*** 70,75 ****
DelugePageTransferM.ReceiveDataMsg = ReceiveDataMsg;
DelugePageTransferM.ReceiveReqMsg = ReceiveReqMsg;
! DelugePageTransferM.ReqTimer -> TimerC.Timer[unique("Timer")];
! DelugePageTransferM.SendTimer -> TimerC.Timer[unique("Timer")];
DelugePageTransferM.SendDataMsg = SendDataMsg;
DelugePageTransferM.SendReqMsg = SendReqMsg;
--- 68,72 ----
DelugePageTransferM.ReceiveDataMsg = ReceiveDataMsg;
DelugePageTransferM.ReceiveReqMsg = ReceiveReqMsg;
! DelugePageTransferM.Timer -> TimerC.Timer[unique("Timer")];
DelugePageTransferM.SendDataMsg = SendDataMsg;
DelugePageTransferM.SendReqMsg = SendReqMsg;
Index: DelugePageTransferM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugePageTransferM.nc,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** DelugePageTransferM.nc 26 Apr 2005 23:40:10 -0000 1.10
--- DelugePageTransferM.nc 17 May 2005 20:55:48 -0000 1.11
***************
*** 47,52 ****
interface SendMsg as SendReqMsg;
interface SharedMsgBuf;
! interface Timer as ReqTimer;
! interface Timer as SendTimer;
}
}
--- 47,51 ----
interface SendMsg as SendReqMsg;
interface SharedMsgBuf;
! interface Timer;
}
}
***************
*** 54,75 ****
implementation {
! typedef struct {
! uint16_t dataSourceAddr;
! uint8_t numReqTriesLeft;
! bool suppressReq;
! } RxState;
!
! typedef struct {
! uint16_t dest;
! uint8_t imgToSend;
! uint8_t pageToSend;
! } TxState;
!
! typedef struct {
union {
! RxState rx;
! TxState tx;
};
! } RxTxState;
// send/receive page buffers, and state variables for buffers
--- 53,70 ----
implementation {
! struct {
union {
! struct {
! uint16_t source;
! uint8_t remainingAttempts;
! bool suppressReq;
! } rx;
! struct {
! uint16_t dest;
! uint8_t imgToSend;
! uint8_t pageToSend;
! } tx;
};
! } vars;
// send/receive page buffers, and state variables for buffers
***************
*** 77,93 ****
uint8_t pktsToReceive[DELUGE_PKT_BITVEC_SIZE]; // bit vec of packets to receive
! typedef struct {
uint8_t pktNum;
uint8_t data[DELUGE_PKT_PAYLOAD_SIZE];
! } DataQEntry;
! // Data Write Queue
! DataQEntry dataQ[DELUGE_DATA_Q_SIZE];
! uint8_t dataQHead, dataQLen;
// state variables
uint8_t state;
- RxTxState vars;
-
imgnum_t workingImgNum;
pgnum_t workingPgNum;
--- 72,87 ----
uint8_t pktsToReceive[DELUGE_PKT_BITVEC_SIZE]; // bit vec of packets to receive
! struct {
uint8_t pktNum;
uint8_t data[DELUGE_PKT_PAYLOAD_SIZE];
! } dataBuf;
! bool isWriting;
! TOS_MsgPtr pMsgBuf;
! DelugeReqMsg *pReqMsg;
! DelugeDataMsg *pDataMsg;
// state variables
uint8_t state;
imgnum_t workingImgNum;
pgnum_t workingPgNum;
***************
*** 109,113 ****
state = newState;
!
}
--- 103,107 ----
state = newState;
!
}
***************
*** 116,119 ****
--- 110,114 ----
workingImgNum = DELUGE_INVALID_IMGNUM;
workingPgNum = DELUGE_INVALID_PGNUM;
+ isWriting = FALSE;
return SUCCESS;
}
***************
*** 121,125 ****
command result_t StdControl.start() {
changeState(S_IDLE);
! dataQHead = dataQLen = 0;
return SUCCESS;
}
--- 116,122 ----
command result_t StdControl.start() {
changeState(S_IDLE);
! pMsgBuf = call SharedMsgBuf.getMsgBuf();
! pReqMsg = (DelugeReqMsg*)(pMsgBuf->data);
! pDataMsg = (DelugeDataMsg*)(pMsgBuf->data);
return SUCCESS;
}
***************
*** 149,168 ****
}
command result_t PageTransfer.dataAvailable(uint16_t sourceAddr, imgnum_t imgNum) {
! if (workingImgNum != imgNum)
! return FAIL;
!
! if (state == S_IDLE) {
// currently idle, so request data from source
changeState(S_RX_LOCKING);
! vars.rx.dataSourceAddr = sourceAddr;
vars.rx.suppressReq = FALSE;
// randomize request to prevent collision
! call ReqTimer.start(TIMER_ONE_SHOT, DELUGE_MIN_DELAY +
! (call Random.rand() % DELUGE_MAX_REQ_DELAY));
}
!
return SUCCESS;
--- 146,171 ----
}
+ void startReqTimer(bool first) {
+ uint32_t delay;
+ if (first)
+ delay = DELUGE_MIN_DELAY + (call Random.rand() % DELUGE_MAX_REQ_DELAY);
+ else
+ delay = DELUGE_NACK_TIMEOUT + (call Random.rand() % DELUGE_NACK_TIMEOUT);
+ call Timer.start(TIMER_ONE_SHOT, delay);
+ }
+
command result_t PageTransfer.dataAvailable(uint16_t sourceAddr, imgnum_t imgNum) {
! if (state == S_IDLE && workingImgNum == imgNum) {
// currently idle, so request data from source
changeState(S_RX_LOCKING);
! vars.rx.source = sourceAddr;
! vars.rx.remainingAttempts = DELUGE_MAX_NUM_REQ_TRIES;
vars.rx.suppressReq = FALSE;
// randomize request to prevent collision
! startReqTimer(TRUE);
}
!
return SUCCESS;
***************
*** 171,259 ****
block_addr_t calcOffset(pgnum_t pgNum, uint8_t pktNum) {
return (block_addr_t)pgNum*(block_addr_t)DELUGE_BYTES_PER_PAGE
! + (block_addr_t)pktNum*(block_addr_t)DELUGE_PKT_PAYLOAD_SIZE;
}
void setupReqMsg() {
! TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
! DelugeReqMsg* pReqMsg = (DelugeReqMsg*)(pMsgBuf->data);
!
! if (state == S_RX_LOCKING) {
! if (call SharedMsgBuf.lock() == FAIL)
return;
- // update address of source node
changeState(S_RECEIVING);
! pReqMsg->dest = vars.rx.dataSourceAddr;
pReqMsg->sourceAddr = TOS_LOCAL_ADDRESS;
- vars.rx.numReqTriesLeft = DELUGE_MAX_NUM_REQ_TRIES;
pReqMsg->imgNum = workingImgNum;
- pReqMsg->pgNum = workingPgNum;
pReqMsg->vNum = call DelugeStats.getVNum(workingImgNum);
! memcpy(pReqMsg->requestedPkts, pktsToReceive, DELUGE_PKT_BITVEC_SIZE);
}
if (state != S_RECEIVING)
return;
!
! if (vars.rx.suppressReq) {
! // suppress request
! call ReqTimer.start(TIMER_ONE_SHOT, DELUGE_NACK_TIMEOUT +
! (call Random.rand() % DELUGE_NACK_TIMEOUT));
vars.rx.suppressReq = FALSE;
- return;
}
!
! if (vars.rx.numReqTriesLeft == 0) {
! // tried too many times, give up
changeState(S_IDLE);
- return;
}
! {
! uint16_t dest = (pReqMsg->dest == TOS_UART_ADDR) ? TOS_UART_ADDR : TOS_BCAST_ADDR;
! if (call SendReqMsg.send(dest, sizeof(DelugeReqMsg), pMsgBuf) == SUCCESS) {
! vars.rx.numReqTriesLeft--;
! }
! else {
! // send failed, wait a bit and try again
! call ReqTimer.start(TIMER_ONE_SHOT, DELUGE_FAILED_SEND_DELAY);
! }
}
}
! event result_t ReqTimer.fired() {
! setupReqMsg();
! return SUCCESS;
}
! task void writeData() {
! if (call DataWrite.write(workingImgNum, calcOffset(workingPgNum, dataQ[dataQHead].pktNum),
! dataQ[dataQHead].data, DELUGE_PKT_PAYLOAD_SIZE) == FAIL)
! post writeData();
}
event TOS_MsgPtr ReceiveDataMsg.receive(TOS_MsgPtr pMsg) {
! TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
! DelugeReqMsg *pReqMsg = (DelugeReqMsg*)(pMsgBuf->data);
! DelugeDataMsg *rxDataMsg = (DelugeDataMsg*)(pMsg->data);
!
! dbg(DBG_USR1, "DELUGE: Received DATA_MSG(vNum=%d,imgNum=%d,pgNum=%d,pktNum=%d)\n",
! rxDataMsg->vNum, rxDataMsg->imgNum, rxDataMsg->pgNum, rxDataMsg->pktNum);
if (state == S_DISABLED)
return pMsg;
! if (state == S_RECEIVING || state == S_RX_LOCKING) {
! // suppress next request since nodes are still sending
! vars.rx.suppressReq = TRUE;
! }
! if (dataQLen < DELUGE_DATA_Q_SIZE
! && rxDataMsg->vNum == call DelugeStats.getVNum(workingImgNum)
&& rxDataMsg->imgNum == workingImgNum
&& rxDataMsg->pgNum == workingPgNum
! && BITVEC_GET(pktsToReceive, rxDataMsg->pktNum)) {
// got a packet we need
call Leds.set(rxDataMsg->pktNum);
--- 174,261 ----
block_addr_t calcOffset(pgnum_t pgNum, uint8_t pktNum) {
return (block_addr_t)pgNum*(block_addr_t)DELUGE_BYTES_PER_PAGE
! + (block_addr_t)pktNum*(block_addr_t)DELUGE_PKT_PAYLOAD_SIZE
! + DELUGE_METADATA_SIZE;
}
void setupReqMsg() {
! if ( state == S_RX_LOCKING ) {
! if ( call SharedMsgBuf.lock() == FAIL )
return;
changeState(S_RECEIVING);
! pReqMsg->dest = (vars.rx.source != TOS_UART_ADDR) ?
! vars.rx.source : TOS_UART_ADDR;
pReqMsg->sourceAddr = TOS_LOCAL_ADDRESS;
pReqMsg->imgNum = workingImgNum;
pReqMsg->vNum = call DelugeStats.getVNum(workingImgNum);
! pReqMsg->pgNum = workingPgNum;
}
if (state != S_RECEIVING)
return;
!
! // suppress request
! if ( vars.rx.suppressReq ) {
! startReqTimer(FALSE);
vars.rx.suppressReq = FALSE;
}
!
! // tried too many times, give up
! else if (vars.rx.remainingAttempts == 0) {
changeState(S_IDLE);
}
! // send req message
! else {
! memcpy(pReqMsg->requestedPkts, pktsToReceive, DELUGE_PKT_BITVEC_SIZE);
! if (call SendReqMsg.send(pReqMsg->dest, sizeof(DelugeReqMsg), pMsgBuf) == FAIL)
! startReqTimer(FALSE);
}
}
! task void writeDataTask() {
! if (call DataWrite.write(workingImgNum, calcOffset(workingPgNum, dataBuf.pktNum),
! dataBuf.data, DELUGE_PKT_PAYLOAD_SIZE) == FAIL)
! isWriting = FALSE;
}
! void suppressMsgs(imgnum_t imgNum, pgnum_t pgNum) {
! if (state == S_SENDING || state == S_TX_LOCKING) {
! if (imgNum < vars.tx.imgToSend
! || (imgNum == vars.tx.imgToSend
! && pgNum < vars.tx.pageToSend)) {
! changeState(S_IDLE);
! memset(pktsToSend, 0x0, DELUGE_PKT_BITVEC_SIZE);
! }
! }
! else if (state == S_RECEIVING || state == S_RX_LOCKING) {
! if (imgNum < workingImgNum
! || (imgNum == workingImgNum
! && pgNum <= workingPgNum)) {
! // suppress next request since similar request has been overheard
! vars.rx.suppressReq = TRUE;
! }
! }
}
event TOS_MsgPtr ReceiveDataMsg.receive(TOS_MsgPtr pMsg) {
! DelugeDataMsg* rxDataMsg = (DelugeDataMsg*)pMsg->data;
if (state == S_DISABLED)
return pMsg;
! dbg(DBG_USR1, "DELUGE: Received DATA_MSG(vNum=%d,imgNum=%d,pgNum=%d,pktNum=%d)\n",
! rxDataMsg->vNum, rxDataMsg->imgNum, rxDataMsg->pgNum, rxDataMsg->pktNum);
! // check if need to suppress req or data messages
! suppressMsgs(rxDataMsg->imgNum, rxDataMsg->pgNum);
!
! if (rxDataMsg->vNum == call DelugeStats.getVNum(workingImgNum)
&& rxDataMsg->imgNum == workingImgNum
&& rxDataMsg->pgNum == workingPgNum
! && BITVEC_GET(pktsToReceive, rxDataMsg->pktNum)
! && !isWriting) {
// got a packet we need
call Leds.set(rxDataMsg->pktNum);
***************
*** 263,280 ****
// copy data
! dataQ[(dataQHead+dataQLen)%DELUGE_DATA_Q_SIZE].pktNum = rxDataMsg->pktNum;
! memcpy(dataQ[(dataQHead+dataQLen)%DELUGE_DATA_Q_SIZE].data, rxDataMsg->data, DELUGE_PKT_PAYLOAD_SIZE);
! dataQLen++;
! if (dataQLen == 1) {
! if (post writeData() == FAIL) {
! dataQLen = 0;
! return pMsg;
! }
! }
!
! // mark packet as received in request packet
! BITVEC_CLEAR(pktsToReceive, rxDataMsg->pktNum);
! if (state == S_RECEIVING)
! BITVEC_CLEAR(pReqMsg->requestedPkts, rxDataMsg->pktNum);
}
--- 265,272 ----
// copy data
! dataBuf.pktNum = rxDataMsg->pktNum;
! memcpy(dataBuf.data, rxDataMsg->data, DELUGE_PKT_PAYLOAD_SIZE);
! if (post writeDataTask())
! isWriting = TRUE;
}
***************
*** 285,297 ****
void setupDataMsg() {
- TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
- DelugeDataMsg* pDataMsg = (DelugeDataMsg*)(pMsgBuf->data);
- block_addr_t offset;
uint16_t nextPkt;
signal PageTransfer.suppressMsgs(vars.tx.imgToSend);
! if (state == S_TX_LOCKING) {
! if (call SharedMsgBuf.lock() == FAIL)
return;
changeState(S_SENDING);
--- 277,289 ----
void setupDataMsg() {
uint16_t nextPkt;
+ if (state != S_SENDING && state != S_TX_LOCKING)
+ return;
+
signal PageTransfer.suppressMsgs(vars.tx.imgToSend);
! if ( state == S_TX_LOCKING ) {
! if ( call SharedMsgBuf.lock() == FAIL )
return;
changeState(S_SENDING);
***************
*** 302,325 ****
}
! if (state != S_SENDING)
! return;
!
! if (!call BitVecUtils.indexOf(&nextPkt, pDataMsg->pktNum, pktsToSend,
! DELUGE_PKTS_PER_PAGE)
! && !call BitVecUtils.indexOf(&nextPkt, 0, pktsToSend,
! DELUGE_PKTS_PER_PAGE)) {
// no more packets to send
dbg(DBG_USR1, "DELUGE: SEND_DONE\n");
changeState(S_IDLE);
- return;
}
! pDataMsg->pktNum = (uint8_t)nextPkt;
!
! offset = calcOffset(pDataMsg->pgNum, pDataMsg->pktNum);
! if (call DataRead.read(vars.tx.imgToSend, offset, pDataMsg->data,
! DELUGE_PKT_PAYLOAD_SIZE) == FAIL)
! call SendTimer.start(TIMER_ONE_SHOT, DELUGE_FAILED_SEND_DELAY);
}
--- 294,322 ----
}
! if (!call BitVecUtils.indexOf(&nextPkt, pDataMsg->pktNum,
! pktsToSend, DELUGE_PKTS_PER_PAGE)) {
// no more packets to send
dbg(DBG_USR1, "DELUGE: SEND_DONE\n");
changeState(S_IDLE);
}
! else {
! pDataMsg->pktNum = nextPkt;
! if (call DataRead.read(vars.tx.imgToSend, calcOffset(pDataMsg->pgNum, pDataMsg->pktNum),
! pDataMsg->data, DELUGE_PKT_PAYLOAD_SIZE) == FAIL)
! call Timer.start(TIMER_ONE_SHOT, DELUGE_FAILED_SEND_DELAY);
! }
! }
+ event result_t Timer.fired() {
+ switch(state) {
+ case S_RX_LOCKING: case S_RECEIVING:
+ setupReqMsg();
+ break;
+ case S_TX_LOCKING: case S_SENDING:
+ setupDataMsg();
+ break;
+ }
+ return SUCCESS;
}
***************
*** 334,361 ****
if (state == S_DISABLED)
return pMsg;
!
! if (state == S_SENDING || state == S_TX_LOCKING) {
! if (rxReqMsg->imgNum < vars.tx.imgToSend
! || (rxReqMsg->imgNum == vars.tx.imgToSend
! && (rxReqMsg->vNum - call DelugeStats.getVNum(vars.tx.imgToSend) > 0
! || (rxReqMsg->vNum == call DelugeStats.getVNum(vars.tx.imgToSend)
! && rxReqMsg->pgNum < vars.tx.pageToSend)))) {
! changeState(S_IDLE);
! memset(pktsToSend, 0x0, DELUGE_PKT_BITVEC_SIZE);
! }
! }
! else if (state == S_RECEIVING || state == S_RX_LOCKING) {
! if (rxReqMsg->dest != TOS_LOCAL_ADDRESS) {
! if (rxReqMsg->imgNum <= workingImgNum
! && rxReqMsg->pgNum <= workingPgNum) {
! // suppress next request since similar request has been overheard
! vars.rx.suppressReq = TRUE;
! }
! return pMsg;
! }
! }
if (rxReqMsg->pgNum >= call DelugeStats.getNumPgsComplete(rxReqMsg->imgNum)
! || rxReqMsg->vNum != call DelugeStats.getVNum(rxReqMsg->imgNum)) {
// don't have this page, ignore request
return pMsg;
--- 331,341 ----
if (state == S_DISABLED)
return pMsg;
!
! // check if need to suppress req or data msgs
! suppressMsgs(rxReqMsg->imgNum, rxReqMsg->pgNum);
if (rxReqMsg->pgNum >= call DelugeStats.getNumPgsComplete(rxReqMsg->imgNum)
! || rxReqMsg->vNum != call DelugeStats.getVNum(rxReqMsg->imgNum)
! || rxReqMsg->dest != TOS_LOCAL_ADDRESS) {
// don't have this page, ignore request
return pMsg;
***************
*** 385,411 ****
}
- task void retrySendDataMsg() {
-
- if (state != S_SENDING)
- return;
-
- if (call SendDataMsg.send(vars.tx.dest, sizeof(DelugeDataMsg),
- call SharedMsgBuf.getMsgBuf()) == FAIL)
- post retrySendDataMsg();
-
- }
-
event void DataRead.readDone(storage_result_t result) {
- TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
-
if (state != S_SENDING)
return;
! if (result != STORAGE_OK)
changeState(S_IDLE);
if (call SendDataMsg.send(vars.tx.dest, sizeof(DelugeDataMsg), pMsgBuf) == FAIL)
! post retrySendDataMsg();
}
--- 365,380 ----
}
event void DataRead.readDone(storage_result_t result) {
if (state != S_SENDING)
return;
! if (result != STORAGE_OK) {
changeState(S_IDLE);
+ return;
+ }
if (call SendDataMsg.send(vars.tx.dest, sizeof(DelugeDataMsg), pMsgBuf) == FAIL)
! call Timer.start(TIMER_ONE_SHOT, DELUGE_FAILED_SEND_DELAY);
}
***************
*** 415,434 ****
uint16_t tmp;
! if (dataQLen > 0) {
! dataQHead = (dataQHead + 1) % DELUGE_DATA_Q_SIZE;
! dataQLen--;
! }
! if (dataQLen > 0) {
! post writeData();
! }
! else if (!call BitVecUtils.indexOf(&tmp, 0, pktsToReceive, DELUGE_PKTS_PER_PAGE)) {
! imgnum_t tmpImgNum = workingImgNum;
! pgnum_t tmpPgNum = workingPgNum;
!
! workingImgNum = DELUGE_INVALID_IMGNUM;
! workingPgNum = DELUGE_INVALID_PGNUM;
changeState(S_IDLE);
- signal PageTransfer.receivedPage(tmpImgNum, tmpPgNum);
- dbg(DBG_USR1, "DELUGE: RECEIVED_PAGE(pgNum=%d)\n", tmpPgNum);
}
--- 384,395 ----
uint16_t tmp;
! isWriting = FALSE;
!
! // mark packet as received
! BITVEC_CLEAR(pktsToReceive, dataBuf.pktNum);
!
! if (!call BitVecUtils.indexOf(&tmp, 0, pktsToReceive, DELUGE_PKTS_PER_PAGE)) {
! signal PageTransfer.receivedPage(workingImgNum, workingPgNum);
changeState(S_IDLE);
}
***************
*** 439,482 ****
if (state != S_RECEIVING)
return SUCCESS;
// start timeout timer in case request is not serviced
! call ReqTimer.start(TIMER_ONE_SHOT,
! DELUGE_NACK_TIMEOUT + call Random.rand() % DELUGE_NACK_TIMEOUT);
!
return SUCCESS;
}
- event result_t SendTimer.fired() {
- setupDataMsg();
- return SUCCESS;
- }
-
event result_t SendDataMsg.sendDone(TOS_MsgPtr pMsg, result_t success) {
-
- DelugeDataMsg* pDataMsg = (DelugeDataMsg*)(pMsg->data);
-
BITVEC_CLEAR(pktsToSend, pDataMsg->pktNum);
! if (pDataMsg->pktNum >= DELUGE_PKTS_PER_PAGE - 1)
! pDataMsg->pktNum = 0;
!
! // setupDataMsg();
! call SendTimer.start(TIMER_ONE_SHOT, 2);
!
return SUCCESS;
-
}
!
event void SharedMsgBuf.bufFree() {
! if (state == S_TX_LOCKING)
! setupDataMsg();
! else if (state == S_RX_LOCKING)
! setupReqMsg();
}
!
! event void DataRead.computeCrcDone(storage_result_t result, uint16_t crcResult) { ; }
! event void DataWrite.eraseDone(storage_result_t result) { ; }
! event void Metadata.setupNewImageDone(result_t result) { ; }
! event void Metadata.receivedPageDone(result_t result) { ; }
}
--- 400,428 ----
if (state != S_RECEIVING)
return SUCCESS;
+
+ vars.rx.remainingAttempts--;
// start timeout timer in case request is not serviced
! startReqTimer(FALSE);
return SUCCESS;
}
event result_t SendDataMsg.sendDone(TOS_MsgPtr pMsg, result_t success) {
BITVEC_CLEAR(pktsToSend, pDataMsg->pktNum);
! call Timer.start(TIMER_ONE_SHOT, 2);
return SUCCESS;
}
!
event void SharedMsgBuf.bufFree() {
! switch(state) {
! case S_TX_LOCKING: setupDataMsg(); break;
! case S_RX_LOCKING: setupReqMsg(); break;
! }
}
!
! event void DataRead.computeCrcDone(storage_result_t result, uint16_t crcResult) {}
! event void DataWrite.eraseDone(storage_result_t result) {}
! event void Metadata.updateDone(result_t result) {}
}
Index: DelugeStorageM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeStorageM.nc,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** DelugeStorageM.nc 18 Mar 2005 01:13:28 -0000 1.8
--- DelugeStorageM.nc 17 May 2005 20:55:48 -0000 1.9
***************
*** 57,72 ****
};
- uint8_t compID;
uint8_t state;
! uint16_t crc;
! void signalDone(result_t result) {
uint8_t tmpState = state;
state = S_IDLE;
switch(tmpState) {
! case S_READ: signal DataRead.readDone[compID](result); break;
! case S_WRITE: signal DataWrite.writeDone[compID](result); break;
! case S_ERASE: signal DataWrite.eraseDone[compID](result); break;
! case S_COMPUTE_CRC: signal DataRead.computeCrcDone[compID](result, crc); break;
}
}
--- 57,76 ----
};
uint8_t state;
! uint8_t client;
! void signalDone(result_t result, uint16_t crc) {
uint8_t tmpState = state;
state = S_IDLE;
switch(tmpState) {
! case S_READ: signal DataRead.readDone[client](result); break;
! case S_WRITE: signal DataWrite.writeDone[client](result); break;
! case S_ERASE: signal DataWrite.eraseDone[client](result); break;
! case S_COMPUTE_CRC: signal DataRead.computeCrcDone[client](result, crc); break;
! case S_MOUNTING:
! if (result == FAIL)
! state = S_NEVER_USED;
! signal DelugeStorage.loadImagesDone(result);
! break;
}
}
***************
*** 87,101 ****
command result_t DelugeStorage.loadImages() {
if (state != S_NEVER_USED)
return FAIL;
! state = S_MOUNTING;
! crc = 0;
! if (call Mount.mount[DELUGE_IMAGES[crc].imageNum](DELUGE_IMAGES[crc].volumeId) == FAIL) {
! state = S_NEVER_USED;
! return FAIL;
! }
!
! return SUCCESS;
}
--- 91,107 ----
command result_t DelugeStorage.loadImages() {
+ result_t result;
+
if (state != S_NEVER_USED)
return FAIL;
! client = 0;
!
! result = call Mount.mount[DELUGE_IMAGES[client].imageNum](DELUGE_IMAGES[client].volumeId);
!
! if (result == SUCCESS)
! state = S_MOUNTING;
!
! return result;
}
***************
*** 104,129 ****
if (result != STORAGE_OK) {
! state = S_NEVER_USED;
! signal DelugeStorage.loadImagesDone(FAIL);
return;
}
!
// mount next image
! if ( ++crc < DELUGE_NUM_IMAGES ) {
! if (call Mount.mount[DELUGE_IMAGES[crc].imageNum](DELUGE_IMAGES[crc].volumeId) == FAIL) {
! state = S_NEVER_USED;
! signal DelugeStorage.loadImagesDone(FAIL);
! }
return;
}
// mounted all images
! state = S_IDLE;
! signal DelugeStorage.loadImagesDone(SUCCESS);
}
command uint32_t DelugeStorage.imgNum2Addr(imgnum_t imgNum) {
! return call StorageRemap.physicalAddr[DELUGE_IMAGES[imgNum].imageNum](DELUGE_CRC_BLOCK_SIZE);
}
--- 110,131 ----
if (result != STORAGE_OK) {
! signalDone(FAIL, 0);
return;
}
!
// mount next image
! if ( ++client < DELUGE_NUM_IMAGES ) {
! if (call Mount.mount[DELUGE_IMAGES[client].imageNum](DELUGE_IMAGES[client].volumeId) == FAIL)
! signalDone(FAIL, 0);
return;
}
// mounted all images
! signalDone(SUCCESS, 0);
}
command uint32_t DelugeStorage.imgNum2Addr(imgnum_t imgNum) {
! return call StorageRemap.physicalAddr[DELUGE_IMAGES[imgNum].imageNum](0);
}
***************
*** 132,159 ****
result_t result = FAIL;
if (state != S_IDLE)
return FAIL;
!
! compID = id;
!
! state = newState;
switch(newState) {
case S_READ:
! result = call BlockRead.read[DELUGE_IMAGES[imgNum].imageNum](addr, buf, len);
break;
case S_WRITE:
! result = call BlockWrite.write[DELUGE_IMAGES[imgNum].imageNum](addr, buf, len);
break;
case S_ERASE:
! result = call BlockWrite.erase[DELUGE_IMAGES[imgNum].imageNum]();
break;
case S_COMPUTE_CRC:
! result = call BlockRead.computeCrc[DELUGE_IMAGES[imgNum].imageNum](addr, len);
break;
}
! if (result == FAIL)
! state = S_IDLE;
return result;
--- 134,161 ----
result_t result = FAIL;
+ uint8_t image = DELUGE_IMAGES[imgNum].imageNum;
if (state != S_IDLE)
return FAIL;
!
! client = id;
!
switch(newState) {
case S_READ:
! result = call BlockRead.read[image](addr, buf, len);
break;
case S_WRITE:
! result = call BlockWrite.write[image](addr, buf, len);
break;
case S_ERASE:
! result = call BlockWrite.erase[image]();
break;
case S_COMPUTE_CRC:
! result = call BlockRead.computeCrc[image](addr, len);
break;
}
! if (result == SUCCESS)
! state = newState;
return result;
***************
*** 162,166 ****
command result_t DataRead.read[uint8_t id](imgnum_t imgNum, block_addr_t addr,
! uint8_t* buf, block_addr_t length) {
return newRequest(S_READ, id, imgNum, addr, buf, length);
}
--- 164,168 ----
command result_t DataRead.read[uint8_t id](imgnum_t imgNum, block_addr_t addr,
! void* buf, block_addr_t length) {
return newRequest(S_READ, id, imgNum, addr, buf, length);
}
***************
*** 171,175 ****
command result_t DataWrite.write[uint8_t id](imgnum_t imgNum, block_addr_t addr,
! uint8_t* buf, block_addr_t length) {
return newRequest(S_WRITE, id, imgNum, addr, buf, length);
}
--- 173,177 ----
command result_t DataWrite.write[uint8_t id](imgnum_t imgNum, block_addr_t addr,
! void* buf, block_addr_t length) {
return newRequest(S_WRITE, id, imgNum, addr, buf, length);
}
***************
*** 179,206 ****
}
! event void BlockRead.readDone[uint8_t volume](storage_result_t result, block_addr_t addr, uint8_t* buf, block_addr_t len) {
! signalDone(result);
}
! event void BlockRead.computeCrcDone[uint8_t volume](storage_result_t result, uint16_t crcResult, block_addr_t addr, block_addr_t len) {
! crc = crcResult;
! signalDone(result);
}
! event void BlockWrite.writeDone[uint8_t volume](storage_result_t result, block_addr_t addr, uint8_t* buf, block_addr_t len) {
! signalDone(result);
}
event void BlockWrite.eraseDone[uint8_t volume](storage_result_t result) {
! signalDone(result);
}
! event void BlockWrite.commitDone[uint8_t volume](storage_result_t result) { ; }
! event void BlockRead.verifyDone[uint8_t volume](storage_result_t result) { ; }
! default command result_t BlockRead.read[blockstorage_t blockId](block_addr_t addr, uint8_t* buf, block_addr_t len) { return FAIL; }
default command result_t BlockRead.verify[blockstorage_t blockId]() { return FAIL; }
default command result_t BlockRead.computeCrc[blockstorage_t blockId](block_addr_t addr, block_addr_t len) { return FAIL; }
! default command result_t BlockWrite.write[blockstorage_t blockId](block_addr_t addr, uint8_t* buf, block_addr_t len) { return FAIL; }
default command result_t BlockWrite.erase[blockstorage_t blockId]() { return FAIL; }
default command result_t BlockWrite.commit[blockstorage_t blockId]() { return FAIL; }
--- 181,207 ----
}
! event void BlockRead.readDone[uint8_t volume](storage_result_t result, block_addr_t addr, void* buf, block_addr_t len) {
! signalDone(result, 0);
}
! event void BlockRead.computeCrcDone[uint8_t volume](storage_result_t result, uint16_t crc, block_addr_t addr, block_addr_t len) {
! signalDone(result, crc);
}
! event void BlockWrite.writeDone[uint8_t volume](storage_result_t result, block_addr_t addr, void* buf, block_addr_t len) {
! signalDone(result, 0);
}
event void BlockWrite.eraseDone[uint8_t volume](storage_result_t result) {
! signalDone(result, 0);
}
! event void BlockWrite.commitDone[uint8_t volume](storage_result_t result) {}
! event void BlockRead.verifyDone[uint8_t volume](storage_result_t result) {}
! default command result_t BlockRead.read[blockstorage_t blockId](block_addr_t addr, void* buf, block_addr_t len) { return FAIL; }
default command result_t BlockRead.verify[blockstorage_t blockId]() { return FAIL; }
default command result_t BlockRead.computeCrc[blockstorage_t blockId](block_addr_t addr, block_addr_t len) { return FAIL; }
! default command result_t BlockWrite.write[blockstorage_t blockId](block_addr_t addr, void* buf, block_addr_t len) { return FAIL; }
default command result_t BlockWrite.erase[blockstorage_t blockId]() { return FAIL; }
default command result_t BlockWrite.commit[blockstorage_t blockId]() { return FAIL; }
***************
*** 208,215 ****
default command uint32_t StorageRemap.physicalAddr[blockstorage_t blockId](uint32_t id) { return STORAGE_INVALID_ADDR; }
! default event void DataRead.readDone[uint8_t id](storage_result_t result) { ; }
! default event void DataRead.computeCrcDone[uint8_t id](storage_result_t result, uint16_t crcResult) { ; }
! default event void DataWrite.writeDone[uint8_t id](storage_result_t result) { ; }
! default event void DataWrite.eraseDone[uint8_t id](storage_result_t result) { ; }
}
--- 209,216 ----
default command uint32_t StorageRemap.physicalAddr[blockstorage_t blockId](uint32_t id) { return STORAGE_INVALID_ADDR; }
! default event void DataRead.readDone[uint8_t id](storage_result_t result) {}
! default event void DataRead.computeCrcDone[uint8_t id](storage_result_t result, uint16_t crcResult) {}
! default event void DataWrite.writeDone[uint8_t id](storage_result_t result) {}
! default event void DataWrite.eraseDone[uint8_t id](storage_result_t result) {}
}
Index: NetProgC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/NetProgC.nc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** NetProgC.nc 15 Mar 2005 19:54:11 -0000 1.4
--- NetProgC.nc 17 May 2005 20:55:48 -0000 1.5
***************
*** 43,46 ****
--- 43,47 ----
components
+ CrcC,
DelugeMetadataC as Metadata,
DelugeStorageC as Storage,
***************
*** 61,64 ****
--- 62,66 ----
Main.StdControl -> SharedMsgBufM;
+ NetProgM.Crc -> CrcC;
NetProgM.Metadata -> Metadata.Metadata[unique("DelugeMetadata")];
NetProgM.MetadataControl -> Metadata;
Index: NetProgM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/NetProgM.nc,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** NetProgM.nc 21 Apr 2005 17:33:04 -0000 1.6
--- NetProgM.nc 17 May 2005 20:55:48 -0000 1.7
***************
*** 35,38 ****
--- 35,39 ----
}
uses {
+ interface Crc;
interface DelugeMetadata as Metadata;
interface DelugeStorage as Storage;
***************
*** 48,69 ****
uint16_t computeTosInfoCrc(NetProg_TOSInfo* tosInfo) {
! uint8_t *buf = (uint8_t*)tosInfo;
! uint16_t crc;
! uint8_t i;
! for ( i = 0, crc = 0; i < sizeof(NetProg_TOSInfo)-2; i++ )
! crc = crcByte(crc, *buf++);
! return crc;
}
void writeTOSinfo() {
NetProg_TOSInfo tosInfo;
call IFlash.read((uint8_t*)IFLASH_TOS_INFO_ADDR, &tosInfo, sizeof(tosInfo));
- // don't write if data is already correct
- if (tosInfo.addr == TOS_LOCAL_ADDRESS && tosInfo.groupId == TOS_AM_GROUP
- && tosInfo.crc == computeTosInfoCrc(&tosInfo))
- return;
tosInfo.addr = TOS_LOCAL_ADDRESS;
tosInfo.groupId = TOS_AM_GROUP;
! tosInfo.crc = computeTosInfoCrc(&tosInfo);
call IFlash.write((uint8_t*)IFLASH_TOS_INFO_ADDR, &tosInfo, sizeof(tosInfo));
}
--- 49,66 ----
uint16_t computeTosInfoCrc(NetProg_TOSInfo* tosInfo) {
! return call Crc.crc16(tosInfo, sizeof(NetProg_TOSInfo)-2);
}
void writeTOSinfo() {
NetProg_TOSInfo tosInfo;
+ uint16_t crc;
call IFlash.read((uint8_t*)IFLASH_TOS_INFO_ADDR, &tosInfo, sizeof(tosInfo));
tosInfo.addr = TOS_LOCAL_ADDRESS;
tosInfo.groupId = TOS_AM_GROUP;
! crc = computeTosInfoCrc(&tosInfo);
! // don't write if data is already correct
! if (tosInfo.crc == crc)
! return;
! tosInfo.crc = crc;
call IFlash.write((uint8_t*)IFLASH_TOS_INFO_ADDR, &tosInfo, sizeof(tosInfo));
}
***************
*** 120,124 ****
writeTOSinfo();
! imageAddr = call Storage.imgNum2Addr(newImgNum) + DELUGE_IDENT_SIZE;
call IFlash.write((uint16_t*)TOSBOOT_NEW_IMG_START_ADDR, &imageAddr, sizeof(imageAddr));
call IFlash.read((uint8_t*)TOSBOOT_FLAGS_ADDR, &flags, sizeof(flags));
--- 117,121 ----
writeTOSinfo();
! imageAddr = call Storage.imgNum2Addr(newImgNum);
call IFlash.write((uint16_t*)TOSBOOT_NEW_IMG_START_ADDR, &imageAddr, sizeof(imageAddr));
call IFlash.read((uint8_t*)TOSBOOT_FLAGS_ADDR, &flags, sizeof(flags));
***************
*** 161,170 ****
return SUCCESS;
}
!
! event void Metadata.setupNewImageDone(result_t result) { ; }
! event void Metadata.receivedPageDone(result_t result) { ; }
! event void Storage.loadImagesDone(result_t result) { ; }
!
! event void SharedMsgBuf.bufFree() { ; }
}
--- 158,165 ----
return SUCCESS;
}
!
! event void Metadata.updateDone(result_t result) {}
! event void Storage.loadImagesDone(result_t result) {}
! event void SharedMsgBuf.bufFree() {}
}
Index: SharedMsgBufM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/SharedMsgBufM.nc,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** SharedMsgBufM.nc 15 Mar 2005 06:24:32 -0000 1.2
--- SharedMsgBufM.nc 17 May 2005 20:55:48 -0000 1.3
***************
*** 82,91 ****
command bool SharedMsgBuf.isLocked[uint8_t id]() {
! if (BITVEC_GET(lockedMsgBufs, id))
! return TRUE;
! return FALSE;
}
! default event void SharedMsgBuf.bufFree[uint8_t id]() { ; }
}
--- 82,89 ----
command bool SharedMsgBuf.isLocked[uint8_t id]() {
! return !!BITVEC_GET(lockedMsgBufs, id);
}
! default event void SharedMsgBuf.bufFree[uint8_t id]() {}
}
More information about the Tinyos-beta-commits
mailing list