X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Fnet%2FDeluge%2FDelugeMetadataP.nc;h=948a470433ccd8f26835de18f92431a3430397ce;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=6c2fa37573ca9e8f852203a6da521d2923f91a25;hpb=e014c5d251e1706ee383c01597ed49173c00c8f3;p=tinyos-2.x.git diff --git a/tos/lib/net/Deluge/DelugeMetadataP.nc b/tos/lib/net/Deluge/DelugeMetadataP.nc index 6c2fa375..948a4704 100644 --- a/tos/lib/net/Deluge/DelugeMetadataP.nc +++ b/tos/lib/net/Deluge/DelugeMetadataP.nc @@ -24,6 +24,8 @@ * @author Chieh-Jan Mike Liang */ +#include "imgNum2volumeId.h" + module DelugeMetadataP { provides interface DelugeMetadata[uint8_t client]; @@ -48,16 +50,17 @@ implementation DelugeIdent ident; uint8_t state; - uint8_t currentImage; + uint8_t currentVolume; + uint8_t currentImageIdx; uint8_t currentPage; nx_uint16_t currentCrc; uint8_t currentClient; void nextImage() { - if (currentImage < DELUGE_NUM_VOLUMES) { + if (currentImageIdx < DELUGE_NUM_VOLUMES) { state = S_READ_IDENT; - call BlockRead.read[currentImage](0, &ident, sizeof(ident)); + call BlockRead.read[currentVolume](0, &ident, sizeof(ident)); } else { signal storageReady(); state = S_READY; @@ -68,7 +71,7 @@ implementation { return DELUGE_IDENT_SIZE + currentPage * sizeof(uint16_t); } - + uint32_t calcPageAddr() { return DELUGE_IDENT_SIZE + DELUGE_CRC_BLOCK_SIZE + currentPage * DELUGE_BYTES_PER_PAGE; @@ -82,8 +85,9 @@ implementation // CRC and check it against the corresponding value from the CRCs // block. state = S_READ_IDENT; - currentImage = 0; - nextImage(); + currentImageIdx = 0; + currentVolume = _imgNum2volumeId[currentImageIdx]; + nextImage(); } command error_t DelugeMetadata.read[uint8_t client](uint8_t imgNum) @@ -110,16 +114,17 @@ implementation if (ident.uidhash != DELUGE_INVALID_UID) { currentPage = 0; state = S_READ_CRC; - call BlockRead.read[currentImage](calcCrcAddr(), ¤tCrc, sizeof(currentCrc)); + call BlockRead.read[currentVolume](calcCrcAddr(), ¤tCrc, sizeof(currentCrc)); } else { - currentImage++; + currentImageIdx++; + currentVolume = _imgNum2volumeId[currentImageIdx]; nextImage(); } } break; case S_READ_CRC: state = S_CRC; - call BlockRead.computeCrc[currentImage](calcPageAddr(), DELUGE_BYTES_PER_PAGE, 0); + call BlockRead.computeCrc[currentVolume](calcPageAddr(), DELUGE_BYTES_PER_PAGE, 0); break; } } @@ -131,14 +136,15 @@ implementation if (crc != currentCrc) { // printf("%04x %04x\n", crc, currentCrc); // invalidate the image by erasing it - call BlockWrite.erase[currentImage](); + call BlockWrite.erase[currentVolume](); } else { currentPage++; if (currentPage < ident.numPgs) { state = S_READ_CRC; - call BlockRead.read[currentImage](calcCrcAddr(), ¤tCrc, sizeof(currentCrc)); + call BlockRead.read[currentVolume](calcCrcAddr(), ¤tCrc, sizeof(currentCrc)); } else { - currentImage++; + currentImageIdx++; + currentVolume = _imgNum2volumeId[currentImageIdx]; nextImage(); } } @@ -157,7 +163,8 @@ implementation signal BlockWrite.eraseDone[imgNum](error); break; case S_CRC: - currentImage++; + currentImageIdx++; + currentVolume = _imgNum2volumeId[currentImageIdx]; nextImage(); break; }