Ahh, ok - that's tricky. I didn't realise it was Espruino WiFi.
The Espruino WiFi is a bit oddball in that it only has one page for storage - a 64kB one - so there are no 'unused' pages it can free. If it can't get the contents of that page temporarily into RAM then it can't compact it.
If you try:
var s = require("Storage");
s.list().forEach(fn=>print(fn,s.read(fn).length));
It should show you roughly how much space is needed for each file. My guess would be that ".varimg" is using by far the most.
By default it'll try storing the data that's needed on the stack, but that's probably only around 10k or so, and I bet .varimg is more than that.
What you could try doing is:
function tryCompact() {
var s = require("Storage");
var x = E.toString(s.read(".varimg"));
if (x===undefined) throw new Error("Not enough RAM for varimg");
s.erase(".varimg");
s.compact();
s.write(".varimg",x);
}
Which will try and allocate space for .varimg as a JS variable (rather than on the stack), will then remove it from storage, compact, then write it back. That might work?
Otherwise .varimg is an image of what is in RAM when you save, so another slightly scarier option is to do:
s.erase(".varimg");
s.compact();
save(); // but this will then reboot the Espruino WiFi
But hopefully you should only ever have to do this when the WiFi board runs out of storage.
Or... It looks like you're basically dynamically loading JS code? If that's the case then you probably don't need to use save() at all - you probably want to use the save to flash option in the IDE to save just a simple 'bootloader' that searches for init/etc and runs them in sequence?
If you did that then you wouldn't need a .varimg file, and chances are compacting would go fine.
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
Ahh, ok - that's tricky. I didn't realise it was Espruino WiFi.
The Espruino WiFi is a bit oddball in that it only has one page for storage - a 64kB one - so there are no 'unused' pages it can free. If it can't get the contents of that page temporarily into RAM then it can't compact it.
If you try:
It should show you roughly how much space is needed for each file. My guess would be that
".varimg"
is using by far the most.By default it'll try storing the data that's needed on the stack, but that's probably only around 10k or so, and I bet
.varimg
is more than that.What you could try doing is:
Which will try and allocate space for
.varimg
as a JS variable (rather than on the stack), will then remove it from storage, compact, then write it back. That might work?Otherwise
.varimg
is an image of what is in RAM when you save, so another slightly scarier option is to do:But hopefully you should only ever have to do this when the WiFi board runs out of storage.
Or... It looks like you're basically dynamically loading JS code? If that's the case then you probably don't need to use
save()
at all - you probably want to use thesave to flash
option in the IDE to save just a simple 'bootloader' that searches forinit
/etc and runs them in sequence?If you did that then you wouldn't need a
.varimg
file, and chances are compacting would go fine.