-
Gordon, many thanks for the feedback and a useful link to NRF errata!
Installed v2.09, now the code above does not crash and gives 5 rises - perhaps, that's binary 31 as you assume.Yes, that's right - you can probably change it by manually calling pinMode, but by default setWatch would change the pin state to an input.
On v2.08 pinMode change did not work. But on v2.09 LED lits normally after setWatch :) Watch is not raised.
-
Hi! I've got a problem & solution (took me several days to find it.. phew!..).
I set watch to rising (or falling) D31 and try to lit a neopixel on D2. And Puck (v2.08) hangs..setWatch(()=>{console.log('D31 rises!');}, D31, {edge: 'rising', repeat:true}); //D30 here will cure the issue require("neopixel").write(D2, [100,100,100,100,100,100]);
If I set e.g. D30 instead of D31, all's ok. The issue is same on a new Puck without any connection to neopixel, one can try the code out of the box. Would be grateful for a comment:
- Is there any constraints on pins when using neopixels?
- Just to confirm - if I e.g. set watch to LED and then try to lit it, it does not lit. That's probably because a watch blocks output pinMode, right?
- Is there any constraints on pins when using neopixels?
-
Hi! Cool, Gordon, thanks for the comment. In my case the selftest is run when I set watch with reset() to BTN:
setWatch(function() { LED1.write(1); reset(); }, BTN, {edge:"rising", debounce:50, repeat:true});
When I press BTN for the first time after powering Puck on, the selftest is run (I see all leds lit up and then this message from the topic, then red led blinking). If I further upload and press without powering off, the selftest is not run.
-
Many thanks, Robin! Appreciated your explanation of way to search! Your GitHub link shows that at initial selftest it sets pins to 1 & pullup and checks whether state persists afterwards. In my case the pin returns 0, what causes the error.
Thanks for other questions, ground is common for all elements, Puck is connected through a level shifter (just for a case, a M74VHC1GT125DT1G with grounded control input) and I power a strip with 40 leds via a booster module on MHCD42. All are powered from a Li-Ion, through a 3v regulator (XC6206P302MR) to Puck.
BTW, at initial state the MHCD42 is turned off, so the level shifter is not powered. But I get the error even when I reset on working MHCD42, when the selftest is performed on working level shifter.. And the story is that I see the error only once per 5-10 resets..
Anyway, thanks to @Robin the error logic is clear now, if I find its reason, will revert.
-
Hi All,
Sometimes I get a message on Puck v1 (firmware v2.08) after performing reset(): "Pin D2 forced low. Pin D2 shorted low. Error code 12". Pin D2 controls a neopixel led strip (WS2813, works fine), not grounded. Could not find any reference, neither error codes list. What does that message mean, please? -
-
Many thanks, Robin! However, seems that this correctly references the instance, also supported by stackoverflow answer:
Arrow functions do not have a this value of its own, when you access it, you are accessing the this value of the enclosing lexical scope.
We can see if we print it out:
function aClass(id) { this.id = id; } aClass.prototype.testEmit = function() { setTimeout(()=>{console.log('This is ', this); this.emit('TestEvent')}, 1000); }; var a = new aClass('a'); a.on('TestEvent', ()=>console.log('a emitted')); a.testEmit(); // get 'This is aClass {id = a...}' and the event is caught with 'a emitted' var a1 = new aClass('a1'); a1.on('TestEvent', ()=>console.log('a1 emitted')); a1.testEmit(); // get 'This is aClass {id = a1...}' and the event is caught with 'a1 emitted'
By contrast, if we replace arrow function in L6 with function(), this will reference the global object, which does not have emit(), and code crashes.
setTimeout(function(){console.log('This is ', this); this.emit('TestEvent')}, 1000); //crashes
To summarize for reference, this can be used, but should be cautious when calling setTimeout:
function aClass() {} aClass.prototype.testEmit = function() { this.emit('TestEvent'); }; var a = new aClass(); var a1 = new aClass(); a.on('TestEvent', ()=>console.log('a emitted')); a1.on('TestEvent', ()=>console.log('a1 emitted')); setTimeout(a.testEmit.bind(a), 500); // can use, get printed 'a emitted' setTimeout(()=>a1.testEmit(), 1000); // can use, get printed 'a1 emitted' setTimeout(a.testEmit, 1500); //crashes, as *this* in testEmit definition references global object, not a
-
Hm.. For whatever reason, it works now.. I'm a bit embarrassed.. Just for reference, code is here:
function aClass() {}; aClass.prototype.testEmit = function() { setTimeout(()=>this.emit('TestEvent'), 1000); } var a = new aClass(); a.on('TestEvent', ()=>console.log('Got event')); a.testEmit(); // get 'Got event' printed in log var a1 = new aClass(); a1.testEmit(); // event here is not caught
-
Hi Everyone! On Puck I try to organize communication between objects with events (see Object.emit and discussion here). However, I cannot emit an event within a prototype function with 'this'. Thus if e.g. I have two step up modules, I cannot subscribe directly to each of them, and need to add either a module id as an event argument or additional empty object (see below).
In comments here is what I'd want:
function aClass() {}; aClass.prototype.testEmit = function() { setTimeout(()=>aClass.emit('TestEvent'), 1000); //this.emit(...) here will not emit! } var a = new aClass(); aClass.on('TestEvent', ()=>console.log('Got event')); //would like 'a.on(...)' a.testEmit(); // get 'Got event' printed in log var a1 = new aClass(); a1.testEmit(); // get another 'Got event' printed in log
Here is a way round with an empty object:
function aClass() { this.emitter = {}; }; aClass.prototype.testEmit = function() { setTimeout(()=>this.emitter.emit('TestEvent'), 1000); //now it works } var a = new aClass(); a.emitter.on('TestEvent', ()=>console.log('Got event')); //now we subscribe only to a a.testEmit(); //get 'Got event' in console var a1 = new aClass(); a1.testEmit(); //get nothing
Why can't I use this.emit(...)?
-
-
-
Hi Everyone,
Trying to debug using debugger. But if I run the function from the right-hand IDE side, it does nothing. While if testDebugger() is called then from the left-hand IDE side, it works. Can I make it working in both cases? Thanks!function testDebugger() {debugger;} testDebugger(); //does nothing
Ha! Cool, thanks!