[Tinyos-beta-commits] CVS: tinyos-1.x/beta/Deluge/Deluge DelugeDataRead.nc, 1.3, 1.4 DelugeM.nc, 1.13, 1.14 DelugeMetadata.nc, 1.4, 1.5 DelugeMetadataC.nc, 1.4, 1.5 DelugeMetadataM.nc, 1.12, 1.13 DelugePageTransferM.nc, 1.7, 1.8 DelugeStorageC.nc, 1.8, 1.9 DelugeStorageM.nc, 1.7, 1.8 DelugeMetadataRead.nc, 1.3, NONE DelugeMetadataWrite.nc, 1.3, NONE

Jonathan Hui jwhui at users.sourceforge.net
Thu Mar 17 17:13:34 PST 2005


Update of /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5324/Deluge

Modified Files:
	DelugeDataRead.nc DelugeM.nc DelugeMetadata.nc 
	DelugeMetadataC.nc DelugeMetadataM.nc DelugePageTransferM.nc 
	DelugeStorageC.nc DelugeStorageM.nc 
Removed Files:
	DelugeMetadataRead.nc DelugeMetadataWrite.nc 
Log Message:
- Simplified implementation.



Index: DelugeDataRead.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeDataRead.nc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** DelugeDataRead.nc	11 Mar 2005 21:46:37 -0000	1.3
--- DelugeDataRead.nc	18 Mar 2005 01:13:27 -0000	1.4
***************
*** 36,42 ****
    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);
!   
!   command result_t verify(imgnum_t imgNum, pgnum_t addr);
!   event void verifyDone(storage_result_t result);
  
  }
--- 36,42 ----
    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);
! 
!   command result_t computeCrc(imgnum_t imgNum, block_addr_t addr, block_addr_t len);
!   event void computeCrcDone(storage_result_t result, uint16_t crc);
  
  }

Index: DelugeM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeM.nc,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** DelugeM.nc	15 Mar 2005 21:49:59 -0000	1.13
--- DelugeM.nc	18 Mar 2005 01:13:27 -0000	1.14
***************
*** 68,77 ****
    uint8_t rebootDelay;
  
-   void setupAdvTimer(uint8_t timerNum) {
-     advTimers[timerNum].timer = (uint32_t)0x1 << (advTimers[timerNum].periodLog2-1);
-     advTimers[timerNum].timer += call Random.rand() & (advTimers[timerNum].timer-1);
-     advTimers[timerNum].overheard = 0;
-   }
- 
    uint8_t findMinTimer() {
  
--- 68,71 ----
***************
*** 89,105 ****
    }
  
!   void updateTimers() {
!     uint8_t minTimer = findMinTimer();
!     uint8_t i;
!     for ( i = 0; i < DELUGE_NUM_TIMERS; i++ ) {
!       if (advTimers[i].timer >= advTimers[minTimer].timer)
! 	advTimers[i].timer -= advTimers[minTimer].timer;
!     }
!   }
  
!   void startTimer() {
!     
!     uint8_t minTimer = findMinTimer();
  
      if (advTimers[minTimer].timer < 2)
        advTimers[minTimer].timer += 2;
--- 83,96 ----
    }
  
!   void setupAdvTimer(uint8_t timerNum) {
  
!     uint8_t minTimer;
! 
!     advTimers[timerNum].timer = (uint32_t)0x1 << (advTimers[timerNum].periodLog2-1);
!     advTimers[timerNum].timer += call Random.rand() & (advTimers[timerNum].timer-1);
!     advTimers[timerNum].overheard = 0;
  
+     minTimer = findMinTimer();
+     
      if (advTimers[minTimer].timer < 2)
        advTimers[minTimer].timer += 2;
***************
*** 110,113 ****
--- 101,112 ----
    }
  
+   void updateTimers(uint8_t minTimer) {
+     uint8_t i;
+     for ( i = 0; i < DELUGE_NUM_TIMERS; i++ ) {
+       if (advTimers[i].timer >= advTimers[minTimer].timer)
+ 	advTimers[i].timer -= advTimers[minTimer].timer;
+     }
+   }
+ 
    void setNextPage() {
  
***************
*** 145,148 ****
--- 144,148 ----
  
      setNextPage();
+     rebootDelay = 0;
  
      for ( i = 0; i < DELUGE_NUM_TIMERS; i++ ) {
***************
*** 150,156 ****
        setupAdvTimer(i);
      }
-     rebootDelay = 0;
- 
-     startTimer();
    }
  
--- 150,153 ----
***************
*** 180,188 ****
  
    event result_t MetadataControl.startDone() { 
- 
      realStart();
- 
      return SUCCESS; 
- 
    }
  
--- 177,182 ----
***************
*** 191,206 ****
    }
  
-   void fillAdvMsg(imgnum_t image, DelugeAdvMsg* pMsg) {
-     pMsg->sourceAddr = TOS_LOCAL_ADDRESS;
-     pMsg->version = DELUGE_VERSION;
-     pMsg->type = DELUGE_ADV_NORMAL;
-     pMsg->nodeDesc = nodeDesc;
-     call Metadata.getImgDesc(image, &(pMsg->imgDesc));
-   }
- 
    void sendAdvMsg(uint8_t imgNum, uint16_t addr) {
      if (!call SharedMsgBuf.isLocked()) {
        TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
!       fillAdvMsg(imgNum, (DelugeAdvMsg*)pMsgBuf->data);
        if (call SendAdvMsg.send(addr, sizeof(DelugeAdvMsg), pMsgBuf) == SUCCESS) {
  	call Leds.greenToggle();
--- 185,197 ----
    }
  
    void sendAdvMsg(uint8_t imgNum, uint16_t addr) {
      if (!call SharedMsgBuf.isLocked()) {
        TOS_MsgPtr pMsgBuf = call SharedMsgBuf.getMsgBuf();
!       DelugeAdvMsg* pMsg = (DelugeAdvMsg*)pMsgBuf->data;
!       pMsg->sourceAddr = TOS_LOCAL_ADDRESS;
!       pMsg->version = DELUGE_VERSION;
!       pMsg->type = DELUGE_ADV_NORMAL;
!       pMsg->nodeDesc = nodeDesc;
!       call Metadata.getImgDesc(imgNum, &(pMsg->imgDesc));
        if (call SendAdvMsg.send(addr, sizeof(DelugeAdvMsg), pMsgBuf) == SUCCESS) {
  	call Leds.greenToggle();
***************
*** 222,226 ****
        call Leds.yellowOff();
  
!     updateTimers();
  
      if (!advTimers[minTimer].overheard)
--- 213,217 ----
        call Leds.yellowOff();
  
!     updateTimers(minTimer);
  
      if (!advTimers[minTimer].overheard)
***************
*** 235,240 ****
        if (rebootDelay == 1) {
  	call IFlash.write((uint16_t*)IFLASH_NODE_DESC_ADDR, &nodeDesc, sizeof(nodeDesc));
! 	call NetProg.programImgAndReboot(nodeDesc.imgNum); // SHOULD NOT RETURN!
! 	// XXX: WHAT DO WE DO HERE?
        }
        rebootDelay--;
--- 226,231 ----
        if (rebootDelay == 1) {
  	call IFlash.write((uint16_t*)IFLASH_NODE_DESC_ADDR, &nodeDesc, sizeof(nodeDesc));
! 	// will not return on SUCCESS
! 	call NetProg.programImgAndReboot(nodeDesc.imgNum);
        }
        rebootDelay--;
***************
*** 246,251 ****
  
      setupAdvTimer(minTimer);
-     
-     startTimer();
  
      return SUCCESS;
--- 237,240 ----
***************
*** 313,317 ****
  	advTimers[imgNum-1].periodLog2 = DELUGE_MIN_ADV_PERIOD_LOG2;
  	setupAdvTimer(imgNum-1);
- 	startTimer();
        }
      }
--- 302,305 ----
***************
*** 326,331 ****
        rebootDelay = DELUGE_REBOOT_DELAY;
        setupAdvTimer(tmpImgNum-1);
!       startTimer();
!       sendAdvMsg(imgNum, rxAdvMsg->sourceAddr);
      }
  
--- 314,320 ----
        rebootDelay = DELUGE_REBOOT_DELAY;
        setupAdvTimer(tmpImgNum-1);
!       if (rxAdvMsg->sourceAddr == TOS_UART_ADDR
! 	  || rxAdvMsg->sourceAddr == TOS_BCAST_ADDR)
! 	sendAdvMsg(imgNum, rxAdvMsg->sourceAddr);
      }
  
***************
*** 366,371 ****
      setupAdvTimer(imgNum-1);
  
-     startTimer();
- 
    }
  
--- 355,358 ----

Index: DelugeMetadata.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMetadata.nc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** DelugeMetadata.nc	15 Mar 2005 21:49:59 -0000	1.4
--- DelugeMetadata.nc	18 Mar 2005 01:13:28 -0000	1.5
***************
*** 32,47 ****
  
    command bool started();
- 
    command bool isComplete(imgnum_t imgNum);
    command bool isImgDescValid(DelugeImgDesc* tmpImgDesc);
- 
-   command result_t setupNewImage(DelugeImgDesc* imgDesc);
-   event void setupNewImageDone(result_t result);
    command result_t getImgDesc(imgnum_t imgNum, DelugeImgDesc* imgDesc);
    command dm_cmp_t compareImgDesc(DelugeImgDesc* imgDesc);
- 
    command imgvnum_t getVNum(imgnum_t imgNum);
    command pgnum_t getNumPgsComplete(imgnum_t imgNum);
  
    command result_t receivedPage(imgnum_t imgNum, pgnum_t pgNum);
    event void receivedPageDone(result_t result);
--- 32,44 ----
  
    command bool started();
    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 imgvnum_t getVNum(imgnum_t imgNum);
    command pgnum_t getNumPgsComplete(imgnum_t imgNum);
  
+   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);

Index: DelugeMetadataC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMetadataC.nc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** DelugeMetadataC.nc	11 Mar 2005 21:46:38 -0000	1.4
--- DelugeMetadataC.nc	18 Mar 2005 01:13:28 -0000	1.5
***************
*** 43,61 ****
    components
      DelugeMetadataM,
!     DelugeStorageC as Storage;
! 
! #ifdef PLATFORM_TELOSB
!   components CC2420RadioC as RadioControl;
!   DelugeMetadataM.RadioControl -> RadioControl;
! #endif
  
    SplitControl = DelugeMetadataM;
    Metadata = DelugeMetadataM;
  
    DelugeMetadataM.DataRead -> Storage.DataRead[unique("DelugeDataRead")];
    DelugeMetadataM.DataWrite -> Storage.DataWrite[unique("DelugeDataWrite")];
    DelugeMetadataM.DelugeStorage -> Storage;
!   DelugeMetadataM.MetadataRead -> Storage.MetadataRead[unique("DelugeMetadataRead")];
!   DelugeMetadataM.MetadataWrite -> Storage.MetadataWrite[unique("DelugeMetadataWrite")];
  
  }
--- 43,63 ----
    components
      DelugeMetadataM,
!     DelugeStorageC as Storage,
!     Main,
!     LedsC as Leds,
!     TimerC;
  
    SplitControl = DelugeMetadataM;
    Metadata = DelugeMetadataM;
  
+   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")];
  
  }

Index: DelugeMetadataM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeMetadataM.nc,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** DelugeMetadataM.nc	16 Mar 2005 00:14:53 -0000	1.12
--- DelugeMetadataM.nc	18 Mar 2005 01:13:28 -0000	1.13
***************
*** 37,46 ****
      interface DelugeDataRead as DataRead;
      interface DelugeDataWrite as DataWrite;
!     interface DelugeMetadataRead as MetadataRead;
!     interface DelugeMetadataWrite as MetadataWrite;
      interface DelugeStorage;
! #ifdef PLATFORM_TELOSB
!     interface SplitControl as RadioControl;
! #endif
    }
  }
--- 37,45 ----
      interface DelugeDataRead as DataRead;
      interface DelugeDataWrite as DataWrite;
!     interface DelugeDataRead as MetadataRead;
!     interface DelugeDataWrite as MetadataWrite;
      interface DelugeStorage;
!     interface Leds;
!     interface Timer;
    }
  }
***************
*** 53,160 ****
    uint8_t curImage;
    uint8_t state;
  
    enum {
-     S_RADIO_STARTING,
-     S_WAITING_FOR_RADIO,
      S_INIT,
      S_IDLE,
      S_VERIFY,
!     S_ERASE_IMAGE,
!     S_READ_IMG_DESC,
!     S_FIND_INCOMPLETE_PAGE,
!     S_WRITE_IMG_DESC,
!     S_SETUP_NEW_IMAGE,
    };
  
-   task void retry() {
  
!     result_t result = SUCCESS;
  
      switch(state) {
!     case S_SETUP_NEW_IMAGE: case S_ERASE_IMAGE:
!       result = call DataWrite.erase(curImage);
!       break;
!     case S_READ_IMG_DESC:
!       result = call MetadataRead.read(curImage, &(imgDesc[curImage]));
!       break;
!     case S_WRITE_IMG_DESC:
!       result = call MetadataWrite.write(curImage, &(imgDesc[curImage]));
!       break;
!     case S_FIND_INCOMPLETE_PAGE:
      case S_VERIFY:
!       result = call DataRead.verify(curImage, imgDesc[curImage].numPgsComplete);
!       break;
      }
  
!     if (result == FAIL)
!       post retry();
  
    }
  
!   command result_t SplitControl.init() {
  
! #ifdef PLATFORM_TELOSB
!     state = S_RADIO_STARTING;
! #else
!     state = S_INIT;
! #endif
  
! #ifdef PLATFORM_PC
!     if (TOS_LOCAL_ADDRESS == 0) {
!       imgDesc[0].vNum = 1;
!       imgDesc[0].imgNum = 0;
!       imgDesc[0].numPgs = 5;
!       imgDesc[0].numPgsComplete = 5;
      }
- #endif
  
!     return SUCCESS;
  
    }
  
!   void realStart() {
!     call DelugeStorage.loadImages();
!   }
  
!   event void DelugeStorage.loadImagesDone(result_t result) {
!     state = S_READ_IMG_DESC;
!     curImage = 0;
!     if (call MetadataRead.read(curImage, &(imgDesc[curImage])) == FAIL)
!       post retry();
!   }
  
!   command result_t SplitControl.start() {
!     if (state == S_RADIO_STARTING)
!       state = S_WAITING_FOR_RADIO;
!     else if (state == S_INIT)
!       realStart();
  
!     if (state != S_RADIO_STARTING
! 	&& state != S_WAITING_FOR_RADIO
! 	&& state != S_INIT)
!       return FAIL;
! 	
!     return SUCCESS;
!   }
  
-   command result_t SplitControl.stop() {
-     return SUCCESS;
    }
  
! #ifdef PLATFORM_TELOSB
!   event result_t RadioControl.initDone() { return SUCCESS; }
!   event result_t RadioControl.startDone() {
!     if (state == S_RADIO_STARTING) {
!       state = S_INIT;
      }
!     else if (state == S_WAITING_FOR_RADIO) {
!       state = S_INIT;
!       realStart();
      }
  
-     return SUCCESS;
    }
-   event result_t RadioControl.stopDone() { return SUCCESS; }
- #endif
  
    command bool Metadata.started[uint8_t id]() {
--- 52,209 ----
    uint8_t curImage;
    uint8_t state;
+   uint16_t crc;
  
    enum {
      S_INIT,
+     S_SCAN,
      S_IDLE,
      S_VERIFY,
!     S_SETUP,
    };
  
  
!   command result_t SplitControl.init() {
!     state = S_INIT;
!     return SUCCESS;
!   }
! 
!   command result_t SplitControl.start() {
!     call Timer.start(TIMER_ONE_SHOT, 1024);
!     return SUCCESS;
!   }
! 
!   command result_t SplitControl.stop() {
!     return SUCCESS;
!   }
  
+   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;
+   }
  
!   event result_t Timer.fired() {
!     if (execute() == FAIL)
!       call Timer.start(TIMER_ONE_SHOT, 512);
!     return SUCCESS;
!   }
  
+   event void DelugeStorage.loadImagesDone(result_t result) {
+     curImage = 0;
+     state = S_SCAN;
+     if (execute() == FAIL)
+       call Timer.start(TIMER_ONE_SHOT, 512);
    }
  
!   void scanNextImage() {
!     curImage++;
!     if (curImage < DELUGE_NUM_IMAGES)
!       call Timer.start(TIMER_ONE_SHOT, 512);
!     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);
  
    }
  
!   event void DataRead.readDone(storage_result_t result) {
  
!     block_addr_t addr, len;
  
!     if (result != STORAGE_OK) {
!       call Timer.start(TIMER_ONE_SHOT, 512);
!       return;
!     }
  
!     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);
  
    }
  
!   event void DataRead.computeCrcDone(storage_result_t result, uint16_t crcResult) { 
! 
!     if (result != STORAGE_OK) {
!       call Timer.start(TIMER_ONE_SHOT, 512);
!       return;
      }
!     
!     // 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();
!       }
!     }
! 
!     // VERIFY state
!     else {
!       
!       if (crc != crcResult) {
! 	imgDesc[curImage].numPgsComplete = 0;
! 	if (call DataWrite.erase(curImage) == FAIL)
! 	  call Timer.start(TIMER_ONE_SHOT, 512);
! 	return;
!       }
! 
!       state = S_IDLE;
!       imgDesc[curImage].numPgsComplete++;
!       signal Metadata.receivedPageDone[client](SUCCESS);
! 
      }
  
    }
  
    command bool Metadata.started[uint8_t id]() {
***************
*** 165,175 ****
  
      uint8_t* tmp = (uint8_t*)tmpImgDesc;
!     uint16_t crc = 0;
      uint8_t i;
      
      for ( i = 0; i < 4; i++ )
!       crc = crcByte(crc, tmp[i]);
      
!     return (crc == tmpImgDesc->crc);
  
    }
--- 214,224 ----
  
      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);
  
    }
***************
*** 178,182 ****
      if (state == S_IDLE
  	&& imgNum < DELUGE_NUM_IMAGES
! 	&& imgDesc[imgNum].numPgsComplete != 0
  	&& (imgDesc[imgNum].numPgs == imgDesc[imgNum].numPgsComplete))
        return TRUE;
--- 227,231 ----
      if (state == S_IDLE
  	&& imgNum < DELUGE_NUM_IMAGES
! 	&& imgDesc[imgNum].numPgsComplete > 0
  	&& (imgDesc[imgNum].numPgs == imgDesc[imgNum].numPgsComplete))
        return TRUE;
***************
*** 193,197 ****
  
    command result_t Metadata.receivedPage[uint8_t id](imgnum_t imgNum, pgnum_t pgNum) {
! 
      if (state != S_IDLE
  	|| imgNum >= DELUGE_NUM_IMAGES
--- 242,246 ----
  
    command result_t Metadata.receivedPage[uint8_t id](imgnum_t imgNum, pgnum_t pgNum) {
!     
      if (state != S_IDLE
  	|| imgNum >= DELUGE_NUM_IMAGES
***************
*** 199,268 ****
  	|| imgDesc[imgNum].numPgsComplete != pgNum)
        return FAIL;
! 
      state = S_VERIFY;
      client = id;
      curImage = imgNum;
- 
-     if (call DataRead.verify(curImage, pgNum) == FAIL)
-       post retry();
- 
-     return SUCCESS;
- 
-   }
- 
-   result_t readNextMetadata() {
-     curImage++;
-     if (curImage < DELUGE_NUM_IMAGES) {
-       if (call MetadataRead.read(curImage, &(imgDesc[curImage])) == FAIL)
- 	post retry();
-       return SUCCESS;
-     }
      
!     // all done, signal that metadata is ready
!     state = S_IDLE;
!     return signal SplitControl.startDone();
!   }
! 
!   event void DataRead.verifyDone(storage_result_t result) {
! 
!     switch(state) {
!     case S_FIND_INCOMPLETE_PAGE:
! 
!       if (result != STORAGE_OK) {
! 	state = S_READ_IMG_DESC;
! 	readNextMetadata();
! 	return;
!       }
! 
!       imgDesc[curImage].numPgsComplete++;
!       if (imgDesc[curImage].numPgsComplete == imgDesc[curImage].numPgs) {
! 	state = S_READ_IMG_DESC;
! 	readNextMetadata();
! 	return;
!       }
! 
!       if (call DataRead.verify(curImage, imgDesc[curImage].numPgsComplete) == FAIL)
! 	post retry();
! 
!       break;
! 
!     case S_VERIFY:
! 
!       if (result != STORAGE_OK) {
! 	imgDesc[curImage].numPgsComplete = 0;
! 	state = S_ERASE_IMAGE;
! 	if (call DataWrite.erase(curImage) == FAIL)
! 	  post retry();
! 	return;
!       }
!       
!       imgDesc[curImage].numPgsComplete++;
!       
!       state = S_IDLE;
!       signal Metadata.receivedPageDone[client](SUCCESS);
!       
!       break;
! 
!     }
  
    }
--- 248,260 ----
  	|| imgDesc[imgNum].numPgsComplete != pgNum)
        return FAIL;
!     
      state = S_VERIFY;
      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;
  
    }
***************
*** 282,289 ****
        imgDesc[imgNum].numPgsComplete = 0;
  
!     state = S_SETUP_NEW_IMAGE;
      curImage = newImgDesc->imgNum;
!     if (call DataWrite.erase(curImage) == FAIL)
!       post retry();
  
      return SUCCESS;
--- 274,280 ----
        imgDesc[imgNum].numPgsComplete = 0;
  
!     state = S_SETUP;
      curImage = newImgDesc->imgNum;
!     call Timer.start(TIMER_ONE_SHOT, 512);
  
      return SUCCESS;
***************
*** 293,299 ****
    command result_t Metadata.getImgDesc[uint8_t id](uint8_t imgNum, DelugeImgDesc* newImgDesc) {
  
-     if (imgNum >= DELUGE_NUM_IMAGES)
-       return FAIL;
- 
      memcpy(newImgDesc, &(imgDesc[imgNum]), sizeof(DelugeImgDesc));
      newImgDesc->numImages = DELUGE_NUM_IMAGES;
--- 284,287 ----
***************
*** 306,323 ****
      
      imgnum_t image = cmpImgDesc->imgNum;
-     
-     if (image >= DELUGE_NUM_IMAGES)
-       return DELUGE_IMGDESC_EQUAL;
  
!     if (cmpImgDesc->vNum == DELUGE_INVALID_VNUM
! 	&& imgDesc[image].vNum != DELUGE_INVALID_VNUM)
!       return DELUGE_IMGDESC_OLDER;
!     else if (cmpImgDesc->vNum != DELUGE_INVALID_VNUM
! 	     && 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;
--- 294,308 ----
      
      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;
***************
*** 329,378 ****
    }
  
!   event void MetadataRead.readDone(storage_result_t result) {
  
!     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;
!       readNextMetadata();
        return;
      }
  
-     if (state == S_READ_IMG_DESC) {
-       state = S_FIND_INCOMPLETE_PAGE;
-       if (call DataRead.verify(curImage, imgDesc[curImage].numPgsComplete) == FAIL)
- 	post retry();
-     }
- 
-   }
- 
-   event void DataWrite.eraseDone(storage_result_t result) {
      switch(state) {
!     case S_ERASE_IMAGE: 
        state = S_IDLE;
!       signal Metadata.receivedPageDone[client](result);
        break;
!     case S_SETUP_NEW_IMAGE:
!       if (call MetadataWrite.write(curImage, &(imgDesc[curImage])) == FAIL)
! 	post retry();
        break;
      }
    }
    
    event void MetadataWrite.writeDone(storage_result_t result) {
-     uint8_t tmpState = state;
      state = S_IDLE;
!     switch(tmpState) {
!     case S_SETUP_NEW_IMAGE:
!       signal Metadata.setupNewImageDone[client](result);
!       break;
!     }
    }
  
-   event void DataRead.readDone(result_t result) { ; }
    event void DataWrite.writeDone(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) { ; }
--- 314,347 ----
    }
  
!   event void DataWrite.eraseDone(storage_result_t result) {
  
!     if (result != STORAGE_OK) {
!       call Timer.start(TIMER_ONE_SHOT, 512);
        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) { ; }

Index: DelugePageTransferM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugePageTransferM.nc,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** DelugePageTransferM.nc	15 Mar 2005 06:24:32 -0000	1.7
--- DelugePageTransferM.nc	18 Mar 2005 01:13:28 -0000	1.8
***************
*** 174,223 ****
    }
    
-   void setupDataMsg();
- 
-   task void retrySetupDataMsg() {
-     setupDataMsg();
-   }
- 
-   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_SENDING && state != S_TX_LOCKING)
-       return;
- 
-     if (state == S_TX_LOCKING) {
-       if (call SharedMsgBuf.lock() == FAIL)
- 	return;
-       changeState(S_SENDING);
-       pDataMsg->vNum = call Metadata.getVNum(vars.tx.imgToSend);
-       pDataMsg->imgNum = vars.tx.imgToSend;
-       pDataMsg->pgNum = vars.tx.pageToSend;
-       pDataMsg->pktNum = 0;
-     }
-     
-     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)
-       post retrySetupDataMsg();
- 
-   }
- 
    void setupReqMsg() {
  
--- 174,177 ----
***************
*** 225,231 ****
      DelugeReqMsg* pReqMsg = (DelugeReqMsg*)(pMsgBuf->data);
  
-     if (state != S_RECEIVING && state != S_RX_LOCKING)
-       return;
- 
      if (state == S_RX_LOCKING) {
        if (call SharedMsgBuf.lock() == FAIL)
--- 179,182 ----
***************
*** 242,245 ****
--- 193,199 ----
      }
  
+     if (state != S_RECEIVING)
+       return;
+ 
      if (vars.rx.suppressReq) {
        // suppress request
***************
*** 274,277 ****
--- 228,330 ----
    }
  
+   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 (rxDataMsg->imgNum <= workingImgNum
+ 	&& rxDataMsg->pgNum <= workingPgNum) {
+       
+       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 Metadata.getVNum(workingImgNum)
+ 	  && rxDataMsg->imgNum == workingImgNum
+ 	  && rxDataMsg->pgNum == workingPgNum
+ 	  && BITVEC_GET(pktsToReceive, rxDataMsg->pktNum)) {
+ 	// got a packet we need
+ 	call Leds.set(rxDataMsg->pktNum);
+ 
+ 	dbg(DBG_USR1, "DELUGE: SAVING(pgNum=%d,pktNum=%d)\n", 
+ 	    rxDataMsg->pgNum,rxDataMsg->pktNum);
+ 	
+ 	// 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);
+       }
+     }
+ 
+     return pMsg;
+ 
+   }
+ 
+   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);
+       pDataMsg->vNum = call Metadata.getVNum(vars.tx.imgToSend);
+       pDataMsg->imgNum = vars.tx.imgToSend;
+       pDataMsg->pgNum = vars.tx.pageToSend;
+       pDataMsg->pktNum = 0;
+     }
+ 
+     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);
+ 
+   }
+ 
    event TOS_MsgPtr ReceiveReqMsg.receive(TOS_MsgPtr pMsg) {
  
***************
*** 346,405 ****
    }
  
-   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 (rxDataMsg->vNum == call Metadata.getVNum(workingImgNum)
- 	&& rxDataMsg->imgNum <= workingImgNum
- 	&& rxDataMsg->pgNum <= workingPgNum) {
-       
-       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->imgNum == workingImgNum
- 	  && rxDataMsg->pgNum == workingPgNum
- 	  && rxDataMsg->pktNum < DELUGE_PKTS_PER_PAGE
- 	  && BITVEC_GET(pktsToReceive, rxDataMsg->pktNum)) {
- 	// got a packet we need
- 	call Leds.set(rxDataMsg->pktNum);
- 
- 	dbg(DBG_USR1, "DELUGE: SAVING(pgNum=%d,pktNum=%d)\n", 
- 	    rxDataMsg->pgNum,rxDataMsg->pktNum);
- 	
- 	// 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)
- 	  post writeData();
- 
- 	// mark packet as received in request packet
- 	BITVEC_CLEAR(pktsToReceive, rxDataMsg->pktNum);
- 	if (state == S_RECEIVING)
- 	  BITVEC_CLEAR(pReqMsg->requestedPkts, rxDataMsg->pktNum);
-       }
-     }
- 
-     return pMsg;
- 
-   }
- 
    task void retrySendDataMsg() {
  
--- 399,402 ----
***************
*** 420,432 ****
        return;
  
!     if (result == STORAGE_OK) {
!       // success, begin sending
!       if (call SendDataMsg.send(vars.tx.dest, sizeof(DelugeDataMsg), pMsgBuf) == FAIL)
! 	post retrySendDataMsg();
!     }
!     else {
!       // fail, something bad happened forget sending
        changeState(S_IDLE);
!     }
  
    }
--- 417,425 ----
        return;
  
!     if (result != STORAGE_OK)
        changeState(S_IDLE);
! 
!     if (call SendDataMsg.send(vars.tx.dest, sizeof(DelugeDataMsg), pMsgBuf) == FAIL)
!       post retrySendDataMsg();
  
    }
***************
*** 458,473 ****
    event result_t SendReqMsg.sendDone(TOS_MsgPtr pMsg, result_t success) {
  
-     DelugeReqMsg* pReqMsg = (DelugeReqMsg*)(pMsg->data);
- 
      if (state != S_RECEIVING)
        return SUCCESS;
  
!     if (pReqMsg->imgNum == workingImgNum
!  	&& pReqMsg->vNum == call Metadata.getVNum(workingImgNum)
! 	&& pReqMsg->pgNum == workingPgNum) {
!       // 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;
--- 451,460 ----
    event result_t SendReqMsg.sendDone(TOS_MsgPtr pMsg, result_t success) {
  
      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;
***************
*** 502,506 ****
    }
  
!   event void DataRead.verifyDone(storage_result_t result) { ; }
    event void DataWrite.eraseDone(storage_result_t result) { ; }
    event void Metadata.setupNewImageDone(result_t result) { ; }
--- 489,493 ----
    }
  
!   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) { ; }

Index: DelugeStorageC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeStorageC.nc,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** DelugeStorageC.nc	11 Mar 2005 21:46:38 -0000	1.8
--- DelugeStorageC.nc	18 Mar 2005 01:13:28 -0000	1.9
***************
*** 33,38 ****
      interface DelugeDataRead as DataRead[uint8_t id];
      interface DelugeDataWrite as DataWrite[uint8_t id];
-     interface DelugeMetadataRead as MetadataRead[uint8_t id];
-     interface DelugeMetadataWrite as MetadataWrite[uint8_t id];
      interface DelugeStorage;
    }
--- 33,36 ----
***************
*** 49,54 ****
    DataWrite = Storage;
    DelugeStorage = Storage;
-   MetadataRead = Storage;
-   MetadataWrite = Storage;
  
    Main.StdControl -> Storage;
--- 47,50 ----
***************
*** 56,71 ****
    Storage.Leds -> Leds;
  
!   Storage.ImageRead[DELUGE_VOLUME_ID_0] -> BlockStorageC.BlockRead[DELUGE_VOLUME_ID_0];
!   Storage.ImageWrite[DELUGE_VOLUME_ID_0] -> BlockStorageC.BlockWrite[DELUGE_VOLUME_ID_0];
    Storage.Mount[DELUGE_VOLUME_ID_0] -> BlockStorageC.Mount[DELUGE_VOLUME_ID_0];
    Storage.StorageRemap[DELUGE_VOLUME_ID_0] -> BlockStorageC.StorageRemap[DELUGE_VOLUME_ID_0];
  
!   Storage.ImageRead[DELUGE_VOLUME_ID_1] -> BlockStorageC.BlockRead[DELUGE_VOLUME_ID_1];
!   Storage.ImageWrite[DELUGE_VOLUME_ID_1] -> BlockStorageC.BlockWrite[DELUGE_VOLUME_ID_1];
    Storage.Mount[DELUGE_VOLUME_ID_1] -> BlockStorageC.Mount[DELUGE_VOLUME_ID_1];
    Storage.StorageRemap[DELUGE_VOLUME_ID_1] -> BlockStorageC.StorageRemap[DELUGE_VOLUME_ID_1];
  
!   Storage.ImageRead[DELUGE_VOLUME_ID_2] -> BlockStorageC.BlockRead[DELUGE_VOLUME_ID_2];
!   Storage.ImageWrite[DELUGE_VOLUME_ID_2] -> BlockStorageC.BlockWrite[DELUGE_VOLUME_ID_2];
    Storage.Mount[DELUGE_VOLUME_ID_2] -> BlockStorageC.Mount[DELUGE_VOLUME_ID_2];
    Storage.StorageRemap[DELUGE_VOLUME_ID_2] -> BlockStorageC.StorageRemap[DELUGE_VOLUME_ID_2];
--- 52,67 ----
    Storage.Leds -> Leds;
  
!   Storage.BlockRead[DELUGE_VOLUME_ID_0] -> BlockStorageC.BlockRead[DELUGE_VOLUME_ID_0];
!   Storage.BlockWrite[DELUGE_VOLUME_ID_0] -> BlockStorageC.BlockWrite[DELUGE_VOLUME_ID_0];
    Storage.Mount[DELUGE_VOLUME_ID_0] -> BlockStorageC.Mount[DELUGE_VOLUME_ID_0];
    Storage.StorageRemap[DELUGE_VOLUME_ID_0] -> BlockStorageC.StorageRemap[DELUGE_VOLUME_ID_0];
  
!   Storage.BlockRead[DELUGE_VOLUME_ID_1] -> BlockStorageC.BlockRead[DELUGE_VOLUME_ID_1];
!   Storage.BlockWrite[DELUGE_VOLUME_ID_1] -> BlockStorageC.BlockWrite[DELUGE_VOLUME_ID_1];
    Storage.Mount[DELUGE_VOLUME_ID_1] -> BlockStorageC.Mount[DELUGE_VOLUME_ID_1];
    Storage.StorageRemap[DELUGE_VOLUME_ID_1] -> BlockStorageC.StorageRemap[DELUGE_VOLUME_ID_1];
  
!   Storage.BlockRead[DELUGE_VOLUME_ID_2] -> BlockStorageC.BlockRead[DELUGE_VOLUME_ID_2];
!   Storage.BlockWrite[DELUGE_VOLUME_ID_2] -> BlockStorageC.BlockWrite[DELUGE_VOLUME_ID_2];
    Storage.Mount[DELUGE_VOLUME_ID_2] -> BlockStorageC.Mount[DELUGE_VOLUME_ID_2];
    Storage.StorageRemap[DELUGE_VOLUME_ID_2] -> BlockStorageC.StorageRemap[DELUGE_VOLUME_ID_2];

Index: DelugeStorageM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/Deluge/Deluge/DelugeStorageM.nc,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** DelugeStorageM.nc	11 Mar 2005 21:46:38 -0000	1.7
--- DelugeStorageM.nc	18 Mar 2005 01:13:28 -0000	1.8
***************
*** 31,36 ****
  module DelugeStorageM {
    provides {
-     interface DelugeMetadataRead as MetadataRead[uint8_t id];
-     interface DelugeMetadataWrite as MetadataWrite[uint8_t id];
      interface DelugeDataRead as DataRead[uint8_t id];
      interface DelugeDataWrite as DataWrite[uint8_t id];
--- 31,34 ----
***************
*** 39,44 ****
    }
    uses {
!     interface BlockRead as ImageRead[blockstorage_t blockId];
!     interface BlockWrite as ImageWrite[blockstorage_t blockId];
      interface Mount[blockstorage_t blockId];
      interface StorageRemap[blockstorage_t blockId];
--- 37,42 ----
    }
    uses {
!     interface BlockRead[blockstorage_t blockId];
!     interface BlockWrite[blockstorage_t blockId];
      interface Mount[blockstorage_t blockId];
      interface StorageRemap[blockstorage_t blockId];
***************
*** 53,62 ****
      S_MOUNTING,
      S_IDLE,
!     S_READ_METADATA,
!     S_WRITE_METADATA,
!     S_READ_DATA,
!     S_WRITE_DATA,
!     S_ERASE_DATA,
!     S_READ_CRC,
      S_COMPUTE_CRC,
    };
--- 51,57 ----
      S_MOUNTING,
      S_IDLE,
!     S_READ,
!     S_WRITE,
!     S_ERASE,
      S_COMPUTE_CRC,
    };
***************
*** 64,68 ****
    uint8_t compID;
    uint8_t state;
-   pgnum_t page;
    uint16_t crc;
  
--- 59,62 ----
***************
*** 71,81 ****
      state = S_IDLE;
      switch(tmpState) {
!     case S_READ_DATA: signal DataRead.readDone[compID](result); break;
!     case S_WRITE_DATA: signal DataWrite.writeDone[compID](result); break;
!     case S_ERASE_DATA: signal DataWrite.eraseDone[compID](result); break;
!     case S_READ_METADATA: signal MetadataRead.readDone[compID](result); break;
!     case S_WRITE_METADATA: signal MetadataWrite.writeDone[compID](result); break;
!     case S_READ_CRC: case S_COMPUTE_CRC:
!       signal DataRead.verifyDone[compID](result); break;
      }
    }
--- 65,72 ----
      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;
      }
    }
***************
*** 100,104 ****
      
      state = S_MOUNTING;
!     if (call Mount.mount[DELUGE_IMAGES[0].imageNum](DELUGE_IMAGES[0].volumeId) == FAIL) {
        state = S_NEVER_USED;
        return FAIL;
--- 91,96 ----
      
      state = S_MOUNTING;
!     crc = 0;
!     if (call Mount.mount[DELUGE_IMAGES[crc].imageNum](DELUGE_IMAGES[crc].volumeId) == FAIL) {
        state = S_NEVER_USED;
        return FAIL;
***************
*** 111,117 ****
    event void Mount.mountDone[volume_t volume](storage_result_t result, volume_id_t id) { 
  
-     uint8_t i;
- 
      if (result != STORAGE_OK) {
        signal DelugeStorage.loadImagesDone(FAIL);
        return;
--- 103,108 ----
    event void Mount.mountDone[volume_t volume](storage_result_t result, volume_id_t id) { 
  
      if (result != STORAGE_OK) {
+       state = S_NEVER_USED;
        signal DelugeStorage.loadImagesDone(FAIL);
        return;
***************
*** 119,130 ****
  
      // mount next image
!     for ( i = 0; i < DELUGE_NUM_IMAGES-1; i++ ) {
!       if (id == DELUGE_IMAGES[i].volumeId) {
! 	if (call Mount.mount[DELUGE_IMAGES[i+1].imageNum](DELUGE_IMAGES[i+1].volumeId) == FAIL) {
! 	  state = S_NEVER_USED;
! 	  signal DelugeStorage.loadImagesDone(FAIL);
! 	}
! 	return;
        }
      }
  
--- 110,119 ----
  
      // 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;
      }
  
***************
*** 136,289 ****
  
    command uint32_t DelugeStorage.imgNum2Addr(imgnum_t imgNum) {
!     uint32_t addr = call StorageRemap.physicalAddr[DELUGE_IMAGES[imgNum].imageNum](0);
!     return addr + (uint32_t)DELUGE_DATA_OFFSET + (uint32_t)DELUGE_CRC_BLOCK_SIZE;
!   }
! 
!   result_t computeCrc(imgnum_t imgNum) {
!     
!     block_addr_t blockAddr;
!     block_addr_t len;
!     
!     if (page == 0) {
!       blockAddr = DELUGE_DATA_OFFSET + DELUGE_CRC_BLOCK_SIZE;
!       len = DELUGE_BYTES_PER_PAGE - DELUGE_CRC_BLOCK_SIZE;
!     }
!     else {
!       blockAddr = DELUGE_DATA_OFFSET + (block_addr_t)page*DELUGE_BYTES_PER_PAGE;
!       len = DELUGE_BYTES_PER_PAGE;
!     }
! 
!     return call ImageRead.computeCrc[DELUGE_IMAGES[imgNum].imageNum](blockAddr, len);
! 
    }
  
    result_t newRequest(uint8_t newState, uint8_t id, imgnum_t imgNum, 
  		      block_addr_t addr, void* buf, block_addr_t len) {
! 
!     result_t result;
!     block_addr_t crcAddr;
  
      if (state != S_IDLE)
        return FAIL;
  
-     if (imgNum >= DELUGE_NUM_IMAGES)
-       return FAIL;
- 
      compID = id;
  
      state = newState;
      switch(newState) {
!     case S_READ_METADATA: case S_READ_DATA:
!       result = call ImageRead.read[DELUGE_IMAGES[imgNum].imageNum](addr, buf, len);
!       break;
!     case S_WRITE_METADATA: case S_WRITE_DATA:
!       result = call ImageWrite.write[DELUGE_IMAGES[imgNum].imageNum](addr, buf, len);
        break;
!     case S_ERASE_DATA:
!       result = call ImageWrite.erase[DELUGE_IMAGES[imgNum].imageNum]();
        break;
!     case S_READ_CRC:
!       page = addr;
!       crcAddr = DELUGE_DATA_OFFSET + sizeof(crc)*page;
!       result = call ImageRead.read[DELUGE_IMAGES[imgNum].imageNum](crcAddr, (uint8_t*)&crc, sizeof(crc));
        break;
!     default:
!       result = FAIL;
        break;
      }
  
!     if (result == FAIL) {
        state = S_IDLE;
-       return FAIL;
-     }
  
!     return SUCCESS;
! 
!   }
  
-   command result_t MetadataRead.read[uint8_t id](imgnum_t imgNum, DelugeImgDesc* imgDesc) {
-     return newRequest(S_READ_METADATA, id, imgNum, 0, imgDesc, sizeof(DelugeImgDesc));
-   }
- 
-   command result_t MetadataWrite.write[uint8_t id](imgnum_t imgNum, DelugeImgDesc* imgDesc) {
-     return newRequest(S_WRITE_METADATA, id, imgNum, 0, imgDesc, sizeof(DelugeImgDesc));
    }
  
    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_DATA, id, imgNum, DELUGE_DATA_OFFSET + addr, buf, length);
    }
    
!   command result_t DataRead.verify[uint8_t id](imgnum_t imgNum, pgnum_t pgNum) {
!     return newRequest(S_READ_CRC, id, imgNum, pgNum, NULL, 0);
    }
  
    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_DATA, id, imgNum, DELUGE_DATA_OFFSET + addr, buf, length);
    }
    
    command result_t DataWrite.erase[uint8_t id](imgnum_t imgNum) {
!     return newRequest(S_ERASE_DATA, id, imgNum, 0, 0, 0);
!   }
! 
!   void flashReqDone(uint8_t volume, result_t result) {
! 
!     uint8_t i;
! 
!     for ( i = 0; i < DELUGE_NUM_IMAGES; i++ ) {
!       if (volume == DELUGE_IMAGES[i].imageNum)
! 	break;
!     }
! 
!     if (i == DELUGE_NUM_IMAGES)
!       return;
!       
!     switch(state) {
!     case S_READ_CRC:
!       state = S_COMPUTE_CRC;
!       if (computeCrc(i) != SUCCESS)
! 	signalDone(STORAGE_FAIL);
!       break;
!     default:
!       signalDone(result);
!       break;
!     }
    }
  
!   event void ImageRead.readDone[uint8_t volume](storage_result_t result, block_addr_t addr, uint8_t* buf, block_addr_t len) {
!     flashReqDone(volume, result);
    }
  
!   event void ImageRead.computeCrcDone[uint8_t volume](storage_result_t result, uint16_t crcResult, block_addr_t addr, block_addr_t len) {
!     flashReqDone(volume, (crc == crcResult) ? STORAGE_OK : STORAGE_FAIL);
    }
  
!   event void ImageWrite.writeDone[uint8_t volume](storage_result_t result, block_addr_t addr, uint8_t* buf, block_addr_t len) {
!     flashReqDone(volume, result);
    }
  
!   event void ImageWrite.eraseDone[uint8_t volume](storage_result_t result) { 
!     flashReqDone(volume, result);
    } 
  
!   event void ImageRead.verifyDone[uint8_t volume](storage_result_t result) { ; }
!   event void ImageWrite.commitDone[uint8_t volume](storage_result_t result) { ; }
  
!   default command result_t ImageRead.read[blockstorage_t blockId](block_addr_t addr, uint8_t* buf, block_addr_t len) { return FAIL; }
!   default command result_t ImageRead.verify[blockstorage_t blockId]() { return FAIL; }
!   default command result_t ImageRead.computeCrc[blockstorage_t blockId](block_addr_t addr, block_addr_t len) { return FAIL; }
!   default command result_t ImageWrite.write[blockstorage_t blockId](block_addr_t addr, uint8_t* buf, block_addr_t len) { return FAIL; }
!   default command result_t ImageWrite.erase[blockstorage_t blockId]() { return FAIL; }
!   default command result_t ImageWrite.commit[blockstorage_t blockId]() { return FAIL; }
    default command result_t Mount.mount[blockstorage_t blockId](volume_id_t id) { return FAIL; }
    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.verifyDone[uint8_t id](storage_result_t result) { ; }
    default event void DataWrite.writeDone[uint8_t id](storage_result_t result) { ; }
    default event void DataWrite.eraseDone[uint8_t id](storage_result_t result) { ; }
-   default event void MetadataRead.readDone[uint8_t id](storage_result_t result) { ; }
-   default event void MetadataWrite.writeDone[uint8_t id](storage_result_t result) { ; }
  
  }
--- 125,215 ----
  
    command uint32_t DelugeStorage.imgNum2Addr(imgnum_t imgNum) {
!     return call StorageRemap.physicalAddr[DELUGE_IMAGES[imgNum].imageNum](DELUGE_CRC_BLOCK_SIZE);
    }
  
    result_t newRequest(uint8_t newState, uint8_t id, imgnum_t imgNum, 
  		      block_addr_t addr, void* buf, block_addr_t len) {
!     
!     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;
  
    }
  
    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);
    }
    
!   command result_t DataRead.computeCrc[uint8_t id](imgnum_t imgNum, block_addr_t addr, block_addr_t length) {
!     return newRequest(S_COMPUTE_CRC, id, imgNum, addr, NULL, length);
    }
  
    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);
    }
    
    command result_t DataWrite.erase[uint8_t id](imgnum_t imgNum) {
!     return newRequest(S_ERASE, id, imgNum, 0, 0, 0);
    }
  
!   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; }
    default command result_t Mount.mount[blockstorage_t blockId](volume_id_t id) { return FAIL; }
    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) { ; }
  
  }

--- DelugeMetadataRead.nc DELETED ---

--- DelugeMetadataWrite.nc DELETED ---



More information about the Tinyos-beta-commits mailing list