X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Fnet%2FDeluge%2Fextra%2FNetProgM.nc;h=fc054cff8fc0f13e00d657a1ca6da95241129eff;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=478bad262cde8339f8da0ba8e4d749db98265993;hpb=58ade51c5d838097ffb691a7da6e72f1439cdf32;p=tinyos-2.x.git diff --git a/tos/lib/net/Deluge/extra/NetProgM.nc b/tos/lib/net/Deluge/extra/NetProgM.nc index 478bad26..fc054cff 100644 --- a/tos/lib/net/Deluge/extra/NetProgM.nc +++ b/tos/lib/net/Deluge/extra/NetProgM.nc @@ -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 }