-
• #2
Thanks - yes, it looks like there's some issue with Espruino there. It's a strange one as I added it in 2v22 and was pretty sure it was working at that point (but then I wasn't working on getters). I just filed an issue in https://github.com/espruino/Espruino/issÂues/2517
I feel like having a getter to handle this is probably overkill though?
You could have a static propery like
GP8403.CH1="CH1";
and so on, and then:const channels = { CH0: data_for_ch, CH1: data_for_ch ]; if (!channels[channel]) throw new Exception("Invalid channel");
I think that's what you were saying? The JS classes are effectively just shorthand for writing out object oriented JS as functions, so if you do want static fields and want to target existing firmwares before I have fixed the issue, you can fix and match - so:
class GP8403 { // ... }; // static fields GP8403.CH1="CH1"; // export exports.GP8403 = GP8403;
should all work ok?
-
• #3
Just fixed - turns out if you add the
static
vars after the constructor it's fine.... but I'd still do as I said above and it'll work in 2v21 and earlier
-
• #4
Thanks!
Using a string is even simpler, I was kind of hang up on "what number should represent the selected channel".
A static var just feels slightly nicer looking than adding it after the class declaration.But now the Espruino IDE doesn't like that (see the picture)
1 Attachment
-
• #5
I think it must be a reasonably new addition to the language - why it wasn't in Espruino before.
And Acorn/Tern/JSLint in the IDE are old enough that they don't support it either - so I guess they need updating at some point as well.
Looks like static properties in classes are not supported?
In a browser
Foo.CH0
returns0xdeadbeef
as expected.In Espruino
Foo.CH0
returnsundefined
. No error either, so it's parsed, but ignored / lost somewhere? It's not on the instance if you create a new instance of the class either.Why I want to do this? I'm writing a driver for a dual DAC, and while playing around, I found it's sort of easy to mix up the voltage and channel. Like
dac.setVoltage(0, 1)
, ordac.setVoltage(1, 0)
sets channel one to zero volts? And since this DAC (GP8403) has a feature of setting both channels at the same time, thechannel
parameter has 3 valid values.So I was thinking about some magic values as constants, that would be outside the allowed voltage range. something like
dac.setVoltage(0, GP8403.CH1)
, and ifGP8403.CH1
is outside of the 0..10V range, I can throw on invalid input, and any bug should be caught early. I know, might be overly defensive...Non-static getter does work. So
dac.setVoltage(0, dac.CH1)
works just fine.And of course I could define a constant, and export that as well from my module. But this approach doesn't feel really nice I guess. Or am I missing something?
So, what would you recommend? Am I overthinking this?