[JS/Node.JS]

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Hoi allen,

nog steeds bezig met mij raspberry systeem. Eerder had ik al een vraag gesteld over PHP, dit is javascript/node.js gerelateerd, dus een nieuw topic lijkt mij wel zo handig. Met wat tutorials, examples en dergelijke ben ik best een eind gekomen, maar onderstaande kan ik niet vinden. Ook op het forum word ik niet wijzer.
Een van de examples is de npm pigpio library.

Ik ben aan het stoeien met sockets en dergelijke, vandaar ook node.js. GPIO acties moeten z.s.m. doorgestuurd worden naar de browser. An sich gaat dat redelijk, ware het niet dat alles via 1 actie doorgestuurd wordt op dezelfde plaats in het array. Deze plaats is wel te wijzigen, maar jullie snappen wel dat ik niet wil dat meerdere drukknoppen op 1 plaats in het array uitgelezen worden, maar gewoon allemaal een eigen plaatsje krijgen.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
const Gpio = require('pigpio').Gpio;

const gpioInputPins  = [0,  1,  2,  3,  4,  5,  6,  7];
const gpioOutputPins = [8,  9, 10, 11, 12, 13, 14, 15];

var gpioInputs  = [];
var gpioOutputs = [];

gpioInputPins.map(function (value, key) {
    gpioInputs[key] = new Gpio(26, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });
    gpioInputs[key].on('interrupt', function (level) {
        if (level == 0) {
            inputs[key] = false;
        } else {
            inputs[key] = true;
        }
        inputsSocket.emit('state', inputs);
    });
    gpioInputs[key] = new Gpio(19, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });
    gpioInputs[key].on('interrupt', function (level) {
        if (level == 0) {
            inputs[key] = false;
        } else {
            inputs[key] = true;
        }
        inputsSocket.emit('state', inputs);
    });
});

Probleem is dus: hij gooit alles op de 8e locatie van gpioInputPins. Maak ik hem 6 lang, dan komen beide op de 6e plaats en maak ik hem 1 lang, dan komt alles op de eerste plaats. Halverwege, tussen de twee gpio uitleesacties in, een key--; statement zetten heeft als resultaat dat allebei de resultaten op een andere plek komen. Beide schuiven dan 1 naar links in het array op. gpioInputs[key-1]... heeft geen effect.

Het zit dus ergens in de key, maar ik kan niet vinden waarin.

Alle reacties


Acties:
  • +1 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Op regel 10 en op regel 23 genereer je twee Gpio's voor dezelfde key. Die gaan hun output daarom wegschrijven in dezelfde inputs[key]. Als je op regel 23 een key-- zet, en regel 17 wordt aangeroepen, dan werkt hij met de nieuwe waarde van key. Als je dat wilt voorkomen dan moet je de functie van regel 15 in een andere scope zetten (zie bv hier). In dit kleine voorbeeld is het wellicht makkelijker om twee input arrays te hebben.

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Hmmm, klinkt ergens wel logisch. Wat ik mij dan alleen afvraag, waarom pakt hij de hoogste waarde van het array? Als ik in C bezig ben en een hulpinteger aan maak, is die overal de waarde die ik hem geef. Als ik i++ doe, zijn alle hierna uitgelezen stappen dus die i+1. Dat leek hier niet op te gaan. Tussen 22 en 23 heeft nog een regel gestaan met key-- en beide gingen naar die key-- toe.
GlowMouse schreef op dinsdag 12 januari 2016 @ 18:18:
In dit kleine voorbeeld is het wellicht makkelijker om twee input arrays te hebben.
Klein beginnen hè ;) Als het met 2 al niet lukt, dan lukt het met 10 ook niet. Uiteindelijk moet er meer in. Én die arrays moeten ook weer ergens (de pagina waar de verbinding middels een socket mee staat) ook weer worden uitgelezen.

[ Voor 5% gewijzigd door Pizza_Boom op 13-01-2016 00:28 ]


Acties:
  • +1 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Pizza_Boom schreef op woensdag 13 januari 2016 @ 00:22:
Als ik in C bezig ben en een hulpinteger aan maak, is die overal de waarde die ik hem geef. Als ik i++ doe, zijn alle hierna uitgelezen stappen dus die i+1.
Als je in C een paar regels terugspringt door een loop dan werk je ook op eerdere regelnummers met de waarde i+1. Hier net zo: je past key aan, en pas daarna wordt regel 17/19 aangeroepen.
Pizza_Boom schreef op woensdag 13 januari 2016 @ 00:22:
Als ik i++ doe, zijn alle hierna uitgelezen stappen dus die i+1. Dat leek hier niet op te gaan. Tussen 22 en 23 heeft nog een regel gestaan met key-- en beide gingen naar die key-- toe.
Heb je mijn link wel aangeklikt?

[ Voor 13% gewijzigd door GlowMouse op 13-01-2016 00:36 ]


Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
GlowMouse schreef op woensdag 13 januari 2016 @ 00:36:
Als je in C een paar regels terugspringt door een loop dan werk je ook op eerdere regelnummers met de waarde i+1. Hier net zo: je past key aan, en pas daarna wordt regel 17/19 aangeroepen.
Ik heb het vandaag even ingevoerd:
[key--] levert errors op. De error komt telkens in regel 28, en of ik [key--] invoer in 23 of 23 en 28, dat maakt niet uit.
code:
1
ErrorType: Cannot read property 'on' of undefined

Hij vindt het dus niet leuk.
Heb je mijn link wel aangeklikt?
Ja, inmiddels voor de 3e keer... Hoop informatie.

EDIT
GlowMouse schreef op dinsdag 12 januari 2016 @ 18:18:
In dit kleine voorbeeld is het wellicht makkelijker om twee input arrays te hebben.
Vooralsnog werkt dit overigens wel:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const Gpio = require('pigpio').Gpio;

const gpioInputPins1  = [0,  1,  2,  3,  4,  5,  6,  7];
const gpioOutputPins = [8,  9, 10, 11, 12, 13, 14, 15];

var gpioInputs  = [];
var gpioOutputs = [];

gpioInputPins1.map(function (value, key) {
    gpioInputs[key] = new Gpio(26, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });
    gpioInputs[key].on('interrupt', function (level) {
        if (level == 0) {
            inputs[key] = false;
        } else {
            inputs[key] = true;
        }
        inputsSocket.emit('state', inputs);
    });
 });

const gpioInputPins2  = [0,  1,  2,  3,  4,  5];

gpioInputPins2.map(function (value, key) {
    gpioInputs[key] = new Gpio(19, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });
    gpioInputs[key].on('interrupt', function (level) {
        if (level == 0) {
            inputs[key] = false;
        } else {
            inputs[key] = true;
        }
        inputsSocket.emit('state', inputs);
    });
});

Ik krijg haast het gevoel dat ik met de verkeerde pointer bezig ben en dat [key] niet de aanwijzende/selecterende functie heeft die ik denk dat hij heeft. :X

[ Voor 54% gewijzigd door Pizza_Boom op 13-01-2016 23:32 ]


Acties:
  • +1 Henk 'm!

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 20:45
Op regel 10 in je 1e snippet maak je een nieuwe Gpio object aan op gpioInputs[key]. Op regel 15 voeg je een event handler toe voor de interrupt event aan die zojuist aangemaakte Gpio object. Binnen de handler wil je key gebruiken, echter: de verwijzing naar 'key' is nog steeds naar de scope van de map. Op moment dat de handler wordt aangeroepen, is de verwijzing key dus naar de key van de laatste iteratie in de map.

Oplossing is dus een closure gebruiken, zie De Mozilla Developer Network.

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
kutagh schreef op woensdag 13 januari 2016 @ 12:57:
Op regel 10 in je 1e snippet maak je een nieuwe Gpio object aan op gpioInputs[key]. Op regel 15 voeg je een event handler toe voor de interrupt event aan die zojuist aangemaakte Gpio object. Binnen de handler wil je key gebruiken, echter: de verwijzing naar 'key' is nog steeds naar de scope van de map. Op moment dat de handler wordt aangeroepen, is de verwijzing key dus naar de key van de laatste iteratie in de map.

Oplossing is dus een closure gebruiken, zie De Mozilla Developer Network.
Hmmm, ja. Dus als ik het goed begrijp, moet ik nu ook code eruit gaan halen zodat deze zelfstandig aangeroepen wordt. En dat moet dan de functie bij regel 10 zijn?

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const Gpio = require('pigpio').Gpio;

function gpiohelper(gpioInputPins){
return function() {
new Gpio(26, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });
};
}

const gpioInputPins1  = [0,  1,  2,  3,  4,  5,  6,  7];
const gpioOutputPins = [8,  9, 10, 11, 12, 13, 14, 15];

var gpioInputs  = [];
var gpioOutputs = [];

gpioInputPins1.map(function (value, key) {
    gpioInputs[key] = gpiohelper (item.gpioInputPins);

    gpioInputs[key].on('interrupt', function (level) {
        if (level == 0) {
            inputs[key] = false;
        } else {
            inputs[key] = true;
        }
        inputsSocket.emit('state', inputs);
    });
 });

Opvallend, want ik had juist verwacht dat die interrupt handler dan eruit gehaald zou worden.

Acties:
  • +1 Henk 'm!

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 20:45
Jammer, net verkeerd begrepen: Het is inderdaad die interrupt handler ;)

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Hmmm, vanaf waar is dan de vraag. Meteen helemaal of ergens het statement knippen? Ik denk dat je krijgt:
code:
1
gpioInputs[key].on('interrupt', gpiohelper);

Maar ik weet niet zeker of dat correct is.

Acties:
  • +1 Henk 'm!

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 20:45
Bijna correct. Je wilt niet je closure als functie handler meegeven, maar de closure uitvoeren (door gpiohelper(key) te schrijven). Echter, ik besef me net, de map functie hoort in principe al een closure te zijn en dan zou dit dus niet nodig moeten zijn.

Wat betreft debugging, wat heb je zelf al geprobeerd? Je noemt de foutmelding met betrekking tot property 'on' op undefined, heb je al geprobeerd te controleren wat de inhoud van gpioInputs is?

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Hoe bedoel je precies "op inhoud gecontroleerd", hij is toch leeg gedeclareerd als var? [/JSnoobmodus] :+ 8)7

Qua debugging, de Raspberry heeft atm niet echt heel veel mogelijkheden. Als er een fout in de code zit, weigert de module stomweg om hem op te starten, dus debuggen via FF/Chrome lukt ook niet. Wat betreft foutmeldingen, dit krijg ik:
Afbeeldingslocatie: http://i.imgur.com/71PykDIl.png
Waarbij regel 125:22 refereert naar het .on gedeelte wat in snippet2 op regel 33 staat. Object. <anonymous> 119:26 refereert naar regel 27 van snippet 2, maar dan het .map deel (locatie 16 is de m van map). De rest van die onderdelen zijn standaard files van de nodeJS en diverse NPM modules die gebruikt worden. Aangezien het zonder [key--] wel werkt, durf ik met zekerheid te zeggen dat de fout niet in die modules zit.

De npm-debug.log file waar naar verwezen wordt, bevat de volgende regels:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
0 info it worked if it ends with ok
1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'start' ]
2 info using npm@3.3.12
3 info using node@v5.3.0
4 verbose run-script [ 'prestart', 'start', 'poststart' ]
5 info lifecycle pigpio2html@1.0.0~prestart: pigpio2html@1.0.0
6 silly lifecycle pigpio2html@1.0.0~prestart: no script for prestart, continuing
7 info lifecycle pigpio2html@1.0.0~start: pigpio2html@1.0.0
8 verbose lifecycle pigpio2html@1.0.0~start: unsafe-perm in lifecycle true
9 verbose lifecycle pigpio2html@1.0.0~start: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/home/pi/pigpio2html/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
10 verbose lifecycle pigpio2html@1.0.0~start: CWD: /home/pi/pigpio2html
11 silly lifecycle pigpio2html@1.0.0~start: Args: [ '-c', 'node index.js' ]
12 silly lifecycle pigpio2html@1.0.0~start: Returned: code: 1  signal: null
13 info lifecycle pigpio2html@1.0.0~start: Failed to exec start script
14 verbose stack Error: pigpio2html@1.0.0 start: `node index.js`
14 verbose stack Exit status 1
14 verbose stack     at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:232:16)
14 verbose stack     at emitTwo (events.js:87:13)
14 verbose stack     at EventEmitter.emit (events.js:172:7)
14 verbose stack     at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14)
14 verbose stack     at emitTwo (events.js:87:13)
14 verbose stack     at ChildProcess.emit (events.js:172:7)
14 verbose stack     at maybeClose (internal/child_process.js:818:16)
14 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
15 verbose pkgid pigpio2html@1.0.0
16 verbose cwd /home/pi/pigpio2html
17 error Linux 4.1.13+
18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "start"
19 error node v5.3.0
20 error npm  v3.3.12
21 error code ELIFECYCLE
22 error pigpio2html@1.0.0 start: `node index.js`
22 error Exit status 1
23 error Failed at the pigpio2html@1.0.0 start script 'node index.js'.
23 error Make sure you have the latest version of node.js and npm installed.
23 error If you do, this is most likely a problem with the pigpio2html package,
23 error not with npm itself.
23 error Tell the author that this fails on your system:
23 error     node index.js
23 error You can get their info via:
23 error     npm owner ls pigpio2html
23 error There is likely additional logging output above.
24 verbose exit [ 1, true ]

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
kutagh schreef op woensdag 13 januari 2016 @ 21:07:
Bijna correct. Je wilt niet je closure als functie handler meegeven, maar de closure uitvoeren (door gpiohelper(key) te schrijven). Echter, ik besef me net, de map functie hoort in principe al een closure te zijn en dan zou dit dus niet nodig moeten zijn.
Hmmm, misschien dat dit het is? Ik had net een wellicht geniale ingeving. :P :D Ik heb alle keren key vermaakt tot het getal waar ik hem wil hebben:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const Gpio = require('pigpio').Gpio;

const gpioInputPins1  = [0,  1,  2,  3,  4,  5,  6,  7];
const gpioOutputPins = [8,  9, 10, 11, 12, 13, 14, 15];

var gpioInputs  = [];
var gpioOutputs = [];

gpioInputPins1.map(function (value, key) {
    gpioInputs[key] = new Gpio(26, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });
    gpioInputs[key].on('interrupt', function (level) {
        if (level == 0) {
            inputs[key] = false;
        } else {
            inputs[key] = true;
        }
        inputsSocket.emit('state', inputs);
    });
 });

//const gpioInputPins2  = [0,  1,  2,  3,  4,  5];

gpioInputPins1.map(function (value, key) {
    gpioInputs[5] = new Gpio(19, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });
    gpioInputs[5].on('interrupt', function (level) {
        if (level == 0) {
            inputs[5] = false;
        } else {
            inputs[5] = true;
        }
        inputsSocket.emit('state', inputs);
    });
});

Als ik de keys in het if statement van de ISR niet verander naar een getal, geeft ie een foutmelding. Maak ik die ook tot getal, dan geeft ie geen foutmelding. Jammer, want ik had de hoop dat ik die ISR uiteindelijk maar 1x had hoeven typen. Of zou dat nog steeds gaan door die Mozilla pagina closurezooi toe te passen?

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Okee, toch een schopje.

De inputs zoals hierboven beschreven werken naar mijn idee voldoende. Ze doen wat ze moeten doen en ik krijg met een stukje code via de hardwareknop ook gewoon een hardwarematige led aan en uit schakelen. Echter, via een webbutton krijg ik mijn hardwarematige led niet geschakeld.
Via de socket krijg ik mijn data wel binnen vanuit de html pagina, want met console.log kan ik dat keurig printen. Echter, een function die ik heb aangemaakt, wordt niet aangeroepen. Wellicht redeneer ik verkeerd, maar volgens mij werkt een function toch gewoon als een subroutine die je vanuit ieder punt in je code kan aanroepen?

Stukje code waarin de data binnen komt uit de socket en verwerkt wordt. Dit werkt, alle logs worden keurig weergeven in de terminal.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const outputsSocket = sio.of('/ws/outputs')
    .on('connection', function (socket) {
        console.log('outputsSockets connected');
        socket.on('state', function (data) {
            console.log("outputsSocket got:", data);
            //outputsSocket.emit('state', data);
            
            //led_output(data['value']);
            //gpioOutputPins();
            var i = 1;
            console.log("test van data[%s]: %s", i, data[i]);
            return data;
            outputPins();
            
        });
    });


Stukje code waarin de functie daadwerkelijk uitgevoerd zou moeten worden.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
function outputPins() {
    console.log("function is running");
    const gpioOutput3 = new Gpio(4, {mode: Gpio.OUTPUT});
    if (data[1] == true)
        {
            gpioOutput3.digitalWrite(1);
            console.log("data is true");
        }
    else
        {
            gpioOutput3.digitalWrite(0);
        }
    }


Het is niet dat ik de verkeerde GPIO pin te pakken heb, want ik heb de desbetreffende pin voor deze gelegenheid ook gebruikt als ik de hardwareknop in druk en dan gaat het LEDje wel gewoon aan. Zie onderstaande snippet. In bovenstaande snippet wordt volgens mij niets gedaan, want de beide loggers worden niet getoond als ik op de button corresponderend aan data[1] druk.
JavaScript:
1
2
3
4
const gpioOutput1 = new Gpio(4, {mode: Gpio.OUTPUT});
gpioInputs[5].on('interrupt', function (level) {
    gpioOutput1.digitalWrite(level);
});


In de logger wordt dan ook het onderstaande getoond als ik hem activeer en deactiveer in de browser.
code:
1
2
3
4
outputsSocket got: [ false, true, false, false, false, false, false, false ]
test van data[1]: true
outputsSocket got: [ false, false, false, false, false, false, false, false ]
test van data[1]: false

Hieruit concludeer ik dat het overdragen van data terug naar de JS file goed gaat, want deze regels worden in de bovenste snippet verzorgd.

Wie o wie weet het?

Acties:
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 21:26
Pizza_Boom schreef op dinsdag 19 januari 2016 @ 11:24:
Okee, toch een schopje.

De inputs zoals hierboven beschreven werken naar mijn idee voldoende. Ze doen wat ze moeten doen en ik krijg met een stukje code via de hardwareknop ook gewoon een hardwarematige led aan en uit schakelen. Echter, via een webbutton krijg ik mijn hardwarematige led niet geschakeld.
Via de socket krijg ik mijn data wel binnen vanuit de html pagina, want met console.log kan ik dat keurig printen. Echter, een function die ik heb aangemaakt, wordt niet aangeroepen. Wellicht redeneer ik verkeerd, maar volgens mij werkt een function toch gewoon als een subroutine die je vanuit ieder punt in je code kan aanroepen?

Stukje code waarin de data binnen komt uit de socket en verwerkt wordt. Dit werkt, alle logs worden keurig weergeven in de terminal.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const outputsSocket = sio.of('/ws/outputs')
    .on('connection', function (socket) {
        console.log('outputsSockets connected');
        socket.on('state', function (data) {
            console.log("outputsSocket got:", data);
            //outputsSocket.emit('state', data);
            
            //led_output(data['value']);
            //gpioOutputPins();
            var i = 1;
            console.log("test van data[%s]: %s", i, data[i]);
            return data;
            outputPins();
            
        });
    });


Wie o wie weet het?
Je returned data voor je outputPins(); aanroept. Een return is een einde van een function en alles wat daarna staat zal niet aangeroepen worden.
Draai de outputPins() en return data; aanroepen eens om?

[ Voor 29% gewijzigd door Merethil op 19-01-2016 11:40 ]


Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Merethil schreef op dinsdag 19 januari 2016 @ 11:39:
Je returned data voor je outputPins(); aanroept. Een return is een einde van een function en alles wat daarna staat zal niet aangeroepen worden.
Draai de outputPins() en return data; aanroepen eens om?
Zoiets kleins... |:( |:( 8)7 8)7

code:
1
2
3
4
outputsSocket got: [ false, true, false, false, false, false, false, false ]
test van data[1]: true
function is true
data is true
En de led is aan. _/-\o_

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Toch nog iets dat niet lukt: een setInterval routine beëindigen.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    if (data[0] == true)
        {
            var IntervalStop = setInterval(function() {
                motor.servoWrite(pulseWidth);
                
                pulseWidth = pulseWidth + increment;
                if (pulseWidth >= 2600)
                    {
                        pulseWidth = 500;
                    }
                    if (data[0] == false) {
                        clearInterval(IntervalStop); }
                    console.log (pulseWidth);
                }, 1000);   
            
        }

Ik heb het geprobeerd met break, break (IntervalStop), return, return (data) en overal blijft ie gewoon doorlopen, terwijl ik door de console.log statements wel zie dat data weer terug naar false gezet wordt.
Ook heb ik in het if(data[0] == false) codedeel een console.log gehad, maar dat if statement lijkt ie compleet te negeren. Of ik nou zet (data[0] == false) of (data[0] != true), zowel bij het hoog als bij het laat maken van het data[0] komt ie niet in het if statement.

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 21:26
Pizza_Boom schreef op dinsdag 19 januari 2016 @ 18:51:
Toch nog iets dat niet lukt: een setInterval routine beëindigen.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    if (data[0] == true)
        {
            var IntervalStop = setInterval(function() {
                motor.servoWrite(pulseWidth);
                
                pulseWidth = pulseWidth + increment;
                if (pulseWidth >= 2600)
                    {
                        pulseWidth = 500;
                    }
                    if (data[0] == false) {
                        clearInterval(IntervalStop); }
                    console.log (pulseWidth);
                }, 1000);   
            
        }

Ik heb het geprobeerd met break, break (IntervalStop), return, return (data) en overal blijft ie gewoon doorlopen, terwijl ik door de console.log statements wel zie dat data weer terug naar false gezet wordt.
Ook heb ik in het if(data\[0] == false) codedeel een console.log gehad, maar dat if statement lijkt ie compleet te negeren. Of ik nou zet (data\[0] == false) of (data\[0] != true), zowel bij het hoog als bij het laat maken van het data\[0] komt ie niet in het if statement.
Je probeert vanuit de interval variabele, die je declareert als code, zichzelf te laten stoppen.
Ik denk dat je een apart event oid moet maken die je interval stopt van buitenaf, want op de plek waar je clearInterval aanroept zal hij het object wat je wilt clearen nog niet herkennen.

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Merethil schreef op dinsdag 19 januari 2016 @ 18:57:
Je probeert vanuit de interval variabele, die je declareert als code, zichzelf te laten stoppen.
Ik denk dat je een apart event oid moet maken die je interval stopt van buitenaf, want op de plek waar je clearInterval aanroept zal hij het object wat je wilt clearen nog niet herkennen.
Nope, ook helemaal terug naar dezelfde hoogte als de andere data[x] zijn, werkt niet. Goed, hij komt wel langs de log en die wordt dus getoond, maar de routine blijft doorlopen.
Dat snap ik nu ook niet, ook in de routine zou die toch wel door het if statement moeten kunnen komen? De regel daaronder, de andere log, doet ie namelijk wel. 8)7

Acties:
  • +2 Henk 'm!

  • Timons106
  • Registratie: Februari 2010
  • Laatst online: 04-06 09:07
Ik zie trouwens dat je de Array.map functie gebruikt als loop waarin je een mutation doet op de betreffende array, je gebruikt het dus eigenlijk als een Array.forEach loop. Met Array.map kan je een value returen om een nieuwe array op te bouwen.

Voorbeeld:

JavaScript:
1
2
3
4
5
6
7
let newArray = gpioInputPins.map(function (value, key) {
    const gpio = new Gpio (..., { ... });

    gpio.on('interrupt', function (...) { ... });
    
    return gpio;
});

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Inmiddels stopt de intervalroutine wel. Omdat we allemaal een hekel hebben aan problemen die uiteindelijk opgelost zijn zonder de oplossing te openbaren, bij deze.
Ik ben voor het stoppen van de interval middels clearInterval(); wat gaan schuiven in de hoogte van de variabele "IntervalStop. Deze stond lokaal, ik heb hem nu helemaal buiten de function outputPins(data) gehaald, daarmee is het dus een globale variabele geworden. Nu doet de clearinterval het wel. Ik heb het vermoeden dat ie als lokale variabele toch nog ergens wordt overschreven, hetgeen nu waarschijnlijk niet gebeurt.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var IntervalStop;
function outputPins(data) {
    if (data[0] == true)
        {
                IntervalStop = setInterval(function() {
                motor.servoWrite(pulseWidth);
                
                pulseWidth = pulseWidth + increment;
                if (pulseWidth >= 2600)
                    {
                        pulseWidth = 500;
                    }
                console.log (pulseWidth);
                }, 1000);   
        }   
            
    else if (data[0] != true) 
        {
            console.log("stop");
            clearInterval(IntervalStop);
            }
    }

Acties:
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 21:26
Pizza_Boom schreef op woensdag 20 januari 2016 @ 11:43:
Inmiddels stopt de intervalroutine wel. Omdat we allemaal een hekel hebben aan problemen die uiteindelijk opgelost zijn zonder de oplossing te openbaren, bij deze.
Ik ben voor het stoppen van de interval middels clearInterval(); wat gaan schuiven in de hoogte van de variabele "IntervalStop. Deze stond lokaal, ik heb hem nu helemaal buiten de function outputPins(data) gehaald, daarmee is het dus een globale variabele geworden. Nu doet de clearinterval het wel. Ik heb het vermoeden dat ie als lokale variabele toch nog ergens wordt overschreven, hetgeen nu waarschijnlijk niet gebeurt.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var IntervalStop;
function outputPins(data) {
    if (data[0] == true)
        {
                IntervalStop = setInterval(function() {
                motor.servoWrite(pulseWidth);
                
                pulseWidth = pulseWidth + increment;
                if (pulseWidth >= 2600)
                    {
                        pulseWidth = 500;
                    }
                console.log (pulseWidth);
                }, 1000);   
        }   
            
    else if (data[0] != true) 
        {
            console.log("stop");
            clearInterval(IntervalStop);
            }
    }
Komt erop neer dat het gewoon een scope-probleem was. Als je in de IntervalStop functie zichzelf aanroept om te stoppen bestaat "IntervalStop" niet als een variabele in die scope.

Je wijst namelijk je code toe aan IntervalStop, dus in IntervalStop zelf is IntervalStop nog nooit gedefinieerd, dus kan clearInterval IntervalStop niet vinden en niet resolven.
Als je het terugzet zoals je eerder had gok ik ook dat je ergens een error had moeten zien, maar ik weet niet hoe dat zit met node (waar gaan errors precies heen?)

Dit zijn hele simpele problemen bij het programmeren, want zelfs een gemiddelde IDE zou hem al moeten oppikken (met een message á la "IntervalStop is not defined at this location" ter hoogte van je clearInterval).

Maar fijn dat het nu werkt! Je oplossing is zoals ik hem toen bedoelde, maar typte via mijn telefoon en had toen geen tijd om het hele verhaal hierboven over scope uit te typen.

Acties:
  • 0 Henk 'm!

  • Pizza_Boom
  • Registratie: Juli 2012
  • Laatst online: 22:51
Merethil schreef op woensdag 20 januari 2016 @ 12:59:
Komt erop neer dat het gewoon een scope-probleem was. Als je in de IntervalStop functie zichzelf aanroept om te stoppen bestaat "IntervalStop" niet als een variabele in die scope.

Je wijst namelijk je code toe aan IntervalStop, dus in IntervalStop zelf is IntervalStop nog nooit gedefinieerd, dus kan clearInterval IntervalStop niet vinden en niet resolven.
Als je het terugzet zoals je eerder had gok ik ook dat je ergens een error had moeten zien, maar ik weet niet hoe dat zit met node (waar gaan errors precies heen?)

Dit zijn hele simpele problemen bij het programmeren, want zelfs een gemiddelde IDE zou hem al moeten oppikken (met een message á la "IntervalStop is not defined at this location" ter hoogte van je clearInterval).

Maar fijn dat het nu werkt! Je oplossing is zoals ik hem toen bedoelde, maar typte via mijn telefoon en had toen geen tijd om het hele verhaal hierboven over scope uit te typen.
Ik maak op de pi in principe gebruik van Geany, C, python e.d. pakt ie wel gewoon. Ben al aan het zoeken geweest naar plug ins om ook HTML, JS, PHP e.d. laten scannen, maar nog niet gevonden.

Errors kreeg ik niet. Nou las ik ook al dat setInterval zelfs met errors doodleuk door blijft douwen. De code continue transferren tussen PC en RPi is imho ook geen doen.

Ach, leer ik weer van, naar mijn mening nog steeds een JS noob. :+
Pagina: 1