From 49e502a34756ef5168ef354803b8d8d66291641b Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Fri, 20 Jun 2014 14:02:35 +0200 Subject: [PATCH 01/56] Corrected error in board drawing --- www/img/weioBoard.png | Bin 29748 -> 29975 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/www/img/weioBoard.png b/www/img/weioBoard.png index bc78e5212cf717e60a3efa6ccf718c7eccc9ec64..bfccf1e9b540ff02aec928fc837997331c3019b5 100644 GIT binary patch delta 27417 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

=f%YG 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 delta 27203 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 LiB64{bL9U6gF@f4 From d35d39c41bfa665443b7730bec8a1d8c08a95099 Mon Sep 17 00:00:00 2001 From: Ronan Yvergniaux Date: Thu, 3 Jul 2014 16:12:38 +0200 Subject: [PATCH 02/56] Change function constrain and function proportion in weioApi.js and add I2C in weioIO.py --- weioLib/weioIO.py | 5 +++++ www/libs/weio/weioApi.js | 31 +++++++++++++++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/weioLib/weioIO.py b/weioLib/weioIO.py index 29e68ea5..3d428d6f 100644 --- a/weioLib/weioIO.py +++ b/weioLib/weioIO.py @@ -2,6 +2,7 @@ import time from weioLib.weioLm75 import WeioLm75 from IoTPy.pyuper.gpio import GPIO +from IoTPy.pyuper.i2c import I2C import IoTPy.things.servomotor as servoLib import IoTPy.things.am2321 as am2321Lib import IoTPy.things.si7020 as si7020Lib @@ -137,6 +138,10 @@ def getTemperature(): return lm75.getTemperature() # BINDINGS TO LIBRARIES + +def initI2c(): + return I2C(gpio.u) + def initServo(pin): return servoLib.Servo(gpio.u, pin) diff --git a/www/libs/weio/weioApi.js b/www/libs/weio/weioApi.js index 6ed0033c..0631e94d 100644 --- a/www/libs/weio/weioApi.js +++ b/www/libs/weio/weioApi.js @@ -245,14 +245,9 @@ function analogWrite(pin, value) { genericMessage("pwmWrite", [pin,value], null); }; -function proportion(value, istart, istop, ostart, ostop, callback){ - // create new callback call - var fName = callback.name; - //console.log("callback name:" + fName); - // add callback function to be called when data arrives - weioCallbacks[fName] = callback - genericMessage("proportion", [value, istart, istop, ostart, ostop, callback], fName); - //console.log("Callbacks", weioCallbacks); +function proportion(value, istart, istop, ostart, ostop){ + return ostart + (ostop-ostart) * ((value -istart) / (istop - istart)) + }; function delay(period){ @@ -272,14 +267,18 @@ function notone(pin) { genericMessage("notone", [pin], null); }; -function constrain(x, a, b, callback) { - // create new callback call - var fName = callback.name; - //console.log("callback name:" + fName); - // add callback function to be called when data arrives - weioCallbacks[fName] = callback - - genericMessage("constrain", [x,a,b], fName); +function constrain(x, a, b) { + if(x > a){ + if(x < b){ + return a + } + } + if(x < a){ + return a + } + if(x > b){ + return b + } }; function millis(callback) { From 728ebea978415f8813710d46d97d75792bfdbca0 Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Tue, 15 Jul 2014 21:48:35 +0200 Subject: [PATCH 03/56] Examples added --- examples/PYTHON_WITH_JS/__init__.py | 0 examples/PYTHON_WITH_JS/index.html | 87 ++++++++++++++++++++++++++ examples/PYTHON_WITH_JS/main.py | 20 ++++++ examples/analogRead_JS/__init__.py | 0 examples/analogRead_JS/index.html | 66 +++++++++++++++++++ examples/analogRead_JS/main.py | 8 +++ examples/analogRead_PY/__init__.py | 0 examples/analogRead_PY/index.html | 21 +++++++ examples/analogRead_PY/main.py | 21 +++++++ examples/buttonToLEDWEB/www | 1 + examples/digitalRead_JS/__init__.py | 0 examples/digitalRead_JS/index.html | 67 ++++++++++++++++++++ examples/digitalRead_JS/main.py | 13 ++++ examples/digitalRead_JS/www | 1 + examples/digitalRead_PY/__init__.py | 0 examples/digitalRead_PY/index.html | 21 +++++++ examples/digitalRead_PY/main.py | 24 +++++++ examples/digitalWrite_JS/__init__.py | 0 examples/digitalWrite_JS/index.html | 82 ++++++++++++++++++++++++ examples/digitalWrite_JS/main.py | 8 +++ examples/digitalWrite_PY/__init__.py | 0 examples/digitalWrite_PY/index.html | 21 +++++++ examples/digitalWrite_PY/main.py | 31 +++++++++ examples/getTemperatur_PY/__init__.py | 0 examples/getTemperatur_PY/index.html | 21 +++++++ examples/getTemperatur_PY/main.py | 16 +++++ examples/getTemperature_JS/__init__.py | 0 examples/getTemperature_JS/index.html | 74 ++++++++++++++++++++++ examples/getTemperature_JS/main.py | 8 +++ examples/millis_PY/__init__.py | 0 examples/millis_PY/index.html | 21 +++++++ examples/millis_PY/main.py | 20 ++++++ examples/proportion_JS/__init__.py | 0 examples/proportion_JS/index.html | 72 +++++++++++++++++++++ examples/proportion_JS/main.py | 8 +++ examples/proportion_PY/__init__.py | 0 examples/proportion_PY/index.html | 21 +++++++ examples/proportion_PY/main.py | 23 +++++++ examples/pwmWrite_JS/__init__.py | 0 examples/pwmWrite_JS/index.html | 71 +++++++++++++++++++++ examples/pwmWrite_JS/main.py | 8 +++ examples/pwmWrite_PY/__init__.py | 0 examples/pwmWrite_PY/index.html | 21 +++++++ examples/pwmWrite_PY/main.py | 35 +++++++++++ examples/servomotor_PY/__init__.py | 0 examples/servomotor_PY/index.html | 21 +++++++ examples/servomotor_PY/main.py | 38 +++++++++++ examples/tone_JS/__init__.py | 0 examples/tone_JS/index.html | 73 +++++++++++++++++++++ examples/tone_JS/main.py | 8 +++ examples/tone_PY/__init__.py | 0 examples/tone_PY/index.html | 21 +++++++ examples/tone_PY/main.py | 25 ++++++++ 53 files changed, 1097 insertions(+) create mode 100644 examples/PYTHON_WITH_JS/__init__.py create mode 100644 examples/PYTHON_WITH_JS/index.html create mode 100644 examples/PYTHON_WITH_JS/main.py create mode 100644 examples/analogRead_JS/__init__.py create mode 100644 examples/analogRead_JS/index.html create mode 100644 examples/analogRead_JS/main.py create mode 100644 examples/analogRead_PY/__init__.py create mode 100644 examples/analogRead_PY/index.html create mode 100644 examples/analogRead_PY/main.py create mode 120000 examples/buttonToLEDWEB/www create mode 100644 examples/digitalRead_JS/__init__.py create mode 100644 examples/digitalRead_JS/index.html create mode 100644 examples/digitalRead_JS/main.py create mode 120000 examples/digitalRead_JS/www create mode 100644 examples/digitalRead_PY/__init__.py create mode 100644 examples/digitalRead_PY/index.html create mode 100644 examples/digitalRead_PY/main.py create mode 100644 examples/digitalWrite_JS/__init__.py create mode 100644 examples/digitalWrite_JS/index.html create mode 100644 examples/digitalWrite_JS/main.py create mode 100644 examples/digitalWrite_PY/__init__.py create mode 100644 examples/digitalWrite_PY/index.html create mode 100644 examples/digitalWrite_PY/main.py create mode 100644 examples/getTemperatur_PY/__init__.py create mode 100644 examples/getTemperatur_PY/index.html create mode 100644 examples/getTemperatur_PY/main.py create mode 100644 examples/getTemperature_JS/__init__.py create mode 100644 examples/getTemperature_JS/index.html create mode 100644 examples/getTemperature_JS/main.py create mode 100644 examples/millis_PY/__init__.py create mode 100644 examples/millis_PY/index.html create mode 100644 examples/millis_PY/main.py create mode 100644 examples/proportion_JS/__init__.py create mode 100644 examples/proportion_JS/index.html create mode 100644 examples/proportion_JS/main.py create mode 100644 examples/proportion_PY/__init__.py create mode 100644 examples/proportion_PY/index.html create mode 100644 examples/proportion_PY/main.py create mode 100644 examples/pwmWrite_JS/__init__.py create mode 100644 examples/pwmWrite_JS/index.html create mode 100644 examples/pwmWrite_JS/main.py create mode 100644 examples/pwmWrite_PY/__init__.py create mode 100644 examples/pwmWrite_PY/index.html create mode 100644 examples/pwmWrite_PY/main.py create mode 100644 examples/servomotor_PY/__init__.py create mode 100644 examples/servomotor_PY/index.html create mode 100644 examples/servomotor_PY/main.py create mode 100644 examples/tone_JS/__init__.py create mode 100644 examples/tone_JS/index.html create mode 100644 examples/tone_JS/main.py create mode 100644 examples/tone_PY/__init__.py create mode 100644 examples/tone_PY/index.html create mode 100644 examples/tone_PY/main.py diff --git a/examples/PYTHON_WITH_JS/__init__.py b/examples/PYTHON_WITH_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/PYTHON_WITH_JS/index.html b/examples/PYTHON_WITH_JS/index.html new file mode 100644 index 00000000..b7a60674 --- /dev/null +++ b/examples/PYTHON_WITH_JS/index.html @@ -0,0 +1,87 @@ + + + + + + + + + My first Web app + + + + + + + + +

+ + + + \ No newline at end of file diff --git a/examples/PYTHON_WITH_JS/main.py b/examples/PYTHON_WITH_JS/main.py new file mode 100644 index 00000000..b7099731 --- /dev/null +++ b/examples/PYTHON_WITH_JS/main.py @@ -0,0 +1,20 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + + +def setup(): + attach.event('colorled', led) + +def led(dataIn): + if(dataIn == 0): + digitalWrite(20,LOW) + digitalWrite(19,HIGH) + digitalWrite(18,HIGH) + if(dataIn == 1): + digitalWrite(20,HIGH) + digitalWrite(19,HIGH) + digitalWrite(18,LOW) + if(dataIn == 2): + digitalWrite(20,HIGH) + digitalWrite(19,LOW) + digitalWrite(18,HIGH) \ No newline at end of file diff --git a/examples/analogRead_JS/__init__.py b/examples/analogRead_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/analogRead_JS/index.html b/examples/analogRead_JS/index.html new file mode 100644 index 00000000..f497fa3e --- /dev/null +++ b/examples/analogRead_JS/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + My first Web app + + + + + + + + +

+
+ + + \ No newline at end of file diff --git a/examples/analogRead_JS/main.py b/examples/analogRead_JS/main.py new file mode 100644 index 00000000..11a55f1f --- /dev/null +++ b/examples/analogRead_JS/main.py @@ -0,0 +1,8 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + print("Hello world") diff --git a/examples/analogRead_PY/__init__.py b/examples/analogRead_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/analogRead_PY/index.html b/examples/analogRead_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/analogRead_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/analogRead_PY/main.py b/examples/analogRead_PY/main.py new file mode 100644 index 00000000..81a80209 --- /dev/null +++ b/examples/analogRead_PY/main.py @@ -0,0 +1,21 @@ +####################################### +# # +# how to get AnalogRead on WEIO # +# # +####################################### + +# syntax analogRead(pin) returns adc value +# there are 8 analog pins on weio (between 24 to 31) +# value is between 0 and 1023 + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + pin = 31 + while True: + print "analogRead pin ",pin," = ",analogRead(pin) + delay(100) diff --git a/examples/buttonToLEDWEB/www b/examples/buttonToLEDWEB/www new file mode 120000 index 00000000..d5b959b5 --- /dev/null +++ b/examples/buttonToLEDWEB/www @@ -0,0 +1 @@ +/Users/uros/workNow/nodesign/WeIO/weio/weio/www \ No newline at end of file diff --git a/examples/digitalRead_JS/__init__.py b/examples/digitalRead_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/digitalRead_JS/index.html b/examples/digitalRead_JS/index.html new file mode 100644 index 00000000..0c5e4559 --- /dev/null +++ b/examples/digitalRead_JS/index.html @@ -0,0 +1,67 @@ + + + + + + + + + + My first Web app + + + + + + + + +

+
+ + + \ No newline at end of file diff --git a/examples/digitalRead_JS/main.py b/examples/digitalRead_JS/main.py new file mode 100644 index 00000000..f90aa458 --- /dev/null +++ b/examples/digitalRead_JS/main.py @@ -0,0 +1,13 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + print("Hello world") + digitalWrite(18,HIGH) + digitalWrite(0,HIGH) + digitalWrite(15,LOW) + digitalWrite(16,LOW) + print getPinInfo() diff --git a/examples/digitalRead_JS/www b/examples/digitalRead_JS/www new file mode 120000 index 00000000..d5b959b5 --- /dev/null +++ b/examples/digitalRead_JS/www @@ -0,0 +1 @@ +/Users/uros/workNow/nodesign/WeIO/weio/weio/www \ No newline at end of file diff --git a/examples/digitalRead_PY/__init__.py b/examples/digitalRead_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/digitalRead_PY/index.html b/examples/digitalRead_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/digitalRead_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/digitalRead_PY/main.py b/examples/digitalRead_PY/main.py new file mode 100644 index 00000000..8bbc600c --- /dev/null +++ b/examples/digitalRead_PY/main.py @@ -0,0 +1,24 @@ +####################################### +# # +# how to have digitalRead on WEIO # +# # +####################################### + +#syntax = digitalread(pin) +#Value returned is 0 and 1 +#it's possible to choose the mode with function pinMode(pin, mode) +#mode is PULL_UP or PULL_DOWN + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach +pin = 2 +def setup(): + + attach.process(myProcess) + +def myProcess(): + while True: + a=digitalRead(pin) + print "Value on the pin ",pin," = ",a + delay(100) + diff --git a/examples/digitalWrite_JS/__init__.py b/examples/digitalWrite_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/digitalWrite_JS/index.html b/examples/digitalWrite_JS/index.html new file mode 100644 index 00000000..fad1c25c --- /dev/null +++ b/examples/digitalWrite_JS/index.html @@ -0,0 +1,82 @@ + + + + + + + + + + + My first Web app + + + + + + + + +

+
+ + + \ No newline at end of file diff --git a/examples/digitalWrite_JS/main.py b/examples/digitalWrite_JS/main.py new file mode 100644 index 00000000..11a55f1f --- /dev/null +++ b/examples/digitalWrite_JS/main.py @@ -0,0 +1,8 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + print("Hello world") diff --git a/examples/digitalWrite_PY/__init__.py b/examples/digitalWrite_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/digitalWrite_PY/index.html b/examples/digitalWrite_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/digitalWrite_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/digitalWrite_PY/main.py b/examples/digitalWrite_PY/main.py new file mode 100644 index 00000000..1fcd88e2 --- /dev/null +++ b/examples/digitalWrite_PY/main.py @@ -0,0 +1,31 @@ +####################################### +# # +# how to have digitalWrite on WEIO # +# # +####################################### + +#syntax = digitalWrite(pin,Value) +#Value is 0 and 1, or LOW and HIGH +#pins 18, 19, 20 is connected with RGB LED + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + while True : + digitalWrite(18,0) + delay(70) + digitalWrite(20,1) + delay(70) + digitalWrite(19,0) + delay(70) + digitalWrite(18,1) + delay(70) + digitalWrite(20,0) + delay(70) + digitalWrite(19,1) + delay(70) + diff --git a/examples/getTemperatur_PY/__init__.py b/examples/getTemperatur_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/getTemperatur_PY/index.html b/examples/getTemperatur_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/getTemperatur_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/getTemperatur_PY/main.py b/examples/getTemperatur_PY/main.py new file mode 100644 index 00000000..9b89777a --- /dev/null +++ b/examples/getTemperatur_PY/main.py @@ -0,0 +1,16 @@ +####################################### +# # +# how to get temperature on WEIO # +# # +####################################### + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + while True: #create an infinite loop + print getTemperature() + delay(300) #stop during 300ms diff --git a/examples/getTemperature_JS/__init__.py b/examples/getTemperature_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/getTemperature_JS/index.html b/examples/getTemperature_JS/index.html new file mode 100644 index 00000000..1bc9ec21 --- /dev/null +++ b/examples/getTemperature_JS/index.html @@ -0,0 +1,74 @@ + + + + + + + + + + + + My first Web app + + + + + + + + +

+
+ + + \ No newline at end of file diff --git a/examples/getTemperature_JS/main.py b/examples/getTemperature_JS/main.py new file mode 100644 index 00000000..11a55f1f --- /dev/null +++ b/examples/getTemperature_JS/main.py @@ -0,0 +1,8 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + print("Hello world") diff --git a/examples/millis_PY/__init__.py b/examples/millis_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/millis_PY/index.html b/examples/millis_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/millis_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/millis_PY/main.py b/examples/millis_PY/main.py new file mode 100644 index 00000000..6b223d3d --- /dev/null +++ b/examples/millis_PY/main.py @@ -0,0 +1,20 @@ +####################################### +# # +# how to get millis on WEIO # +# # +####################################### + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + a=millis() # Millis represents n of milliseconds from first power up of the board + while True: # loop + b=millis() + print "millis = ",b-a #b-a represents n of milliseconds from this process launch + delay(1000) # sleep during 1s + + diff --git a/examples/proportion_JS/__init__.py b/examples/proportion_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/proportion_JS/index.html b/examples/proportion_JS/index.html new file mode 100644 index 00000000..93723462 --- /dev/null +++ b/examples/proportion_JS/index.html @@ -0,0 +1,72 @@ + + + + + + + + + + + My first Web app + + + + + + + + +

+
+ + + \ No newline at end of file diff --git a/examples/proportion_JS/main.py b/examples/proportion_JS/main.py new file mode 100644 index 00000000..11a55f1f --- /dev/null +++ b/examples/proportion_JS/main.py @@ -0,0 +1,8 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + print("Hello world") diff --git a/examples/proportion_PY/__init__.py b/examples/proportion_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/proportion_PY/index.html b/examples/proportion_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/proportion_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/proportion_PY/main.py b/examples/proportion_PY/main.py new file mode 100644 index 00000000..40ad81d2 --- /dev/null +++ b/examples/proportion_PY/main.py @@ -0,0 +1,23 @@ +####################################### +# # +# how to have porportion on WEIO # +# # +####################################### + +#syntax = proportion(value, istart, istop, ostart, ostop) +#return a value proportionned + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + while True: + a=analogRead(31) #value is between 0 and 1024 + print "analogRead = ",a + a=proportion(a,0,1024,0,255) + print "analoRead porportioned = ",a + pwmWrite(18,a) #value is between 0 and 255 + delay(500) diff --git a/examples/pwmWrite_JS/__init__.py b/examples/pwmWrite_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/pwmWrite_JS/index.html b/examples/pwmWrite_JS/index.html new file mode 100644 index 00000000..11437a35 --- /dev/null +++ b/examples/pwmWrite_JS/index.html @@ -0,0 +1,71 @@ + + + + + + + + + My first Web app + + + + + + + + +

+
+ + + \ No newline at end of file diff --git a/examples/pwmWrite_JS/main.py b/examples/pwmWrite_JS/main.py new file mode 100644 index 00000000..11a55f1f --- /dev/null +++ b/examples/pwmWrite_JS/main.py @@ -0,0 +1,8 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + print("Hello world") diff --git a/examples/pwmWrite_PY/__init__.py b/examples/pwmWrite_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/pwmWrite_PY/index.html b/examples/pwmWrite_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/pwmWrite_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/pwmWrite_PY/main.py b/examples/pwmWrite_PY/main.py new file mode 100644 index 00000000..b772ceba --- /dev/null +++ b/examples/pwmWrite_PY/main.py @@ -0,0 +1,35 @@ +####################################### +# # +# how to have PWM on WEIO # +# # +####################################### + +#syntax = pwmWrite(pin, value) or analogWrite(pin, value) +# there are 6 pwm pins on weio (23, 22, 21, 20, 19, 18) +# default value is between 0 and 255 +# pins 18, 19, 20 are connected on RGB LED on the board + + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach, shared + +def setup() : + attach.process(loop) + +def loop() : + + while True: + print "fade in" + # count from 0 to 255 + for i in range(0,256): + pwmWrite(18,i) + pwmWrite(19,i) + pwmWrite(20,i) + delay(3) + + print "fade out" + for i in range(0,256): + pwmWrite(18,255-i) + pwmWrite(19,255-i) + pwmWrite(20,255-i) + delay(3) diff --git a/examples/servomotor_PY/__init__.py b/examples/servomotor_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/servomotor_PY/index.html b/examples/servomotor_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/servomotor_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/servomotor_PY/main.py b/examples/servomotor_PY/main.py new file mode 100644 index 00000000..554a8b61 --- /dev/null +++ b/examples/servomotor_PY/main.py @@ -0,0 +1,38 @@ +####################################### +# # +# how to use servomotor on WEIO # +# # +####################################### + +#servomotor library +# there are 6 pwm pins on weio (23, 22, 21, 20, 19, 18) +# servomotor use pwm pin. +#initServo(pin) return Servo object and attach the Servo variable to a pwm pin +#write(angle) servo is a vairable of type Servo +#angle is the value to write to the servo, from 0 to 180 + +#other functions : +#writeMilliseconds(ms) +#readMilliseconds() +#read() + + + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + s = initServo(23) + while True : + for i in range(180): + s.write(i) + print s.read() + delay(20) + + for i in range(180): + s.write(180-i) + print s.readMilliseconds() + delay(20) \ No newline at end of file diff --git a/examples/tone_JS/__init__.py b/examples/tone_JS/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/tone_JS/index.html b/examples/tone_JS/index.html new file mode 100644 index 00000000..b92f8d26 --- /dev/null +++ b/examples/tone_JS/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + My first Web app + + + + + + + + +

+
+ + + \ No newline at end of file diff --git a/examples/tone_JS/main.py b/examples/tone_JS/main.py new file mode 100644 index 00000000..11a55f1f --- /dev/null +++ b/examples/tone_JS/main.py @@ -0,0 +1,8 @@ +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + print("Hello world") diff --git a/examples/tone_PY/__init__.py b/examples/tone_PY/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/tone_PY/index.html b/examples/tone_PY/index.html new file mode 100644 index 00000000..0cda0cec --- /dev/null +++ b/examples/tone_PY/index.html @@ -0,0 +1,21 @@ + + + + + + My first Web app + + + + +

Hello world!

+ + + + \ No newline at end of file diff --git a/examples/tone_PY/main.py b/examples/tone_PY/main.py new file mode 100644 index 00000000..f68d5d05 --- /dev/null +++ b/examples/tone_PY/main.py @@ -0,0 +1,25 @@ +####################################### +# # +# how to have tone on WEIO # +# # +####################################### + +#syntax = tone(pin, hertz, duration) +# there are 6 pwm pins on weio (23, 22, 21, 20, 19, 18) +# tone use pwm pin. +# duration is optionnal and is in milliseconds +# notone(pin) is function to detach tone of pin (you don't need this function if you use duration argument + +from weioLib.weioIO import * +from weioLib.weioUserApi import attach + +def setup(): + attach.process(myProcess) + +def myProcess(): + i = 0 + while True: + tone(23,i) + i = i +1 + print "i = ",i + delay(100) From c5c65df8032b27908dd13925d1afa3eddbe9bdd2 Mon Sep 17 00:00:00 2001 From: Drasko DRASKOVIC Date: Thu, 17 Jul 2014 12:05:10 +0200 Subject: [PATCH 04/56] install.sh: changed name to feeds.conf --- openWrt/installWeio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openWrt/installWeio.sh b/openWrt/installWeio.sh index e5ca581f..61a71e44 100755 --- a/openWrt/installWeio.sh +++ b/openWrt/installWeio.sh @@ -45,7 +45,7 @@ tar -xzvf $WEIO/productionScripts/weio.tar.gz -C files/ python $WEIO/openWrt/firstTimeFlag.py files/weio/config.weio # Copy feeds configuration file -cp $WEIO/openWrt/feeds.config feeds.config +cp $WEIO/openWrt/feeds.conf feeds.conf # Install needed packages for WeIO cp $WEIO/openWrt/pkg_install.sh . From 36c7130eb37c8b385f516ee923cb436841a39f12 Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Thu, 17 Jul 2014 16:04:40 +0200 Subject: [PATCH 05/56] I2C and SPI good declarations is PY --- weioLib/weioIO.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/weioLib/weioIO.py b/weioLib/weioIO.py index 03e49b71..8a7446fd 100755 --- a/weioLib/weioIO.py +++ b/weioLib/weioIO.py @@ -149,13 +149,17 @@ def getPinInfo(): return gpio.getPinInfo() # NATIVE PROTOCOLES -class I2C(): - def __init__(self, *args): - return interfaceI2C(gpio.u,*args) -class SPI(): - def __init__(self, *args): - return interfaceSPI(gpio.u,*args) +def initI2C(): + return interfaceI2C(gpio.u) + +def initSPI(port): + if (port is 0): + return interfaceSPI(gpio.u, 0) + elif (port is 1): + return interfaceSPI(gpio.u, 1) + else : + print "Error, only port 0 or port 1 are alowed as parameter" # CALL FOR THING LIBRARIES def weioLib(lib, *args): From 7691bc9d506db4a39ec5208efa27301da7e5eb24 Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Thu, 17 Jul 2014 17:23:39 +0200 Subject: [PATCH 06/56] Autoplay on start --- weioRunner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weioRunner.py b/weioRunner.py index a311674b..7e0e095c 100755 --- a/weioRunner.py +++ b/weioRunner.py @@ -161,7 +161,6 @@ def launcher(self): # Get the last name of project and run it projectModule = confFile["last_opened_project"].replace('/', '.') + ".main" print "CALL", projectModule - # Init GPIO object for uper communication if (weioRunnerGlobals.WEIO_SERIAL_LINKED == False): try : @@ -173,7 +172,6 @@ def launcher(self): print "LPC coprocessor is not present" weioIO.gpio = None - # Import userMain from local module try : userMain = __import__(projectModule, fromlist=['']) @@ -282,6 +280,8 @@ def listenerThread(): # Create a userControl object userControl = UserControl() + print "start user script" + userControl.start() # Install signal handlers signalCallback = functools.partial(signalHandler, userControl) From 8c1843e141ccf14bea7a30da03f03fdec633a8a5 Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Thu, 17 Jul 2014 17:38:01 +0200 Subject: [PATCH 07/56] Corrected weioApi --- www/libs/weio/weioApi.js | 1 - 1 file changed, 1 deletion(-) diff --git a/www/libs/weio/weioApi.js b/www/libs/weio/weioApi.js index 4370ade1..e7863c80 100644 --- a/www/libs/weio/weioApi.js +++ b/www/libs/weio/weioApi.js @@ -357,4 +357,3 @@ function genericMessage(instruction, data, clbck) { console.log("Warning, message tried to be sent when websocket was not completely opened"); } }; - From efd219fb9225486c938ba0b34500de221ed418a5 Mon Sep 17 00:00:00 2001 From: Drasko DRASKOVIC Date: Fri, 18 Jul 2014 15:08:23 +0200 Subject: [PATCH 08/56] signin: corrected root passwd setup --- handlers/signinHandler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/handlers/signinHandler.py b/handlers/signinHandler.py index 8317072d..38059643 100755 --- a/handlers/signinHandler.py +++ b/handlers/signinHandler.py @@ -36,6 +36,7 @@ import tornado import platform +import subprocess from weioLib import weioConfig from handlers import loginHandler @@ -76,7 +77,7 @@ def post(self): # First protection is mips detection, second is your own OS # who hopefully needs sudo to change passwd on the local machine if (platform.machine() == 'mips'): - print Popen(command, stdout=PIPE, shell=True).stdout.read() + subprocess.call(command, shell=True) firstTimeSwitch = "NO" confFile['first_time_run']=firstTimeSwitch else: From c4b6bafd148e4b8f19d7e2211cb9e874b97ab3ca Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Fri, 18 Jul 2014 16:46:20 +0200 Subject: [PATCH 09/56] examples updated --- examples/adcToWeb/index.html | 4 +++- examples/buttonToLEDWEB/index.html | 8 ++++---- examples/ledBlinkyPython/main.py | 18 ++---------------- 3 files changed, 9 insertions(+), 21 deletions(-) mode change 100755 => 100644 examples/adcToWeb/index.html diff --git a/examples/adcToWeb/index.html b/examples/adcToWeb/index.html old mode 100755 new mode 100644 index 54baa391..8887616c --- a/examples/adcToWeb/index.html +++ b/examples/adcToWeb/index.html @@ -1,7 +1,9 @@ - + + + My first Web app diff --git a/examples/buttonToLEDWEB/index.html b/examples/buttonToLEDWEB/index.html index 9c80bc7b..fa19567f 100644 --- a/examples/buttonToLEDWEB/index.html +++ b/examples/buttonToLEDWEB/index.html @@ -48,23 +48,23 @@ if (light) { - $(phrase).html("Turn OFF the light!"); + $("#phrase").html("Turn OFF the light!"); $("body").css("background","white"); $("#phrase").css("color","black"); digitalWrite(18, LOW); digitalWrite(19, LOW); digitalWrite(20, LOW); - genericMessage("pera", null); + genericMessage("webEvent", null); light = !light; } else { - $(phrase).html("Turn ON the light!"); + $("#phrase").html("Turn ON the light!"); $("body").css("background","black"); $("#phrase").css("color","white"); digitalWrite(18, HIGH); digitalWrite(19, HIGH); digitalWrite(20, HIGH); - genericMessage("pera", null); + genericMessage("webEvent", null); light = !light; } } diff --git a/examples/ledBlinkyPython/main.py b/examples/ledBlinkyPython/main.py index a076462b..167f9ffa 100644 --- a/examples/ledBlinkyPython/main.py +++ b/examples/ledBlinkyPython/main.py @@ -1,16 +1,2 @@ -from weioLib.weioIO import * -from weioLib.weioUserApi import attach, HIGH, LOW, shared - -import time - -def setup() : - attach.process(blinky) - -def blinky() : - print "Hello world!" - pause = 100 - while True: - digitalWrite(20, HIGH) - delay(pause) - digitalWrite(20, LOW) - delay(pause) +digitalWrite(18, HIGH) + \ No newline at end of file From e9a751aaa333c9719d9adb0f9e89d7f5fb148163 Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Fri, 18 Jul 2014 16:47:09 +0200 Subject: [PATCH 10/56] Updated examples --- examples/adcToWeb/weioLibs.js | 30 ------------------------------ examples/buttonToLEDWEB/main.py | 11 ++++------- 2 files changed, 4 insertions(+), 37 deletions(-) delete mode 100755 examples/adcToWeb/weioLibs.js diff --git a/examples/adcToWeb/weioLibs.js b/examples/adcToWeb/weioLibs.js deleted file mode 100755 index 0eab3126..00000000 --- a/examples/adcToWeb/weioLibs.js +++ /dev/null @@ -1,30 +0,0 @@ -require.config({ - baseUrl: '../../../../libs/' -}); - -// load libs in exact order -// code from -// http://stackoverflow.com/questions/11581611/load-files-in-specific-order-with-requirejs - -var requireQueue = function(modules) { - function load(queue, results) { - if (queue.length) { - require([queue.shift()], function(result) { - results.push(result); - load(queue, results); - }); - } - } - load(modules, []); -}; - -requireQueue([ - 'jquery/jquery-2.0.2.min', - 'sockJS/sockjs-0.3.min', - 'chartJS/Chart.min', - //'bootstrap/js/bootstrap.min', - //'weio/wifi', - //'weio/dashboard', - //'weio/updater' - 'weio/weioApi' -]); \ No newline at end of file diff --git a/examples/buttonToLEDWEB/main.py b/examples/buttonToLEDWEB/main.py index f5ca0772..efb6ac44 100644 --- a/examples/buttonToLEDWEB/main.py +++ b/examples/buttonToLEDWEB/main.py @@ -1,12 +1,9 @@ from weioLib.weioIO import * -from weioLib.weioUserApi import attach, HIGH, LOW, shared +from weioLib.weioUserApi import attach -import time def setup() : - attach.event("pera", peraEvent) + attach.event("webEvent", webEvent) -def peraEvent(data): - print "Jednom Pera" - #time.sleep(1) - print "Uvek Pera" +def webEvent(data): + print "web event" From 3ff9cfa3a083540c775e6baf597bac61a1ab3ac0 Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Fri, 18 Jul 2014 17:01:07 +0200 Subject: [PATCH 11/56] No more verbose debug output --- weioLib/weioGpio.py | 2 +- weioPlayer.py | 10 +++++----- weioRunner.py | 22 +++++++++++----------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/weioLib/weioGpio.py b/weioLib/weioGpio.py index 81bf0a9f..c3018c05 100755 --- a/weioLib/weioGpio.py +++ b/weioLib/weioGpio.py @@ -64,7 +64,7 @@ def __init__(self): while closed: try: self.u = IoBoard() - print "opened port" + #print "opened port" closed = False weioRunnerGlobals.WEIO_SERIAL_LINKED = True except IoTPy_APIError, e: # seems can't establish connection with the UPER board diff --git a/weioPlayer.py b/weioPlayer.py index 2091dd91..e950a693 100644 --- a/weioPlayer.py +++ b/weioPlayer.py @@ -84,7 +84,7 @@ def startUserTornado(self): processName = './weioRunner.py' - print("weioMain indipendent process launching...") + #print("weioMain indipendent process launching...") self.weioPipe = subprocess.Popen([processName], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.ioloopObj = ioloop.IOLoop.instance() @@ -123,7 +123,7 @@ def play(self, rq={'request':'play'}): # check if user project exists before launching #if (weioFiles.checkIfFileExists(up+lp+"main.py")): if (weioFiles.checkIfFileExists(lp+"/main.py")): - print("weioMain indipendent process launching...") + #print("weioMain indipendent process launching...") # Inform client the we run subprocess data['requested'] = rq['request'] @@ -203,7 +203,7 @@ def weioMainHandler(self, data, fd, events): if self.weioPipe.poll() is not None : """ Child is terminated STDOUT""" - print "Child has terminated - removing handler STDOUT" + #print "Child has terminated - removing handler STDOUT" self.playing = False ioloop.IOLoop.instance().remove_handler(self.weioPipe.stdout.fileno()) self.stdoutHandlerIsLive = False; @@ -230,7 +230,7 @@ def weioMainHandlerErr(self, data, fd, events): data['status'] = "Check output console for errors!" if 'Traceback (most recent call last):' in stderr : - print "traceback info is comming..." + #print "traceback info is comming..." self.errLine = 0 print "ERR " + str(self.errLine) + " : " + stderr @@ -267,7 +267,7 @@ def weioMainHandlerErr(self, data, fd, events): if self.weioPipe.poll() is not None : """ Child is terminated STDERR""" - print "Child has terminated - removing handler STDERR" + #print "Child has terminated - removing handler STDERR" self.playing = False self.errLine = 0 data = {} diff --git a/weioRunner.py b/weioRunner.py index 7e0e095c..61eabe2e 100755 --- a/weioRunner.py +++ b/weioRunner.py @@ -100,7 +100,7 @@ def send(self, data): self.connection.send(data) def start(self, rq={'request':'play'}): - print "STARTING USER PROCESSES" + #print "STARTING USER PROCESSES" self.launcherProcess = multiprocessing.Process(target=self.launcher) self.launcherProcess.start() @@ -109,9 +109,9 @@ def stop(self): # Removing all User Events weioParser.removeUserEvents() - print "STOPPING USER PROCESSES" + #print "STOPPING USER PROCESSES" - print "=======<> self.launcherProcess ", self.launcherProcess + #print "=======<> self.launcherProcess ", self.launcherProcess if (self.launcherProcess != None): self.launcherProcess.terminate() @@ -154,13 +154,13 @@ def userPlayer(self, fd, events): def launcher(self): - print "======>>> LAUNCHING..." + #print "======>>> LAUNCHING..." # Re-load user main (in case it changed) confFile = weioConfig.getConfiguration() # Get the last name of project and run it projectModule = confFile["last_opened_project"].replace('/', '.') + ".main" - print "CALL", projectModule + #print "CALL", projectModule # Init GPIO object for uper communication if (weioRunnerGlobals.WEIO_SERIAL_LINKED == False): try : @@ -176,7 +176,7 @@ def launcher(self): try : userMain = __import__(projectModule, fromlist=['']) except : - print "MODULE CAN'T BE LOADED" + print "MODULE CAN'T BE LOADED. Maybe you have some import errors?" result = None @@ -185,7 +185,7 @@ def launcher(self): userMain.setup() # Add user events - print "ADDING USER EVENTS" + #print "ADDING USER EVENTS" for key in weioUserApi.attach.events: #print weioUserApi.attach.events[key].handler weioParser.addUserEvent(weioUserApi.attach.events[key].event, @@ -205,7 +205,7 @@ def launcher(self): # Get the command from userTornado (blocking) msg = self.qIn.get() - print "*** GOT THE COMMAND: ", msg.req + #print "*** GOT THE COMMAND: ", msg.req # Execute the command msg.res = None @@ -237,7 +237,7 @@ def signalHandler(userControl, sig, frame): def listenerThread(): - print "*** Starting listenerThread" + #print "*** Starting listenerThread" while (True): msg = weioRunnerGlobals.QIN.get() @@ -280,8 +280,8 @@ def listenerThread(): # Create a userControl object userControl = UserControl() - print "start user script" - userControl.start() + #print "start user script" + #userControl.start() # Install signal handlers signalCallback = functools.partial(signalHandler, userControl) From 89c1274e694f9f7f99972f75ac2a492864995e34 Mon Sep 17 00:00:00 2001 From: Uros Petrevski Date: Fri, 18 Jul 2014 17:07:48 +0200 Subject: [PATCH 12/56] Adc to web example updated --- examples/adcToWeb/index.html | 11 +++-------- examples/buttonToLEDWEB/www | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/examples/adcToWeb/index.html b/examples/adcToWeb/index.html index 8887616c..a52c7ff7 100644 --- a/examples/adcToWeb/index.html +++ b/examples/adcToWeb/index.html @@ -19,17 +19,12 @@ color:white; } p { - color:white; + color:#5dddf6; cursor:pointer; - margin:0.2em; + margin-left:100px; line-height:1em; } - a { - color:red; - font-size:30px; - } - - +