-
• #3
http://forum.espruino.com/conversations/279700/?offset=25#comment12891564
Also, depending on what sort of storage is appropriate, an eeprom (ex AT24 series) could be used.
-
• #4
The
File
class won't be available on ESP8266 as there's no filesystem library built in.By far the easiest (IMO) for small amounts of data would be to just use this library: http://www.espruino.com/FlashEEPROM
For it to 'just work' you'd either want a 'cutting edge' ESP8266 build (so newer than 1v85), or you can hard-code the start address with:
var f = new (require("FlashEEPROM"))(0x076000);
-
• #5
What size "files" are you looking to store?
You can used the flash module.
-
• #6
I just want to store some
ESSID
,password
and a 16-bit-counter. So it might be considered as a "small storage necessity".I think
FlashEEPROM
will suffice my needs. I'll test and post a feedback. -
• #7
The wifi lbrary
wifi.save()
saves EESID and password for you already!
So it might just be the 16 bit counter...the Flasheprom module stores with indexes, it might be over complicated for your needs - the flash module might be enough!
-
• #8
I am totally sure that I tried above
...require("FlashEEPROM")...
code a few hours ago and it returned an object, but now it fails with following error message:_____ _ | __|___ ___ ___ _ _|_|___ ___ | __|_ -| . | _| | | | | . | |_____|___| _|_| |___|_|_|_|___| |_| http://espruino.com 1v85 Copyright 2016 G.Williams Espruino is Open Source. Our work is supported only by sales of official boards and donations: http://espruino.com/Donate Flash map 512KB:256/256, manuf 0xe0 chip 0x4014 >require("FlashEEPROM") WARNING: Module "FlashEEPROM" not found =undefined >
-
• #9
@Wilberforce I need to store ESSID and password except from default ones. I will hardcode a default ESSID+password and save an additional one. If new ESSID+password fails long enough, I will fallback to the default one. That's why I need some other place to store these values.
Anyway, there is only
Flash
module seems to work. I'll follow this document and write some simple driver functions. I'll get back to you. -
• #11
To add to this: Just typing
require("FlashEEPROM")
on the left hand side will never work.You need to use it on the right-hand side and click upload - then the Web IDE gets a chance to scan your code, see what modules are needed, and load them up automatically.
It's worth reading
I've pasted code into the left-hand side of the Web IDE and it doesn't work
on the Troubleshooting page at: http://www.espruino.com/Troubleshooting -
• #12
@Gordon Now I understand better. I'm still trying to understand the working mechanism of Espruino, but clearly I didn't yet.
The fact is, I'm not using the Web IDE. I have built a toolset (and will publish when ready for daily usage) where the main purpose is to use Livescript transparently. So I may manually download FlashEEPROM module.
-
• #13
I would suggest using the web ide and get things working, and then move to your setup will be the quicker path!
The web idea is very interactive and allows quick prototyping.
-
• #14
Yeah, that'll be your problem then ;) Some modules are built in, but all the others are loaded on demand.
There's are some tweaks that go on in the background when uploading to avoid some nasty edge cases.
You could look at https://github.com/espruino/EspruinoTools (on NPM as https://www.npmjs.com/package/espruino) - this is a command-line (and library) version of the same code.
You could bodge something up very easily that ran Livescript over your code and uploaded it with EspruinoTools.
Or you could modify the Web IDE from https://github.com/espruino/EspruinoWebIDE. If there's a web service that converted LiveScript to JavaScript it'd be trivial to write a plugin like this that took the code and converted it just before uploading.
-
• #15
@ceremcem, you could put a set of SSIDs and Passwords into a module that is then uploaded to the board when uploading the application code to the board happens. See some details in this post. To make that happen, you place the modules into the modules folder in your sandbox (IDE configurable directory structure).
-
• #16
It seems a little bit diverged, but not at all: Could you please take a look at this problem because I guess this is the only problem left. If I can make a bundle by myself, I can use
FlashEEPROM
module.PS: I'm dealing with this problem since I'm not able to use EspruinoWebIDE right now.
-
• #17
@ceremcem, in mentioned post I cover amost to the T what you are looking for: a module that defines a class with method(s) to use JavaScript in an object-oriented way rather than script way: the first -
something()
function defines the class, and thehello()
function a method on the instances of something - instances crated withnew something(...)
, as you state on stackoverflow post. Btw - for the sake of useful convention(s), class names start with a capital letter... ;-).The solution can happen even in one file or even in two files. Let's look at each option in a separate post.
-
• #18
FIRST Option: Single Module File
Create a module - js file - with the following content:
// Something.js in .../modules folder of IDE Settings-PROJECT var Something = function(name) { this.name = name; }; Something.prototype.sayHello = function() { console.log("Hello, my name is " + this.name + "!"); }; exports = Something;
To use the Something module, enter following code into edit pane of Espruino Web IDE, upload it, and then press BTN (equal to BTN1):
var Something = require("Something"); // pull in class w/ require module var thisThing = new Something("ThisThing"); // create a 1st instance of class var thatThing = new Something("ThatThing"); // create a 2nd instance of class setWatch(function() { thisThing.sayHello(); // make 1st instance say hello... }, BTN1, { repeat:true, edge:"rising", debounce:50}); // ...on button press setWatch(function(){ thatThing.sayHello(); // make 2nd instance say hello... }, BTN1, { repeat:true, edge:"falling", debounce:50}); // ...on button release
An almost perfect example you find developed in this conversation:
Software Buttons - Many buttons from just one hardware button. @Gordon made even a change to the export part of the Espruino firmware to accommodate this approach in a straight forward way, which you find in this conversation: How to create a module that is a 'Class' - aka a function usable with new - or: How to make require() return a function and not an object. -
• #19
@allObjects Thank you, here I could achieve the solution:
# create bundle BUNDLE="init.min.js" echo "" > ${BUNDLE} # Register modules via `Modules.addCached()` method # see: http://forum.espruino.com/comments/12899741/ MODULE_NAME="FlashEEPROM" MODULE_STR=$(uglifyjs -c -m -- ${MODULE_NAME}.js | sed 's/\"/\\\"/g' | sed "s/\n//g") echo "Modules.addCached(\"${MODULE_NAME}\", \"${MODULE_STR}\");" >> ${BUNDLE} uglifyjs -c -m -- init.js >> ${BUNDLE}
Now I can
require("FlashEEPROM")
as expected. -
• #21
Yes, the context is BASH shell. I'm familiar with BASH more than Javascript in such jobs.
I don't know, I feel really lost while going after being able to use
FlashEEPROM
module :) -
• #23
SECOND Option: Multiple, Nested Module Files
Create the following Something_Class.js and Something_methods.js files in the sandbox modules folder. As you notice, the class file uses the methods file and *'mixes' its properties - methods - into the prototype (added a
sayGoodbye()
as a second method to show how mixing in of multiple methods multiple is achieved).// Something_Class.js in .../modules folder of IDE Settings-PROJECT var Something = function(name) { this.name = name; }; var methods = require("Something_methods"); for (var methodName in methods) // mix separately defined methods into... Something.prototype[methodName] = methods[methodName]; // ...prototype exports = Something;
// Something_methods.js in .../modules folder of IDE Settings-PROJECT exports = { sayHello: function() { console.log("Hello, my name is " + this.name + "!"); } , sayGoodbye: function() { console.log("Bye-bye from " + this.name + "!"); } };
Usage is only slightly different: Instead of pulling Something module, you pull Something_Class module, but you still pull only one module...:
var Something = require("Something_Class"); // pull in class w/ require module var thisThing = new Something("ThisThing"); // create a 1st instance of class var thatThing = new Something("ThatThing"); // create a 2nd instance of class setWatch(function() { thisThing.sayHello(); // make 1st instance say hello... }, BTN1, { repeat:true, edge:"rising", debounce:50}); // ...on button press setWatch(function(){ thatThing.sayHello(); // make 2nd instance say hello... }, BTN1, { repeat:true, edge:"falling", debounce:50}); // ...on button release setTimeout(function(){ thisThing.sayGoodbye(); }, 45000); setTimeout(function(){ thatThing.sayGoodbye(); }, 60000);
mixin - mixing the properties of one Javascript object into another one is a very Javascript typical pattern... that shows Javascripts extreme dynamic properties, and - neither last nor least - one that give Javascript almost the power of the Interfaces w/ Implementations pattern found in Java. (A class that implements multiple interfaces mixes multiple sets of methods into a new class definition, which can also be defined by a 'mixed in' constructor using a helper construct.)
-
• #25
Thank you all for everything, the problem has been solved. Here are the results:
configFile = null; configInit = function(){ if (configFile === null) { configFile = getFile(); } }; configWrite = function(index, value){ configInit(); configFile.write(index, value); }; configRead = function(index){ configInit(); return E.toString(configFile.read(index)); };
Usage:
>configWrite(0, "hello") =undefined >configWrite(1, "world") =undefined >configRead(0) ="hello" >configRead(1) ="world" >
There is no "fs" module built in stock ESP port. How can I save some data in runtime?