* @author Razvan Musaloiu-E. <razvanm@cs.jhu.edu>
*/
+#include "imgNum2volumeId.h"
+
generic module FlashVolumeManagerP()
{
uses {
interface BlockRead[uint8_t imgNum];
interface BlockWrite[uint8_t imgNum];
- interface Resource[uint8_t imgNum];
+ interface Resource;
interface ArbiterInfo;
interface AMSend as SerialAMSender;
interface Receive as SerialAMReceiver;
typedef nx_struct SerialReqPacket {
nx_uint8_t cmd;
nx_uint8_t imgNum;
- nx_uint16_t offset;
+ nx_uint32_t offset;
nx_uint16_t len;
nx_uint8_t data[0];
} SerialReqPacket;
nx_uint16_t nodeid;
};
- uint8_t imgNum2volumeId[] = {
- VOLUME_GOLDENIMAGE,
- VOLUME_DELUGE1,
- VOLUME_DELUGE2,
- VOLUME_DELUGE3
- };
-
void sendReply(error_t error, storage_len_t len)
{
SerialReplyPacket *reply = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket));
}
// Converts the image number that the user wants to the real image number
- imgNum = imgNum2volumeId[request->imgNum];
+ imgNum = imgNum2volumeId(request->imgNum);
- if (imgNum != 0xFF) {
+ if (imgNum != NON_DELUGE_VOLUME) {
error = SUCCESS;
// We ask for a reservation only for erase and write.
switch (request->cmd) {
case CMD_ERASE:
case CMD_WRITE:
- if (!call Resource.isOwner[imgNum]()) {
- error = call Resource.immediateRequest[imgNum]();
+ if (!call Resource.isOwner()) {
+ error = call Resource.immediateRequest();
}
}
if (error == SUCCESS) {
switch (request->cmd) {
case CMD_ERASE: // === Erases a volume ===
state = S_ERASE;
+#if defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) || defined(PLATFORM_EPIC)
+ error = FAIL;
+#else
error = call BlockWrite.erase[imgNum]();
+#endif
break;
case CMD_WRITE: // === Writes to a volume ===
state = S_WRITE;
event void TimeoutTimer.fired()
{
// Release the resource.
- if (state == S_IDLE && call Resource.isOwner[currentImgNum]()) {
- call Leds.led1Off();
- call Resource.release[currentImgNum]();
+ if (state == S_IDLE && call Resource.isOwner()) {
+ call Resource.release();
}
- if (state == S_IDLE && !call ArbiterInfo.inUse()) {
+ if (state == S_IDLE) {
call Leds.led1Off();
}
}
event void SerialAMSender.sendDone(message_t* msg, error_t error) {}
- event void Resource.granted[uint8_t imgNum]() {}
+ event void Resource.granted() {}
default command error_t BlockWrite.write[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; }
default command error_t BlockWrite.erase[uint8_t imgNum]() { return FAIL; }
default command error_t BlockRead.read[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; }
default command error_t BlockRead.computeCrc[uint8_t imgNum](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; }
- default async command error_t Resource.immediateRequest[uint8_t imgNum]() { return FAIL; }
- default async command error_t Resource.release[uint8_t imgNum]() { return FAIL; }
- default async command bool Resource.isOwner[uint8_t imgNum]() { return FAIL; }
+ default async command error_t Resource.immediateRequest() { return FAIL; }
+ default async command error_t Resource.release() { return FAIL; }
+ default async command bool Resource.isOwner() { return FAIL; }
}