]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/net/Deluge/extra/NetProgM.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / net / Deluge / extra / NetProgM.nc
index 478bad262cde8339f8da0ba8e4d749db98265993..fc054cff8fc0f13e00d657a1ca6da95241129eff 100644 (file)
@@ -40,26 +40,32 @@ module NetProgM {
     interface InternalFlash as IFlash;
     interface Crc;
     interface Leds;
+#if !defined(PLATFORM_TINYNODE)
     interface CC2420Config;
+#endif
     async command void setAmAddress(am_addr_t a);
+    interface ReprogramGuard;
   }
 }
 
 implementation {
 
+  uint32_t reprogramImgAddr;
+
   command error_t Init.init()
   {
     BootArgs bootArgs;
-    call IFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs));
+    call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs));
 
     // Update the local node ID
     if (bootArgs.address != 0xFFFF) {
       TOS_NODE_ID = bootArgs.address;
       call setAmAddress(bootArgs.address);
     }
+#if !defined(PLATFORM_TINYNODE)
     call CC2420Config.setShortAddr(bootArgs.address);
     call CC2420Config.sync();
-    
+#endif    
     return SUCCESS;
   }
   
@@ -68,11 +74,11 @@ implementation {
     BootArgs bootArgs;
 
     atomic {
-      call IFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs));
+      call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs));
 
       if (bootArgs.address != TOS_NODE_ID) {
        bootArgs.address = TOS_NODE_ID;
-       call IFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs));
+       call IFlash.write(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs));
       }
       netprog_reboot();
     }
@@ -81,27 +87,36 @@ implementation {
   }
   
   command error_t NetProg.programImageAndReboot(uint32_t imgAddr)
+  {
+    reprogramImgAddr = imgAddr;
+    return call ReprogramGuard.okToProgram();
+  }
+
+  event void ReprogramGuard.okToProgramDone(bool ok)
   {
     BootArgs bootArgs;
 
+    if (!ok) {
+      // The voltage is too low. Nothing to do.
+      return;
+    }
+
     atomic {
-      call IFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs));
+      call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs));
       
-      bootArgs.imageAddr = imgAddr;
+      bootArgs.imageAddr = reprogramImgAddr;
       bootArgs.gestureCount = 0xff;
       bootArgs.noReprogram = FALSE;
       bootArgs.address = TOS_NODE_ID;
 
-      call IFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs));
+      call IFlash.write(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs));
 
       // reboot
       netprog_reboot();
     }
-
-    // couldn't reboot
-    return FAIL;
   }
 
+#if !defined(PLATFORM_TINYNODE)
   event void CC2420Config.syncDone(error_t error) {}
-
+#endif
 }